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

--- Comment #6 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:bab8d9625f4cdeaf9bb45e28ab62abe47c3827f9

commit r10-7551-gbab8d9625f4cdeaf9bb45e28ab62abe47c3827f9
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Sat Apr 4 10:32:41 2020 +0200

    cselib: Don't consider SP_DERIVED_VALUE_P values as useless [PR94468]

    The following testcase ICEs, because at one point we see the
    SP_DERIVED_VALUE_P VALUE as useless (not PRESERVED_VALUE_P and no locs)
    and so expect it to be discarded as useless.  But, later on we
    are adding some new VALUE that is equivalent to it, and when adding
    the equivalency that that new VALUE is equal to this SP_DERIVED_VALUE_P,
    new_elt_loc_list has code for VALUE canonicalization and reverses addition
    if uid is smaller, and at that point a new loc is added to the
    SP_DERIVED_VALUE_P VALUE and it isn't discarded as useless anymore.
    Now, I think we don't want to discard the SP_DERIVED_VALUE_P values
    even if they have no locs, because they still have the special behaviour
    that they then force other new VALUEs to be canonicalized against them,
    which is what this patch implements.  I've not set PRESERVED_VALUE_P
    on the SP_DERIVED_VALUE_P at the creation time, because whether a VALUE
    is preserved or not is something that affects var-tracking decisions quite
a
    lot and we shouldn't set it blindly on other VALUEs.

    Or, to avoid the repetitive code, should I introduce
    static bool
    cselib_useless_value_p (cselib_val *v)
    {
      return (v->locs == 0
              && !PRESERVED_VALUE_P (v->val_rtx)
              && !SP_DERIVED_VALUE_P (v->val_rtx)));
    }
    predicate and use it in those 6 spots?

    2020-04-04  Jakub Jelinek  <ja...@redhat.com>

            PR rtl-optimization/94468
            * cselib.c (references_value_p): Formatting fix.
            (cselib_useless_value_p): New function.
            (discard_useless_locs, discard_useless_values,
            cselib_invalidate_regno_val, cselib_invalidate_mem,
            cselib_record_set): Use it instead of
            v->locs == 0 && !PRESERVED_VALUE_P (v->val_rtx).

            * g++.dg/opt/pr94468.C: New test.

Reply via email to