diff options
author | 2014-11-24 14:09:46 +0000 | |
---|---|---|
committer | 2014-11-24 14:40:22 +0000 | |
commit | 26e7d454b9924f3673b075b05e4c604ad658a062 (patch) | |
tree | 6cfc018247661e298137cb0985b6ce7c7fb400a6 /compiler/dex/mir_optimization.cc | |
parent | c2155048075b4916536f3aa23a88cd483b0f64a2 (diff) |
Eliminate suspend checks on back-edges to return insn.
This optimization seems to have been broken for a long time.
Change-Id: I62ec85c71bb5253917ad9465a952911e917f6b52
Diffstat (limited to 'compiler/dex/mir_optimization.cc')
-rw-r--r-- | compiler/dex/mir_optimization.cc | 42 |
1 files changed, 19 insertions, 23 deletions
diff --git a/compiler/dex/mir_optimization.cc b/compiler/dex/mir_optimization.cc index 9d52807725..1f630f78bb 100644 --- a/compiler/dex/mir_optimization.cc +++ b/compiler/dex/mir_optimization.cc @@ -477,29 +477,25 @@ bool MIRGraph::BasicBlockOpt(BasicBlock* bb) { } } break; - case Instruction::GOTO: - case Instruction::GOTO_16: - case Instruction::GOTO_32: - case Instruction::IF_EQ: - case Instruction::IF_NE: - case Instruction::IF_LT: - case Instruction::IF_GE: - case Instruction::IF_GT: - case Instruction::IF_LE: - case Instruction::IF_EQZ: - case Instruction::IF_NEZ: - case Instruction::IF_LTZ: - case Instruction::IF_GEZ: - case Instruction::IF_GTZ: - case Instruction::IF_LEZ: - // If we've got a backwards branch to return, no need to suspend check. - if ((IsBackedge(bb, bb->taken) && GetBasicBlock(bb->taken)->dominates_return) || - (IsBackedge(bb, bb->fall_through) && - GetBasicBlock(bb->fall_through)->dominates_return)) { - mir->optimization_flags |= MIR_IGNORE_SUSPEND_CHECK; - if (cu_->verbose) { - LOG(INFO) << "Suppressed suspend check on branch to return at 0x" << std::hex - << mir->offset; + case Instruction::RETURN_VOID: + case Instruction::RETURN: + case Instruction::RETURN_WIDE: + case Instruction::RETURN_OBJECT: + if (bb->GetFirstNonPhiInsn() == mir) { + // This is a simple return BB. Eliminate suspend checks on predecessor back-edges. + for (BasicBlockId pred_id : bb->predecessors) { + BasicBlock* pred_bb = GetBasicBlock(pred_id); + DCHECK(pred_bb != nullptr); + if (IsBackedge(pred_bb, bb->id) && pred_bb->last_mir_insn != nullptr && + (IsInstructionIfCc(pred_bb->last_mir_insn->dalvikInsn.opcode) || + IsInstructionIfCcZ(pred_bb->last_mir_insn->dalvikInsn.opcode) || + IsInstructionGoto(pred_bb->last_mir_insn->dalvikInsn.opcode))) { + pred_bb->last_mir_insn->optimization_flags |= MIR_IGNORE_SUSPEND_CHECK; + if (cu_->verbose) { + LOG(INFO) << "Suppressed suspend check on branch to return at 0x" << std::hex + << pred_bb->last_mir_insn->offset; + } + } } } break; |