https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117912

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org
             Status|NEW                         |ASSIGNED

--- Comment #21 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Jakub Jelinek from comment #13)
> From what I can see, this VN is purely from vn_reference_eq and it just
> skips over
> the COMPONENT_REFs after taking into account their vro?->off (but I do not
> yet understand why the similar case with unions isn't handled the same).
> So if we want to disallow value numbering them the same before PROP_objsz in
> problematic cases which lead to same offset through different access path,
> we'd need to do it somewhere before for (; vr1->operands.iterate (i, &vro1);
> i++).
> And the problematic cases for objsz are either zero sized FIELD_DECLs (one
> of them but not both), or I guess as well starting offset of one field vs.
> ending offset of another field, say if we have
> struct S { char a[24]; char b[24]; char c; };
> and struct S *p, then &p->a[24] might value number the same as &p->b[0] or
> vice versa, but __builtin_object_size (, 1) in one case should be 0 and in
> the other case should be 24 (minimum with actual object size).

The protection against !PROP_objsz works by _not_ setting .off in
copy_reference_ops_from_ref.  The issue in this case is this doesn't
trigger because the check only prohibits a zero offset?!

                    poly_offset_int off
                      = (wi::to_poly_offset (this_offset)
                         + (wi::to_offset (bit_offset) >> LOG2_BITS_PER_UNIT));
                    /* Probibit value-numbering zero offset components
                       of addresses the same before the pass folding
                       __builtin_object_size had a chance to run.  */
                    if (TREE_CODE (orig) != ADDR_EXPR
                        || maybe_ne (off, 0)
                        || (cfun->curr_properties & PROP_objsz))
                      off.to_shwi (&temp.off);

it seems to be this way since forever - r0-126594-g1eadb567eff34d introduced it
this way.  Likely the intent was to cover addresses of union components only
here and not out-of-bound array offsets.  So possibly the "fix" that's
least intrusive on FRE performance is to put a similar guard for
known-out-of-bound array indicies.

Reply via email to