platform/upstream/gcc.git
2 years agoFortran: Fix array copy-in/copy-out for BIND(C) functions [PR103390]
Sandra Loosemore [Mon, 3 Jan 2022 16:47:38 +0000 (08:47 -0800)]
Fortran: Fix array copy-in/copy-out for BIND(C) functions [PR103390]

The Fortran front end was generating invalid code for the array
copy-out after a call to a BIND(C) function for a dummy with the
CONTIGUOUS attribute when the actual argument was a call to the SHAPE
intrinsic or other array expressions that are not lvalues.  It was
also generating code to evaluate the argument expression multiple
times on copy-in.  This patch teaches it to recognize that a copy is
not needed in these cases.

2022-01-03  Sandra Loosemore  <sandra@codesourcery.com>

PR fortran/103390

gcc/fortran/
* expr.c (gfc_is_simply_contiguous): Make it smarter about
function calls.
* trans-expr.c (gfc_conv_gfc_desc_to_cfi_desc): Do not generate
copy loops for array expressions that are not "variables" (lvalues).

gcc/testsuite/
* gfortran.dg/c-interop/pr103390-1.f90: New.
* gfortran.dg/c-interop/pr103390-2.f90: New.
* gfortran.dg/c-interop/pr103390-3.f90: New.
* gfortran.dg/c-interop/pr103390-4.f90: New.
* gfortran.dg/c-interop/pr103390-6.f90: New.
* gfortran.dg/c-interop/pr103390-7.f90: New.
* gfortran.dg/c-interop/pr103390-8.f90: New.
* gfortran.dg/c-interop/pr103390-9.f90: New.

