From fe659462e7d58bb2585b1bd029f9e08fd9dd32ae Mon Sep 17 00:00:00 2001 From: David Brazdil Date: Wed, 24 Jun 2015 14:23:56 +0100 Subject: ART: Stop creating a fallthrough block for Goto Optimizing's Builder used to create a basic block after a Goto under the assumption that control flow can fall through. Bug: 19084197 Change-Id: Id85f31df98a4177466750d3cd0bc8bb74782ca2d --- compiler/optimizing/builder.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'compiler/optimizing/builder.cc') diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index c49752642b..48ec497f3e 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); -- cgit v1.2.3-59-g8ed1b