Commit Graph

212234 Commits

Author SHA1 Message Date
GCC Administrator
8d6498f0d7 Daily bump. 2024-07-20 00:17:53 +00:00
Andrew MacLeod
01c095ab77 Check for SSA_NAME not in the IL yet.
Check for an SSA_NAME not in the CFG before trying to create an
equivalence record in the defintion block.

	PR tree-optimization/116003
	gcc/
	* value-relation.cc (equiv_oracle::register_initial_def): Check
	if SSA_NAME is in the IL before registering.

	gcc/testsuite/
	* gcc.dg/pr116003.c: New.
2024-07-19 17:39:40 -04:00
Thomas Schwinge
a95c1911d8 libgomp: Document 'GOMP_teams4'
For reference:

  - <https://inbox.sourceware.org/20211111190313.GV2710@tucnak> "[PATCH] openmp: Honor OpenMP 5.1 num_teams lower bound"
  - <https://inbox.sourceware.org/20211112132023.GC2710@tucnak> "[PATCH] libgomp, nvptx: Honor OpenMP 5.1 num_teams lower bound"

	libgomp/
	* config/gcn/target.c (GOMP_teams4): Document.
	* config/nvptx/target.c (GOMP_teams4): Likewise.
	* target.c (GOMP_teams4): Likewise.
2024-07-19 21:55:47 +02:00
Thomas Schwinge
f9119948ce GCN: Honor OpenMP 5.1 'num_teams' lower bound
Corresponding to commit 9fa72756d9
"libgomp, nvptx: Honor OpenMP 5.1 num_teams lower bound", these are the
GCN offloading changes to fix:

    PASS: libgomp.c/../libgomp.c-c++-common/teams-2.c (test for excess errors)
    [-FAIL:-]{+PASS:+} libgomp.c/../libgomp.c-c++-common/teams-2.c execution test

    PASS: libgomp.c++/../libgomp.c-c++-common/teams-2.c (test for excess errors)
    [-FAIL:-]{+PASS:+} libgomp.c++/../libgomp.c-c++-common/teams-2.c execution test

..., and omptests' 't-critical' test case.  I've cross checked that those test
cases are the ones that regress for nvptx offloading, if I locally revert the
"libgomp, nvptx: Honor OpenMP 5.1 num_teams lower bound" changes.

	libgomp/
	* config/gcn/libgomp-gcn.h (GOMP_TEAM_NUM): Inject.
	* config/gcn/target.c (GOMP_teams4): Handle.
	* config/gcn/team.c (gomp_gcn_enter_kernel): Initialize.
	* config/gcn/teams.c (omp_get_team_num): Adjust.
2024-07-19 21:55:47 +02:00
Thomas Schwinge
385004846d Rewrite usage comment at the top of 'gcc/passes.def'
Since Subversion r201359 (Git commit a167b052df)
"Introduce gen-pass-instances.awk and pass-instances.def", the usage comment at
the top of 'gcc/passes.def' no longer is accurate (even if that latter file
does continue to use the 'NEXT_PASS' form without 'NUM') -- and, worse, the
'NEXT_PASS' etc. in that usage comment are processed by the
'gcc/gen-pass-instances.awk' script:

    --- source-gcc/gcc/passes.def   2024-06-24 18:55:15.132561641 +0200
    +++ build-gcc/gcc/pass-instances.def    2024-06-24 18:55:27.768562714 +0200
    [...]
    @@ -20,546 +22,578 @@
     /*
      Macros that should be defined when using this file:
        INSERT_PASSES_AFTER (PASS)
        PUSH_INSERT_PASSES_WITHIN (PASS)
        POP_INSERT_PASSES ()
    -   NEXT_PASS (PASS)
    +   NEXT_PASS (PASS, 1)
        TERMINATE_PASS_LIST (PASS)
      */
    [...]

(That is, this is 'NEXT_PASS' for the first instance of pass 'PASS'.)
That's benign so far, but with another thing that I'll be extending, I'd
then run into an error while the script handles this comment block.  ;-\

	gcc/
	* passes.def: Rewrite usage comment at the top.
2024-07-19 21:55:23 +02:00
Richard Sandiford
348d890c28 Treat boolean vector elements as 0/-1 [PR115406]
Previously we built vector boolean constants using 1 for true
elements and 0 for false elements.  This matches the predicates
produced by SVE's PTRUE instruction, but leads to a miscompilation
on AVX, where all bits of a boolean element should be set.

One option for RTL would be to make this target-configurable.
But that isn't really possible at the tree level, where vectors
should work in a more target-independent way.  (There is currently
no way to create a "generic" packed boolean vector, but never say
never :))  And, if we were going to pick a generic behaviour,
it would make sense to use 0/-1 rather than 0/1, for consistency
with integer vectors.

Both behaviours should work with SVE on read, since SVE ignores
the upper bits in each predicate element.  And the choice shouldn't
make much difference for RTL, since all SVE predicate modes are
expressed as vectors of BI, rather than of multi-bit booleans.

I suspect there might be some fallout from this change on SVE.
But I think we should at least give it a go, and see whether any
fallout provides a strong counterargument against the approach.

gcc/
	PR middle-end/115406
	* fold-const.cc (native_encode_vector_part): For vector booleans,
	check whether an element is nonzero and, if so, set all of the
	correspending bits in the target image.
	* simplify-rtx.cc (native_encode_rtx): Likewise.

gcc/testsuite/
	PR middle-end/115406
	* gcc.dg/torture/pr115406.c: New test.
