diff options
Diffstat (limited to 'src/ir')
-rw-r--r-- | src/ir/global-utils.h | 5 | ||||
-rw-r--r-- | src/ir/properties.h | 7 |
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) { |