diff mbox

Fix PR tree-optimization/51624

Message ID 201201041327.10256.ebotcazou@adacore.com
State New
Headers show

Commit Message

Eric Botcazou Jan. 4, 2012, 12:27 p.m. UTC
> > OK, I see.  Then the only way out I can think of is to stop going up the
> > chain of COMPONENT_REFs as soon as the offset becomes negative.
>
> Yeah, that sounds like a better solution.

Bootstrapped on MIPS/IRIX and regtested on {i586,x86_64}-suse-linux.  OK after 
a full testing cycle?

2012-01-04  Eric Botcazou  <ebotcazou@adacore.com>

        PR tree-optimization/51624
        * tree-sra.c (build_ref_for_model): When replicating a chain of
        COMPONENT_REFs, stop as soon as the offset would become negative.

Comments

Richard Biener Jan. 4, 2012, 12:36 p.m. UTC | #1
On Wed, Jan 4, 2012 at 1:27 PM, Eric Botcazou <ebotcazou@adacore.com> wrote:
>> > OK, I see.  Then the only way out I can think of is to stop going up the
>> > chain of COMPONENT_REFs as soon as the offset becomes negative.
>>
>> Yeah, that sounds like a better solution.
>
> Bootstrapped on MIPS/IRIX and regtested on {i586,x86_64}-suse-linux.  OK after
> a full testing cycle?

Ok.

Thanks,
Richard.

> 2012-01-04  Eric Botcazou  <ebotcazou@adacore.com>
>
>        PR tree-optimization/51624
>        * tree-sra.c (build_ref_for_model): When replicating a chain of
>        COMPONENT_REFs, stop as soon as the offset would become negative.
>
>
> --
> Eric Botcazou
diff mbox

Patch

Index: tree-sra.c
===================================================================
--- tree-sra.c	(revision 182784)
+++ tree-sra.c	(working copy)
@@ -1472,8 +1472,14 @@  build_ref_for_model (location_t loc, tre
 
       do {
 	tree field = TREE_OPERAND (expr, 1);
-	offset -= int_bit_position (field);
+	HOST_WIDE_INT bit_pos = int_bit_position (field);
 
+	/* We can be called with a model different from the one associated
+	   with BASE so we need to avoid going up the chain too far.  */
+	if (offset - bit_pos < 0)
+	  break;
+
+	offset -= bit_pos;
 	VEC_safe_push (tree, stack, cr_stack, expr);
 
 	expr = TREE_OPERAND (expr, 0);