| Index: src/compiler/load-elimination.cc
|
| diff --git a/src/compiler/load-elimination.cc b/src/compiler/load-elimination.cc
|
| index c78a283ca097847202e1b66ff79c62723ffbb133..97f1ab0ec548c7aae48c7b75071f39abff3613e6 100644
|
| --- a/src/compiler/load-elimination.cc
|
| +++ b/src/compiler/load-elimination.cc
|
| @@ -28,7 +28,7 @@ Reduction LoadElimination::Reduce(Node* node) {
|
| Reduction LoadElimination::ReduceLoadField(Node* node) {
|
| DCHECK_EQ(IrOpcode::kLoadField, node->opcode());
|
| FieldAccess const access = FieldAccessOf(node->op());
|
| - Node* const object = NodeProperties::GetValueInput(node, 0);
|
| + Node* object = NodeProperties::GetValueInput(node, 0);
|
| for (Node* effect = NodeProperties::GetEffectInput(node);;
|
| effect = NodeProperties::GetEffectInput(effect)) {
|
| switch (effect->opcode()) {
|
| @@ -53,11 +53,24 @@ Reduction LoadElimination::ReduceLoadField(Node* node) {
|
| }
|
| break;
|
| }
|
| + case IrOpcode::kBeginRegion:
|
| case IrOpcode::kStoreBuffer:
|
| case IrOpcode::kStoreElement: {
|
| // These can never interfere with field loads.
|
| break;
|
| }
|
| + case IrOpcode::kFinishRegion: {
|
| + // "Look through" FinishRegion nodes to make LoadElimination capable
|
| + // of looking into atomic regions.
|
| + if (object == effect) object = NodeProperties::GetValueInput(effect, 0);
|
| + break;
|
| + }
|
| + case IrOpcode::kAllocate: {
|
| + // Allocations don't interfere with field loads. In case we see the
|
| + // actual allocation for the {object} we can abort.
|
| + if (object == effect) return NoChange();
|
| + break;
|
| + }
|
| default: {
|
| if (!effect->op()->HasProperty(Operator::kNoWrite) ||
|
| effect->op()->EffectInputCount() != 1) {
|
|
|