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.

(cherry picked from commit 71e3daa31c)
This commit is contained in:
Andrew Pinski 2022-07-07 22:06:19 +00:00 committed by Richard Biener
parent 019a9ef7f7
commit e0e388998b
2 changed files with 21 additions and 0 deletions

View File

@ -0,0 +1,14 @@
/* PR tree-opt/106087,
simple_dce_from_worklist would delete the
inline-asm when it was still being referenced
by the other ssa name. */
static int t;
int f(void)
{
int tt, tt1;
asm("":"=r"(tt), "=r"(tt1));
t = tt1;
return tt;
}

View File

@ -2060,6 +2060,13 @@ simple_dce_from_worklist (bitmap worklist)
if (gimple_has_side_effects (t))
continue;
/* The defining statement needs to be defining only this name.
ASM is the only statement that can define more than one
(non-virtual) name. */
if (is_a<gasm *>(t)
&& !single_ssa_def_operand (t, SSA_OP_DEF))
continue;
/* Don't remove statements that are needed for non-call
eh to work. */
if (stmt_unremovable_because_of_non_call_eh_p (cfun, t))