diff mbox

Don't promote RHS of shift-expr if it's integer_type (PR tree-optimization/64183)

Message ID 20141205190058.GL16332@redhat.com
State New
Headers show

Commit Message

Marek Polacek Dec. 5, 2014, 7 p.m. UTC
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.


	Marek

Comments

Jeff Law Dec. 5, 2014, 8:45 p.m. UTC | #1
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 mbox

Patch

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" } } */