diff options
Diffstat (limited to 'src/passes')
-rw-r--r-- | src/passes/Flatten.cpp | 5 | ||||
-rw-r--r-- | src/passes/LocalCSE.cpp | 3 | ||||
-rw-r--r-- | src/passes/MergeLocals.cpp | 2 | ||||
-rw-r--r-- | src/passes/RemoveUnusedBrs.cpp | 4 | ||||
-rw-r--r-- | src/passes/SSAify.cpp | 2 | ||||
-rw-r--r-- | src/passes/SimplifyLocals.cpp | 9 | ||||
-rw-r--r-- | src/passes/Untee.cpp | 7 | ||||
-rw-r--r-- | src/passes/Vacuum.cpp | 2 |
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; } |