diff options
author | Jakub Jelinek <jakub@redhat.com> | 2021-05-18 10:26:45 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2021-05-18 10:26:45 +0200 |
commit | c81704b359283bb54696755ead881ab04136da94 (patch) | |
tree | 4139e0e23a32beefdd05eee44c4f140e6e9fdefa /gcc | |
parent | 978b62e554ffb4b34844c72d259ce71fcbd87591 (diff) | |
download | gcc-c81704b359283bb54696755ead881ab04136da94.zip gcc-c81704b359283bb54696755ead881ab04136da94.tar.gz gcc-c81704b359283bb54696755ead881ab04136da94.tar.bz2 |
regcprop: Avoid DCE of asm goto [PR100590]
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/regcprop.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr100590.c | 13 |
2 files changed, 14 insertions, 0 deletions
diff --git a/gcc/regcprop.c b/gcc/regcprop.c index 7c271e2..44f6295 100644 --- a/gcc/regcprop.c +++ b/gcc/regcprop.c @@ -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 index 0000000..5cd3687 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr100590.c @@ -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; +} |