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/devel/loop-unswitch-support-switches] Skip checking for ignored edges in find_unswitching_predicates_for_bb. Date: Thu, 13 Jan 2022 15:58:49 +0000 (GMT) [thread overview] Message-ID: <20220113155849.D0BC139518AF@sourceware.org> (raw) https://gcc.gnu.org/g:1fb345c4edd8bd0f5247122c9cd25f419736fc63 commit 1fb345c4edd8bd0f5247122c9cd25f419736fc63 Author: Martin Liska <mliska@suse.cz> Date: Fri Jan 7 10:49:06 2022 +0100 Skip checking for ignored edges in find_unswitching_predicates_for_bb. The discovery happens before propagation. Diff: --- gcc/tree-ssa-loop-unswitch.c | 100 ++++++++++++++++++++----------------------- 1 file changed, 46 insertions(+), 54 deletions(-) diff --git a/gcc/tree-ssa-loop-unswitch.c b/gcc/tree-ssa-loop-unswitch.c index 4614664348b..1ed18154339 100644 --- a/gcc/tree-ssa-loop-unswitch.c +++ b/gcc/tree-ssa-loop-unswitch.c @@ -147,8 +147,7 @@ static bool tree_unswitch_single_loop (class loop *, int, const auto_edge_flag &ignored_edge_flag); static void find_unswitching_predicates_for_bb (basic_block bb, class loop *loop, - vec<unswitch_predicate *> &candidates, - const auto_edge_flag &ignored_edge_flag); + vec<unswitch_predicate *> &candidates); static bool tree_unswitch_outer_loop (class loop *); static edge find_loop_guard (class loop *); static bool empty_bb_without_guard_p (class loop *, basic_block); @@ -180,8 +179,7 @@ set_predicates_for_bb (basic_block bb, vec<unswitch_predicate *> predicates) Return total number of instructions in the loop. */ static unsigned -init_loop_unswitch_info (class loop *loop, - const auto_edge_flag &ignored_edge_flag) +init_loop_unswitch_info (class loop *loop) { unsigned total_insns = 0; @@ -204,8 +202,7 @@ init_loop_unswitch_info (class loop *loop, /* Find a bb to unswitch on. */ vec<unswitch_predicate *> candidates; candidates.create (1); - find_unswitching_predicates_for_bb (bbs[i], loop, candidates, - ignored_edge_flag); + find_unswitching_predicates_for_bb (bbs[i], loop, candidates); if (!candidates.is_empty ()) set_predicates_for_bb (bbs[i], candidates); else @@ -242,8 +239,7 @@ tree_ssa_unswitch_loops (void) /* Unswitch innermost loop. */ unsigned int budget - = (init_loop_unswitch_info (loop, ignored_edge_flag) - + param_max_unswitch_insns); + = (init_loop_unswitch_info (loop) + param_max_unswitch_insns); predicate_vector predicate_path; predicate_path.create (8); @@ -357,8 +353,7 @@ is_maybe_undefined (const tree name, gimple *stmt, class loop *loop) static void find_unswitching_predicates_for_bb (basic_block bb, class loop *loop, - vec<unswitch_predicate *> &candidates, - const auto_edge_flag &ignored_edge_flag) + vec<unswitch_predicate *> &candidates) { gimple *last, *def; tree cond, use; @@ -438,56 +433,53 @@ find_unswitching_predicates_for_bb (basic_block bb, class loop *loop, unsigned edge_index = 0; FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs) { - if (!(e->flags & ignored_edge_flag)) + /* Build compound expression for all cases leading + to this edge. */ + tree expr = NULL_TREE; + for (unsigned i = 1; i < gimple_switch_num_labels (stmt); ++i) { - /* Build compound expression for all cases leading - to this edge. */ - tree expr = NULL_TREE; - for (unsigned i = 1; i < gimple_switch_num_labels (stmt); ++i) + tree lab = gimple_switch_label (stmt, i); + basic_block dest = label_to_block (cfun, CASE_LABEL (lab)); + edge e2 = find_edge (gimple_bb (stmt), dest); + if (e != e2) + continue; + + tree cmp; + if (CASE_HIGH (lab) != NULL_TREE) { - tree lab = gimple_switch_label (stmt, i); - basic_block dest = label_to_block (cfun, CASE_LABEL (lab)); - edge e2 = find_edge (gimple_bb (stmt), dest); - if (e != e2) - continue; - - tree cmp; - if (CASE_HIGH (lab) != NULL_TREE) - { - tree cmp1 = build2 (GE_EXPR, boolean_type_node, idx, - CASE_LOW (lab)); - tree cmp2 = build2 (LE_EXPR, boolean_type_node, idx, - CASE_HIGH (lab)); - cmp = fold_build2 (BIT_AND_EXPR, boolean_type_node, cmp1, - cmp2); - } - else - cmp = fold_build2 (EQ_EXPR, boolean_type_node, idx, - CASE_LOW (lab)); - - /* Combine the expression with the existing one. */ - if (expr == NULL_TREE) - expr = cmp; - else - expr = fold_build2 (BIT_IOR_EXPR, boolean_type_node, expr, - cmp); + tree cmp1 = build2 (GE_EXPR, boolean_type_node, idx, + CASE_LOW (lab)); + tree cmp2 = build2 (LE_EXPR, boolean_type_node, idx, + CASE_HIGH (lab)); + cmp = fold_build2 (BIT_AND_EXPR, boolean_type_node, cmp1, + cmp2); } + else + cmp = fold_build2 (EQ_EXPR, boolean_type_node, idx, + CASE_LOW (lab)); - if (expr != NULL_TREE) + /* Combine the expression with the existing one. */ + if (expr == NULL_TREE) + expr = cmp; + else + expr = fold_build2 (BIT_IOR_EXPR, boolean_type_node, expr, + cmp); + } + + if (expr != NULL_TREE) + { + unswitch_predicate *predicate + = new unswitch_predicate (expr, idx, edge_index); + if (!ranger->gori ().outgoing_edge_range_p (predicate->true_range, e, + idx, *get_global_range_query ())) { - unswitch_predicate *predicate - = new unswitch_predicate (expr, idx, edge_index); - if (!ranger->gori ().outgoing_edge_range_p (predicate->true_range, e, - idx, *get_global_range_query ())) - { - /* Huge switches are not supported by Ranger. */ - delete predicate; - return; - } - predicate->init_false_edge (); - - candidates.safe_push (predicate); + /* Huge switches are not supported by Ranger. */ + delete predicate; + return; } + predicate->init_false_edge (); + + candidates.safe_push (predicate); } edge_index++; }
reply other threads:[~2022-01-13 15:58 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=20220113155849.D0BC139518AF@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).