summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2015-03-27 10:52:11 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2015-03-27 10:52:12 +0000
commitccd8cb0695a1723e5ea7869fc16107b888fbabf7 (patch)
treed402659a7de353c5cdd01fce0082ec2d5207c64d
parentb3665e3dfdd23cc7a2f17a0b53bb16205bf4151f (diff)
parent356a1811f2f79d98194475fdbfb5f6b7768455b5 (diff)
Merge "Quick: Finding upper half of kMirOpCheckPart2 should passthough empty blocks"
-rw-r--r--compiler/dex/quick/codegen_util.cc15
1 files changed, 10 insertions, 5 deletions
diff --git a/compiler/dex/quick/codegen_util.cc b/compiler/dex/quick/codegen_util.cc
index bd479bef5b..df72830801 100644
--- a/compiler/dex/quick/codegen_util.cc
+++ b/compiler/dex/quick/codegen_util.cc
@@ -1378,11 +1378,16 @@ void Mir2Lir::InitReferenceVRegs(BasicBlock* bb, BitVector* references) {
// In Mir2Lir::MethodBlockCodeGen() we have artificially moved the throwing
// instruction to the previous block. However, the MIRGraph data used above
// doesn't reflect that, so we still need to process that MIR insn here.
- DCHECK_EQ(bb->predecessors.size(), 1u);
- BasicBlock* pred_bb = mir_graph_->GetBasicBlock(bb->predecessors[0]);
- DCHECK(pred_bb != nullptr);
- DCHECK(pred_bb->last_mir_insn != nullptr);
- UpdateReferenceVRegsLocal(nullptr, pred_bb->last_mir_insn, references);
+ MIR* mir = nullptr;
+ BasicBlock* pred_bb = bb;
+ // Traverse empty blocks.
+ while (mir == nullptr && pred_bb->predecessors.size() == 1u) {
+ pred_bb = mir_graph_->GetBasicBlock(bb->predecessors[0]);
+ DCHECK(pred_bb != nullptr);
+ mir = pred_bb->last_mir_insn;
+ }
+ DCHECK(mir != nullptr);
+ UpdateReferenceVRegsLocal(nullptr, mir, references);
}
}