From: Pan Li <pan2...@intel.com> This patch would like to avoid the ICE when the target attribute specific the xlen different to the cmd. Aka compile with rv64gc but target attribute with rv32gcv_zbb. For example as blow:
1 │ long foo (long a, long b) 2 │ __attribute__((target("arch=rv32gcv_zbb"))); 3 │ 4 │ long foo (long a, long b) 5 │ { 6 │ return a + (b * 2); 7 │ } when compile with rv64gc -O3, it will have ICE similar as below during RTL pass: fwprop1 test.c: In function ‘foo’: test.c:10:1: internal compiler error: in add_use, at rtl-ssa/accesses.cc:1234 10 | } | ^ 0x44d6b9d internal_error(char const*, ...) /home/pli/gcc/111/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__/../gcc/diagnostic-global-context.cc:517 0x44a26a6 fancy_abort(char const*, int, char const*) /home/pli/gcc/111/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__/../gcc/diagnostic.cc:1722 0x408fac9 rtl_ssa::function_info::add_use(rtl_ssa::use_info*) /home/pli/gcc/111/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__/../gcc/rtl-ssa/accesses.cc:1234 0x40a5eea rtl_ssa::function_info::create_reg_use(rtl_ssa::function_info::build_info&, rtl_ssa::insn_info*, rtl_ssa::resource_info) /home/pli/gcc/111/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__/../gcc/rtl-ssa/insns.cc:496 0x4456738 rtl_ssa::function_info::add_artificial_accesses(rtl_ssa::function_info::build_info&, df_ref_flags) /home/pli/gcc/111/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__/../gcc/rtl-ssa/blocks.cc:900 0x4457297 rtl_ssa::function_info::start_block(rtl_ssa::function_info::build_info&, rtl_ssa::bb_info*) /home/pli/gcc/111/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__/../gcc/rtl-ssa/blocks.cc:1082 0x4453627 rtl_ssa::function_info::bb_walker::before_dom_children(basic_block_def*) /home/pli/gcc/111/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__/../gcc/rtl-ssa/blocks.cc:118 0x3e9f3fb dom_walker::walk(basic_block_def*) /home/pli/gcc/111/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__/../gcc/domwalk.cc:311 0x445806f rtl_ssa::function_info::process_all_blocks() /home/pli/gcc/111/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__/../gcc/rtl-ssa/blocks.cc:1298 0x40a22d3 rtl_ssa::function_info::function_info(function*) /home/pli/gcc/111/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__/../gcc/rtl-ssa/functions.cc:51 0x3ec3f80 fwprop_init /home/pli/gcc/111/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__/../gcc/fwprop.cc:893 0x3ec420d fwprop /home/pli/gcc/111/riscv-gnu-toolchain/gcc/__RISC-V_BUILD__/../gcc/fwprop.cc:963 0x3ec43ad execute Consider stage 4, we just report error for the above scenario when detect the cmd xlen is different to the target attribute during the target hook TARGET_OPTION_VALID_ATTRIBUTE_P implementation. PR target/118540 gcc/ChangeLog: * config/riscv/riscv-target-attr.cc (riscv_target_attr_parser::parse_arch): Report error when cmd xlen is different with target attribute. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/base/pr118540-1.c: New test. * gcc.target/riscv/rvv/base/pr118540-2.c: New test. Signed-off-by: Pan Li <pan2...@intel.com> --- gcc/config/riscv/riscv-target-attr.cc | 14 ++++++++++++++ .../gcc.target/riscv/rvv/base/pr118540-1.c | 12 ++++++++++++ .../gcc.target/riscv/rvv/base/pr118540-2.c | 12 ++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/pr118540-1.c create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/pr118540-2.c diff --git a/gcc/config/riscv/riscv-target-attr.cc b/gcc/config/riscv/riscv-target-attr.cc index 615f1b9c6ce..9ebfb65fbfc 100644 --- a/gcc/config/riscv/riscv-target-attr.cc +++ b/gcc/config/riscv/riscv-target-attr.cc @@ -100,6 +100,20 @@ riscv_target_attr_parser::parse_arch (const char *str) /* Check if it's setting full arch string. */ if (strncmp ("rv", str, strlen ("rv")) == 0) { + if (TARGET_64BIT && strncmp ("32", str + 2, strlen("32")) == 0) + { + error_at (m_loc, "unexpected arch for %<target()%> attribute: " + "must start with rv64 but found %qs", str); + goto fail; + } + + if (!TARGET_64BIT && strncmp ("64", str + 2, strlen("64")) == 0) + { + error_at (m_loc, "unexpected arch for %<target()%> attribute: " + "must start with rv32 but found %qs", str); + goto fail; + } + m_subset_list = riscv_subset_list::parse (str, m_loc); if (m_subset_list == nullptr) diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/pr118540-1.c b/gcc/testsuite/gcc.target/riscv/rvv/base/pr118540-1.c new file mode 100644 index 00000000000..0b52a7b2ab5 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/base/pr118540-1.c @@ -0,0 +1,12 @@ +/* { dg-do compile { target { rv64 } } } */ +/* { dg-options "-march=rv64gc -mabi=lp64d -O3" { target { rv64 } } } */ + +long foo (long a, long b) +__attribute__((target("arch=rv32gcv_zbb"))); + +long foo (long a, long b) +{ + return a + (b * 2); +} + +/* { dg-error "must start with rv64 but found 'rv32gcv_zbb'" "" { target { rv64 } } 0 } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/pr118540-2.c b/gcc/testsuite/gcc.target/riscv/rvv/base/pr118540-2.c new file mode 100644 index 00000000000..d7c4e00cf4d --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/base/pr118540-2.c @@ -0,0 +1,12 @@ +/* { dg-do compile { target { rv32 } } } */ +/* { dg-options "-march=rv32gc -mabi=ilp32d -O3" { target { rv32 } } } */ + +long foo (long a, long b) +__attribute__((target("arch=rv64gcv_zbb"))); + +long foo (long a, long b) +{ + return a + (b * 2); +} + +/* { dg-error "must start with rv32 but found 'rv64gcv_zbb'" "" { target { rv32 } } 0 } */ -- 2.43.0