OSDN Git Service

PR rtl-optimization/42084
authormatz <matz@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Nov 2009 15:35:50 +0000 (15:35 +0000)
committermatz <matz@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Nov 2009 15:35:50 +0000 (15:35 +0000)
        * cfgexpand.c (maybe_cleanup_end_of_block): Add new parameter,
        use it to stop walking.
        (expand_gimple_cond): Adjust call to above.

testsuite/
        * gcc.dg/pr42084.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@154709 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfgexpand.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr42084.c [new file with mode: 0644]

index 73b15a8..8165df5 100644 (file)
@@ -1,3 +1,10 @@
+2009-11-27  Michael Matz  <matz@suse.de>
+
+       PR rtl-optimization/42084
+       * cfgexpand.c (maybe_cleanup_end_of_block): Add new parameter,
+       use it to stop walking.
+       (expand_gimple_cond): Adjust call to above.
+
 2009-11-27  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        PR target/41810
index d3637a0..95f6948 100644 (file)
@@ -1586,10 +1586,11 @@ label_rtx_for_bb (basic_block bb ATTRIBUTE_UNUSED)
 
 /* A subroutine of expand_gimple_cond.  Given E, a fallthrough edge
    of a basic block where we just expanded the conditional at the end,
-   possibly clean up the CFG and instruction sequence.  */
+   possibly clean up the CFG and instruction sequence.  LAST is the
+   last instruction before the just emitted jump sequence.  */
 
 static void
-maybe_cleanup_end_of_block (edge e)
+maybe_cleanup_end_of_block (edge e, rtx last)
 {
   /* Special case: when jumpif decides that the condition is
      trivial it emits an unconditional jump (and the necessary
@@ -1604,7 +1605,6 @@ maybe_cleanup_end_of_block (edge e)
      normally isn't there in a cleaned CFG), fix it here.  */
   if (BARRIER_P (get_last_insn ()))
     {
-      basic_block bb = e->src;
       rtx insn;
       remove_edge (e);
       /* Now, we have a single successor block, if we have insns to
@@ -1620,7 +1620,7 @@ maybe_cleanup_end_of_block (edge e)
       /* Make sure we have an unconditional jump.  Otherwise we're
         confused.  */
       gcc_assert (JUMP_P (insn) && !any_condjump_p (insn));
-      for (insn = PREV_INSN (insn); insn != BB_HEAD (bb);)
+      for (insn = PREV_INSN (insn); insn != last;)
        {
          insn = PREV_INSN (insn);
          if (JUMP_P (NEXT_INSN (insn)))
@@ -1699,7 +1699,7 @@ expand_gimple_cond (basic_block bb, gimple stmt)
        }
       true_edge->goto_block = NULL;
       false_edge->flags |= EDGE_FALLTHRU;
-      maybe_cleanup_end_of_block (false_edge);
+      maybe_cleanup_end_of_block (false_edge, last);
       return NULL;
     }
   if (true_edge->dest == bb->next_bb)
@@ -1715,7 +1715,7 @@ expand_gimple_cond (basic_block bb, gimple stmt)
        }
       false_edge->goto_block = NULL;
       true_edge->flags |= EDGE_FALLTHRU;
-      maybe_cleanup_end_of_block (true_edge);
+      maybe_cleanup_end_of_block (true_edge, last);
       return NULL;
     }
 
index 39c89bc..d0532ff 100644 (file)
@@ -1,5 +1,10 @@
 2009-11-27  Michael Matz  <matz@suse.de>
 
+       PR rtl-optimization/42084
+       * gcc.dg/pr42084.c: New test.
+
+2009-11-27  Michael Matz  <matz@suse.de>
+
        PR c++/41906
        * g++.dg/tree-ssa/pr41906.C: New testcase.
 
diff --git a/gcc/testsuite/gcc.dg/pr42084.c b/gcc/testsuite/gcc.dg/pr42084.c
new file mode 100644 (file)
index 0000000..d5aad96
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do run } */
+/* { dg-options "-O1 -fno-delete-null-pointer-checks" } */
+extern void abort (void);
+int g = 0;
+static int __attribute__((noinline)) f (long long a, long long b)
+{
+  int cmp;
+  cmp = a > b;
+  if (&g == 0)
+    cmp-=2;
+  else
+    cmp++;
+  return cmp;
+}
+
+int main (void)
+{
+  int ret = f (2, 1);
+  if (ret != 2)
+    abort ();
+  return 0;
+}