tree-ssa-sink.c (statement_sink_location): Stop sinking expression if the target...
authorWei Guozhi <carrot@google.com>
Tue, 30 Jun 2009 06:51:29 +0000 (06:51 +0000)
committerWei Guozhi <carrot@gcc.gnu.org>
Tue, 30 Jun 2009 06:51:29 +0000 (06:51 +0000)
* tree-ssa-sink.c (statement_sink_location): Stop sinking expression
if the target bb post dominates from bb.

* config/i386/i386.c (memory_address_length): Check existence of base
register before using it.

* gcc.dg/tree-ssa/ssa-sink-5.c: New testcase.

From-SVN: r149082

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ssa-sink-5.c [new file with mode: 0644]
gcc/tree-ssa-sink.c

index d2187910ebefefdf9a8fb96acb3cdf8e7e784e2f..90bed4eb1481f5d378f1380451183f5b7116337a 100644 (file)
@@ -1,3 +1,11 @@
+2009-06-30  Wei Guozhi  <carrot@google.com>
+
+       PR/40416
+       * tree-ssa-sink.c (statement_sink_location): Stop sinking expression
+       if the target bb post dominates from bb.
+       * config/i386/i386.c (memory_address_length): Check existence of base
+       register before using it.
+
 2009-06-29  DJ Delorie  <dj@redhat.com>
 
        * doc/install.texi (mep-x-elf): Correct chip's full name.
index 8bb82f3fb6c897f193d4f8cef08b38ae428bddab..a6bab1b962dfa2cb9e8a6a9419c662d2543e761f 100644 (file)
@@ -19389,7 +19389,7 @@ memory_address_length (rtx addr)
            len = 4;
        }
       /* ebp always wants a displacement.  Similarly r13.  */
-      else if (REG_P (base)
+      else if (base && REG_P (base)
               && (REGNO (base) == BP_REG || REGNO (base) == R13_REG))
        len = 1;
 
@@ -19398,7 +19398,7 @@ memory_address_length (rtx addr)
          /* ...like esp (or r12), which always wants an index.  */
          || base == arg_pointer_rtx
          || base == frame_pointer_rtx
-         || (REG_P (base)
+         || (base && REG_P (base)
              && (REGNO (base) == SP_REG || REGNO (base) == R12_REG)))
        len += 1;
     }
index 03e3a043690434393671815ac818a30238e64458..42456c814d7b47a1b70121ddd496f2bb8b99a9c3 100644 (file)
@@ -1,3 +1,8 @@
+2009-06-30  Wei Guozhi  <carrot@google.com>
+
+       PR/40416
+       * gcc.dg/tree-ssa/ssa-sink-5.c: New testcase.
+
 2009-06-29  Jason Merrill  <jason@redhat.com>
 
        PR c++/40274
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-sink-5.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-sink-5.c
new file mode 100644 (file)
index 0000000..0454245
--- /dev/null
@@ -0,0 +1,48 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Os -fdump-tree-sink-stats" } */
+
+typedef short int16_t;
+typedef unsigned char uint8_t;
+
+void foo(int16_t runs[], uint8_t alpha[], int x, int count)
+{
+    int16_t* next_runs = runs + x;
+    uint8_t*  next_alpha = alpha + x;
+
+    while (x > 0)
+    {
+        int n = runs[0];
+
+        if (x < n)
+        {
+            alpha[x] = alpha[0];
+            runs[0] = (int16_t)(x);
+            runs[x] = (int16_t)(n - x);
+            break;
+        }
+        runs += n;
+        alpha += n;
+        x -= n;
+    }
+
+    runs = next_runs;
+    alpha = next_alpha;
+    x = count;
+
+   for (;;)
+    {
+        int n = runs[0];
+
+        if (x < n)
+        {
+            alpha[x] = alpha[0];
+            break;
+        }
+        x -= n;
+        runs += n;
+   }
+}
+
+/* We should not sink the next_runs = runs + x calculation after the loop.  */
+/* { dg-final { scan-tree-dump-times "Sunk statements:" 0 "sink" } } */
+/* { dg-final { cleanup-tree-dump "sink" } } */
index 227ad11253cc8fa9a8b179369840e482ce694872..4f16addb32353d447a4bfe00c3c4148a60ee1f14 100644 (file)
@@ -384,6 +384,11 @@ statement_sink_location (gimple stmt, basic_block frombb,
          || sinkbb->loop_father != frombb->loop_father)
        return false;
 
+      /* Move the expression to a post dominator can't reduce the number of
+         executions.  */
+      if (dominated_by_p (CDI_POST_DOMINATORS, frombb, sinkbb))
+        return false;
+
       *togsi = gsi_for_stmt (use);
       return true;
     }
@@ -411,6 +416,11 @@ statement_sink_location (gimple stmt, basic_block frombb,
       || sinkbb->loop_father != frombb->loop_father)
     return false;
 
+  /* Move the expression to a post dominator can't reduce the number of
+     executions.  */
+  if (dominated_by_p (CDI_POST_DOMINATORS, frombb, sinkbb))
+    return false;
+
   *togsi = gsi_after_labels (sinkbb);
 
   return true;