aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorXionghu Luo <xionghuluo@tencent.com>2022-06-09 15:46:30 +0800
committerXionghu Luo <xionghuluo@tencent.com>2022-06-21 17:26:45 +0800
commit57424087e82db140c06d4ea73f9700d5291c5bc2 (patch)
treed4591e9522d7914d858507e0cf678a3bc18530ab /gcc
parent70454c50b4592fe6876ecca13268264e395e058f (diff)
downloadgcc-57424087e82db140c06d4ea73f9700d5291c5bc2.zip
gcc-57424087e82db140c06d4ea73f9700d5291c5bc2.tar.gz
gcc-57424087e82db140c06d4ea73f9700d5291c5bc2.tar.bz2
if-to-switch: Don't skip the first condition bb when find_conditions in if-to-switch [PR105740]
The if condition is at last of first bb, so side effect statement in first BB doesn't matter, then the first if condition could also be folded to switch table. gcc/ChangeLog: PR target/105740 * gimple-if-to-switch.cc (find_conditions): Don't skip the first condition bb. gcc/testsuite/ChangeLog: PR target/105740 * gcc.dg/tree-ssa/if-to-switch-11.c: New test. Signed-off-by: Xionghu Luo <xionghuluo@tencent.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-if-to-switch.cc4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-11.c28
2 files changed, 31 insertions, 1 deletions
diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc
index 5dcfe5b..ca276d7 100644
--- a/gcc/gimple-if-to-switch.cc
+++ b/gcc/gimple-if-to-switch.cc
@@ -389,7 +389,9 @@ find_conditions (basic_block bb,
if (cond == NULL)
return;
- if (!no_side_effect_bb (bb))
+ /* An empty conditions_in_bbs indicates we are processing the first
+ basic-block then no need check side effect. */
+ if (!conditions_in_bbs->is_empty () && !no_side_effect_bb (bb))
return;
tree lhs = gimple_cond_lhs (cond);
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-11.c b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-11.c
new file mode 100644
index 0000000..3dffee04
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-11.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-iftoswitch-optimized" } */
+
+struct f {
+ int len;
+ int arr[4];
+};
+
+int
+test (struct f const *const f)
+{
+ if (f->arr[3] == 1) {
+ return 12;
+ } else if (f->arr[3] == 2) {
+ return 27;
+ } else if (f->arr[3] == 3) {
+ return 38;
+ } else if (f->arr[3] == 4) {
+ return 18;
+ } else if (f->arr[3] == 5) {
+ return 58;
+ } else if (f->arr[3] == 6) {
+ return 68;
+ }
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump "Canonical GIMPLE case clusters: 1 2 3 4 5 6" "iftoswitch" } } */