Commit Graph

194352 Commits

Author SHA1 Message Date
Bob Duff
e124352c0a [Ada] Refine heuristics for unreachable-code warnings
This patch refines the heuristics for when we warn about unreachable
code, to avoid common false alarms.

gcc/ada/

	* sem_ch5.adb (Check_Unreachable_Code): Refine heuristics.
	* sem_util.ads, sem_util.adb (Is_Static_Constant_Name): Remove
	this; instead we have a new function Is_Simple_Case in
	Sem_Ch5.Check_Unreachable_Code.
2022-07-12 12:24:12 +00:00
Bob Duff
6a64ee3903 [Ada] Remove out-of-range warning in unreachable code
This patch removes a warning in examples like this:

    if cond then
       return; -- or other jump
    end if;
    X := ...; -- where the value is out of range

where cond is known at compile time. It could, for example, be a generic
formal parameter that is known to be True in some instances.

As a side effect, this patch adds new warnings about unreachable code.

gcc/ada/

	* gnatls.adb (Output_License_Information): Remove pragma
	No_Return; call sites deal with Exit_Program.
	* libgnat/g-socthi.adb (C_Connect): Suppress warning about
	unreachable code.
	* sem_ch5.adb (Check_Unreachable_Code): Special-case if
	statements with static conditions.  If we remove unreachable
	code (including the return statement) from a function, add
	"raise Program_Error", so we won't warn about missing returns.
	Remove Original_Node in test for N_Raise_Statement; it's not
	needed.  Remove test for CodePeer_Mode; if Operating_Mode =
	Generate_Code, then CodePeer_Mode can't be True.  Misc cleanup.
	Do not reuse Nxt variable for unrelated purpose (the usage in
	the Kill_Dead_Code loop is entirely local to the loop).
	* sem_ch6.adb: Add check for Is_Transfer. Misc cleanup.
	* sem_prag.adb: Minor.
	* sem_res.adb: Minor.
	* sem_util.adb: Minor cleanup.
	(Is_Trivial_Boolean): Move to nonnested place, so it can be
	called from elsewhere.
	(Is_Static_Constant_Boolean): New function.
	* sem_util.ads (Is_Trivial_Boolean): Export.
	(Is_Static_Constant_Boolean): New function.
2022-07-12 12:24:12 +00:00
Eric Botcazou
6882d60a10 [Ada] Add one more leading underscore to couple of exported symbols
For the sake of consistency with other runtime units.

gcc/ada/

	* libgnat/s-stchop.ads: Use a double underscore prefix for symbols.
2022-07-12 12:24:12 +00:00
Ed Schonberg
be4ab2ae01 [Ada] Proper freezing for dispatching expression functions.
In the case of an expression function that is a primitive function of a
tagged type, freezing the tagged type needs to freeze the function (and
its return expression). A bug in this area could result in incorrect
behavior both at compile time and at run time. At compile time, freezing
rule violations could go undetected so that an illegal program could be
incorrectly accepted. At run time, a dispatching call to the primitive
function could end up dispatching through a not-yet-initialized slot in
the dispatch table, typically (although not always) resulting in a
segmentation fault.

gcc/ada/

	* freeze.adb (Check_Expression_Function.Find_Constant): Add a
	check that a type that is referenced as the prefix of an
	attribute is fully declared.
	(Freeze_And_Append): Do not freeze the profile when freezing an
	expression function.
	(Freeze_Entity): When a tagged type is frozen, also freeze any
	primitive operations of the type that are expression functions.
	* sem_ch6.adb (Analyze_Subprogram_Body_Helper): Do not prevent
	freezing associated with an expression function body if the
	function is a dispatching op.
2022-07-12 12:24:12 +00:00
Piotr Trojanek
a8d17a88a5 [Ada] Warn on unset objects in packages with no bodies
Fix an inconsistency, where GNAT was warning about references to unset
objects inside generic packages with no bodies but not inside ordinary
packages with no bodies.

gcc/ada/

	* sem_ch7.adb (Analyze_Package_Declaration): Check references to
	unset objects.

gcc/testsuite/

	* gnat.dg/specs/discr5.ads: Expect new warnings.
	* gnat.dg/specs/empty_variants.ads: Likewise.
	* gnat.dg/specs/pack13.ads: Likewise.
2022-07-12 12:24:12 +00:00
Piotr Trojanek
a54ad45a63 [Ada] Accept aspect Yield on subprogram bodies acting as specs
A small fix for the aspect Yield defined in AI12-0279 for Ada 2022, to
accept aspect given for a subprogram body which acts as its own spec.

For example:

   procedure Switch with Yield => True is
   begin
      ...
   end Switch;

gcc/ada/

	* sem_ch13.adb (Analyze_Aspect_Yield): Look at the entity kind,
	not at the declaration kind.
2022-07-12 12:24:11 +00:00
Joffrey Huguet
a31eda1546 [Ada] Annotate libraries with returning annotation
This patch annotates SPARK-annotated libraries with returning
annotations (Always_Return, Might_Not_Return) to remove the warnings
raised by GNATprove about missing annotations.

gcc/ada/

	* libgnarl/a-reatim.ads, libgnat/a-cfdlli.ads,
	libgnat/a-cfhama.ads, libgnat/a-cfhase.ads,
	libgnat/a-cfinse.ads, libgnat/a-cfinve.ads,
	libgnat/a-cforma.ads, libgnat/a-cforse.ads,
	libgnat/a-chahan.ads, libgnat/a-cofove.ads,
	libgnat/a-cofuma.ads, libgnat/a-cofuse.ads,
	libgnat/a-cofuve.ads, libgnat/a-nbnbin.ads,
	libgnat/a-nbnbre.ads, libgnat/a-ngelfu.ads,
	libgnat/a-nlelfu.ads, libgnat/a-nllefu.ads,
	libgnat/a-nselfu.ads, libgnat/a-nuelfu.ads,
	libgnat/a-strbou.ads, libgnat/a-strfix.ads,
	libgnat/a-strmap.ads, libgnat/a-strunb.ads,
	libgnat/a-strunb__shared.ads,  libgnat/a-strsea.ads,
	libgnat/a-textio.ads, libgnat/a-tideio.ads,
	libgnat/a-tienio.ads, libgnat/a-tifiio.ads,
	libgnat/a-tiflio.ads, libgnat/a-tiinio.ads,
	libgnat/a-timoio.ads, libgnat/i-c.ads, libgnat/interfac.ads,
	libgnat/interfac__2020.ads, libgnat/s-atacco.ads,
	libgnat/s-stoele.ads: Annotate packages and subprograms with
	returning annotations.
