https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116591

            Bug ID: 116591
           Summary: internal compiler error: in to_constant or
                    extract_insn when compiling for risc-v xtheadvector
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: shuizhuyuanluo at gmail dot com
  Target Milestone: ---

./riscv64-unknown-linux-gnu-g++ -c test3.c -o test3.o
-march=rv64gc_zfh_xtheadvector -O3
test3.c: In function 'void transpose4x4_ps(vfloat32m1_t&, vfloat32m1_t&,
vfloat32m1_t&, vfloat32m1_t&, size_t)':
test3.c:7:20: internal compiler error: in to_constant, at poly-int.h:592
    7 |     vfloat32m1x4_t _r = vfloat32m1x4_t();// FIXME
      |                    ^~
0x3248645 internal_error(char const*, ...)
        ../.././gcc/gcc/diagnostic-global-context.cc:492
0xe28c92 fancy_abort(char const*, int, char const*)
        ../.././gcc/gcc/diagnostic.cc:1658
0xb7318d poly_int<2u, unsigned long>::to_constant() const
        ../.././gcc/gcc/poly-int.h:592
0xb7318d categorize_ctor_elements_1
        ../.././gcc/gcc/expr.cc:7186
0x132c7a6 categorize_ctor_elements_1
        ../.././gcc/gcc/expr.cc:7139
0x143e177 gimplify_init_constructor
        ../.././gcc/gcc/gimplify.cc:5590
0x143f81d gimplify_modify_expr_rhs
        ../.././gcc/gcc/gimplify.cc:6089
0x143faac gimplify_modify_expr
        ../.././gcc/gcc/gimplify.cc:6479
0x142fa1f gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*),
int)
        ../.././gcc/gcc/gimplify.cc:18114
0x14329fa gimplify_stmt(tree_node**, gimple**)
        ../.././gcc/gcc/gimplify.cc:7646
0x143946a gimplify_and_add(tree_node*, gimple**)
        ../.././gcc/gcc/gimplify.cc:516
0x143946a gimplify_decl_expr
        ../.././gcc/gcc/gimplify.cc:2167
0x14301d2 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*),
int)
        ../.././gcc/gcc/gimplify.cc:18311
0x14329fa gimplify_stmt(tree_node**, gimple**)
        ../.././gcc/gcc/gimplify.cc:7646
0x142ff00 gimplify_cleanup_point_expr
        ../.././gcc/gcc/gimplify.cc:7384
0x142ff00 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*),
int)
        ../.././gcc/gcc/gimplify.cc:18513
0x14329fa gimplify_stmt(tree_node**, gimple**)
        ../.././gcc/gcc/gimplify.cc:7646
0x1430343 gimplify_statement_list
        ../.././gcc/gcc/gimplify.cc:2250
0x1430343 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*),
int)
        ../.././gcc/gcc/gimplify.cc:18565
0x14329fa gimplify_stmt(tree_node**, gimple**)
        ../.././gcc/gcc/gimplify.cc:7646
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.




OK, if we change ```vfloat32m1x4_t _r = vfloat32m1x4_t();``` to
```vfloat32m1x4_t _r;```
test3.c: In function 'void transpose4x4_ps(vfloat32m1_t&, vfloat32m1_t&,
vfloat32m1_t&, vfloat32m1_t&, size_t)':
test3.c:20:1: error: unrecognizable insn:
   20 | }
      | ^
(insn 35 34 36 2 (set (subreg:RVVM1SF (reg/v:RVVM1x4SF 142 [ _r ]) 0)
        (unspec:RVVM1SF [
                (const_vector:RVVM1SF repeat [
                        (const_double:SF 0.0 [0x0.0p+0])
                    ])
                (reg:DI 0 zero)
                (const_int 1 [0x1])
                (reg:SI 66 vl)
                (reg:SI 67 vtype)
            ] UNSPEC_TH_VWLDST)) -1
     (nil))
