summaryrefslogtreecommitdiffstats
path: root/staptree.cxx
diff options
context:
space:
mode:
authorfche <fche>2007-05-30 14:56:21 +0000
committerfche <fche>2007-05-30 14:56:21 +0000
commitcf9ff341332d68b367e47830eddbc962ab0a74e3 (patch)
tree12360412c4dd694a6eed8c04da7c63d9b2c343f1 /staptree.cxx
parent79e80fedc4bcac4cd1d5a684537f20a4331efd4e (diff)
downloadsystemtap-steved-cf9ff341332d68b367e47830eddbc962ab0a74e3.tar.gz
systemtap-steved-cf9ff341332d68b367e47830eddbc962ab0a74e3.tar.xz
systemtap-steved-cf9ff341332d68b367e47830eddbc962ab0a74e3.zip
2007-05-30 Frank Ch. Eigler <fche@redhat.com>
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 <fche@redhat.com> PR 4567. * systemtap.base/optim.stp, optim.exp: New test.
Diffstat (limited to 'staptree.cxx')
-rw-r--r--staptree.cxx28
1 files changed, 28 insertions, 0 deletions
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<vardecl*>& 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<vardecl*> intersection;
+ insert_iterator<set<vardecl*> > int_it (intersection, intersection.begin());
+ set_intersection (written.begin(), written.end(),
+ vars.begin(), vars.end(),
+ int_it);
+
+ return (intersection.empty() && !embedded_seen);
+}
+
+
+
// ------------------------------------------------------------------------