OSDN Git Service

Backported from mainline
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Jun 2012 17:49:49 +0000 (17:49 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Jun 2012 17:49:49 +0000 (17:49 +0000)
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.

* gcc.dg/torture/pr53589.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@188626 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfgrtl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr53589.c [new file with mode: 0644]

index 375309c..d1dce4e 100644 (file)
@@ -1,6 +1,13 @@
 2012-06-14  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       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-07  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/53580
index 8283da0..65a4ffc 100644 (file)
@@ -1224,21 +1224,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)
index 1f00938..cb6406e 100644 (file)
@@ -1,6 +1,11 @@
 2012-06-14  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2012-06-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/53589
+       * gcc.dg/torture/pr53589.c: New test.
+
        2012-06-07  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/53580
diff --git a/gcc/testsuite/gcc.dg/torture/pr53589.c b/gcc/testsuite/gcc.dg/torture/pr53589.c
new file mode 100644 (file)
index 0000000..5ab7890
--- /dev/null
@@ -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:;
+}