during RTL pass: mode_sw
test3.c:20:1: internal compiler error: in extract_insn, at recog.cc:2882
0x3248645 internal_error(char const*, ...)
        ../.././gcc/gcc/diagnostic-global-context.cc:492
0xe28c92 fancy_abort(char const*, int, char const*)
        ../.././gcc/gcc/diagnostic.cc:1658
0xc01cdf _fatal_insn(char const*, rtx_def const*, char const*, int, char
const*)
        ../.././gcc/gcc/rtl-error.cc:108
0xc01d01 _fatal_insn_not_found(rtx_def const*, char const*, int, char const*)
        ../.././gcc/gcc/rtl-error.cc:116
0xc00205 extract_insn(rtx_insn*)
        ../.././gcc/gcc/recog.cc:2882
0x1bcbf44 asm_insn_p
        ../.././gcc/gcc/config/riscv/riscv.cc:11512
0x1bcbf44 vxrm_unknown_p
        ../.././gcc/gcc/config/riscv/riscv.cc:11533
0x1bcbf44 riscv_vxrm_mode_after
        ../.././gcc/gcc/config/riscv/riscv.cc:11556
0x1bcbf44 riscv_mode_after
        ../.././gcc/gcc/config/riscv/riscv.cc:11598
0x2caa35e optimize_mode_switching
        ../.././gcc/gcc/mode-switching.cc:987
0x2caa35e execute
        ../.././gcc/gcc/mode-switching.cc:1324
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.



$ ./riscv64-unknown-linux-gnu-g++ -v
Using built-in specs.
COLLECT_GCC=./riscv64-unknown-linux-gnu-g++
COLLECT_LTO_WRAPPER=/data/action/osd/riscv/libexec/gcc/riscv64-unknown-linux-gnu/15.0.0/lto-wrapper
Target: riscv64-unknown-linux-gnu
Configured with: /data/action/osd/riscv-gnu-toolchain/gcc/configure
--target=riscv64-unknown-linux-gnu --prefix=/data/action/osd/riscv
--with-sysroot=/data/action/osd/riscv/sysroot --with-pkgversion=g155da081706
--with-system-zlib --enable-shared --enable-tls
--enable-languages=c,c++,fortran --disable-libmudflap --disable-libssp
--disable-libquadmath --disable-libsanitizer --disable-nls --disable-bootstrap
--src=.././gcc --disable-default-pie --disable-multilib --with-abi=lp64d
--with-arch=rv64imafdc --with-tune=rocket --with-isa-spec=20191213
'CFLAGS_FOR_TARGET=-O2    -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2   
-mcmodel=medlow'
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 15.0.0 20240829 (experimental) (g155da081706) 


------------- soucecode -------------


#include <riscv_vector.h>

void transpose4x4_ps(vfloat32m1_t& _r0, vfloat32m1_t& _r1, vfloat32m1_t& _r2,
vfloat32m1_t& _r3, size_t vl)
{
    float tmp[16];

    vfloat32m1x4_t _r;// = vfloat32m1x4_t();// FIXME
    _r = __riscv_vset_v_f32m1_f32m1x4(_r, 0, _r0);
    _r = __riscv_vset_v_f32m1_f32m1x4(_r, 1, _r1);
    _r = __riscv_vset_v_f32m1_f32m1x4(_r, 2, _r2);
    _r = __riscv_vset_v_f32m1_f32m1x4(_r, 3, _r3);

    __riscv_vsseg4e32_v_f32m1x4(&tmp[0], _r, vl);

    float* ptr = (float*)tmp;
    _r0 = __riscv_vle32_v_f32m1(ptr + 0 * 4, vl);
    _r1 = __riscv_vle32_v_f32m1(ptr + 1 * 4, vl);
    _r2 = __riscv_vle32_v_f32m1(ptr + 2 * 4, vl);
    _r3 = __riscv_vle32_v_f32m1(ptr + 3 * 4, vl);
}

Reply via email to