summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ast/LocalGraph.cpp13
-rw-r--r--src/passes/SSAify.cpp18
2 files changed, 25 insertions, 6 deletions
diff --git a/src/ast/LocalGraph.cpp b/src/ast/LocalGraph.cpp
index c997eff1b..0d36fec84 100644
--- a/src/ast/LocalGraph.cpp
+++ b/src/ast/LocalGraph.cpp
@@ -17,6 +17,7 @@
#include <iterator>
#include <wasm-builder.h>
+#include <wasm-printing.h>
#include <ast/find_all.h>
#include <ast/local-graph.h>
@@ -24,6 +25,18 @@ namespace wasm {
LocalGraph::LocalGraph(Function* func, Module* module) {
walkFunctionInModule(func, module);
+
+#ifdef LOCAL_GRAPH_DEBUG
+ std::cout << "LocalGraph::dump\n";
+ for (auto& pair : getSetses) {
+ auto* get = pair.first;
+ auto& sets = pair.second;
+ std::cout << "GET\n" << get << " is influenced by\n";
+ for (auto* set : sets) {
+ std::cout << set << '\n';
+ }
+ }
+#endif
}
void LocalGraph::computeInfluences() {
diff --git a/src/passes/SSAify.cpp b/src/passes/SSAify.cpp
index a71a75308..aafea8a97 100644
--- a/src/passes/SSAify.cpp
+++ b/src/passes/SSAify.cpp
@@ -60,7 +60,7 @@ struct SSAify : public Pass {
LocalGraph graph(func, module);
// create new local indexes, one for each set
createNewIndexes(graph);
- // we now know the sets for each get
+ // we now know the sets for each get, and can compute get indexes and handle phis
computeGetsAndPhis(graph);
// add prepends to function
addPrepends();
@@ -75,7 +75,6 @@ struct SSAify : public Pass {
}
}
- // After we traversed it all, we can compute gets and phis
void computeGetsAndPhis(LocalGraph& graph) {
for (auto& iter : graph.getSetses) {
auto* get = iter.first;
@@ -84,8 +83,7 @@ struct SSAify : public Pass {
continue; // unreachable, ignore
}
if (sets.size() == 1) {
- // TODO: add tests for this case
- // easy, just one set, use it's index
+ // easy, just one set, use its index
auto* set = *sets.begin();
if (set) {
get->index = set->index;
@@ -138,10 +136,18 @@ struct SSAify : public Pass {
for (auto* set : sets) {
if (set) {
// a set exists, just add a tee of its value
- set->value = builder.makeTeeLocal(
+ auto* value = set->value;
+ auto* tee = builder.makeTeeLocal(
new_,
- set->value
+ value
);
+ set->value = tee;
+ // the value may have been something we tracked the location
+ // of. if so, update that, since we moved it into the tee
+ if (graph.locations.count(value) > 0) {
+ assert(graph.locations[value] == &set->value);
+ graph.locations[value] = &tee->value;
+ }
} else {
// this is a param or the zero init value.
if (func->isParam(old)) {