aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2021-03-28 16:07:29 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2021-03-28 16:07:29 +0200
commitdcb199646134ae0d264c72175a9ad8314f7836c8 (patch)
treec87febf1aa5ec612713bf0c2ec8b280c7a13bfc6
parentb204ead75fc624928e783da8b6658f3a8a06871c (diff)
downloadsparse-dcb199646134ae0d264c72175a9ad8314f7836c8.tar.gz
correctly count phi arguments
In a phi-node,pseudo_list_size() can't be used for counting its arguments because VOIDs must be ignored. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--flow.c18
-rw-r--r--validation/optim/phi-count00.c27
2 files changed, 44 insertions, 1 deletions
diff --git a/flow.c b/flow.c
index cb94fcf2..58807432 100644
--- a/flow.c
+++ b/flow.c
@@ -189,6 +189,22 @@ out:
return false;
}
+///
+// count the true number of argument of a phi-node
+// VOID arguments must be ignored, so pseudo_list_size() can't be used for this.
+static int phi_count(struct instruction *node)
+{
+ pseudo_t phi;
+ int n = 0;
+
+ FOR_EACH_PTR(node->phi_list, phi) {
+ if (phi == VOID)
+ continue;
+ n++;
+ } END_FOR_EACH_PTR(phi);
+ return n;
+}
+
/*
* When we reach here, we have:
* - a basic block that ends in a conditional branch and
@@ -211,7 +227,7 @@ static int try_to_simplify_bb(struct basic_block *bb, struct instruction *first,
* simplify_symbol_usage()/conversion to SSA form.
* No sane simplification can be done when we have this.
*/
- bogus = bb_list_size(bb->parents) != pseudo_list_size(first->phi_list);
+ bogus = bb_list_size(bb->parents) != phi_count(first);
FOR_EACH_PTR(first->phi_list, phi) {
struct instruction *def = phi->def;
diff --git a/validation/optim/phi-count00.c b/validation/optim/phi-count00.c
new file mode 100644
index 00000000..38db0eda
--- /dev/null
+++ b/validation/optim/phi-count00.c
@@ -0,0 +1,27 @@
+inline int inl(int d, int e, int f)
+{
+ switch (d) {
+ case 0:
+ return e;
+ case 1:
+ return f;
+ default:
+ return 0;
+ }
+}
+
+void foo(int a, int b, int c)
+{
+ while (1) {
+ if (inl(a, b, c))
+ break;
+ }
+}
+
+/*
+ * check-name: phi-count00
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-ignore
+ * check-output-pattern(0,2): phisrc
+ */