PR rtl-optimization/46878
authordj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 26 Jan 2011 22:03:47 +0000 (22:03 +0000)
committerdj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 26 Jan 2011 22:03:47 +0000 (22:03 +0000)
* combine.c (insn_a_feeds_b): Check for the implicit cc0
setter/user dependency as well.

* gcc.dg/pr46878-1.c: New test.

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

gcc/ChangeLog
gcc/combine.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr46878-1.c [new file with mode: 0644]

index fa574e8..67ce1d2 100644 (file)
@@ -1,3 +1,9 @@
+2011-01-26  DJ Delorie  <dj@redhat.com>
+
+       PR rtl-optimization/46878
+       * combine.c (insn_a_feeds_b): Check for the implicit cc0
+       setter/user dependency as well.
+
 2011-01-26  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR rtl-optimization/44469
index 3ee53e6..4fe71f3 100644 (file)
@@ -1032,7 +1032,9 @@ clear_log_links (void)
 /* Walk the LOG_LINKS of insn B to see if we find a reference to A.  Return
    true if we found a LOG_LINK that proves that A feeds B.  This only works
    if there are no instructions between A and B which could have a link
-   depending on A, since in that case we would not record a link for B.  */
+   depending on A, since in that case we would not record a link for B.
+   We also check the implicit dependency created by a cc0 setter/user
+   pair.  */
 
 static bool
 insn_a_feeds_b (rtx a, rtx b)
@@ -1041,6 +1043,10 @@ insn_a_feeds_b (rtx a, rtx b)
   for (links = LOG_LINKS (b); links; links = XEXP (links, 1))
     if (XEXP (links, 0) == a)
       return true;
+#ifdef HAVE_cc0
+  if (sets_cc0_p (a))
+    return true;
+#endif
   return false;
 }
 \f
index 527b3ed..a4ed365 100644 (file)
@@ -1,3 +1,8 @@
+2011-01-26  DJ Delorie  <dj@redhat.com>
+
+       PR rtl-optimization/46878
+       * gcc.dg/pr46878-1.c: New test.
+
 2011-01-26  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/47476
diff --git a/gcc/testsuite/gcc.dg/pr46878-1.c b/gcc/testsuite/gcc.dg/pr46878-1.c
new file mode 100644 (file)
index 0000000..f5b42de
--- /dev/null
@@ -0,0 +1,30 @@
+/* PR rtl-optimization/46878 */
+/* Make sure this doesn't ICE.  */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+struct baz
+{
+  int *newp;
+};
+
+int
+get_ice (int *op, struct baz *ret)
+{
+  int *tmpp;
+  int c;
+  c = (__foo () != 1);
+  if (__bar ())
+    {
+      return (1);
+    }
+  if (c)
+    tmpp = op;
+  if (tmpp)
+    {
+    }
+  else if (c)
+    {
+      ret->newp = tmpp;
+    }
+}