On Thu, Jul 6, 2017 at 12:19 PM, Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> wrote: > > Fix this, by adding a flag to kill_unreachable_bbs(), telling > if it is safe to delete the BBs or if we can just mark them > as unreachable (set bb->ep to NULL and unlink any parent and/or > chilren), in which case the deletion will be done later. > > Note: the reproducer is one with very broken syntax but nothing > seems to forbid the same situation to happen with a valid > program. I think it is simpler to move the kill not reachable bb to outer CSE stage. The following patch has been test pass kernel compile test. Feel free to combine that with your test as one patch. git branch: https://git.kernel.org/pub/scm/devel/sparse/sparse.git/log/?h=sparse-next-20170708 Chris >From 5234b1fcb69ade5e69ab3a528b57c8f5cea9b11e Mon Sep 17 00:00:00 2001 From: Christopher Li <sparse@xxxxxxxxxxx> Date: Sat, 8 Jul 2017 19:34:49 -0700 Subject: [PATCH 1/2] move kill_unreachable_bbs to outer cse stage The current way of kill_unreach_bbs in insert_branch() cause delete entry in ptrlist that the upper level caller is looping on. Move it outside to the cse stage avoid that problem. Reported-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> Signed-of-By: Christopher Li <sparse@xxxxxxxxxxx> --- cse.c | 3 +++ flow.c | 2 +- linearize.c | 3 --- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cse.c b/cse.c index 0d3815c..af9863f 100644 --- a/cse.c +++ b/cse.c @@ -387,6 +387,9 @@ repeat: } } + if (repeat_phase & REPEAT_CFG_CLEANUP) + kill_unreachable_bbs(ep); + if (repeat_phase & REPEAT_SYMBOL_CLEANUP) simplify_memops(ep); diff --git a/flow.c b/flow.c index c7161d4..5d2f15a 100644 --- a/flow.c +++ b/flow.c @@ -841,7 +841,7 @@ void kill_unreachable_bbs(struct entrypoint *ep) } END_FOR_EACH_PTR(bb); PACK_PTR_LIST(&ep->bbs); - repeat_phase &= ~REPEAT_CFG_CLEANUP; + repeat_phase |= REPEAT_CSE ; } static int rewrite_parent_branch(struct basic_block *bb, struct basic_block *old, struct basic_block *new) diff --git a/linearize.c b/linearize.c index 7313e72..a367207 100644 --- a/linearize.c +++ b/linearize.c @@ -671,9 +671,6 @@ void insert_branch(struct basic_block *bb, struct instruction *jmp, struct basic remove_parent(child, bb); } END_FOR_EACH_PTR(child); PACK_PTR_LIST(&bb->children); - - if (repeat_phase & REPEAT_CFG_CLEANUP) - kill_unreachable_bbs(bb->ep); } -- 2.9.4 -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html