https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118241
Bug ID: 118241
Summary: RISC-V ICE: internal compiler error: in
int_mode_for_mode, at stor-layout.cc:407 caused by
prefetch instructions
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: wangpengcheng.pp at bytedance dot com
Target Milestone: ---
This was found when compiling the latest version of linux kernel via using GCC
13.2.1. And this error can be reproduced on GCC 14.2.1 and GCC 15 (master).
The error file is `linux/block/blk-mq.c` and the reduced case is:
```c
void test() { __builtin_prefetch((int *)2047); }
```
When the constant is a number in the range of simm12 [-2048, 2047], the
compiler complains:
```shell
# riscv64-unknown-linux-gnu-gcc -O3 -march=rv64gc_zicbop -mabi=lp64d blk-mq.i
-S -Wno-implicit-int -Wno-int-conversion
during RTL pass: reload
blk-mq.i: In function 'a':
blk-mq.i:4:1: internal compiler error: in int_mode_for_mode, at
stor-layout.cc:407
4 | }
| ^
0x9a9845 int_mode_for_mode(machine_mode)
../../../gcc/gcc/stor-layout.cc:407
0xc3fced emit_move_via_integer
../../../gcc/gcc/expr.cc:4219
0xc514f0 emit_move_insn_1(rtx_def*, rtx_def*)
../../../gcc/gcc/expr.cc:4587
0xc5185d emit_move_insn(rtx_def*, rtx_def*)
../../../gcc/gcc/expr.cc:4729
0xe2c214 lra_emit_move(rtx_def*, rtx_def*)
../../../gcc/gcc/lra.cc:509
0xe4438e curr_insn_transform
../../../gcc/gcc/lra-constraints.cc:4687
0xe45063 lra_constraints(bool)
../../../gcc/gcc/lra-constraints.cc:5442
0xe2e5fa lra(_IO_FILE*, int)
../../../gcc/gcc/lra.cc:2442
0xde947f do_reload
../../../gcc/gcc/ira.cc:5973
0xde947f execute
../../../gcc/gcc/ira.cc:6161
Please submit a full bug report, with preprocessed source (by using
-freport-bug).
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.
```
If we do below changes, we can fix the ICE:
```diff
diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
index 90f638d6ecd..9806ce18117 100644
--- a/gcc/config/riscv/riscv.md
+++ b/gcc/config/riscv/riscv.md
@@ -3671,7 +3671,7 @@
)
(define_insn "prefetch"
- [(prefetch (match_operand 0 "address_operand" "r")
+ [(prefetch (match_operand 0 "register_operand" "r")
(match_operand 1 "imm5_operand" "i")
(match_operand 2 "const_int_operand" "n"))]
"TARGET_ZICBOP"
@@ -3686,7 +3686,7 @@
[(set_attr "type" "store")])
(define_insn "riscv_prefetchi_<mode>"
- [(unspec_volatile:X [(match_operand:X 0 "address_operand" "r")
+ [(unspec_volatile:X [(match_operand:X 0 "register_operand" "r")
(match_operand:X 1 "imm5_operand" "i")]
UNSPECV_PREI)]
"TARGET_ZICBOP"
```