public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Martin Liska <marxin@gcc.gnu.org> 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 Date: Thu, 30 Jun 2022 14:30:16 +0000 (GMT) [thread overview] Message-ID: <20220630143016.A44A2386F0E0@sourceware.org> (raw) https://gcc.gnu.org/g:9914f94f1f1475beac5a4bd4a024690a90b3fcec commit 9914f94f1f1475beac5a4bd4a024690a90b3fcec Author: Martin Liska <mliska@suse.cz> 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 | 20 +++++++++++--------- gcc/testsuite/gcc.dg/tree-ssa/pr106126.c | 12 ++++++++++++ 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc index 70daae2003c..4441206c481 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<std::pair<gphi *, tree>> 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 @@ -536,6 +534,10 @@ pass_if_to_switch::execute (function *fun) if ((*info2)->m_false_edge != e) break; + /* Only the first BB in a chain can have a side effect. */ + if (info->m_has_side_effect) + break; + chain->m_entries.safe_push (*info2); bitmap_set_bit (seen_bbs, e->src->index); 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'; +}
next reply other threads:[~2022-06-30 14:30 UTC|newest] Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-06-30 14:30 Martin Liska [this message] -- strict thread matches above, loose matches on Subject: below -- 2022-06-30 13:22 Martin Liska 2022-06-30 13:02 Martin Liska
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20220630143016.A44A2386F0E0@sourceware.org \ --to=marxin@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).