Message ID | 20141205190058.GL16332@redhat.com |
---|---|
State | New |
Headers | show |
On 12/05/14 12:00, Marek Polacek wrote: > On Fri, Dec 05, 2014 at 12:08:02PM +0100, Jakub Jelinek wrote: >> On Fri, Dec 05, 2014 at 11:27:50AM +0100, Marek Polacek wrote: >>> 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 <polacek@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. >> >> This is for middle-end, so I think it would be better to use >> the middle-end type equality in the checks, so !types_compatible_p >> instead of != ? > > Ok, this is a variant with types_compatible_p instead. > > Bootstrapped/regtested on ppc64-linux and x86_64-linux. > > 2014-12-05 Marek Polacek <polacek@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. Use types_compatible_p. > > * gcc.dg/tree-ssa/pr64183.c: New test. OK. jeff
diff --git gcc/c-family/c-gimplify.c gcc/c-family/c-gimplify.c index 2cfa5d9..4781cf2 100644 --- gcc/c-family/c-gimplify.c +++ gcc/c-family/c-gimplify.c @@ -255,7 +255,10 @@ 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) + && !types_compatible_p (TYPE_MAIN_VARIANT (TREE_TYPE (*op1_p)), + unsigned_type_node) + && !types_compatible_p (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" } } */