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