Index: test/unittests/compiler/escape-analysis-unittest.cc |
diff --git a/test/unittests/compiler/escape-analysis-unittest.cc b/test/unittests/compiler/escape-analysis-unittest.cc |
index b088367a583ec0f87933723718389ea189a1e090..760103f6068478001d5ba9757c2a5ff3901f9886 100644 |
--- a/test/unittests/compiler/escape-analysis-unittest.cc |
+++ b/test/unittests/compiler/escape-analysis-unittest.cc |
@@ -85,6 +85,20 @@ class EscapeAnalysisTest : public GraphTest { |
allocation, value, effect, control); |
} |
+ Node* StoreElement(const ElementAccess& access, Node* allocation, Node* index, |
+ Node* value, Node* effect = nullptr, |
+ Node* control = nullptr) { |
+ if (!effect) { |
+ effect = effect_; |
+ } |
+ if (!control) { |
+ control = control_; |
+ } |
+ return effect_ = |
+ graph()->NewNode(simplified()->StoreElement(access), allocation, |
+ index, value, effect, control); |
+ } |
+ |
Node* Load(const FieldAccess& access, Node* from, Node* effect = nullptr, |
Node* control = nullptr) { |
if (!effect) { |
@@ -131,12 +145,18 @@ class EscapeAnalysisTest : public GraphTest { |
return control_ = graph()->NewNode(common()->Merge(2), control1, control2); |
} |
- FieldAccess AccessAtIndex(int offset) { |
+ FieldAccess FieldAccessAtIndex(int offset) { |
FieldAccess access = {kTaggedBase, offset, MaybeHandle<Name>(), Type::Any(), |
MachineType::AnyTagged()}; |
return access; |
} |
+ ElementAccess MakeElementAccess(int header_size) { |
+ ElementAccess access = {kTaggedBase, header_size, Type::Any(), |
+ MachineType::AnyTagged()}; |
+ return access; |
+ } |
+ |
// ---------------------------------Assertion Helper-------------------------- |
void ExpectReplacement(Node* node, Node* rep) { |
@@ -166,6 +186,7 @@ class EscapeAnalysisTest : public GraphTest { |
SimplifiedOperatorBuilder* simplified() { return &simplified_; } |
Node* effect() { return effect_; } |
+ Node* control() { return control_; } |
private: |
SimplifiedOperatorBuilder simplified_; |
@@ -185,9 +206,9 @@ TEST_F(EscapeAnalysisTest, StraightNonEscape) { |
Node* object1 = Constant(1); |
BeginRegion(); |
Node* allocation = Allocate(Constant(kPointerSize)); |
- Store(AccessAtIndex(0), allocation, object1); |
+ Store(FieldAccessAtIndex(0), allocation, object1); |
Node* finish = FinishRegion(allocation); |
- Node* load = Load(AccessAtIndex(0), finish); |
+ Node* load = Load(FieldAccessAtIndex(0), finish); |
Node* result = Return(load); |
EndGraph(); |
@@ -202,13 +223,39 @@ TEST_F(EscapeAnalysisTest, StraightNonEscape) { |
} |
+TEST_F(EscapeAnalysisTest, StraightNonEscapeNonConstStore) { |
+ Node* object1 = Constant(1); |
+ Node* object2 = Constant(2); |
+ BeginRegion(); |
+ Node* allocation = Allocate(Constant(kPointerSize)); |
+ Store(FieldAccessAtIndex(0), allocation, object1); |
+ Node* index = |
+ graph()->NewNode(common()->Select(MachineRepresentation::kTagged), |
+ object1, object2, control()); |
+ StoreElement(MakeElementAccess(0), allocation, index, object1); |
+ Node* finish = FinishRegion(allocation); |
+ Node* load = Load(FieldAccessAtIndex(0), finish); |
+ Node* result = Return(load); |
+ EndGraph(); |
+ |
+ Analysis(); |
+ |
+ ExpectEscaped(allocation); |
+ ExpectReplacement(load, nullptr); |
+ |
+ Transformation(); |
+ |
+ ASSERT_EQ(load, NodeProperties::GetValueInput(result, 0)); |
+} |
+ |
+ |
TEST_F(EscapeAnalysisTest, StraightEscape) { |
Node* object1 = Constant(1); |
BeginRegion(); |
Node* allocation = Allocate(Constant(kPointerSize)); |
- Store(AccessAtIndex(0), allocation, object1); |
+ Store(FieldAccessAtIndex(0), allocation, object1); |
Node* finish = FinishRegion(allocation); |
- Node* load = Load(AccessAtIndex(0), finish); |
+ Node* load = Load(FieldAccessAtIndex(0), finish); |
Node* result = Return(allocation); |
EndGraph(); |
graph()->end()->AppendInput(zone(), load); |
@@ -229,15 +276,15 @@ TEST_F(EscapeAnalysisTest, StoreLoadEscape) { |
BeginRegion(); |
Node* allocation1 = Allocate(Constant(kPointerSize)); |
- Store(AccessAtIndex(0), allocation1, object1); |
+ Store(FieldAccessAtIndex(0), allocation1, object1); |
Node* finish1 = FinishRegion(allocation1); |
BeginRegion(); |
Node* allocation2 = Allocate(Constant(kPointerSize)); |
- Store(AccessAtIndex(0), allocation2, finish1); |
+ Store(FieldAccessAtIndex(0), allocation2, finish1); |
Node* finish2 = FinishRegion(allocation2); |
- Node* load = Load(AccessAtIndex(0), finish2); |
+ Node* load = Load(FieldAccessAtIndex(0), finish2); |
Node* result = Return(load); |
EndGraph(); |
Analysis(); |
@@ -257,16 +304,18 @@ TEST_F(EscapeAnalysisTest, BranchNonEscape) { |
Node* object2 = Constant(2); |
BeginRegion(); |
Node* allocation = Allocate(Constant(kPointerSize)); |
- Store(AccessAtIndex(0), allocation, object1); |
+ Store(FieldAccessAtIndex(0), allocation, object1); |
Node* finish = FinishRegion(allocation); |
Branch(); |
Node* ifFalse = IfFalse(); |
Node* ifTrue = IfTrue(); |
- Node* effect1 = Store(AccessAtIndex(0), allocation, object1, finish, ifFalse); |
- Node* effect2 = Store(AccessAtIndex(0), allocation, object2, finish, ifTrue); |
+ Node* effect1 = |
+ Store(FieldAccessAtIndex(0), allocation, object1, finish, ifFalse); |
+ Node* effect2 = |
+ Store(FieldAccessAtIndex(0), allocation, object2, finish, ifTrue); |
Node* merge = Merge2(ifFalse, ifTrue); |
Node* phi = graph()->NewNode(common()->EffectPhi(2), effect1, effect2, merge); |
- Node* load = Load(AccessAtIndex(0), finish, phi, merge); |
+ Node* load = Load(FieldAccessAtIndex(0), finish, phi, merge); |
Node* result = Return(load, phi); |
EndGraph(); |
graph()->end()->AppendInput(zone(), result); |
@@ -287,10 +336,10 @@ TEST_F(EscapeAnalysisTest, DanglingLoadOrder) { |
Node* object1 = Constant(1); |
Node* object2 = Constant(2); |
Node* allocation = Allocate(Constant(kPointerSize)); |
- Node* store1 = Store(AccessAtIndex(0), allocation, object1); |
- Node* load1 = Load(AccessAtIndex(0), allocation); |
- Node* store2 = Store(AccessAtIndex(0), allocation, object2); |
- Node* load2 = Load(AccessAtIndex(0), allocation, store1); |
+ Node* store1 = Store(FieldAccessAtIndex(0), allocation, object1); |
+ Node* load1 = Load(FieldAccessAtIndex(0), allocation); |
+ Node* store2 = Store(FieldAccessAtIndex(0), allocation, object2); |
+ Node* load2 = Load(FieldAccessAtIndex(0), allocation, store1); |
Node* result = Return(load2); |
EndGraph(); |
graph()->end()->AppendInput(zone(), store2); |
@@ -312,9 +361,9 @@ TEST_F(EscapeAnalysisTest, DeoptReplacement) { |
Node* object1 = Constant(1); |
BeginRegion(); |
Node* allocation = Allocate(Constant(kPointerSize)); |
- Store(AccessAtIndex(0), allocation, object1); |
+ Store(FieldAccessAtIndex(0), allocation, object1); |
Node* finish = FinishRegion(allocation); |
- Node* effect1 = Store(AccessAtIndex(0), allocation, object1, finish); |
+ Node* effect1 = Store(FieldAccessAtIndex(0), allocation, object1, finish); |
Branch(); |
Node* ifFalse = IfFalse(); |
Node* state_values1 = graph()->NewNode(common()->StateValues(1), finish); |
@@ -328,7 +377,7 @@ TEST_F(EscapeAnalysisTest, DeoptReplacement) { |
Node* deopt = graph()->NewNode(common()->Deoptimize(DeoptimizeKind::kEager), |
frame_state, effect1, ifFalse); |
Node* ifTrue = IfTrue(); |
- Node* load = Load(AccessAtIndex(0), finish, effect1, ifTrue); |
+ Node* load = Load(FieldAccessAtIndex(0), finish, effect1, ifTrue); |
Node* result = Return(load, effect1, ifTrue); |
EndGraph(); |
graph()->end()->AppendInput(zone(), deopt); |
@@ -351,10 +400,10 @@ TEST_F(EscapeAnalysisTest, DeoptReplacementIdentity) { |
Node* object1 = Constant(1); |
BeginRegion(); |
Node* allocation = Allocate(Constant(kPointerSize * 2)); |
- Store(AccessAtIndex(0), allocation, object1); |
- Store(AccessAtIndex(kPointerSize), allocation, allocation); |
+ Store(FieldAccessAtIndex(0), allocation, object1); |
+ Store(FieldAccessAtIndex(kPointerSize), allocation, allocation); |
Node* finish = FinishRegion(allocation); |
- Node* effect1 = Store(AccessAtIndex(0), allocation, object1, finish); |
+ Node* effect1 = Store(FieldAccessAtIndex(0), allocation, object1, finish); |
Branch(); |
Node* ifFalse = IfFalse(); |
Node* state_values1 = graph()->NewNode(common()->StateValues(1), finish); |
@@ -368,7 +417,7 @@ TEST_F(EscapeAnalysisTest, DeoptReplacementIdentity) { |
Node* deopt = graph()->NewNode(common()->Deoptimize(DeoptimizeKind::kEager), |
frame_state, effect1, ifFalse); |
Node* ifTrue = IfTrue(); |
- Node* load = Load(AccessAtIndex(0), finish, effect1, ifTrue); |
+ Node* load = Load(FieldAccessAtIndex(0), finish, effect1, ifTrue); |
Node* result = Return(load, effect1, ifTrue); |
EndGraph(); |
graph()->end()->AppendInput(zone(), deopt); |