aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Pinski <apinski@marvell.com>2022-07-07 22:06:19 +0000
committerAndrew Pinski <apinski@marvell.com>2022-07-09 01:17:46 +0000
commit71e3daa31cfa35ee58e5899cb00767be92227fd2 (patch)
treefa19f95177e47f1eefd2e95758fcac42be873d2f
parent0fe604a2d93168c8d19db83edf8a7f806aa4fe69 (diff)
downloadgcc-71e3daa31cfa35ee58e5899cb00767be92227fd2.zip
gcc-71e3daa31cfa35ee58e5899cb00767be92227fd2.tar.gz
gcc-71e3daa31cfa35ee58e5899cb00767be92227fd2.tar.bz2
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.
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/inline-asm-1.c14
-rw-r--r--gcc/tree-ssa-dce.cc7
2 files changed, 21 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.c-torture/compile/inline-asm-1.c b/gcc/testsuite/gcc.c-torture/compile/inline-asm-1.c
new file mode 100644
index 0000000..0044cb7
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/inline-asm-1.c
@@ -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;
+}
diff --git a/gcc/tree-ssa-dce.cc b/gcc/tree-ssa-dce.cc
index bc53358..daf0782 100644
--- a/gcc/tree-ssa-dce.cc
+++ b/gcc/tree-ssa-dce.cc
@@ -2061,6 +2061,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))