From cf9ff341332d68b367e47830eddbc962ab0a74e3 Mon Sep 17 00:00:00 2001 From: fche Date: Wed, 30 May 2007 14:56:21 +0000 Subject: 2007-05-30 Frank Ch. Eigler PR 4567. * staptree.cxx (varuse_collecting_visitor): Add side-effect result query functions. * elaborate.cxx (dead_stmtexpr_remover::visit_expr_statement): Switch to it. (dead_assignment_remover::visit_assignment): Skip elision of lvalues with side-effects in index exprs. * staptree.h: Corresponding changes. 2007-05-30 Frank Ch. Eigler PR 4567. * systemtap.base/optim.stp, optim.exp: New test. --- staptree.cxx | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'staptree.cxx') diff --git a/staptree.cxx b/staptree.cxx index daac09cb..8fb41ab6 100644 --- a/staptree.cxx +++ b/staptree.cxx @@ -1670,6 +1670,34 @@ varuse_collecting_visitor::visit_delete_statement (delete_statement* s) current_lrvalue = last_lrvalue; } +bool +varuse_collecting_visitor::side_effect_free () +{ + return (written.empty() && !embedded_seen); +} + + +bool +varuse_collecting_visitor::side_effect_free_wrt (const set& vars) +{ + // A looser notion of side-effect-freeness with respect to a given + // list of variables. + + // That's useful because the written list may consist of local + // variables of called functions. But visible side-effects only + // occur if the client's locals, or any globals are written-to. + + set intersection; + insert_iterator > int_it (intersection, intersection.begin()); + set_intersection (written.begin(), written.end(), + vars.begin(), vars.end(), + int_it); + + return (intersection.empty() && !embedded_seen); +} + + + // ------------------------------------------------------------------------ -- cgit