OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/change-lowering.h" | 5 #include "src/compiler/change-lowering.h" |
6 #include "src/compiler/js-graph.h" | 6 #include "src/compiler/js-graph.h" |
7 #include "src/compiler/node-properties-inl.h" | 7 #include "src/compiler/node-properties-inl.h" |
8 #include "src/compiler/simplified-operator.h" | 8 #include "src/compiler/simplified-operator.h" |
9 #include "src/compiler/typer.h" | 9 #include "src/compiler/typer.h" |
10 #include "test/compiler-unittests/graph-unittest.h" | 10 #include "test/compiler-unittests/graph-unittest.h" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 Capture<Node*> branch; | 78 Capture<Node*> branch; |
79 EXPECT_THAT( | 79 EXPECT_THAT( |
80 phi, IsPhi(IsHeapConstant(this->true_unique()), | 80 phi, IsPhi(IsHeapConstant(this->true_unique()), |
81 IsHeapConstant(this->false_unique()), | 81 IsHeapConstant(this->false_unique()), |
82 IsMerge(IsIfTrue(AllOf(CaptureEq(&branch), | 82 IsMerge(IsIfTrue(AllOf(CaptureEq(&branch), |
83 IsBranch(val, this->graph()->start()))), | 83 IsBranch(val, this->graph()->start()))), |
84 IsIfFalse(CaptureEq(&branch))))); | 84 IsIfFalse(CaptureEq(&branch))))); |
85 } | 85 } |
86 | 86 |
87 | 87 |
| 88 TARGET_TYPED_TEST(ChangeLoweringTest, ChangeFloat64ToTagged) { |
| 89 Node* val = this->Parameter(0); |
| 90 Node* node = |
| 91 this->graph()->NewNode(this->simplified()->ChangeFloat64ToTagged(), val); |
| 92 Reduction reduction = this->Reduce(node); |
| 93 ASSERT_TRUE(reduction.Changed()); |
| 94 |
| 95 Node* finish = reduction.replacement(); |
| 96 Capture<Node*> heap_number; |
| 97 const int32_t kValueOffset = this->kHeapNumberValueOffset - kHeapObjectTag; |
| 98 EXPECT_THAT( |
| 99 finish, |
| 100 IsFinish(AllOf(CaptureEq(&heap_number), |
| 101 this->IsAllocateHeapNumber(IsValueEffect(val), |
| 102 this->graph()->start())), |
| 103 IsStore(kMachFloat64, kNoWriteBarrier, CaptureEq(&heap_number), |
| 104 IsInt32Constant(kValueOffset), val, |
| 105 CaptureEq(&heap_number), this->graph()->start()))); |
| 106 } |
| 107 |
| 108 |
88 TARGET_TYPED_TEST(ChangeLoweringTest, StringAdd) { | 109 TARGET_TYPED_TEST(ChangeLoweringTest, StringAdd) { |
89 Node* node = this->graph()->NewNode(this->simplified()->StringAdd(), | 110 Node* node = this->graph()->NewNode(this->simplified()->StringAdd(), |
90 this->Parameter(0), this->Parameter(1)); | 111 this->Parameter(0), this->Parameter(1)); |
91 Reduction reduction = this->Reduce(node); | 112 Reduction reduction = this->Reduce(node); |
92 EXPECT_FALSE(reduction.Changed()); | 113 EXPECT_FALSE(reduction.Changed()); |
93 } | 114 } |
94 | 115 |
95 | 116 |
96 class ChangeLowering32Test : public ChangeLoweringTest<int32_t> { | 117 class ChangeLowering32Test : public ChangeLoweringTest<int32_t> { |
97 public: | 118 public: |
(...skipping 16 matching lines...) Expand all Loading... |
114 Node* val = Parameter(0); | 135 Node* val = Parameter(0); |
115 Node* node = graph()->NewNode(simplified()->ChangeInt32ToTagged(), val); | 136 Node* node = graph()->NewNode(simplified()->ChangeInt32ToTagged(), val); |
116 Reduction reduction = Reduce(node); | 137 Reduction reduction = Reduce(node); |
117 ASSERT_TRUE(reduction.Changed()); | 138 ASSERT_TRUE(reduction.Changed()); |
118 | 139 |
119 Node* phi = reduction.replacement(); | 140 Node* phi = reduction.replacement(); |
120 Capture<Node*> add, branch, heap_number, if_true; | 141 Capture<Node*> add, branch, heap_number, if_true; |
121 const int32_t kValueOffset = kHeapNumberValueOffset - kHeapObjectTag; | 142 const int32_t kValueOffset = kHeapNumberValueOffset - kHeapObjectTag; |
122 EXPECT_THAT( | 143 EXPECT_THAT( |
123 phi, | 144 phi, |
124 IsPhi( | 145 IsPhi(IsFinish( |
125 IsFinish( | 146 AllOf(CaptureEq(&heap_number), |
126 AllOf( | 147 IsAllocateHeapNumber(_, CaptureEq(&if_true))), |
127 CaptureEq(&heap_number), | 148 IsStore(kMachFloat64, kNoWriteBarrier, CaptureEq(&heap_number), |
128 IsCall( | 149 IsInt32Constant(kValueOffset), |
129 _, IsHeapConstant( | 150 IsChangeInt32ToFloat64(val), CaptureEq(&heap_number), |
130 PrintableUnique<HeapObject>::CreateImmovable( | 151 CaptureEq(&if_true))), |
131 zone(), CEntryStub(isolate(), 1).GetCode())), | 152 IsProjection( |
132 IsExternalConstant(ExternalReference( | 153 0, AllOf(CaptureEq(&add), IsInt32AddWithOverflow(val, val))), |
133 Runtime::FunctionForId(Runtime::kAllocateHeapNumber), | 154 IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))), |
134 isolate())), | 155 IsIfFalse(AllOf(CaptureEq(&branch), |
135 IsInt32Constant(0), IsNumberConstant(0.0), | 156 IsBranch(IsProjection(1, CaptureEq(&add)), |
136 graph()->start(), CaptureEq(&if_true))), | 157 graph()->start())))))); |
137 IsStore(kMachFloat64, kNoWriteBarrier, CaptureEq(&heap_number), | |
138 IsInt32Constant(kValueOffset), | |
139 IsChangeInt32ToFloat64(val), CaptureEq(&heap_number), | |
140 CaptureEq(&if_true))), | |
141 IsProjection( | |
142 0, AllOf(CaptureEq(&add), IsInt32AddWithOverflow(val, val))), | |
143 IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))), | |
144 IsIfFalse(AllOf(CaptureEq(&branch), | |
145 IsBranch(IsProjection(1, CaptureEq(&add)), | |
146 graph()->start())))))); | |
147 } | 158 } |
148 | 159 |
149 | 160 |
150 TARGET_TEST_F(ChangeLowering32Test, ChangeTaggedToFloat64) { | 161 TARGET_TEST_F(ChangeLowering32Test, ChangeTaggedToFloat64) { |
151 STATIC_ASSERT(kSmiTag == 0); | 162 STATIC_ASSERT(kSmiTag == 0); |
152 STATIC_ASSERT(kSmiTagSize == 1); | 163 STATIC_ASSERT(kSmiTagSize == 1); |
153 | 164 |
154 Node* val = Parameter(0); | 165 Node* val = Parameter(0); |
155 Node* node = graph()->NewNode(simplified()->ChangeTaggedToFloat64(), val); | 166 Node* node = graph()->NewNode(simplified()->ChangeTaggedToFloat64(), val); |
156 Reduction reduction = Reduce(node); | 167 Reduction reduction = Reduce(node); |
(...skipping 14 matching lines...) Expand all Loading... |
171 IsMerge( | 182 IsMerge( |
172 AllOf(CaptureEq(&if_true), | 183 AllOf(CaptureEq(&if_true), |
173 IsIfTrue(AllOf( | 184 IsIfTrue(AllOf( |
174 CaptureEq(&branch), | 185 CaptureEq(&branch), |
175 IsBranch(IsWord32And(val, IsInt32Constant(kSmiTagMask)), | 186 IsBranch(IsWord32And(val, IsInt32Constant(kSmiTagMask)), |
176 graph()->start())))), | 187 graph()->start())))), |
177 IsIfFalse(CaptureEq(&branch))))); | 188 IsIfFalse(CaptureEq(&branch))))); |
178 } | 189 } |
179 | 190 |
180 | 191 |
| 192 TARGET_TEST_F(ChangeLowering32Test, ChangeTaggedToInt32) { |
| 193 STATIC_ASSERT(kSmiTag == 0); |
| 194 STATIC_ASSERT(kSmiTagSize == 1); |
| 195 |
| 196 Node* val = Parameter(0); |
| 197 Node* node = graph()->NewNode(simplified()->ChangeTaggedToInt32(), val); |
| 198 Reduction reduction = Reduce(node); |
| 199 ASSERT_TRUE(reduction.Changed()); |
| 200 |
| 201 const int32_t kShiftAmount = |
| 202 kSmiTagSize + SmiTagging<kPointerSize>::kSmiShiftSize; |
| 203 const int32_t kValueOffset = kHeapNumberValueOffset - kHeapObjectTag; |
| 204 Node* phi = reduction.replacement(); |
| 205 Capture<Node*> branch, if_true; |
| 206 EXPECT_THAT( |
| 207 phi, |
| 208 IsPhi(IsChangeFloat64ToInt32( |
| 209 IsLoad(kMachFloat64, val, IsInt32Constant(kValueOffset), |
| 210 IsControlEffect(CaptureEq(&if_true)))), |
| 211 IsWord32Sar(val, IsInt32Constant(kShiftAmount)), |
| 212 IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))), |
| 213 IsIfFalse(AllOf( |
| 214 CaptureEq(&branch), |
| 215 IsBranch(IsWord32And(val, IsInt32Constant(kSmiTagMask)), |
| 216 graph()->start())))))); |
| 217 } |
| 218 |
| 219 |
181 class ChangeLowering64Test : public ChangeLoweringTest<int64_t> { | 220 class ChangeLowering64Test : public ChangeLoweringTest<int64_t> { |
182 public: | 221 public: |
183 virtual ~ChangeLowering64Test() {} | 222 virtual ~ChangeLowering64Test() {} |
184 }; | 223 }; |
185 | 224 |
186 | 225 |
187 TARGET_TEST_F(ChangeLowering64Test, ChangeBoolToBit) { | 226 TARGET_TEST_F(ChangeLowering64Test, ChangeBoolToBit) { |
188 Node* val = Parameter(0); | 227 Node* val = Parameter(0); |
189 Node* node = graph()->NewNode(simplified()->ChangeBoolToBit(), val); | 228 Node* node = graph()->NewNode(simplified()->ChangeBoolToBit(), val); |
190 Reduction reduction = Reduce(node); | 229 Reduction reduction = Reduce(node); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 IsWord64Sar(val, IsInt32Constant(kShiftAmount)))), | 270 IsWord64Sar(val, IsInt32Constant(kShiftAmount)))), |
232 IsMerge( | 271 IsMerge( |
233 AllOf(CaptureEq(&if_true), | 272 AllOf(CaptureEq(&if_true), |
234 IsIfTrue(AllOf( | 273 IsIfTrue(AllOf( |
235 CaptureEq(&branch), | 274 CaptureEq(&branch), |
236 IsBranch(IsWord64And(val, IsInt32Constant(kSmiTagMask)), | 275 IsBranch(IsWord64And(val, IsInt32Constant(kSmiTagMask)), |
237 graph()->start())))), | 276 graph()->start())))), |
238 IsIfFalse(CaptureEq(&branch))))); | 277 IsIfFalse(CaptureEq(&branch))))); |
239 } | 278 } |
240 | 279 |
| 280 |
| 281 TARGET_TEST_F(ChangeLowering64Test, ChangeTaggedToInt32) { |
| 282 STATIC_ASSERT(kSmiTag == 0); |
| 283 STATIC_ASSERT(kSmiTagSize == 1); |
| 284 |
| 285 Node* val = Parameter(0); |
| 286 Node* node = graph()->NewNode(simplified()->ChangeTaggedToInt32(), val); |
| 287 Reduction reduction = Reduce(node); |
| 288 ASSERT_TRUE(reduction.Changed()); |
| 289 |
| 290 const int32_t kShiftAmount = |
| 291 kSmiTagSize + SmiTagging<kPointerSize>::kSmiShiftSize; |
| 292 const int32_t kValueOffset = kHeapNumberValueOffset - kHeapObjectTag; |
| 293 Node* phi = reduction.replacement(); |
| 294 Capture<Node*> branch, if_true; |
| 295 EXPECT_THAT( |
| 296 phi, |
| 297 IsPhi(IsChangeFloat64ToInt32( |
| 298 IsLoad(kMachFloat64, val, IsInt32Constant(kValueOffset), |
| 299 IsControlEffect(CaptureEq(&if_true)))), |
| 300 IsConvertInt64ToInt32( |
| 301 IsWord64Sar(val, IsInt32Constant(kShiftAmount))), |
| 302 IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))), |
| 303 IsIfFalse(AllOf( |
| 304 CaptureEq(&branch), |
| 305 IsBranch(IsWord64And(val, IsInt32Constant(kSmiTagMask)), |
| 306 graph()->start())))))); |
| 307 } |
| 308 |
241 } // namespace compiler | 309 } // namespace compiler |
242 } // namespace internal | 310 } // namespace internal |
243 } // namespace v8 | 311 } // namespace v8 |
OLD | NEW |