2022-07-12 12:24:11 +00:00
Eric Botcazou
01bf0d6cf5 [Ada] Fix buffer overrun for small string concatenation at -O0
The concatenation routines may read too much data on the source side when
the destination buffer is larger than the final result.  This change makes
sure that this does not happen any more and also removes obsolete stuff.

gcc/ada/

	* rtsfind.ads (RE_Id): Remove RE_Str_Concat_Bounds_N values.
	(RE_Unit_Table): Remove RE_Str_Concat_Bounds_N entries.
	* libgnat/s-conca2.ads (Str_Concat_2): Adjust head comment.
	(Str_Concat_Bounds_2): Delete.
	* libgnat/s-conca2.adb (Str_Concat_2): Use the length of the last
	input to size the last assignment.
	(Str_Concat_Bounds_2): Delete.
	* libgnat/s-conca3.ads (Str_Concat_3): Adjust head comment.
	(Str_Concat_Bounds_3): Delete.
	* libgnat/s-conca3.adb (Str_Concat_3): Use the length of the last
	input to size the last assignment.
	(Str_Concat_Bounds_3): Delete.
	* libgnat/s-conca4.ads (Str_Concat_4): Adjust head comment.
	(Str_Concat_Bounds_4): Delete.
	* libgnat/s-conca4.adb (Str_Concat_4): Use the length of the last
	input to size the last assignment.
	(Str_Concat_Bounds_4): Delete.
	* libgnat/s-conca5.ads (Str_Concat_5): Adjust head comment.
	(Str_Concat_Bounds_5): Delete.
	* libgnat/s-conca5.adb (Str_Concat_5): Use the length of the last
	input to size the last assignment.
	(Str_Concat_Bounds_5): Delete.
	* libgnat/s-conca6.ads (Str_Concat_6): Adjust head comment.
	(Str_Concat_Bounds_6): Delete.
	* libgnat/s-conca6.adb (Str_Concat_6): Use the length of the last
	input to size the last assignment.
	(Str_Concat_Bounds_6): Delete.
	* libgnat/s-conca7.ads (Str_Concat_7): Adjust head comment.
	(Str_Concat_Bounds_7): Delete.
	* libgnat/s-conca7.adb (Str_Concat_7): Use the length of the last
	input to size the last assignment.
	(Str_Concat_Bounds_7): Delete.
	* libgnat/s-conca8.ads (Str_Concat_8): Adjust head comment.
	(Str_Concat_Bounds_8): Delete.
	* libgnat/s-conca8.adb (Str_Concat_8): Use the length of the last
	input to size the last assignment.
	(Str_Concat_Bounds_8): Delete.
	* libgnat/s-conca9.ads (Str_Concat_9): Adjust head comment.
	(Str_Concat_Bounds_9): Delete.
	* libgnat/s-conca9.adb (Str_Concat_9): Use the length of the last
	input to size the last assignment.
	(Str_Concat_Bounds_9): Delete.
2022-07-12 12:24:11 +00:00
Bob Duff
7ce2938ccf [Ada] Avoid namespace pollution for Next and Previous
This patch renames Next and Previous in a-convec.ads and other
containers to be _Next and _Previous, to avoid namespace pollution.  The
compiler now uses the leading-underscore names to look them up.

The scanner is changed to allow this.

gcc/ada/

	* exp_ch5.adb (Expand_Iterator_Loop_Over_Array): Use _Next and
	_Previous in the optimized expansion of "for ... of".  No longer
	need to check parameter profiles for these, because the
	leading-underscore names are unique.
	* libgnat/a-convec.ads (_Next, _Previous): Renamings of Next and
	Previous, to avoid namespace pollution.
	* libgnat/a-cbdlli.ads, libgnat/a-cbhama.ads,
	libgnat/a-cbhase.ads, libgnat/a-cbmutr.ads,
	libgnat/a-cborma.ads, libgnat/a-cborse.ads,
	libgnat/a-cdlili.ads, libgnat/a-cidlli.ads,
	libgnat/a-cihama.ads, libgnat/a-cihase.ads,
	libgnat/a-cimutr.ads, libgnat/a-ciorma.ads,
	libgnat/a-ciorse.ads, libgnat/a-cobove.ads,
	libgnat/a-cohama.ads, libgnat/a-cohase.ads,
	libgnat/a-coinve.ads, libgnat/a-comutr.ads,
	libgnat/a-coorma.ads, libgnat/a-coorse.ads: Likewise.  Also,
	remove duplicated comments -- refer to one comment about _Next,
	_Previous, Pseudo_Reference in libgnat/a-convec.ads. DRY.
	* scng.adb (Scan): Allow leading underscores in identifiers in
	the run-time library.
	* snames.ads-tmpl (Name_uNext, Name_uPrevious): New names with
	leading underscores.
2022-07-12 12:24:11 +00:00
Piotr Trojanek
1710ba9e5d [Ada] Warn about unreachable code after calls with No_Return
GNAT was already warning about unreachable code after raise/goto/exit
statements, but not after calls to procedures with No_Return. Now this
warning is extended.

Also, previously the warning was suppressed for unreachable RETURN after
RAISE statements. Now this suppression is narrowed to functions, because
only in function such a RETURN statement might be indeed needed (where
it is the only RETURN statement of a function).

gcc/ada/

	* sem_ch5.adb (Check_Unreachable_Code): Extend suppression to
	calls with No_Return aspect, but narrow it to functions.
	* sem_res.adb (Resolve_Call): Warn about unreachable code after
	calls with No_Return.
2022-07-12 12:24:11 +00:00
Bob Duff
2148f2996a [Ada] Clean up scanner
This patch removes some obsolete code in the scanner and related files,
and corrects some comments. Tok_Special is used only by the
preprocessor, and uses only the two characters '#' and '$'.

It might be simpler to have a single flag indicating we're scanning for
preprocessing, instead of the Special_Characters array and the
End_Of_Line_Is_Token flag, but that's for another day.

