Commit graph

189251 commits

Author SHA1 Message Date
Martin Liska
28d8167d21 Fix flake8 errors.
contrib/ChangeLog:

	* check-internal-format-escaping.py: Fix flake8 errors.
2021-11-02 10:27:27 +01:00
Jakub Jelinek
e178d02d39 ia32: Disallow mode(V1TI) [PR103020]
As discussed in the PR, TImode isn't supported for -m32 on x86 (for the same
reason as on most 32-bit targets, no support for > 2 * BITS_PER_WORD
precision integers), but since PR32280 V1TImode is allowed with -msse in SSE
regs, V2TImode with -mavx or V4TImode with -mavx512f.
typedef __int128 V __attribute__((vector_size ({16,32,64}));
will not work, neither typedef int I __attribute__((mode(TI)));
but mode(V1TI), mode(V2TI) etc. are accepted with a warning when those
ISAs are enabled.  But they are certainly not fully supported, for some
optabs maybe, but most of them will not.  And, veclower lowering those ops
to TImode scalar operations will not work either because TImode isn't
supported.

So, this patch keeps V1TImode etc. in VALID*_MODE macros so that we can use
it in certain instructions, but disallows it in
targetm.vector_mode_supported_p, so that we don't offer those modes to the
user as supported.

2021-11-02  Jakub Jelinek  <jakub@redhat.com>

	PR target/103020
	* config/i386/i386.c (ix86_vector_mode_supported_p): Reject vector
	modes with TImode inner mode if 32-bit.

	* gcc.target/i386/pr103020.c: New test.
2021-11-02 09:44:24 +01:00
Martin Liska
f81970b5f3 Add TSVC tests.
gcc/testsuite/ChangeLog:

	* gcc.dg/vect/vect.exp: Include also tsvc sub-directory.
	* gcc.dg/vect/tsvc/license.txt: New test.
	* gcc.dg/vect/tsvc/tsvc.h: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s000.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s111.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1111.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1112.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1113.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1115.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1119.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s112.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s113.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s114.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s115.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s116.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1161.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s118.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s119.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s121.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1213.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s122.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1221.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s123.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1232.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s124.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1244.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s125.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1251.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s126.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s127.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1279.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s128.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1281.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s131.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s13110.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s132.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1351.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s141.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s1421.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s151.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s152.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s161.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s162.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s171.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s172.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s173.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s174.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s175.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s176.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s2101.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s2102.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s211.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s2111.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s212.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s221.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s222.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s2233.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s2244.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s2251.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s2275.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s231.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s232.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s233.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s235.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s241.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s242.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s243.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s244.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s251.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s252.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s253.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s254.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s255.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s256.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s257.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s258.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s261.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s271.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s2710.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s2711.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s2712.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s272.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s273.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s274.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s275.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s276.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s277.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s278.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s279.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s281.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s291.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s292.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s293.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s311.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s3110.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s3111.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s31111.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s3112.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s3113.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s312.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s313.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s314.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s315.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s316.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s317.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s318.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s319.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s321.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s322.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s323.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s3251.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s331.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s332.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s341.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s342.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s343.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s351.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s352.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s353.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s4112.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s4113.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s4114.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s4115.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s4116.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s4117.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s4121.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s421.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s422.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s423.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s424.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s431.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s441.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s442.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s443.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s451.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s452.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s453.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s471.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s481.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s482.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-s491.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-va.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-vag.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-vas.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-vbor.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-vdotr.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-vif.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-vpv.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-vpvpv.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-vpvts.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-vpvtv.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-vsumr.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-vtv.c: New test.
	* gcc.dg/vect/tsvc/vect-tsvc-vtvtv.c: New test.
2021-11-02 09:42:24 +01:00
liuhongt
2e560abff4 Adjust testcase for O2 vect.
Adjust code in check_vect_slp_store_usage to make it an exact
pattern match of the corresponding testcases.
These new target/xfail selectors are added as a temporary solution,
and should be removed after real issue is fixed for Wstringop-overflow.

gcc/ChangeLog:

	* doc/sourcebuild.texi (vect_slp_v4qi_store_unalign,
	vect_slp_v2hi_store_unalign, vect_slp_v4hi_store_unalign,
	vect_slp_v4si_store_unalign): Document efficient target.
	(vect_slp_v4qi_store_unalign_1, vect_slp_v8qi_store_unalign_1,
	vect_slp_v16qi_store_unalign_1): Ditto.
	(vect_slp_v2hi_store_align,vect_slp_v2qi_store_align,
	vect_slp_v2si_store_align, vect_slp_v4qi_store_align): Ditto.
	(struct_4char_block_move, struct_8char_block_move,
	struct_16char_block_move): Ditto.

gcc/testsuite/ChangeLog:

	PR testsuite/102944
	* c-c++-common/Wstringop-overflow-2.c: Adjust target/xfail
	selector.
	* gcc.dg/Warray-bounds-48.c: Ditto.
	* gcc.dg/Warray-bounds-51.c: Ditto.
	* gcc.dg/Warray-parameter-3.c: Ditto.
	* gcc.dg/Wstringop-overflow-14.c: Ditto.
	* gcc.dg/Wstringop-overflow-21.c: Ditto.
	* gcc.dg/Wstringop-overflow-68.c: Ditto
	* gcc.dg/Wstringop-overflow-76.c: Ditto
	* gcc.dg/Wzero-length-array-bounds-2.c: Ditto.
	* lib/target-supports.exp (vect_slp_v4qi_store_unalign): New
	efficient target.
	(vect_slp_v4qi_store_unalign_1): Ditto.
	(struct_4char_block_move): Ditto.
	(struct_8char_block_move): Ditto.
	(stryct_16char_block_move): Ditto.
	(vect_slp_v2hi_store_align): Ditto.
	(vect_slp_v2qi_store): Rename to ..
	(vect_slp_v2qi_store_align): .. this.
	(vect_slp_v4qi_store): Rename to ..
	(vect_slp_v4qi_store_align): .. This.
	(vect_slp_v8qi_store): Rename to ..
	(vect_slp_v8qi_store_unalign_1): .. This.
	(vect_slp_v16qi_store): Rename to ..
	(vect_slp_v16qi_store_unalign_1): .. This.
	(vect_slp_v2hi_store): Rename to ..
	(vect_slp_v2hi_store_unalign): .. This.
	(vect_slp_v4hi_store): Rename to ..
	(vect_slp_v4hi_store_unalign): This.
	(vect_slp_v2si_store): Rename to ..
	(vect_slp_v2si_store_align): .. This.
	(vect_slp_v4si_store): Rename to ..
	(vect_slp_v4si_store_unalign): Ditto.
	(check_vect_slp_aligned_store_usage): Rename to ..
	(check_vect_slp_store_usage): .. this and adjust code to make
	it an exact pattern match of corresponding testcase.
2021-11-02 16:41:29 +08:00
Roger Sayle
1188cf5fb7 x86_64: Expand ashrv1ti (and PR target/102986)
This patch was originally intended to implement 128-bit arithmetic right
shifts by constants of vector registers (V1TImode), but while working on
it I discovered the (my) recent ICE on valid regression now known as
PR target/102986.

As diagnosed by Jakub, expanders for shifts are not allowed to fail, and
so any backend that provides a shift optab needs to handle variable amount
shifts as well as constant shifts [even though the middle-end knows how
to synthesize these for vector modes].  This constraint could be relaxed
in the middle-end, but it makes sense to fix this in my erroneous code.

The solution is to change the constraints on the recently added (and new)
shift expanders from SImode const_int_register to QImode general operand,
matching the TImode expanders' constraints, and then simply check for
!CONST_INT_P at the start of the ix86_expand_v1ti_* functions, converting
the operands from V1TImode to TImode, performing the TImode operation
and converting the result back to V1TImode.

One nice benefit of this strategy, is that it allows us to implement
Uros' recent suggestion, that we should be more efficiently converting
between these modes, avoiding the use of memory and using the same idiom
as LLVM or using pextrq/pinsrq where available.  The new helper functions
ix86_expand_v1ti_to_ti and ix86_expand_ti_to_v1ti are sufficient to take
care of this.  Interestingly partial support for this is already present,
but x86_64's generic tuning prefers memory transfers to avoid penalizing
microarchitectures with significant interunit delays.  With these changes
we now generate both pextrq and pinsrq for -mtune=native.

The main body of the patch is to implement arithmetic right shift in
addition to the logical right shift and left shift implemented in the
previous patch.  This expander provides no less than 13 different code
sequences, special casing the different constant shifts, including
variants taking advantage of TARGET_AVX2 and TARGET_SSE4_1.  The code
is structured with the faster/shorter sequences and the start, and
the generic implementations at the end.

For the record, the implementations are:

ashr_127:	// Shift 127, 2 operations, 10 bytes
        pshufd  $255, %xmm0, %xmm0
        psrad   $31, %xmm0
        ret

ashr_64:	// Shift by 64, 3 operations, 14 bytes
        pshufd  $255, %xmm0, %xmm1
        psrad   $31, %xmm1
        punpckhqdq      %xmm1, %xmm0
        ret

ashr_96:	// Shift by 96, 3 operations, 18 bytes
        movdqa  %xmm0, %xmm1
        psrad   $31, %xmm1
        punpckhqdq      %xmm1, %xmm0
        pshufd  $253, %xmm0, %xmm0
        ret

ashr_8:		// Shift by 8/16/24/32 on AVX2, 3 operations, 16 bytes
        vpsrad  $8, %xmm0, %xmm1
        vpsrldq $1, %xmm0, %xmm0
        vpblendd        $7, %xmm0, %xmm1, %xmm0
        ret

ashr_8:		// Shift by 8/16/24/32 on SSE4.1, 3 operations, 24 bytes
        movdqa  %xmm0, %xmm1
        psrldq  $1, %xmm0
        psrad   $8, %xmm1
        pblendw $63, %xmm0, %xmm1
        movdqa  %xmm1, %xmm0
        ret

ashr_97:	// Shifts by 97..126, 4 operations, 23 bytes
        movdqa  %xmm0, %xmm1
        psrad   $31, %xmm0
        psrad   $1, %xmm1
        punpckhqdq      %xmm0, %xmm1
        pshufd  $253, %xmm1, %xmm0
        ret

ashr_48:	// Shifts by 48/80 on SSE4.1, 4 operations, 25 bytes
        movdqa  %xmm0, %xmm1
        pshufd  $255, %xmm0, %xmm0
        psrldq  $6, %xmm1
        psrad   $31, %xmm0
        pblendw $31, %xmm1, %xmm0
        ret

ashr_8:		// Shifts by multiples of 8, 5 operations, 28 bytes
        movdqa  %xmm0, %xmm1
        pshufd  $255, %xmm0, %xmm0
        psrad   $31, %xmm0
        psrldq  $1, %xmm1
        pslldq  $15, %xmm0
        por     %xmm1, %xmm0
        ret

ashr_1:		// Shifts by 1..31 on AVX2, 6 operations, 30 bytes
        vpsrldq $8, %xmm0, %xmm2
        vpsrad  $1, %xmm0, %xmm1
        vpsllq  $63, %xmm2, %xmm2
        vpsrlq  $1, %xmm0, %xmm0
        vpor    %xmm2, %xmm0, %xmm0
        vpblendd        $7, %xmm0, %xmm1, %xmm0
        ret

ashr_1:		// Shifts by 1..15 on SSE4.1, 6 operations, 42 bytes
        movdqa  %xmm0, %xmm2
        movdqa  %xmm0, %xmm1
        psrldq  $8, %xmm2
        psrlq   $1, %xmm0
        psllq   $63, %xmm2
        psrad   $1, %xmm1
        por     %xmm2, %xmm0
        pblendw $63, %xmm0, %xmm1
        movdqa  %xmm1, %xmm0
        ret

ashr_1:		// Shift by 1, 8 operations, 46 bytes
        movdqa  %xmm0, %xmm1
        movdqa  %xmm0, %xmm2
        psrldq  $8, %xmm2
        psrlq   $63, %xmm1
        psllq   $63, %xmm2
        psrlq   $1, %xmm0
        pshufd  $191, %xmm1, %xmm1
        por     %xmm2, %xmm0
        psllq   $31, %xmm1
        por     %xmm1, %xmm0
        ret

ashr_65:	// Shifts by 65..95, 8 operations, 42 bytes
        pshufd  $255, %xmm0, %xmm1
        psrldq  $8, %xmm0
        psrad   $31, %xmm1
        psrlq   $1, %xmm0
        movdqa  %xmm1, %xmm2
        psllq   $63, %xmm1
        pslldq  $8, %xmm2
        por     %xmm2, %xmm1
        por     %xmm1, %xmm0
        ret

ashr_2:		// Shifts from 2..63, 9 operations, 47 bytes
        pshufd  $255, %xmm0, %xmm1
        movdqa  %xmm0, %xmm2
        psrad   $31, %xmm1
        psrldq  $8, %xmm2
        psllq   $62, %xmm2
        psrlq   $2, %xmm0
        pslldq  $8, %xmm1
        por     %xmm2, %xmm0
        psllq   $62, %xmm1
        por     %xmm1, %xmm0
        ret

To test these changes there are several new test cases.  sse2-v1ti-shift-2.c
is a compile-test designed to spot/catch PR target/102986 [for all shifts
and rotates by variable amounts], and sse2-v1ti-shift-3.c is an execution
test to confirm shifts/rotates by variable amounts produce the same results
for TImode and V1TImode.  sse2-v1ti-ashiftrt-1.c is a (similar) execution
test to confirm arithmetic right shifts by different constants produce
identical results between TImode and V1TImode.  sse2-v1ti-ashift-[23].c are
duplicates of this file as compilation tests specifying -mavx2 and -msse4.1
respectively to trigger all the paths through the new expander.

2021-11-02  Roger Sayle  <roger@nextmovesoftware.com>
	    Jakub Jelinek  <jakub@redhat.com>

gcc/ChangeLog
	PR target/102986
	* config/i386/i386-expand.c (ix86_expand_v1ti_to_ti,
	ix86_expand_ti_to_v1ti): New helper functions.
	(ix86_expand_v1ti_shift): Check if the amount operand is an
	integer constant, and expand as a TImode shift if it isn't.
	(ix86_expand_v1ti_rotate): Check if the amount operand is an
	integer constant, and expand as a TImode rotate if it isn't.
	(ix86_expand_v1ti_ashiftrt): New function to expand arithmetic
	right shifts of V1TImode quantities.
	* config/i386/i386-protos.h (ix86_expand_v1ti_ashift): Prototype.
	* config/i386/sse.md (ashlv1ti3, lshrv1ti3): Change constraints
	to QImode general_operand, and let the helper functions lower
	shifts by non-constant operands, as TImode shifts.  Make
	conditional on TARGET_64BIT.
	(ashrv1ti3): New expander calling ix86_expand_v1ti_ashiftrt.
	(rotlv1ti3, rotrv1ti3): Change shift operand to QImode.
	Make conditional on TARGET_64BIT.

gcc/testsuite/ChangeLog
	PR target/102986
	* gcc.target/i386/sse2-v1ti-ashiftrt-1.c: New test case.
	* gcc.target/i386/sse2-v1ti-ashiftrt-2.c: New test case.
	* gcc.target/i386/sse2-v1ti-ashiftrt-3.c: New test case.
	* gcc.target/i386/sse2-v1ti-shift-2.c: New test case.
	* gcc.target/i386/sse2-v1ti-shift-3.c: New test case.
2021-11-02 08:26:14 +00:00
Stefan Schulze Frielinghaus
e72f783c86 IBM Z: Fix address of operands will never be NULL warnings
Since a recent enhancement of -Waddress a couple of warnings are emitted
and turned into errors during bootstrap:

gcc/config/s390/s390.md:12087:25: error: the address of 'operands' will never be NULL [-Werror=address]
12087 |   "TARGET_HTM && operands != NULL
build/gencondmd.c:59:12: note: 'operands' declared here
   59 | extern rtx operands[];
      |            ^~~~~~~~

Fixed by removing those non-null checks.

gcc/ChangeLog:

	* config/s390/s390.md ("*cc_to_int", "tabort", "*tabort_1",
	"*tabort_1_plus"): Remove operands non-null check.
2021-11-02 09:19:44 +01:00
Jakub Jelinek
fb7fee8481 openmp: Add testcase for threadprivate random access class iterators
This adds a testcase for random access class iterators.  The diagnostics
can be different between templates and non-templates, as for some
threadprivate vars finish_id_expression replaces them with call to their
corresponding wrapper, but I think it is not that big deal, we reject
it in either case.

2021-11-02  Jakub Jelinek  <jakub@redhat.com>

	* g++.dg/gomp/loop-8.C: New test.
2021-11-02 09:13:07 +01:00
GCC Administrator
cf82e8d964 Daily bump. 2021-11-02 00:16:32 +00:00
Jonathan Wakely
6f34b9e4f1 libstdc++: Missing constexpr for __gnu_debug::__valid_range etc
The new 25_algorithms/move/constexpr.cc test fails in debug mode,
because the debug assertions use the non-constexpr overloads in
<debug/stl_iterator.h>.

libstdc++-v3/ChangeLog:

	* include/debug/stl_iterator.h (__valid_range): Add constexpr
	for C++20. Qualify call to avoid ADL.
	(__get_distance, __can_advance, __unsafe, __base): Likewise.
	* testsuite/25_algorithms/move/constexpr.cc: Also check with
	std::reverse_iterator arguments.
2021-11-01 21:01:31 +00:00
Jonathan Wakely
09bc98098e libstdc++: Reorder constraints on std::span::span(Range&&) constructor.
In PR libstdc++/103013 Tim Song pointed out that we could reorder the
constraints of this constructor. That's worth doing just to reduce the
work the compiler has to do during overload resolution, even if it isn't
needed to make the code in the PR work.

libstdc++-v3/ChangeLog:

	* include/std/span (span(Range&&)): Reorder constraints.
2021-11-01 21:01:31 +00:00
Martin Liska
679652a77d Fix negative integer range for UInteger.
gcc/ChangeLog:

	* opt-functions.awk: Add new sanity checking.
	* optc-gen.awk: Add new argument to integer_range_info.
	* params.opt: Update 2 params which have negative IntegerRange.
2021-11-01 20:29:19 +01:00
Martin Liska
a11c53985a Fix test-suite pattern scanning.
Fixes:

UNRESOLVED: g++.dg/ipa/modref-1.C   scan-ipa-dump local-pure-const1 "Function found to be const: {anonymous}::B::genB"
UNRESOLVED: g++.dg/ipa/modref-1.C   scan-ipa-dump modref1 "Retslot flags: direct noescape nodirectescape not_returned noread"

gcc/testsuite/ChangeLog:

	* g++.dg/ipa/modref-1.C: Fix test-suite pattern scanning.
2021-11-01 17:20:45 +01:00
David Malcolm
b050653c4c contrib: add unicode/utf8-dump.py
This script may be useful when debugging issues relating to Unicode
encoding (e.g. when investigating source files with bidirectional control
characters).

It dumps a UTF-8 file as a list of numbered lines (mimicking GCC's
diagnostic output format), interleaved with lines per character showing
the Unicode codepoints, the UTF-8 encoding bytes, the name of the
character, and, where printable, the characters themselves.
The lines are printed in logical order, which may help the reader to grok
the relationship between visual and logical ordering in bi-di files.

For example:

$ cat test.c
int གྷ;
const char *אבג = "ALEF-BET-GIMEL";

$ ./contrib/unicode/utf8-dump.py test.c
   1 | int གྷ;
     |   U+0069            0x69                     LATIN SMALL LETTER I i
     |   U+006E            0x6e                     LATIN SMALL LETTER N n
     |   U+0074            0x74                     LATIN SMALL LETTER T t
     |   U+0020            0x20                                    SPACE (separator)
     |   U+0F43  0xe0 0xbd 0x83                       TIBETAN LETTER GHA གྷ
     |   U+003B            0x3b                                SEMICOLON ;
     |   U+000A            0x0a                           LINE FEED (LF) (control character)
   2 | const char *אבג = "ALEF-BET-GIMEL";
     |   U+0063            0x63                     LATIN SMALL LETTER C c
     |   U+006F            0x6f                     LATIN SMALL LETTER O o
     |   U+006E            0x6e                     LATIN SMALL LETTER N n
     |   U+0073            0x73                     LATIN SMALL LETTER S s
     |   U+0074            0x74                     LATIN SMALL LETTER T t
     |   U+0020            0x20                                    SPACE (separator)
     |   U+0063            0x63                     LATIN SMALL LETTER C c
     |   U+0068            0x68                     LATIN SMALL LETTER H h
     |   U+0061            0x61                     LATIN SMALL LETTER A a
     |   U+0072            0x72                     LATIN SMALL LETTER R r
     |   U+0020            0x20                                    SPACE (separator)
     |   U+002A            0x2a                                 ASTERISK *
     |   U+05D0       0xd7 0x90                       HEBREW LETTER ALEF א
     |   U+05D1       0xd7 0x91                        HEBREW LETTER BET ב
     |   U+05D2       0xd7 0x92                      HEBREW LETTER GIMEL ג
     |   U+0020            0x20                                    SPACE (separator)
     |   U+003D            0x3d                              EQUALS SIGN =
     |   U+0020            0x20                                    SPACE (separator)
     |   U+0022            0x22                           QUOTATION MARK "
     |   U+0041            0x41                   LATIN CAPITAL LETTER A A
     |   U+004C            0x4c                   LATIN CAPITAL LETTER L L
     |   U+0045            0x45                   LATIN CAPITAL LETTER E E
     |   U+0046            0x46                   LATIN CAPITAL LETTER F F
     |   U+002D            0x2d                             HYPHEN-MINUS -
     |   U+0042            0x42                   LATIN CAPITAL LETTER B B
     |   U+0045            0x45                   LATIN CAPITAL LETTER E E
     |   U+0054            0x54                   LATIN CAPITAL LETTER T T
     |   U+002D            0x2d                             HYPHEN-MINUS -
     |   U+0047            0x47                   LATIN CAPITAL LETTER G G
     |   U+0049            0x49                   LATIN CAPITAL LETTER I I
     |   U+004D            0x4d                   LATIN CAPITAL LETTER M M
     |   U+0045            0x45                   LATIN CAPITAL LETTER E E
     |   U+004C            0x4c                   LATIN CAPITAL LETTER L L
     |   U+0022            0x22                           QUOTATION MARK "
     |   U+003B            0x3b                                SEMICOLON ;
     |   U+000A            0x0a                           LINE FEED (LF) (control character)

Tested with Python 3.8

contrib/ChangeLog:
	* unicode/utf8-dump.py: New file.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2021-11-01 11:52:28 -04:00
Oracle Public Cloud User
429e3b7d8b PR 102281 (-ftrivial-auto-var-init=zero causes ice)
Do not add call to __builtin_clear_padding when a variable is a gimple
register or it might not have padding.

gcc/ChangeLog:

2021-11-01  qing zhao  <qing.zhao@oracle.com>

	* gimplify.c (gimplify_decl_expr): Do not add call to
	__builtin_clear_padding when a variable is a gimple register
	or it might not have padding.
	(gimplify_init_constructor): Likewise.

gcc/testsuite/ChangeLog:

2021-11-01  qing zhao  <qing.zhao@oracle.com>

	* c-c++-common/pr102281.c: New test.
	* gcc.target/i386/auto-init-2.c: Adjust testing case.
	* gcc.target/i386/auto-init-4.c: Likewise.
	* gcc.target/i386/auto-init-6.c: Likewise.
	* gcc.target/aarch64/auto-init-6.c: Likewise.
2021-11-01 15:14:26 +00:00
Tamar Christina
1d5c43db79 AArch64: Add better costing for vector constants and operations
This patch adds extended costing to cost the creation of constants and the
manipulation of constants.  The default values provided are based on
architectural expectations and each cost models can be individually tweaked as
needed.

The changes in this patch covers:

* Construction of PARALLEL or CONST_VECTOR:
  Adds better costing for vector of constants which is based on the constant
  being created and the instruction that can be used to create it.  i.e. a movi
  is cheaper than a literal load etc.
* Construction of a vector through a vec_dup.

gcc/ChangeLog:

	* config/arm/aarch-common-protos.h (struct vector_cost_table): Add
	movi, dup and extract costing fields.
	* config/aarch64/aarch64-cost-tables.h (qdf24xx_extra_costs,
	thunderx_extra_costs, thunderx2t99_extra_costs,
	thunderx3t110_extra_costs, tsv110_extra_costs, a64fx_extra_costs): Use
	them.
	* config/arm/aarch-cost-tables.h (generic_extra_costs,
	cortexa53_extra_costs, cortexa57_extra_costs, cortexa76_extra_costs,
	exynosm1_extra_costs, xgene1_extra_costs): Likewise
	* config/aarch64/aarch64-simd.md (aarch64_simd_dup<mode>): Add r->w dup.
	* config/aarch64/aarch64.c (aarch64_rtx_costs): Add extra costs.

gcc/testsuite/ChangeLog:

	* gcc.target/aarch64/vect-cse-codegen.c: New test.
2021-11-01 13:49:46 +00:00
Tamar Christina
68b48f3f4c middle-end: Teach CSE to be able to do vector extracts.
This patch gets CSE to re-use constants already inside a vector rather than
re-materializing the constant again.

Basically consider the following case:

#include <stdint.h>
#include <arm_neon.h>

uint64_t
test (uint64_t a, uint64x2_t b, uint64x2_t* rt)
{
  uint64_t arr[2] = { 0x0942430810234076UL, 0x0942430810234076UL};
  uint64_t res = a | arr[0];
  uint64x2_t val = vld1q_u64 (arr);
  *rt = vaddq_u64 (val, b);
  return res;
}

The actual behavior is inconsequential however notice that the same constants
are used in the vector (arr and later val) and in the calculation of res.

The code we generate for this however is quite sub-optimal:

test:
        adrp    x2, .LC0
        sub     sp, sp, #16
        ldr     q1, [x2, #:lo12:.LC0]
        mov     x2, 16502
        movk    x2, 0x1023, lsl 16
        movk    x2, 0x4308, lsl 32
        add     v1.2d, v1.2d, v0.2d
        movk    x2, 0x942, lsl 48
        orr     x0, x0, x2
        str     q1, [x1]
        add     sp, sp, 16
        ret
.LC0:
        .xword  667169396713799798
        .xword  667169396713799798

Essentially we materialize the same constant twice.  The reason for this is
because the front-end lowers the constant extracted from arr[0] quite early on.
If you look into the result of fre you'll find

  <bb 2> :
  arr[0] = 667169396713799798;
  arr[1] = 667169396713799798;
  res_7 = a_6(D) | 667169396713799798;
  _16 = __builtin_aarch64_ld1v2di (&arr);
  _17 = VIEW_CONVERT_EXPR<uint64x2_t>(_16);
  _11 = b_10(D) + _17;
  *rt_12(D) = _11;
  arr ={v} {CLOBBER};
  return res_7;

Which makes sense for further optimization.  However come expand time if the
constant isn't representable in the target arch it will be assigned to a
register again.

(insn 8 5 9 2 (set (reg:V2DI 99)
        (const_vector:V2DI [
                (const_int 667169396713799798 [0x942430810234076]) repeated x2
            ])) "cse.c":7:12 -1
     (nil))
...
(insn 14 13 15 2 (set (reg:DI 103)
        (const_int 667169396713799798 [0x942430810234076])) "cse.c":8:12 -1
     (nil))
(insn 15 14 16 2 (set (reg:DI 102 [ res ])
        (ior:DI (reg/v:DI 96 [ a ])
            (reg:DI 103))) "cse.c":8:12 -1
     (nil))

And since it's out of the immediate range of the scalar instruction used
combine won't be able to do anything here.

This will then trigger the re-materialization of the constant twice.

To fix this this patch extends CSE to be able to generate an extract for a
constant from another vector, or to make a vector for a constant by duplicating
another constant.

Whether this transformation is done or not depends entirely on the costing for
the target for the different constants and operations.

I Initially also investigated doing this in PRE, but PRE requires at least 2 BB
to work and does not currently have any way to remove redundancies within a
single BB and it did not look easy to support.

gcc/ChangeLog:

	* cse.c (add_to_set): New.
	(find_sets_in_insn): Register constants in sets.
	(canonicalize_insn): Use auto_vec instead.
	(cse_insn): Try materializing using vec_dup.
	* rtl.h (simplify_context::simplify_gen_vec_select,
	simplify_gen_vec_select): New.
	* simplify-rtx.c (simplify_context::simplify_gen_vec_select): New.
2021-11-01 13:48:58 +00:00
Tamar Christina
8a260d652c testsuite: fix failing complex add testcases PR103000
Some targets have overriden the default unroll factor and so do not have enough
data to succeed for SLP vectorization if loop vect is turned off.

To fix this just always unroll in these testcases.

gcc/testsuite/ChangeLog:

	PR testsuite/103000
	* gcc.dg/vect/complex/fast-math-bb-slp-complex-add-double.c:
	Force unroll.
	* gcc.dg/vect/complex/fast-math-bb-slp-complex-add-float.c: likewise
	* gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-float.c:
	Likewise
	* gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-half-float.c:
	Likewise.
2021-11-01 13:42:51 +00:00
David Malcolm
bd5e882cf6 diagnostics: escape non-ASCII source bytes for certain diagnostics
This patch adds support to GCC's diagnostic subsystem for escaping certain
bytes and Unicode characters when quoting source code.

Specifically, this patch adds a new flag rich_location::m_escape_on_output
which is a hint from a diagnostic that non-ASCII bytes in the pertinent
lines of the user's source code should be escaped when printed.

The patch sets this for the following diagnostics:
- when complaining about stray bytes in the program (when these
are non-printable)
- when complaining about "null character(s) ignored");
- for -Wnormalized= (and generate source ranges for such warnings)

The escaping is controlled by a new option:
  -fdiagnostics-escape-format=[unicode|bytes]

For example, consider a diagnostic involing a source line containing the
string "before" followed by the Unicode character U+03C0 ("GREEK SMALL
LETTER PI", with UTF-8 encoding 0xCF 0x80) followed by the byte 0xBF
(a stray UTF-8 trailing byte), followed by the string "after", where the
diagnostic highlights the U+03C0 character.

By default, this line will be printed verbatim to the user when
reporting a diagnostic at it, as:

 beforeπXafter
       ^

(using X for the stray byte to avoid putting invalid UTF-8 in this
commit message)

If the diagnostic sets the "escape" flag, it will be printed as:

 before<U+03C0><BF>after
       ^~~~~~~~

with -fdiagnostics-escape-format=unicode (the default), or as:

  before<CF><80><BF>after
        ^~~~~~~~

if the user supplies -fdiagnostics-escape-format=bytes.

This only affects how the source is printed; it does not affect
how column numbers that are printed (as per -fdiagnostics-column-unit=
and -fdiagnostics-column-origin=).

gcc/c-family/ChangeLog:
	* c-lex.c (c_lex_with_flags): When complaining about non-printable
	CPP_OTHER tokens, set the "escape on output" flag.

gcc/ChangeLog:
	* common.opt (fdiagnostics-escape-format=): New.
	(diagnostics_escape_format): New enum.
	(DIAGNOSTICS_ESCAPE_FORMAT_UNICODE): New enum value.
	(DIAGNOSTICS_ESCAPE_FORMAT_BYTES): Likewise.
	* diagnostic-format-json.cc (json_end_diagnostic): Add
	"escape-source" attribute.
	* diagnostic-show-locus.c
	(exploc_with_display_col::exploc_with_display_col): Replace
	"tabstop" param with a cpp_char_column_policy and add an "aspect"
	param.  Use these to compute m_display_col accordingly.
	(struct char_display_policy): New struct.
	(layout::m_policy): New field.
	(layout::m_escape_on_output): New field.
	(def_policy): New function.
	(make_range): Update for changes to exploc_with_display_col ctor.
	(default_print_decoded_ch): New.
	(width_per_escaped_byte): New.
	(escape_as_bytes_width): New.
	(escape_as_bytes_print): New.
	(escape_as_unicode_width): New.
	(escape_as_unicode_print): New.
	(make_policy): New.
	(layout::layout): Initialize new fields.  Update m_exploc ctor
	call for above change to ctor.
	(layout::maybe_add_location_range): Update for changes to
	exploc_with_display_col ctor.
	(layout::calculate_x_offset_display): Update for change to
	cpp_display_width.
	(layout::print_source_line): Pass policy
	to cpp_display_width_computation. Capture cpp_decoded_char when
	calling process_next_codepoint.  Move printing of source code to
	m_policy.m_print_cb.
	(line_label::line_label): Pass in policy rather than context.
	(layout::print_any_labels): Update for change to line_label ctor.
	(get_affected_range): Pass in policy rather than context, updating
	calls to location_compute_display_column accordingly.
	(get_printed_columns): Likewise, also for cpp_display_width.
	(correction::correction): Pass in policy rather than tabstop.
	(correction::compute_display_cols): Pass m_policy rather than
	m_tabstop to cpp_display_width.
	(correction::m_tabstop): Replace with...
	(correction::m_policy): ...this.
	(line_corrections::line_corrections): Pass in policy rather than
	context.
	(line_corrections::m_context): Replace with...
	(line_corrections::m_policy): ...this.
	(line_corrections::add_hint): Update to use m_policy rather than
	m_context.
	(line_corrections::add_hint): Likewise.
	(layout::print_trailing_fixits): Likewise.
	(selftest::test_display_widths): New.
	(selftest::test_layout_x_offset_display_utf8): Update to use
	policy rather than tabstop.
	(selftest::test_one_liner_labels_utf8): Add test of escaping
	source lines.
	(selftest::test_diagnostic_show_locus_one_liner_utf8): Update to
	use policy rather than tabstop.
	(selftest::test_overlapped_fixit_printing): Likewise.
	(selftest::test_overlapped_fixit_printing_utf8): Likewise.
	(selftest::test_overlapped_fixit_printing_2): Likewise.
	(selftest::test_tab_expansion): Likewise.
	(selftest::test_escaping_bytes_1): New.
	(selftest::test_escaping_bytes_2): New.
	(selftest::diagnostic_show_locus_c_tests): Call the new tests.
	* diagnostic.c (diagnostic_initialize): Initialize
	context->escape_format.
	(convert_column_unit): Update to use default character width policy.
	(selftest::test_diagnostic_get_location_text): Likewise.
	* diagnostic.h (enum diagnostics_escape_format): New enum.
	(diagnostic_context::escape_format): New field.
	* doc/invoke.texi (-fdiagnostics-escape-format=): New option.
	(-fdiagnostics-format=): Add "escape-source" attribute to examples
	of JSON output, and document it.
	* input.c (location_compute_display_column): Pass in "policy"
	rather than "tabstop", passing to
	cpp_byte_column_to_display_column.
	(selftest::test_cpp_utf8): Update to use cpp_char_column_policy.
	* input.h (class cpp_char_column_policy): New forward decl.
	(location_compute_display_column): Pass in "policy" rather than
	"tabstop".
	* opts.c (common_handle_option): Handle
	OPT_fdiagnostics_escape_format_.
	* selftest.c (temp_source_file::temp_source_file): New ctor
	overload taking a size_t.
	* selftest.h (temp_source_file::temp_source_file): Likewise.

gcc/testsuite/ChangeLog:
	* c-c++-common/diagnostic-format-json-1.c: Add regexp to consume
	"escape-source" attribute.
	* c-c++-common/diagnostic-format-json-2.c: Likewise.
	* c-c++-common/diagnostic-format-json-3.c: Likewise.
	* c-c++-common/diagnostic-format-json-4.c: Likewise, twice.
	* c-c++-common/diagnostic-format-json-5.c: Likewise.
	* gcc.dg/cpp/warn-normalized-4-bytes.c: New test.
	* gcc.dg/cpp/warn-normalized-4-unicode.c: New test.
	* gcc.dg/encoding-issues-bytes.c: New test.
	* gcc.dg/encoding-issues-unicode.c: New test.
	* gfortran.dg/diagnostic-format-json-1.F90: Add regexp to consume
	"escape-source" attribute.
	* gfortran.dg/diagnostic-format-json-2.F90: Likewise.
	* gfortran.dg/diagnostic-format-json-3.F90: Likewise.

libcpp/ChangeLog:
	* charset.c (convert_escape): Use encoding_rich_location when
	complaining about nonprintable unknown escape sequences.
	(cpp_display_width_computation::::cpp_display_width_computation):
	Pass in policy rather than tabstop.
	(cpp_display_width_computation::process_next_codepoint): Add "out"
	param and populate *out if non-NULL.
	(cpp_display_width_computation::advance_display_cols): Pass NULL
	to process_next_codepoint.
	(cpp_byte_column_to_display_column): Pass in policy rather than
	tabstop.  Pass NULL to process_next_codepoint.
	(cpp_display_column_to_byte_column): Pass in policy rather than
	tabstop.
	* errors.c (cpp_diagnostic_get_current_location): New function,
	splitting out the logic from...
	(cpp_diagnostic): ...here.
	(cpp_warning_at): New function.
	(cpp_pedwarning_at): New function.
	* include/cpplib.h (cpp_warning_at): New decl for rich_location.
	(cpp_pedwarning_at): Likewise.
	(struct cpp_decoded_char): New.
	(struct cpp_char_column_policy): New.
	(cpp_display_width_computation::cpp_display_width_computation):
	Replace "tabstop" param with "policy".
	(cpp_display_width_computation::process_next_codepoint): Add "out"
	param.
	(cpp_display_width_computation::m_tabstop): Replace with...
	(cpp_display_width_computation::m_policy): ...this.
	(cpp_byte_column_to_display_column): Replace "tabstop" param with
	"policy".
	(cpp_display_width): Likewise.
	(cpp_display_column_to_byte_column): Likewise.
	* include/line-map.h (rich_location::escape_on_output_p): New.
	(rich_location::set_escape_on_output): New.
	(rich_location::m_escape_on_output): New.
	* internal.h (cpp_diagnostic_get_current_location): New decl.
	(class encoding_rich_location): New.
	* lex.c (skip_whitespace): Use encoding_rich_location when
	complaining about null characters.
	(warn_about_normalization): Generate a source range when
	complaining about improperly normalized tokens, rather than just a
	point, and use encoding_rich_location so that the source code
	is escaped on printing.
	* line-map.c (rich_location::rich_location): Initialize
	m_escape_on_output.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2021-11-01 09:35:46 -04:00
Jonathan Wakely
91bac9fed5 libstdc++: Fix range access for empty std::valarray [PR103022]
The std::begin and std::end overloads for std::valarray are defined in
terms of std::addressof(v[0]) which is undefined for an empty valarray.

libstdc++-v3/ChangeLog:

	PR libstdc++/103022
	* include/std/valarray (begin, end): Do not dereference an empty
	valarray. Add noexcept and [[nodiscard]].
	* testsuite/26_numerics/valarray/range_access.cc: Check empty
	valarray. Check iterator properties. Run as well as compiling.
	* testsuite/26_numerics/valarray/range_access2.cc: Likewise.
	* testsuite/26_numerics/valarray/103022.cc: New test.
2021-11-01 13:26:29 +00:00
Aldy Hernandez
bc5baac5c3 Add debug counters to back threader.
Chasing down stage3 miscomparisons is never fun, and having no way to
distinguish between jump threads registered by a particular
pass, is even harder.  This patch adds debug counters for the individual
back threading passes.  I've left the ethread pass alone, as that one is
usually benign, but we could easily add it if needed.

The fact that we can only pass one boolean argument to the passes
infrastructure has us do all sorts of gymnastics to differentiate
between the various back threading passes.

Tested on x86-64 Linux.

gcc/ChangeLog:

	* dbgcnt.def: Add debug counter for back_thread[12] and
	back_threadfull[12].
	* passes.def: Pass "first" argument to each back threading pass.
	* tree-ssa-threadbackward.c (back_threader::back_threader): Add
	first argument.
	(back_threader::debug_counter): New.
	(back_threader::maybe_register_path): Call debug_counter.
2021-11-01 14:24:10 +01:00
Aldy Hernandez
4e0f56d7af Move statics to threader pass class.
This patch moves all the static functions into the pass class, and
cleans up things a little.  The goal is to shuffle things around such
that we can add debug counters that depend on different threading
passes, but it's a clean-up on its own right.

Tested on x86-64 Linux.

gcc/ChangeLog:

	* tree-ssa-threadbackward.c (BT_NONE): New.
	(BT_SPEED): New.
	(BT_RESOLVE): New.
	(back_threader::back_threader): Add flags.
	Move loop initialization here.
	(back_threader::~back_threader): New.
	(back_threader::find_taken_edge_switch): Change solver and ranger
	to pointers.
	(back_threader::find_taken_edge_cond): Same.
	(back_threader::find_paths_to_names): Same.
	(back_threader::find_paths): Same.
	(back_threader::dump): Same.
	(try_thread_blocks): Merge into thread_blocks.
	(back_threader::thread_blocks): New.
	(do_early_thread_jumps): Merge into thread_blocks.
	(do_thread_jumps): Merge into thread_blocks.
	(back_threader::thread_through_all_blocks): Remove.
2021-11-01 14:24:10 +01:00
Andrew MacLeod
0187c03be3 Don't register nonsensical relations.
gcc/
	PR tree-optimization/103003
	* value-relation.cc (dom_oracle::register_relation): If the 2
	ssa names are the same, don't register any relation.

	gcc/testsuite/
	* gcc.dg/pr103003.c: New.
2021-11-01 09:14:42 -04:00
Dan Li
14d3140405 aarch64: Fix redundant check in aut insn generation
During the generation of the epilogue of aarch64(aarch64_expand_epilogue),
the value of crtl->calls_eh_return does not need to be checked again.
This value has been checked during aarch64_return_address_signing_enabled.

gcc/ChangeLog:

	* config/aarch64/aarch64.c (aarch64_expand_epilogue): Remove
	redundant check for calls_eh_return.
	* config/aarch64/aarch64.md (*do_return): Likewise.

Signed-off-by: Dan Li <ashimida@linux.alibaba.com>
2021-11-01 11:04:12 +00:00
Xionghu Luo
4851c80ce8 Rename duplicate_loop_to_header_edge to duplicate_loop_body_to_header_edge
gcc/ChangeLog:

2021-11-01  Xionghu Luo  <luoxhu@linux.ibm.com>

	* cfghooks.c (cfg_hook_duplicate_loop_to_header_edge): Rename
	duplicate_loop_to_header_edge to
	duplicate_loop_body_to_header_edge.
	(cfg_hook_duplicate_loop_body_to_header_edge): Likewise.
	* cfghooks.h (struct cfg_hooks): Likewise.
	(cfg_hook_duplicate_loop_body_to_header_edge): Likewise.
	* cfgloopmanip.c (duplicate_loop_body_to_header_edge): Likewise.
	(clone_loop_to_header_edge): Likewise.
	* cfgloopmanip.h (duplicate_loop_body_to_header_edge): Likewise.
	* cfgrtl.c (struct cfg_hooks): Likewise.
	* doc/loop.texi: Likewise.
	* loop-unroll.c (unroll_loop_constant_iterations): Likewise.
	(unroll_loop_runtime_iterations): Likewise.
	(unroll_loop_stupid): Likewise.
	(apply_opt_in_copies): Likewise.
	* tree-cfg.c (struct cfg_hooks): Likewise.
	* tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Likewise.
	(try_peel_loop): Likewise.
	* tree-ssa-loop-manip.c (copy_phi_node_args): Likewise.
	(gimple_duplicate_loop_body_to_header_edge): Likewise.
	(tree_transform_and_unroll_loop): Likewise.
	* tree-ssa-loop-manip.h (gimple_duplicate_loop_body_to_header_edge):
	Likewise.
2021-11-01 00:14:01 -05:00
Xionghu Luo
f35af8df24 Refactor loop_version
loop_version currently does lv_adjust_loop_entry_edge
before it loopifys the copy inserted on the header.  This patch moves
the condition generation later and thus we have four pieces to help
understanding of how the adjustment works:
 1) duplicating the loop on the entry edge.
 2) loopify the duplicated new loop.
 3) adjusting the CFG to insert a condition branching to either loop
 with lv_adjust_loop_entry_edge.
 4) From loopify extract the scale_loop_frequencies bits.

