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()); |