My recent change to shift operand promotion caused a regression in
loop unrolling.  Fixed as Richi suggested in the PR audit trail.

Bootstrapped/regtested on ppc64-linux and x86_64-linux, ok for trunk?

2014-12-05  Marek Polacek  <pola...@redhat.com>

        PR tree-optimization/64183
        * c-gimplify.c (c_gimplify_expr): Don't convert the RHS of a
        shift-expression if it is integer_type_node.

        * gcc.dg/tree-ssa/pr64183.c: New test.

diff --git gcc/c-family/c-gimplify.c gcc/c-family/c-gimplify.c
index 2cfa5d9..41a928c 100644
--- gcc/c-family/c-gimplify.c
+++ gcc/c-family/c-gimplify.c
@@ -255,7 +255,8 @@ c_gimplify_expr (tree *expr_p, gimple_seq *pre_p 
ATTRIBUTE_UNUSED,
           type demotion/promotion pass.  */
        tree *op1_p = &TREE_OPERAND (*expr_p, 1);
        if (TREE_CODE (TREE_TYPE (*op1_p)) != VECTOR_TYPE
-           && TYPE_MAIN_VARIANT (TREE_TYPE (*op1_p)) != unsigned_type_node)
+           && TYPE_MAIN_VARIANT (TREE_TYPE (*op1_p)) != unsigned_type_node
+           && TYPE_MAIN_VARIANT (TREE_TYPE (*op1_p)) != integer_type_node)
          *op1_p = convert (unsigned_type_node, *op1_p);
        break;
       }
diff --git gcc/testsuite/gcc.dg/tree-ssa/pr64183.c 
gcc/testsuite/gcc.dg/tree-ssa/pr64183.c
index e69de29..0563739 100644
--- gcc/testsuite/gcc.dg/tree-ssa/pr64183.c
+++ gcc/testsuite/gcc.dg/tree-ssa/pr64183.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-tree-cunroll-details" } */
+
+int bits;
+unsigned int size;
+int max_code;
+
+void
+test ()
+{
+ int code = 0;
+
+ while (code < max_code)
+   code |= ((unsigned int) (size >> (--bits)));
+
+ while (bits < (unsigned int)25)
+   bits += 8;
+}
+
+/* { dg-final { scan-tree-dump "Loop 2 iterates at most 4 times" "cunroll"} } 
*/
+/* { dg-final { cleanup-tree-dump "cunroll" } } */

        Marek

Reply via email to