diff options
author | 2016-03-02 16:48:20 +0000 | |
---|---|---|
committer | 2016-04-04 11:21:30 +0100 | |
commit | e3ff7b293be2a6791fe9d135d660c0cffe4bd73f (patch) | |
tree | d578d27cb78e6d2caef683cd8ac94c9a9752b192 /compiler/optimizing/nodes.cc | |
parent | 86ea7eeabe30c98bbe1651a51d03cb89776724e7 (diff) |
Refactor HGraphBuilder and SsaBuilder to remove HLocals
This patch merges the instruction-building phases from HGraphBuilder
and SsaBuilder into a single HInstructionBuilder class. As a result,
it is not necessary to generate HLocal, HLoadLocal and HStoreLocal
instructions any more, as the builder produces SSA form directly.
Saves 5-15% of arena-allocated memory (see bug for more data):
GMS 20.46MB => 19.26MB (-5.86%)
Maps 24.12MB => 21.47MB (-10.98%)
YouTube 28.60MB => 26.01MB (-9.05%)
Bug: 27894376
Change-Id: Iefe28d40600c169c5d306fd2c77034ae19476d90
Diffstat (limited to 'compiler/optimizing/nodes.cc')
-rw-r--r-- | compiler/optimizing/nodes.cc | 17 |
1 files changed, 4 insertions, 13 deletions
diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc index 9f448af73a..1086cbf503 100644 --- a/compiler/optimizing/nodes.cc +++ b/compiler/optimizing/nodes.cc @@ -318,21 +318,11 @@ void HGraph::SimplifyLoop(HBasicBlock* header) { } } - // Place the suspend check at the beginning of the header, so that live registers - // will be known when allocating registers. Note that code generation can still - // generate the suspend check at the back edge, but needs to be careful with - // loop phi spill slots (which are not written to at back edge). HInstruction* first_instruction = header->GetFirstInstruction(); - if (first_instruction == nullptr) { - HSuspendCheck* check = new (arena_) HSuspendCheck(header->GetDexPc()); - header->AddInstruction(check); - first_instruction = check; - } else if (!first_instruction->IsSuspendCheck()) { - HSuspendCheck* check = new (arena_) HSuspendCheck(header->GetDexPc()); - header->InsertInstructionBefore(check, first_instruction); - first_instruction = check; + if (first_instruction != nullptr && first_instruction->IsSuspendCheck()) { + // Called from DeadBlockElimination. Update SuspendCheck pointer. + info->SetSuspendCheck(first_instruction->AsSuspendCheck()); } - info->SetSuspendCheck(first_instruction->AsSuspendCheck()); } void HGraph::ComputeTryBlockInformation() { @@ -1882,6 +1872,7 @@ HInstruction* HGraph::InlineInto(HGraph* outer_graph, HInvoke* invoke) { instr_it.Advance()) { HInstruction* current = instr_it.Current(); if (current->NeedsEnvironment()) { + DCHECK(current->HasEnvironment()); current->GetEnvironment()->SetAndCopyParentChain( outer_graph->GetArena(), invoke->GetEnvironment()); } |