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

            Bug ID: 110119
           Summary: RISC-V: RVV
                    --param=riscv-autovec-preference=fixed-vlmax ICE
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: juzhe.zhong at rivai dot ai
  Target Milestone: ---

This following cases:

#include "riscv_vector.h"

typedef int8_t vnx2qi __attribute__ ((vector_size (2)));

__attribute__ ((noipa)) vnx2qi
f_vnx2qi (int8_t a, int8_t b, int8_t *out)
{
  vnx2qi v = {a, b};
  return v;
}

__attribute__ ((noipa)) vnx2qi
f_vnx2qi_2 (vnx2qi a, int8_t *out)
{
  return a;
}

__attribute__ ((noipa)) vint32m1_t
f_vint32m1 (int8_t * a, int8_t *out)
{
  vint32m1_t v = *(vint32m1_t*)a;
  return v;
}

are all causing ICE:

0x1667a6d crash_signal
        ../../../riscv-gcc/gcc/toplev.cc:314
0x10a476c hard_function_value(tree_node const*, tree_node const*, tree_node
const*, int)
        ../../../riscv-gcc/gcc/explow.cc:2258
0x116f092 aggregate_value_p(tree_node const*, tree_node const*)
        ../../../riscv-gcc/gcc/function.cc:2126
0x117938e allocate_struct_function(tree_node*, bool)
        ../../../riscv-gcc/gcc/function.cc:4831
0xd0c7b7 store_parm_decls()
        ../../../riscv-gcc/gcc/c/c-decl.cc:10743
0xd7811e c_parser_declaration_or_fndef
        ../../../riscv-gcc/gcc/c/c-parser.cc:2805
0xd75ea7 c_parser_external_declaration
        ../../../riscv-gcc/gcc/c/c-parser.cc:1925
0xd7592e c_parser_translation_unit
        ../../../riscv-gcc/gcc/c/c-parser.cc:1779
0xdc1d2b c_parse_file()
        ../../../riscv-gcc/gcc/c/c-parser.cc:24657
0xe5f20b c_common_parse_file()
        ../../../riscv-gcc/gcc/c-family/c-opts.cc:1248

The reason of this ICE is because this walkaround code:

  /* TODO: Currently, it will cause an ICE for --param
     riscv-autovec-preference=fixed-vlmax. So, we just return NULL_RTX here
     let GCC generate loads/stores. Ideally, we should either warn the user not
     to use an RVV vector type as function argument or support the calling
     convention directly.  */
  if (riscv_v_ext_mode_p (mode))
    return NULL_RTX;

in riscv_get_arg_info.

>From my experience (my local downstream GCC doesn't have such issue), I am
100% sure that such issue will be addressed when we support vector calling
convention in GCC. 

And we already have calling convention in "rvv-next" branch, there is no
difference between "rvv-next" and my internal downstream RVV GCC.

The calling convention implementation of "rvv-next" is totally same as LLVM.
However, the calling convention is not ratified yet.

I don't have time to figure out the approach without supporting calling
convention and I don't think we need this approach.

I believe we will ultimately remove this approach (without supporting calling
convention) since we will have vector calling convention.

Also, this ICE only happens when we specify
--param=riscv-autovec-preference=fixed-vlmax

Base on these circumstances, I suggest we support vector calling convention and
enable it when --param=riscv-autovec-preference=fixed-vlmax is enable.
I think such GCC internal compile option to enable vector calling convention
doesn't break the RISC-V standard.

Any suggestions?

Reply via email to