2024-07-19 19:09:37 +01:00
Richard Sandiford
ebdad26ed9 arm: Update fp16-aapcs-[24].c after insn_propagation patch
These tests used to generate:

        bl      swap
        ldr     r2, [sp, #4]
        mov     r0, r2  @ __fp16

but g:9d20529d94b23275885f380d155fe8671ab5353a means that we can
load directly into r0:

        bl      swap
        ldrh    r0, [sp, #4]    @ __fp16

This patch updates the tests to "defend" this change.

While there, the scans include:

mov\tr1, r[03]}

But if the spill of r2 occurs first, there's no real reason why
r2 couldn't be used as the temporary, instead r3.

The patch tries to update the scans while preserving the spirit
of the originals.

gcc/testsuite/
	* gcc.target/arm/fp16-aapcs-2.c: Expect the return value to be
	loaded directly from the stack.  Test that the swap generates
	two moves out of r0/r1 and two moves in.
	* gcc.target/arm/fp16-aapcs-4.c: Likewise.
2024-07-19 19:09:37 +01:00
Patrick Palka
2ee70c9f83 c++: xobj fn call without obj [PR115783]
The code path for rejecting an object-less call to a non-static member
function should also consider xobj member functions (so that we correctly
reject the below calls with a "cannot call member function without object"
diagnostic).

	PR c++/115783

gcc/cp/ChangeLog:

	* call.cc (build_new_method_call): Generalize METHOD_TYPE
	check to DECL_OBJECT_MEMBER_FUNCTION_P.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp23/explicit-obj-diagnostics11.C: New test.

Reviewed-by: Jason Merrill <jason@redhat.com>
2024-07-19 13:48:12 -04:00
Georg-Johann Lay
9116490c1b AVR: Support new built-in function __builtin_avr_mask1.
gcc/
	* config/avr/builtins.def (MASK1): New DEF_BUILTIN.
	* config/avr/avr.cc (avr_rtx_costs_1): Handle rtx costs for
	expressions like __builtin_avr_mask1.
	(avr_init_builtins) <uintQI_ftype_uintQI_uintQI>: New tree type.
	(avr_expand_builtin) [AVR_BUILTIN_MASK1]: Diagnose unexpected forms.
	(avr_fold_builtin) [AVR_BUILTIN_MASK1]: Handle case.
	* config/avr/avr.md (gen_mask1): New expand helper.
	(mask1_0x01_split, mask1_0x80_split, mask1_0xfe_split): New
	insn-and-split.
	(*mask1_0x01, *mask1_0x80, *mask1_0xfe): New insns.
	* doc/extend.texi (AVR Built-in Functions) <__builtin_avr_mask1>:
	Document new built-in function.
gcc/testsuite/
	* gcc.target/avr/torture/builtin-mask1.c: New test.
2024-07-19 18:24:35 +02:00
Paul Thomas
8d6994f33a libgomp: Remove bogus warnings from privatized-ref-2.f90.
2024-07-19  Paul Thomas  <pault@gcc.gnu.org>

libgomp/ChangeLog

	* testsuite/libgomp.oacc-fortran/privatized-ref-2.f90: Cut
	dg-note about 'a' and remove bogus warnings about its array
	descriptor components being used uninitialized.
2024-07-19 16:58:33 +01:00
Harald Anlauf
c93be1606e Fortran: character array constructor with >= 4 constant elements [PR103115]
gcc/fortran/ChangeLog:

	PR fortran/103115
	* trans-array.cc (gfc_trans_array_constructor_value): If the first
	element of an array constructor is deferred-length character and
	therefore does not have an element size known at compile time, do
	not try to collect subsequent constant elements into a constructor
	for optimization.

gcc/testsuite/ChangeLog:

	PR fortran/103115
	* gfortran.dg/string_array_constructor_4.f90: New test.
2024-07-19 17:40:27 +02:00
Peter Bergner
b2f47a5c1d rs6000: Catch unsupported ABI errors when using -mrop-protect [PR114759,PR115988]
2024-07-18  Peter Bergner  <bergner@linux.ibm.com>

gcc/testsuite/
	PR target/114759
	PR target/115988
	* gcc.target/powerpc/pr114759-3.c: Catch unsupported ABI errors.
2024-07-19 10:17:07 -05:00
Patrick Palka
58a9f3ded1 c++: add fixed testcase [PR109464]
Seems to be fixed by r15-521-g6ad7ca1bb90573.

	PR c++/109464

gcc/testsuite/ChangeLog:

	* g++.dg/template/explicit-instantiation8.C: New test.
2024-07-19 11:08:09 -04:00
Cupertino Miranda
8fbc386c12 bpf: create modifier for mem operand for xchg and cmpxchg
Both xchg and cmpxchg instructions, in the pseudo-C dialect, do not
expect their memory address operand to be surrounded by parentheses.
For example, it should be output as "w0 =cmpxchg32_32(r8+8,w0,w2)"
instead of "w0 =cmpxchg32_32((r8+8),w0,w2)".

This patch implements an operand modifier 'M' which marks the
instruction templates that do not expect the parentheses, and adds it do
xchg and cmpxchg templates.

gcc/ChangeLog:
	* config/bpf/atomic.md (atomic_compare_and_swap,
	atomic_exchange): Add operand modifier %M to the first
	operand.
	* config/bpf/bpf.cc (no_parentheses_mem_operand): Create
	variable.
	(bpf_print_operand): Set no_parentheses_mem_operand variable if
	%M operand is used.
	(bpf_print_operand_address): Conditionally output parentheses.

gcc/testsuite/ChangeLog:
	* gcc.target/bpf/pseudoc-atomic-memaddr-op.c: Add test.
2024-07-19 13:19:53 +01:00
Jakub Jelinek
cea6473e48 c++: Add [dcl.init.aggr] examples to testsuite
When working on the #embed optimization support, I went recently through
all of reshape_init_r* and today I read in detail all the P3106R1 changes
and I believe we implement it that way for years.
To double check that, I've added tests with the current [dcl.init.aggr]
examples but tested in all the languages from C++98 to C++26, of course
guarded as needed for constructs which require newer versions of C++.
The examples come in two tests, one is a runtime test for the non-erroneous
examples, the other is a compile time test for the diagnostics.
The former one includes mostly intact examples with runtime checking (both
to test what is written in the section exactly and to test at least
something with C++98) and then when useful also adds constexpr tests with
static_asserts for C++11 and later.

Tested on x86_64-linux and i686-linux with
GXX_TESTSUITE_STDS=98,11,14,17,20,23,26 make check-g++ RUNTESTFLAGS='dg.exp=aggr-init*.C'

Also tested on GCC 11 branch with
GXX_TESTSUITE_STDS=98,11,14,17,20,2b make check-g++ RUNTESTFLAGS='dg.exp=aggr-init*.C'
where just the " is a GCC extension" part of one error is left out,
otherwise it passes the same, ditto with clang 14 (of course with different
diagnostics, but verified it emits diagnostics on the right lines), so I
believe we can claim implementation of this DR paper, either in all versions
or at least in GCC 11+.

2024-07-19  Jakub Jelinek  <jakub@redhat.com>

	PR c++/114460
	* g++.dg/cpp26/aggr-init1.C: New test.
	* g++.dg/cpp26/aggr-init2.C: New test.
2024-07-19 08:53:47 +02:00
Richard Biener
a589d3bfe5 Close GCC 11 branch
Remove gcc-11 branch from updating and snapshot generating

contrib/
	* gcc-changelog/git_update_version.py: Remove gcc-11 branch.

maintainer-scripts/
	* crontab: Remove entry for gcc-11 branch.
2024-07-19 07:59:58 +02:00
Seyed Sajad Kahani
0f8261eae0 c++: Hash placeholder constraint in ctp_hasher
This patch addresses a difference between the hash function and the equality
function for canonical types of template parameters (ctp_hasher). The equality
function uses comptypes (typeck.cc) (with COMPARE_STRUCTURAL) and checks
constraint equality for two auto nodes (typeck.cc:1586), while the hash
function ignores it (pt.cc:4528). This leads to hash collisions that can be
avoided by using `hash_placeholder_constraint` (constraint.cc:1150).

Note that due to the proper handling of hash collisions (hash-table.h:1059),
there is no test case that can distinguish the current implementation from the
proposed one.

	* constraint.cc (hash_placeholder_constraint): Rename to
	iterative_hash_placeholder_constraint.
	(iterative_hash_placeholder_constraint): Rename from
	hash_placeholder_constraint and add the initial val argument.
	* cp-tree.h (hash_placeholder_constraint): Rename to
	iterative_hash_placeholder_constraint.
	(iterative_hash_placeholder_constraint): Renamed from
	hash_placeholder_constraint and add the initial val argument.
	* pt.cc (struct ctp_hasher): Updated to use
	iterative_hash_placeholder_constraint in the case of a valid placeholder
	constraint.
	(auto_hash::hash): Reflect the renaming of hash_placeholder_constraint to
	iterative_hash_placeholder_constraint.
2024-07-18 22:30:08 -04:00
Pan Li
02cc849474 Match: Only allow single use of MIN_EXPR for SAT_TRUNC form 2 [PR115863]
The SAT_TRUNC form 2 has below pattern matching.
From:
  _18 = MIN_EXPR <left_8, 4294967295>;
  iftmp.0_11 = (unsigned int) _18;

To:
  _18 = MIN_EXPR <left_8, 4294967295>;
  iftmp.0_11 = .SAT_TRUNC (left_8);

But if there is another use of _18 like below,  the transform to the
.SAT_TRUNC may have no earnings.  For example:

From:
  _18 = MIN_EXPR <left_8, 4294967295>; // op_0 def
  iftmp.0_11 = (unsigned int) _18;     // op_0
  stream.avail_out = iftmp.0_11;
  left_37 = left_8 - _18;              // op_0 use

To:
  _18 = MIN_EXPR <left_8, 4294967295>; // op_0 def
  iftmp.0_11 = .SAT_TRUNC (left_8);
  stream.avail_out = iftmp.0_11;
  left_37 = left_8 - _18;              // op_0 use

Pattern recog to .SAT_TRUNC cannot eliminate MIN_EXPR as above.  Then the
backend (for example x86/riscv) will have additional 2-3 more insns
after pattern recog besides the MIN_EXPR.  Thus,  keep the normal truncation
as is should be the better choose.

The below testsuites are passed for this patch:
1. The rv64gcv fully regression tests.
2. The x86 bootstrap tests.
3. The x86 fully regression tests.

	PR target/115863

gcc/ChangeLog:

	* match.pd: Add single_use check for .SAT_TRUNC form 2.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/pr115863-1.c: New test.

Signed-off-by: Pan Li <pan2.li@intel.com>
2024-07-19 08:39:21 +08:00
GCC Administrator
e20ea6bcf8 Daily bump. 2024-07-19 00:18:20 +00:00
mayshao
9846b0916c libatomic: Handle AVX+CX16 ZHAOXIN like Intel for 16b atomic [PR104688]
PR target/104688

libatomic/ChangeLog:

	* config/x86/init.c (__libat_feat1_init): Don't clear
	bit_AVX on ZHAOXIN CPUs.
2024-07-18 22:45:07 +02:00
Marek Polacek
9690fb3a43 c++: implement DR1363 and DR1496 for __is_trivial [PR85723]
is_trivial was introduced in
<https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2230.html>
which split POD into is_trivial and is_standard_layout.

Later came CWG 1363.  Since

  struct A {
    A() = default;
    A(int = 42) {}
  };

cannot be default-initialized, it should not be trivial, so the definition
of what is a trivial class changed.

Similarly, CWG 1496 concluded that

  struct B {
    B() = delete;
  }:

should not be trivial either.

P0848 adjusted the definition further to say "eligible".  That means
that

  template<typename T>
  struct C {
    C() requires false = default;
  };

should not be trivial, either, since C::C() is not eligible.

Bug 85723 reports that we implement none of the CWGs.

I chose to fix this by using type_has_non_deleted_trivial_default_ctor
which uses locate_ctor which uses build_new_method_call, which would
be used by default-initialization as well.  With that, all __is_trivial
problems I could find in the Bugzilla are fixed, except for PR96288,
which may need changes to trivially-copyable, so I'm not messing with
that now.

I hope this has no ABI implications.  There's effort undergoing to
remove "trivial class" from the core language as it's not really
meaningful.  So the impact of this change should be pretty low except
to fix a few libstdc++ problems.

	PR c++/108769
	PR c++/58074
	PR c++/115522
	PR c++/85723

gcc/cp/ChangeLog:

	* class.cc (type_has_non_deleted_trivial_default_ctor): Fix formatting.
	* tree.cc (trivial_type_p): Instead of TYPE_HAS_TRIVIAL_DFLT, use
	type_has_non_deleted_trivial_default_ctor.

gcc/testsuite/ChangeLog:

	* g++.dg/warn/Wclass-memaccess.C: Add dg-warning.
	* g++.dg/ext/is_trivial1.C: New test.
	* g++.dg/ext/is_trivial2.C: New test.
	* g++.dg/ext/is_trivial3.C: New test.
	* g++.dg/ext/is_trivial4.C: New test.
	* g++.dg/ext/is_trivial5.C: New test.
	* g++.dg/ext/is_trivial6.C: New test.
2024-07-18 15:06:15 -04:00
Ian Lance Taylor
248e8530dd libbacktrace: use __has_attribute for fallthrough
Also convert some FALLTHROUGH comments to ATTRIBUTE_FALLTHROUGH.

	* internal.h: Use __has_attribute to check for fallthrough
	attribute.
	* elf.c (elf_zstd_decompress): Use ATTRIBUTE_FALLTHROUGH rather
	than a FALLTHROUGH comment.
2024-07-18 11:35:44 -07:00
René Rebe
6962835bca rs6000: Fix .machine cpu selection w/ altivec [PR97367]
There are various non-IBM CPUs with altivec, so we cannot use that
flag to determine which .machine cpu to use, so ignore it.
Emit an additional ".machine altivec" if Altivec is enabled so
that the assembler doesn't require an explicit -maltivec option
to assemble any Altivec instructions for those targets where
the ".machine cpu" is insufficient to enable Altivec.  For example,
-mcpu=G5 emits a ".machine power4".

2024-07-18  René Rebe  <rene@exactcode.de>
	    Peter Bergner  <bergner@linux.ibm.com>

gcc/
	PR target/97367
	* config/rs6000/rs6000.cc (rs6000_machine_from_flags): Do not consider
	OPTION_MASK_ALTIVEC.
	(emit_asm_machine): For Altivec compiles, emit a ".machine altivec".

gcc/testsuite/
	PR target/97367
	* gcc.target/powerpc/pr97367.c: New test.

Signed-off-by: René Rebe <rene@exactcode.de>
2024-07-18 13:13:34 -05:00
Carl Love
c19237614b rs6000, update effective target for tests builtins-10*.c and vec_perm-runnable-i128.c
The tests:

  tests builtins-10-runnable.c
  tests builtins-10.c
  vec_perm-runnable-i128.c

use __int128 types that are not supported on all platforms.  Update the
tests to check int128 effective target to avoid unsupported type errors
on unsupported platforms.

gcc/testsuite/ChangeLog:
	* gcc.target/powerpc/builtins-10-runnable.c: Add
	target int128.
	* gcc.target/powerpc/builtins-10.c: Add
	target int128.
	* gcc.target/powerpc/vec_perm-runnable-i128.c: Add
	target int128.
2024-07-18 13:06:29 -04:00
Uros Bizjak
f7d01e080a libatomic: Improve cpuid usage in __libat_feat1_init
Check the result of __get_cpuid and process FEAT1_REGISTER only when
__get_cpuid returns success.  Use __cpuid instead of nested __get_cpuid.

libatomic/ChangeLog:

	* config/x86/init.c (__libat_feat1_init): Check the result of
	__get_cpuid and process FEAT1_REGISTER only when __get_cpuid
	returns success.  Use __cpuid instead of nested __get_cpuid.
2024-07-18 16:59:09 +02:00
Marek Polacek
1e60a6abfe eh: ICE with std::initializer_list and ASan [PR115865]
Here we ICE with -fsanitize=address on

  std::initializer_list x = { 1, 2, 3 };

since r14-8681, which removed .ASAN_MARK calls on TREE_STATIC variables.
That means that lower_try_finally now instead of

  try
    {
      .ASAN_MARK (UNPOISON, &C.0, 12);
      x = {};
      x._M_len = 3;
      x._M_array = &C.0;
    }
  finally
    {
      .ASAN_MARK (POISON, &C.0, 12);
    }

gets:

  try
    {
      x = {};
      x._M_len = 3;
      x._M_array = &C.0;
    }
  finally
    {

    }

and we ICE on the empty finally in lower_try_finally_onedest while
getting get_eh_else.

	PR c++/115865

gcc/ChangeLog:

	* tree-eh.cc (get_eh_else): Check that the result of
	gimple_seq_first_stmt is non-null.

gcc/testsuite/ChangeLog:

	* g++.dg/asan/initlist2.C: New test.

Co-authored-by: Jakub Jelinek  <jakub@redhat.com>
2024-07-18 10:39:25 -04:00
LIU Hao
5080840d8f Do not use caller-saved registers for COMDAT functions
A reference to a COMDAT function may be resolved to another definition
outside the current translation unit, so it's not eligible for `-fipa-ra`.

In `decl_binds_to_current_def_p()` there is already a check for weak
symbols. This commit checks for COMDAT functions that are not implemented
as weak symbols, for example, on *-*-mingw32.

gcc/ChangeLog:

	PR rtl-optimization/115049
	* varasm.cc (decl_binds_to_current_def_p): Add a check for COMDAT
	declarations too, like weak ones.
2024-07-18 13:14:39 +00:00
Richard Biener
3670c70c56 middle-end/115641 - invalid address construction
fold_truth_andor_1 via make_bit_field_ref builds an address of
a CALL_EXPR which isn't valid GENERIC and later causes an ICE.
The following simply avoids the folding for f ().a != 1 || f ().b != 2
as it is a premature optimization anyway.  The alternative would
have been to build a TARGET_EXPR around the call.  To get this far
f () has to be const as otherwise the two calls are not semantically
equivalent for the optimization.

	PR middle-end/115641
	* fold-const.cc (decode_field_reference): If the inner
	reference isn't something we can take the address of, fail.

	* gcc.dg/torture/pr115641.c: New testcase.
2024-07-18 14:53:31 +02:00
Pan Li
ebac11afbc Doc: Add Standard-Names ustrunc and sstrunc for integer modes
This patch would like to add the doc for the Standard-Names
ustrunc and sstrunc,  include both the scalar and vector integer
modes.

gcc/ChangeLog:

	* doc/md.texi: Add Standard-Names ustrunc and sstrunc.

Signed-off-by: Pan Li <pan2.li@intel.com>
2024-07-18 17:01:17 +08:00
Andre Vehreschild
18f3b223b9 Fortran: Fix Explicit cobounds of a procedures parameter not respected [PR78466]
Explicit cobounds of class array procedure parameters were not taken
into account.  Furthermore were different cobounds in distinct
procedure parameter lists mixed up, i.e. the last definition was taken
for all.  The bounds are now regenerated when tree's and expr's bounds
do not match.

	PR fortran/78466
	PR fortran/80774

gcc/fortran/ChangeLog:

	* array.cc (gfc_compare_array_spec): Take cotype into account.
	* class.cc (gfc_build_class_symbol): Coarrays are also arrays.
	* gfortran.h (IS_CLASS_COARRAY_OR_ARRAY): New macro to detect
	regular and coarray class arrays.
	* interface.cc (compare_components): Take codimension into
	account.
	* resolve.cc (resolve_symbol): Improve error message.
	* simplify.cc (simplify_bound_dim): Remove duplicate.
	* trans-array.cc (gfc_trans_array_cobounds): Coarrays are also
	arrays.
	(gfc_trans_array_bounds): Same.
	(gfc_trans_dummy_array_bias): Same.
	(get_coarray_as): Get the as having a non-zero codim.
	(is_explicit_coarray): Detect explicit coarrays.
	(gfc_conv_expr_descriptor): Create a new descriptor for explicit
	coarrays.
	* trans-decl.cc (gfc_build_qualified_array): Coarrays are also
	arrays.
	(gfc_build_dummy_array_decl): Same.
	(gfc_get_symbol_decl): Same.
	(gfc_trans_deferred_vars): Same.
	* trans-expr.cc (class_scalar_coarray_to_class): Get the
	descriptor from the correct location.
	(gfc_conv_variable): Pick up the descriptor when needed.
	* trans-types.cc (gfc_is_nodesc_array): Coarrays are also
	arrays.
	(gfc_get_nodesc_array_type): Indentation fix only.
	(cobounds_match_decl): Match a tree's bounds to the expr's
	bounds and return true, when they match.
	(gfc_get_derived_type): Create a new type tree/descriptor, when
	the cobounds of the existing declaration and expr to not
	match.  This happends for class arrays in parameter list, when
	there are different cobound declarations.

gcc/testsuite/ChangeLog:

	* gfortran.dg/coarray/poly_run_1.f90: Activate old test code.
	* gfortran.dg/coarray/poly_run_2.f90: Activate test.  It was
	stopping before and passing without an error.
2024-07-18 10:07:23 +02:00
Sam James
e217e7dbdc testsuite: Add dg-do run to more tests
All of these are for wrong-code bugs.  Confirmed to be used before but
with no execution.

2024-07-18  Sam James  <sam@gentoo.org>

	PR c++/53288
	PR c++/57437
	PR c/65345
	PR libstdc++/88101
	PR tree-optimization/96369
	PR tree-optimization/102124
	PR tree-optimization/108692
	* c-c++-common/pr96369.c: Add dg-do run directive.
	* gcc.dg/torture/pr102124.c: Ditto.
	* gcc.dg/pr108692.c: Ditto.
	* gcc.dg/atomic/pr65345-4.c: Ditto.
	* g++.dg/cpp0x/lambda/lambda-return1.C: Ditto.
	* g++.dg/init/lifetime4.C: Ditto.
	* g++.dg/torture/builtin-clear-padding-1.C: Ditto.
	* g++.dg/torture/builtin-clear-padding-2.C: Ditto.
	* g++.dg/torture/builtin-clear-padding-3.C: Ditto.
	* g++.dg/torture/builtin-clear-padding-4.C: Ditto.
	* g++.dg/torture/builtin-clear-padding-5.C: Ditto.
2024-07-18 10:05:52 +02:00
Paul Thomas
c3aa339ea5 Fortran: Suppress bogus used uninitialized warnings [PR108889].
2024-07-18  Paul Thomas  <pault@gcc.gnu.org>

gcc/fortran
	PR fortran/108889
	* gfortran.h: Add bit field 'allocated_in_scope' to gfc_symbol.
	* trans-array.cc (gfc_array_allocate): Set 'allocated_in_scope'
	after allocation if not a component reference.
	(gfc_alloc_allocatable_for_assignment): If 'allocated_in_scope'
	not set, not a component ref and not allocated, set the array
	bounds and offset to give zero length in all dimensions. Then
	set allocated_in_scope.

gcc/testsuite/
	PR fortran/108889
	* gfortran.dg/pr108889.f90: New test.
2024-07-18 08:51:35 +01:00
Rubin Gerritsen
cee56fe0ba gimple-fold: consistent dump of builtin call simplifications
Previously only simplifications of the `__st[xrp]cpy_chk`
were dumped. Now all call replacement simplifications are
dumped.

Examples of statements with corresponding dumpfile entries:

`printf("mystr\n");`:
  optimized: simplified printf to __builtin_puts
`printf("%c", 'a');`:
  optimized: simplified printf to __builtin_putchar
`printf("%s\n", "mystr");`:
  optimized: simplified printf to __builtin_puts

The below test suites passed for this patch
* The x86 bootstrap test.
* Manual testing with some small example code manually
  examining dump logs, outputting the lines mentioned above.

gcc/ChangeLog:

	* gimple-fold.cc (dump_transformation): Moved definition.
	(replace_call_with_call_and_fold): Calls dump_transformation.
	(gimple_fold_builtin_stxcpy_chk): Removes call to
	dump_transformation, now in replace_call_with_call_and_fold.
	(gimple_fold_builtin_stxncpy_chk): Removes call to
	dump_transformation, now in replace_call_with_call_and_fold.

Signed-off-by: Rubin Gerritsen <rubin.gerritsen@gmail.com>
2024-07-18 09:44:29 +02:00
Richard Biener
8c67dc4045 tree-optimization/104515 - store motion and clobbers
The following addresses an old regression when end-of-object/storage
clobbers were introduced.  In particular when there's an end-of-object
clobber in a loop but no corresponding begin-of-object we can still
perform store motion of may-aliased refs when we re-issue the
end-of-object/storage on the exits but elide it from the loop.  This
should be the safest way to deal with this considering stack-slot
sharing and it should not cause missed dead store eliminations given
DSE can now follow multiple paths in case there are multiple exits.

Note when the clobber is re-materialized only on one exit but not
on anther we are erroring on the side of removing the clobber on
such path.  This should be OK (removing clobbers is always OK).

Note there's no corresponding code to handle begin-of-object/storage
during the hoisting part of loads that are part of a store motion
optimization, so this only enables stored-only store motion or cases
without such clobber inside the loop.

	PR tree-optimization/104515
	* tree-ssa-loop-im.cc (execute_sm_exit): Add clobbers_to_prune
	parameter and handle re-materializing of clobbers.
	(sm_seq_valid_bb): end-of-storage/object clobbers are OK inside
	an ordered sequence of stores.
	(sm_seq_push_down): Refuse to push down clobbers.
	(hoist_memory_references): Prune clobbers from the loop body
	we re-materialized on an exit.

	* g++.dg/opt/pr104515.C: New testcase.
2024-07-18 09:43:52 +02:00
Roger Sayle
030186cabe Implement a -ftrapping-math/-fsignaling-nans TODO in match.pd.
I've been investigating some (float)i == CST optimizations for match.pd,
and noticed there's already a TODO comment in match.pd that's relatively
easy to implement.  When CST is a NaN, we only need to worry about
exceptions with flag_trapping_math, and equality/inequality tests for
sNaN only behave differently to qNaN with -fsignaling-nans.  These
issues are related to PR 57371 and PR 106805 in bugzilla.

2024-07-18  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
	* match.pd ((FTYPE) N CMP CST): Only worry about exceptions with
	flag_trapping_math, and about signaling NaNs with HONOR_SNANS.

gcc/testsuite/ChangeLog
	* c-c++-common/pr57371-4.c: Update comment.
	* c-c++-common/pr57371-5.c: Add missing testcases from pr57371-4.c
	and update for -fno-signaling-nans -fno-trapping-math.
2024-07-18 08:30:31 +01:00
Andre Vehreschild
0231b076dc Fortran: Use char* for deferred length character arrays [PR82904]
Randomly during compiling the pass IPA: inline would ICE.  This was
caused by a saved deferred length string.  The length variable was not
set, but the variable was used in the array's declaration.  Now using a
character pointer to prevent this.

	PR fortran/82904

gcc/fortran/ChangeLog:

	* trans-types.cc (gfc_sym_type): Use type `char*` for saved
	deferred length char arrays.
	* trans.cc (get_array_span): Get `.span` also for `char*` typed
	arrays, i.e. for those that have INTEGER_TYPE instead of
	ARRAY_TYPE.

gcc/testsuite/ChangeLog:

	* gfortran.dg/deferred_character_38.f90: New test.
2024-07-18 09:27:46 +02:00
Jakub Jelinek
958ee13874 testsuite: Fix up builtin-clear-padding-3.c for -funsigned-char
As reported on gcc-regression, this test FAILs on aarch64, but my
r15-2090 change didn't change anything on the generated assembly,
just added the forgotten dg-do run directive to the test, so the
test has been failing forever, just we didn't know it.

I can actually reproduce it on x86_64 with -funsigned-char too,
s2.b.a has int type and -1 is stored to it, so we should compare
it against -1 rather than (char) -1; the latter is appropriate for
testing char fields into which we've stored -1.

2024-07-18  Jakub Jelinek  <jakub@redhat.com>

	* c-c++-common/torture/builtin-clear-padding-3.c (main): Compare
	s2.b.a against -1 rather than (char) -1.
2024-07-18 09:22:10 +02:00
Haochen Jiang
4b58697cec i386: Fix testcases generating invalid asm
For compile test, we should generate valid asm except for special purposes.
Fix the compile test that generates invalid asm.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/apx-egprs-names.c: Use ax for short and
	al for char instead of eax.
	* gcc.target/i386/avx512bw-kandnq-1.c: Do not run the test
	under -m32 since kmovq with register is invalid. Use long
	long to use 64 bit register instead of 32 bit register for
	kmovq.
	* gcc.target/i386/avx512bw-kandq-1.c: Ditto.
	* gcc.target/i386/avx512bw-knotq-1.c: Ditto.
	* gcc.target/i386/avx512bw-korq-1.c: Ditto.
	* gcc.target/i386/avx512bw-kshiftlq-1.c: Ditto.
	* gcc.target/i386/avx512bw-kshiftrq-1.c: Ditto.
	* gcc.target/i386/avx512bw-kxnorq-1.c: Ditto.
	* gcc.target/i386/avx512bw-kxorq-1.c: Ditto.
2024-07-18 15:19:05 +08:00
Kyrylo Tkachov
a2cb656c0d [aarch64] Document rewriting of -march=native to -mcpu=native
Commit dd9e5f4db2 changed -march=native to
treat it as -mcpu=native if no other mcpu or mtune option was given.
It would make sense to document this, especially if we try to persuade
compilers like LLVM to take the same approach.
This patch documents that behaviour.

Bootstrapped and tested on aarch64-none-linux-gnu.

Signed-off-by: Kyrylo Tkachov <ktkachov@nvidia.com>

gcc/ChangeLog:

	* doc/invoke.texi (AArch64 Options): Document rewriting of
	-march=native to -mcpu=native.
2024-07-18 12:04:07 +05:30
liuhongt
228972b2b7 Optimize maskstore when mask is 0 or -1 in UNSPEC_MASKMOV
gcc/ChangeLog:

	PR target/115843
	* config/i386/predicates.md (const0_or_m1_operand): New
	predicate.
	* config/i386/sse.md (*<avx512>_store<mode>_mask_1): New
	pre_reload define_insn_and_split.
	(V): Add V32BF,V16BF,V8BF.
	(V4SF_V8BF): Rename to ..
	(V24F_128): .. this.
	(*vec_concat<mode>): Adjust with V24F_128.
	(*vec_concat<mode>_0): Ditto.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/pr115843.c: New test.
2024-07-18 14:06:31 +08:00
Andi Kleen
d062b0abf4 Mark expand musttail error messages for translation
The musttail error messages are reported to the user, so must be
translated.

gcc/ChangeLog:

	PR c/83324
	* calls.cc (initialize_argument_information): Mark messages
	for translation.
	(can_implement_as_sibling_call_p): Dito.
	(expand_call): Dito.
2024-07-17 21:26:47 -07:00
Andi Kleen
8182459636 Give better error messages for musttail
When musttail is set, make tree-tailcall give error messages
when it cannot handle a call. This avoids vague "other reasons"
error messages later at expand time when it sees a musttail
function not marked tail call.

In various cases this requires delaying the error until
the call is discovered.

Also print more information on the failure to the dump file.

gcc/ChangeLog:

	PR c/83324
	* tree-tailcall.cc (maybe_error_musttail): New function.
	(suitable_for_tail_opt_p): Report error reason.
	(suitable_for_tail_call_opt_p): Report error reason.
	(find_tail_calls): Accept basic blocks with abnormal edges.
	Delay reporting of errors until the call is discovered.
	Move top level suitability checks to here.
	(tree_optimize_tail_calls_1): Remove top level checks.
2024-07-17 21:26:16 -07:00
Andi Kleen
b738a63e52 Enable musttail tail conversion even when not optimizing
Enable the tailcall optimization for non optimizing builds,
but in this case only checks calls that have the musttail attribute set.
This makes musttail work without optimization.

This is done with a new late musttail pass that is only active when
not optimizing. The new pass relies on tree-cfg to discover musttails.
This avoids a ~0.8% compiler run time penalty at -O0.

gcc/ChangeLog:

	PR c/83324
	* function.h (struct function): Add has_musttail.
	* lto-streamer-in.cc (input_struct_function_base): Stream
	has_musttail.
	* lto-streamer-out.cc (output_struct_function_base): Dito.
	* passes.def (pass_musttail): Add.
	* tree-cfg.cc (notice_special_calls): Record has_musttail.
	(clear_special_calls): Clear has_musttail.
	* tree-pass.h (make_pass_musttail): Add.
	* tree-tailcall.cc (find_tail_calls): Handle only_musttail
	argument.
	(tree_optimize_tail_calls_1): Pass on only_musttail.
	(execute_tail_calls): Pass only_musttail as false.
	(class pass_musttail): Add.
	(make_pass_musttail): Add.
2024-07-17 21:25:27 -07:00
Andi Kleen
983daf0e5f Fix pro_and_epilogue for sibcalls at -O0 (PR115255)
Some of the cfg fixups in pro_and_epilogue for sibcalls were dependent on "optimize".
Make them check cfun->tail_call_marked instead to handle the -O0 musttail
case. This fixes the musttail test cases on arm targets.

gcc/ChangeLog:

	PR target/115255
	* function.cc (thread_prologue_and_epilogue_insns): Check
	cfun->tail_call_marked for sibcalls too.
	(rest_of_handle_thread_prologue_and_epilogue): Dito.
2024-07-17 21:24:47 -07:00
Andi Kleen
a6502accf3 Improve must tail in RTL backend
- Give error messages for all causes of non sibling call generation
- When giving error messages clear the musttail flag to avoid ICEs
- Error out when tree-tailcall failed to mark a must-tail call
sibcall. In this case it doesn't know the true reason and only gives
a vague message.

gcc/ChangeLog:

	PR c/83324
	* calls.cc (maybe_complain_about_tail_call): Clear must tail
	flag on error.
	(expand_call): Give error messages for all musttail failures.
2024-07-17 21:24:08 -07:00
Nathaniel Shead
b7b2434cc7 c++/modules: Conditionally start timer during lazy load [PR115165]
While lazy loading, instantiation of pendings can sometimes recursively
perform name lookup and begin further lazy loading.  When using the
'-ftime-report' functionality this causes ICEs as we could start an
already-running timer for the importing.

This patch fixes the issue by using the 'timevar_cond*' API instead to
support such recursive calls.

	PR c++/115165

gcc/cp/ChangeLog:

	* module.cc (lazy_load_binding): Use 'timevar_cond*' APIs.
	(lazy_load_pendings): Likewise.

gcc/testsuite/ChangeLog:

	* g++.dg/modules/timevar-1_a.H: New test.
	* g++.dg/modules/timevar-1_b.C: New test.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
2024-07-18 13:07:32 +10:00
Patrick Palka
30dd420a06 c++: prev declared hidden tmpl friend inst [PR112288]
When partially instantiating a previously declared hidden template
friend definition (at class template scope) such as slot_allocated in
the first testcase below, tsubst_friend_function needs to go through
all existing specializations thereof and make them point to the new
definition.

But when the previous declaration was also at class template scope,
old_decl is not the most general template, instead it's the partial
instantiation, and since instantiations are relative to the most general
template, old_decl's DECL_TEMPLATE_INSTANTIATIONS is empty.  So we
to consistently use the most general template here.  And when adjusting
DECL_TI_ARGS to match, only the innermost template arguments should be
preserved; the outer ones should correspond to the new definition.

Otherwise we fail a checking-only sanity check in instantiate_decl in
the first testcase, and in the second/third we end up emitting multiple
definitions of the template friend instantiation, resulting in a link
failure.

	PR c++/112288

gcc/cp/ChangeLog:

	* pt.cc (tsubst_friend_function): When adjusting existing
	specializations after defining a previously declared template
	friend, consider the most general template and correct
	DECL_TI_ARGS adjustment.

gcc/testsuite/ChangeLog:

	* g++.dg/template/friend80.C: New test.
	* g++.dg/template/friend81.C: New test.
	* g++.dg/template/friend81a.C: New test.

Reviewed-by: Jason Merrill <jason@redhat.com>
2024-07-17 21:02:52 -04:00
Ian Lance Taylor
93c54caa64 libbacktrace: add cast to avoid warning
* print.c (print_syminfo_callback): Add cast to avoid warning.
2024-07-17 17:59:41 -07:00
Patrick Palka
144b6099cd c++: missing -Wunused-value for !<expr> [PR114104]
Here we're neglecting to issue a -Wunused-value warning for suitable !
operator expressions, and in turn for != operator expressions that are
rewritten as !(x == y), only because we don't call warn_if_unused_value
on TRUTH_NOT_EXPR since its class is tcc_expression.  This patch makes
us also consider warning for TRUTH_NOT_EXPR and also for ADDR_EXPR.

	PR c++/114104

gcc/cp/ChangeLog:

	* cvt.cc (convert_to_void): Call warn_if_unused_value for
	TRUTH_NOT_EXPR and ADDR_EXPR as well.

gcc/testsuite/ChangeLog:

	* g++.dg/warn/Wunused-20.C: New test.

Reviewed-by: Jason Merrill <jason@redhat.com>
2024-07-17 20:57:54 -04:00
Patrick Palka
313afcfdab c++: diagnose failed qualified lookup into current inst
When the scope of a qualified name is the current instantiation, and
qualified lookup finds nothing at template definition time, then we
know it'll find nothing at instantiation time (unless the current
instantiation has dependent bases).  So such qualified name lookup
failure can be diagnosed ahead of time as per [temp.res.general]/6.

