diff options
Diffstat (limited to 'src/ir')
-rw-r--r-- | src/ir/ExpressionAnalyzer.cpp | 6 | ||||
-rw-r--r-- | src/ir/ExpressionManipulator.cpp | 5 | ||||
-rw-r--r-- | src/ir/effects.h | 10 |
3 files changed, 17 insertions, 4 deletions
diff --git a/src/ir/ExpressionAnalyzer.cpp b/src/ir/ExpressionAnalyzer.cpp index 170202888..99c2798b0 100644 --- a/src/ir/ExpressionAnalyzer.cpp +++ b/src/ir/ExpressionAnalyzer.cpp @@ -132,9 +132,13 @@ template<typename T> void visitImmediates(Expression* curr, T& visitor) { } visitor.visitScopeName(curr->default_); } - void visitCall(Call* curr) { visitor.visitNonScopeName(curr->target); } + void visitCall(Call* curr) { + visitor.visitNonScopeName(curr->target); + visitor.visitInt(curr->isReturn); + } void visitCallIndirect(CallIndirect* curr) { visitor.visitNonScopeName(curr->fullType); + visitor.visitInt(curr->isReturn); } void visitLocalGet(LocalGet* curr) { visitor.visitIndex(curr->index); } void visitLocalSet(LocalSet* curr) { visitor.visitIndex(curr->index); } diff --git a/src/ir/ExpressionManipulator.cpp b/src/ir/ExpressionManipulator.cpp index b52a8dd82..783342780 100644 --- a/src/ir/ExpressionManipulator.cpp +++ b/src/ir/ExpressionManipulator.cpp @@ -71,7 +71,8 @@ flexibleCopy(Expression* original, Module& wasm, CustomCopier custom) { copy(curr->value)); } Expression* visitCall(Call* curr) { - auto* ret = builder.makeCall(curr->target, {}, curr->type); + auto* ret = + builder.makeCall(curr->target, {}, curr->type, curr->isReturn); for (Index i = 0; i < curr->operands.size(); i++) { ret->operands.push_back(copy(curr->operands[i])); } @@ -79,7 +80,7 @@ flexibleCopy(Expression* original, Module& wasm, CustomCopier custom) { } Expression* visitCallIndirect(CallIndirect* curr) { auto* ret = builder.makeCallIndirect( - curr->fullType, copy(curr->target), {}, curr->type); + curr->fullType, copy(curr->target), {}, curr->type, curr->isReturn); for (Index i = 0; i < curr->operands.size(); i++) { ret->operands.push_back(copy(curr->operands[i])); } diff --git a/src/ir/effects.h b/src/ir/effects.h index 14cbd6217..dac5b878a 100644 --- a/src/ir/effects.h +++ b/src/ir/effects.h @@ -223,6 +223,9 @@ struct EffectAnalyzer void visitCall(Call* curr) { calls = true; + if (curr->isReturn) { + branches = true; + } if (debugInfo) { // debugInfo call imports must be preserved very strongly, do not // move code around them @@ -230,7 +233,12 @@ struct EffectAnalyzer branches = true; } } - void visitCallIndirect(CallIndirect* curr) { calls = true; } + void visitCallIndirect(CallIndirect* curr) { + calls = true; + if (curr->isReturn) { + branches = true; + } + } void visitLocalGet(LocalGet* curr) { localsRead.insert(curr->index); } void visitLocalSet(LocalSet* curr) { localsWritten.insert(curr->index); } void visitGlobalGet(GlobalGet* curr) { globalsRead.insert(curr->name); } |