regcprop: Avoid DCE of asm goto [PR100590]
authorJakub Jelinek <jakub@redhat.com>
Tue, 18 May 2021 08:26:45 +0000 (10:26 +0200)
committerJakub Jelinek <jakub@redhat.com>
Tue, 18 May 2021 08:26:45 +0000 (10:26 +0200)
The following testcase ICEs, because copyprop_hardreg_forward_1 decides
to DCE asm goto with REG_UNUSED notes (because the output is unused and
asm isn't volatile).  But that DCE just removes the asm goto, leaving
a bb with two successors and no insn at the end that would allow that.

The following patch makes sure we drop that way only INSNs and not
JUMP_INSNs or CALL_INSNs.

2021-05-18  Jakub Jelinek  <jakub@redhat.com>

PR rtl-optimization/100590
* regcprop.c (copyprop_hardreg_forward_1): Only DCE dead sets if
they are NONJUMP_INSN_P.

* gcc.dg/pr100590.c: New test.

gcc/regcprop.c
gcc/testsuite/gcc.dg/pr100590.c [new file with mode: 0644]

index 7c271e2..44f6295 100644 (file)
@@ -808,6 +808,7 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
       /* Detect obviously dead sets (via REG_UNUSED notes) and remove them.  */
       if (set
          && !RTX_FRAME_RELATED_P (insn)
+         && NONJUMP_INSN_P (insn)
          && !may_trap_p (set)
          && find_reg_note (insn, REG_UNUSED, SET_DEST (set))
          && !side_effects_p (SET_SRC (set))
diff --git a/gcc/testsuite/gcc.dg/pr100590.c b/gcc/testsuite/gcc.dg/pr100590.c
new file mode 100644 (file)
index 0000000..5cd3687
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR rtl-optimization/100590 */
+/* { dg-do compile } */
+/* { dg-options "-O1 -fno-dce -w" } */
+
+int
+foo (void)
+{
+  int x;
+  asm goto ("" : "+r" (x) : : : lab);
+  return 0;
+ lab:
+  return 1;
+}