Also removed some piece of code seems obviously useless:
 - redirect_all_edges since it is false and loopify only called once.
 - extract_cond_bb_edges and lv_flush_pending_stmts (false_edge) as the
 edge is not redirected actually.

gcc/ChangeLog:

2021-11-01  Xionghu Luo  <luoxhu@linux.ibm.com>

	* cfgloopmanip.c (loop_version): Refactor loopify to
	loop_version.  Move condition generation after loopify.
	(loopify): Delete.
	* cfgloopmanip.h (loopify): Delete.
2021-11-01 00:13:19 -05:00
Martin Liska
7a71ea4df7 libcody: add mostlyclean Makefile target
PR other/102657

libcody/ChangeLog:

	* Makefile.in: Add mostlyclean Makefile target.
2021-11-01 04:47:38 +01:00
GCC Administrator
3a4a721e0c Daily bump. 2021-11-01 00:16:20 +00:00
Bernhard Reutner-Fischer
6ea6c05a8d Fortran: Revert explicit memcpy in gfc_get_typebound_proc
This reverts the hunk to gfc_get_typebound_proc from
7883a7f07c

gcc/fortran/ChangeLog:

	* symbol.c (gfc_get_typebound_proc): Revert memcpy.
2021-10-31 23:30:19 +01:00
Jan Hubicka
ca84f39399 Improve handling of return slot in ipa-pure-const and modref.
while preparing testcase for return slot tracking I noticed that both
ipa-pure-const and modref treat return slot writes as non-local which prevents
detecting functions as pure or not modifying global state.  Fixed by making
points_to_local_or_readonly_memory_p to special case return slot.  This is bit
of a side case, but presently at all uses of
points_to_local_or_readonly_memory_p we want to handle return slot this way.

