[gcc r14-6738] RISC-V: Fix ICE of moving SUBREG of vector mode to DImode scalar register on RV32 system.
Pan Li
panli@gcc.gnu.org
Wed Dec 20 08:58:54 GMT 2023
https://gcc.gnu.org/g:1190de7ef8be629f9390ddbb69b01bd8ead43a57
commit r14-6738-g1190de7ef8be629f9390ddbb69b01bd8ead43a57
Author: Juzhe-Zhong <juzhe.zhong@rivai.ai>
Date: Wed Dec 20 16:20:40 2023 +0800
RISC-V: Fix ICE of moving SUBREG of vector mode to DImode scalar register on RV32 system.
This patch fixes following ICE on full coverage testing of RV32.
Running target riscv-sim/-march=rv32gc_zve32f/-mabi=ilp32d/-mcmodel=medlow/--param=riscv-autovec-lmul=dynamic
FAIL: gcc.c-torture/compile/930120-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
Running target riscv-sim/-march=rv32gc_zve32f/-mabi=ilp32d/-mcmodel=medlow/--param=riscv-autovec-lmul=dynamic/--param=riscv-autovec-preference=fixed-vlmax
FAIL: gcc.c-torture/compile/930120-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
Running target riscv-sim/-march=rv32gc_zve32f/-mabi=ilp32d/-mcmodel=medlow/--param=riscv-autovec-lmul=m2
FAIL: gcc.c-torture/compile/930120-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/pr89369.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/pr89369.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
Running target riscv-sim/-march=rv32gc_zve32f/-mabi=ilp32d/-mcmodel=medlow/--param=riscv-autovec-lmul=m2/--param=riscv-autovec-preference=fixed-vlmax
FAIL: gcc.c-torture/compile/930120-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/pr89369.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/pr89369.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
Running target riscv-sim/-march=rv32gc_zve32f/-mabi=ilp32d/-mcmodel=medlow/--param=riscv-autovec-lmul=m4
FAIL: gcc.c-torture/compile/930120-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
Running target riscv-sim/-march=rv32gc_zve32f/-mabi=ilp32d/-mcmodel=medlow/--param=riscv-autovec-lmul=m4/--param=riscv-autovec-preference=fixed-vlmax
FAIL: gcc.c-torture/compile/930120-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
Running target riscv-sim/-march=rv32gc_zve32f/-mabi=ilp32d/-mcmodel=medlow/--param=riscv-autovec-lmul=m8
FAIL: gcc.c-torture/compile/930120-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
Running target riscv-sim/-march=rv32gc_zve32f/-mabi=ilp32d/-mcmodel=medlow/--param=riscv-autovec-lmul=m8/--param=riscv-autovec-preference=fixed-vlmax
FAIL: gcc.c-torture/compile/930120-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/930120-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/compile/pr42196-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/bswap-1.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
Running target riscv-sim/-march=rv32gc_zve32f/-mabi=ilp32d/-mcmodel=medlow/--param=riscv-autovec-preference=fixed-vlmax
FAIL: gcc.c-torture/execute/20050316-2.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-2.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O1 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O2 (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -O3 -g (internal compiler error: in emit_move_insn, at expr.cc:4606)
FAIL: gcc.c-torture/execute/20050316-3.c -Os (internal compiler error: in emit_move_insn, at expr.cc:4606)
These ICEs happens on:
Move (subreg:DI (reg:RVVM2SI 141) 0) to (reg/v:DI 135 [ u ]) on RV32 system.
Before this patch:
bug.c:24:11: internal compiler error: in emit_move_insn, at expr.cc:4607
24 | r = bar (u);
| ^~~~~~~
0x12bd034 emit_move_insn(rtx_def*, rtx_def*)
../../../../gcc/gcc/expr.cc:4606
0x1c98001 riscv_legitimize_move(machine_mode, rtx_def*, rtx_def*)
../../../../gcc/gcc/config/riscv/riscv.cc:2703
0x24ed627 gen_movdi(rtx_def*, rtx_def*)
../../../../gcc/gcc/config/riscv/riscv.md:2105
0x10dca22 rtx_insn* insn_gen_fn::operator()<rtx_def*, rtx_def*>(rtx_def*, rtx_def*) const
../../../../gcc/gcc/recog.h:441
0x12bcb01 emit_move_insn_1(rtx_def*, rtx_def*)
../../../../gcc/gcc/expr.cc:4551
0x12bd91a emit_move_insn(rtx_def*, rtx_def*)
../../../../gcc/gcc/expr.cc:4721
0x128e077 store_bit_field_1
../../../../gcc/gcc/expmed.cc:808
0x1290016 store_bit_field(rtx_def*, poly_int<2u, unsigned long>, poly_int<2u, unsigned long>, poly_int<2u, unsigned long>, poly_int<2u, unsigned long>, machine_mode, rtx_def*, bool, bool)
../../../../gcc/gcc/expmed.cc:1194
0x12cb40b store_field
../../../../gcc/gcc/expr.cc:8230
0x12c4426 expand_assignment(tree_node*, tree_node*, bool)
../../../../gcc/gcc/expr.cc:6290
0x111032f expand_gimple_stmt_1
../../../../gcc/gcc/cfgexpand.cc:3966
0x11106ed expand_gimple_stmt
../../../../gcc/gcc/cfgexpand.cc:4064
0x1118d72 expand_gimple_basic_block
../../../../gcc/gcc/cfgexpand.cc:6120
0x111aa2c execute
../../../../gcc/gcc/cfgexpand.cc:6855
The solution is quite simple, we just need to extract index = 1 element to the highpart of the DImode register on RV32 system
since DImode register consists of 2 scalar registers.
After this patch:
vsetivli zero,2,e32,m2,ta,ma
vle32.v v2,0(a0)
vslidedown.vi v4,v2,1
vmv.x.s a0,v2
vmv.x.s a1,v4
ret
Tested on full coverage testing of both RV32 and RV64 no regression.
Committed as it is an obvious bug fix.
gcc/ChangeLog:
* config/riscv/riscv.cc (riscv_legitimize_move): Fix ICE.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/rvv/autovec/bug-8.c: New test.
Diff:
---
gcc/config/riscv/riscv.cc | 24 +++++++++++------
gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-8.c | 31 ++++++++++++++++++++++
2 files changed, 47 insertions(+), 8 deletions(-)
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 8ae65760b6e..d9b45f17a1b 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -2693,14 +2693,22 @@ riscv_legitimize_move (machine_mode mode, rtx dest, rtx src)
if (i == 1)
{
- rtx tmp = expand_binop (Pmode, ashl_optab,
- gen_lowpart (Pmode, result),
- gen_int_mode (32, Pmode), NULL_RTX, 0,
- OPTAB_DIRECT);
- rtx tmp2 = expand_binop (Pmode, ior_optab, tmp, int_reg,
- NULL_RTX, 0,
- OPTAB_DIRECT);
- emit_move_insn (int_reg, tmp2);
+ if (UNITS_PER_WORD < mode_size)
+ /* If Pmode = SImode and mode = DImode, we just need to
+ extract element of index = 1 from the vector and move it
+ into the highpart of the DEST since DEST consists of 2
+ scalar registers. */
+ emit_move_insn (gen_highpart (smode, int_reg), result);
+ else
+ {
+ rtx tmp = expand_binop (Pmode, ashl_optab,
+ gen_lowpart (Pmode, result),
+ gen_int_mode (32, Pmode),
+ NULL_RTX, 0, OPTAB_DIRECT);
+ rtx tmp2 = expand_binop (Pmode, ior_optab, tmp, int_reg,
+ NULL_RTX, 0, OPTAB_DIRECT);
+ emit_move_insn (int_reg, tmp2);
+ }
}
}
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-8.c
new file mode 100644
index 00000000000..07b7e1669fe
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/bug-8.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32gc_zve32f -mabi=ilp32d -O3 --param=riscv-autovec-lmul=m2 --param=riscv-autovec-preference=fixed-vlmax" } */
+
+union U
+{
+ double d;
+ __complex__ int c;
+};
+
+double gd;
+extern double bar (union U);
+
+double foo (int b, double d, int c1, int c2)
+{
+ union U u;
+ double r;
+
+ if (b)
+ {
+ u.d = d;
+ r = u.d;
+ }
+ else
+ {
+ __real__ u.c = c1;
+ __imag__ u.c = c2;
+ r = bar (u);
+ }
+
+ return r;
+}
More information about the Gcc-cvs
mailing list