| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/node-properties.h" | 5 #include "src/compiler/node-properties.h" |
| 6 #include "src/compiler/common-operator.h" | 6 #include "src/compiler/common-operator.h" |
| 7 #include "src/compiler/graph.h" | 7 #include "src/compiler/graph.h" |
| 8 #include "src/compiler/js-operator.h" | 8 #include "src/compiler/js-operator.h" |
| 9 #include "src/compiler/linkage.h" | 9 #include "src/compiler/linkage.h" |
| 10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 } | 397 } |
| 398 break; | 398 break; |
| 399 } | 399 } |
| 400 case IrOpcode::kJSStoreMessage: | 400 case IrOpcode::kJSStoreMessage: |
| 401 case IrOpcode::kJSStoreModule: | 401 case IrOpcode::kJSStoreModule: |
| 402 case IrOpcode::kStoreElement: | 402 case IrOpcode::kStoreElement: |
| 403 case IrOpcode::kStoreTypedElement: { | 403 case IrOpcode::kStoreTypedElement: { |
| 404 // These never change the map of objects. | 404 // These never change the map of objects. |
| 405 break; | 405 break; |
| 406 } | 406 } |
| 407 case IrOpcode::kFinishRegion: { |
| 408 // FinishRegion renames the output of allocations, so we need |
| 409 // to update the {receiver} that we are looking for, if the |
| 410 // {receiver} matches the current {effect}. |
| 411 if (IsSame(receiver, effect)) receiver = GetValueInput(effect, 0); |
| 412 break; |
| 413 } |
| 407 default: { | 414 default: { |
| 408 DCHECK_EQ(1, effect->op()->EffectOutputCount()); | 415 DCHECK_EQ(1, effect->op()->EffectOutputCount()); |
| 409 if (effect->op()->EffectInputCount() != 1) { | 416 if (effect->op()->EffectInputCount() != 1) { |
| 410 // Didn't find any appropriate CheckMaps node. | 417 // Didn't find any appropriate CheckMaps node. |
| 411 return kNoReceiverMaps; | 418 return kNoReceiverMaps; |
| 412 } | 419 } |
| 413 if (!effect->op()->HasProperty(Operator::kNoWrite)) { | 420 if (!effect->op()->HasProperty(Operator::kNoWrite)) { |
| 414 // Without alias/escape analysis we cannot tell whether this | 421 // Without alias/escape analysis we cannot tell whether this |
| 415 // {effect} affects {receiver} or not. | 422 // {effect} affects {receiver} or not. |
| 416 result = kUnreliableReceiverMaps; | 423 result = kUnreliableReceiverMaps; |
| 417 } | 424 } |
| 418 break; | 425 break; |
| 419 } | 426 } |
| 420 } | 427 } |
| 428 |
| 429 // Stop walking the effect chain once we hit the definition of |
| 430 // the {receiver} along the {effect}s. |
| 431 if (IsSame(receiver, effect)) return kNoReceiverMaps; |
| 432 |
| 433 // Continue with the next {effect}. |
| 421 DCHECK_EQ(1, effect->op()->EffectInputCount()); | 434 DCHECK_EQ(1, effect->op()->EffectInputCount()); |
| 422 effect = NodeProperties::GetEffectInput(effect); | 435 effect = NodeProperties::GetEffectInput(effect); |
| 423 } | 436 } |
| 424 } | 437 } |
| 425 | 438 |
| 426 // static | 439 // static |
| 427 MaybeHandle<Context> NodeProperties::GetSpecializationContext( | 440 MaybeHandle<Context> NodeProperties::GetSpecializationContext( |
| 428 Node* node, MaybeHandle<Context> context) { | 441 Node* node, MaybeHandle<Context> context) { |
| 429 switch (node->opcode()) { | 442 switch (node->opcode()) { |
| 430 case IrOpcode::kHeapConstant: | 443 case IrOpcode::kHeapConstant: |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 // static | 491 // static |
| 479 bool NodeProperties::IsInputRange(Edge edge, int first, int num) { | 492 bool NodeProperties::IsInputRange(Edge edge, int first, int num) { |
| 480 if (num == 0) return false; | 493 if (num == 0) return false; |
| 481 int const index = edge.index(); | 494 int const index = edge.index(); |
| 482 return first <= index && index < first + num; | 495 return first <= index && index < first + num; |
| 483 } | 496 } |
| 484 | 497 |
| 485 } // namespace compiler | 498 } // namespace compiler |
| 486 } // namespace internal | 499 } // namespace internal |
| 487 } // namespace v8 | 500 } // namespace v8 |
| OLD | NEW |