[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