I also noticed that we handle gimple copy unnecesarily pesimistically.  This
does not make difference right now since we do no not track non-scalars, but
I fixed it anyway.

Bootstrapped/regtested x86_64-linux, comitted.

gcc/ChangeLog:

	* ipa-fnsummary.c: Include tree-dfa.h.
	(points_to_local_or_readonly_memory_p): Return true on return
	slot writes.
	* ipa-modref.c (analyze_ssa_name_flags): Fix handling of copy
	statement.

gcc/testsuite/ChangeLog:

	* g++.dg/ipa/modref-1.C: New test.
2021-10-31 23:14:29 +01:00
Iain Buclaw
d41092ec52 d: Fix regressing test failures on ix86-solaris2.11
The _Unwind_Exception struct had its alignment adjusted to 16-bytes,
however malloc() on Solaris X86 is not guaranteed to allocate memory
aligned to 16-bytes as well.

	PR d/102837

libphobos/ChangeLog:

	* libdruntime/gcc/deh.d (ExceptionHeader.free): Use memset to reset
	contents of internal EH storage.
2021-10-31 18:33:30 +01:00
Iain Buclaw
1b5f738584 d: Fix pr96435.d failing on SPARC and HPPA
The value used to initialize the integer field in the union didn't
account for BigEndian targets running this code.

	PR d/102959

