diff options
-rw-r--r-- | memops.c | 16 | ||||
-rw-r--r-- | validation/memops/kill-dead-store-parent0.c | 1 | ||||
-rw-r--r-- | validation/memops/kill-dead-store-parent2.c | 1 |
3 files changed, 16 insertions, 2 deletions
@@ -231,6 +231,7 @@ static void kill_dominated_stores(struct basic_block *bb) if (!insn->bb) continue; if (insn->opcode == OP_STORE) { + struct basic_block *par; struct instruction *dom; pseudo_t pseudo = insn->src; int local; @@ -249,6 +250,21 @@ static void kill_dominated_stores(struct basic_block *bb) } END_FOR_EACH_PTR_REVERSE(dom); /* OK, we should check the parents now */ + FOR_EACH_PTR(bb->parents, par) { + + if (bb_list_size(par->children) != 1) + goto next_parent; + FOR_EACH_PTR(par->insns, dom) { + if (!dom->bb) + continue; + if (dom == insn) + goto next_parent; + if (!try_to_kill_store(pseudo, insn, dom, local)) + goto next_parent; + } END_FOR_EACH_PTR(dom); +next_parent: + ; + } END_FOR_EACH_PTR(par); } next_store: /* Do the next one */; diff --git a/validation/memops/kill-dead-store-parent0.c b/validation/memops/kill-dead-store-parent0.c index 1413134b..c1b2466c 100644 --- a/validation/memops/kill-dead-store-parent0.c +++ b/validation/memops/kill-dead-store-parent0.c @@ -8,7 +8,6 @@ void foo(int *ptr, int p) /* * check-name: kill-dead-store-parent0 * check-command: test-linearize -Wno-decl $file - * check-known-to-fail * * check-output-ignore * check-output-pattern(1): store diff --git a/validation/memops/kill-dead-store-parent2.c b/validation/memops/kill-dead-store-parent2.c index b563fd31..4f7b9dd9 100644 --- a/validation/memops/kill-dead-store-parent2.c +++ b/validation/memops/kill-dead-store-parent2.c @@ -19,7 +19,6 @@ l20: /* * check-name: kill-dead-store-parent2 * check-command: test-linearize -Wno-decl $file - * check-known-to-fail * * check-output-ignore * check-output-pattern(1): store |