gcc/ada/

	* scans.ads: Fix obsolete comments about Tok_Special, and give
	Special_Character a predicate assuring it is one of the two
	characters used in preprocessing.
	* scng.ads: Clean up comments.
	* scng.adb: Clean up handling of Tok_Special.  Remove comment
	about '@' (target_name), which doesn't seem very helpful.
	Set_Special_Character will now blow up if given anything other
	than '#' and '$', because of the predicate on Special_Character;
	it's not clear why it used to say "when others => null;".
	Remove Comment_Is_Token, which is not used.
	* scn.ads: Remove commented-out use clause.  Remove redundant
	comment.
	* ali-util.adb: Use "is null" for do-nothing procedures.
	* gprep.adb (Post_Scan): Use "is null".
2022-07-12 12:24:11 +00:00
Bob Duff
fe6f256d5b [Ada] Ignore exceptions in task termination handlers
This patch fixes a bug in which if the environment task has a specific
termination handler, and that handler raises an exception, the handler
is called recursively, causing infinite recursion. The RM requires such
exceptions to be ignored.

gcc/ada/

	* libgnarl/s-solita.adb (Task_Termination_Handler_T): Ignore all
	exceptions propagated by Specific_Handler.
	* libgnarl/s-tassta.adb, libgnarl/s-taskin.ads: Minor.
2022-07-12 12:24:10 +00:00
Marc Poulhiès
1ef1ac768f [Ada] Fix missing Overflow and Range checks
While doing Preanalysis (as is the case during ghost code handling),
some range and/or overflow checks can be saved (see Saved_Checks in
checks.adb) and later one omitted as they would be redundant (see
Find_Check in checks.adb). In the case of ghost code, the node being
Preanalyzed is a temporary copy that is discarded, so its corresponding
check is not expanded later. The node that gets expanded later is not
having any checks expanded as it is wrongly assumed it has already been
done before.

As is already the case in Preanalyze_And_Resolve, this change suppresses
all checks during Preanalyze except for GNATprove mode.

gcc/ada/

	* sem.adb (Preanalyze): Suppress checks when not in GNATprove
	mode.
	* sem_res.adb (Preanalyze_And_Resolve): Add cross reference in
	comment to above procedure.
	* sinfo.ads: Typo fix in comment.
2022-07-12 12:24:10 +00:00
Julien Bortolussi
829b5a6075 [Ada] Add new unbounded and indefinite formal doubly linked list
Before this patch, the only formal doubly linked lists were bounded and
definite. This means that it is necessary to provide their maximum
length or capacity at instantiation and that they can only be used with
definite element types.

The formal lists added by this patch are unbounded and indefinite.
Their length grows dynamically until Count_Type'Last. This makes them
easier to use but requires the use of dynamic allocation and controlled
types.

gcc/ada/

	* libgnat/a-cfidll.adb, libgnat/a-cfidll.ads: Implementation
	files of the formal unbounded indefinite list.
	* Makefile.rtl, impunit.adb: Take into account the add of the
	new files.
2022-07-12 12:24:10 +00:00
Piotr Trojanek
474946c61a [Ada] Remove excessive guard in detection of access-to-variable objects
It is safe to call Is_Access_Variable without calling
Is_Access_Object_Type before. Compiler cleanup only; semantics is
unaffected.

gcc/ada/

	* sem_util.adb (Is_Variable): Remove excessive guard.
2022-07-12 12:24:10 +00:00
Richard Sandiford
e80daf04c8 aarch64: Remove redundant builtins code
aarch64_builtin_vectorized_function handles some built-in functions
that already have equivalent internal functions.  This seems to be
redundant now, since the target builtins that it chooses are mapped
to the same optab patterns as the internal functions.

gcc/
	* config/aarch64/aarch64-builtins.cc
	(aarch64_builtin_vectorized_function): Remove handling of
	floor, ceil, trunc, round, nearbyint, sqrt, clz and ctz.

gcc/testsuite/
	* gcc.target/aarch64/vect_unary_1.c: New test.
2022-07-12 12:59:25 +01:00
Alexandre Oliva
5493ee7145 i386 testsuite: cope with --enable-default-pie
Running the testsuite on a toolchain build with --enable-default-pie
had some unexpected fails.  Adjust the tests to tolerate the effects
of this configuration option on x86_64-linux-gnu and i686-linux-gnu.

The cet-sjlj* tests get offsets before the base symbol name with PIC
or PIE.  A single pattern covering both alternatives somehow triggered
two matches rather than the single expected match, thus my narrowing
the '.*' to not skip line breaks, but that was not enough.  Still
puzzled, I separated the patterns into nonpic and !nonpic, and we get
the expected matchcounts this way.

Tests for -mfentry require an mfentry effective target, which excludes
32-bit x86 with PIC or PIE enabled, that's why the patterns that
accept the PIC sym@RELOC annotations only cover x86_64.  mvc7 is
getting regexps extended to cover PIC reloc annotatios and all of the
named variants, and tightened to avoid unexpected '.' matches.

The pr24414 test stores in an unadorned named variable in an old-style
asm statement, to check that such asm statements get an implicit
memory clobber.  Rewriting the asm into a GCC extended asm with the
variable as an output would remove the regression it checks against.
Problem is, the literal reference to the variable is not PIC, so it's
rejected by the elf64 linker with an error, and flagged with a warning
by the elf32 one.  We could presumably make the variable references
PIC-friendly with #ifdefs, but I doubt that's worth the trouble.  I'm
just arranging for the test to be skipped if PIC or PIE are enabled by
default.


for  gcc/testsuite/ChangeLog

	* gcc.target/i386/cet-sjlj-6a.c: Cope with --enable-default-pie.
	* gcc.target/i386/cet-sjlj-6b.c: Likewise.
	* gcc.target/i386/fentryname3.c: Likewise.
	* gcc.target/i386/mvc7.c: Likewise.
	* gcc.target/i386/pr24414.c: Likewise.
	* gcc.target/i386/pr93492-3.c: Likewise.
	* gcc.target/i386/pr93492-5.c: Likewise.
	* gcc.target/i386/pr98482-1.c: Likewise.
2022-07-12 08:52:24 -03:00
Tobias Burnus
220bef4601 libgomp: Add tailing \n to gomp_debug
Contrary to gomp_{error,warning,fatal}, no tailing '\n' is added with
gomp_debug; only affected was a 'requires'-related output.

libgomp/ChangeLog:

	* target.c (gomp_target_init): Added tailing '\n' to gomp_debug.
