On 5/29/19 7:24 AM, Richard Biener wrote:
> On Wed, May 29, 2019 at 2:18 PM Aldy Hernandez <[email protected]> wrote:
>>
>> As per the API, and the original documentation to value_range,
>> VR_UNDEFINED and VR_VARYING should never have equivalences. However,
>> equiv_add is tacking on equivalences blindly, and there are various
>> regressions that happen if I fix this oversight.
>>
>> void
>> value_range::equiv_add (const_tree var,
>> const value_range *var_vr,
>> bitmap_obstack *obstack)
>> {
>> if (!m_equiv)
>> m_equiv = BITMAP_ALLOC (obstack);
>> unsigned ver = SSA_NAME_VERSION (var);
>> bitmap_set_bit (m_equiv, ver);
>> if (var_vr && var_vr->m_equiv)
>> bitmap_ior_into (m_equiv, var_vr->m_equiv);
>> }
>>
>> Is this a bug in the documentation / API, or is equiv_add incorrect and
>> we should fix the fall-out elsewhere?
>
> I think this must have been crept in during the classification. If you
> go back to say GCC 7 you shouldn't see value-ranges with
> UNDEFINED/VARYING state in the lattice that have equivalences.
>
> It may not be easy to avoid with the new classy interface but we're
> certainly not tacking on them "blindly". At least we're not supposed
> to. As usual the intermediate state might be "broken" but
> intermediateness is not sth the new class "likes".
I don't remember changing anything (behavior-wise) in this space. If I
did it certainly wasn't intentional.
Given the code in gcc-7 looks like this:
> static void
> add_equivalence (bitmap *equiv, const_tree var)
> {
> unsigned ver = SSA_NAME_VERSION (var);
> value_range *vr = get_value_range (var);
>
> if (*equiv == NULL)
> *equiv = BITMAP_ALLOC (&vrp_equiv_obstack);
> bitmap_set_bit (*equiv, ver);
> if (vr && vr->equiv)
> bitmap_ior_into (*equiv, vr->equiv);
> }
I suspect we need to look up the call chain.
Jeff