gcc/testsuite/ChangeLog:

	* gdc.dg/torture/pr96435.d: Adjust for BigEndian.
2021-10-31 18:33:30 +01:00
Bernhard Reutner-Fischer
a16010a3ee Fortran: Silence -Wmaybe-uninitialized warning
gcc/fortran/ChangeLog:

	* resolve.c (resolve_fl_procedure): Initialize
	allocatable_or_pointer.
2021-10-31 18:26:38 +01:00
GCC Administrator
0ef944629a Daily bump. 2021-10-31 00:16:24 +00:00
Tobias Burnus
948d461954 OpenMP: Add strictly nested API call check [PR102972]
The teams construct only permits omp_get_num_teams and omp_get_team_num
as API call in strictly nested regions - check for it.

Additionally, for Fortran, using DECL_NAME does not show the mangled
name, hence, DECL_ASSEMBLER_NAME had to be used to.

Finally, 'target device(ancestor:1)' wrongly rejected non-API calls
as well.

	PR middle-end/102972
gcc/ChangeLog:

	* omp-low.c (omp_runtime_api_call): Use DECL_ASSEMBLER_NAME to get
	internal Fortran name; new permit_num_teams arg to permit
	omp_get_num_teams and omp_get_team_num.
	(scan_omp_1_stmt): Update call to it, add missing call for
	reverse offload, and check for strictly nested API calls in teams.