2022-07-12 11:10:50 +02:00
Jonathan Wakely
8be17e2ac7 libstdc++: Prefer const T to std::add_const_t<T>
For any typedef-name or template parameter, T, add_const_t<T> is
equivalent to T const, so we can avoid instantiating the std::add_const
class template and just say T const (or const T).

This isn't true for a non-typedef like int&, where int& const would be
ill-formed, but we shouldn't be using add_const_t<int&> anyway, because
we know what that type is.

The only place we need to continue using std::add_const is in the
std::bind implementation where it's used as a template template
parameter to be applied as a metafunction elsewhere.

libstdc++-v3/ChangeLog:

	* include/bits/stl_iterator.h (__iter_to_alloc_t): Replace
	add_const_t with const-qualifier.
	* include/bits/utility.h (tuple_element<N, cv T>): Likewise for
	all cv-qualifiers.
	* include/std/type_traits (add_const, add_volatile): Replace
	typedef-declaration with using-declaration.
	(add_cv): Replace add_const and add_volatile with cv-qualifiers.
	* include/std/variant (variant_alternative<N, cv T>): Replace
	add_const_t, add_volatile_t and add_cv_t etc. with cv-qualifiers.
2022-07-12 09:13:45 +01:00
Thomas Schwinge
3723aedaad XFAIL 'offloading_enabled' diagnostics issue in 'libgomp.oacc-c-c++-common/reduction-5.c' [PR101551]
Fix-up for recent commit 06b2a2abe2
"Enhance '_Pragma' diagnostics verification in OMP C/C++ test cases".
Supposedly it's the same issue as in
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101551#c2>, where I'd
noted that:

| [...] with an offloading-enabled build of GCC we're losing
| "note: in expansion of macro '[...]'" diagnostics.
| (Effectively '-ftrack-macro-expansion=0'?)

	PR middle-end/101551
	libgomp/
	* testsuite/libgomp.oacc-c-c++-common/reduction-5.c: XFAIL
	'offloading_enabled' diagnostics issue.
2022-07-12 08:28:00 +02:00
GCC Administrator
c72d471469 Daily bump. 2022-07-12 00:16:27 +00:00
Martin Liska
2701442d0c libsanitizer: cherry-pick 9cf13067cb5088626ba7 from upstream
9cf13067cb5088626ba7ee1ec4c42ec59c7995a0 [sanitizer] Remove #include <linux/fs.h> to resolve fsconfig_command/mount_attr conflict with glibc 2.36
2022-07-11 22:04:00 +02:00
Andrew MacLeod
12a9b98ac5 Avoid calling range_from_dom when dominator is already resolved.
range_from_dom makes a recursive call to resolve the immediate dominator
when there are multiple incoming edges to a block.  This is not necessary
when the dominator already has an on-entry cache value.

	PR tree-optimization/106234
	* gimple-range-cache.cc (ranger_cache::range_from_dom): Check dominator
	cache value before recursively resolving it.
2022-07-11 14:41:15 -04:00
Roger Sayle
c3ed9e0d6e Improved Scalar-To-Vector (STV) support for TImode to V1TImode on x86_64.
This patch upgrades x86_64's scalar-to-vector (STV) pass to more
aggressively transform 128-bit scalar TImode operations into vector
V1TImode operations performed on SSE registers.  TImode functionality
already exists in STV, but only for move operations.  This change
brings support for logical operations (AND, IOR, XOR, NOT and ANDN)
and comparisons.

The effect of these changes are conveniently demonstrated by the new
sse4_1-stv-5.c test case:

__int128 a[16];
__int128 b[16];
__int128 c[16];

void foo()
{
  for (unsigned int i=0; i<16; i++)
    a[i] = b[i] & ~c[i];
}

which when currently compiled on mainline wtih -O2 -msse4 produces:

foo:    xorl    %eax, %eax
.L2:    movq    c(%rax), %rsi
        movq    c+8(%rax), %rdi
        addq    $16, %rax
        notq    %rsi
        notq    %rdi
        andq    b-16(%rax), %rsi
        andq    b-8(%rax), %rdi
        movq    %rsi, a-16(%rax)
        movq    %rdi, a-8(%rax)
        cmpq    $256, %rax
        jne     .L2
        ret

but with this patch now produces:

foo:    xorl    %eax, %eax
.L2:    movdqa  c(%rax), %xmm0
        pandn   b(%rax), %xmm0
        addq    $16, %rax
        movaps  %xmm0, a-16(%rax)
        cmpq    $256, %rax
        jne     .L2
        ret

Technically, the STV pass is implemented by three C++ classes, a common
abstract base class "scalar_chain" that contains common functionality,
and two derived classes: general_scalar_chain (which handles SI and
DI modes) and timode_scalar_chain (which handles TI modes).  As
mentioned previously, because only TI mode moves were handled the
two worker classes behaved significantly differently.  These changes
bring the functionality of these two classes closer together, which
is reflected by refactoring more shared code from general_scalar_chain
to the parent scalar_chain and reusing it from timode_scalar_chain.
There still remain significant differences (and simplifications) so
the existing division of classes (as specializations) continues to
make sense.

2022-07-11  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
	* config/i386/i386-features.h (scalar_chain): Add fields
	insns_conv, n_sse_to_integer and n_integer_to_sse to this
	parent class, moved from general_scalar_chain.
	(scalar_chain::convert_compare): Protected method moved
	from general_scalar_chain.
	(mark_dual_mode_def): Make protected, not private virtual.
	(scalar_chain:convert_op): New private virtual method.

	(general_scalar_chain::general_scalar_chain): Simplify constructor.
	(general_scalar_chain::~general_scalar_chain): Delete destructor.
	(general_scalar_chain): Move insns_conv, n_sse_to_integer and
	n_integer_to_sse fields to parent class, scalar_chain.
	(general_scalar_chain::mark_dual_mode_def): Delete prototype.
	(general_scalar_chain::convert_compare): Delete prototype.

	(timode_scalar_chain::compute_convert_gain): Remove simplistic
	implementation, convert to a method prototype.
	(timode_scalar_chain::mark_dual_mode_def): Delete prototype.
	(timode_scalar_chain::convert_op): Prototype new virtual method.

	* config/i386/i386-features.cc (scalar_chain::scalar_chain):
	Allocate insns_conv and initialize n_sse_to_integer and
	n_integer_to_sse fields in constructor.
	(scalar_chain::scalar_chain): Free insns_conv in destructor.

	(general_scalar_chain::general_scalar_chain): Delete
	constructor, now defined in the class declaration.
	(general_scalar_chain::~general_scalar_chain): Delete destructor.

	(scalar_chain::mark_dual_mode_def): Renamed from
	general_scalar_chain::mark_dual_mode_def.
	(timode_scalar_chain::mark_dual_mode_def): Delete.
	(scalar_chain::convert_compare): Renamed from
	general_scalar_chain::convert_compare.

	(timode_scalar_chain::compute_convert_gain): New method to
	determine the gain from converting a TImode chain to V1TImode.
	(timode_scalar_chain::convert_op): New method to convert an
	operand from TImode to V1TImode.

	(timode_scalar_chain::convert_insn) <case REG>: Only PUT_MODE
	on REG_EQUAL notes that were originally TImode (not CONST_INT).
	Handle AND, ANDN, XOR, IOR, NOT and COMPARE.
	(timode_mem_p): Helper predicate to check where operand is
	memory reference with sufficient alignment for TImode STV.
	(timode_scalar_to_vector_candidate_p): Use convertible_comparison_p
	to check whether COMPARE is convertible.  Handle SET_DESTs that
	that are REG_P or MEM_P and SET_SRCs that are REG, CONST_INT,
	CONST_WIDE_INT, MEM, AND, ANDN, IOR, XOR or NOT.

