diff options
Diffstat (limited to 'src/ir')
-rw-r--r-- | src/ir/ReFinalize.cpp | 1 | ||||
-rw-r--r-- | src/ir/cost.h | 7 | ||||
-rw-r--r-- | src/ir/effects.h | 1 | ||||
-rw-r--r-- | src/ir/global-utils.h | 2 | ||||
-rw-r--r-- | src/ir/properties.cpp | 1 |
5 files changed, 11 insertions, 1 deletions
diff --git a/src/ir/ReFinalize.cpp b/src/ir/ReFinalize.cpp index 419b83cc2..0d089a7ce 100644 --- a/src/ir/ReFinalize.cpp +++ b/src/ir/ReFinalize.cpp @@ -162,6 +162,7 @@ void ReFinalize::visitStructNew(StructNew* curr) { curr->finalize(); } void ReFinalize::visitStructGet(StructGet* curr) { curr->finalize(); } void ReFinalize::visitStructSet(StructSet* curr) { curr->finalize(); } void ReFinalize::visitArrayNew(ArrayNew* curr) { curr->finalize(); } +void ReFinalize::visitArrayInit(ArrayInit* curr) { curr->finalize(); } void ReFinalize::visitArrayGet(ArrayGet* curr) { curr->finalize(); } void ReFinalize::visitArraySet(ArraySet* curr) { curr->finalize(); } void ReFinalize::visitArrayLen(ArrayLen* curr) { curr->finalize(); } diff --git a/src/ir/cost.h b/src/ir/cost.h index 63424c8b3..e3e6aebf3 100644 --- a/src/ir/cost.h +++ b/src/ir/cost.h @@ -606,6 +606,13 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, CostType> { CostType visitArrayNew(ArrayNew* curr) { return 4 + visit(curr->rtt) + visit(curr->size) + maybeVisit(curr->init); } + CostType visitArrayInit(ArrayInit* curr) { + CostType ret = 4 + visit(curr->rtt); + for (auto* child : curr->values) { + ret += visit(child); + } + return ret; + } CostType visitArrayGet(ArrayGet* curr) { return 1 + nullCheckCost(curr->ref) + visit(curr->ref) + visit(curr->index); } diff --git a/src/ir/effects.h b/src/ir/effects.h index 475e6f2b1..ad8f68efa 100644 --- a/src/ir/effects.h +++ b/src/ir/effects.h @@ -642,6 +642,7 @@ private: } } void visitArrayNew(ArrayNew* curr) {} + void visitArrayInit(ArrayInit* curr) {} void visitArrayGet(ArrayGet* curr) { parent.readsArray = true; // traps when the arg is null or the index out of bounds diff --git a/src/ir/global-utils.h b/src/ir/global-utils.h index cf0c8e1a9..34c0e56cf 100644 --- a/src/ir/global-utils.h +++ b/src/ir/global-utils.h @@ -65,7 +65,7 @@ inline bool canInitializeGlobal(Expression* curr) { } if (Properties::isSingleConstantExpression(curr) || curr->is<GlobalGet>() || curr->is<RttCanon>() || curr->is<RttSub>() || curr->is<StructNew>() || - curr->is<ArrayNew>() || curr->is<I31New>()) { + curr->is<ArrayNew>() || curr->is<ArrayInit>() || curr->is<I31New>()) { for (auto* child : ChildIterator(curr)) { if (!canInitializeGlobal(child)) { return false; diff --git a/src/ir/properties.cpp b/src/ir/properties.cpp index fa4f299b3..4739fcaaf 100644 --- a/src/ir/properties.cpp +++ b/src/ir/properties.cpp @@ -32,6 +32,7 @@ bool isGenerative(Expression* curr, FeatureSet features) { bool generative = false; void visitStructNew(StructNew* curr) { generative = true; } void visitArrayNew(ArrayNew* curr) { generative = true; } + void visitArrayInit(ArrayInit* curr) { generative = true; } } scanner; scanner.walk(curr); return scanner.generative; |