diff options
author | Juzhe-Zhong <juzhe.zhong@rivai.ai> | 2023-12-11 14:43:34 +0800 |
---|---|---|
committer | Lehua Ding <lehua.ding@rivai.ai> | 2023-12-11 15:38:23 +0800 |
commit | 330bb06485b18bae3effe83b45b97dbdcd543367 (patch) | |
tree | cd24eb425654625e90a29ab92e2272c30ca5959e /gcc | |
parent | 237951066bc52559e43e76172baa7d1dec4cee75 (diff) | |
download | gcc-330bb06485b18bae3effe83b45b97dbdcd543367.zip gcc-330bb06485b18bae3effe83b45b97dbdcd543367.tar.gz gcc-330bb06485b18bae3effe83b45b97dbdcd543367.tar.bz2 |
RISC-V: Fix ICE in extract_single_source
This patch fixes the following ICE in VSETVL PASS:
bug.c:39:1: internal compiler error: Segmentation fault
39 | }
| ^
0x1ad5a08 crash_signal
../../../../gcc/gcc/toplev.cc:316
0x7f7f55feb90f ???
./signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0
0x218d7c7 extract_single_source
../../../../gcc/gcc/config/riscv/riscv-vsetvl.cc:583
0x218d95d extract_single_source
../../../../gcc/gcc/config/riscv/riscv-vsetvl.cc:604
0x218fbc5 pre_vsetvl::compute_lcm_local_properties()
../../../../gcc/gcc/config/riscv/riscv-vsetvl.cc:2703
0x2190ef4 pre_vsetvl::earliest_fuse_vsetvl_info()
../../../../gcc/gcc/config/riscv/riscv-vsetvl.cc:2890
0x2193e62 pass_vsetvl::lazy_vsetvl()
../../../../gcc/gcc/config/riscv/riscv-vsetvl.cc:3537
0x219406a pass_vsetvl::execute(function*)
../../../../gcc/gcc/config/riscv/riscv-vsetvl.cc:3584
The rootcause we have a case that the def info can not be traced:
(insn 208 327 333 27 (use (reg/i:DI 10 a0)) "bug.c":36:1 -1
(nil))
It's obvious, we conservatively disable any optimization in this situation if
AVL def_info can not be tracded.
Committed as it is obvious.
gcc/ChangeLog:
* config/riscv/riscv-vsetvl.cc (extract_single_source): Fix ICE.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/rvv/vsetvl/avl_use_bug-1.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/riscv/riscv-vsetvl.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_use_bug-1.c | 39 |
2 files changed, 41 insertions, 0 deletions
diff --git a/gcc/config/riscv/riscv-vsetvl.cc b/gcc/config/riscv/riscv-vsetvl.cc index 90477f3..ed5a2b5 100644 --- a/gcc/config/riscv/riscv-vsetvl.cc +++ b/gcc/config/riscv/riscv-vsetvl.cc @@ -579,6 +579,8 @@ extract_single_source (set_info *set) if (!set->insn ()->is_phi ()) return nullptr; hash_set<set_info *> sets = get_all_sets (set, true, false, true); + if (sets.is_empty ()) + return nullptr; insn_info *first_insn = (*sets.begin ())->insn (); if (first_insn->is_artificial ()) diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_use_bug-1.c b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_use_bug-1.c new file mode 100644 index 0000000..330221c --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_use_bug-1.c @@ -0,0 +1,39 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv_zvl256b -mabi=lp64 --param=riscv-autovec-lmul=m8 --param=riscv-autovec-preference=fixed-vlmax -O2" } */ + +struct a_struct +{ + unsigned char a_character; +}; + +struct a_struct an_array[5]; +struct a_struct *a_ptr; +int yabba = 1; + +int +f (a, b) + unsigned char a; + unsigned long b; +{ + long i, j, p, q, r, s; + + if (b != (unsigned long) 0) + { + if (yabba) + return -1; + s = 4000000 / b; + for (i = 0; i < 11; i++) + { + for (j = 0; j < 256; j++) + { + if (((p - s < 0) ? -s : 0) < (( q - s < 0) ? -s : q)) + r = i; + } + } + } + + if (yabba) + return 0; + a_ptr = &an_array[a]; + a_ptr->a_character = (unsigned char) r; +} |