gcc/testsuite/ChangeLog
	* gcc.target/i386/sse4_1-stv-2.c: New test case, pand.
	* gcc.target/i386/sse4_1-stv-3.c: New test case, por.
	* gcc.target/i386/sse4_1-stv-4.c: New test case, pxor.
	* gcc.target/i386/sse4_1-stv-5.c: New test case, pandn.
	* gcc.target/i386/sse4_1-stv-6.c: New test case, ptest.
2022-07-11 16:04:46 +01:00
Richard Sandiford
e7a7fed818 vect: Restore optab_vector argument [PR106250]
In g:76c3041b856cb0 I'd removed a "C ? optab_vector : optab_mixed_sign"
argument from a call to directly_supported_p, thinking that the argument
only existed because of the condition (which I was removing).  But the
difference between the scalar and vector forms matters for shifts,
so we do still need the argument.

gcc/
	PR tree-optimization/106250
	* tree-vect-loop.cc (vectorizable_reduction): Reinstate final
	argument to directly_supported_p.
2022-07-11 15:59:00 +01:00
Lewis Hyatt
cb7b01db7a c-family: Fix option check in handle_pragma_diagnostic [PR106252]
In r13-1544, handle_pragma_diagnostic was refactored to support processing
early pragmas. During that process the part looking up option arguments was
inadvertenly moved too early, prior to checking the option was valid, causing
PR106252. Fixed by moving the check back where it goes.

gcc/c-family/ChangeLog:

	PR preprocessor/106252
	* c-pragma.cc (handle_pragma_diagnostic_impl): Don't look up the
	option argument prior to verifying the option was found.
2022-07-11 08:42:39 -04:00
Richard Biener
f1782a0a8c More update-ssa speedup
When working on a smaller region like a loop version copy the main
time spent is now dominance fast query recompute which does a full
function DFS walk.  The dominance queries within the region of
interest should be O(log n) without fast queries and we should do
on the order of O(n) of them which overall means reasonable
complexity.

For the artificial testcase I'm looking at this shaves off
considerable time again.

	* tree-into-ssa.cc (update_ssa): Do not forcefully
	re-compute dominance fast queries for TODO_update_ssa_no_phi.
2022-07-11 13:47:32 +02:00
Richard Biener
415d2c38ed tree-optimization/106228 - fixup last change
The following fixes the last commit to honor the case we are not
vectorizing a loop.

	PR tree-optimization/106228
	* tree-vect-data-refs.cc (vect_setup_realignment): Adjust
	VUSE compute for the non-loop case.
2022-07-11 12:09:21 +02:00
Richard Biener
74526710f7 More update-ssa speedup
When we do TODO_update_ssa_no_phi we already avoid computing
dominance frontiers for all blocks - it is worth to also avoid
walking all dominated blocks in the update domwalk and restrict
the walk to the SEME region with the affected blocks.  We can
do that by walking the CFG in reverse from blocks_to_update to
the common immediate dominator, marking blocks in the region
and telling the domwalk to STOP when leaving it.

For an artificial testcase with N adjacent loops with one
unswitching opportunity that takes the incremental SSA updating
off the -ftime-report radar:

 tree loop unswitching              :  11.25 (  3%)   0.09 (  5%)  11.53 (  3%)    36M (  9%)
 `- tree SSA incremental            :  35.74 (  9%)   0.07 (  4%)  36.65 (  9%)  2734k (  1%)

improves to

 tree loop unswitching              :  10.21 (  3%)   0.05 (  3%)  11.50 (  3%)    36M (  9%)
 `- tree SSA incremental            :   0.66 (  0%)   0.02 (  1%)   0.49 (  0%)  2734k (  1%)

for less localized updates the SEME region isn't likely constrained
enough so I've restricted the extra work to TODO_update_ssa_no_phi
callers.

	* tree-into-ssa.cc (rewrite_mode::REWRITE_UPDATE_REGION): New.
	(rewrite_update_dom_walker::rewrite_update_dom_walker): Update.
	(rewrite_update_dom_walker::m_in_region_flag): New.
	(rewrite_update_dom_walker::before_dom_children): If the region
	to update is marked, STOP at exits.
	(rewrite_blocks): For REWRITE_UPDATE_REGION mark the region
	to be updated.
	(dump_update_ssa): Use bitmap_empty_p.
	(update_ssa): Likewise.  Use REWRITE_UPDATE_REGION when
	TODO_update_ssa_no_phi.
	* tree-cfgcleanup.cc (cleanup_tree_cfg_noloop): Account
	pending update_ssa to the caller.
2022-07-11 12:05:27 +02:00
Thomas Schwinge
06b2a2abe2 Enhance '_Pragma' diagnostics verification in OMP C/C++ test cases
Follow-up to recent commit 0587cef3d7
"c: Fix location for _Pragma tokens [PR97498]".

	gcc/testsuite/
	* c-c++-common/gomp/pragma-3.c: Enhance '_Pragma' diagnostics
	verification.
	* c-c++-common/gomp/pragma-5.c: Likewise.
	libgomp/
	* testsuite/libgomp.oacc-c-c++-common/reduction-5.c: Enhance
	'_Pragma' diagnostics verification.
