From ae575e93b6f7fb7077940cb7410f899da184ec2d Mon Sep 17 00:00:00 2001 From: Richard Biener <rguenther@suse.de> Date: Mon, 30 May 2022 13:19:38 +0200 Subject: [PATCH] tree-optimization/105763 - avoid abnormals with ranger queries In unswitching we use ranger to simplify switch statements so we have to avoid doing anything for abnormals. 2022-05-30 Richard Biener <rguenther@suse.de> PR tree-optimization/105763 * tree-ssa-loop-unswitch.cc (find_unswitching_predicates_for_bb): Check gimple_range_ssa_p. * gcc.dg/pr105763.c: New testcase. --- gcc/testsuite/gcc.dg/pr105763.c | 21 +++++++++++++++++++++ gcc/tree-ssa-loop-unswitch.cc | 3 +-- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr105763.c diff --git a/gcc/testsuite/gcc.dg/pr105763.c b/gcc/testsuite/gcc.dg/pr105763.c new file mode 100644 index 000000000000..4c76b17e73d6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr105763.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +int rl2_decode_png_bit_depth; +int *rl2_decode_png_p_data; +void png_destroy_read_struct (); +int __attribute__((returns_twice)) _setjmp (); +void rl2_decode_png_row_pointers() +{ + unsigned sample_type = 0; + _setjmp(); + switch (rl2_decode_png_bit_depth) + case 6: + sample_type = 7; + png_destroy_read_struct(); + for (;;) + switch (sample_type) + case 3: + case 5: + *rl2_decode_png_p_data; +} diff --git a/gcc/tree-ssa-loop-unswitch.cc b/gcc/tree-ssa-loop-unswitch.cc index f32f1a78f00f..a55905c2c68a 100644 --- a/gcc/tree-ssa-loop-unswitch.cc +++ b/gcc/tree-ssa-loop-unswitch.cc @@ -494,8 +494,7 @@ find_unswitching_predicates_for_bb (basic_block bb, class loop *loop, { unsigned nlabels = gimple_switch_num_labels (stmt); tree idx = gimple_switch_index (stmt); - if (TREE_CODE (idx) != SSA_NAME - || nlabels < 1) + if (!gimple_range_ssa_p (idx) || nlabels < 1) return; /* Index must be invariant. */ def = SSA_NAME_DEF_STMT (idx); -- GitLab