diff options
Diffstat (limited to 'compiler/optimizing')
-rw-r--r-- | compiler/optimizing/builder.cc | 10 | ||||
-rw-r--r-- | compiler/optimizing/nodes.cc | 5 |
2 files changed, 7 insertions, 8 deletions
diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index 2bb6fbe350..e527e8bc7c 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -378,15 +378,15 @@ bool HGraphBuilder::ComputeBranchTargets(const uint16_t* code_ptr, dex_pc += instruction.SizeInCodeUnits(); code_ptr += instruction.SizeInCodeUnits(); - if (code_ptr >= code_end) { - if (instruction.CanFlowThrough()) { + if (instruction.CanFlowThrough()) { + if (code_ptr >= code_end) { // In the normal case we should never hit this but someone can artificially forge a dex // file to fall-through out the method code. In this case we bail out compilation. return false; + } else if (FindBlockStartingAt(dex_pc) == nullptr) { + block = new (arena_) HBasicBlock(graph_, dex_pc); + branch_targets_.Put(dex_pc, block); } - } else if (FindBlockStartingAt(dex_pc) == nullptr) { - block = new (arena_) HBasicBlock(graph_, dex_pc); - branch_targets_.Put(dex_pc, block); } } else if (instruction.IsSwitch()) { SwitchTable table(instruction, dex_pc, instruction.Opcode() == Instruction::SPARSE_SWITCH); diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc index 3891a152c4..a6390af1f2 100644 --- a/compiler/optimizing/nodes.cc +++ b/compiler/optimizing/nodes.cc @@ -1050,9 +1050,8 @@ HBasicBlock* HBasicBlock::SplitAfter(HInstruction* cursor) { bool HBasicBlock::IsSingleGoto() const { HLoopInformation* loop_info = GetLoopInformation(); - // TODO: Remove the null check b/19084197. - return GetFirstInstruction() != nullptr - && GetPhis().IsEmpty() + DCHECK(EndsWithControlFlowInstruction()); + return GetPhis().IsEmpty() && GetFirstInstruction() == GetLastInstruction() && GetLastInstruction()->IsGoto() // Back edges generate the suspend check. |