This patch implements that, for qualified names of the form (where
the current instantiation is A<T>):

  this->non_existent
  a.non_existent
  A::non_existent
  typename A::non_existent

It turns out we already optimistically attempt qualified lookup of
seemingly every qualified name, even when it's dependently scoped, and
then suppress issuing a lookup failure diagnostic after the fact.
So implementing this is mostly a matter of restricting the diagnostic
suppression to "dependentish" scopes (i.e. dependent scopes or the
current instantiation with dependent bases), rather than suppressing
for any dependently-typed scope as we currently do.

The cp_parser_conversion_function_id change is needed to avoid regressing
lookup/using8.C:

  using A<T>::operator typename A<T>::Nested*;

When looking up A<T>::Nested we consider it not dependently scoped since
we entered A<T> from cp_parser_conversion_function_id earlier.   But this
A<T> is the implicit instantiation A<T> not the primary template type A<T>,
and so the lookup fails which we now diagnose.  This patch works around
this by not entering the template scope of a qualified conversion
function-id in this case, i.e. if we're in an expression vs declaration
context, by seeing if the type already went through finish_template_type
with entering_scope=true.

gcc/cp/ChangeLog:

	* decl.cc (make_typename_type): Restrict name lookup failure
	punting to dependentish_scope_p instead of dependent_type_p.
	* error.cc (qualified_name_lookup_error): Improve diagnostic
	when the scope is the current instantiation.
	* parser.cc (cp_parser_diagnose_invalid_type_name): Likewise.
	(cp_parser_conversion_function_id): Don't call push_scope on
	a template scope unless we're in a declaration context.
	(cp_parser_lookup_name): Restrict name lookup failure
	punting to dependentish_scope_p instead of depedent_type_p.
	* semantics.cc (finish_id_expression_1): Likewise.
	* typeck.cc (finish_class_member_access_expr): Likewise.

