From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1666) id 2B09A3839DC9; Wed, 31 Aug 2022 11:04:00 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2B09A3839DC9 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1661943840; bh=3IR9T9Y79m7ov7kRWMovF79cW6OmRTO7Qzhxh2G9hKA=; h=From:To:Subject:Date:From; b=Pn/g9qla2Ae7Dt2h59aTg5/YJicwkGfJjbUEc+YxGdlzFZbhR8nR/LsSuZuwREGoY PazQXeWrPmQI7CNXudCARqWh1IUxbwTu3++muXX1wrK14E5l6Xi6vgmse+1VEa3g1s k1YYAAWKtX8MgrgpP5iH9yS+oQdVFQZPmR93xAzk= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Richard Biener To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-2304] tree-optimization/73550 - more switch handling improvements for uninit X-Act-Checkin: gcc X-Git-Author: Richard Biener X-Git-Refname: refs/heads/master X-Git-Oldrev: b911ca4231a366ddfd026f190b126bd517f4e640 X-Git-Newrev: 0cf736575286f841f6144bd58b981c269652b82e Message-Id: <20220831110400.2B09A3839DC9@sourceware.org> Date: Wed, 31 Aug 2022 11:04:00 +0000 (GMT) List-Id: https://gcc.gnu.org/g:0cf736575286f841f6144bd58b981c269652b82e commit r13-2304-g0cf736575286f841f6144bd58b981c269652b82e Author: Richard Biener 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 *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 *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 *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 *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