diff options
author | fche <fche> | 2007-05-30 14:56:21 +0000 |
---|---|---|
committer | fche <fche> | 2007-05-30 14:56:21 +0000 |
commit | cf9ff341332d68b367e47830eddbc962ab0a74e3 (patch) | |
tree | 12360412c4dd694a6eed8c04da7c63d9b2c343f1 /staptree.cxx | |
parent | 79e80fedc4bcac4cd1d5a684537f20a4331efd4e (diff) | |
download | systemtap-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.cxx | 28 |
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); +} + + + // ------------------------------------------------------------------------ |