diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-08-31 21:51:52 +0200 |
|---|---|---|
| committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-09-06 01:37:51 +0200 |
| commit | de710454f956bf4c2b0c880597de0c79a7449c0f (patch) | |
| tree | f7068030ae417b426da18adc617329830c7fe1e4 | |
| parent | e811962ea0f56da569c6504ac150b357b069b11a (diff) | |
| download | sparse-dev-de710454f956bf4c2b0c880597de0c79a7449c0f.tar.gz | |
use UNDEF for missing returns
If a return statement is missing in the last block, the
generated IR will be invalid because the number of operands
in the exit phi-node will not match the number or parent BBs.
Detect this situation and insert an UNDEF for the missing value.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
| -rw-r--r-- | linearize.c | 8 | ||||
| -rw-r--r-- | validation/linear/missing-return0.c | 1 | ||||
| -rw-r--r-- | validation/linear/missing-return1.c | 1 | ||||
| -rw-r--r-- | validation/linear/missing-return2.c | 1 | ||||
| -rw-r--r-- | validation/linear/missing-return4.c | 1 | ||||
| -rw-r--r-- | validation/linear/missing-return5.c | 1 |
6 files changed, 8 insertions, 5 deletions
diff --git a/linearize.c b/linearize.c index 53d66ffa..a631d073 100644 --- a/linearize.c +++ b/linearize.c @@ -2002,6 +2002,14 @@ static pseudo_t linearize_fn_statement(struct entrypoint *ep, struct statement * pseudo_t pseudo; pseudo = linearize_compound_statement(ep, stmt); + if (type_size(stmt->ret) > 0) { // non-void function + struct basic_block *active = ep->active; + if (active && !bb_terminated(active)) { // missing return + struct basic_block *bb_ret; + bb_ret = get_bound_block(ep, stmt->ret); + add_return(ep, bb_ret, stmt->ret, undef_pseudo()); + } + } bb = add_label(ep, stmt->ret); phi_node = first_instruction(bb->insns); if (phi_node) diff --git a/validation/linear/missing-return0.c b/validation/linear/missing-return0.c index d6019941..77ab5abd 100644 --- a/validation/linear/missing-return0.c +++ b/validation/linear/missing-return0.c @@ -7,5 +7,4 @@ static int foo(int a) /* * check-name: missing-return0 * check-command: sparse -vir -flinearize=last $file - * check-known-to-fail */ diff --git a/validation/linear/missing-return1.c b/validation/linear/missing-return1.c index c13135ad..4a8a9517 100644 --- a/validation/linear/missing-return1.c +++ b/validation/linear/missing-return1.c @@ -12,5 +12,4 @@ static int foo(int a) /* * check-name: missing-return1 * check-command: sparse -vir -flinearize=last $file - * check-known-to-fail */ diff --git a/validation/linear/missing-return2.c b/validation/linear/missing-return2.c index c1959b6f..395dcc14 100644 --- a/validation/linear/missing-return2.c +++ b/validation/linear/missing-return2.c @@ -8,5 +8,4 @@ static int foo(int a) /* * check-name: missing-return2 * check-command: sparse -vir -flinearize=last $file - * check-known-to-fail */ diff --git a/validation/linear/missing-return4.c b/validation/linear/missing-return4.c index dd30988b..779893a0 100644 --- a/validation/linear/missing-return4.c +++ b/validation/linear/missing-return4.c @@ -7,7 +7,6 @@ static int foo(int a) /* * check-name: missing-return4 * check-command: test-linearize -Wno-decl $file - * check-known-to-fail * * check-error-ignore * check-output-ignore diff --git a/validation/linear/missing-return5.c b/validation/linear/missing-return5.c index bcabd16a..e5504a19 100644 --- a/validation/linear/missing-return5.c +++ b/validation/linear/missing-return5.c @@ -14,7 +14,6 @@ int bar(int p) /* * check-name: missing/undef return * check-command: test-linearize -Wno-decl -fdump-ir=linearize $file - * check-known-to-fail * * check-output-ignore * check-output-pattern(2): phi\\..*,.* |
