aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPrathamesh Kulkarni <prathamesh.kulkarni@linaro.org>2020-11-24 06:50:53 +0530
committerPrathamesh Kulkarni <prathamesh.kulkarni@linaro.org>2020-11-24 06:57:46 +0530
commit5700973f4a30762b4fc21687bb5f7843e55da2e4 (patch)
treeab46cb4c3c4498841557134ca7ebb937458fc5f4 /gcc
parent6692c400f207c68fb11b44182ae127856e8b9ad3 (diff)
downloadgcc-5700973f4a30762b4fc21687bb5f7843e55da2e4.zip
gcc-5700973f4a30762b4fc21687bb5f7843e55da2e4.tar.gz
gcc-5700973f4a30762b4fc21687bb5f7843e55da2e4.tar.bz2
tree-opt: Fix segfault in tree-if-conv.c with -march=armv8.2-a+sve [PR97849]
The issue here is that rpo vn may eliminate target ssa_name referred to in redundant_ssa_names, and thus ifcvt_local_dce may replace candidate ssa_name with invalid ssa_name resulting in incorrect IR. The patch simply does ssa_name replacement before calling do_rpo_vn, which fixes the issue. gcc/ 2020-11-24 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> PR tree-optimization/97849 * tree-if-conv.c (tree_if_conversion): Move ssa_name replacement code from ifcvt_local_dce to this function before calling do_rpo_vn. gcc/testsuite/ 2020-11-24 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> PR tree-optimization/97849 * gcc.dg/tree-ssa/pr97849.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr97849.c16
-rw-r--r--gcc/tree-if-conv.c13
2 files changed, 23 insertions, 6 deletions
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr97849.c b/gcc/testsuite/gcc.dg/tree-ssa/pr97849.c
new file mode 100644
index 0000000..57a31e3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr97849.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -ftree-vectorize" } */
+/* { dg-additional-options "-march=armv8.2-a+sve" { target aarch64*-*-* } } */
+
+int a, b, c;
+
+int g() {
+ char i = 0;
+ for (c = 0; c <= 8; c++)
+ --i;
+
+ while (b) {
+ _Bool f = i <= 0;
+ a = (a == 0) ? 0 : f / a;
+ }
+}
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index 2062758..93effaa 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -2916,12 +2916,6 @@ ifcvt_local_dce (class loop *loop)
enum gimple_code code;
use_operand_p use_p;
imm_use_iterator imm_iter;
- std::pair <tree, tree> *name_pair;
- unsigned int i;
-
- FOR_EACH_VEC_ELT (redundant_ssa_names, i, name_pair)
- replace_uses_by (name_pair->first, name_pair->second);
- redundant_ssa_names.release ();
/* The loop has a single BB only. */
basic_block bb = loop->header;
@@ -3124,6 +3118,13 @@ tree_if_conversion (class loop *loop, vec<gimple *> *preds)
exit_bbs = BITMAP_ALLOC (NULL);
bitmap_set_bit (exit_bbs, single_exit (loop)->dest->index);
bitmap_set_bit (exit_bbs, loop->latch->index);
+
+ std::pair <tree, tree> *name_pair;
+ unsigned ssa_names_idx;
+ FOR_EACH_VEC_ELT (redundant_ssa_names, ssa_names_idx, name_pair)
+ replace_uses_by (name_pair->first, name_pair->second);
+ redundant_ssa_names.release ();
+
todo |= do_rpo_vn (cfun, loop_preheader_edge (loop), exit_bbs);
/* Delete dead predicate computations. */