summaryrefslogtreecommitdiff
path: root/src/ir
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir')
-rw-r--r--src/ir/ReFinalize.cpp1
-rw-r--r--src/ir/cost.h7
-rw-r--r--src/ir/effects.h1
-rw-r--r--src/ir/global-utils.h2
-rw-r--r--src/ir/properties.cpp1
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;