aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-05-30 13:19:38 +0200
committerRichard Biener <rguenther@suse.de>2022-06-01 09:07:37 +0200
commitae575e93b6f7fb7077940cb7410f899da184ec2d (patch)
tree1916a4b8ae73c39d38f88173fb0265949d25f288 /gcc
parent820ead4519c266c83b4e3d11484a66d6691bc441 (diff)
downloadgcc-ae575e93b6f7fb7077940cb7410f899da184ec2d.zip
gcc-ae575e93b6f7fb7077940cb7410f899da184ec2d.tar.gz
gcc-ae575e93b6f7fb7077940cb7410f899da184ec2d.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/pr105763.c21
-rw-r--r--gcc/tree-ssa-loop-unswitch.cc3
2 files changed, 22 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.dg/pr105763.c b/gcc/testsuite/gcc.dg/pr105763.c
new file mode 100644
index 0000000..4c76b17
--- /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 f32f1a7..a55905c 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);