diff options
author | Juzhe-Zhong <juzhe.zhong@rivai.ai> | 2023-09-06 22:28:03 +0800 |
---|---|---|
committer | Pan Li <pan2.li@intel.com> | 2023-09-06 22:31:10 +0800 |
commit | 6b96de22d6bcadb45530c1898b264e4738afa4fd (patch) | |
tree | 7c207f438429dc230b6583f1b0821cebc7be957b | |
parent | 1b4c70d4271a00514ae20970d483c3b78d9d66ef (diff) | |
download | gcc-6b96de22d6bcadb45530c1898b264e4738afa4fd.zip gcc-6b96de22d6bcadb45530c1898b264e4738afa4fd.tar.gz gcc-6b96de22d6bcadb45530c1898b264e4738afa4fd.tar.bz2 |
RISC-V: Fix incorrect mode tieable which cause ICE in RA[PR111296]
This patch fix incorrect mode tieable between DI and V2SI which cause ICE
in RA.
gcc/ChangeLog:
PR target/111296
* config/riscv/riscv.cc (riscv_modes_tieable_p): Fix incorrect mode
tieable for RVV modes.
gcc/testsuite/ChangeLog:
PR target/111296
* g++.target/riscv/rvv/base/pr111296.C: New test.
-rw-r--r-- | gcc/config/riscv/riscv.cc | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.target/riscv/rvv/base/pr111296.C | 18 |
2 files changed, 23 insertions, 0 deletions
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 228515a..a3d3389 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -7648,6 +7648,11 @@ riscv_hard_regno_mode_ok (unsigned int regno, machine_mode mode) static bool riscv_modes_tieable_p (machine_mode mode1, machine_mode mode2) { + /* We don't allow different REG_CLASS modes tieable since it + will cause ICE in register allocation (RA). + E.g. V2SI and DI are not tieable. */ + if (riscv_v_ext_mode_p (mode1) != riscv_v_ext_mode_p (mode2)) + return false; return (mode1 == mode2 || !(GET_MODE_CLASS (mode1) == MODE_FLOAT && GET_MODE_CLASS (mode2) == MODE_FLOAT)); diff --git a/gcc/testsuite/g++.target/riscv/rvv/base/pr111296.C b/gcc/testsuite/g++.target/riscv/rvv/base/pr111296.C new file mode 100644 index 0000000..6eb14fd --- /dev/null +++ b/gcc/testsuite/g++.target/riscv/rvv/base/pr111296.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c++03 -march=rv64gcv -mabi=lp64d -Ofast -ftree-vectorize --param=riscv-autovec-preference=scalable" } */ + +struct a +{ + int b; + int c; +}; +int d; +a +e () +{ + a f; + int g = d - 1, h = d / 2 - 1; + f.b = g; + f.c = h; + return f; +} |