> > 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 <[email protected]>
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
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);