From: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
To: Christopher Li <sparse@chrisli.org>
Cc: linux-sparse@vger.kernel.org,
Michael Stefaniuc <mstefani@mykolab.com>,
Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Subject: [PATCH v3 3/7] fix BB dependencies on phi-nodes
Date: Mon, 31 Jul 2017 22:36:20 +0200 [thread overview]
Message-ID: <20170731203624.58971-4-luc.vanoostenryck@gmail.com> (raw)
In-Reply-To: <20170731203624.58971-1-luc.vanoostenryck@gmail.com>
Simplification of BBs (via try_to_siplify_bb() or
simplify_branch_branch()) can only be done under
some conditions:
- the removed/bypassed BB is free of side-effects
- the removed/bypassed BB doesn't define some pseudos
needed later.
This last check is efficiently done by bb_depends_on()
using liveness info. However, there is no liveness
done on OP_PHI thus the dependencies involving OP_PHI
are missing, resulting in illegal simplifications.
Fix this by explicitly adding the missing dependencies.
Supersedes: 852801f8b966407544326cd1c485f9bc7681a2e6
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
flow.c | 31 +++++++++++++++----------------
1 file changed, 15 insertions(+), 16 deletions(-)
diff --git a/flow.c b/flow.c
index 536bf257f..23fa7c21b 100644
--- a/flow.c
+++ b/flow.c
@@ -81,26 +81,23 @@ static int bb_depends_on(struct basic_block *target, struct basic_block *src)
}
/*
- * This is only to be used by try_to_simplify_bb().
- * It really should be handled by bb_depends_on(), only
- * that there is no liveness done on OP_PHI/OP_PHISRC.
- * So we consider for now that if there is an OP_PHI
- * then some block in fact depends on this one.
- * The OP_PHI controling the conditional branch of this bb
- * is excluded since the branch will be removed.
+ * This really should be handled by bb_depends_on()
+ * which efficiently check the dependence using the
+ * defines - needs liveness info. Problem is that
+ * there is no liveness done on OP_PHI & OP_PHISRC.
+ *
+ * This function add the missing dependency checks.
*/
-static int bb_defines_phi(struct basic_block *bb, struct instruction *def)
+static int bb_depends_on_phi(struct basic_block *target, struct basic_block *src)
{
struct instruction *insn;
- FOR_EACH_PTR(bb->insns, insn) {
- switch (insn->opcode) {
- case OP_PHI:
- if (def && insn != def)
- return 1;
+ FOR_EACH_PTR(src->insns, insn) {
+ if (!insn->bb)
continue;
- default:
+ if (insn->opcode != OP_PHI)
continue;
- }
+ if (pseudo_in_list(target->needs, insn->target))
+ return 1;
} END_FOR_EACH_PTR(insn);
return 0;
}
@@ -153,7 +150,7 @@ static int try_to_simplify_bb(struct basic_block *bb, struct instruction *first,
target = true ? second->bb_true : second->bb_false;
if (bb_depends_on(target, bb))
continue;
- if (bb_defines_phi(bb, first))
+ if (bb_depends_on_phi(target, bb))
continue;
changed |= rewrite_branch(source, &br->bb_true, bb, target);
changed |= rewrite_branch(source, &br->bb_false, bb, target);
@@ -224,6 +221,8 @@ static int simplify_branch_branch(struct basic_block *bb, struct instruction *br
goto try_to_rewrite_target;
if (bb_depends_on(final, target))
goto try_to_rewrite_target;
+ if (bb_depends_on_phi(final, target))
+ return 0;
return rewrite_branch(bb, target_p, target, final);
try_to_rewrite_target:
--
2.13.2
next prev parent reply other threads:[~2017-07-31 20:36 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-31 20:36 [PATCH v3 0/7] fixes for rare issues Luc Van Oostenryck
2017-07-31 20:36 ` [PATCH v3 1/7] fix ptrlist corruption while killing unreachable BBs Luc Van Oostenryck
2017-07-31 21:41 ` Christopher Li
2017-07-31 22:10 ` Luc Van Oostenryck
2017-07-31 20:36 ` [PATCH v3 2/7] fix infinite simplification loops Luc Van Oostenryck
2017-07-31 20:36 ` Luc Van Oostenryck [this message]
2017-07-31 20:36 ` [PATCH v3 4/7] fix crash when ep->active is NULL Luc Van Oostenryck
2017-07-31 20:36 ` [PATCH v3 5/7] fix crash in rewrite_branch() Luc Van Oostenryck
2017-07-31 20:36 ` [PATCH v3 6/7] fix some crashes in add_dominators() Luc Van Oostenryck
2017-07-31 20:36 ` [PATCH v3 7/7] fix crash with sym->bb_target == NULL Luc Van Oostenryck
2017-07-31 21:01 ` [PATCH v3 0/7] fixes for rare issues Christopher Li
2017-07-31 21:54 ` Luc Van Oostenryck
2017-07-31 22:34 ` Luc Van Oostenryck
2017-07-31 22:42 ` Luc Van Oostenryck
2017-08-01 20:46 ` Luc Van Oostenryck
2017-08-01 21:49 ` Christopher Li
2017-08-01 22:10 ` Luc Van Oostenryck
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=20170731203624.58971-4-luc.vanoostenryck@gmail.com \
--to=luc.vanoostenryck@gmail.com \
--cc=linux-sparse@vger.kernel.org \
--cc=mstefani@mykolab.com \
--cc=sparse@chrisli.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: 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 NNTP newsgroup(s).