diff options
author | 2015-04-16 14:25:55 +0000 | |
---|---|---|
committer | 2015-04-16 14:25:55 +0000 | |
commit | e316f57b7449b2e4183ff5ef26130efedcaa0a79 (patch) | |
tree | cbb0eb5933a443ac16ec4612f3d46c4406737742 /compiler/optimizing/nodes.cc | |
parent | a2b78fc83354e1dcdcd6f4715688926d37ac3219 (diff) | |
parent | 05144f4322eed049f4878015bf1f0381d419b785 (diff) |
Merge "ART: Hot fix for an inliner issue"
Diffstat (limited to 'compiler/optimizing/nodes.cc')
-rw-r--r-- | compiler/optimizing/nodes.cc | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc index 53ee711920..5fca4fab22 100644 --- a/compiler/optimizing/nodes.cc +++ b/compiler/optimizing/nodes.cc @@ -962,30 +962,6 @@ static void MakeRoomFor(GrowableArray<HBasicBlock*>* blocks, } void HGraph::InlineInto(HGraph* outer_graph, HInvoke* invoke) { - // Walk over the entry block and: - // - Move constants from the entry block to the outer_graph's entry block, - // - Replace HParameterValue instructions with their real value. - // - Remove suspend checks, that hold an environment. - int parameter_index = 0; - for (HInstructionIterator it(entry_block_->GetInstructions()); !it.Done(); it.Advance()) { - HInstruction* current = it.Current(); - if (current->IsNullConstant()) { - current->ReplaceWith(outer_graph->GetNullConstant()); - } else if (current->IsIntConstant()) { - current->ReplaceWith(outer_graph->GetIntConstant(current->AsIntConstant()->GetValue())); - } else if (current->IsLongConstant()) { - current->ReplaceWith(outer_graph->GetLongConstant(current->AsLongConstant()->GetValue())); - } else if (current->IsFloatConstant() || current->IsDoubleConstant()) { - // TODO: Don't duplicate floating-point constants. - current->MoveBefore(outer_graph->GetEntryBlock()->GetLastInstruction()); - } else if (current->IsParameterValue()) { - current->ReplaceWith(invoke->InputAt(parameter_index++)); - } else { - DCHECK(current->IsGoto() || current->IsSuspendCheck()); - entry_block_->RemoveInstruction(current); - } - } - if (GetBlocks().Size() == 3) { // Simple case of an entry block, a body block, and an exit block. // Put the body block's instruction into `invoke`'s block. @@ -1111,6 +1087,36 @@ void HGraph::InlineInto(HGraph* outer_graph, HInvoke* invoke) { } } + // Update the next instruction id of the outer graph, so that instructions + // added later get bigger ids than those in the inner graph. + outer_graph->SetCurrentInstructionId(GetNextInstructionId()); + + // Walk over the entry block and: + // - Move constants from the entry block to the outer_graph's entry block, + // - Replace HParameterValue instructions with their real value. + // - Remove suspend checks, that hold an environment. + // We must do this after the other blocks have been inlined, otherwise ids of + // constants could overlap with the inner graph. + int parameter_index = 0; + for (HInstructionIterator it(entry_block_->GetInstructions()); !it.Done(); it.Advance()) { + HInstruction* current = it.Current(); + if (current->IsNullConstant()) { + current->ReplaceWith(outer_graph->GetNullConstant()); + } else if (current->IsIntConstant()) { + current->ReplaceWith(outer_graph->GetIntConstant(current->AsIntConstant()->GetValue())); + } else if (current->IsLongConstant()) { + current->ReplaceWith(outer_graph->GetLongConstant(current->AsLongConstant()->GetValue())); + } else if (current->IsFloatConstant() || current->IsDoubleConstant()) { + // TODO: Don't duplicate floating-point constants. + current->MoveBefore(outer_graph->GetEntryBlock()->GetLastInstruction()); + } else if (current->IsParameterValue()) { + current->ReplaceWith(invoke->InputAt(parameter_index++)); + } else { + DCHECK(current->IsGoto() || current->IsSuspendCheck()); + entry_block_->RemoveInstruction(current); + } + } + // Finally remove the invoke from the caller. invoke->GetBlock()->RemoveInstruction(invoke); } |