summaryrefslogtreecommitdiff
path: root/src/analysis/liveness-transfer-function.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/liveness-transfer-function.h')
-rw-r--r--src/analysis/liveness-transfer-function.h49
1 files changed, 5 insertions, 44 deletions
diff --git a/src/analysis/liveness-transfer-function.h b/src/analysis/liveness-transfer-function.h
index b8dfb13b5..c6d564659 100644
--- a/src/analysis/liveness-transfer-function.h
+++ b/src/analysis/liveness-transfer-function.h
@@ -1,16 +1,14 @@
#ifndef wasm_analysis_liveness_transfer_function_h
#define wasm_analysis_liveness_transfer_function_h
-#include "lattice.h"
-#include "monotone-analyzer.h"
-#include "wasm-traversal.h"
+#include "visitor-transfer-function.h"
namespace wasm::analysis {
-class LivenessTransferFunction : public Visitor<LivenessTransferFunction> {
- FiniteIntPowersetLattice::Element* currState = nullptr;
-
-public:
+struct LivenessTransferFunction
+ : public VisitorTransferFunc<LivenessTransferFunction,
+ FiniteIntPowersetLattice,
+ AnalysisDirection::Backward> {
// Transfer function implementation. A local becomes live before a get
// and becomes dead before a set.
void visitLocalSet(LocalSet* curr) {
@@ -22,43 +20,6 @@ public:
currState->set(curr->index, true);
}
- // Executes the transfer function on all the expressions of the corresponding
- // CFG node, starting with the node's input state, and changes the input state
- // to the final output state of the node in place.
- void transfer(const BasicBlock* cfgBlock,
- FiniteIntPowersetLattice::Element& inputState) {
- // If the block is empty, we propagate the state by inputState =
- // outputState.
-
- currState = &inputState;
-
- // This is a backward analysis, so we start from the end of the CFG
- // and evaluate every expression until the beginning.
- for (auto cfgIter = cfgBlock->rbegin(); cfgIter != cfgBlock->rend();
- ++cfgIter) {
- // Run transfer function.
- visit(*cfgIter);
- }
- currState = nullptr;
- }
-
- // Enqueues the worklist before the worklist algorithm is run. For
- // liveness analysis, we are doing a backward analysis, so we want
- // to enqueue the worklist backward so that later CFG blocks are
- // run before earlier CFG blocks. This improves performance by
- // reducing the number of state propagations needed, since we are
- // naturally following the backward flow at the beginning.
- void enqueueWorklist(CFG& cfg, std::queue<const BasicBlock*>& worklist) {
- for (auto it = cfg.rbegin(); it != cfg.rend(); ++it) {
- worklist.push(&(*it));
- }
- }
-
- // Predecessors depend on current basic block for information.
- BasicBlock::Predecessors getDependents(const BasicBlock* currBlock) {
- return currBlock->preds();
- }
-
// Prints the intermediate states of each basic block cfgBlock by applying
// the transfer function on each expression of the CFG block. This data is
// not stored. Requires the cfgBlock, and a temp copy of the input state