The function kill_dead_stores() is somehow hard to understand. Let's add some explanation for it. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- flow.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/flow.c b/flow.c index 32e30670c..2732b922d 100644 --- a/flow.c +++ b/flow.c @@ -551,6 +551,20 @@ found: } /* Kill a pseudo that is dead on exit from the bb */ +// The context is: +// * the variable is not global but may have its address used (local/non-local) +// * the stores are only needed by others functions which would do some +// loads via the escaped address +// We start by the terminating BB (normal exit BB + no-return/unreachable) +// We walkup the BB' intruction backward +// * we're only concerned by loads, stores & calls +// * if we reach a call -> we have to stop if var is non-local +// * if we reach a load of our var -> we have to stop +// * if we reach a store of our var -> we can kill it, it's dead +// * we can ignore other stores & loads if the var is local +// * if we reach another store or load done via non-symbol access +// (so done via some address calculation) -> we have to stop +// If we reach the top of the BB we can recurse into the parents BBs. static void kill_dead_stores(pseudo_t pseudo, unsigned long generation, struct basic_block *bb, int local) { struct instruction *insn; -- 2.16.2 -- 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