| 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/code-stubs.h" | 5 #include "src/code-stubs.h" | 
| 6 #include "src/compiler/change-lowering.h" | 6 #include "src/compiler/change-lowering.h" | 
| 7 #include "src/compiler/js-graph.h" | 7 #include "src/compiler/js-graph.h" | 
| 8 #include "src/compiler/node-properties-inl.h" | 8 #include "src/compiler/node-properties-inl.h" | 
| 9 #include "src/compiler/simplified-operator.h" | 9 #include "src/compiler/simplified-operator.h" | 
| 10 #include "test/unittests/compiler/compiler-test-utils.h" | 10 #include "test/unittests/compiler/compiler-test-utils.h" | 
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 83         _, IsHeapConstant(Unique<HeapObject>::CreateImmovable( | 83         _, IsHeapConstant(Unique<HeapObject>::CreateImmovable( | 
| 84                CEntryStub(isolate(), 1).GetCode())), | 84                CEntryStub(isolate(), 1).GetCode())), | 
| 85         IsExternalConstant(ExternalReference( | 85         IsExternalConstant(ExternalReference( | 
| 86             Runtime::FunctionForId(Runtime::kAllocateHeapNumber), isolate())), | 86             Runtime::FunctionForId(Runtime::kAllocateHeapNumber), isolate())), | 
| 87         IsInt32Constant(0), IsNumberConstant(0.0), effect_matcher, | 87         IsInt32Constant(0), IsNumberConstant(0.0), effect_matcher, | 
| 88         control_matcher); | 88         control_matcher); | 
| 89   } | 89   } | 
| 90   Matcher<Node*> IsLoadHeapNumber(const Matcher<Node*>& value_matcher, | 90   Matcher<Node*> IsLoadHeapNumber(const Matcher<Node*>& value_matcher, | 
| 91                                   const Matcher<Node*>& control_matcher) { | 91                                   const Matcher<Node*>& control_matcher) { | 
| 92     return IsLoad(kMachFloat64, value_matcher, | 92     return IsLoad(kMachFloat64, value_matcher, | 
| 93                   IsInt32Constant(HeapNumberValueOffset()), graph()->start(), | 93                   IsIntPtrConstant(HeapNumberValueOffset()), graph()->start(), | 
| 94                   control_matcher); | 94                   control_matcher); | 
| 95   } | 95   } | 
|  | 96   Matcher<Node*> IsIntPtrConstant(int value) { | 
|  | 97     return Is32() ? IsInt32Constant(value) : IsInt64Constant(value); | 
|  | 98   } | 
| 96   Matcher<Node*> IsWordEqual(const Matcher<Node*>& lhs_matcher, | 99   Matcher<Node*> IsWordEqual(const Matcher<Node*>& lhs_matcher, | 
| 97                              const Matcher<Node*>& rhs_matcher) { | 100                              const Matcher<Node*>& rhs_matcher) { | 
| 98     return Is32() ? IsWord32Equal(lhs_matcher, rhs_matcher) | 101     return Is32() ? IsWord32Equal(lhs_matcher, rhs_matcher) | 
| 99                   : IsWord64Equal(lhs_matcher, rhs_matcher); | 102                   : IsWord64Equal(lhs_matcher, rhs_matcher); | 
| 100   } | 103   } | 
| 101 | 104 | 
| 102  private: | 105  private: | 
| 103   SimplifiedOperatorBuilder simplified_; | 106   SimplifiedOperatorBuilder simplified_; | 
| 104 }; | 107 }; | 
| 105 | 108 | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 155 | 158 | 
| 156   Node* finish = reduction.replacement(); | 159   Node* finish = reduction.replacement(); | 
| 157   Capture<Node*> heap_number; | 160   Capture<Node*> heap_number; | 
| 158   EXPECT_THAT( | 161   EXPECT_THAT( | 
| 159       finish, | 162       finish, | 
| 160       IsFinish( | 163       IsFinish( | 
| 161           AllOf(CaptureEq(&heap_number), | 164           AllOf(CaptureEq(&heap_number), | 
| 162                 IsAllocateHeapNumber(IsValueEffect(val), graph()->start())), | 165                 IsAllocateHeapNumber(IsValueEffect(val), graph()->start())), | 
| 163           IsStore(StoreRepresentation(kMachFloat64, kNoWriteBarrier), | 166           IsStore(StoreRepresentation(kMachFloat64, kNoWriteBarrier), | 
| 164                   CaptureEq(&heap_number), | 167                   CaptureEq(&heap_number), | 
| 165                   IsInt32Constant(HeapNumberValueOffset()), val, | 168                   IsIntPtrConstant(HeapNumberValueOffset()), val, | 
| 166                   CaptureEq(&heap_number), graph()->start()))); | 169                   CaptureEq(&heap_number), graph()->start()))); | 
| 167 } | 170 } | 
| 168 | 171 | 
| 169 | 172 | 
| 170 TARGET_TEST_P(ChangeLoweringCommonTest, StringAdd) { | 173 TARGET_TEST_P(ChangeLoweringCommonTest, StringAdd) { | 
| 171   Node* node = | 174   Node* node = | 
| 172       graph()->NewNode(simplified()->StringAdd(), Parameter(0), Parameter(1)); | 175       graph()->NewNode(simplified()->StringAdd(), Parameter(0), Parameter(1)); | 
| 173   Reduction reduction = Reduce(node); | 176   Reduction reduction = Reduce(node); | 
| 174   EXPECT_FALSE(reduction.Changed()); | 177   EXPECT_FALSE(reduction.Changed()); | 
| 175 } | 178 } | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 200 | 203 | 
| 201   Node* phi = reduction.replacement(); | 204   Node* phi = reduction.replacement(); | 
| 202   Capture<Node*> add, branch, heap_number, if_true; | 205   Capture<Node*> add, branch, heap_number, if_true; | 
| 203   EXPECT_THAT( | 206   EXPECT_THAT( | 
| 204       phi, | 207       phi, | 
| 205       IsPhi(kMachAnyTagged, | 208       IsPhi(kMachAnyTagged, | 
| 206             IsFinish(AllOf(CaptureEq(&heap_number), | 209             IsFinish(AllOf(CaptureEq(&heap_number), | 
| 207                            IsAllocateHeapNumber(_, CaptureEq(&if_true))), | 210                            IsAllocateHeapNumber(_, CaptureEq(&if_true))), | 
| 208                      IsStore(StoreRepresentation(kMachFloat64, kNoWriteBarrier), | 211                      IsStore(StoreRepresentation(kMachFloat64, kNoWriteBarrier), | 
| 209                              CaptureEq(&heap_number), | 212                              CaptureEq(&heap_number), | 
| 210                              IsInt32Constant(HeapNumberValueOffset()), | 213                              IsIntPtrConstant(HeapNumberValueOffset()), | 
| 211                              IsChangeInt32ToFloat64(val), | 214                              IsChangeInt32ToFloat64(val), | 
| 212                              CaptureEq(&heap_number), CaptureEq(&if_true))), | 215                              CaptureEq(&heap_number), CaptureEq(&if_true))), | 
| 213             IsProjection( | 216             IsProjection( | 
| 214                 0, AllOf(CaptureEq(&add), IsInt32AddWithOverflow(val, val))), | 217                 0, AllOf(CaptureEq(&add), IsInt32AddWithOverflow(val, val))), | 
| 215             IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))), | 218             IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))), | 
| 216                     IsIfFalse(AllOf(CaptureEq(&branch), | 219                     IsIfFalse(AllOf(CaptureEq(&branch), | 
| 217                                     IsBranch(IsProjection(1, CaptureEq(&add)), | 220                                     IsBranch(IsProjection(1, CaptureEq(&add)), | 
| 218                                              graph()->start())))))); | 221                                              graph()->start())))))); | 
| 219 } | 222 } | 
| 220 | 223 | 
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 339 | 342 | 
| 340 | 343 | 
| 341 TARGET_TEST_F(ChangeLowering64Test, ChangeInt32ToTagged) { | 344 TARGET_TEST_F(ChangeLowering64Test, ChangeInt32ToTagged) { | 
| 342   Node* val = Parameter(0); | 345   Node* val = Parameter(0); | 
| 343   Node* node = graph()->NewNode(simplified()->ChangeInt32ToTagged(), val); | 346   Node* node = graph()->NewNode(simplified()->ChangeInt32ToTagged(), val); | 
| 344   Reduction reduction = Reduce(node); | 347   Reduction reduction = Reduce(node); | 
| 345   ASSERT_TRUE(reduction.Changed()); | 348   ASSERT_TRUE(reduction.Changed()); | 
| 346 | 349 | 
| 347   EXPECT_THAT(reduction.replacement(), | 350   EXPECT_THAT(reduction.replacement(), | 
| 348               IsWord64Shl(IsChangeInt32ToInt64(val), | 351               IsWord64Shl(IsChangeInt32ToInt64(val), | 
| 349                           IsInt32Constant(SmiShiftAmount()))); | 352                           IsInt64Constant(SmiShiftAmount()))); | 
| 350 } | 353 } | 
| 351 | 354 | 
| 352 | 355 | 
| 353 TARGET_TEST_F(ChangeLowering64Test, ChangeTaggedToFloat64) { | 356 TARGET_TEST_F(ChangeLowering64Test, ChangeTaggedToFloat64) { | 
| 354   STATIC_ASSERT(kSmiTag == 0); | 357   STATIC_ASSERT(kSmiTag == 0); | 
| 355   STATIC_ASSERT(kSmiTagSize == 1); | 358   STATIC_ASSERT(kSmiTagSize == 1); | 
| 356 | 359 | 
| 357   Node* val = Parameter(0); | 360   Node* val = Parameter(0); | 
| 358   Node* node = graph()->NewNode(simplified()->ChangeTaggedToFloat64(), val); | 361   Node* node = graph()->NewNode(simplified()->ChangeTaggedToFloat64(), val); | 
| 359   Reduction reduction = Reduce(node); | 362   Reduction reduction = Reduce(node); | 
| 360   ASSERT_TRUE(reduction.Changed()); | 363   ASSERT_TRUE(reduction.Changed()); | 
| 361 | 364 | 
| 362   Node* phi = reduction.replacement(); | 365   Node* phi = reduction.replacement(); | 
| 363   Capture<Node*> branch, if_true; | 366   Capture<Node*> branch, if_true; | 
| 364   EXPECT_THAT( | 367   EXPECT_THAT( | 
| 365       phi, | 368       phi, | 
| 366       IsPhi( | 369       IsPhi( | 
| 367           kMachFloat64, IsLoadHeapNumber(val, CaptureEq(&if_true)), | 370           kMachFloat64, IsLoadHeapNumber(val, CaptureEq(&if_true)), | 
| 368           IsChangeInt32ToFloat64(IsTruncateInt64ToInt32( | 371           IsChangeInt32ToFloat64(IsTruncateInt64ToInt32( | 
| 369               IsWord64Sar(val, IsInt32Constant(SmiShiftAmount())))), | 372               IsWord64Sar(val, IsInt64Constant(SmiShiftAmount())))), | 
| 370           IsMerge( | 373           IsMerge( | 
| 371               AllOf(CaptureEq(&if_true), | 374               AllOf(CaptureEq(&if_true), | 
| 372                     IsIfTrue(AllOf( | 375                     IsIfTrue(AllOf( | 
| 373                         CaptureEq(&branch), | 376                         CaptureEq(&branch), | 
| 374                         IsBranch(IsWord64And(val, IsInt32Constant(kSmiTagMask)), | 377                         IsBranch(IsWord64And(val, IsInt64Constant(kSmiTagMask)), | 
| 375                                  graph()->start())))), | 378                                  graph()->start())))), | 
| 376               IsIfFalse(CaptureEq(&branch))))); | 379               IsIfFalse(CaptureEq(&branch))))); | 
| 377 } | 380 } | 
| 378 | 381 | 
| 379 | 382 | 
| 380 TARGET_TEST_F(ChangeLowering64Test, ChangeTaggedToInt32) { | 383 TARGET_TEST_F(ChangeLowering64Test, ChangeTaggedToInt32) { | 
| 381   STATIC_ASSERT(kSmiTag == 0); | 384   STATIC_ASSERT(kSmiTag == 0); | 
| 382   STATIC_ASSERT(kSmiTagSize == 1); | 385   STATIC_ASSERT(kSmiTagSize == 1); | 
| 383 | 386 | 
| 384   Node* val = Parameter(0); | 387   Node* val = Parameter(0); | 
| 385   Node* node = graph()->NewNode(simplified()->ChangeTaggedToInt32(), val); | 388   Node* node = graph()->NewNode(simplified()->ChangeTaggedToInt32(), val); | 
| 386   Reduction reduction = Reduce(node); | 389   Reduction reduction = Reduce(node); | 
| 387   ASSERT_TRUE(reduction.Changed()); | 390   ASSERT_TRUE(reduction.Changed()); | 
| 388 | 391 | 
| 389   Node* phi = reduction.replacement(); | 392   Node* phi = reduction.replacement(); | 
| 390   Capture<Node*> branch, if_true; | 393   Capture<Node*> branch, if_true; | 
| 391   EXPECT_THAT( | 394   EXPECT_THAT( | 
| 392       phi, | 395       phi, | 
| 393       IsPhi(kMachInt32, | 396       IsPhi(kMachInt32, | 
| 394             IsChangeFloat64ToInt32(IsLoadHeapNumber(val, CaptureEq(&if_true))), | 397             IsChangeFloat64ToInt32(IsLoadHeapNumber(val, CaptureEq(&if_true))), | 
| 395             IsTruncateInt64ToInt32( | 398             IsTruncateInt64ToInt32( | 
| 396                 IsWord64Sar(val, IsInt32Constant(SmiShiftAmount()))), | 399                 IsWord64Sar(val, IsInt64Constant(SmiShiftAmount()))), | 
| 397             IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))), | 400             IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))), | 
| 398                     IsIfFalse(AllOf( | 401                     IsIfFalse(AllOf( | 
| 399                         CaptureEq(&branch), | 402                         CaptureEq(&branch), | 
| 400                         IsBranch(IsWord64And(val, IsInt32Constant(kSmiTagMask)), | 403                         IsBranch(IsWord64And(val, IsInt64Constant(kSmiTagMask)), | 
| 401                                  graph()->start())))))); | 404                                  graph()->start())))))); | 
| 402 } | 405 } | 
| 403 | 406 | 
| 404 | 407 | 
| 405 TARGET_TEST_F(ChangeLowering64Test, ChangeTaggedToUint32) { | 408 TARGET_TEST_F(ChangeLowering64Test, ChangeTaggedToUint32) { | 
| 406   STATIC_ASSERT(kSmiTag == 0); | 409   STATIC_ASSERT(kSmiTag == 0); | 
| 407   STATIC_ASSERT(kSmiTagSize == 1); | 410   STATIC_ASSERT(kSmiTagSize == 1); | 
| 408 | 411 | 
| 409   Node* val = Parameter(0); | 412   Node* val = Parameter(0); | 
| 410   Node* node = graph()->NewNode(simplified()->ChangeTaggedToUint32(), val); | 413   Node* node = graph()->NewNode(simplified()->ChangeTaggedToUint32(), val); | 
| 411   Reduction reduction = Reduce(node); | 414   Reduction reduction = Reduce(node); | 
| 412   ASSERT_TRUE(reduction.Changed()); | 415   ASSERT_TRUE(reduction.Changed()); | 
| 413 | 416 | 
| 414   Node* phi = reduction.replacement(); | 417   Node* phi = reduction.replacement(); | 
| 415   Capture<Node*> branch, if_true; | 418   Capture<Node*> branch, if_true; | 
| 416   EXPECT_THAT( | 419   EXPECT_THAT( | 
| 417       phi, | 420       phi, | 
| 418       IsPhi(kMachUint32, | 421       IsPhi(kMachUint32, | 
| 419             IsChangeFloat64ToUint32(IsLoadHeapNumber(val, CaptureEq(&if_true))), | 422             IsChangeFloat64ToUint32(IsLoadHeapNumber(val, CaptureEq(&if_true))), | 
| 420             IsTruncateInt64ToInt32( | 423             IsTruncateInt64ToInt32( | 
| 421                 IsWord64Sar(val, IsInt32Constant(SmiShiftAmount()))), | 424                 IsWord64Sar(val, IsInt64Constant(SmiShiftAmount()))), | 
| 422             IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))), | 425             IsMerge(AllOf(CaptureEq(&if_true), IsIfTrue(CaptureEq(&branch))), | 
| 423                     IsIfFalse(AllOf( | 426                     IsIfFalse(AllOf( | 
| 424                         CaptureEq(&branch), | 427                         CaptureEq(&branch), | 
| 425                         IsBranch(IsWord64And(val, IsInt32Constant(kSmiTagMask)), | 428                         IsBranch(IsWord64And(val, IsInt64Constant(kSmiTagMask)), | 
| 426                                  graph()->start())))))); | 429                                  graph()->start())))))); | 
| 427 } | 430 } | 
| 428 | 431 | 
| 429 | 432 | 
| 430 TARGET_TEST_F(ChangeLowering64Test, ChangeUint32ToTagged) { | 433 TARGET_TEST_F(ChangeLowering64Test, ChangeUint32ToTagged) { | 
| 431   STATIC_ASSERT(kSmiTag == 0); | 434   STATIC_ASSERT(kSmiTag == 0); | 
| 432   STATIC_ASSERT(kSmiTagSize == 1); | 435   STATIC_ASSERT(kSmiTagSize == 1); | 
| 433 | 436 | 
| 434   Node* val = Parameter(0); | 437   Node* val = Parameter(0); | 
| 435   Node* node = graph()->NewNode(simplified()->ChangeUint32ToTagged(), val); | 438   Node* node = graph()->NewNode(simplified()->ChangeUint32ToTagged(), val); | 
| 436   Reduction reduction = Reduce(node); | 439   Reduction reduction = Reduce(node); | 
| 437   ASSERT_TRUE(reduction.Changed()); | 440   ASSERT_TRUE(reduction.Changed()); | 
| 438 | 441 | 
| 439   Node* phi = reduction.replacement(); | 442   Node* phi = reduction.replacement(); | 
| 440   Capture<Node*> branch, heap_number, if_false; | 443   Capture<Node*> branch, heap_number, if_false; | 
| 441   EXPECT_THAT( | 444   EXPECT_THAT( | 
| 442       phi, | 445       phi, | 
| 443       IsPhi( | 446       IsPhi( | 
| 444           kMachAnyTagged, IsWord64Shl(IsChangeUint32ToUint64(val), | 447           kMachAnyTagged, IsWord64Shl(IsChangeUint32ToUint64(val), | 
| 445                                       IsInt32Constant(SmiShiftAmount())), | 448                                       IsInt64Constant(SmiShiftAmount())), | 
| 446           IsFinish(AllOf(CaptureEq(&heap_number), | 449           IsFinish(AllOf(CaptureEq(&heap_number), | 
| 447                          IsAllocateHeapNumber(_, CaptureEq(&if_false))), | 450                          IsAllocateHeapNumber(_, CaptureEq(&if_false))), | 
| 448                    IsStore(StoreRepresentation(kMachFloat64, kNoWriteBarrier), | 451                    IsStore(StoreRepresentation(kMachFloat64, kNoWriteBarrier), | 
| 449                            CaptureEq(&heap_number), | 452                            CaptureEq(&heap_number), | 
| 450                            IsInt32Constant(HeapNumberValueOffset()), | 453                            IsInt64Constant(HeapNumberValueOffset()), | 
| 451                            IsChangeUint32ToFloat64(val), | 454                            IsChangeUint32ToFloat64(val), | 
| 452                            CaptureEq(&heap_number), CaptureEq(&if_false))), | 455                            CaptureEq(&heap_number), CaptureEq(&if_false))), | 
| 453           IsMerge( | 456           IsMerge( | 
| 454               IsIfTrue(AllOf(CaptureEq(&branch), | 457               IsIfTrue(AllOf(CaptureEq(&branch), | 
| 455                              IsBranch(IsUint32LessThanOrEqual( | 458                              IsBranch(IsUint32LessThanOrEqual( | 
| 456                                           val, IsInt32Constant(SmiMaxValue())), | 459                                           val, IsInt64Constant(SmiMaxValue())), | 
| 457                                       graph()->start()))), | 460                                       graph()->start()))), | 
| 458               AllOf(CaptureEq(&if_false), IsIfFalse(CaptureEq(&branch)))))); | 461               AllOf(CaptureEq(&if_false), IsIfFalse(CaptureEq(&branch)))))); | 
| 459 } | 462 } | 
| 460 | 463 | 
| 461 }  // namespace compiler | 464 }  // namespace compiler | 
| 462 }  // namespace internal | 465 }  // namespace internal | 
| 463 }  // namespace v8 | 466 }  // namespace v8 | 
| OLD | NEW | 
|---|