summaryrefslogtreecommitdiff
path: root/src/ir
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir')
-rw-r--r--src/ir/ExpressionAnalyzer.cpp6
-rw-r--r--src/ir/ExpressionManipulator.cpp5
-rw-r--r--src/ir/effects.h10
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); }