2022-07-11 11:23:33 +02:00
Richard Biener
4c94382a13 target/105459 - allow delayed target option node fixup
The following avoids the need to massage the target optimization
node at WPA time when we fixup the optimization node, copying
FP related flags from callee to caller.  The target is already
set up to fixup, but that only works when not switching between
functions.  After fixing that the fixup is then done at LTRANS
time when materializing the function.

2022-07-01  Richard Biener  <rguenthert@suse.de>

	PR target/105459
	* config/i386/i386-options.cc (ix86_set_current_function):
	Rebuild the target optimization node whenever necessary,
	not only when the optimization node didn't change.

	* gcc.dg/lto/pr105459_0.c: New testcase.
2022-07-11 11:21:53 +02:00
Richard Biener
79f18ac6b7 tree-optimization/106228 - fix vect_setup_realignment virtual SSA handling
The following adds missing assignment of a virtual use operand to a
created load to vect_setup_realignment which shows as bootstrap
failure on powerpc64-linux and extra testsuite fails for targets
when misaligned loads are not supported or not optimal.

	PR tree-optimization/106228
	* tree-vect-data-refs.cc (vect_setup_realignment): Properly
	set a VUSE operand on the emitted load.
2022-07-11 09:29:49 +02:00
Aldy Hernandez
0a7e721a64 Implement global ranges for all vrange types (SSA_NAME_RANGE_INFO).
Currently SSA_NAME_RANGE_INFO only handles integer ranges, and loses
half the precision in the process because its use of legacy
value_range's.  This patch rewrites all the SSA_NAME_RANGE_INFO
(nonzero bits included) to use the recently contributed
vrange_storage.  With it, we'll be able to efficiently save any ranges
supported by ranger in GC memory.  Presently this will only be
irange's, but shortly we'll add floating ranges and others to the mix.

As per the discussion with the trailing_wide_ints adjustments and
vrange_storage, we'll be able to save integer ranges with a maximum of
5 sub-ranges.  This could be adjusted later if more sub-ranges are
needed (unlikely).

Since this is a behavior changing patch, I would like to take a few
days for discussion, and commit early next week if all goes well.

A few notes.

First, we get rid of the SSA_NAME_ANTI_RANGE_P bit in the SSA_NAME
since we store full resolution ranges.  Perhaps it could be re-used
for something else.

The range_info_def struct is gone in favor of an opaque type handled
by vrange_storage.  It currently supports irange, but will support
frange, prange, etc, in due time.

From the looks of it, set_range_info was an update operation despite
its name, as we improved the nonzero bits with each call, even though
we clobbered the ranges.  Presumably this was because doing a proper
intersect of ranges lost information with the anti-range hack.  We no
longer have this limitation so now we formalize both set_range_info
and set_nonzero_bits to an update operation.  After all, we should
never be losing information, but enhancing it whenever possible.  This
means, that if folks' finger-memory is not offended, as a follow-up,
I'd like to rename set_nonzero_bits and set_range_info to update_*.

I have kept the same global API we had in tree-ssanames.h, with the
caveat that all set operations are now update as discussed above.

There is a 2% performance penalty for evrp and a 3% penalty for VRP
that is coincidentally in line with a previous improvement of the same
amount in the vrange abstraction patchset.  Interestingly, this
penalty is mostly due to the wide int to tree dance we keep doing with
irange and legacy.  In a first draft of this patch where I was
streaming trees directly, there was actually a small improvement
instead.  I hope to get some of the gain back when we move irange's to
wide-ints, though I'm not in a hurry ;-).

Tested and benchmarked on x86-64 Linux.  Tested on ppc64le Linux.

Comments welcome.

gcc/ChangeLog:

	* gimple-range.cc (gimple_ranger::export_global_ranges): Remove
	verification against legacy value_range.
	(gimple_ranger::register_inferred_ranges): Same.
	(gimple_ranger::export_global_ranges): Rename update_global_range
	to set_range_info.
	* tree-core.h (struct range_info_def): Remove.
	(struct irange_storage_slot): New.
	(struct tree_base): Remove SSA_NAME_ANTI_RANGE_P documentation.
	(struct tree_ssa_name): Add vrange_storage support.
	* tree-ssanames.cc (range_info_p): New.
	(range_info_fits_p): New.
	(range_info_alloc): New.
	(range_info_free): New.
	(range_info_get_range): New.
	(range_info_set_range): New.
	(set_range_info_raw): Remove.
	(set_range_info): Adjust to use vrange_storage.
	(set_nonzero_bits): Same.
	(get_nonzero_bits): Same.
	(duplicate_ssa_name_range_info): Remove overload taking
	value_range_kind.
	Rewrite tree overload to use vrange_storage.
	(duplicate_ssa_name_fn): Adjust to use vrange_storage.
	* tree-ssanames.h (struct range_info_def): Remove.
	(set_range_info): Adjust prototype to take vrange.
	* tree-vrp.cc (vrp_asserts::remove_range_assertions): Call
	duplicate_ssa_name_range_info.
	* tree.h (SSA_NAME_ANTI_RANGE_P): Remove.
	(SSA_NAME_RANGE_TYPE): Remove.
	* value-query.cc (get_ssa_name_range_info): Adjust to use
	vrange_storage.
	(update_global_range): Remove.
	(get_range_global): Remove as_a<irange>.
	* value-query.h (update_global_range): Remove.
	* tree-ssa-dom.cc (set_global_ranges_from_unreachable_edges):
	Rename update_global_range to set_range_info.
	* value-range-storage.cc (vrange_storage::alloc_slot): Remove
	gcc_unreachable.
2022-07-11 08:30:40 +02:00
GCC Administrator
b53ebbc541 Daily bump. 2022-07-11 00:16:25 +00:00
Lewis Hyatt
0587cef3d7 c: Fix location for _Pragma tokens [PR97498]
The handling of #pragma GCC diagnostic uses input_location, which is not always
as precise as needed; in particular the relative location of some tokens and a
_Pragma directive will crucially determine whether a given diagnostic is enabled
or suppressed in the desired way. PR97498 shows how the C frontend ends up with
input_location pointing to the beginning of the line containing a _Pragma()
directive, resulting in the wrong behavior if the diagnostic to be modified
pertains to some tokens found earlier on the same line. This patch fixes that by
addressing two issues:

    a) libcpp was not assigning a valid location to the CPP_PRAGMA token
    generated by the _Pragma directive.
    b) C frontend was not setting input_location to something reasonable.