gcc/testsuite/ChangeLog:

	* c-c++-common/gomp/target-device-ancestor-3.c: Add non-API
	routine test.
	* gfortran.dg/gomp/order-6.f90: Add missing bind(C).
	* c-c++-common/gomp/teams-3.c: New test.
	* gfortran.dg/gomp/teams-3.f90: New test.
	* gfortran.dg/gomp/teams-4.f90: New test.

libgomp/ChangeLog:
	* testsuite/libgomp.c-c++-common/icv-3.c: Nest API calls inside
	parallel construct.
	* testsuite/libgomp.c-c++-common/icv-4.c: Likewise.
	* testsuite/libgomp.c/target-3.c: Likewise.
	* testsuite/libgomp.c/target-5.c: Likewise.
	* testsuite/libgomp.c/target-6.c: Likewise.
	* testsuite/libgomp.c/target-teams-1.c: Likewise.
	* testsuite/libgomp.c/teams-1.c: Likewise.
	* testsuite/libgomp.c/thread-limit-2.c: Likewise.
	* testsuite/libgomp.c/thread-limit-3.c: Likewise.
	* testsuite/libgomp.c/thread-limit-4.c: Likewise.
	* testsuite/libgomp.c/thread-limit-5.c: Likewise.
	* testsuite/libgomp.fortran/icv-3.f90: Likewise.
	* testsuite/libgomp.fortran/icv-4.f90: Likewise.
	* testsuite/libgomp.fortran/teams1.f90: Likewise.
