]> git.ipfire.org Git - thirdparty/gcc.git/commit
RISC-V: prefetch: fix LRA failing to allocate reg [PR118241]
authorVineet Gupta <vineetg@rivosinc.com>
Fri, 4 Jul 2025 19:33:51 +0000 (12:33 -0700)
committerJeff Law <jlaw@ventanamicro.com>
Mon, 14 Jul 2025 12:42:04 +0000 (06:42 -0600)
commitbf6b07491e549af8ca9a27ac04f4d90c41d6a97c
tree67e397207800920dbe757ca6e8c66b7e0e2f6737
parentb5d0cfab39608ff1f010a571122d6105b6e0e91e
RISC-V: prefetch: fix LRA failing to allocate reg [PR118241]

prefetch was recently fixed/tightened (with Q reg constraint) to only
support right address patterns (REG or REG+D with lower 5 bits clear).
However in some cases that's too restrictive for LRA and it fails to
allocate a reg resulting in following ICE...

| gcc/testsuite/gcc.target/riscv/pr118241-b.cc:31:19: error: unable to generate reloads for:
|   31 | void m() { a.l(); }
|      |                   ^
|(insn 26 25 27 7 (prefetch (mem/f:DI (plus:DI (reg/f:DI 143 [ _5 ])
|                (const_int 56 [0x38])) [5 _5->batch[6]+0 S8 A64])
|        (const_int 0 [0])
|        (const_int 3 [0x3])) "gcc/testsuite/gcc.target/riscv/pr118241-b.cc":18:29 498 {prefetch}
|     (expr_list:REG_DEAD (reg/f:DI 142 [ _5->batch[6] ])
|        (nil)))
|during RTL pass: reload

Fix that by providing a fallback alternative register constraint to reload the address.

PR target/118241

gcc/ChangeLog:

* config/riscv/riscv.md (prefetch): Add alternative "r".

gcc/testsuite/ChangeLog:

* gcc.target/riscv/pr118241-b.cc: New test.

Signed-off-by: Vineet Gupta <vineetg@rivosinc.com>
(cherry picked from commit f2a3ab7ebf3c40da77f54e8329272fe048ec48a6)
gcc/config/riscv/riscv.md
gcc/testsuite/gcc.target/riscv/pr118241-b.cc [new file with mode: 0644]