]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR tree-optimization/53226
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 May 2012 12:19:34 +0000 (12:19 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 May 2012 12:19:34 +0000 (12:19 +0000)
* tree-ssa-forwprop.c (ssa_forward_propagate_and_combine): Remove
prev and prev_initialized vars, gimple_set_plf (stmt, GF_PLF_1, false)
before processing it and gimple_set_plf (stmt, GF_PLF_1, true) if it
doesn't need to be revisited, look for earliest stmt with
!gimple_plf (stmt, GF_PLF_1) if something changed.

* gcc.c-torture/compile/pr53226.c: New test.

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr53226.c [new file with mode: 0644]
gcc/tree-ssa-forwprop.c

index 49670046a0f581e035613aab19fe3da5c9e28a71..b96afa0803c2af37bd3a20568b27d79518b6914c 100644 (file)
@@ -1,3 +1,12 @@
+2012-05-09  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/53226
+       * tree-ssa-forwprop.c (ssa_forward_propagate_and_combine): Remove
+       prev and prev_initialized vars, gimple_set_plf (stmt, GF_PLF_1, false)
+       before processing it and gimple_set_plf (stmt, GF_PLF_1, true) if it
+       doesn't need to be revisited, look for earliest stmt with
+       !gimple_plf (stmt, GF_PLF_1) if something changed.
+
 2012-05-09  Terry Guo  <terry.guo@arm.com>
 
        * genmultilib: Update copyright dates.
index 0b739da17bef5dc54a7f7ece4cadcc7c39550a38..84c31a0667620838c793bf7c03c2d507f3543452 100644 (file)
@@ -1,3 +1,8 @@
+2012-05-09  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/53226
+       * gcc.c-torture/compile/pr53226.c: New test.
+
 2012-05-09  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * gcc.target/i386/hle-add-acq-1.c: Allow for ; after lock.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr53226.c b/gcc/testsuite/gcc.c-torture/compile/pr53226.c
new file mode 100644 (file)
index 0000000..2d0284f
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR tree-optimization/53226 */
+
+void
+foo (unsigned long *x, char y, char z)
+{
+  int i;
+  for (i = y; i < z; ++i)
+    {
+      unsigned long a = ((unsigned char) i) & 63UL;
+      unsigned long b = 1ULL << a;
+      *x |= b;
+    }
+}
index e14627d9f3a1ed2f27f9ef5d8000dcd62a2ad666..3c01623130ca067e739d8f6bc822c36e291ab039 100644 (file)
@@ -2677,8 +2677,7 @@ ssa_forward_propagate_and_combine (void)
 
   FOR_EACH_BB (bb)
     {
-      gimple_stmt_iterator gsi, prev;
-      bool prev_initialized;
+      gimple_stmt_iterator gsi;
 
       /* Apply forward propagation to all stmts in the basic-block.
         Note we update GSI within the loop as necessary.  */
@@ -2771,12 +2770,14 @@ ssa_forward_propagate_and_combine (void)
 
       /* Combine stmts with the stmts defining their operands.
         Note we update GSI within the loop as necessary.  */
-      prev_initialized = false;
       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
        {
          gimple stmt = gsi_stmt (gsi);
          bool changed = false;
 
+         /* Mark stmt as potentially needing revisiting.  */
+         gimple_set_plf (stmt, GF_PLF_1, false);
+
          switch (gimple_code (stmt))
            {
            case GIMPLE_ASSIGN:
@@ -2856,18 +2857,18 @@ ssa_forward_propagate_and_combine (void)
            {
              /* If the stmt changed then re-visit it and the statements
                 inserted before it.  */
-             if (!prev_initialized)
+             for (; !gsi_end_p (gsi); gsi_prev (&gsi))
+               if (gimple_plf (gsi_stmt (gsi), GF_PLF_1))
+                 break;
+             if (gsi_end_p (gsi))
                gsi = gsi_start_bb (bb);
              else
-               {
-                 gsi = prev;
-                 gsi_next (&gsi);
-               }
+               gsi_next (&gsi);
            }
          else
            {
-             prev = gsi;
-             prev_initialized = true;
+             /* Stmt no longer needs to be revisited.  */
+             gimple_set_plf (stmt, GF_PLF_1, true);
              gsi_next (&gsi);
            }
        }