2021-10-30 23:45:32 +02:00
Harald Anlauf
90ba129c9d Fortran: remove descriptions of SHORT and LONG in intrinsic.texi
2021-10-30  Manfred Schwarb  <manfred99@gmx.ch>

gcc/fortran/ChangeLog:

	* intrinsic.texi: Remove entries for SHORT and LONG intrinsics.
2021-10-30 20:16:32 +02:00
Harald Anlauf
6888b7974b Fortran: non-standard intrinsics SHORT and LONG have been removed
2021-10-30  Manfred Schwarb  <manfred99@gmx.ch>

gcc/fortran/ChangeLog:

	* check.c (gfc_check_intconv): Change error message.

gcc/testsuite/ChangeLog:

	* gfortran.dg/intrinsic_short-long.f90: New test.
2021-10-30 20:09:10 +02:00
Harald Anlauf
061245e832 Fortran: fix descriptions in intrinsic.texi
2021-10-30  Manfred Schwarb  <manfred99@gmx.ch>

gcc/fortran/ChangeLog:

	* intrinsic.texi (REAL): Fix entries in Specific names table.
2021-10-30 19:29:57 +02:00
Harald Anlauf
f6a719c3fa Fortran: improve formatting of tables in intrinsic.texi
2021-10-30  Manfred Schwarb  <manfred99@gmx.ch>

