From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1851) id 2D6F63842AE8; Thu, 30 Jun 2022 13:02:07 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2D6F63842AE8 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Martin Liska To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/marxin/heads/PR106126-iftoswitch-side-effects)] if-to-switch: properly allow side effects only for first condition X-Act-Checkin: gcc X-Git-Author: Martin Liska X-Git-Refname: refs/users/marxin/heads/PR106126-iftoswitch-side-effects X-Git-Oldrev: 00193676a5a3e7e50e1fa6646bb5abb5a7b2acbb X-Git-Newrev: 477b0c315f3ecc9f305030d6bf998a84519aa65c Message-Id: <20220630130207.2D6F63842AE8@sourceware.org> Date: Thu, 30 Jun 2022 13:02:07 +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: Thu, 30 Jun 2022 13:02:07 -0000 https://gcc.gnu.org/g:477b0c315f3ecc9f305030d6bf998a84519aa65c commit 477b0c315f3ecc9f305030d6bf998a84519aa65c Author: Martin Liska Date: Thu Jun 30 15:00:17 2022 +0200 if-to-switch: properly allow side effects only for first condition Properly allow side effects only for a first BB in a condition chain. PR tree-optimization/106126 gcc/ChangeLog: * gimple-if-to-switch.cc (struct condition_info): Save has_side_effect. (find_conditions): Parse all BBs. (pass_if_to_switch::execute): Allow only side effects for first BB. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/pr106126.c: New test. Diff: --- gcc/gimple-if-to-switch.cc | 21 ++++++++++++--------- gcc/testsuite/gcc.dg/tree-ssa/pr106126.c | 12 ++++++++++++ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc index 70daae2003c..87472ca98aa 100644 --- a/gcc/gimple-if-to-switch.cc +++ b/gcc/gimple-if-to-switch.cc @@ -61,9 +61,11 @@ struct condition_info { typedef auto_vec> mapping_vec; - condition_info (gcond *cond): m_cond (cond), m_bb (gimple_bb (cond)), - m_forwarder_bb (NULL), m_ranges (), m_true_edge (NULL), m_false_edge (NULL), - m_true_edge_phi_mapping (), m_false_edge_phi_mapping () + condition_info (gcond *cond, bool has_side_effect): m_cond (cond), + m_bb (gimple_bb (cond)), m_forwarder_bb (NULL), m_ranges (), + m_true_edge (NULL), m_false_edge (NULL), + m_true_edge_phi_mapping (), m_false_edge_phi_mapping (), + m_has_side_effect (has_side_effect) { m_ranges.create (0); } @@ -80,6 +82,7 @@ struct condition_info edge m_false_edge; mapping_vec m_true_edge_phi_mapping; mapping_vec m_false_edge_phi_mapping; + bool m_has_side_effect; }; /* Recond PHI mapping for an original edge E and save these into vector VEC. */ @@ -389,16 +392,11 @@ find_conditions (basic_block bb, if (cond == NULL) return; - /* 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); tree rhs = gimple_cond_rhs (cond); tree_code code = gimple_cond_code (cond); - condition_info *info = new condition_info (cond); + condition_info *info = new condition_info (cond, !no_side_effect_bb (bb)); gassign *def; if (code == NE_EXPR @@ -538,6 +536,11 @@ pass_if_to_switch::execute (function *fun) chain->m_entries.safe_push (*info2); bitmap_set_bit (seen_bbs, e->src->index); + + /* Only the first BB in a chain can have a side effect. */ + if (info->m_has_side_effect) + break; + info = *info2; } diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr106126.c b/gcc/testsuite/gcc.dg/tree-ssa/pr106126.c new file mode 100644 index 00000000000..2f0fd44164b --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr106126.c @@ -0,0 +1,12 @@ +/* PR tree-optimization/106126 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +char *var_1; +void pool_conda_matchspec() { + for (; var_1 && *var_1 && + *var_1 != '<' && *var_1 != '>' && + *var_1 != '!' && *var_1 != '~';) + if (*var_1 >= 'A' && *var_1 <= 'Z') + *var_1 += 'A'; +}