libstdc++-v3/ChangeLog:

	* include/experimental/socket
	(basic_socket_iostream::basic_socket_iostream): Fix typo.
	* include/tr2/dynamic_bitset
	(__dynamic_bitset_base::_M_is_proper_subset_of): Likewise.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/alignas18.C: Expect name lookup error for U::X.
	* g++.dg/cpp0x/forw_enum13.C: Expect name lookup error for
	D3::A and D4<T>::A.
	* g++.dg/parse/access13.C: Declare A::E::V to avoid name lookup
	failure and preserve intent of the test.
	* g++.dg/parse/enum11.C: Expect extra errors, matching the
	non-template case.
	* g++.dg/template/crash123.C: Avoid name lookup failure to
	preserve intent of the test.
	* g++.dg/template/crash124.C: Likewise.
	* g++.dg/template/crash7.C: Adjust expected diagnostics.
	* g++.dg/template/dtor6.C: Declare A::~A() to avoid name lookup
	failure and preserve intent of the test.
	* g++.dg/template/error22.C: Adjust expected diagnostics.
	* g++.dg/template/static30.C: Avoid name lookup failure to
	preserve intent of the test.
	* g++.old-deja/g++.other/decl5.C: Adjust expected diagnostics.
	* g++.dg/template/non-dependent34.C: New test.

Reviewed-by: Jason Merrill <jason@redhat.com>
2024-07-17 20:54:14 -04:00