gcc/fortran/ChangeLog:

	* intrinsic.texi: Adjust @columnfractions commands to improve
	appearance for narrow 80 character terminals.
2021-10-30 19:15:50 +02:00
Bernhard Reutner-Fischer
75c9fa318e Fix memory leak of gsymbol
We did not free global symbols. For a simplified abstract_type_3.f90
valgrind reports:

96 bytes in 1 blocks are still reachable in loss record 461 of 602
   at 0x48377D5: calloc (vg_replace_malloc.c:711)
   by 0x21257C3: xcalloc (xmalloc.c:162)
   by 0x98611B: gfc_get_gsymbol(char const*) (symbol.c:4341)
   by 0x932C58: parse_module() (parse.c:5912)
   by 0x9336F8: gfc_parse_file() (parse.c:6236)
   by 0x991449: gfc_be_parse_file() (f95-lang.c:204)
   by 0x11D8EDE: compile_file() (toplev.c:455)
   by 0x11DB9C3: do_compile() (toplev.c:2170)
   by 0x11DBCAF: toplev::main(int, char**) (toplev.c:2305)
   by 0x2045D37: main (main.c:39)

This patch reduces this to

 LEAK SUMMARY:
    definitely lost: 344 bytes in 1 blocks
    indirectly lost: 3,024 bytes in 4 blocks
      possibly lost: 0 bytes in 0 blocks
