From: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
To: linux-sparse@vger.kernel.org
Cc: Christopher Li <sparse@chrisli.org>,
Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Subject: [RFC PATCH 02/48] remove trivial phi-nodes during clean_up_phi()
Date: Wed, 23 Aug 2017 22:15:08 +0200 [thread overview]
Message-ID: <20170823201554.90551-3-luc.vanoostenryck@gmail.com> (raw)
In-Reply-To: <20170823201554.90551-1-luc.vanoostenryck@gmail.com>
In a set of related phi-nodes and phi-sources
if all phi-sources but one correspond to the target of one
of the phi-sources, then no phi-nodes is needed and all
%phis can be replaced by the unique source.
For example, if we have something like:
foo:
phisrc.32 %phi1 <- %arg1
br .L1
.L1:
phi.32 %r2 <- %phi1, %phi2
phisrc.32 %phi2 <- %r2
...
we can see that %phi2 is the target of the phi-node that use it
thus neither %phi2 nor %r2 are completly inter-dependent and the
only true soure is %arg1. In this case %r2 can be replaced by
%arg1 and the phi-node can be removed as well as its phi-sources.
There are also more complex cases with several inter-related
phi-nodes, the source of a phi-node being defined by another
phi-node. Like for the simple case, if there is only a single
independent source, all the related phi-nodes can be replaced by
this unique true source and the the phi-sources can be removed.
Removing these trivial phi-nodes will usually trigger other
simplifications, especially those concerning the CFG.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
simplify.c | 56 ++++++++++++++++++++++++++++-------------
validation/optim/trivial-phis.c | 15 +++++++++++
2 files changed, 54 insertions(+), 17 deletions(-)
create mode 100644 validation/optim/trivial-phis.c
diff --git a/simplify.c b/simplify.c
index 2bc86f53e..766ac451d 100644
--- a/simplify.c
+++ b/simplify.c
@@ -133,37 +133,59 @@ static int if_convert_phi(struct instruction *insn)
return REPEAT_CSE;
}
-static int clean_up_phi(struct instruction *insn)
+static int trivial_phi(pseudo_t *same, struct instruction *insn, struct pseudo_list **list)
{
+ pseudo_t target = insn->target;
pseudo_t phi;
- struct instruction *last;
- int same;
- last = NULL;
- same = 1;
+ assert(insn->opcode == OP_PHI);
+
+ if (pseudo_in_list(*list, target))
+ return 1;
+ add_pseudo(list, target);
+
FOR_EACH_PTR(insn->phi_list, phi) {
struct instruction *def;
+ pseudo_t src;
+
if (phi == VOID)
continue;
def = phi->def;
- if (def->src1 == VOID || !def->bb)
+ assert(def->bb);
+ if (!def->bb)
continue;
- if (last) {
- if (last->src1 != def->src1)
- same = 0;
+
+ src = def->src; // bypass OP_PHISRC & get the real source
+
+ if (src == VOID || src == target || src == *same)
+ continue;
+ if (!*same) {
+ *same = src;
continue;
}
- last = def;
+ if (src->type == PSEUDO_REG && src->def->opcode == OP_PHI) {
+ if (trivial_phi(same, src->def, list))
+ continue;
+ }
+ return 0;
} END_FOR_EACH_PTR(phi);
- if (same) {
- pseudo_t pseudo = last ? last->src1 : VOID;
- convert_instruction_target(insn, pseudo);
- kill_instruction(insn);
- return REPEAT_CSE;
- }
+ return 1;
+}
+
+static int clean_up_phi(struct instruction *insn)
+{
+ struct pseudo_list *list = NULL;
+ pseudo_t same = NULL;
+
+ if (!trivial_phi(&same, insn, &list))
+ return if_convert_phi(insn);
- return if_convert_phi(insn);
+ if (!same)
+ same = VOID;
+ convert_instruction_target(insn, same);
+ kill_instruction(insn);
+ return REPEAT_CSE;
}
static int delete_pseudo_user_list_entry(struct pseudo_user_list **list, pseudo_t *entry, int count)
diff --git a/validation/optim/trivial-phis.c b/validation/optim/trivial-phis.c
new file mode 100644
index 000000000..9cb9a2c78
--- /dev/null
+++ b/validation/optim/trivial-phis.c
@@ -0,0 +1,15 @@
+void foo(int *p)
+{
+ int a = *p;
+ while (1)
+ a ^= 0;
+}
+
+/*
+ * check-name: trivial phis
+ * check-command: test-linearize -Wno-decl $file
+ * check-output-ignore
+ * check-output-excludes: phi\\.
+ * check-output-excludes: phisrc\\.
+ * check-output-end
+ */
--
2.14.0
next prev parent reply other threads:[~2017-08-23 20:16 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-23 20:15 [RFC PATCH 00/48] fix promotion of symbol to register Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 01/48] remove wrong part of simplify_loads() Luc Van Oostenryck
2017-08-23 20:15 ` Luc Van Oostenryck [this message]
2017-08-23 20:15 ` [RFC PATCH 03/48] give a type to OP_PHISOURCEs Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 04/48] fix test case kill-phi-ttsb Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 05/48] add test case for incomplete type Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 06/48] add test case for bad return type Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 07/48] topasm: top-level asm is special Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 08/48] ret-void: return nothing only for void functions Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 09/48] small code reorg of add_store() Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 10/48] add PSEUDO_UNDEF Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 11/48] add undef_pseudo() Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 12/48] add insert_phi_node() Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 13/48] extract alloc_phisrc() from alloc_phi() Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 14/48] add remove_use() Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 15/48] rename 'struct warning' to 'struct flag' Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 16/48] let handle_simple_switch() handle an array of flags Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 17/48] dump-ir: rename -fdump-linearize to -fdump-ir Luc Van Oostenryck
2017-08-27 4:44 ` Christopher Li
2017-08-23 20:15 ` [RFC PATCH 18/48] dump-ir: use defines Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 19/48] dump-ir: add an helper to parse sub-options Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 20/48] dump-ir: make it more flexible Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 21/48] sssa: move simplify_one_symbol() to a separate file Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 22/48] mem2reg: rename to use 'promote' instead of 'simplify' Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 23/48] mem2reg: simplify check of modifiers for external visibility Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 24/48] mem2reg: extract externaly_visible() Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 25/48] mem2reg: reorg externaly_visible() returns Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 26/48] mem2reg: ignore all killed instructions Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 27/48] mem2reg: extract kill_pseudo_stores() Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 28/48] mem2reg: extract kill_pseudo_dominated_stores() Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 29/48] mem2reg: extract kill_pseudo_dead_stores() Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 30/48] mem2reg: remove one indent level Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 31/48] mem2reg: add comment to find_dominating_stores() Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 32/48] mem2reg: add flags to enable/disable some parts Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 33/48] mem2reg: rename the other kill_dominated_stores() Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 34/48] mem2reg: move rewrite_load_instruction() here Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 35/48] mem2reg: be clear that we're using a symbol/var Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 36/48] mem2reg: be clear that we're using a symbol/var here too Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 37/48] mem2reg: add description for find_dominating_parents() Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 38/48] mem2reg: let rewrite_load_instruction() take the symbol as arg Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 39/48] mem2reg: remove check phisrc_in_bb() Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 40/48] mem2reg: delay the creation of phi-sources Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 41/48] mem2reg: make rewrite_load_instruction() functional Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 42/48] mem2reg: rename one->target to dom Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 43/48] mem2reg: get recursion right Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 44/48] mem2reg: don't check dominance by removed instructions Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 45/48] mem2reg: update copyright Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 46/48] mem2reg: allow dumping IR Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 47/48] mem2reg: add some small test cases Luc Van Oostenryck
2017-08-23 20:15 ` [RFC PATCH 48/48] mem2reg: don't promote unused or already promoted vars Luc Van Oostenryck
2017-08-23 20:55 ` [RFC PATCH 00/48] fix promotion of symbol to register Christopher Li
2017-08-27 4:40 ` Christopher Li
2017-08-27 5:16 ` Christopher Li
2017-08-29 12:37 ` Christopher Li
2017-09-03 19:24 ` 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=20170823201554.90551-3-luc.vanoostenryck@gmail.com \
--to=luc.vanoostenryck@gmail.com \
--cc=linux-sparse@vger.kernel.org \
--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).