public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Richard Biener <rguenth@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-2304] tree-optimization/73550 - more switch handling improvements for uninit Date: Wed, 31 Aug 2022 11:04:00 +0000 (GMT) [thread overview] Message-ID: <20220831110400.2B09A3839DC9@sourceware.org> (raw) https://gcc.gnu.org/g:0cf736575286f841f6144bd58b981c269652b82e commit r13-2304-g0cf736575286f841f6144bd58b981c269652b82e Author: Richard Biener <rguenther@suse.de> Date: Wed Aug 31 08:52:58 2022 +0200 tree-optimization/73550 - more switch handling improvements for uninit The following makes predicate analysis handle case labels with a non-singleton contiguous range. PR tree-optimization/73550 * gimple-predicate-analysis.cc (predicate::init_from_control_deps): Sanitize debug dumping. Handle case labels with a CASE_HIGH. (predicate::dump): Adjust for better readability. Diff: --- gcc/gimple-predicate-analysis.cc | 77 ++++++++++++++++++++++++++-------------- 1 file changed, 50 insertions(+), 27 deletions(-) diff --git a/gcc/gimple-predicate-analysis.cc b/gcc/gimple-predicate-analysis.cc index 00c6bfc50a3..6b2e347536a 100644 --- a/gcc/gimple-predicate-analysis.cc +++ b/gcc/gimple-predicate-analysis.cc @@ -1674,6 +1674,10 @@ predicate::init_from_control_deps (const vec<edge> *dep_chains, if (num_chains == 0) return; + if (DEBUG_PREDICATE_ANALYZER && dump_file) + fprintf (dump_file, "init_from_control_deps {%s}:\n", + format_edge_vecs (dep_chains, num_chains).c_str ()); + /* Convert the control dependency chain into a set of predicates. */ m_preds.reserve (num_chains); @@ -1740,7 +1744,8 @@ predicate::init_from_control_deps (const vec<edge> *dep_chains, if (DEBUG_PREDICATE_ANALYZER && dump_file) { - fprintf (dump_file, "one_pred = "); + fprintf (dump_file, "%d -> %d: one_pred = ", + e->src->index, e->dest->index); dump_pred_info (one_pred); fputc ('\n', dump_file); } @@ -1773,24 +1778,41 @@ predicate::init_from_control_deps (const vec<edge> *dep_chains, } } /* If more than one label reaches this block or the case - label doesn't have a single value (like the default one) - fail. */ - if (!l - || !CASE_LOW (l) - || (CASE_HIGH (l) - && !operand_equal_p (CASE_LOW (l), CASE_HIGH (l), 0))) + label doesn't have a contiguous range of values (like the + default one) fail. */ + if (!l || !CASE_LOW (l)) { has_valid_pred = false; break; } - - pred_info one_pred; - one_pred.pred_lhs = gimple_switch_index (gs); - one_pred.pred_rhs = CASE_LOW (l); - one_pred.cond_code = EQ_EXPR; - one_pred.invert = false; - t_chain.safe_push (one_pred); - has_valid_pred = true; + else if (!CASE_HIGH (l) + || operand_equal_p (CASE_LOW (l), CASE_HIGH (l))) + { + pred_info one_pred; + one_pred.pred_lhs = gimple_switch_index (gs); + one_pred.pred_rhs = CASE_LOW (l); + one_pred.cond_code = EQ_EXPR; + one_pred.invert = false; + t_chain.safe_push (one_pred); + has_valid_pred = true; + } + else + { + /* Support a case label with a range with + two predicates. We're overcommitting on + the MAX_CHAIN_LEN budget by at most a factor + of two here. */ + pred_info one_pred; + one_pred.pred_lhs = gimple_switch_index (gs); + one_pred.pred_rhs = CASE_LOW (l); + one_pred.cond_code = GE_EXPR; + one_pred.invert = false; + t_chain.safe_push (one_pred); + one_pred.pred_rhs = CASE_HIGH (l); + one_pred.cond_code = LE_EXPR; + t_chain.safe_push (one_pred); + has_valid_pred = true; + } } else { @@ -1803,22 +1825,24 @@ predicate::init_from_control_deps (const vec<edge> *dep_chains, if (!has_valid_pred) break; else - m_preds.safe_push (t_chain); + m_preds.quick_push (t_chain); } - if (DEBUG_PREDICATE_ANALYZER && dump_file) + if (has_valid_pred) { - fprintf (dump_file, "init_from_control_deps {%s}:\n", - format_edge_vecs (dep_chains, num_chains).c_str ()); - dump (NULL, ""); + gcc_assert (m_preds.length () != 0); + if (DEBUG_PREDICATE_ANALYZER && dump_file) + dump (NULL, ""); } - - if (has_valid_pred) - gcc_assert (m_preds.length () != 0); else - /* Clear M_PREDS to indicate failure. */ - m_preds.release (); + { + if (DEBUG_PREDICATE_ANALYZER && dump_file) + fprintf (dump_file, "\tFAILED\n"); + /* Clear M_PREDS to indicate failure. */ + m_preds.release (); + } } + /* Store a PRED in *THIS. */ void @@ -1856,9 +1880,8 @@ predicate::dump (gimple *stmt, const char *msg) const else fprintf (dump_file, "\t("); dump_pred_chain (m_preds[i]); - fputc (')', dump_file); + fprintf (dump_file, ")\n"); } - fputc ('\n', dump_file); } /* Initialize USE_PREDS with the predicates of the control dependence chains
reply other threads:[~2022-08-31 11:04 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=20220831110400.2B09A3839DC9@sourceware.org \ --to=rguenth@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).