From dcb199646134ae0d264c72175a9ad8314f7836c8 Mon Sep 17 00:00:00 2001 From: Luc Van Oostenryck Date: Sun, 28 Mar 2021 16:07:29 +0100 Subject: 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 --- flow.c | 18 +++++++++++++++++- validation/optim/phi-count00.c | 27 +++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 validation/optim/phi-count00.c 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 + */ -- cgit 1.2.3-korg