aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-06-12 09:52:47 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2012-06-12 09:52:47 +0200
commit891ca07d493c51f468710ba0f4af74bbe5e09fdd (patch)
treea98e47f2089f21dfa76a5978eefa408198dace25 /gcc
parented6a1ff9879de13a0458ff31a3cb50db7a207881 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/cfgrtl.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr53589.c15
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:;
+}