With this change, the C frontend is able to change input_location to point to
the _Pragma token as needed.

This is just a two-line fix (one for each of a) and b)), the testsuite changes
were needed only because the location on the tested warnings has been somewhat
improved, so the tests need to look for the new locations.

gcc/c/ChangeLog:

	PR preprocessor/97498
	* c-parser.cc (c_parser_pragma): Set input_location to the
	location of the pragma, rather than the start of the line.

libcpp/ChangeLog:

	PR preprocessor/97498
	* directives.cc (destringize_and_run): Override the location of
	the CPP_PRAGMA token from a _Pragma directive to the location of
	the expansion point, as is done for the tokens lexed from it.

gcc/testsuite/ChangeLog:

	PR preprocessor/97498
	* c-c++-common/pr97498.c: New test.
	* c-c++-common/gomp/pragma-3.c: Adapt for improved warning locations.
	* c-c++-common/gomp/pragma-5.c: Likewise.
	* gcc.dg/pragma-message.c: Likewise.

libgomp/ChangeLog:

	* testsuite/libgomp.oacc-c-c++-common/reduction-5.c: Adapt for
	improved warning locations.
	* testsuite/libgomp.oacc-c-c++-common/vred2d-128.c: Likewise.
2022-07-10 16:50:03 -04:00
Dimitar Dimitrov
4ebbf39068 testsuite: Require int128 for gcc.dg/pr106063.c
Require effective target int128 for gcc.dg/pr106063.c.

	PR tree-optimization/106063

gcc/testsuite/ChangeLog:

	* gcc.dg/pr106063.c: Require effective target int128.

Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>
2022-07-10 11:38:46 +03:00
Aldy Hernandez
c106825b93 Cleanups to irange::nonzero bit code.
In discussions with Andrew we realized varying_p() was returning true
for a range of the entire domain with a non-empty nonzero mask.  This
is confusing as varying_p() should only return true when absolutely no
information is available.  A nonzero mask that has any cleared bits is
extra information and must return false for varying_p().  This patch
fixes this oversight.  Now a range of the entire domain with nonzero
bits, is internally set to VR_RANGE (with the appropriate end points
set).  VR_VARYING ranges must have a null nonzero mask.

Also, the union and intersect code were not quite right in the presence of
nonzero masks.  Sometimes we would drop masks to -1 unnecessarily.  I
was trying to be too smart in avoiding extra work when the mask was
NULL, but there's also an implicit mask in the range that must be
taken into account.  For example, [0,0] may have no nonzero bits set
explicitly, but the mask is really 0x0.  This will all be simpler when
we drop trees, because the nonzero bits will always be set, even if
-1.

Finally, I've added unit tests to the nonzero mask code.  This should
help us maintain sanity going forward.

There should be no visible changes, as the main consumer of this code
is the SSA_NAME_RANGE_INFO patchset which has yet to be committed.

Tested on x86-64 Linux.

gcc/ChangeLog:

	* value-range.cc (irange::operator=): Call verify_range.
	(irange::irange_set): Normalize kind after everything else has
	been set.
	(irange::irange_set_anti_range): Same.
	(irange::set): Same.
	(irange::verify_range): Disallow nonzero masks for VARYING.
	(irange::irange_union): Call verify_range.
	Handle nonzero masks better.
	(irange::irange_intersect): Same.
	(irange::set_nonzero_bits): Calculate mask if either range has an
	explicit mask.
	(irange::intersect_nonzero_bits): Same.
	(irange::union_nonzero_bits): Same.
	(range_tests_nonzero_bits): New.
	(range_tests): Call range_tests_nonzero_bits.
	* value-range.h (class irange): Remove set_nonzero_bits method
	with trees.
	(irange::varying_compatible_p): Set nonzero mask.
2022-07-10 09:51:48 +02:00
Xi Ruoyao
a8cfc36b99
loongarch: avoid unnecessary sign-extend after 32-bit division
Like add.w/sub.w/mul.w, div.w/mod.w/div.wu/mod.wu also sign-extend the
output on LA64.  But, LoongArch v1.00 mandates that the inputs of 32-bit
division to be sign-extended so we have to expand 32-bit division into
RTL sequences.

We defined div.w/mod.w/div.wu/mod.wu as a (DI, DI) -> SI instruction.
This definition does not indicate the fact that these instructions will
store the result as sign-extended value in a 64-bit GR.  Then the
compiler would emit unnecessary sign-extend operations.  For example:

    int div(int a, int b) { return a / b; }

was compiled to:

    div.w  $r4, $r4, $r5
    slli.w $r4, $r4, 0    # this is unnecessary
    jr     $r1

To remove this unnecessary operation, we change the division
instructions to (DI, DI) -> DI and describe the sign-extend behavior
explicitly in the RTL template.  In the expander for 32-bit division we
then use simplify_gen_subreg to extract the lower 32 bits.

gcc/ChangeLog:

	* config/loongarch/loongarch.md (<any_div>di3_fake): Describe
	the sign-extend of result in the RTL template.
	(<any_div><mode>3): Adjust for <any_div>di3_fake change.

gcc/testsuite/ChangeLog:

	* gcc.target/loongarch/div-4.c: New test.
2022-07-10 11:36:22 +08:00
Xi Ruoyao
a5d3826f76
loongarch: add alternatives for idiv insns to improve code generation
Currently in the description of LoongArch integer division instructions,
the output is marked as earlyclobbered ('&').  It's necessary when
loongarch_check_zero_div_p() because clobbering operand 2 (divisor) will
make the checking for zero divisor impossible.

But, for -mno-check-zero-division (the default of GCC >= 12.2 for
optimized code), the output is not earlyclobbered at all.  And, the
read of operand 1 only occurs before clobbering the output.  So we make
three alternatives for an idiv instruction:

* (=r,r,r): For -mno-check-zero-division.
* (=&r,r,r): For -mcheck-zero-division.
* (=&r,0,r): For -mcheck-zero-division, to explicitly allow patterns
  like "div.d $a0, $a0, $a1".