2 years agoi386, fab: Optimize __atomic_{add,sub,and,or,xor}_fetch (x, y, z) {==,!=,<,<=,>,...
Jakub Jelinek [Mon, 3 Jan 2022 13:02:23 +0000 (14:02 +0100)]
i386, fab: Optimize __atomic_{add,sub,and,or,xor}_fetch (x, y, z) {==,!=,<,<=,>,>=} 0 [PR98737]

On Wed, Jan 27, 2021 at 12:27:13PM +0100, Ulrich Drepper via Gcc-patches wrote:
> On 1/27/21 11:37 AM, Jakub Jelinek wrote:
> > Would equality comparison against 0 handle the most common cases.
> >
> > The user can write it as
> > __atomic_sub_fetch (x, y, z) == 0
> > or
> > __atomic_fetch_sub (x, y, z) - y == 0
> > thouch, so the expansion code would need to be able to cope with both.
>
> Please also keep !=0, <0, <=0, >0, and >=0 in mind.  They all can be
> useful and can be handled with the flags.

<= 0 and > 0 don't really work well with lock {add,sub,inc,dec}, x86 doesn't
have comparisons that would look solely at both SF and ZF and not at other
flags (and emitting two separate conditional jumps or two setcc insns and
oring them together looks awful).

But the rest can work.

Here is a patch that adds internal functions and optabs for these,
recognizes them at the same spot as e.g. .ATOMIC_BIT_TEST_AND* internal
functions (fold all builtins pass) and expands them appropriately (or for
the <= 0 and > 0 cases of +/- FAILs and let's middle-end fall back).

So far I have handled just the op_fetch builtins, IMHO instead of handling
also __atomic_fetch_sub (x, y, z) - y == 0 etc. we should canonicalize
__atomic_fetch_sub (x, y, z) - y to __atomic_sub_fetch (x, y, z) (and vice
versa).

2022-01-03  Jakub Jelinek  <jakub@redhat.com>

PR target/98737
* internal-fn.def (ATOMIC_ADD_FETCH_CMP_0, ATOMIC_SUB_FETCH_CMP_0,
ATOMIC_AND_FETCH_CMP_0, ATOMIC_OR_FETCH_CMP_0, ATOMIC_XOR_FETCH_CMP_0):
New internal fns.
* internal-fn.h (ATOMIC_OP_FETCH_CMP_0_EQ, ATOMIC_OP_FETCH_CMP_0_NE,
ATOMIC_OP_FETCH_CMP_0_LT, ATOMIC_OP_FETCH_CMP_0_LE,
ATOMIC_OP_FETCH_CMP_0_GT, ATOMIC_OP_FETCH_CMP_0_GE): New enumerators.
* internal-fn.c (expand_ATOMIC_ADD_FETCH_CMP_0,
expand_ATOMIC_SUB_FETCH_CMP_0, expand_ATOMIC_AND_FETCH_CMP_0,
expand_ATOMIC_OR_FETCH_CMP_0, expand_ATOMIC_XOR_FETCH_CMP_0): New
functions.
* optabs.def (atomic_add_fetch_cmp_0_optab,
atomic_sub_fetch_cmp_0_optab, atomic_and_fetch_cmp_0_optab,
atomic_or_fetch_cmp_0_optab, atomic_xor_fetch_cmp_0_optab): New
direct optabs.
* builtins.h (expand_ifn_atomic_op_fetch_cmp_0): Declare.
* builtins.c (expand_ifn_atomic_op_fetch_cmp_0): New function.
* tree-ssa-ccp.c: Include internal-fn.h.
(optimize_atomic_bit_test_and): Add . before internal fn call
in function comment.  Change return type from void to bool and
return true only if successfully replaced.
(optimize_atomic_op_fetch_cmp_0): New function.
(pass_fold_builtins::execute): Use optimize_atomic_op_fetch_cmp_0
for BUILT_IN_ATOMIC_{ADD,SUB,AND,OR,XOR}_FETCH_{1,2,4,8,16} and
BUILT_IN_SYNC_{ADD,SUB,AND,OR,XOR}_AND_FETCH_{1,2,4,8,16},
for *XOR* ones only if optimize_atomic_bit_test_and failed.
* config/i386/sync.md (atomic_<plusminus_mnemonic>_fetch_cmp_0<mode>,
atomic_<logic>_fetch_cmp_0<mode>): New define_expand patterns.
(atomic_add_fetch_cmp_0<mode>_1, atomic_sub_fetch_cmp_0<mode>_1,
atomic_<logic>_fetch_cmp_0<mode>_1): New define_insn patterns.
* doc/md.texi (atomic_add_fetch_cmp_0<mode>,
atomic_sub_fetch_cmp_0<mode>, atomic_and_fetch_cmp_0<mode>,
atomic_or_fetch_cmp_0<mode>, atomic_xor_fetch_cmp_0<mode>): Document
new named patterns.

* gcc.target/i386/pr98737-1.c: New test.
* gcc.target/i386/pr98737-2.c: New test.
* gcc.target/i386/pr98737-3.c: New test.
* gcc.target/i386/pr98737-4.c: New test.
* gcc.target/i386/pr98737-5.c: New test.
* gcc.target/i386/pr98737-6.c: New test.
* gcc.target/i386/pr98737-7.c: New test.

2 years agomiddle-end/103851 - ensure SSA names are released during OMP lowering
Richard Biener [Mon, 3 Jan 2022 11:55:45 +0000 (12:55 +0100)]
middle-end/103851 - ensure SSA names are released during OMP lowering

This makes sure to release moved & remapped SSA names during OMP
outlining which happens before going into SSA but with SSA names
created by gimplification around.

2022-01-03  Richard Biener  <rguenther@suse.de>

PR middle-end/103851
* tree-cfg.c (move_sese_region_to_fn): Always release SSA names.

* g++.dg/gomp/pr103851.C: New testcase.

2 years agosymtab: Fold &a == &b to 0 if folding_initializer [PR94716]
Jakub Jelinek [Mon, 3 Jan 2022 12:47:53 +0000 (13:47 +0100)]
symtab: Fold &a == &b to 0 if folding_initializer [PR94716]

On Thu, Dec 09, 2021 at 06:09:12PM -0500, Jason Merrill wrote:
> For the more general comparison of decls like your a != b example above I
> think clang is in the right; in manifestly constant-evaluated context
> (folding_initializer) we should return that they are unequal and prevent a
> later alias declaration, like we do for comparison to 0 in
> maybe_nonzero_address.  It's possible that this gives a wrong answer based
> on something in another translation unit, but that's unlikely, and taking
> that chance seems better than rejecting code that needs a constant answer.

I agree.  This is an incremental patch to do that.

2022-01-03  Jakub Jelinek  <jakub@redhat.com>

PR c++/94716
gcc/
* symtab.c: Include fold-const.h.
(symtab_node::equal_address_to): If folding_initializer is true,
handle it like memory_accessed.  Simplify.
gcc/testsuite/
* gcc.dg/init-compare-1.c: New test.
* g++.dg/cpp0x/constexpr-compare1.C: New test.
* g++.dg/cpp1y/constexpr-94716.C: New test.
* g++.dg/cpp1z/constexpr-compare1.C: New test.

2 years agotestsuite: fix ASAN errors in i386.exp tests
Martin Liska [Tue, 14 Dec 2021 15:22:25 +0000 (16:22 +0100)]
testsuite: fix ASAN errors in i386.exp tests

gcc/testsuite/ChangeLog:

* gcc.target/i386/avx2-i32gatherpd256-4.c: Fix ASAN errors.
* gcc.target/i386/avx2-i32gatherq256-4.c: Likewise.
* gcc.target/i386/avx2-i64gatherpd256-4.c: Likewise.
* gcc.target/i386/avx2-i64gatherq256-4.c: Likewise.
* gcc.target/i386/avx2-vpabsb256-2.c: Likewise.
* gcc.target/i386/avx2-vpabsd256-2.c: Likewise.
* gcc.target/i386/avx2-vpabsw256-2.c: Likewise.
* gcc.target/i386/avx256-unaligned-load-7.c: Likewise.
* gcc.target/i386/avx256-unaligned-store-7.c: Likewise.
* gcc.target/i386/pr64291-1.c: Likewise.

2 years agotestsuite: fix vect.exp ASAN errors
Martin Liska [Wed, 15 Dec 2021 12:41:00 +0000 (13:41 +0100)]
testsuite: fix vect.exp ASAN errors

gcc/testsuite/ChangeLog:

* gcc.dg/vect/vect-simd-18.c: Fix ASAN error.
* gcc.dg/vect/vect-simd-19.c: Likewise.

2 years agod: Merge upstream dmd 001bfd97b, druntime 759e6023, phobos 468788323.
Iain Buclaw [Sun, 2 Jan 2022 12:36:51 +0000 (13:36 +0100)]
d: Merge upstream dmd 001bfd97b, druntime 759e6023, phobos 468788323.

D front-end changes:

    - Import latest changes to mainline.
    - Fix bad format specifiers in front-end errors (PR103840).
    - Refactoring of some leaf modules to the dmd/root package.
    - Updating copyright notice dates and urls.

Phobos changes:

    - Import latest changes to mainline.

gcc/d/ChangeLog:

PR d/103840
* dmd/MERGE: Merge upstream dmd 001bfd97b.
* Make-lang.in (D_FRONTEND_OBJS): Rename d/complex.o to
d/root-complex.o, and d/utf.o to d/root/utf.o.

libphobos/ChangeLog:

* libdruntime/MERGE: Merge upstream druntime 759e6023.
* src/MERGE: Merge upstream phobos 468788323.

2 years agodocs: Use ; for function declarations.
Martin Liska [Mon, 3 Jan 2022 10:57:07 +0000 (11:57 +0100)]
docs: Use ; for function declarations.

gcc/ChangeLog:

* doc/extend.texi: Use ; for function declarations.

2 years agoc++: Support &typeid(x) == &typeid(y) and typeid(x) == typeid(y) in constant evaluati...
Jakub Jelinek [Mon, 3 Jan 2022 10:21:00 +0000 (11:21 +0100)]
c++: Support &typeid(x) == &typeid(y) and typeid(x) == typeid(y) in constant evaluation [PR103600]

If the tinfo vars are emitted in the current TU, they are emitted at the end
of the compilation, and for some types they are exported from
libstdc++/libsupc++ and not emitted in the current TU at all.

The following patch allows constant folding of comparisons of typeid
addresses and makes it possible to implement P1328R1 - making type_info
operator== constexpr (Jonathan has a patch for that).

As mentioned in the PR, the varpool/middle-end code is trying to be
conservative with address comparisons of different vars if those vars
don't bind locally, because of possible aliases in other TUs etc.
and so while match.pd folds &typeid(int) == &typeid(int) because
it is equality comparison with the same operands, for different typeids
it doesn't fold it.

On Wed, Dec 08, 2021 at 08:53:03AM -0500, Jason Merrill wrote:
> Would it make sense to assume that DECL_ARTIFICIAL variables can't be
> aliases?  If not, could we have some way of marking a variable as
> non-aliasing, perhaps an attribute?

I think DECL_ARTIFICIAL vars generally can overlap.

The following patch adds a GCC internal attribute "non overlapping"
and uses it in symtab_node::equal_address_to.
Not sure what plans has Honza in that area and whether it would be useful
to make the attribute public and let users assert that some variable will
never overlap with other variables, won't have aliases etc.

> During constant evaluation, the operator== could compare the type_info
> address instead of the __name address, reducing this to the previous
> problem.

Ah, indeed, good idea.  FYI, clang++ seems to constant fold
&typeid(x) != &typeid(y) already, so Jonathan could use it even for
clang++ in the constexpr operator==.  But it folds even
extern int &a, &b;
constexpr bool c = &a != &b;
regardless of whether some other TU has
int a;
int b __attribute__((alias (a));
or not.

2022-01-03  Jakub Jelinek  <jakub@redhat.com>

PR c++/103600
gcc/
* symtab.c (symtab_node::equal_address_to): Return 0 if one of
VAR_DECLs has "non overlapping" attribute and rs1 != rs2.
gcc/c-family/
* c-attribs.c (handle_non_overlapping_attribute): New function.
(c_common_attribute_table): Add "non overlapping" attribute.
gcc/cp/
* rtti.c (get_tinfo_decl_direct): Add "non overlapping" attribute
to DECL_TINFO_P VAR_DECLs.
gcc/testsuite/
* g++.dg/cpp0x/constexpr-typeid2.C: New test.

2 years agotree-optimization/66502 - add testcase
Richard Biener [Mon, 3 Jan 2022 09:48:57 +0000 (10:48 +0100)]
tree-optimization/66502 - add testcase

This adds the second testcase which we now also handle eliminating
a redundant PHI node.

2022-01-03  Richard Biener  <rguenther@suse.de>

PR tree-optimization/66502
* gcc.dg/tree-ssa/ssa-fre-98.c: New testcase.

2 years agoUpdate copyright years.
Jakub Jelinek [Mon, 3 Jan 2022 09:42:10 +0000 (10:42 +0100)]
Update copyright years.

2 years agoAdd University of Illinois as external author
Jakub Jelinek [Mon, 3 Jan 2022 09:39:25 +0000 (10:39 +0100)]
Add University of Illinois as external author

* update-copyright.py: Add University of Illinois as external author.

2 years agoUpdate Copyright in ChangeLog files
Jakub Jelinek [Mon, 3 Jan 2022 09:31:39 +0000 (10:31 +0100)]
Update Copyright in ChangeLog files

Do this separately from all other Copyright updates, as ChangeLog files
can be modified only separately.

2 years agoUpdate copyright dates.
Jakub Jelinek [Mon, 3 Jan 2022 09:27:43 +0000 (10:27 +0100)]
Update copyright dates.

Manual part of copyright year updates.

2022-01-03  Jakub Jelinek  <jakub@redhat.com>

gcc/
* gcc.c (process_command): Update copyright notice dates.
* gcov-dump.c (print_version): Ditto.
* gcov.c (print_version): Ditto.
* gcov-tool.c (print_version): Ditto.
* gengtype.c (create_file): Ditto.
* doc/cpp.texi: Bump @copying's copyright year.
* doc/cppinternals.texi: Ditto.
* doc/gcc.texi: Ditto.
* doc/gccint.texi: Ditto.
* doc/gcov.texi: Ditto.
* doc/install.texi: Ditto.
* doc/invoke.texi: Ditto.
gcc/ada/
* gnat_ugn.texi: Bump @copying's copyright year.
* gnat_rm.texi: Likewise.
gcc/d/
* gdc.texi: Bump @copyrights-d year.
gcc/fortran/
* gfortranspec.c (lang_specific_driver): Update copyright notice
dates.
* gfc-internals.texi: Bump @copying's copyright year.
* gfortran.texi: Ditto.
* intrinsic.texi: Ditto.
* invoke.texi: Ditto.
gcc/go/
* gccgo.texi: Bump @copyrights-go year.
libgomp/
* libgomp.texi: Bump @copying's copyright year.
libitm/
* libitm.texi: Bump @copying's copyright year.
libquadmath/
* libquadmath.texi: Bump @copying's copyright year.

2 years agoRotate ChangeLog files - step 2 - remove 2021 entries from ChangeLog files.
Jakub Jelinek [Mon, 3 Jan 2022 09:23:34 +0000 (10:23 +0100)]
Rotate ChangeLog files - step 2 - remove 2021 entries from ChangeLog files.

Can't be committed together with the previous one due to the ChangeLog vs.
other files restrictions.

2 years agoRotate ChangeLog files - part 1 - add ChangeLog-2021.
Jakub Jelinek [Mon, 3 Jan 2022 09:18:16 +0000 (10:18 +0100)]
Rotate ChangeLog files - part 1 - add ChangeLog-2021.

2022-01-03  Jakub Jelinek  <jakub@redhat.com>

gcc/
* ChangeLog-2021: Rotate ChangeLog.  New file.
gcc/ada/
* ChangeLog-2021: Rotate ChangeLog.  New file.
gcc/cp/
* ChangeLog-2021: Rotate ChangeLog.  New file.
gcc/d/
* ChangeLog-2021: Rotate ChangeLog.  New file.
gcc/fortran/
* ChangeLog-2021: Rotate ChangeLog.  New file.
gcc/testsuite/
* ChangeLog-2021: Rotate ChangeLog.  New file.
libgfortran/
* ChangeLog-2021: Rotate ChangeLog.  New file.
libstdc++-v3/
* ChangeLog-2021: Rotate ChangeLog.  New file.

2 years agoAdd testcase for PR103615
Richard Biener [Mon, 3 Jan 2022 08:56:13 +0000 (09:56 +0100)]
Add testcase for PR103615

This adds a testcase for a fixed wrong-code bug.

2022-01-03  Richard Biener  <rguenther@suse.de>

PR tree-optimization/103615
* gcc.dg/torture/pr103615.c: New testcase.

2 years agoDaily bump.
GCC Administrator [Mon, 3 Jan 2022 00:16:28 +0000 (00:16 +0000)]
Daily bump.

2 years agoi386: Introduce V2QImode vectorized arithmetic [PR103861]
Uros Bizjak [Sun, 2 Jan 2022 20:12:10 +0000 (21:12 +0100)]
i386: Introduce V2QImode vectorized arithmetic [PR103861]

This patch adds basic V2QImode infrastructure and V2QImode arithmetic
operations (plus, minus and neg).  The patched compiler can emit SSE
vectorized QImode operations (e.g. PADDB) with partial QImode vector,
and also synthesized double HI/LO QImode operations with integer registers.

The testcase:

typedef char __v2qi __attribute__ ((__vector_size__ (2)));
__v2qi plus  (__v2qi a, __v2qi b) { return a + b; };

compiles with -O2 to:

        movl    %edi, %edx
        movl    %esi, %eax
        addb    %sil, %dl
        addb    %ah, %dh
        movl    %edx, %eax
        ret

which is much better than what the unpatched compiler produces:

        movl    %edi, %eax
        movl    %esi, %edx
        xorl    %ecx, %ecx
        movb    %dil, %cl
        movsbl  %dh, %edx
        movsbl  %ah, %eax
        addl    %edx, %eax
        addb    %sil, %cl
        movb    %al, %ch
        movl    %ecx, %eax
        ret

The V2QImode vectorization does not require vector registers, so it can
be enabled by default also for 32-bit targets without SSE.

The patch also enables vectorized V2QImode sign/zero extends.

2021-12-30  Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog:

PR target/103861
* config/i386/i386.h (VALID_SSE2_REG_MODE): Add V2QImode.
(VALID_INT_MODE_P): Ditto.
* config/i386/i386.c (ix86_secondary_reload): Handle
V2QImode reloads from SSE register to memory.
(vector_mode_supported_p): Always return true for V2QImode.
* config/i386/i386.md (*subqi_ext<mode>_2): New insn pattern.
(*negqi_ext<mode>_2): Ditto.
* config/i386/mmx.md (movv2qi): New expander.
(movmisalignv2qi): Ditto.
(*movv2qi_internal): New insn pattern.
(*pushv2qi2): Ditto.
(negv2qi2 and splitters): Ditto.
(<plusminus:insn>v2qi3 and splitters): Ditto.

gcc/testsuite/ChangeLog:

PR target/103861
* gcc.dg/store_merging_18.c (dg-options): Add -fno-tree-vectorize.
* gcc.dg/store_merging_29.c (dg-options): Ditto.
* gcc.target/i386/pr103861.c: New test.
* gcc.target/i386/pr92658-avx512vl.c (dg-final):
Remove vpmovqb scan-assembler xfail.
* gcc.target/i386/pr92658-sse4.c (dg-final):
Remove pmovzxbq scan-assembler xfail.
* gcc.target/i386/pr92658-sse4-2.c (dg-final):
Remove pmovsxbq scan-assembler xfail.
* gcc.target/i386/warn-vect-op-2.c (dg-warning): Adjust warnings.

2 years agoAdjust shadd-2 and shadd-3 scan counts.
John David Anglin [Sun, 2 Jan 2022 18:55:50 +0000 (18:55 +0000)]
Adjust shadd-2 and shadd-3 scan counts.

2022-01-02  John David Anglin  <danglin@gcc.gnu.org>

gcc/testsuite/ChangeLog:

* gcc.target/hppa/shadd-2.c: Adjust count to 3.
* gcc.target/hppa/shadd-3.c: Likewise.

2 years agoSkip gcc.dg/guality/example.c on hppa-linux.
John David Anglin [Sun, 2 Jan 2022 18:37:34 +0000 (18:37 +0000)]
Skip gcc.dg/guality/example.c on hppa-linux.

2022-01-02  John David Anglin  <danglin@gcc.gnu.org>

gcc/testsuite/ChangeLog:

* gcc.dg/guality/example.c: Skip on hppa*-*-linux*.

2 years agoc++: fix array cleanup with throwing temp dtor
Jason Merrill [Sat, 1 Jan 2022 18:07:59 +0000 (13:07 -0500)]
c++: fix array cleanup with throwing temp dtor

While working on PR66139 I noticed that if the destructor of a temporary
created during array initialization throws, we were failing to destroy the
last array element constructed.  Throwing destructors are rare since C++11,
but this should be fixed.

gcc/cp/ChangeLog:

* init.c (build_vec_init): Append the decrement to elt_init.

gcc/testsuite/ChangeLog:

* g++.dg/eh/array2.C: New test.

2 years agoc++: don't wrap cleanups that can't throw
Jason Merrill [Thu, 30 Dec 2021 05:10:57 +0000 (00:10 -0500)]
c++: don't wrap cleanups that can't throw

Since C++11, the vast majority of destructors are noexcept, so
wrap_temporary_cleanups adds a bunch of useless TRY_CATCH_EXPR to be removed
later in the optimizers.  It's simple to avoid adding them in the first
place.

gcc/cp/ChangeLog:

* decl.c (wrap_cleanups_r): Don't wrap if noexcept.

gcc/testsuite/ChangeLog:

* g++.dg/eh/cleanup6.C: New test.

2 years agoGenerate illegal instruction fault if LWS syscall returns -EFAULT.
John David Anglin [Sun, 2 Jan 2022 17:12:45 +0000 (17:12 +0000)]
Generate illegal instruction fault if LWS syscall returns -EFAULT.

2022-01-02  John David Anglin  <danglin@gcc.gnu.org>

libgcc/ChangeLog:

* config/pa/linux-atomic.c (_ASM_EFAULT): Define.
(__kernel_cmpxchg): Nullify illegal iitlbp instruction if error
return is not equal _ASM_EFAULT.
(__kernel_cmpxchg2): Likewise.

2 years agoUse optab_libfunc to access sync_lock_test_and_set libfunc on hppa-linux.
John David Anglin [Sun, 2 Jan 2022 16:40:48 +0000 (16:40 +0000)]
Use optab_libfunc to access sync_lock_test_and_set libfunc on hppa-linux.

2022-01-02  John David Anglin  <danglin@gcc.gnu.org>

gcc/ChangeLog:

* config/pa/pa.md (atomic_storeq): Use optab_libfunc to access
sync_lock_test_and_set libfunc. Call convert_memory_address to
convert memory address to Pmode.
(atomic_storehi, atomic_storesi, atomic_storedi): Likewise.

2 years agoDaily bump.
GCC Administrator [Sun, 2 Jan 2022 00:16:28 +0000 (00:16 +0000)]
Daily bump.

2 years agoFixincludes: Handle __FLT_EVAL_METHOD__ == 16 on darwin
Francois-Xavier Coudert [Sat, 1 Jan 2022 11:22:00 +0000 (12:22 +0100)]
Fixincludes: Handle __FLT_EVAL_METHOD__ == 16 on darwin

The darwin system headers error out on __FLT_EVAL_METHOD__ == 16, which
occurs when the compiler is called with -mavx512fp16 on i386. Allow this
value to proceed past the check (nothing else depends on it in the
system headers).

fixincludes/ChangeLog:

* inclhack.def: Add new fix on darwin.
* fixincl.x: Regenerate.
* tests/base/math.h: Regenerate.

2 years agoCommitted: Add testcases for a few PRs
Andrew Pinski [Sat, 1 Jan 2022 08:44:48 +0000 (08:44 +0000)]
Committed: Add testcases for a few PRs

These were fixed as part of the fix for PR 99766,
I thought it would be useful to add a few testcases
for the other cases that were failing.

Committed as obvious after running the tests to make
sure they work.

PR rtl-optimization/100241
PR rtl-optimization/99787

gcc/testsuite/ChangeLog:

* gcc.c-torture/compile/pr100241-1.c: New test.
* gcc.c-torture/compile/pr99787-1.c: New test.

2 years agotestsuite: Adjust gcc.misc-tests/godump-1.c testcase
Jakub Jelinek [Sat, 1 Jan 2022 05:30:39 +0000 (06:30 +0100)]
testsuite: Adjust gcc.misc-tests/godump-1.c testcase

On Wed, Dec 29, 2021 at 03:54:03PM -0800, Ian Lance Taylor via Gcc-patches wrote:
> PR go/103847
> * godump.c (go_force_record_alignment): Name the alignment
> field "_".

> --- a/gcc/godump.c
> +++ b/gcc/godump.c
> @@ -651,7 +651,7 @@ go_force_record_alignment (struct obstack *ob, const char *type_string,
>                          unsigned int index, const char *error_string)
>  {
>    index = go_append_artificial_name (ob, index);
> -  obstack_grow (ob, "_align ", 7);
> +  obstack_grow (ob, "_ ", 2);
>    if (type_string == NULL)
>      obstack_grow (ob, error_string, strlen (error_string));
>    else

This change caused
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _ts_nested struct { u struct { s int16; Godump_0_pad \\\\[2\\\\]byte; Godump_1_align \\\\[0\\\\]u?int32; }; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _ts_nested2 struct { u struct { Godump_0_pad \\\\[4\\\\]byte; Godump_1_pad \\\\[2\\\\]byte; s int16; c int8; Godump_2_pad
+\\\\[1\\\\]byte; Godump_3_pad \\\\[2\\\\]byte; Godump_4_align \\\\[0\\\\]u?int32; }; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _tsbf_gaps struct { bf1 uint8; c uint8; bf2 uint8; Godump_0_pad \\\\[2\\\\]byte; s uint16; Godump_1_align \\\\[0\\\\]int32; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _tsbf_pad16_1 struct { Godump_0_pad \\\\[1\\\\]byte; c uint8; Godump_1_align \\\\[0\\\\]int16; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _tsbf_pad16_2 struct { Godump_0_pad \\\\[2\\\\]byte; c uint8; Godump_1_pad \\\\[.\\\\]byte; Godump_2_align \\\\[0\\\\]int16; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _tsbf_pad32_1 struct { Godump_0_pad \\\\[1\\\\]byte; c uint8; Godump_1_pad \\\\[.\\\\]byte; Godump_2_align \\\\[0\\\\]int32; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _tsbf_pad32_2 struct { Godump_0_pad \\\\[4\\\\]byte; c uint8; Godump_1_pad \\\\[.\\\\]byte; Godump_2_align \\\\[0\\\\]int32; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _tsbf_pad64_1 struct { Godump_0_pad \\\\[1\\\\]byte; c uint8; Godump_1_pad \\\\[.\\\\]byte; Godump_2_align \\\\[0\\\\]int64; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _tsbf_pad64_2 struct { Godump_0_pad \\\\[8\\\\]byte; c uint8; Godump_1_pad \\\\[.\\\\]byte; Godump_2_align \\\\[0\\\\]int64; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _tsn_anon struct { a uint8; s uint16; b uint8; Godump_0_pad \\\\[.\\\\]byte; Godump_1_align \\\\[0\\\\]int16; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _tsu_anon struct { c uint8; Godump_0_pad \\\\[7\\\\]byte; Godump_1_align \\\\[0\\\\]u?int64; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _tu1 struct { c uint8; Godump_0_pad \\\\[.\\\\]byte; Godump_1_align \\\\[0\\\\]u?int64; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _tu3_size struct { ca \\\\[4\\\\+1\\\\]uint8; Godump_0_pad \\\\[.\\\\]byte; Godump_1_align \\\\[0\\\\]u?int64; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _tu_nested struct { u struct { s int16; Godump_0_pad \\\\[2\\\\]byte; Godump_1_align \\\\[0\\\\]u?int32; }; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _tu_nested2 struct { u struct { Godump_0_pad \\\\[4\\\\]byte; Godump_1_pad \\\\[2\\\\]byte; s int16; c int8; Godump_2_pad
+\\\\[1\\\\]byte; Godump_3_pad \\\\[2\\\\]byte; Godump_4_align \\\\[0\\\\]u?int32; }; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^type _tu_size struct { ca \\\\[4\\\\+1\\\\]uint8; Godump_0_pad \\\\[.\\\\]byte; Godump_1_align \\\\[0\\\\]u?int64; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _s_nested struct { u struct { s int16; Godump_0_pad \\\\[2\\\\]byte; Godump_1_align \\\\[0\\\\]u?int32; }; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _s_nested2 struct { u struct { Godump_0_pad \\\\[4\\\\]byte; Godump_1_pad \\\\[2\\\\]byte; s int16; c int8; Godump_2_pad
+\\\\[1\\\\]byte; Godump_3_pad \\\\[2\\\\]byte; Godump_4_align \\\\[0\\\\]u?int32; }; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _sbf_gaps struct { bf1 uint8; c uint8; bf2 uint8; Godump_0_pad \\\\[2\\\\]byte; s uint16; Godump_1_align \\\\[0\\\\]int32; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _sbf_pad16_1 struct { Godump_0_pad \\\\[1\\\\]byte; c uint8; Godump_1_align \\\\[0\\\\]int16; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _sbf_pad16_2 struct { Godump_0_pad \\\\[2\\\\]byte; c uint8; Godump_1_pad \\\\[.\\\\]byte; Godump_2_align \\\\[0\\\\]int16; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _sbf_pad32_1 struct { Godump_0_pad \\\\[1\\\\]byte; c uint8; Godump_1_pad \\\\[.\\\\]byte; Godump_2_align \\\\[0\\\\]int32; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _sbf_pad32_2 struct { Godump_0_pad \\\\[4\\\\]byte; c uint8; Godump_1_pad \\\\[.\\\\]byte; Godump_2_align \\\\[0\\\\]int32; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _sbf_pad64_1 struct { Godump_0_pad \\\\[1\\\\]byte; c uint8; Godump_1_pad \\\\[.\\\\]byte; Godump_2_align \\\\[0\\\\]int64; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _sbf_pad64_2 struct { Godump_0_pad \\\\[8\\\\]byte; c uint8; Godump_1_pad \\\\[.\\\\]byte; Godump_2_align \\\\[0\\\\]int64; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _sn_anon struct { a uint8; s uint16; b uint8; Godump_0_pad \\\\[.\\\\]byte; Godump_1_align \\\\[0\\\\]int16; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _su_anon struct { c uint8; Godump_0_pad \\\\[7\\\\]byte; Godump_1_align \\\\[0\\\\]u?int64; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _u1 struct { c uint8; Godump_0_pad \\\\[.\\\\]byte; Godump_1_align \\\\[0\\\\]u?int64; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _u3_size struct { ca \\\\[4\\\\+1\\\\]uint8; Godump_0_pad \\\\[.\\\\]byte; Godump_1_align \\\\[0\\\\]u?int64; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _u_nested struct { u struct { s int16; Godump_0_pad \\\\[2\\\\]byte; Godump_1_align \\\\[0\\\\]u?int32; }; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _u_nested2 struct { u struct { Godump_0_pad \\\\[4\\\\]byte; Godump_1_pad \\\\[2\\\\]byte; s int16; c int8; Godump_2_pad
+\\\\[1\\\\]byte; Godump_3_pad \\\\[2\\\\]byte; Godump_4_align \\\\[0\\\\]u?int32; }; }\$
+FAIL: gcc.misc-tests/godump-1.c scan-file (?n)^var _u_size struct { ca \\\\[4\\\\+1\\\\]uint8; Godump_0_pad \\\\[.\\\\]byte; Godump_1_align \\\\[0\\\\]u?int64; }\$
on x86_64-linux.

The following patch adjusts the testcase for the above change.

2022-01-01  Jakub Jelinek  <jakub@redhat.com>

* gcc.misc-tests/godump-1.c: Adjust for renaming of last
field from _align suffix to _ suffix.

2 years agoobjc: Fix handling of break stmt inside of switch inside of ObjC foreach [PR103639]
Jakub Jelinek [Sat, 1 Jan 2022 05:29:36 +0000 (06:29 +0100)]
objc: Fix handling of break stmt inside of switch inside of ObjC foreach [PR103639]

The r11-3302-g3696a50beeb73f changes broke the following ObjC testcase.
in_statement is either 0 (not in a looping statement), various IN_* flags
for various kinds of looping statements (or OpenMP structured blocks) or
those flags ored with IN_SWITCH_STMT when a switch appears inside of those
contexts.  This is because break binds to switch in that last case, but
continue binds to the looping construct in that case.
The c_finish_bc_stmt function performs diagnostics on incorrect
break/continue uses and then checks if in_statement & IN_OBJC_FOREACH
and in that case jumps to the label provided by the caller, otherwise
emits a BREAK_STMT or CONTINUE_STMT.  This is incorrect if we have
ObjC foreach with switch nested in it and break inside of that,
in_statement in that case is IN_OBJC_FOREACH | IN_SWITCH_STMT and
is_break is true.  We want to handle it like other breaks inside of
switch, i.e. emit a BREAK_STMT.

The following patch fixes that.

2022-01-01  Jakub Jelinek  <jakub@redhat.com>

PR objc/103639
* c-typeck.c (c_finish_bc_stmt): For break inside of switch inside of
ObjC foreach, emit normal BREAK_STMT rather than goto to label.

2022-01-01  Iain Sandoe  <iain@sandoe.co.uk>

PR objc/103639
* objc.dg/pr103639.m: New test.

2 years agoDaily bump.
GCC Administrator [Sat, 1 Jan 2022 00:16:17 +0000 (00:16 +0000)]
Daily bump.

2 years agoFortran: Fix test on targets without REAL128
Francois-Xavier Coudert [Fri, 31 Dec 2021 22:19:03 +0000 (23:19 +0100)]
Fortran: Fix test on targets without REAL128

REAL128 is a named constant, so we cannot simply use
(REAL128 > 0) to conditionally compile for targets with
REAL128.

gcc/testsuite/ChangeLog:

PR fortran/89639
* gfortran.dg/ieee/ieee_9.f90: Adjust test for targets without
REAL128.

2 years agolibgfortran: Fix bootstrap on targets without static_assert macro.
Iain Sandoe [Fri, 31 Dec 2021 11:52:22 +0000 (11:52 +0000)]
libgfortran: Fix bootstrap on targets without static_assert macro.

Although we build the library with GCC which is known to support
_Static_assert this might be done on a system without the macro
mapping static_assert to the compiler keyword.

The use of static_assert introduced with r12-6126-g3430132f3e82
causes bootstrap to fail on such targets, fixed by using the keyword
directly.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
libgfortran/ChangeLog:

* runtime/string.c (gfc_itoa): Use _Static_assert directly
instead of via the static_assert macro.

2 years agotestsuite: XFAIL some Wstringop-overflow tests ...
Uros Bizjak [Fri, 31 Dec 2021 13:06:07 +0000 (14:06 +0100)]
testsuite: XFAIL some Wstringop-overflow tests ...

... for targets that support vectorization of 2-byte char stores
with unaligned address at plain O2.

2021-12-31  Uroš Bizjak  <ubizjak@gmail.com>

gcc/testsuite/ChangeLog:

* lib/target-supports.exp (check_vect_slp_store_usage):
Handle TEST_V2QI_2.
(check_effective_target_vect_slp_v2qi_store_unalign): New procedure.
* c-c++-common/Wstringop-overflow-2.c: XFAIL specific tests for
vect_slp_v2qi_store_unalign targets.
* g++.dg/warn/Wstringop-overflow-3.C: Ditto.
* gcc.dg/Wstringop-overflow-28.c: Ditto.
* gcc.dg/Wstringop-overflow-68.c: Ditto.
* gcc.dg/Wstringop-overflow-75.c: Ditto.
* gcc.dg/Wstringop-overflow-76.c: Ditto.

2 years agoDaily bump.
GCC Administrator [Fri, 31 Dec 2021 00:16:26 +0000 (00:16 +0000)]
Daily bump.

2 years agoregrename: Fix -fcompare-debug issue in find_rename_reg [PR103756]
Jakub Jelinek [Thu, 30 Dec 2021 21:25:34 +0000 (22:25 +0100)]
regrename: Fix -fcompare-debug issue in find_rename_reg [PR103756]

The r12-5978 change caused a -fcompare-debug issue, because without
-g a chain might start with a noop move, but with -g there could be
one or more DEBUG_INSNs in the chain before the noop move and so
regrename could make different decisions between -g and -g0.

Note, I must say I don't really understand the original change much,
if we want to make sure the noop moves are removed, couldn't regrename
during building of those du chains simply remove the noop moves instead?

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

PR rtl-optimization/103756
* regrename.c (find_rename_reg): Test noop_move_p on the first
non-debug insn in the chain rather than on the first insn.

* g++.dg/opt/pr103756.C: New test.

2 years agolibcpp: Fix up ##__VA_OPT__ handling [PR89971]
Jakub Jelinek [Thu, 30 Dec 2021 21:23:58 +0000 (22:23 +0100)]
libcpp: Fix up ##__VA_OPT__ handling [PR89971]

In the following testcase we incorrectly error about pasting / token
with padding token (which is a result of __VA_OPT__); instead we should
like e.g. for ##arg where arg is empty macro argument clear PASTE_LEFT
flag of the previous token if __VA_OPT__ doesn't add any real tokens
(which can happen either because the macro doesn't have any tokens
passed to ... (i.e. __VA_ARGS__ expands to empty) or when __VA_OPT__
doesn't have any tokens in between ()s).

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

PR preprocessor/89971
libcpp/
* macro.c (replace_args): For ##__VA_OPT__, if __VA_OPT__ expands
to no tokens at all, drop PASTE_LEFT flag from the previous token.
gcc/testsuite/
* c-c++-common/cpp/va-opt-9.c: New test.

2 years agolibiberty: support digits in cpp mangled clone names
Lancelot SIX [Thu, 30 Dec 2021 16:36:52 +0000 (11:36 -0500)]
libiberty: support digits in cpp mangled clone names

Currently libiberty fails to demangle the name of cloned functions if
the clone-type-identifier contains numbers.

This can be observed with the following example:

    $ cat > ex.cc <<EOT
    void foo (float *, float *)
      __attribute__((target_clones("avx2,avx,sse4.1,default")));

    void foo (float *, float *) {}
    EOT
    $ gcc -c ex.cc
    $ nm -C ex.o | grep foo
    0000000000000000 i foo(float*, float*)
    0000000000000026 t foo(float*, float*) [clone .avx.1]
    0000000000000013 t _Z3fooPfS_.avx2.0
    0000000000000000 t foo(float*, float*) [clone .default.3]
    0000000000000000 W foo(float*, float*) [clone .resolver]
    0000000000000039 t _Z3fooPfS_.sse4_1.2

In this example, gcc creates clones for the FOO function, each matching
one of the specified targets.  When inspecting the binary, nm (and other
libiberty-based tools, including gdb) fails to demangle the symbol names
if the clone identifier contains numbers.

Form my understanding of the mangling convention[1], clone names are
part of vendor-specific suffixes and do not have rule preventing them
from containing digits.

This commit proposes to fix the demangling.  With this commit (ported to
binutils), nm gives the following output:

    $ nm-new -C ex.o | grep foo
    0000000000000000 i foo(float*, float*)
    0000000000000026 t foo(float*, float*) [clone .avx.1]
    0000000000000013 t foo(float*, float*) [clone .avx2.0]
    0000000000000000 t foo(float*, float*) [clone .default.3]
    0000000000000000 W foo(float*, float*) [clone .resolver]
    0000000000000039 t foo(float*, float*) [clone .sse4_1.2]

Tested on x86_86-linux with 'make check-libiberty'.

[1] https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling

libiberty/ChangeLog:

* cp-demangle.c (d_clone_suffix): Support digits in clone tag
names.
* testsuite/demangle-expected: Check demangling of clone symbols
with digits in name.

2 years agoemit-rtl: Fix a -fcompare-debug issue due to var-tracking [PR103808]
Jakub Jelinek [Thu, 30 Dec 2021 13:35:06 +0000 (14:35 +0100)]
emit-rtl: Fix a -fcompare-debug issue due to var-tracking [PR103808]

We get a -fcompare-debug FAIL on the following testcase.  The problem is
that during cprop we get when a TImode pseudo holding x is being
constructed:
(debug_insn 111 59 103 7 (var_location:TI D#2 (clobber (const_int 0 [0]))) -1
     (nil))
(insn 103 111 110 7 (clobber (reg/v:TI 89 [ x ])) "pr103808.c":8:9 -1
     (nil))
(debug_insn 110 103 104 7 (var_location:TI D#2 (subreg:TI (reg:DI 111 [ x ]) 0)) -1
     (nil))
(insn 104 110 109 7 (set (subreg:DI (reg/v:TI 89 [ x ]) 0)
        (reg:DI 111 [ x ])) "pr103808.c":8:9 80 {*movdi_internal}
     (expr_list:REG_DEAD (reg:DI 111 [ x ])
        (nil)))
Now, during RA that paradoxical subreg in a debug insn obviously can't
affect where pseudo 111 is allocated and RA puts it into the bp register,
so we have:
(debug_insn 110 111 109 4 (var_location:TI D#2 (reg:TI 6 bp [orig:111 x ] [111])) -1
     (nil))
Now, during var-tracking when we for:
(debug_insn 25 23 26 3 (var_location:TI x (concatn/v:TI [
            (reg:DI 6 bp [orig:111 x ] [111])
            (subreg:DI (debug_expr:TI D#2) 8)
        ])) "pr103808.c":8:9 -1
     (nil))
try to simplify the highpart subreg of bp, gen_rtx_REG_offset is called in:
      if (HARD_REGISTER_NUM_P (final_regno))
        {
          rtx x = gen_rtx_REG_offset (op, outermode, final_regno,
                                      subreg_memory_offset (outermode,
                                                            innermode, byte));
and that unfortunately sets REG_ATTRS on stack_pointer_rtx, because
gen_rtx_REG_offset uses gen_rtx_REG which for Pmode STACK_POINTER_REGNUM
returns stack_pointer_rtx rather than newly created register.
The clobbering of REG_ATTRS on the shared stack_pointer_rtx then shows up
in the dumps as (reg/f:DI 7 sp [ x+8 ]) instead of (reg/f:DI 7 sp)
that shows up without var-tracking.
Clobbering of REG_ATTRS on the shared *_pointer_rtx looks just wrong.
So, IMHO either simplify_gen_subreg -> gen_rtx_REG_offset should call
gen_raw_REG to make sure we get a new non-shared REG we can set REG_ATTRS
on, or we should make sure that we don't overwrite the REG_ATTRS on the
shared REGs (but then simplify_gen_subreg shouldn't try to overwrite
ORIGINAL_REGNO on those either).
For non-DEBUG_INSNs, I'd hope this never happens, the RA shouldn't allocate
multi-word regs overlapping with stack pointer, hard frame pointer etc.

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

PR debug/103808
* emit-rtl.c (gen_rtx_REG_offset): Use gen_raw_REG instead of
gen_rtx_REG.

* gcc.dg/pr103808.c: New test.

2 years agodocs: Add missing dash for argument.
Martin Liska [Thu, 30 Dec 2021 13:33:29 +0000 (14:33 +0100)]
docs: Add missing dash for argument.

gcc/ChangeLog:

* doc/cpp.texi: Add missing dash for argument.

2 years agoc-family: Use BULTINS_LOCATION for predefined macros changed upon optimize or target...
Jakub Jelinek [Thu, 30 Dec 2021 13:25:19 +0000 (14:25 +0100)]
c-family: Use BULTINS_LOCATION for predefined macros changed upon optimize or target pragmas [PR103012]

The following testcases ICE when an optimize or target pragma
is followed by a long line (4096+ chars).
This is because on such long lines we can't use columns anymore,
but the cpp_define calls performed by c_cpp_builtins_optimize_pragma
or from the backend hooks for target pragma are done on temporary
buffers and expect to get columns from whatever line they appear on
(which happens to be the long line after optimize/target pragma),
and we run into:
 #0  fancy_abort (file=0x3abec67 "../../libcpp/line-map.c", line=502, function=0x3abecfc "linemap_add") at ../../gcc/diagnostic.c:1986
 #1  0x0000000002e7c335 in linemap_add (set=0x7ffff7fca000, reason=LC_RENAME, sysp=0, to_file=0x41287a0 "pr103012.i", to_line=3) at ../../libcpp/line-map.c:502
 #2  0x0000000002e7cc24 in linemap_line_start (set=0x7ffff7fca000, to_line=3, max_column_hint=128) at ../../libcpp/line-map.c:827
 #3  0x0000000002e7ce2b in linemap_position_for_column (set=0x7ffff7fca000, to_column=1) at ../../libcpp/line-map.c:898
 #4  0x0000000002e771f9 in _cpp_lex_direct (pfile=0x40c3b60) at ../../libcpp/lex.c:3592
 #5  0x0000000002e76c3e in _cpp_lex_token (pfile=0x40c3b60) at ../../libcpp/lex.c:3394
 #6  0x0000000002e610ef in lex_macro_node (pfile=0x40c3b60, is_def_or_undef=true) at ../../libcpp/directives.c:601
 #7  0x0000000002e61226 in do_define (pfile=0x40c3b60) at ../../libcpp/directives.c:639
 #8  0x0000000002e610b2 in run_directive (pfile=0x40c3b60, dir_no=0, buf=0x7fffffffd430 "__OPTIMIZE__ 1\n", count=14) at ../../libcpp/directives.c:589
 #9  0x0000000002e650c1 in cpp_define (pfile=0x40c3b60, str=0x2f784d1 "__OPTIMIZE__") at ../../libcpp/directives.c:2513
 #10 0x0000000002e65100 in cpp_define_unused (pfile=0x40c3b60, str=0x2f784d1 "__OPTIMIZE__") at ../../libcpp/directives.c:2522
 #11 0x0000000000f50685 in c_cpp_builtins_optimize_pragma (pfile=0x40c3b60, prev_tree=<optimization_node 0x7fffea042000>, cur_tree=<optimization_node 0x7fffea042020>)
     at ../../gcc/c-family/c-cppbuiltin.c:600
assertion that LC_RENAME doesn't happen first.

I think the right fix is emit those predefined macros upon
optimize/target pragmas with BUILTINS_LOCATION, like we already do
for those macros at the start of the TU, they don't appear in columns
of the next line after it.  Another possibility would be to force them
at the location of the pragma.

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

PR c++/103012
gcc/
* config/i386/i386-c.c (ix86_pragma_target_parse): Perform
cpp_define/cpp_undef calls with forced token locations
BUILTINS_LOCATION.
* config/arm/arm-c.c (arm_pragma_target_parse): Likewise.
* config/aarch64/aarch64-c.c (aarch64_pragma_target_parse): Likewise.
* config/s390/s390-c.c (s390_pragma_target_parse): Likewise.
gcc/c-family/
* c-cppbuiltin.c (c_cpp_builtins_optimize_pragma): Perform
cpp_define_unused/cpp_undef calls with forced token locations
BUILTINS_LOCATION.
gcc/testsuite/
PR c++/103012
* g++.dg/cpp/pr103012.C: New test.
* g++.target/i386/pr103012.C: New test.

2 years agoshrink-wrapping: Fix up prologue block discovery [PR103860]
Jakub Jelinek [Thu, 30 Dec 2021 13:23:18 +0000 (14:23 +0100)]
shrink-wrapping: Fix up prologue block discovery [PR103860]

The following testcase is miscompiled, because a prologue which
contains subq $8, %rsp instruction is emitted at the start of
a basic block which contains conditional jump that depends on
flags register set in an earlier basic block, the prologue instruction
then clobbers those flags.
Normally this case is checked by can_get_prologue predicate, but this
is done only at the start of the loop.  If we update pro later in the
loop (because some bb shouldn't be duplicated) and then don't push
anything further into vec and the vec is already empty (this can happen
when the new pro is already in bb_with bitmask and either has no successors
(that is the case in the testcase where that bb ends with a trap) or
all the successors are already in bb_with, then the loop doesn't iterate
further and can_get_prologue will not be checked.

The following simple patch makes sure we call can_get_prologue even after
the last former iteration when vec is already empty and only break from
the loop afterwards (and only if the updating of pro done because of
!can_get_prologue didn't push anything into vec again).

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

PR rtl-optimization/103860
* shrink-wrap.c (try_shrink_wrapping): Make sure can_get_prologue is
called on pro even if nothing further is pushed into vec.

* gcc.dg/pr103860.c: New test.

2 years agoloop-invariant: Don't move cold bb instructions to preheader in RTL
Xionghu Luo [Thu, 30 Dec 2021 02:02:12 +0000 (20:02 -0600)]
loop-invariant: Don't move cold bb instructions to preheader in RTL

gcc/ChangeLog:

2021-12-30  Xionghu Luo  <luoxhu@linux.ibm.com>

* loop-invariant.c (find_invariants_bb): Check profile count
before motion.
(find_invariants_body): Add argument.

gcc/testsuite/ChangeLog:

2021-12-30  Xionghu Luo  <luoxhu@linux.ibm.com>

* gcc.dg/loop-invariant-2.c: New.

2 years agoDaily bump.
GCC Administrator [Thu, 30 Dec 2021 00:16:43 +0000 (00:16 +0000)]
Daily bump.

2 years agocompiler, libgo: don't pad sparc64-linux epollevent
Ian Lance Taylor [Wed, 29 Dec 2021 23:08:32 +0000 (15:08 -0800)]
compiler, libgo: don't pad sparc64-linux epollevent

Change the compiler to not add zero padding because of zero-sized
fields named "_", since those can't be referenced anyhow.

Change the sparc-linux64 epollevent struct to name the alignment
field "_", to avoid zero padding.

Fixes PR go/103847

PR go/103847
* godump.c (go_force_record_alignment): Name the alignment
field "_".

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/374914

2 years agotree-ssa-dce: Fix up -fcompare-debug failures in make_forwarders_with_degenerate_phis...
Jakub Jelinek [Wed, 29 Dec 2021 20:46:21 +0000 (21:46 +0100)]
tree-ssa-dce: Fix up -fcompare-debug failures in make_forwarders_with_degenerate_phis [PR103742]

make_forwarders_with_degenerate_phis causes a -fcompare-debug failure on the
following testcase.
The problem is that on:
  # iftmp.4_8 = PHI <&D.2582(6), &D.2583(4), &D.2582(7), &D.2583(5)>
the exact DECL_UIDs are different between -g and -g0 (which is ok, with -g
the decls can have larger gaps in between the uids), which means
iterative_hash_expr is different and because there are 2 pairs of edges
with matching phi arguments, the function processes them in different
orders.
The following patch fixes it by using the iterative_hash_expr order
only to determine which arguments are the same, then replaces the hashes
with the minimum dest_idx in the set of matching arguments and qsorts
again (which makes it stable for -fcompare-debug) and only splits edges etc.
on that stable order.
As a small optimization, if no arguments are equal, it doesn't do the
second qsort and continues, and if all arguments of the PHI are
constants or SSA_NAMEs (I think that is a pretty common case for many
PHIs), then it doesn't do the second qsort either, because in that case
the hash values will be stable, only computed from the constant values or
SSA_NAME_VERSIONs.

2021-12-29  Jakub Jelinek  <jakub@redhat.com>

PR debug/103742
* tree-ssa-dce.c (make_forwarders_with_degenerate_phis): If any phi
argument is not CONSTANT_CLASS_P or SSA_NAME and any arguments are
equal, change second from hash value to lowest dest_idx from the
edges which have equal argument and resort to ensure -fcompare-debug
stability.

* g++.dg/opt/pr103742.C: New test.

2 years agoFortran: keep values of IEEE_CLASS_TYPE in sync
Francois-Xavier Coudert [Wed, 29 Dec 2021 20:32:57 +0000 (21:32 +0100)]
Fortran: keep values of IEEE_CLASS_TYPE in sync

Fortran 2018 added some synonyms to the existing values, namely
IEEE_NEGATIVE_SUBNORMAL (which is the same as IEEE_NEGATIVE_DENORMAL)
and IEEE_POSITIVE_SUBNORMAL (same as IEEE_POSITIVE_DENORMAL). When they
were added to the C side, they were not kept in sync with the Fortran
part of the library. Thew new values are not used (yet), so it is
currently harmless, but better fix it.

libgfortran/ChangeLog:

* ieee/ieee_helper.c: Fix enum values.

2 years agoLTO: Prune some warnings in the testsuite
Francois-Xavier Coudert [Mon, 27 Dec 2021 00:13:59 +0000 (01:13 +0100)]
LTO: Prune some warnings in the testsuite

Warnings like:

    warning: using serial compilation of 2 LTRANS jobs
    warning: visibility attribute not supported in this configuration; ignored\[^\n\]*" $text "" text

are pruned by lto.exp, but not for LTO testcases when run in other parts
of the testsuite. They will be, now.

gcc/testsuite/ChangeLog:

PR testsuite/47334
PR testsuite/103823
* lib/prune.exp: Prune some warnings related to LTO and
visibility.

2 years agoFortran: avoid several NULL pointer dereferences during error recovery
Harald Anlauf [Mon, 27 Dec 2021 22:06:18 +0000 (23:06 +0100)]
Fortran: avoid several NULL pointer dereferences during error recovery

gcc/fortran/ChangeLog:

PR fortran/102332
* expr.c (gfc_get_variable_expr): Avoid NULL pointer dereferences
during handling of errors with invalid uses of CLASS variables.
* match.c (select_type_set_tmp): Likewise.
* primary.c (gfc_match_varspec): Likewise.
* resolve.c (resolve_variable): Likewise.
(resolve_select_type): Likewise.

gcc/testsuite/ChangeLog:

PR fortran/102332
* gfortran.dg/pr102332.f90: New test.

2 years agoSupport ld.mold linker.
Martin Liska [Tue, 21 Dec 2021 16:43:55 +0000 (17:43 +0100)]
Support ld.mold linker.

gcc/ChangeLog:

* collect2.c (main): Add ld.mold.
* common.opt: Add -fuse-ld=mold.
* doc/invoke.texi: Document it.
* gcc.c (driver_handle_option): Handle -fuse-ld=mold.
* opts.c (common_handle_option): Likewise.

2 years agoi386: Robustify some expanders w.r.t. paradoxical SUBREGs
Uros Bizjak [Wed, 29 Dec 2021 08:34:32 +0000 (09:34 +0100)]
i386: Robustify some expanders w.r.t. paradoxical SUBREGs

lowpart_subreg might fail in some cases when trying to create paradoxical
SUBREGs.  Use force_reg on input operand, use new temporary output operand
and emit move into the destination afterwards.

Also, replace simplify_gen_subreg (Mx, op, My, 0)
with equivalent lowpart_subreg (Mx, op, My).

2021-12-29  Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog:

* config/i386/sse.md (vec_pack<floatprefix>_float_<mode>):
Perform gen_avx512dq_float<floatunssuffix>v2div2sf2 into a
pseudo and emit move insn into operands[0].
(fix<fixunssuffix>_truncv2sfv2di2): Use lowpart_subreg
instead of simplify_gen_subreg.
(trunc<mode><pmov_dst_3_lower>2): Perform
gen_avx512vl_truncate<mode>v<ssescalarnum>qi2 into a
pseudo and emit move insn into operands[0].
(trunc<mode><pmov_dst_4_lower>2): Perform
gen_avx512vl_truncate<mode>v<ssescalarnum>hi2 into a
pseudo and emit move insn into operands[0].
(truncv2div2si2): Perform gen_avx512vl_truncatev2div2si2 into a
pseudo and emit move insn into operands[0].
(truncv8div8qi2): Perform gen_avx512f_truncatev8div16qi2 into a
pseudo and emit move insn into operands[0].
(<any_extend:insn>v8qiv8hi2): Use lowpart_subreg
instead of simplify_gen_subreg.
(<any_extend:insn>v8qiv8si2): Ditto.
(<any_extend:insn>v4qiv4si2): Ditto.
(<any_extend:insn>v4hiv4si2): Ditto.
(<any_extend:insn>v8qiv8di2): Ditto.
(<any_extend:insn>v4qiv4di2): Ditto.
(<any_extend:insn>v2qiv2di2): Ditto.
(<any_extend:insn>v4hiv4di2): Ditto.
(<any_extend:insn>v2hiv2di2): Ditto.
(<any_extend:insn>v2siv2di2): Ditto.

2 years agoFix ICE in lsplit when built with -O3 -fno-guess-branch-probability [PR103793]
Xionghu Luo [Wed, 29 Dec 2021 01:09:14 +0000 (19:09 -0600)]
Fix ICE in lsplit when built with -O3 -fno-guess-branch-probability [PR103793]

no-guess-branch-probability option requires profile_count scaling with
initialized_p guard, use multiply instead of apply_scale, which will do
the right thing to undefined probabilities and will not cause unnecesary
roundoff errors and precision info loss.
Also merge the missed part of r12-6086 of factor out function to avoid
duplicate code.

Regression testest pass on Power and X86.

gcc/ChangeLog:

PR tree-optimization/103793
* tree-ssa-loop-split.c (fix_loop_bb_probability): New function.
(split_loop): Use multiply to scale loop1's exit probability.
(do_split_loop_on_cond): Call fix_loop_bb_probability.

gcc/testsuite/ChangeLog:

PR tree-optimization/103793
* gcc.dg/pr103793.c: New test.

2 years agoDaily bump.
GCC Administrator [Wed, 29 Dec 2021 00:16:34 +0000 (00:16 +0000)]
Daily bump.

2 years agoLibbacktrace: Fix the use of newline in sed replacement
Francois-Xavier Coudert [Tue, 28 Dec 2021 22:28:49 +0000 (23:28 +0100)]
Libbacktrace: Fix the use of newline in sed replacement

On non-ELF targets, the Makefile needs a newline inside the sed REPLACE
string. The way it is currently done fails with GNU Make < 4, but GCC
only requires "GNU make version 3.80 (or later)".

The portable solution is given in the autoconf manual:
https://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Newlines-in-Make-Rules.html

libbacktrace/ChangeLog:

PR libbacktrace/103822

* Makefile.am: Fix newline.
* Makefile.in: Regenerate.

2 years agoFortran: Emit correct types for CHARACTER(C_CHAR), VALUE arguments
Francois-Xavier Coudert [Sun, 26 Dec 2021 19:18:01 +0000 (20:18 +0100)]
Fortran: Emit correct types for CHARACTER(C_CHAR), VALUE arguments

Make the front-end emit the right type for CHARACTER(C_CHAR), VALUE
arguments to BIND(C) procedures. They are scalar integers of C type
char, and should be emitted as such. They are not strings or arrays,
and are not promoted to C int, either.

gcc/fortran/ChangeLog:

PR fortran/103828
* trans-decl.c (generate_local_decl): Do not call
gfc_conv_scalar_char_value(), but check the type tree.
* trans-expr.c (gfc_conv_scalar_char_value): Rename to
conv_scalar_char_value, do not alter type tree.
(gfc_conv_procedure_call): Adjust call to renamed
conv_scalar_char_value() function.
* trans-types.c (gfc_sym_type): Take care of
CHARACTER(C_CHAR), VALUE arguments.
* trans.h (gfc_conv_scalar_char_value): Remove prototype.

gcc/testsuite/ChangeLog:

PR fortran/103828
* gfortran.dg/c_char_tests_3.f90: New file.
* gfortran.dg/c_char_tests_3_c.c: New file.
* gfortran.dg/c_char_tests_4.f90: New file.
* gfortran.dg/c_char_tests_5.f90: New file.

2 years agoc++: ICE on enum with bool value [PR99968]
Jason Merrill [Tue, 28 Dec 2021 04:46:13 +0000 (23:46 -0500)]
c++: ICE on enum with bool value [PR99968]

BOOLEAN_TYPE also counts as integral, so verify_type should allow it.

PR c++/99968

gcc/ChangeLog:

* tree.c (verify_type): Allow enumerator with BOOLEAN_TYPE.

gcc/testsuite/ChangeLog:

* g++.dg/ext/is_enum2.C: New test.

2 years agofold-const: Fix up fold_truth_andor_1 shift handling [PR103813]
Jakub Jelinek [Tue, 28 Dec 2021 16:41:24 +0000 (17:41 +0100)]
fold-const: Fix up fold_truth_andor_1 shift handling [PR103813]

Some time ago I've changed const_binop -> wide_int_binop, so that it punts
on shifts by negative count.  fold_truth_andor_1 doesn't check the results
of const_binop (?SHIFT_EXPR, ) though and assumes they will be always
non-NULL, which is no longer the case.

2021-12-28  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/103813
* fold-const.c (fold_truth_andor_1): Punt of const_binop LSHIFT_EXPR
or RSHIFT_EXPR returns NULL.  Formatting fix.

* gcc.c-torture/compile/pr103813.c: New test.

2 years agoloop-invariant: Fix -fcompare-debug failure [PR103837]
Jakub Jelinek [Tue, 28 Dec 2021 16:40:17 +0000 (17:40 +0100)]
loop-invariant: Fix -fcompare-debug failure [PR103837]

In the following testcase we have a -fcompare-debug failure, because
can_move_invariant_reg doesn't ignore DEBUG_INSNs in its decisions.
In the testcase we have due to uninitialized variable:
  loop_header
    debug_insn using pseudo84
    pseudo84 = invariant
    insn using pseudo84
  end loop
and with -g decide not to move the pseudo84 = invariant before the
loop header; in this case not resetting the debug insns might be fine.
But, we could have also:
  pseudo84 = whatever
  loop_header
    debug_insn using pseudo84
    pseudo84 = invariant
    insn using pseudo84
  end loop
and in that case not resetting the debug insns would result in wrong-debug.
And, we don't really have generally a good substitution on what pseudo84
contains, it could inherit various values from different paths.
So, the following patch ignores DEBUG_INSNs in the decisions, and if there
are any that previously prevented the optimization, resets them before
return true.

2021-12-28  Jakub Jelinek  <jakub@redhat.com>

PR rtl-optimization/103837
* loop-invariant.c (can_move_invariant_reg): Ignore DEBUG_INSNs in
the decisions whether to return false or continue and right before
returning true reset those debug insns that previously caused
returning false.

* gcc.dg/pr103837.c: New test.

2 years agooptabs: Fix up checking for CALLs in newly added code by double-word divmod [PR103838]
Jakub Jelinek [Tue, 28 Dec 2021 16:39:23 +0000 (17:39 +0100)]
optabs: Fix up checking for CALLs in newly added code by double-word divmod [PR103838]

These two spots are meant to punt if the newly added code contains
any CALL_INSNs, because in that case having a large sequence of insns
that also calls something is undesirable, better have one call that
is optimized in itself well.
The functions do last = get_last_insn (); before emitting any insns
(and expand_binop as the ultimate caller uses delete_insns_since if
the expansion fails), but the checks were incorrect for 2 reasons:
1) it checked not just what follows after that last insn, but also
   the last insn itself; so, if the division or modulo is immediately
   preceded by a CALL_INSN, then we punt; this also causes -fcompare-debug
   failures if the CALL_INSN is with -g followed by one or more DEBUG_INSNs
2) if get_last_insn () is NULL (i.e. emitting into a new sequence), then
   we didn't check anything

2021-12-28  Jakub Jelinek  <jakub@redhat.com>

PR debug/103838
* optabs.c (expand_doubleword_mod, expand_doubleword_divmod): Only
check newly added insns for CALL_P, not the last insn of previous
code.

* gcc.dg/pr103838.c: New test.

2 years agodocs: Use https in manual.
Martin Liska [Tue, 28 Dec 2021 10:11:45 +0000 (11:11 +0100)]
docs: Use https in manual.

gcc/d/ChangeLog:

* gdc.texi: Use one more https.

2 years agodriver: Improve option diagnostics [PR103465]
Martin Liska [Fri, 10 Dec 2021 08:58:52 +0000 (09:58 +0100)]
driver: Improve option diagnostics [PR103465]

It happens that options are parsed and various diagnostics happen
in finish_options. That's a proper place as the function is also called
for optimize/target attributes (pragmas). However, it is possible that
target overwrites an option from command line and so the diagnostics
does not happen. That's fixed in the patch.

- options are parsed and finish_options is called:

  if (opts->x_flag_unwind_tables
      && !targetm_common.unwind_tables_default
      && opts->x_flag_reorder_blocks_and_partition
      && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
    {
      if (opts_set->x_flag_reorder_blocks_and_partition)
        inform (loc,
"%<-freorder-blocks-and-partition%> does not support "
"unwind info on this architecture");
      opts->x_flag_reorder_blocks_and_partition = 0;
      opts->x_flag_reorder_blocks = 1;
    }

It's not triggered because of opts->x_flag_unwind_tables is false by default, but
the option is overwritten in target:

...
  if (TARGET_64BIT_P (opts->x_ix86_isa_flags))
    {
      if (opts->x_optimize >= 1)
SET_OPTION_IF_UNSET (opts, opts_set, flag_omit_frame_pointer,
     !USE_IX86_FRAME_POINTER);
      if (opts->x_flag_asynchronous_unwind_tables
  && TARGET_64BIT_MS_ABI)
SET_OPTION_IF_UNSET (opts, opts_set, flag_unwind_tables, 1);
...

PR driver/103465

gcc/ChangeLog:

* opts.c (finish_options): More part of diagnostics to ...
(diagnose_options): ... here. Call the function from both
finish_options and process_options.
* opts.h (diagnose_options): Declare.
* toplev.c (process_options): Call diagnose_options.

2 years agodocs: replace http:// with https://
Martin Liska [Wed, 22 Dec 2021 12:55:28 +0000 (13:55 +0100)]
docs: replace http:// with https://

I replaced and verified http:// links for various domains.

gcc/ada/ChangeLog:

* doc/share/gnu_free_documentation_license.rst: Replace http:// with https.
* gnat-style.texi: Likewise.
* gnat_rm.texi: Likewise.
* gnat_ugn.texi: Likewise.

gcc/d/ChangeLog:

* gdc.texi: Replace http:// with https.

gcc/ChangeLog:

* doc/contrib.texi: Replace http:// with https.
* doc/contribute.texi: Likewise.
* doc/extend.texi: Likewise.
* doc/gccint.texi: Likewise.
* doc/gnu.texi: Likewise.
* doc/implement-c.texi: Likewise.
* doc/implement-cxx.texi: Likewise.
* doc/include/fdl.texi: Likewise.
* doc/include/gpl_v3.texi: Likewise.
* doc/install.texi: Likewise.
* doc/invoke.texi: Likewise.
* doc/passes.texi: Likewise.
* doc/service.texi: Likewise.
* doc/sourcebuild.texi: Likewise.
* doc/standards.texi: Likewise.

gcc/fortran/ChangeLog:

* gfortran.texi: Replace http:// with https.
* intrinsic.texi: Likewise.

gcc/go/ChangeLog:

* gccgo.texi: Replace http:// with https.

gcc/jit/ChangeLog:

* docs/_build/texinfo/libgccjit.texi: Replace http:// with https.
* docs/cp/index.rst: Likewise.
* docs/cp/intro/index.rst: Likewise.
* docs/cp/intro/tutorial01.rst: Likewise.
* docs/cp/intro/tutorial02.rst: Likewise.
* docs/cp/intro/tutorial03.rst: Likewise.
* docs/cp/intro/tutorial04.rst: Likewise.
* docs/cp/topics/asm.rst: Likewise.
* docs/cp/topics/compilation.rst: Likewise.
* docs/cp/topics/contexts.rst: Likewise.
* docs/cp/topics/expressions.rst: Likewise.
* docs/cp/topics/functions.rst: Likewise.
* docs/cp/topics/index.rst: Likewise.
* docs/cp/topics/locations.rst: Likewise.
* docs/cp/topics/objects.rst: Likewise.
* docs/cp/topics/types.rst: Likewise.
* docs/index.rst: Likewise.
* docs/internals/index.rst: Likewise.
* docs/intro/index.rst: Likewise.
* docs/intro/tutorial01.rst: Likewise.
* docs/intro/tutorial02.rst: Likewise.
* docs/intro/tutorial03.rst: Likewise.
* docs/intro/tutorial04.rst: Likewise.
* docs/intro/tutorial05.rst: Likewise.
* docs/topics/asm.rst: Likewise.
* docs/topics/compatibility.rst: Likewise.
* docs/topics/compilation.rst: Likewise.
* docs/topics/contexts.rst: Likewise.
* docs/topics/expressions.rst: Likewise.
* docs/topics/function-pointers.rst: Likewise.
* docs/topics/functions.rst: Likewise.
* docs/topics/index.rst: Likewise.
* docs/topics/locations.rst: Likewise.
* docs/topics/objects.rst: Likewise.
* docs/topics/performance.rst: Likewise.
* docs/topics/types.rst: Likewise.

2 years agoi386: Fix handling of SUBREGs in divv2sf3 [PR103842]
Jakub Jelinek [Tue, 28 Dec 2021 09:58:43 +0000 (10:58 +0100)]
i386: Fix handling of SUBREGs in divv2sf3 [PR103842]

register_operand predicate allows not just REGs, but also SUBREGs of REGs,
and for the latter lowpart_subreg might FAIL when trying to create paradoxical
SUBREG in some cases.  For the input operand fixed by force_reg on it first,
for the output operand handled by always dividing into a fresh V4SFmode temporary
and emit_move_insn into the destination afterwards, that is also beneficial for
combine.

2021-12-28  Jakub Jelinek  <jakub@redhat.com>

PR target/103842
* config/i386/mmx.md (divv2sf3): Use force_reg on op1.  Always perform
divv4sf3 into a pseudo and emit_move_insn into operands[0].

* g++.dg/opt/pr103842.C: New test.

2 years agoFix tdpbf16ps testcase
Haochen Jiang [Fri, 24 Dec 2021 05:55:06 +0000 (13:55 +0800)]
Fix tdpbf16ps testcase

gcc/testsuite/ChangeLog:

* gcc.target/i386/amx-check.h (check_float_tile_register):
New check function for float to prevent precision loss.
* gcc.target/i386/amxbf16-dpbf16ps-2.c: Correct the type convert
and byte offset. Use the new check function.

2 years agoDaily bump.
GCC Administrator [Tue, 28 Dec 2021 00:16:37 +0000 (00:16 +0000)]
Daily bump.

2 years agoFortran: fix use of static_assert() to conform to C11
Francois-Xavier Coudert [Mon, 27 Dec 2021 20:32:08 +0000 (21:32 +0100)]
Fortran: fix use of static_assert() to conform to C11

libgfortran/ChangeLog:

PR libfortran/98076
* runtime/string.c (gfc_itoa): Use two args for static_assert().

2 years agoImprove atomic store implementation on hppa-linux.
John David Anglin [Mon, 27 Dec 2021 17:56:19 +0000 (17:56 +0000)]
Improve atomic store implementation on hppa-linux.

2021-12-27  John David Anglin  <danglin@gcc.gnu.org>

gcc/ChangeLog:

* config/pa/pa-protos.h: Delete
pa_maybe_emit_compare_and_swap_exchange_loop() declaration.
* config/pa/pa.c (pa_expand_compare_and_swap_loop): Delete.
(pa_maybe_emit_compare_and_swap_exchange_loop): Delete.
* config/pa/pa.md (atomic_storeq): Use __sync_lock_test_and_set
instead of pa_maybe_emit_compare_and_swap_exchange_loop.
(atomic_storehi, atomic_storesi, atomic_storedi): Likewise.

2 years agoc++: Add testcase for SFINAE w/ p[N] and incomplete type [PR101239]
Patrick Palka [Mon, 27 Dec 2021 15:01:42 +0000 (10:01 -0500)]
c++: Add testcase for SFINAE w/ p[N] and incomplete type [PR101239]

The r12-6123 fix for SFINAE with p+N and incomplete type also fixed
the analogous issue with p[N].

PR c++/101239

gcc/testsuite/ChangeLog:

* g++.dg/template/sfinae32a.C: New test.

2 years agoc++: hard error w/ ptr+N and incomplete type [PR103700]
Patrick Palka [Mon, 27 Dec 2021 14:05:17 +0000 (09:05 -0500)]
c++: hard error w/ ptr+N and incomplete type [PR103700]

In pointer_int_sum when called from a SFINAE context, we need to avoid
calling size_in_bytes_loc on an incomplete pointed-to type since this
latter function isn't SFINAE-enabled and always emits an error on such
input.

PR c++/103700

gcc/c-family/ChangeLog:

* c-common.c (pointer_int_sum): When quiet, return
error_mark_node for an incomplete pointed-to type and don't
call size_in_bytes_loc.

gcc/testsuite/ChangeLog:

* g++.dg/template/sfinae32.C: New test.

2 years agoix86: Don't use the 'm' constraint for x86_64_general_operand
H.J. Lu [Sun, 19 Dec 2021 16:47:03 +0000 (08:47 -0800)]
ix86: Don't use the 'm' constraint for x86_64_general_operand

The 'm' constraint is defined with define_memory_constraint which allows
LRA to convert the operand to the form '(mem (reg X))', where X is a
base register.  To prevent LRA from generating '(mem (reg X))' from a
register:

1. Add a 'BM' constraint which is similar to the 'm' constraint, but
is defined with define_constraint.
2. Add a 'm' mode attribute which is mapped to the 'm' constraint for
general_operand and the 'BM' constraint for x86_64_general_operand.
3. Replace the 'm' constraint on <general_operand> with the '<m>'
constraint.
4. Replace the 'm' constraint on x86_64_general_operand with the 'BM'
constraint.

gcc/

PR target/103762
* config/i386/constraints.md (BM): New constraint.
* config/i386/i386.md (m): New mode attribute.
Replace the 'm' constraint on <general_operand> with the '<m>'
constraint.
Replace the 'm' constraint on x86_64_general_operand with the
'BM' constraint.

gcc/testsuite/

* gcc.target/i386/pr103762-1a.c: New test.
* gcc.target/i386/pr103762-1b.c: Likewise.
* gcc.target/i386/pr103762-1c.c: Likewise.

2 years agotestsuite: Avoid unwanted vecorization [PR95046]
Uros Bizjak [Mon, 27 Dec 2021 09:00:28 +0000 (10:00 +0100)]
testsuite: Avoid unwanted vecorization [PR95046]

2021-12-27  Uroš Bizjak  <ubizjak@gmail.com>

gcc/testsuite/ChangeLog:

PR target/95046
* gfortran.dg/extract_recip_1.f: Adjust testcase.

2 years agoRISC-V: fixed testcase riscv/pr103302.c
LiaoShihua [Mon, 27 Dec 2021 04:03:08 +0000 (12:03 +0800)]
RISC-V: fixed testcase riscv/pr103302.c

Because riscv32 not support __int128, so skip if -march=rv32*.

gcc/testsuite/ChangeLog:
* gcc.target/riscv/pr103302.c: skip if -march=rv32*

2 years agoDaily bump.
GCC Administrator [Mon, 27 Dec 2021 00:16:20 +0000 (00:16 +0000)]
Daily bump.

2 years agoi386: Check AX input in any_mul_highpart peepholes
H.J. Lu [Fri, 24 Dec 2021 20:50:21 +0000 (12:50 -0800)]
i386: Check AX input in any_mul_highpart peepholes

When applying peephole optimization to transform

mov imm, %reg0
mov %reg1, %AX_REG
imul %reg0

to

mov imm, %AX_REG
imul %reg1

disable peephole optimization if reg1 == AX_REG.

gcc/

PR target/103785
* config/i386/i386.md: Swap operand order in comments and check
AX input in any_mul_highpart peepholes.

gcc/testsuite/

PR target/103785
* gcc.target/i386/pr103785.c: New test.

2 years agoFortran: speed up decimal output of integers
Francois-Xavier Coudert [Sun, 26 Dec 2021 10:59:14 +0000 (11:59 +0100)]
Fortran: speed up decimal output of integers

libgfortran/ChangeLog:

PR libfortran/98076
* runtime/string.c (itoa64, itoa64_pad19): New helper functions.
(gfc_itoa): On targets with 128-bit integers, call fast
64-bit functions to avoid many slow divisions.

gcc/testsuite/ChangeLog:

PR libfortran/98076
* gfortran.dg/pr98076.f90: New test.

2 years agoDaily bump.
GCC Administrator [Sun, 26 Dec 2021 00:16:17 +0000 (00:16 +0000)]
Daily bump.

2 years agoFortran: simplify library code for integer-to-decimal conversion
Francois-Xavier Coudert [Sat, 25 Dec 2021 14:07:12 +0000 (15:07 +0100)]
Fortran: simplify library code for integer-to-decimal conversion

libgfortran/ChangeLog:

PR libfortran/81986
PR libfortran/99191

* libgfortran.h: Remove gfc_xtoa(), adjust gfc_itoa() and
GFC_ITOA_BUF_SIZE.
* io/write.c (write_decimal): conversion parameter is always
gfc_itoa(), so remove it. Protect from overflow.
(xtoa): Move gfc_xtoa and update its name.
(xtoa_big): Renamed from ztoa_big for consistency.
(write_z): Adjust to new function names.
(write_i, write_integer): Remove last arg of write_decimal.
* runtime/backtrace.c (error_callback): Comment on the use of
gfc_itoa().
* runtime/error.c (gfc_xtoa): Move to io/write.c.
* runtime/string.c (gfc_itoa): Take an unsigned argument,
remove the handling of negative values.

2 years agoDaily bump.
GCC Administrator [Sat, 25 Dec 2021 00:16:18 +0000 (00:16 +0000)]
Daily bump.

2 years agoi386: Add V2SFmode DIV insn pattern [PR95046, PR103797]
Uros Bizjak [Fri, 24 Dec 2021 16:09:36 +0000 (17:09 +0100)]
i386: Add V2SFmode DIV insn pattern [PR95046, PR103797]

Use V4SFmode "DIVPS X,Y" with [y0, y1, 1.0f, 1.0f] as a divisor
to avoid division by zero.

2021-12-24  Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog:

PR target/95046
PR target/103797
* config/i386/mmx.md (divv2sf3): New instruction pattern.

gcc/testsuite/ChangeLog:

PR target/95046
PR target/103797
* gcc.target/i386/pr95046-1.c (test_div): Add.
(dg-options): Add -mno-recip.

2 years agoDarwin: Amend a comment to be more inclusive [NFC].
Iain Sandoe [Fri, 24 Dec 2021 10:59:35 +0000 (10:59 +0000)]
Darwin: Amend a comment to be more inclusive [NFC].

As per title.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
gcc/ChangeLog:

* config/darwin.c (darwin_override_options): Make a comment
more inclusive.

2 years agoDarwin: Update rules for handling alignment of globals.
Iain Sandoe [Mon, 20 Dec 2021 15:19:50 +0000 (15:19 +0000)]
Darwin: Update rules for handling alignment of globals.

The current rule was too strict and has not been required since Darwin11.

This relaxes the constraint to allow up to 2^28 alignment for non-common
entities.  Common is still restricted to a maximum aligment of 2^15.

When the host is an older version of Darwin ( earlier that 11 ) then the
existing constraint is still applied.  Note that this is a host constraint
not a target one (so that a compilation on 10.7 targeting 10.6 is allowed
to use a greater alignment than the tools on 10.6 support).  This matches
the behaviour of clang.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
gcc/ChangeLog:

* config.gcc: Emit L2_MAX_OFILE_ALIGNMENT with suitable
values for the host.
* config/darwin.c (darwin_emit_common): Error for alignment
values > 32768.
* config/darwin.h (MAX_OFILE_ALIGNMENT): Rework to use the
configured L2_MAX_OFILE_ALIGNMENT.

gcc/testsuite/ChangeLog:

* gcc.dg/darwin-aligned-globals.c: New test.
* gcc.dg/darwin-comm-1.c: New test.
* gcc.dg/attr-aligned.c: Amend for new alignment values on
Darwin.
* gcc.target/i386/pr89261.c: Likewise.

2 years agoDarwin: Check for that flag-reorder-and-partition.
Iain Sandoe [Fri, 10 Dec 2021 23:55:49 +0000 (23:55 +0000)]
Darwin: Check for that flag-reorder-and-partition.

We were checking whether the flag had been set by the user, but not if
it was set to true.  Which means that the check fails in its intent when
the user puts -fno-reorder-and-partition.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
gcc/ChangeLog:

* config/darwin.c (darwin_override_options): When checking for the
flag-reorder-and-partition case, also check that it is set on.

2 years agoDarwin: Define OBJECT_FORMAT_MACHO.
Iain Sandoe [Wed, 22 Dec 2021 14:00:25 +0000 (14:00 +0000)]
Darwin: Define OBJECT_FORMAT_MACHO.

There are places that we need to make different codegen depending
on the object format rather than on the arch.  We already have
definitions for ELF, COFF etc. this adds one for MACHO.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
gcc/ChangeLog:

* config/darwin.h (OBJECT_FORMAT_MACHO): New.

2 years agoDaily bump.
GCC Administrator [Fri, 24 Dec 2021 00:16:27 +0000 (00:16 +0000)]
Daily bump.

2 years agosmuldi3_highpart.c: Replace long with long long for -mx32
H.J. Lu [Thu, 23 Dec 2021 18:07:25 +0000 (10:07 -0800)]
smuldi3_highpart.c: Replace long with long long for -mx32

* gcc.target/i386/smuldi3_highpart.c: Replace long with long long.

2 years agox86: PR target/103773: Fix wrong-code with -Oz from pop to memory.
Roger Sayle [Thu, 23 Dec 2021 12:33:07 +0000 (12:33 +0000)]
x86: PR target/103773: Fix wrong-code with -Oz from pop to memory.

This is a fix to PR target/103773 where -Oz shouldn't use push/pop
on x86 to shrink writing small integer constants to memory.
Instead clang uses "andl $0, mem" for writing zero, and "orl $-1, mem"
when writing -1 to memory when using -Oz.  This patch implements this
via peephole2 where we can confirm that its ok to clobber the flags.

2021-12-23  Roger Sayle  <roger@nextmovesoftware.com>
    Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog
PR target/103773
* config/i386/i386.md (*mov<mode>_and): New define_insn for
writing a zero to memory using AND.
(*mov<mode>_or): Extend to allow memory destination and HImode.
(*movdi_internal): Remove -Oz push/pop optimization from here.
(*movsi_internal): Likewise.
(peephole2): Perform -Oz push/pop optimization here, only for
register destinations, values other than zero, and in functions
that don't used the red zone.
(peephole2): With -Oz, convert writes of 0 or -1 to memory into
their clobber forms, i.e. *mov<mode>_and and *mov<mode>_or resp.

gcc/testsuite/ChangeLog
PR target/103773
* gcc.target/i386/pr103773-2.c: New test case.
* gcc.target/i386/pr103773.c: New test case.

2 years agoi386: Enable intrinsics that convert float and bf16 data to each other.
konglin1 [Tue, 7 Dec 2021 09:08:23 +0000 (17:08 +0800)]
i386: Enable intrinsics that convert float and bf16 data to each other.

gcc/ChangeLog:

* config/i386/avx512bf16intrin.h (_mm_cvtsbh_ss): Add new intrinsic.
(_mm512_cvtpbh_ps): Likewise.
(_mm512_maskz_cvtpbh_ps): Likewise.
(_mm512_mask_cvtpbh_ps): Likewise.
* config/i386/avx512bf16vlintrin.h (_mm_cvtness_sbh): Likewise.
(_mm_cvtpbh_ps): Likewise.
(_mm256_cvtpbh_ps): Likewise.
(_mm_maskz_cvtpbh_ps): Likewise.
(_mm256_maskz_cvtpbh_ps): Likewise.
(_mm_mask_cvtpbh_ps): Likewise.
(_mm256_mask_cvtpbh_ps): Likewise.

gcc/testsuite/ChangeLog:

* gcc.target/i386/avx512bf16-cvtsbh2ss-1.c: New test.
* gcc.target/i386/avx512bf16-vcvtpbh2ps-1.c: Ditto.
* gcc.target/i386/avx512bf16vl-cvtness2sbh-1.c: Ditto.
* gcc.target/i386/avx512bf16vl-vcvtpbh2ps-1.c: Ditto.

2 years agoFix typo in type verification.
Feng Xue [Tue, 21 Dec 2021 08:48:16 +0000 (09:48 +0100)]
Fix typo in type verification.

PR ipa/103786

gcc/ChangeLog:

* tree.c (verify_type): Fix typo.

2 years agoCombine vpcmpuw + zero_extend to vpcmpuw.
liuhongt [Wed, 22 Dec 2021 08:48:54 +0000 (16:48 +0800)]
Combine vpcmpuw + zero_extend to vpcmpuw.

vcmp{ps,ph,pd} and vpcmp{,u}{b,w,d,q} implicitly clear the upper bits
of dest.

gcc/ChangeLog:

PR target/103750
* config/i386/sse.md
(*<avx512>_cmp<V48H_AVX512VL:mode>3_zero_extend<SWI248x:mode>):
New pre_reload define_insn_and_split.
(*<avx512>_cmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>):
Ditto.
(*<avx512>_ucmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>):
Ditto.
(*<avx512>_ucmp<VI48_AVX512VL:mode>3_zero_extend<SWI248x:mode>):
Ditto.
(*<avx512>_cmp<V48H_AVX512VL:mode>3_zero_extend<SWI248x:mode>_2):
Ditto.
(*<avx512>_cmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>_2):
Ditto.
(*<avx512>_ucmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>_2):
Ditto.
(*<avx512>_ucmp<VI48_AVX512VL:mode>3_zero_extend<SWI248x:mode>_2):
Ditto.

gcc/testsuite/ChangeLog:

* gcc.target/i386/avx512bw-pr103750-1.c: New test.
* gcc.target/i386/avx512bw-pr103750-2.c: New test.
* gcc.target/i386/avx512f-pr103750-1.c: New test.
* gcc.target/i386/avx512f-pr103750-2.c: New test.
* gcc.target/i386/avx512fp16-pr103750-1.c: New test.
* gcc.target/i386/avx512fp16-pr103750-2.c: New test.

2 years agoDaily bump.
GCC Administrator [Thu, 23 Dec 2021 00:16:29 +0000 (00:16 +0000)]
Daily bump.

2 years agoFortran: BOZ literal constants are not interoperable
Harald Anlauf [Mon, 20 Dec 2021 21:12:33 +0000 (22:12 +0100)]
Fortran: BOZ literal constants are not interoperable

gcc/fortran/ChangeLog:

PR fortran/103778
* check.c (is_c_interoperable): A BOZ literal constant is not
interoperable.

gcc/testsuite/ChangeLog:

PR fortran/103778
* gfortran.dg/illegal_boz_arg_3.f90: New test.

2 years agoFortran: CASE selector expressions must be scalar
Harald Anlauf [Mon, 20 Dec 2021 21:01:05 +0000 (22:01 +0100)]
Fortran: CASE selector expressions must be scalar

gcc/fortran/ChangeLog:

PR fortran/103776
* match.c (match_case_selector): Reject expressions in CASE
selector which are not scalar.

gcc/testsuite/ChangeLog:

PR fortran/103776
* gfortran.dg/select_10.f90: New test.

2 years agoarm: Declare MVE types internally via pragma
Murray Steele [Wed, 22 Dec 2021 14:55:07 +0000 (14:55 +0000)]
arm: Declare MVE types internally via pragma

Move the implementation of MVE ACLE types from arm_mve_types.h to
inside GCC via a new pragma, which replaces the prior type
definitions.  This allows for the types to be used internally for
intrinsic function definitions.

gcc/ChangeLog:

* config.gcc (arm*-*-*): Add arm-mve-builtins.o to extra_objs.
* config/arm/arm-c.c (arm_pragma_arm): Handle "#pragma GCC arm".
(arm_register_target_pragmas): Register it.
* config/arm/arm-protos.h: (arm_mve::arm_handle_mve_types_h): New
prototype.
* config/arm/arm_mve_types.h: Replace MVE type definitions with
new pragma.
* config/arm/t-arm: (arm-mve-builtins.o): New target rule.
* config/arm/arm-mve-builtins.cc: New file.
* config/arm/arm-mve-builtins.def: New file.
* config/arm/arm-mve-builtins.h: New file.

gcc/testsuite/ChangeLog:

* gcc.target/arm/mve/mve.exp: Add new subdirectories.
* gcc.target/arm/mve/general-c/type_redef_1.c: New test.
* gcc.target/arm/mve/general/double_pragmas_1.c: New test.
* gcc.target/arm/mve/general/nomve_1.c: New test.

2 years agoarm: Move arm_simd_info array declaration into header
Murray Steele [Wed, 22 Dec 2021 14:50:00 +0000 (14:50 +0000)]
arm: Move arm_simd_info array declaration into header

Move the arm_simd_type and arm_type_qualifiers enums, and
arm_simd_info struct from arm-builtins.c into arm-builtins.h header.

This is a first step towards internalising the type definitions for
MVE predicate, vector, and tuple types.  By moving arm_simd_types into
a header, we allow future patches to use these type trees externally
to arm-builtins.c, which is a crucial step towards developing an MVE
intrinsics framework similar to the current SVE implementation.

gcc/ChangeLog:

* config/arm/arm-builtins.c (enum arm_type_qualifiers): Move to
arm_builtins.h.
(enum arm_simd_type): Move to arm-builtins.h.
(struct arm_simd_type_info): Move to arm-builtins.h.
* config/arm/arm-builtins.h (enum arm_simd_type): Move from
arm-builtins.c.
(enum arm_type_qualifiers): Move from arm-builtins.c.
(struct arm_simd_type_info): Move from arm-builtins.c.

2 years agoFortran: allow __float128 on targets where long double is not REAL(KIND=10)
Francois-Xavier Coudert [Wed, 22 Dec 2021 11:46:07 +0000 (12:46 +0100)]
Fortran: allow __float128 on targets where long double is not REAL(KIND=10)

The logic for detection of REAL(KIND=16) in kinds-override.h made
assumptions:

    -- if real(kind=10) exists, i.e. if HAVE_GFC_REAL_10 is defined,
       then it is necessarily the "long double" type
    -- if real(kind=16) exists, then:
       * if HAVE_GFC_REAL_10, real(kind=16) is "__float128"
       * otherwise, real(kind=16) is "long double"

This may not always be true. Take the aarch64-apple-darwin port,
it has double == long double == binary64, and __float128 == binary128.

We already have more fine-grained logic in the mk-kinds-h.sh script,
where we actually check the Fortran kind corresponding to C’s long
double. So let's use it, and emit the GFC_REAL_16_IS_FLOAT128 /
GFC_REAL_16_IS_LONG_DOUBLE macros there.

libgfortran/ChangeLog:

* kinds-override.h: Move GFC_REAL_16_IS_* macros...
* mk-kinds-h.sh: ... here.

2 years agodocs: docs: use ';' for function declarations. (part 3)
Martin Liska [Wed, 22 Dec 2021 11:16:47 +0000 (12:16 +0100)]
docs: docs: use ';' for function declarations. (part 3)

gcc/ChangeLog:

* doc/extend.texi: Unify all function declarations in examples
where some miss trailing ';'.

2 years agodocs: docs: use ';' for function declarations. (part 2)
Martin Liska [Wed, 22 Dec 2021 11:06:53 +0000 (12:06 +0100)]
docs: docs: use ';' for function declarations. (part 2)

gcc/ChangeLog:

* doc/extend.texi: Unify all function declarations in examples
where some miss trailing ';'.

2 years agodocs: use ';' for function declarations.
Martin Liska [Wed, 22 Dec 2021 10:59:28 +0000 (11:59 +0100)]
docs: use ';' for function declarations.

gcc/ChangeLog:

* doc/extend.texi: Unify all function declarations in examples
where some miss trailing ';'.

2 years agodocs: Unify instruct set name.
Martin Liska [Wed, 22 Dec 2021 10:20:42 +0000 (11:20 +0100)]
docs: Unify instruct set name.

gcc/ChangeLog:

* doc/extend.texi: Use uppercase letters for SSEx.

2 years agoDaily bump.
GCC Administrator [Wed, 22 Dec 2021 00:16:30 +0000 (00:16 +0000)]
Daily bump.