diff options
author | Richard Biener <rguenther@suse.de> | 2022-05-30 13:19:38 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2022-06-01 09:07:37 +0200 |
commit | ae575e93b6f7fb7077940cb7410f899da184ec2d (patch) | |
tree | 1916a4b8ae73c39d38f88173fb0265949d25f288 /gcc | |
parent | 820ead4519c266c83b4e3d11484a66d6691bc441 (diff) | |
download | gcc-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.c | 21 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-unswitch.cc | 3 |
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); |