From 5700973f4a30762b4fc21687bb5f7843e55da2e4 Mon Sep 17 00:00:00 2001 From: Prathamesh Kulkarni Date: Tue, 24 Nov 2020 06:50:53 +0530 Subject: [PATCH] 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 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 PR tree-optimization/97849 * gcc.dg/tree-ssa/pr97849.c: New test. --- gcc/testsuite/gcc.dg/tree-ssa/pr97849.c | 16 ++++++++++++++++ gcc/tree-if-conv.c | 13 +++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr97849.c 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 00000000000..57a31e316a2 --- /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 2062758f40f..93effaa811b 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 *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 *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 *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. */ -- 2.30.2