summaryrefslogtreecommitdiff
path: root/src/ir
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir')
-rw-r--r--src/ir/global-utils.h5
-rw-r--r--src/ir/properties.h7
2 files changed, 8 insertions, 4 deletions
diff --git a/src/ir/global-utils.h b/src/ir/global-utils.h
index 7dc4c6af3..053eb0456 100644
--- a/src/ir/global-utils.h
+++ b/src/ir/global-utils.h
@@ -56,13 +56,14 @@ getGlobalInitializedToImport(Module& wasm, Name module, Name base) {
inline bool canInitializeGlobal(const Expression* curr) {
if (auto* tuple = curr->dynCast<TupleMake>()) {
for (auto* op : tuple->operands) {
- if (!Properties::isSingleConstantExpression(op) && !op->is<GlobalGet>()) {
+ if (!canInitializeGlobal(op)) {
return false;
}
}
return true;
}
- return Properties::isSingleConstantExpression(curr) || curr->is<GlobalGet>();
+ return Properties::isSingleConstantExpression(curr) ||
+ curr->is<GlobalGet>() || curr->is<RttCanon>() || curr->is<RttSub>();
}
} // namespace GlobalUtils
diff --git a/src/ir/properties.h b/src/ir/properties.h
index 485a37e22..b60c74d98 100644
--- a/src/ir/properties.h
+++ b/src/ir/properties.h
@@ -80,10 +80,13 @@ inline bool isNamedControlFlow(Expression* curr) {
return false;
}
+// A constant expression is something like a Const: it has a fixed value known
+// at compile time, and passes that propagate constants can try to propagate it.
+// Constant expressions are also allowed in global initializers in wasm.
+// TODO: look into adding more things here like RttCanon.
inline bool isSingleConstantExpression(const Expression* curr) {
return curr->is<Const>() || curr->is<RefNull>() || curr->is<RefFunc>() ||
- (curr->is<I31New>() && curr->cast<I31New>()->value->is<Const>()) ||
- curr->is<RttCanon>() || curr->is<RttSub>();
+ (curr->is<I31New>() && curr->cast<I31New>()->value->is<Const>());
}
inline bool isConstantExpression(const Expression* curr) {