Chromium Code Reviews| Index: src/compiler/escape-analysis-reducer.cc |
| diff --git a/src/compiler/escape-analysis-reducer.cc b/src/compiler/escape-analysis-reducer.cc |
| index c05092e06ea95f71ef958c121990df06254834e6..0054ef15832c939dcc164176210faa2e843041cc 100644 |
| --- a/src/compiler/escape-analysis-reducer.cc |
| +++ b/src/compiler/escape-analysis-reducer.cc |
| @@ -44,6 +44,8 @@ Reduction EscapeAnalysisReducer::ReduceNode(Node* node) { |
| case IrOpcode::kStoreField: |
| case IrOpcode::kStoreElement: |
| return ReduceStore(node); |
| + case IrOpcode::kCheckMaps: |
| + return ReduceCheckMaps(node); |
| case IrOpcode::kAllocate: |
| return ReduceAllocate(node); |
| case IrOpcode::kFinishRegion: |
| @@ -166,12 +168,29 @@ Reduction EscapeAnalysisReducer::ReduceStore(Node* node) { |
| return NoChange(); |
| } |
| +Reduction EscapeAnalysisReducer::ReduceCheckMaps(Node* node) { |
| + DCHECK(node->opcode() == IrOpcode::kCheckMaps); |
| + if (node->id() < static_cast<NodeId>(fully_reduced_.length())) { |
| + fully_reduced_.Add(node->id()); |
| + } |
| + if (!escape_analysis()->IsEscaped(node)) { |
| + TRACE("Removed #%d (%s) from effect chain\n", node->id(), |
| + node->op()->mnemonic()); |
| + RelaxEffectsAndControls(node); |
| + return Changed(node); |
| + } |
| + return NoChange(); |
| +} |
| Reduction EscapeAnalysisReducer::ReduceAllocate(Node* node) { |
| DCHECK_EQ(node->opcode(), IrOpcode::kAllocate); |
| if (node->id() < static_cast<NodeId>(fully_reduced_.length())) { |
| fully_reduced_.Add(node->id()); |
| } |
| + Node* object = NodeProperties::GetValueInput(node, 0); |
|
Benedikt Meurer
2017/02/13 15:02:01
This looks wrong. Input 0 is the size.
|
| + if (escape_analysis_->IsEscaped(object)) { |
| + return NoChange(); |
| + } |
| if (escape_analysis()->IsVirtual(node)) { |
| RelaxEffectsAndControls(node); |
| TRACE("Removed allocate #%d from effect chain\n", node->id()); |