summaryrefslogtreecommitdiff
path: root/src/passes
diff options
context:
space:
mode:
Diffstat (limited to 'src/passes')
-rw-r--r--src/passes/Flatten.cpp5
-rw-r--r--src/passes/LocalCSE.cpp3
-rw-r--r--src/passes/MergeLocals.cpp2
-rw-r--r--src/passes/RemoveUnusedBrs.cpp4
-rw-r--r--src/passes/SSAify.cpp2
-rw-r--r--src/passes/SimplifyLocals.cpp9
-rw-r--r--src/passes/Untee.cpp7
-rw-r--r--src/passes/Vacuum.cpp2
8 files changed, 19 insertions, 15 deletions
diff --git a/src/passes/Flatten.cpp b/src/passes/Flatten.cpp
index 6f698367f..74788afb5 100644
--- a/src/passes/Flatten.cpp
+++ b/src/passes/Flatten.cpp
@@ -172,9 +172,10 @@ struct Flatten
replaceCurrent(set->value); // trivial, no set happens
} else {
// use a set in a prelude + a get
- set->setTee(false);
+ set->makeSet();
ourPreludes.push_back(set);
- replaceCurrent(builder.makeLocalGet(set->index, set->value->type));
+ Type localType = getFunction()->getLocalType(set->index);
+ replaceCurrent(builder.makeLocalGet(set->index, localType));
}
}
} else if (auto* br = curr->dynCast<Break>()) {
diff --git a/src/passes/LocalCSE.cpp b/src/passes/LocalCSE.cpp
index afd30c040..0816bf6ea 100644
--- a/src/passes/LocalCSE.cpp
+++ b/src/passes/LocalCSE.cpp
@@ -184,8 +184,9 @@ struct LocalCSE : public WalkerPass<LinearExecutionWalker<LocalCSE>> {
if (iter != usables.end()) {
// already exists in the table, this is good to reuse
auto& info = iter->second;
+ Type localType = getFunction()->getLocalType(info.index);
set->value =
- Builder(*getModule()).makeLocalGet(info.index, value->type);
+ Builder(*getModule()).makeLocalGet(info.index, localType);
anotherPass = true;
} else {
// not in table, add this, maybe we can help others later
diff --git a/src/passes/MergeLocals.cpp b/src/passes/MergeLocals.cpp
index c20105621..0116753f1 100644
--- a/src/passes/MergeLocals.cpp
+++ b/src/passes/MergeLocals.cpp
@@ -88,7 +88,7 @@ struct MergeLocals
if (auto* get = curr->value->dynCast<LocalGet>()) {
if (get->index != curr->index) {
Builder builder(*getModule());
- auto* trivial = builder.makeLocalTee(get->index, get);
+ auto* trivial = builder.makeLocalTee(get->index, get, get->type);
curr->value = trivial;
copies.push_back(curr);
}
diff --git a/src/passes/RemoveUnusedBrs.cpp b/src/passes/RemoveUnusedBrs.cpp
index 55f57302d..e0174934a 100644
--- a/src/passes/RemoveUnusedBrs.cpp
+++ b/src/passes/RemoveUnusedBrs.cpp
@@ -287,7 +287,7 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs>> {
Expression* z;
replaceCurrent(
z = builder.makeIf(
- builder.makeLocalTee(temp, curr->condition),
+ builder.makeLocalTee(temp, curr->condition, i32),
builder.makeIf(builder.makeBinary(EqInt32,
builder.makeLocalGet(temp, i32),
builder.makeConst(Literal(int32_t(
@@ -1074,7 +1074,7 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs>> {
iff->finalize();
Expression* replacement = iff;
if (tee) {
- set->setTee(false);
+ set->makeSet();
// We need a block too.
replacement = builder.makeSequence(iff,
get // reuse the get
diff --git a/src/passes/SSAify.cpp b/src/passes/SSAify.cpp
index bcafb2784..df32fc77b 100644
--- a/src/passes/SSAify.cpp
+++ b/src/passes/SSAify.cpp
@@ -154,7 +154,7 @@ struct SSAify : public Pass {
if (set) {
// a set exists, just add a tee of its value
auto* value = set->value;
- auto* tee = builder.makeLocalTee(new_, value);
+ auto* tee = builder.makeLocalTee(new_, value, get->type);
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
diff --git a/src/passes/SimplifyLocals.cpp b/src/passes/SimplifyLocals.cpp
index 6b76faed3..a3fa4a34d 100644
--- a/src/passes/SimplifyLocals.cpp
+++ b/src/passes/SimplifyLocals.cpp
@@ -256,7 +256,7 @@ struct SimplifyLocals
} else {
this->replaceCurrent(set);
assert(!set->isTee());
- set->setTee(true);
+ set->makeTee(this->getFunction()->getLocalType(set->index));
}
// reuse the local.get that is dying
*found->second.item = curr;
@@ -271,7 +271,7 @@ struct SimplifyLocals
auto* set = curr->value->dynCast<LocalSet>();
if (set) {
assert(set->isTee());
- set->setTee(false);
+ set->makeSet();
this->replaceCurrent(set);
}
}
@@ -559,7 +559,7 @@ struct SimplifyLocals
auto* set = (*breakLocalSetPointer)->template cast<LocalSet>();
if (br->condition) {
br->value = set;
- set->setTee(true);
+ set->makeTee(this->getFunction()->getLocalType(set->index));
*breakLocalSetPointer =
this->getModule()->allocator.template alloc<Nop>();
// in addition, as this is a conditional br that now has a value, it now
@@ -728,7 +728,8 @@ struct SimplifyLocals
ifTrueBlock->finalize();
assert(ifTrueBlock->type != none);
// Update the ifFalse side.
- iff->ifFalse = builder.makeLocalGet(set->index, set->value->type);
+ iff->ifFalse = builder.makeLocalGet(
+ set->index, this->getFunction()->getLocalType(set->index));
iff->finalize(); // update type
// Update the get count.
getCounter.num[set->index]++;
diff --git a/src/passes/Untee.cpp b/src/passes/Untee.cpp
index 79c76b988..6e5fb489b 100644
--- a/src/passes/Untee.cpp
+++ b/src/passes/Untee.cpp
@@ -41,9 +41,10 @@ struct Untee : public WalkerPass<PostWalker<Untee>> {
} else {
// a normal tee. replace with set and get
Builder builder(*getModule());
- replaceCurrent(builder.makeSequence(
- curr, builder.makeLocalGet(curr->index, curr->value->type)));
- curr->setTee(false);
+ LocalGet* get = builder.makeLocalGet(
+ curr->index, getFunction()->getLocalType(curr->index));
+ replaceCurrent(builder.makeSequence(curr, get));
+ curr->makeSet();
}
}
}
diff --git a/src/passes/Vacuum.cpp b/src/passes/Vacuum.cpp
index 26fd2bd0e..48a55ed89 100644
--- a/src/passes/Vacuum.cpp
+++ b/src/passes/Vacuum.cpp
@@ -346,7 +346,7 @@ struct Vacuum : public WalkerPass<ExpressionStackWalker<Vacuum>> {
// a drop of a tee is a set
if (auto* set = curr->value->dynCast<LocalSet>()) {
assert(set->isTee());
- set->setTee(false);
+ set->makeSet();
replaceCurrent(set);
return;
}