From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2064) id 70DDA3857415; Tue, 21 Jun 2022 09:29:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 70DDA3857415 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Xiong Hu Luo To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-1184] if-to-switch: Don't skip the first condition bb when find_conditions in if-to-switch [PR105740] X-Act-Checkin: gcc X-Git-Author: Xionghu Luo X-Git-Refname: refs/heads/master X-Git-Oldrev: 70454c50b4592fe6876ecca13268264e395e058f X-Git-Newrev: 57424087e82db140c06d4ea73f9700d5291c5bc2 Message-Id: <20220621092945.70DDA3857415@sourceware.org> Date: Tue, 21 Jun 2022 09:29:45 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jun 2022 09:29:45 -0000 https://gcc.gnu.org/g:57424087e82db140c06d4ea73f9700d5291c5bc2 commit r13-1184-g57424087e82db140c06d4ea73f9700d5291c5bc2 Author: Xionghu Luo Date: Thu Jun 9 15:46:30 2022 +0800 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 Diff: --- gcc/gimple-if-to-switch.cc | 4 +++- gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-11.c | 28 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc index 5dcfe5b77e0..ca276d790c3 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 00000000000..3dffee04812 --- /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" } } */