On 3/18/25 4:38 AM, Jakub Jelinek wrote:
Hi!

The following testcase ICEs starting with r15-3213 in
decompose_normal_address and starting with r15-3288 ICEs
in lra_rtx_hash, which since r8-5466 can't handle SUBREG
(previously SUBREG was "ei" and lra_rtx_hash can handle
that through
val += lra_rtx_hash (XEXP (x, i));
for e and
val += XINT (x, i);
for i, now it is "ep" where p stands for poly_uint16).

The following patch fixes it by handling SUBREG directly, a variant
could be instead add
        case 'p':
          for (int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
            val += SUBREG_BYTE (x).coeffs[i];
          break;
if you prefer that more (p is used solely for SUBREG and e.g. rtx_equal_p
has
        case 'p':
          if (maybe_ne (SUBREG_BYTE (x), SUBREG_BYTE (y)))
            return false;
          break;
).  Given the above rtx_equal_p snippet and that lra_rtx_hash
is solely used in invariant_hash (and recursion) and invariant_eq_p
uses rtx_equal_p we'll never consider different SUBREGs of the same thing
as the same invariant.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk
or do you prefer the case 'p' variant mentioned above?

Jakub, thank you for fixing this PR.

Subreg case variant is ok for me.  The assert would catch any case if something new is missed.



Reply via email to