diff options
author | Alon Zakai <alonzakai@gmail.com> | 2019-04-22 16:22:10 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-22 16:22:10 -0700 |
commit | 7fe2701d3bcbea625405f7b8c852aa3154face6b (patch) | |
tree | ad4f4228f293dcbbb4ccb29afaee218d3910c268 /src/passes/I64ToI32Lowering.cpp | |
parent | 831a774641b63bc4980eb6e71b1c59d92d19fb4d (diff) | |
download | binaryen-7fe2701d3bcbea625405f7b8c852aa3154face6b.tar.gz binaryen-7fe2701d3bcbea625405f7b8c852aa3154face6b.tar.bz2 binaryen-7fe2701d3bcbea625405f7b8c852aa3154face6b.zip |
wasm2js: remove more code we don't need since we have flat IR (#2039)
Also run remove-unused-names which became more noticeably necessary after this change.
Diffstat (limited to 'src/passes/I64ToI32Lowering.cpp')
-rw-r--r-- | src/passes/I64ToI32Lowering.cpp | 120 |
1 files changed, 0 insertions, 120 deletions
diff --git a/src/passes/I64ToI32Lowering.cpp b/src/passes/I64ToI32Lowering.cpp index f16003745..731b42d3a 100644 --- a/src/passes/I64ToI32Lowering.cpp +++ b/src/passes/I64ToI32Lowering.cpp @@ -160,7 +160,6 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { if (!builder) builder = make_unique<Builder>(*getModule()); indexMap.clear(); highBitVars.clear(); - labelHighBitVars.clear(); freeTemps.clear(); Module temp; auto* oldFunc = ModuleUtils::copyFunction(func, temp); @@ -221,124 +220,6 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { } } - void visitBlock(Block* curr) { - if (curr->list.size() == 0) return; - if (handleUnreachable(curr)) return; - if (curr->type == i64) curr->type = i32; - auto highBitsIt = labelHighBitVars.find(curr->name); - if (!hasOutParam(curr->list.back())) { - if (highBitsIt != labelHighBitVars.end()) { - setOutParam(curr, std::move(highBitsIt->second)); - } - return; - } - TempVar lastHighBits = fetchOutParam(curr->list.back()); - if (highBitsIt == labelHighBitVars.end() || - highBitsIt->second == lastHighBits) { - setOutParam(curr, std::move(lastHighBits)); - if (highBitsIt != labelHighBitVars.end()) { - labelHighBitVars.erase(highBitsIt); - } - return; - } - TempVar highBits = std::move(highBitsIt->second); - TempVar tmp = getTemp(); - labelHighBitVars.erase(highBitsIt); - SetLocal* setLow = builder->makeSetLocal(tmp, curr->list.back()); - SetLocal* setHigh = builder->makeSetLocal( - highBits, - builder->makeGetLocal(lastHighBits, i32) - ); - GetLocal* getLow = builder->makeGetLocal(tmp, i32); - curr->list.back() = builder->blockify(setLow, setHigh, getLow); - setOutParam(curr, std::move(highBits)); - } - - void visitIf(If* curr) { - if (!hasOutParam(curr->ifTrue)) return; - assert(curr->ifFalse != nullptr && "Nullable ifFalse found"); - TempVar highBits = fetchOutParam(curr->ifTrue); - TempVar falseBits = fetchOutParam(curr->ifFalse); - TempVar tmp = getTemp(); - curr->type = i32; - curr->ifFalse = builder->blockify( - builder->makeSetLocal(tmp, curr->ifFalse), - builder->makeSetLocal( - highBits, - builder->makeGetLocal(falseBits, i32) - ), - builder->makeGetLocal(tmp, i32) - ); - setOutParam(curr, std::move(highBits)); - } - - void visitLoop(Loop* curr) { - // TODO: in flat IR, no chance for an out param - assert(labelHighBitVars.find(curr->name) == labelHighBitVars.end()); - if (curr->type != i64) return; - curr->type = i32; - setOutParam(curr, fetchOutParam(curr->body)); - } - - void visitBreak(Break* curr) { - // TODO: in flat IR, no chance for an out param - if (!hasOutParam(curr->value)) return; - assert(curr->value != nullptr); - TempVar valHighBits = fetchOutParam(curr->value); - auto blockHighBitsIt = labelHighBitVars.find(curr->name); - if (blockHighBitsIt == labelHighBitVars.end()) { - labelHighBitVars.emplace(curr->name, std::move(valHighBits)); - curr->type = i32; - return; - } - TempVar blockHighBits = std::move(blockHighBitsIt->second); - TempVar tmp = getTemp(); - SetLocal* setLow = builder->makeSetLocal(tmp, curr->value); - SetLocal* setHigh = builder->makeSetLocal( - blockHighBits, - builder->makeGetLocal(valHighBits, i32) - ); - curr->value = builder->makeGetLocal(tmp, i32); - curr->type = i32; - replaceCurrent(builder->blockify(setLow, setHigh, curr)); - } - - void visitSwitch(Switch* curr) { - // TODO: in flat IR, no chance for an out param - if (!hasOutParam(curr->value)) return; - TempVar outParam = fetchOutParam(curr->value); - TempVar tmp = getTemp(); - Expression* result = curr; - std::vector<Name> targets; - size_t blockID = 0; - auto processTarget = [&](Name target) -> Name { - auto labelIt = labelHighBitVars.find(target); - if (labelIt == labelHighBitVars.end()) { - labelHighBitVars.emplace(target, getTemp()); - labelIt = labelHighBitVars.find(target); - } - Name newLabel("$i64toi32_" + std::string(target.c_str()) + - "_" + std::to_string(blockID++)); - Block* trampoline = builder->makeBlock(newLabel, result); - trampoline->type = i32; - result = builder->blockify( - builder->makeSetLocal(tmp, trampoline), - builder->makeSetLocal( - labelIt->second, - builder->makeGetLocal(outParam, i32) - ), - builder->makeBreak(target, builder->makeGetLocal(tmp, i32)) - ); - return newLabel; - }; - for (auto target : curr->targets) { - targets.push_back(processTarget(target)); - } - curr->targets.set(targets); - curr->default_ = processTarget(curr->default_); - replaceCurrent(result); - } - template<typename T> using BuilderFunc = std::function<T*(std::vector<Expression*>&, Type)>; @@ -1615,7 +1496,6 @@ private: std::unordered_map<Index, Index> indexMap; std::unordered_map<int, std::vector<Index>> freeTemps; std::unordered_map<Expression*, TempVar> highBitVars; - std::unordered_map<Name, TempVar> labelHighBitVars; std::unordered_map<Index, Type> tempTypes; std::unordered_set<Name> originallyI64Globals; Index nextTemp; |