diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-06-12 09:52:47 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-06-12 09:52:47 +0200 |
commit | 891ca07d493c51f468710ba0f4af74bbe5e09fdd (patch) | |
tree | a98e47f2089f21dfa76a5978eefa408198dace25 /gcc | |
parent | ed6a1ff9879de13a0458ff31a3cb50db7a207881 (diff) | |
download | gcc-891ca07d493c51f468710ba0f4af74bbe5e09fdd.zip gcc-891ca07d493c51f468710ba0f4af74bbe5e09fdd.tar.gz gcc-891ca07d493c51f468710ba0f4af74bbe5e09fdd.tar.bz2 |
re PR rtl-optimization/53589 (ICE in maybe_record_trace_start with asm goto)
PR rtl-optimization/53589
* cfgrtl.c (force_nonfallthru_and_redirect): Do asm_goto_edge
discovery even when e->dest != target. If any LABEL_REF points
to e->dest label, redirect it to target's label.
* gcc.dg/torture/pr53589.c: New test.
From-SVN: r188428
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cfgrtl.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr53589.c | 15 |
4 files changed, 33 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c2e212c..aa50728 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-06-12 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/53589 + * cfgrtl.c (force_nonfallthru_and_redirect): Do asm_goto_edge + discovery even when e->dest != target. If any LABEL_REF points + to e->dest label, redirect it to target's label. + 2012-06-12 Chung-Lin Tang <cltang@codesourcery.com> * config/sh/sh.c (output_stack_adjust): Remove !epilogue_p diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index 031dc25..3e4b65e 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -1293,21 +1293,21 @@ force_nonfallthru_and_redirect (edge e, basic_block target, rtx jump_label) } /* If e->src ends with asm goto, see if any of the ASM_OPERANDS_LABELs - don't point to target label. */ + don't point to the target or fallthru label. */ if (JUMP_P (BB_END (e->src)) && target != EXIT_BLOCK_PTR - && e->dest == target && (e->flags & EDGE_FALLTHRU) && (note = extract_asm_operands (PATTERN (BB_END (e->src))))) { int i, n = ASM_OPERANDS_LABEL_LENGTH (note); for (i = 0; i < n; ++i) - if (XEXP (ASM_OPERANDS_LABEL (note, i), 0) == BB_HEAD (target)) - { + { + if (XEXP (ASM_OPERANDS_LABEL (note, i), 0) == BB_HEAD (e->dest)) + XEXP (ASM_OPERANDS_LABEL (note, i), 0) = block_label (target); + if (XEXP (ASM_OPERANDS_LABEL (note, i), 0) == BB_HEAD (target)) asm_goto_edge = true; - break; - } + } } if (EDGE_COUNT (e->src->succs) >= 2 || abnormal_edge_flags || asm_goto_edge) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 04725bd..2954f59 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-06-12 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/53589 + * gcc.dg/torture/pr53589.c: New test. + 2012-06-12 Oleg Endo <olegendo@gcc.gnu.org> PR target/50749 diff --git a/gcc/testsuite/gcc.dg/torture/pr53589.c b/gcc/testsuite/gcc.dg/torture/pr53589.c new file mode 100644 index 0000000..5ab7890 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr53589.c @@ -0,0 +1,15 @@ +/* PR rtl-optimization/53589 */ +/* { dg-do compile } */ + +extern void foo (void) __attribute__ ((__noreturn__)); + +void +bar (int x) +{ + if (x < 0) + foo (); + if (x == 0) + return; + __asm goto ("# %l[lab]" : : : : lab); +lab:; +} |