Refactor DexInstructionIterator

Add a way to get the dex PC for the "for each" use case.

Bug: 67104794
Test: test-art-host
Change-Id: I144c459c9a2a03ec8d56842280338d1f7ce1caf0
diff --git a/compiler/optimizing/instruction_builder.cc b/compiler/optimizing/instruction_builder.cc
index 902985e..0f0be20 100644
--- a/compiler/optimizing/instruction_builder.cc
+++ b/compiler/optimizing/instruction_builder.cc
@@ -382,16 +382,18 @@
   dex_file_->DecodeDebugPositionInfo(&code_item_, Callback::Position, locations);
   // Instruction-specific tweaks.
   IterationRange<DexInstructionIterator> instructions = code_item_.Instructions();
-  for (const Instruction& inst : instructions) {
-    switch (inst.Opcode()) {
+  for (DexInstructionIterator it = instructions.begin(); it != instructions.end(); ++it) {
+    switch (it->Opcode()) {
       case Instruction::MOVE_EXCEPTION: {
         // Stop in native debugger after the exception has been moved.
         // The compiler also expects the move at the start of basic block so
         // we do not want to interfere by inserting native-debug-info before it.
-        locations->ClearBit(inst.GetDexPc(code_item_.insns_));
-        const Instruction* next = inst.Next();
-        if (DexInstructionIterator(next) != instructions.end()) {
-          locations->SetBit(next->GetDexPc(code_item_.insns_));
+        locations->ClearBit(it.DexPc());
+        DexInstructionIterator next = it;
+        ++next;
+        DCHECK(next != it);
+        if (next != instructions.end()) {
+          locations->SetBit(next.DexPc());
         }
         break;
       }