aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-03-11 09:42:24 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-03-14 23:19:54 +0100
commitdc0297e9166f42f9f27e9c5958c06feb16b95ce8 (patch)
treefd94f4d996d09e2d622834fb4b70afb374575c45
parentb3875dcaf628705a65adf3c815f52fcffcd280bb (diff)
downloadsparse-dev-dc0297e9166f42f9f27e9c5958c06feb16b95ce8.tar.gz
optim: kill unreachable BBS after CFG simplification
Normal instruction simplification & CSE must not be done on dead block (otherwise it's possible to have unsound situations like having an instruction defining its own operand with possible infinite loops as consequence). This is insured by the main optimization loop but not after BB packing or flow simplification. Fix this by calling kill_unreachabe_bbs() after BB packing and flow simplification. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--optimize.c4
-rw-r--r--validation/optim/dup-cond0.c1
-rw-r--r--validation/optim/phi-ret.c1
3 files changed, 4 insertions, 2 deletions
diff --git a/optimize.c b/optimize.c
index 10b33f54..33ed8198 100644
--- a/optimize.c
+++ b/optimize.c
@@ -80,6 +80,8 @@ repeat:
simplify_memops(ep);
} while (repeat_phase & REPEAT_CSE);
pack_basic_blocks(ep);
+ if (repeat_phase & REPEAT_CFG_CLEANUP)
+ kill_unreachable_bbs(ep);
} while (repeat_phase & REPEAT_CSE);
kill_unreachable_bbs(ep);
@@ -99,6 +101,8 @@ repeat:
*/
if (simplify_flow(ep)) {
clear_liveness(ep);
+ if (repeat_phase & REPEAT_CFG_CLEANUP)
+ kill_unreachable_bbs(ep);
goto repeat;
}
diff --git a/validation/optim/dup-cond0.c b/validation/optim/dup-cond0.c
index dc4991cb..0525250c 100644
--- a/validation/optim/dup-cond0.c
+++ b/validation/optim/dup-cond0.c
@@ -13,7 +13,6 @@ static int foo(struct s *s)
/*
* check-name: dup-cond0
* check-command: test-linearize -Wno-decl $file
- * check-known-to-fail
*
* check-output-ignore
* check-output-contains: select
diff --git a/validation/optim/phi-ret.c b/validation/optim/phi-ret.c
index 204366a9..bc3e0474 100644
--- a/validation/optim/phi-ret.c
+++ b/validation/optim/phi-ret.c
@@ -15,7 +15,6 @@ int foo(int p, int q, int v)
/*
* check-name: phi-ret
* check-command: test-linearize -Wno-decl $file
- * check-known-to-fail
*
* check-output-ignore
* check-output-excludes: phi\\.