From: Yuri Rumyantsev <ysrumyan@gmail.com>
To: gcc-patches <gcc-patches@gcc.gnu.org>,
Igor Zamyatin <izamyatin@gmail.com>,
Richard Biener <richard.guenther@gmail.com>
Subject: [PATCH] Simple improvement for predicate computation in if-convert phase.
Date: Thu, 16 Oct 2014 11:56:00 -0000 [thread overview]
Message-ID: <CAEoMCqSPzby6_3adNdLPkKzKy=N7_iZv_Hv9prSoYH7yE836tw@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 747 bytes --]
Hi All,
Here is a simple enhancement for predicate computation in if-convert phase:
We use notion of cd equivalence to get simpler predicate for
join block, e.g. if join block has 2 predecessors with predicates
p1 & p2 and p1 & !p2, we'd like to get p1 for it instead of
p1 & p2 | p1 & !p2.
Bootstrap and regression testing did not show any new failures.
Is it OK for trunk?
gcc/ChangeLog
2014-10-16 Yuri Rumyantsev <ysrumyan@gmail.com>
* tree-if-conv.c (add_to_predicate_list): Check unconditionally
that bb is always executed to early exit. Use predicate of
cd-equivalent block for join blocks if it exists.
(if_convertible_loop_p_1): Recompute POST_DOMINATOR tree.
(tree_if_conversion): Free post-dominance information.
[-- Attachment #2: if-conv.patch --]
[-- Type: application/octet-stream, Size: 2499 bytes --]
Index: tree-if-conv.c
===================================================================
--- tree-if-conv.c (revision 216217)
+++ tree-if-conv.c (working copy)
@@ -396,25 +396,51 @@
}
/* Add condition NC to the predicate list of basic block BB. LOOP is
- the loop to be if-converted. */
+ the loop to be if-converted. Use predicate of cd-equivalent block
+ for join bb if it exists. */
static inline void
add_to_predicate_list (struct loop *loop, basic_block bb, tree nc)
{
tree bc, *tp;
+ basic_block dom_bb;
+ static basic_block join_bb = NULL;
if (is_true_predicate (nc))
return;
- if (!is_predicated (bb))
+ /* If dominance tells us this basic block is always executed,
+ don't record any predicates for it. */
+ if (dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
+ return;
+
+ /* If predicate has been already set up for given bb using cd-equivalent
+ block predicate, simply escape. */
+ if (join_bb == bb)
+ return;
+ dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb);
+ /* We use notion of cd equivalence to get simpler predicate for
+ join block, e.g. if join block has 2 predecessors with predicates
+ p1 & p2 and p1 & !p2, we'd like to get p1 for it instead of
+ p1 & p2 | p1 & !p2. */
+ if (dom_bb != loop->header
+ && get_immediate_dominator (CDI_POST_DOMINATORS, dom_bb) == bb)
{
- /* If dominance tells us this basic block is always executed, don't
- record any predicates for it. */
- if (dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
- return;
+ gcc_assert (flow_bb_inside_loop_p (loop, dom_bb));
+ bc = bb_predicate (dom_bb);
+ gcc_assert (!is_true_predicate (bc));
+ set_bb_predicate (bb, bc);
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, "Use predicate of bb#%d for bb#%d\n",
+ dom_bb->index, bb->index);
- bc = nc;
+ /* Save bb in join_bb to not handle it once more. */
+ join_bb = bb;
+ return;
}
+
+ if (!is_predicated (bb))
+ bc = nc;
else
{
bc = bb_predicate (bb);
@@ -1176,6 +1202,7 @@
return false;
calculate_dominance_info (CDI_DOMINATORS);
+ calculate_dominance_info (CDI_POST_DOMINATORS);
/* Allow statements that can be handled during if-conversion. */
ifc_bbs = get_loop_body_in_if_conv_order (loop);
@@ -2148,6 +2175,7 @@
free (ifc_bbs);
ifc_bbs = NULL;
}
+ free_dominance_info (CDI_POST_DOMINATORS);
return todo;
}
next reply other threads:[~2014-10-16 11:52 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-16 11:56 Yuri Rumyantsev [this message]
2014-10-16 21:20 ` Jeff Law
2014-10-17 13:31 ` Yuri Rumyantsev
2014-10-24 9:17 ` Richard Biener
2014-11-18 22:53 ` H.J. Lu
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='CAEoMCqSPzby6_3adNdLPkKzKy=N7_iZv_Hv9prSoYH7yE836tw@mail.gmail.com' \
--to=ysrumyan@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=izamyatin@gmail.com \
--cc=richard.guenther@gmail.com \
/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: link
Be 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).