gcc/ChangeLog:

	* config/loongarch/loongarch.cc (loongarch_check_zero_div_p):
	Remove static, for use in the machine description file.
	* config/loongarch/loongarch-protos.h:
	(loongarch_check_zero_div_p): Add prototype.
	* config/loongarch/loongarch.md (enabled): New attr.
	(*<optab><mode>3): Add (=r,r,r) and (=&r,0,r) alternatives for
	idiv.  Conditionally enable the alternatives using
	loongarch_check_zero_div_p.
	(<optab>di3_fake): Likewise.

gcc/testsuite/ChangeLog:

	* gcc.target/loongarch/div-1.c: New test.
	* gcc.target/loongarch/div-2.c: New test.
	* gcc.target/loongarch/div-3.c: New test.
2022-07-10 11:36:11 +08:00
Xi Ruoyao
1fa42d6214
loongarch: fix mulsidi3_64bit instruction
(mult (sign_extend:DI rj:SI) (sign_extend:DI rk:SI)) should be
"mulw.d.w", not "mul.d".

gcc/ChangeLog:

	* config/loongarch/loongarch.md (mulsidi3_64bit): Use mulw.d.w
	instead of mul.d.

gcc/testsuite/ChangeLog:

	* gcc.target/loongarch/mulw_d_w.c: New test.
	* gcc.c-torture/execute/mul-sext.c: New test.
2022-07-10 11:28:08 +08:00
GCC Administrator
aa2eb25c94 Daily bump. 2022-07-10 00:16:23 +00:00
Aldy Hernandez
030a53c613 Set VR_VARYING in irange::irange_single_pair_union.
The fast union operation is sometimes setting a range of the entire
domain, but leaving the kind bit as VR_RANGE instead of downgrading it
to VR_VARYING.

Tested on x86-64 Linux.

gcc/ChangeLog:

	* value-range.cc (irange::irange_single_pair_union): Set
	VR_VARYING when appropriate.
2022-07-09 21:08:10 +02:00
Vit Kabele
7a16d39903 [PATCH v3] c: Extend the -Wpadded message with actual padding size
gcc/ChangeLog:

	* stor-layout.cc (finalize_record_size): Extend warning message.

gcc/testsuite/ChangeLog:

	* c-c++-common/Wpadded.c: New test.
2022-07-09 13:06:43 -04:00
Sam Feifer
d9fa599dc7 [PATCH] match.pd: Add new bitwise arithmetic pattern [PR98304]
PR tree-optimization/98304

gcc:

	* match.pd (n - (((n > C1) ? n : C1) & -C2)): New simplification.

gcc/testsuite:

	* gcc.c-torture/execute/pr98304-2.c: New test.
	* gcc.dg/pr98304-1.c: New test.
2022-07-09 12:08:01 -04:00
Jeff Law
46dc26fdfb [RFA] Improve initialization of objects when the initializer has trailing zeros.
gcc/

	* expr.cc (store_expr): Identify trailing NULs in a STRING_CST
	initializer and use clear_storage rather than copying the
	NULs to the destination array.
2022-07-09 11:11:00 -04:00
François Dumont
8f1802003d libstdc++: Remove obsolete comment in <string> header
The comment is obsolete because char_traits.h do not include stl_algobase.h
anymore and stl_algobase.h is included directly from <string> a few lines
below.

libstdc++-v3/ChangeLog:

	* include/std/string: Remove obsolete comment about char_traits.h including
	stl_algobase.h.
2022-07-09 14:18:15 +02:00
Roger Sayle
b434c94bf7 Improve preservation of FLAGS_REG mode in i386.md's peephole2s.
The patch tweaks several peephole2s in i386.md that propagate the flags
register, but take its mode from the SET_SRC rather than preserve the
mode of the original SET_DEST.  This encounters problems when the
SET_SRC is a VOIDmode CONST_INT.  Fixed by using match_operand with a
flags_reg_operand predicate.

2022-07-09  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
	* config/i386/i386.md (define_peephole2): Use match_operand of
	flags_reg_operand to capture and preserve the mode of FLAGS_REG.
	(define_peephole2): Likewise.
	(define_peephole2): Likewise...
2022-07-09 09:07:18 +01:00
Roger Sayle
002d81affa Support *testdi_not_doubleword during STV pass on x86.
This patch fixes the current two FAILs of pr65105-5.c on x86 when
compiled with -m32.  These (temporary) breakages were fallout from my
patches to improve/upgrade (scalar) double word comparisons.
On mainline, the i386 backend currently represents a critical comparison
using (compare (and (not reg1) reg2) (const_int 0)) which isn't/wasn't
recognized by the STV pass' convertible_comparison_p.  This simple STV
patch adds support for this pattern (*testdi_not_doubleword) and
generates the vector pandn and ptest instructions expected in the
existing (failing) test case.

2022-07-09  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
	* config/i386/i386-features.cc (convert_compare): Add support
	for *testdi_not_doubleword pattern, "(compare (and (not ...)))"
	by generating a pandn followed by ptest.
	(convertible_comparison_p): Recognize both *cmpdi_doubleword and
	recent *testdi_not_doubleword comparison patterns.
2022-07-09 09:04:55 +01:00
Tamar Christina
84ff566c63 [PATCH][s390]: Fix the usage of store_bit_field in the backend.
Hi All,

I seem to have broken the s390 bootstrap because I added a new parameter to the
store_bit_field function to indicate whether the value the field of is being set
is currently undefined.

If it's undefined we use a subreg instead.  In this case the value of false
restores the old behavior.

Ok for master?

Thanks,
Tamar

gcc/ChangeLog:

	* config/s390/s390.cc (s390_expand_atomic): Pass false to store_bit_field to
	indicate that the value is not undefined.
2022-07-08 21:56:25 -04:00
Andrew Pinski
71e3daa31c Fix tree-opt/PR106087: ICE with inline-asm with multiple output and assigned only static vars
The problem here is that when we mark the ssa name that was referenced in the now removed
dead store (to a write only static variable), the inline-asm would also be removed
even though it was defining another ssa name. This fixes the problem by checking
to make sure that the statement was only defining one ssa name.

Committed as approved after a bootstrapped and tested on x86_64 with no regressions.

	PR tree-optimization/106087

gcc/ChangeLog:

	* tree-ssa-dce.cc (simple_dce_from_worklist): Check
	to make sure the statement is only defining one operand.

gcc/testsuite/ChangeLog:

	* gcc.c-torture/compile/inline-asm-1.c: New test.
2022-07-09 01:17:46 +00:00