On Sat, Dec 31, 2011 at 12:33 AM, Eric Botcazou <[email protected]>
wrote:
> This is the bootstrap failure of the Ada compiler on MIPS/IRIX, a recent
> regression present on mainline and 4.6 branch. The stage 2 compiler
> miscompiles the stage 3 compiler (sem_type.adb:Disambiguate) because of an
> oversight in the fix for PR tree-opt/50569 which changed build_ref_for_model
> to
> replicate chains of COMPONENT_REFs instead of just the last ones.
>
> The problem is that, when build_ref_for_model is called on the RHS of an
> aggregate assignment of the form:
>
> b1.f1 = b2
>
> with the model associated with a child of the LHS (say b1.f1.f2), it will
> build
> something like:
>
> MEM [&b2 + -4B].f1.f2
>
> which will wreak havoc downstream. I think that the most straightforward way
> out is to stop going up the chain of COMPONENT_REFs as soon as the type of the
> COMPONENT_REF matches that of the base.
>
> Bootstrapped on MIPS/IRIX and regtested on x86_64-suse-linux. OK after a full
> testing cycle?
Note that you'll get ICEs whenever TYPE_CANONICAL of some
aggregate type is NULL (thus, TYPE_STRUCTURAL_EQUALITY), so this
seems inherently fragile (similar to using TYPE_CANONICAL == TYPE_CANONICAL
here, we'd break the TYPE_STRUCTURAL_EQUALITY case again).
I think that either the original fix needs to be re-thought or we need to pass
the base FIELD_DECL to build_ref_for_model.
That is, why not stop extracting the component-refs in
do {
tree field = TREE_OPERAND (expr, 1);
tree cr_offset = component_ref_field_offset (expr);
gcc_assert (cr_offset && host_integerp (cr_offset, 1));
offset -= TREE_INT_CST_LOW (cr_offset) * BITS_PER_UNIT;
offset -= TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field));
VEC_safe_push (tree, stack, cr_stack, expr);
expr = TREE_OPERAND (expr, 0);
type = TREE_TYPE (expr);
} while (TREE_CODE (expr) == COMPONENT_REF);
when expr == base?
The whole point of course was to never need something like
build_ref_for_model given that we have MEM_REFs.
Thanks,
Richard.
> 2011-12-30 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 type of the COMPONENT_REF
> matches that of the base.
>
>
> --
> Eric Botcazou