-   still reachable: 1,576,174 bytes in 2,277 blocks
+   still reachable: 1,576,078 bytes in 2,276 blocks
         suppressed: 0 bytes in 0 blocks

gcc/fortran/ChangeLog:

2018-10-21  Bernhard Reutner-Fischer  <aldot@gcc.gnu.org>

	* parse.c (clean_up_modules): Free gsym.
2021-10-30 18:45:11 +02:00
Harald Anlauf
db3f6783bd Fortran: update gfortran.texi list of frequent reporters
gcc/fortran/ChangeLog:

	* gfortran.texi (bug reports): credit Gerhard Steinmetz for
	  numerous bug reports.
2021-10-30 18:36:03 +02:00
Steve Kargl
d18e4cc416 Fortran: generate regular error on invalid conversions of CASE expressions
gcc/fortran/ChangeLog:

	PR fortran/99853
	* resolve.c (resolve_select): Generate regular gfc_error on
	invalid conversions instead of an gfc_internal_error.

gcc/testsuite/ChangeLog:

	PR fortran/99853
	* gfortran.dg/pr99853.f90: New test.
2021-10-30 18:22:19 +02:00
Alexandre Oliva
70c947e4df Implied compares in Ada Harded Conditionals documentation
Improve the wording on optimizations that prevent compare hardening,
so as to also cover cases in which explicit compares get combined into
operations with implied compares.


for  gcc/ada/ChangeLog

	* doc/gnat_rm/security_hardening_features.rst: Mention
	optimization to operations with implied compares.
2021-10-30 06:36:05 -03:00
Jakub Jelinek
6f449bb93b openmp: Diagnose threadprivate OpenMP loop iterators
We weren't diagnosing the
The loop iteration variable may not appear in a threadprivate directive.
restriction which used to be in 5.0 just among the Worksharing-Loop
restrictions but in 5.1 it is among Canonical Loop Nest Form restrictions.

This patch diagnoses those.

2021-10-30  Jakub Jelinek  <jakub@redhat.com>

	* gimplify.c (gimplify_omp_for): Diagnose threadprivate iterators.

	* c-c++-common/gomp/loop-10.c: New test.
2021-10-30 08:58:08 +02:00
GCC Administrator
4c61300f2b Daily bump. 2021-10-30 00:16:25 +00:00
Tamar Christina
518bc4ef87 testsuite: Don't expect a complex FMA
The sharing of the COMPLEX_MUL node makes it so it's
more efficient to not generate both a MUL and FMA
in this node.

Because the shape for a normal FMA is not different
the FMA is no longer detected here which results in
better codegen so update the testcase.

gcc/testsuite/ChangeLog:

	* g++.dg/vect/pr99149.cc: Update case.
2021-10-29 22:12:35 +01:00
Tobias Burnus
0078a058a5 libcpp: Fix _Pragma expansion [PR102409]
Both #pragma and _Pragma ended up as CPP_PRAGMA. Presumably since
r131819 (2008, GCC 4.3) for PR34692, pragmas are not expanded in
macro arguments but are output as is before. From the old bug report,
that was to fix usage like
  FOO (
    #pragma GCC diagnostic
  )
However, that change also affected _Pragma such that
  BAR (
    "1";
    _Pragma("omp ..."); )
yielded
  #pragma omp ...
followed by what BAR expanded too, possibly including '"1";'.

This commit adds a flag, PRAGMA_OP, to tokens to make the two
distinguishable - and include again _Pragma in the expanded arguments.

libcpp/ChangeLog:

	PR c++/102409
	* directives.c (destringize_and_run): Add PRAGMA_OP to the
	CPP_PRAGMA token's flags to mark is as coming from _Pragma.
	* include/cpplib.h (PRAGMA_OP): #define, to be used with token flags.
	* macro.c (collect_args): Only handle CPP_PRAGMA special if PRAGMA_OP
	is set.

gcc/testsuite/ChangeLog:

	* c-c++-common/gomp/pragma-1.c: New test.
	* c-c++-common/gomp/pragma-2.c: New test.
2021-10-29 22:55:32 +02:00
David Malcolm
ebfc3a2304 assert_streq: add newlines to failure message
Adding newlines so that the two strings line up makes string equality
failures considerably easier to read.

gcc/ChangeLog:
	* selftest.c (assert_streq): Add newlines when emitting non-equal
	non-NULL strings.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2021-10-29 16:52:12 -04:00
David Malcolm
26d82fe6fd gcc/Makefile.in: fix bug in gengtype link rule
gcc/ChangeLog:
	* Makefile.in: Fix syntax for reference to LIBDEPS in
	gengtype link rule.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2021-10-29 16:51:25 -04:00
Jonathan Wakely
d27febaf00 libstdc++: Fix typo in std::stack test
libstdc++-v3/ChangeLog:

	* testsuite/23_containers/stack/deduction.cc: Fix typo.
2021-10-29 21:34:54 +01:00
Bernhard Reutner-Fischer
7883a7f07c Fortran: Free type-bound procedure structs
compiling gfortran.dg/typebound_proc_31.f90 leaked the type-bound
structs:

56 bytes in 1 blocks are definitely lost.
  at 0x4C2CC05: calloc (vg_replace_malloc.c:711)
  by 0x151EA90: xcalloc (xmalloc.c:162)
  by 0x8E3E4F: gfc_get_typebound_proc(gfc_typebound_proc*) (symbol.c:4945)
  by 0x84C095: match_procedure_in_type (decl.c:10486)
  by 0x84C095: gfc_match_procedure() (decl.c:6696)
...

gcc/fortran/ChangeLog:

2017-12-06  Bernhard Reutner-Fischer  <aldot@gcc.gnu.org>

	* symbol.c (free_tb_tree): Free type-bound procedure struct.
	(gfc_get_typebound_proc): Use explicit memcpy for clarity.
2021-10-29 18:26:27 +02:00