summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 00000000000..0044cb761b6
--- /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 2067b711d5b..4b7b664867d 100644
--- a/gcc/tree-ssa-dce.cc
+++ b/gcc/tree-ssa-dce.cc
@@ -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))