diff --git a/src/compiler/Dataflow.cc b/src/compiler/Dataflow.cc
index bea5ef0..2ba0cc1 100644
--- a/src/compiler/Dataflow.cc
+++ b/src/compiler/Dataflow.cc
@@ -29,919 +29,916 @@
  * scope of optimizations but will not cause mis-optimizations.
  */
 const int oatDataFlowAttributes[kMirOpLast] = {
-    // 00 NOP
-    DF_NOP,
+  // 00 NOP
+  DF_NOP,
 
-    // 01 MOVE vA, vB
-    DF_DA | DF_UB | DF_IS_MOVE,
+  // 01 MOVE vA, vB
+  DF_DA | DF_UB | DF_IS_MOVE,
 
-    // 02 MOVE_FROM16 vAA, vBBBB
-    DF_DA | DF_UB | DF_IS_MOVE,
+  // 02 MOVE_FROM16 vAA, vBBBB
+  DF_DA | DF_UB | DF_IS_MOVE,
 
-    // 03 MOVE_16 vAAAA, vBBBB
-    DF_DA | DF_UB | DF_IS_MOVE,
+  // 03 MOVE_16 vAAAA, vBBBB
+  DF_DA | DF_UB | DF_IS_MOVE,
 
-    // 04 MOVE_WIDE vA, vB
-    DF_DA_WIDE | DF_UB_WIDE | DF_IS_MOVE,
+  // 04 MOVE_WIDE vA, vB
+  DF_DA_WIDE | DF_UB_WIDE | DF_IS_MOVE,
 
-    // 05 MOVE_WIDE_FROM16 vAA, vBBBB
-    DF_DA_WIDE | DF_UB_WIDE | DF_IS_MOVE,
+  // 05 MOVE_WIDE_FROM16 vAA, vBBBB
+  DF_DA_WIDE | DF_UB_WIDE | DF_IS_MOVE,
 
-    // 06 MOVE_WIDE_16 vAAAA, vBBBB
-    DF_DA_WIDE | DF_UB_WIDE | DF_IS_MOVE,
+  // 06 MOVE_WIDE_16 vAAAA, vBBBB
+  DF_DA_WIDE | DF_UB_WIDE | DF_IS_MOVE,
 
-    // 07 MOVE_OBJECT vA, vB
-    DF_DA | DF_UB | DF_NULL_TRANSFER_0 | DF_IS_MOVE | DF_CORE_A | DF_CORE_B,
+  // 07 MOVE_OBJECT vA, vB
+  DF_DA | DF_UB | DF_NULL_TRANSFER_0 | DF_IS_MOVE | DF_CORE_A | DF_CORE_B,
 
-    // 08 MOVE_OBJECT_FROM16 vAA, vBBBB
-    DF_DA | DF_UB | DF_NULL_TRANSFER_0 | DF_IS_MOVE | DF_CORE_A | DF_CORE_B,
+  // 08 MOVE_OBJECT_FROM16 vAA, vBBBB
+  DF_DA | DF_UB | DF_NULL_TRANSFER_0 | DF_IS_MOVE | DF_CORE_A | DF_CORE_B,
 
-    // 09 MOVE_OBJECT_16 vAAAA, vBBBB
-    DF_DA | DF_UB | DF_NULL_TRANSFER_0 | DF_IS_MOVE | DF_CORE_A | DF_CORE_B,
+  // 09 MOVE_OBJECT_16 vAAAA, vBBBB
+  DF_DA | DF_UB | DF_NULL_TRANSFER_0 | DF_IS_MOVE | DF_CORE_A | DF_CORE_B,
 
-    // 0A MOVE_RESULT vAA
-    DF_DA,
+  // 0A MOVE_RESULT vAA
+  DF_DA,
 
-    // 0B MOVE_RESULT_WIDE vAA
-    DF_DA_WIDE,
+  // 0B MOVE_RESULT_WIDE vAA
+  DF_DA_WIDE,
 
-    // 0C MOVE_RESULT_OBJECT vAA
-    DF_DA | DF_CORE_A,
+  // 0C MOVE_RESULT_OBJECT vAA
+  DF_DA | DF_CORE_A,
 
-    // 0D MOVE_EXCEPTION vAA
-    DF_DA | DF_CORE_A,
+  // 0D MOVE_EXCEPTION vAA
+  DF_DA | DF_CORE_A,
 
-    // 0E RETURN_VOID
-    DF_NOP,
+  // 0E RETURN_VOID
+  DF_NOP,
 
-    // 0F RETURN vAA
-    DF_UA,
+  // 0F RETURN vAA
+  DF_UA,
 
-    // 10 RETURN_WIDE vAA
-    DF_UA_WIDE,
+  // 10 RETURN_WIDE vAA
+  DF_UA_WIDE,
 
-    // 11 RETURN_OBJECT vAA
-    DF_UA | DF_CORE_A,
+  // 11 RETURN_OBJECT vAA
+  DF_UA | DF_CORE_A,
 
-    // 12 CONST_4 vA, #+B
-    DF_DA | DF_SETS_CONST,
+  // 12 CONST_4 vA, #+B
+  DF_DA | DF_SETS_CONST,
 
-    // 13 CONST_16 vAA, #+BBBB
-    DF_DA | DF_SETS_CONST,
+  // 13 CONST_16 vAA, #+BBBB
+  DF_DA | DF_SETS_CONST,
 
-    // 14 CONST vAA, #+BBBBBBBB
-    DF_DA | DF_SETS_CONST,
+  // 14 CONST vAA, #+BBBBBBBB
+  DF_DA | DF_SETS_CONST,
 
-    // 15 CONST_HIGH16 VAA, #+BBBB0000
-    DF_DA | DF_SETS_CONST,
+  // 15 CONST_HIGH16 VAA, #+BBBB0000
+  DF_DA | DF_SETS_CONST,
 
-    // 16 CONST_WIDE_16 vAA, #+BBBB
-    DF_DA_WIDE | DF_SETS_CONST,
+  // 16 CONST_WIDE_16 vAA, #+BBBB
+  DF_DA_WIDE | DF_SETS_CONST,
 
-    // 17 CONST_WIDE_32 vAA, #+BBBBBBBB
-    DF_DA_WIDE | DF_SETS_CONST,
+  // 17 CONST_WIDE_32 vAA, #+BBBBBBBB
+  DF_DA_WIDE | DF_SETS_CONST,
 
-    // 18 CONST_WIDE vAA, #+BBBBBBBBBBBBBBBB
-    DF_DA_WIDE | DF_SETS_CONST,
+  // 18 CONST_WIDE vAA, #+BBBBBBBBBBBBBBBB
+  DF_DA_WIDE | DF_SETS_CONST,
 
-    // 19 CONST_WIDE_HIGH16 vAA, #+BBBB000000000000
-    DF_DA_WIDE | DF_SETS_CONST,
+  // 19 CONST_WIDE_HIGH16 vAA, #+BBBB000000000000
+  DF_DA_WIDE | DF_SETS_CONST,
 
-    // 1A CONST_STRING vAA, string@BBBB
-    DF_DA | DF_CORE_A,
+  // 1A CONST_STRING vAA, string@BBBB
+  DF_DA | DF_CORE_A,
 
-    // 1B CONST_STRING_JUMBO vAA, string@BBBBBBBB
-    DF_DA | DF_CORE_A,
+  // 1B CONST_STRING_JUMBO vAA, string@BBBBBBBB
+  DF_DA | DF_CORE_A,
 
-    // 1C CONST_CLASS vAA, type@BBBB
-    DF_DA | DF_CORE_A,
+  // 1C CONST_CLASS vAA, type@BBBB
+  DF_DA | DF_CORE_A,
 
-    // 1D MONITOR_ENTER vAA
-    DF_UA | DF_NULL_CHK_0 | DF_CORE_A,
+  // 1D MONITOR_ENTER vAA
+  DF_UA | DF_NULL_CHK_0 | DF_CORE_A,
 
-    // 1E MONITOR_EXIT vAA
-    DF_UA | DF_NULL_CHK_0 | DF_CORE_A,
+  // 1E MONITOR_EXIT vAA
+  DF_UA | DF_NULL_CHK_0 | DF_CORE_A,
 
-    // 1F CHK_CAST vAA, type@BBBB
-    DF_UA | DF_CORE_A | DF_UMS,
+  // 1F CHK_CAST vAA, type@BBBB
+  DF_UA | DF_CORE_A | DF_UMS,
 
-    // 20 INSTANCE_OF vA, vB, type@CCCC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B | DF_UMS,
+  // 20 INSTANCE_OF vA, vB, type@CCCC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B | DF_UMS,
 
-    // 21 ARRAY_LENGTH vA, vB
-    DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_A | DF_CORE_B,
+  // 21 ARRAY_LENGTH vA, vB
+  DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_A | DF_CORE_B,
 
-    // 22 NEW_INSTANCE vAA, type@BBBB
-    DF_DA | DF_NON_NULL_DST | DF_CORE_A | DF_UMS,
+  // 22 NEW_INSTANCE vAA, type@BBBB
+  DF_DA | DF_NON_NULL_DST | DF_CORE_A | DF_UMS,
 
-    // 23 NEW_ARRAY vA, vB, type@CCCC
-    DF_DA | DF_UB | DF_NON_NULL_DST | DF_CORE_A | DF_CORE_B | DF_UMS,
+  // 23 NEW_ARRAY vA, vB, type@CCCC
+  DF_DA | DF_UB | DF_NON_NULL_DST | DF_CORE_A | DF_CORE_B | DF_UMS,
 
-    // 24 FILLED_NEW_ARRAY {vD, vE, vF, vG, vA}
-    DF_FORMAT_35C | DF_NON_NULL_RET | DF_UMS,
+  // 24 FILLED_NEW_ARRAY {vD, vE, vF, vG, vA}
+  DF_FORMAT_35C | DF_NON_NULL_RET | DF_UMS,
 
-    // 25 FILLED_NEW_ARRAY_RANGE {vCCCC .. vNNNN}, type@BBBB
-    DF_FORMAT_3RC | DF_NON_NULL_RET | DF_UMS,
+  // 25 FILLED_NEW_ARRAY_RANGE {vCCCC .. vNNNN}, type@BBBB
+  DF_FORMAT_3RC | DF_NON_NULL_RET | DF_UMS,
 
-    // 26 FILL_ARRAY_DATA vAA, +BBBBBBBB
-    DF_UA | DF_CORE_A | DF_UMS,
+  // 26 FILL_ARRAY_DATA vAA, +BBBBBBBB
+  DF_UA | DF_CORE_A | DF_UMS,
 
-    // 27 THROW vAA
-    DF_UA | DF_CORE_A | DF_UMS,
+  // 27 THROW vAA
+  DF_UA | DF_CORE_A | DF_UMS,
 
-    // 28 GOTO
-    DF_NOP,
+  // 28 GOTO
+  DF_NOP,
 
-    // 29 GOTO_16
-    DF_NOP,
+  // 29 GOTO_16
+  DF_NOP,
 
-    // 2A GOTO_32
-    DF_NOP,
+  // 2A GOTO_32
+  DF_NOP,
 
-    // 2B PACKED_SWITCH vAA, +BBBBBBBB
-    DF_UA,
+  // 2B PACKED_SWITCH vAA, +BBBBBBBB
+  DF_UA,
 
-    // 2C SPARSE_SWITCH vAA, +BBBBBBBB
-    DF_UA,
+  // 2C SPARSE_SWITCH vAA, +BBBBBBBB
+  DF_UA,
 
-    // 2D CMPL_FLOAT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_FP_B | DF_FP_C | DF_CORE_A,
+  // 2D CMPL_FLOAT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_FP_B | DF_FP_C | DF_CORE_A,
 
-    // 2E CMPG_FLOAT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_FP_B | DF_FP_C | DF_CORE_A,
+  // 2E CMPG_FLOAT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_FP_B | DF_FP_C | DF_CORE_A,
 
-    // 2F CMPL_DOUBLE vAA, vBB, vCC
-    DF_DA | DF_UB_WIDE | DF_UC_WIDE | DF_FP_B | DF_FP_C | DF_CORE_A,
+  // 2F CMPL_DOUBLE vAA, vBB, vCC
+  DF_DA | DF_UB_WIDE | DF_UC_WIDE | DF_FP_B | DF_FP_C | DF_CORE_A,
 
-    // 30 CMPG_DOUBLE vAA, vBB, vCC
-    DF_DA | DF_UB_WIDE | DF_UC_WIDE | DF_FP_B | DF_FP_C | DF_CORE_A,
+  // 30 CMPG_DOUBLE vAA, vBB, vCC
+  DF_DA | DF_UB_WIDE | DF_UC_WIDE | DF_FP_B | DF_FP_C | DF_CORE_A,
 
-    // 31 CMP_LONG vAA, vBB, vCC
-    DF_DA | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 31 CMP_LONG vAA, vBB, vCC
+  DF_DA | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 32 IF_EQ vA, vB, +CCCC
-    DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // 32 IF_EQ vA, vB, +CCCC
+  DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // 33 IF_NE vA, vB, +CCCC
-    DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // 33 IF_NE vA, vB, +CCCC
+  DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // 34 IF_LT vA, vB, +CCCC
-    DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // 34 IF_LT vA, vB, +CCCC
+  DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // 35 IF_GE vA, vB, +CCCC
-    DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // 35 IF_GE vA, vB, +CCCC
+  DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // 36 IF_GT vA, vB, +CCCC
-    DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // 36 IF_GT vA, vB, +CCCC
+  DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // 37 IF_LE vA, vB, +CCCC
-    DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // 37 IF_LE vA, vB, +CCCC
+  DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
 
-    // 38 IF_EQZ vAA, +BBBB
-    DF_UA | DF_CORE_A,
+  // 38 IF_EQZ vAA, +BBBB
+  DF_UA | DF_CORE_A,
 
-    // 39 IF_NEZ vAA, +BBBB
-    DF_UA | DF_CORE_A,
+  // 39 IF_NEZ vAA, +BBBB
+  DF_UA | DF_CORE_A,
 
-    // 3A IF_LTZ vAA, +BBBB
-    DF_UA | DF_CORE_A,
+  // 3A IF_LTZ vAA, +BBBB
+  DF_UA | DF_CORE_A,
 
-    // 3B IF_GEZ vAA, +BBBB
-    DF_UA | DF_CORE_A,
+  // 3B IF_GEZ vAA, +BBBB
+  DF_UA | DF_CORE_A,
 
-    // 3C IF_GTZ vAA, +BBBB
-    DF_UA | DF_CORE_A,
+  // 3C IF_GTZ vAA, +BBBB
+  DF_UA | DF_CORE_A,
 
-    // 3D IF_LEZ vAA, +BBBB
-    DF_UA | DF_CORE_A,
+  // 3D IF_LEZ vAA, +BBBB
+  DF_UA | DF_CORE_A,
 
-    // 3E UNUSED_3E
-    DF_NOP,
+  // 3E UNUSED_3E
+  DF_NOP,
 
-    // 3F UNUSED_3F
-    DF_NOP,
+  // 3F UNUSED_3F
+  DF_NOP,
 
-    // 40 UNUSED_40
-    DF_NOP,
+  // 40 UNUSED_40
+  DF_NOP,
 
-    // 41 UNUSED_41
-    DF_NOP,
+  // 41 UNUSED_41
+  DF_NOP,
 
-    // 42 UNUSED_42
-    DF_NOP,
+  // 42 UNUSED_42
+  DF_NOP,
 
-    // 43 UNUSED_43
-    DF_NOP,
+  // 43 UNUSED_43
+  DF_NOP,
 
-    // 44 AGET vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_CORE_B | DF_CORE_C,
+  // 44 AGET vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_CORE_B | DF_CORE_C,
 
-    // 45 AGET_WIDE vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_CORE_B | DF_CORE_C,
+  // 45 AGET_WIDE vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_CORE_B | DF_CORE_C,
 
-    // 46 AGET_OBJECT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_CORE_B | DF_CORE_C,
+  // 46 AGET_OBJECT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_CORE_B | DF_CORE_C,
 
-    // 47 AGET_BOOLEAN vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_CORE_B | DF_CORE_C,
+  // 47 AGET_BOOLEAN vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_CORE_B | DF_CORE_C,
 
-    // 48 AGET_BYTE vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_CORE_B | DF_CORE_C,
+  // 48 AGET_BYTE vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_CORE_B | DF_CORE_C,
 
-    // 49 AGET_CHAR vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_CORE_B | DF_CORE_C,
+  // 49 AGET_CHAR vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_CORE_B | DF_CORE_C,
 
-    // 4A AGET_SHORT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_CORE_B | DF_CORE_C,
+  // 4A AGET_SHORT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_CORE_B | DF_CORE_C,
 
-    // 4B APUT vAA, vBB, vCC
-    DF_UA | DF_UB | DF_UC | DF_NULL_CHK_1 | DF_RANGE_CHK_2 | DF_CORE_B | DF_CORE_C,
+  // 4B APUT vAA, vBB, vCC
+  DF_UA | DF_UB | DF_UC | DF_NULL_CHK_1 | DF_RANGE_CHK_2 | DF_CORE_B | DF_CORE_C,
 
-    // 4C APUT_WIDE vAA, vBB, vCC
-    DF_UA_WIDE | DF_UB | DF_UC | DF_NULL_CHK_2 | DF_RANGE_CHK_3 | DF_CORE_B | DF_CORE_C,
+  // 4C APUT_WIDE vAA, vBB, vCC
+  DF_UA_WIDE | DF_UB | DF_UC | DF_NULL_CHK_2 | DF_RANGE_CHK_3 | DF_CORE_B | DF_CORE_C,
 
-    // 4D APUT_OBJECT vAA, vBB, vCC
-    DF_UA | DF_UB | DF_UC | DF_NULL_CHK_1 | DF_RANGE_CHK_2 | DF_CORE_B | DF_CORE_C,
+  // 4D APUT_OBJECT vAA, vBB, vCC
+  DF_UA | DF_UB | DF_UC | DF_NULL_CHK_1 | DF_RANGE_CHK_2 | DF_CORE_B | DF_CORE_C,
 
-    // 4E APUT_BOOLEAN vAA, vBB, vCC
-    DF_UA | DF_UB | DF_UC | DF_NULL_CHK_1 | DF_RANGE_CHK_2 | DF_CORE_B | DF_CORE_C,
+  // 4E APUT_BOOLEAN vAA, vBB, vCC
+  DF_UA | DF_UB | DF_UC | DF_NULL_CHK_1 | DF_RANGE_CHK_2 | DF_CORE_B | DF_CORE_C,
 
-    // 4F APUT_BYTE vAA, vBB, vCC
-    DF_UA | DF_UB | DF_UC | DF_NULL_CHK_1 | DF_RANGE_CHK_2 | DF_CORE_B | DF_CORE_C,
+  // 4F APUT_BYTE vAA, vBB, vCC
+  DF_UA | DF_UB | DF_UC | DF_NULL_CHK_1 | DF_RANGE_CHK_2 | DF_CORE_B | DF_CORE_C,
 
-    // 50 APUT_CHAR vAA, vBB, vCC
-    DF_UA | DF_UB | DF_UC | DF_NULL_CHK_1 | DF_RANGE_CHK_2 | DF_CORE_B | DF_CORE_C,
+  // 50 APUT_CHAR vAA, vBB, vCC
+  DF_UA | DF_UB | DF_UC | DF_NULL_CHK_1 | DF_RANGE_CHK_2 | DF_CORE_B | DF_CORE_C,
 
-    // 51 APUT_SHORT vAA, vBB, vCC
-    DF_UA | DF_UB | DF_UC | DF_NULL_CHK_1 | DF_RANGE_CHK_2 | DF_CORE_B | DF_CORE_C,
+  // 51 APUT_SHORT vAA, vBB, vCC
+  DF_UA | DF_UB | DF_UC | DF_NULL_CHK_1 | DF_RANGE_CHK_2 | DF_CORE_B | DF_CORE_C,
 
-    // 52 IGET vA, vB, field@CCCC
-    DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
+  // 52 IGET vA, vB, field@CCCC
+  DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
 
-    // 53 IGET_WIDE vA, vB, field@CCCC
-    DF_DA_WIDE | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
+  // 53 IGET_WIDE vA, vB, field@CCCC
+  DF_DA_WIDE | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
 
-    // 54 IGET_OBJECT vA, vB, field@CCCC
-    DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
+  // 54 IGET_OBJECT vA, vB, field@CCCC
+  DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
 
-    // 55 IGET_BOOLEAN vA, vB, field@CCCC
-    DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
+  // 55 IGET_BOOLEAN vA, vB, field@CCCC
+  DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
 
-    // 56 IGET_BYTE vA, vB, field@CCCC
-    DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
+  // 56 IGET_BYTE vA, vB, field@CCCC
+  DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
 
-    // 57 IGET_CHAR vA, vB, field@CCCC
-    DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
+  // 57 IGET_CHAR vA, vB, field@CCCC
+  DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
 
-    // 58 IGET_SHORT vA, vB, field@CCCC
-    DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
+  // 58 IGET_SHORT vA, vB, field@CCCC
+  DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
 
-    // 59 IPUT vA, vB, field@CCCC
-    DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_B,
+  // 59 IPUT vA, vB, field@CCCC
+  DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_B,
 
-    // 5A IPUT_WIDE vA, vB, field@CCCC
-    DF_UA_WIDE | DF_UB | DF_NULL_CHK_2 | DF_CORE_B,
+  // 5A IPUT_WIDE vA, vB, field@CCCC
+  DF_UA_WIDE | DF_UB | DF_NULL_CHK_2 | DF_CORE_B,
 
-    // 5B IPUT_OBJECT vA, vB, field@CCCC
-    DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_B,
+  // 5B IPUT_OBJECT vA, vB, field@CCCC
+  DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_B,
 
-    // 5C IPUT_BOOLEAN vA, vB, field@CCCC
-    DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_B,
+  // 5C IPUT_BOOLEAN vA, vB, field@CCCC
+  DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_B,
 
-    // 5D IPUT_BYTE vA, vB, field@CCCC
-    DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_B,
+  // 5D IPUT_BYTE vA, vB, field@CCCC
+  DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_B,
 
-    // 5E IPUT_CHAR vA, vB, field@CCCC
-    DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_B,
+  // 5E IPUT_CHAR vA, vB, field@CCCC
+  DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_B,
 
-    // 5F IPUT_SHORT vA, vB, field@CCCC
-    DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_B,
+  // 5F IPUT_SHORT vA, vB, field@CCCC
+  DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_B,
 
-    // 60 SGET vAA, field@BBBB
-    DF_DA | DF_UMS,
+  // 60 SGET vAA, field@BBBB
+  DF_DA | DF_UMS,
 
-    // 61 SGET_WIDE vAA, field@BBBB
-    DF_DA_WIDE | DF_UMS,
+  // 61 SGET_WIDE vAA, field@BBBB
+  DF_DA_WIDE | DF_UMS,
 
-    // 62 SGET_OBJECT vAA, field@BBBB
-    DF_DA | DF_CORE_A | DF_UMS,
+  // 62 SGET_OBJECT vAA, field@BBBB
+  DF_DA | DF_CORE_A | DF_UMS,
 
-    // 63 SGET_BOOLEAN vAA, field@BBBB
-    DF_DA | DF_UMS,
+  // 63 SGET_BOOLEAN vAA, field@BBBB
+  DF_DA | DF_UMS,
 
-    // 64 SGET_BYTE vAA, field@BBBB
-    DF_DA | DF_UMS,
+  // 64 SGET_BYTE vAA, field@BBBB
+  DF_DA | DF_UMS,
 
-    // 65 SGET_CHAR vAA, field@BBBB
-    DF_DA | DF_UMS,
+  // 65 SGET_CHAR vAA, field@BBBB
+  DF_DA | DF_UMS,
 
-    // 66 SGET_SHORT vAA, field@BBBB
-    DF_DA | DF_UMS,
+  // 66 SGET_SHORT vAA, field@BBBB
+  DF_DA | DF_UMS,
 
-    // 67 SPUT vAA, field@BBBB
-    DF_UA | DF_UMS,
+  // 67 SPUT vAA, field@BBBB
+  DF_UA | DF_UMS,
 
-    // 68 SPUT_WIDE vAA, field@BBBB
-    DF_UA_WIDE | DF_UMS,
+  // 68 SPUT_WIDE vAA, field@BBBB
+  DF_UA_WIDE | DF_UMS,
 
-    // 69 SPUT_OBJECT vAA, field@BBBB
-    DF_UA | DF_CORE_A | DF_UMS,
+  // 69 SPUT_OBJECT vAA, field@BBBB
+  DF_UA | DF_CORE_A | DF_UMS,
 
-    // 6A SPUT_BOOLEAN vAA, field@BBBB
-    DF_UA | DF_UMS,
+  // 6A SPUT_BOOLEAN vAA, field@BBBB
+  DF_UA | DF_UMS,
 
-    // 6B SPUT_BYTE vAA, field@BBBB
-    DF_UA | DF_UMS,
+  // 6B SPUT_BYTE vAA, field@BBBB
+  DF_UA | DF_UMS,
 
-    // 6C SPUT_CHAR vAA, field@BBBB
-    DF_UA | DF_UMS,
+  // 6C SPUT_CHAR vAA, field@BBBB
+  DF_UA | DF_UMS,
 
-    // 6D SPUT_SHORT vAA, field@BBBB
-    DF_UA | DF_UMS,
+  // 6D SPUT_SHORT vAA, field@BBBB
+  DF_UA | DF_UMS,
 
-    // 6E INVOKE_VIRTUAL {vD, vE, vF, vG, vA}
-    DF_FORMAT_35C | DF_NULL_CHK_OUT0 | DF_UMS,
+  // 6E INVOKE_VIRTUAL {vD, vE, vF, vG, vA}
+  DF_FORMAT_35C | DF_NULL_CHK_OUT0 | DF_UMS,
 
-    // 6F INVOKE_SUPER {vD, vE, vF, vG, vA}
-    DF_FORMAT_35C | DF_NULL_CHK_OUT0 | DF_UMS,
+  // 6F INVOKE_SUPER {vD, vE, vF, vG, vA}
+  DF_FORMAT_35C | DF_NULL_CHK_OUT0 | DF_UMS,
 
-    // 70 INVOKE_DIRECT {vD, vE, vF, vG, vA}
-    DF_FORMAT_35C | DF_NULL_CHK_OUT0 | DF_UMS,
+  // 70 INVOKE_DIRECT {vD, vE, vF, vG, vA}
+  DF_FORMAT_35C | DF_NULL_CHK_OUT0 | DF_UMS,
 
-    // 71 INVOKE_STATIC {vD, vE, vF, vG, vA}
-    DF_FORMAT_35C | DF_UMS,
+  // 71 INVOKE_STATIC {vD, vE, vF, vG, vA}
+  DF_FORMAT_35C | DF_UMS,
 
-    // 72 INVOKE_INTERFACE {vD, vE, vF, vG, vA}
-    DF_FORMAT_35C | DF_UMS,
+  // 72 INVOKE_INTERFACE {vD, vE, vF, vG, vA}
+  DF_FORMAT_35C | DF_UMS,
 
-    // 73 UNUSED_73
-    DF_NOP,
+  // 73 UNUSED_73
+  DF_NOP,
 
-    // 74 INVOKE_VIRTUAL_RANGE {vCCCC .. vNNNN}
-    DF_FORMAT_3RC | DF_NULL_CHK_OUT0 | DF_UMS,
+  // 74 INVOKE_VIRTUAL_RANGE {vCCCC .. vNNNN}
+  DF_FORMAT_3RC | DF_NULL_CHK_OUT0 | DF_UMS,
 
-    // 75 INVOKE_SUPER_RANGE {vCCCC .. vNNNN}
-    DF_FORMAT_3RC | DF_NULL_CHK_OUT0 | DF_UMS,
+  // 75 INVOKE_SUPER_RANGE {vCCCC .. vNNNN}
+  DF_FORMAT_3RC | DF_NULL_CHK_OUT0 | DF_UMS,
 
-    // 76 INVOKE_DIRECT_RANGE {vCCCC .. vNNNN}
-    DF_FORMAT_3RC | DF_NULL_CHK_OUT0 | DF_UMS,
+  // 76 INVOKE_DIRECT_RANGE {vCCCC .. vNNNN}
+  DF_FORMAT_3RC | DF_NULL_CHK_OUT0 | DF_UMS,
 
-    // 77 INVOKE_STATIC_RANGE {vCCCC .. vNNNN}
-    DF_FORMAT_3RC | DF_UMS,
+  // 77 INVOKE_STATIC_RANGE {vCCCC .. vNNNN}
+  DF_FORMAT_3RC | DF_UMS,
 
-    // 78 INVOKE_INTERFACE_RANGE {vCCCC .. vNNNN}
-    DF_FORMAT_3RC | DF_UMS,
+  // 78 INVOKE_INTERFACE_RANGE {vCCCC .. vNNNN}
+  DF_FORMAT_3RC | DF_UMS,
 
-    // 79 UNUSED_79
-    DF_NOP,
+  // 79 UNUSED_79
+  DF_NOP,
 
-    // 7A UNUSED_7A
-    DF_NOP,
+  // 7A UNUSED_7A
+  DF_NOP,
 
-    // 7B NEG_INT vA, vB
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // 7B NEG_INT vA, vB
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // 7C NOT_INT vA, vB
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // 7C NOT_INT vA, vB
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // 7D NEG_LONG vA, vB
-    DF_DA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
+  // 7D NEG_LONG vA, vB
+  DF_DA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
 
-    // 7E NOT_LONG vA, vB
-    DF_DA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
+  // 7E NOT_LONG vA, vB
+  DF_DA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
 
-    // 7F NEG_FLOAT vA, vB
-    DF_DA | DF_UB | DF_FP_A | DF_FP_B,
+  // 7F NEG_FLOAT vA, vB
+  DF_DA | DF_UB | DF_FP_A | DF_FP_B,
 
-    // 80 NEG_DOUBLE vA, vB
-    DF_DA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
+  // 80 NEG_DOUBLE vA, vB
+  DF_DA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
 
-    // 81 INT_TO_LONG vA, vB
-    DF_DA_WIDE | DF_UB | DF_CORE_A | DF_CORE_B,
+  // 81 INT_TO_LONG vA, vB
+  DF_DA_WIDE | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // 82 INT_TO_FLOAT vA, vB
-    DF_DA | DF_UB | DF_FP_A | DF_CORE_B,
+  // 82 INT_TO_FLOAT vA, vB
+  DF_DA | DF_UB | DF_FP_A | DF_CORE_B,
 
-    // 83 INT_TO_DOUBLE vA, vB
-    DF_DA_WIDE | DF_UB | DF_FP_A | DF_CORE_B,
+  // 83 INT_TO_DOUBLE vA, vB
+  DF_DA_WIDE | DF_UB | DF_FP_A | DF_CORE_B,
 
-    // 84 LONG_TO_INT vA, vB
-    DF_DA | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
+  // 84 LONG_TO_INT vA, vB
+  DF_DA | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
 
-    // 85 LONG_TO_FLOAT vA, vB
-    DF_DA | DF_UB_WIDE | DF_FP_A | DF_CORE_B,
+  // 85 LONG_TO_FLOAT vA, vB
+  DF_DA | DF_UB_WIDE | DF_FP_A | DF_CORE_B,
 
-    // 86 LONG_TO_DOUBLE vA, vB
-    DF_DA_WIDE | DF_UB_WIDE | DF_FP_A | DF_CORE_B,
+  // 86 LONG_TO_DOUBLE vA, vB
+  DF_DA_WIDE | DF_UB_WIDE | DF_FP_A | DF_CORE_B,
 
-    // 87 FLOAT_TO_INT vA, vB
-    DF_DA | DF_UB | DF_FP_B | DF_CORE_A,
+  // 87 FLOAT_TO_INT vA, vB
+  DF_DA | DF_UB | DF_FP_B | DF_CORE_A,
 
-    // 88 FLOAT_TO_LONG vA, vB
-    DF_DA_WIDE | DF_UB | DF_FP_B | DF_CORE_A,
+  // 88 FLOAT_TO_LONG vA, vB
+  DF_DA_WIDE | DF_UB | DF_FP_B | DF_CORE_A,
 
-    // 89 FLOAT_TO_DOUBLE vA, vB
-    DF_DA_WIDE | DF_UB | DF_FP_A | DF_FP_B,
+  // 89 FLOAT_TO_DOUBLE vA, vB
+  DF_DA_WIDE | DF_UB | DF_FP_A | DF_FP_B,
 
-    // 8A DOUBLE_TO_INT vA, vB
-    DF_DA | DF_UB_WIDE | DF_FP_B | DF_CORE_A,
+  // 8A DOUBLE_TO_INT vA, vB
+  DF_DA | DF_UB_WIDE | DF_FP_B | DF_CORE_A,
 
-    // 8B DOUBLE_TO_LONG vA, vB
-    DF_DA_WIDE | DF_UB_WIDE | DF_FP_B | DF_CORE_A,
+  // 8B DOUBLE_TO_LONG vA, vB
+  DF_DA_WIDE | DF_UB_WIDE | DF_FP_B | DF_CORE_A,
 
-    // 8C DOUBLE_TO_FLOAT vA, vB
-    DF_DA | DF_UB_WIDE | DF_FP_A | DF_FP_B,
+  // 8C DOUBLE_TO_FLOAT vA, vB
+  DF_DA | DF_UB_WIDE | DF_FP_A | DF_FP_B,
 
-    // 8D INT_TO_BYTE vA, vB
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // 8D INT_TO_BYTE vA, vB
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // 8E INT_TO_CHAR vA, vB
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // 8E INT_TO_CHAR vA, vB
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // 8F INT_TO_SHORT vA, vB
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // 8F INT_TO_SHORT vA, vB
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // 90 ADD_INT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_IS_LINEAR | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 90 ADD_INT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_IS_LINEAR | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 91 SUB_INT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_IS_LINEAR | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 91 SUB_INT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_IS_LINEAR | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 92 MUL_INT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 92 MUL_INT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 93 DIV_INT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 93 DIV_INT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 94 REM_INT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 94 REM_INT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 95 AND_INT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 95 AND_INT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 96 OR_INT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 96 OR_INT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 97 XOR_INT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 97 XOR_INT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 98 SHL_INT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 98 SHL_INT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 99 SHR_INT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 99 SHR_INT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 9A USHR_INT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 9A USHR_INT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 9B ADD_LONG vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 9B ADD_LONG vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 9C SUB_LONG vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 9C SUB_LONG vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 9D MUL_LONG vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 9D MUL_LONG vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 9E DIV_LONG vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 9E DIV_LONG vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // 9F REM_LONG vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // 9F REM_LONG vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // A0 AND_LONG vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // A0 AND_LONG vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // A1 OR_LONG vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // A1 OR_LONG vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // A2 XOR_LONG vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // A2 XOR_LONG vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // A3 SHL_LONG vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // A3 SHL_LONG vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // A4 SHR_LONG vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // A4 SHR_LONG vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // A5 USHR_LONG vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
+  // A5 USHR_LONG vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC | DF_CORE_A | DF_CORE_B | DF_CORE_C,
 
-    // A6 ADD_FLOAT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
+  // A6 ADD_FLOAT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
 
-    // A7 SUB_FLOAT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
+  // A7 SUB_FLOAT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
 
-    // A8 MUL_FLOAT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
+  // A8 MUL_FLOAT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
 
-    // A9 DIV_FLOAT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
+  // A9 DIV_FLOAT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
 
-    // AA REM_FLOAT vAA, vBB, vCC
-    DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
+  // AA REM_FLOAT vAA, vBB, vCC
+  DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
 
-    // AB ADD_DOUBLE vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
+  // AB ADD_DOUBLE vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
 
-    // AC SUB_DOUBLE vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
+  // AC SUB_DOUBLE vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
 
-    // AD MUL_DOUBLE vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
+  // AD MUL_DOUBLE vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
 
-    // AE DIV_DOUBLE vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
+  // AE DIV_DOUBLE vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
 
-    // AF REM_DOUBLE vAA, vBB, vCC
-    DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
+  // AF REM_DOUBLE vAA, vBB, vCC
+  DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
 
-    // B0 ADD_INT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // B0 ADD_INT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // B1 SUB_INT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // B1 SUB_INT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // B2 MUL_INT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // B2 MUL_INT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // B3 DIV_INT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // B3 DIV_INT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // B4 REM_INT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // B4 REM_INT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // B5 AND_INT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // B5 AND_INT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // B6 OR_INT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // B6 OR_INT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // B7 XOR_INT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // B7 XOR_INT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // B8 SHL_INT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // B8 SHL_INT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // B9 SHR_INT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // B9 SHR_INT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // BA USHR_INT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // BA USHR_INT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // BB ADD_LONG_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
+  // BB ADD_LONG_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
 
-    // BC SUB_LONG_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
+  // BC SUB_LONG_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
 
-    // BD MUL_LONG_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
+  // BD MUL_LONG_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
 
-    // BE DIV_LONG_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
+  // BE DIV_LONG_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
 
-    // BF REM_LONG_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
+  // BF REM_LONG_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
 
-    // C0 AND_LONG_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
+  // C0 AND_LONG_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
 
-    // C1 OR_LONG_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
+  // C1 OR_LONG_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
 
-    // C2 XOR_LONG_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
+  // C2 XOR_LONG_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
 
-    // C3 SHL_LONG_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB | DF_CORE_A | DF_CORE_B,
+  // C3 SHL_LONG_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // C4 SHR_LONG_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB | DF_CORE_A | DF_CORE_B,
+  // C4 SHR_LONG_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // C5 USHR_LONG_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB | DF_CORE_A | DF_CORE_B,
+  // C5 USHR_LONG_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // C6 ADD_FLOAT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
+  // C6 ADD_FLOAT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
 
-    // C7 SUB_FLOAT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
+  // C7 SUB_FLOAT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
 
-    // C8 MUL_FLOAT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
+  // C8 MUL_FLOAT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
 
-    // C9 DIV_FLOAT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
+  // C9 DIV_FLOAT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
 
-    // CA REM_FLOAT_2ADDR vA, vB
-    DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
+  // CA REM_FLOAT_2ADDR vA, vB
+  DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
 
-    // CB ADD_DOUBLE_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
+  // CB ADD_DOUBLE_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
 
-    // CC SUB_DOUBLE_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
+  // CC SUB_DOUBLE_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
 
-    // CD MUL_DOUBLE_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
+  // CD MUL_DOUBLE_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
 
-    // CE DIV_DOUBLE_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
+  // CE DIV_DOUBLE_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
 
-    // CF REM_DOUBLE_2ADDR vA, vB
-    DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
+  // CF REM_DOUBLE_2ADDR vA, vB
+  DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
 
-    // D0 ADD_INT_LIT16 vA, vB, #+CCCC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // D0 ADD_INT_LIT16 vA, vB, #+CCCC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // D1 RSUB_INT vA, vB, #+CCCC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // D1 RSUB_INT vA, vB, #+CCCC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // D2 MUL_INT_LIT16 vA, vB, #+CCCC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // D2 MUL_INT_LIT16 vA, vB, #+CCCC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // D3 DIV_INT_LIT16 vA, vB, #+CCCC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // D3 DIV_INT_LIT16 vA, vB, #+CCCC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // D4 REM_INT_LIT16 vA, vB, #+CCCC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // D4 REM_INT_LIT16 vA, vB, #+CCCC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // D5 AND_INT_LIT16 vA, vB, #+CCCC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // D5 AND_INT_LIT16 vA, vB, #+CCCC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // D6 OR_INT_LIT16 vA, vB, #+CCCC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // D6 OR_INT_LIT16 vA, vB, #+CCCC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // D7 XOR_INT_LIT16 vA, vB, #+CCCC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // D7 XOR_INT_LIT16 vA, vB, #+CCCC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // D8 ADD_INT_LIT8 vAA, vBB, #+CC
-    DF_DA | DF_UB | DF_IS_LINEAR | DF_CORE_A | DF_CORE_B,
+  // D8 ADD_INT_LIT8 vAA, vBB, #+CC
+  DF_DA | DF_UB | DF_IS_LINEAR | DF_CORE_A | DF_CORE_B,
 
-    // D9 RSUB_INT_LIT8 vAA, vBB, #+CC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // D9 RSUB_INT_LIT8 vAA, vBB, #+CC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // DA MUL_INT_LIT8 vAA, vBB, #+CC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // DA MUL_INT_LIT8 vAA, vBB, #+CC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // DB DIV_INT_LIT8 vAA, vBB, #+CC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // DB DIV_INT_LIT8 vAA, vBB, #+CC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // DC REM_INT_LIT8 vAA, vBB, #+CC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // DC REM_INT_LIT8 vAA, vBB, #+CC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // DD AND_INT_LIT8 vAA, vBB, #+CC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // DD AND_INT_LIT8 vAA, vBB, #+CC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // DE OR_INT_LIT8 vAA, vBB, #+CC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // DE OR_INT_LIT8 vAA, vBB, #+CC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // DF XOR_INT_LIT8 vAA, vBB, #+CC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // DF XOR_INT_LIT8 vAA, vBB, #+CC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // E0 SHL_INT_LIT8 vAA, vBB, #+CC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // E0 SHL_INT_LIT8 vAA, vBB, #+CC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // E1 SHR_INT_LIT8 vAA, vBB, #+CC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // E1 SHR_INT_LIT8 vAA, vBB, #+CC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // E2 USHR_INT_LIT8 vAA, vBB, #+CC
-    DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
+  // E2 USHR_INT_LIT8 vAA, vBB, #+CC
+  DF_DA | DF_UB | DF_CORE_A | DF_CORE_B,
 
-    // E3 IGET_VOLATILE
-    DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
+  // E3 IGET_VOLATILE
+  DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
 
-    // E4 IPUT_VOLATILE
-    DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_B,
+  // E4 IPUT_VOLATILE
+  DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_B,
 
-    // E5 SGET_VOLATILE
-    DF_DA | DF_UMS,
+  // E5 SGET_VOLATILE
+  DF_DA | DF_UMS,
 
-    // E6 SPUT_VOLATILE
-    DF_UA | DF_UMS,
+  // E6 SPUT_VOLATILE
+  DF_UA | DF_UMS,
 
-    // E7 IGET_OBJECT_VOLATILE
-    DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_A | DF_CORE_B,
+  // E7 IGET_OBJECT_VOLATILE
+  DF_DA | DF_UB | DF_NULL_CHK_0 | DF_CORE_A | DF_CORE_B,
 
-    // E8 IGET_WIDE_VOLATILE
-    DF_DA_WIDE | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
+  // E8 IGET_WIDE_VOLATILE
+  DF_DA_WIDE | DF_UB | DF_NULL_CHK_0 | DF_CORE_B,
 
-    // E9 IPUT_WIDE_VOLATILE
-    DF_UA_WIDE | DF_UB | DF_NULL_CHK_2 | DF_CORE_B,
+  // E9 IPUT_WIDE_VOLATILE
+  DF_UA_WIDE | DF_UB | DF_NULL_CHK_2 | DF_CORE_B,
 
-    // EA SGET_WIDE_VOLATILE
-    DF_DA_WIDE | DF_UMS,
+  // EA SGET_WIDE_VOLATILE
+  DF_DA_WIDE | DF_UMS,
 
-    // EB SPUT_WIDE_VOLATILE
-    DF_UA_WIDE | DF_UMS,
+  // EB SPUT_WIDE_VOLATILE
+  DF_UA_WIDE | DF_UMS,
 
-    // EC BREAKPOINT
-    DF_NOP,
+  // EC BREAKPOINT
+  DF_NOP,
 
-    // ED THROW_VERIFICATION_ERROR
-    DF_NOP | DF_UMS,
+  // ED THROW_VERIFICATION_ERROR
+  DF_NOP | DF_UMS,
 
-    // EE EXECUTE_INLINE
-    DF_FORMAT_35C,
+  // EE EXECUTE_INLINE
+  DF_FORMAT_35C,
 
-    // EF EXECUTE_INLINE_RANGE
-    DF_FORMAT_3RC,
+  // EF EXECUTE_INLINE_RANGE
+  DF_FORMAT_3RC,
 
-    // F0 INVOKE_OBJECT_INIT_RANGE
-    DF_NOP | DF_NULL_CHK_0,
+  // F0 INVOKE_OBJECT_INIT_RANGE
+  DF_NOP | DF_NULL_CHK_0,
 
-    // F1 RETURN_VOID_BARRIER
-    DF_NOP,
+  // F1 RETURN_VOID_BARRIER
+  DF_NOP,
 
-    // F2 IGET_QUICK
-    DF_DA | DF_UB | DF_NULL_CHK_0,
+  // F2 IGET_QUICK
+  DF_DA | DF_UB | DF_NULL_CHK_0,
 
-    // F3 IGET_WIDE_QUICK
-    DF_DA_WIDE | DF_UB | DF_NULL_CHK_0,
+  // F3 IGET_WIDE_QUICK
+  DF_DA_WIDE | DF_UB | DF_NULL_CHK_0,
 
-    // F4 IGET_OBJECT_QUICK
-    DF_DA | DF_UB | DF_NULL_CHK_0,
+  // F4 IGET_OBJECT_QUICK
+  DF_DA | DF_UB | DF_NULL_CHK_0,
 
-    // F5 IPUT_QUICK
-    DF_UA | DF_UB | DF_NULL_CHK_1,
+  // F5 IPUT_QUICK
+  DF_UA | DF_UB | DF_NULL_CHK_1,
 
-    // F6 IPUT_WIDE_QUICK
-    DF_UA_WIDE | DF_UB | DF_NULL_CHK_2,
+  // F6 IPUT_WIDE_QUICK
+  DF_UA_WIDE | DF_UB | DF_NULL_CHK_2,
 
-    // F7 IPUT_OBJECT_QUICK
-    DF_UA | DF_UB | DF_NULL_CHK_1,
+  // F7 IPUT_OBJECT_QUICK
+  DF_UA | DF_UB | DF_NULL_CHK_1,
 
-    // F8 INVOKE_VIRTUAL_QUICK
-    DF_FORMAT_35C | DF_NULL_CHK_OUT0 | DF_UMS,
+  // F8 INVOKE_VIRTUAL_QUICK
+  DF_FORMAT_35C | DF_NULL_CHK_OUT0 | DF_UMS,
 
-    // F9 INVOKE_VIRTUAL_QUICK_RANGE
-    DF_FORMAT_3RC | DF_NULL_CHK_OUT0 | DF_UMS,
+  // F9 INVOKE_VIRTUAL_QUICK_RANGE
+  DF_FORMAT_3RC | DF_NULL_CHK_OUT0 | DF_UMS,
 
-    // FA INVOKE_SUPER_QUICK
-    DF_FORMAT_35C | DF_NULL_CHK_OUT0 | DF_UMS,
+  // FA INVOKE_SUPER_QUICK
+  DF_FORMAT_35C | DF_NULL_CHK_OUT0 | DF_UMS,
 
-    // FB INVOKE_SUPER_QUICK_RANGE
-    DF_FORMAT_3RC | DF_NULL_CHK_OUT0 | DF_UMS,
+  // FB INVOKE_SUPER_QUICK_RANGE
+  DF_FORMAT_3RC | DF_NULL_CHK_OUT0 | DF_UMS,
 
-    // FC IPUT_OBJECT_VOLATILE
-    DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_A | DF_CORE_B,
+  // FC IPUT_OBJECT_VOLATILE
+  DF_UA | DF_UB | DF_NULL_CHK_1 | DF_CORE_A | DF_CORE_B,
 
-    // FD SGET_OBJECT_VOLATILE
-    DF_DA | DF_CORE_A | DF_UMS,
+  // FD SGET_OBJECT_VOLATILE
+  DF_DA | DF_CORE_A | DF_UMS,
 
-    // FE SPUT_OBJECT_VOLATILE
-    DF_UA | DF_CORE_A | DF_UMS,
+  // FE SPUT_OBJECT_VOLATILE
+  DF_UA | DF_CORE_A | DF_UMS,
 
-    // FF UNUSED_FF
-    DF_NOP,
+  // FF UNUSED_FF
+  DF_NOP,
 
-    // Beginning of extended MIR opcodes
-    // 100 MIR_PHI
-    DF_PHI | DF_DA | DF_NULL_TRANSFER_N,
+  // Beginning of extended MIR opcodes
+  // 100 MIR_PHI
+  DF_PHI | DF_DA | DF_NULL_TRANSFER_N,
 
-    // 101 MIR_COPY
-    DF_DA | DF_UB | DF_IS_MOVE,
+  // 101 MIR_COPY
+  DF_DA | DF_UB | DF_IS_MOVE,
 
-    // 102 MIR_FUSED_CMPL_FLOAT
-    DF_UA | DF_UB | DF_FP_A | DF_FP_B,
+  // 102 MIR_FUSED_CMPL_FLOAT
+  DF_UA | DF_UB | DF_FP_A | DF_FP_B,
 
-    // 103 MIR_FUSED_CMPG_FLOAT
-    DF_UA | DF_UB | DF_FP_A | DF_FP_B,
+  // 103 MIR_FUSED_CMPG_FLOAT
+  DF_UA | DF_UB | DF_FP_A | DF_FP_B,
 
-    // 104 MIR_FUSED_CMPL_DOUBLE
-    DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
+  // 104 MIR_FUSED_CMPL_DOUBLE
+  DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
 
-    // 105 MIR_FUSED_CMPG_DOUBLE
-    DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
+  // 105 MIR_FUSED_CMPG_DOUBLE
+  DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
 
-    // 106 MIR_FUSED_CMP_LONG
-    DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
+  // 106 MIR_FUSED_CMP_LONG
+  DF_UA_WIDE | DF_UB_WIDE | DF_CORE_A | DF_CORE_B,
 
-    // 107 MIR_NOP
-    DF_NOP,
+  // 107 MIR_NOP
+  DF_NOP,
 
-    // 108 MIR_NULL_RANGE_UP_CHECK
-    0,
+  // 108 MIR_NULL_RANGE_UP_CHECK
+  0,
 
-    // 109 MIR_NULL_RANGE_DOWN_CHECK
-    0,
+  // 109 MIR_NULL_RANGE_DOWN_CHECK
+  0,
 
-    // 110 MIR_LOWER_BOUND
-    0,
+  // 110 MIR_LOWER_BOUND
+  0,
 };
 
 /* Return the base virtual register for a SSA name */
 int SRegToVReg(const CompilationUnit* cUnit, int ssaReg)
 {
-    DCHECK_LT(ssaReg, (int)cUnit->ssaBaseVRegs->numUsed);
-    return GET_ELEM_N(cUnit->ssaBaseVRegs, int, ssaReg);
+  DCHECK_LT(ssaReg, (int)cUnit->ssaBaseVRegs->numUsed);
+  return GET_ELEM_N(cUnit->ssaBaseVRegs, int, ssaReg);
 }
 
 int SRegToSubscript(const CompilationUnit* cUnit, int ssaReg)
 {
-    DCHECK(ssaReg < (int)cUnit->ssaSubscripts->numUsed);
-    return GET_ELEM_N(cUnit->ssaSubscripts, int, ssaReg);
+  DCHECK(ssaReg < (int)cUnit->ssaSubscripts->numUsed);
+  return GET_ELEM_N(cUnit->ssaSubscripts, int, ssaReg);
 }
 
 int getSSAUseCount(CompilationUnit* cUnit, int sReg)
 {
-    DCHECK(sReg < (int)cUnit->rawUseCounts.numUsed);
-    return cUnit->rawUseCounts.elemList[sReg];
+  DCHECK(sReg < (int)cUnit->rawUseCounts.numUsed);
+  return cUnit->rawUseCounts.elemList[sReg];
 }
 
 
 char* oatGetDalvikDisassembly(CompilationUnit* cUnit,
                               const DecodedInstruction& insn, const char* note)
 {
-    char buffer[256];
-    Instruction::Code opcode = insn.opcode;
-    int dfAttributes = oatDataFlowAttributes[opcode];
-    int flags;
-    char* ret;
+  char buffer[256];
+  Instruction::Code opcode = insn.opcode;
+  int dfAttributes = oatDataFlowAttributes[opcode];
+  int flags;
+  char* ret;
 
-    buffer[0] = 0;
-    if ((int)opcode >= (int)kMirOpFirst) {
-        if ((int)opcode == (int)kMirOpPhi) {
-            strcpy(buffer, "PHI");
-        } else {
-            sprintf(buffer, "Opcode %#x", opcode);
-        }
-        flags = 0;
+  buffer[0] = 0;
+  if ((int)opcode >= (int)kMirOpFirst) {
+    if ((int)opcode == (int)kMirOpPhi) {
+      strcpy(buffer, "PHI");
     } else {
-        strcpy(buffer, Instruction::Name(opcode));
-        flags = Instruction::Flags(opcode);
+      sprintf(buffer, "Opcode %#x", opcode);
     }
+    flags = 0;
+  } else {
+    strcpy(buffer, Instruction::Name(opcode));
+    flags = Instruction::Flags(opcode);
+  }
 
-    if (note)
-        strcat(buffer, note);
+  if (note)
+    strcat(buffer, note);
 
-    /* For branches, decode the instructions to print out the branch targets */
-    if (flags & Instruction::kBranch) {
-        Instruction::Format dalvikFormat = Instruction::FormatOf(insn.opcode);
-        int offset = 0;
-        switch (dalvikFormat) {
-            case Instruction::k21t:
-                snprintf(buffer + strlen(buffer), 256, " v%d,", insn.vA);
-                offset = (int) insn.vB;
-                break;
-            case Instruction::k22t:
-                snprintf(buffer + strlen(buffer), 256, " v%d, v%d,", insn.vA, insn.vB);
-                offset = (int) insn.vC;
-                break;
-            case Instruction::k10t:
-            case Instruction::k20t:
-            case Instruction::k30t:
-                offset = (int) insn.vA;
-                break;
-            default:
-                LOG(FATAL) << "Unexpected branch format " << (int)dalvikFormat
-                    << " / opcode " << (int)opcode;
-        }
-        snprintf(buffer + strlen(buffer), 256, " (%c%x)",
-                 offset > 0 ? '+' : '-',
-                 offset > 0 ? offset : -offset);
-    } else if (dfAttributes & DF_FORMAT_35C) {
-        unsigned int i;
-        for (i = 0; i < insn.vA; i++) {
-            if (i != 0) strcat(buffer, ",");
-            snprintf(buffer + strlen(buffer), 256, " v%d", insn.arg[i]);
-        }
+  /* For branches, decode the instructions to print out the branch targets */
+  if (flags & Instruction::kBranch) {
+    Instruction::Format dalvikFormat = Instruction::FormatOf(insn.opcode);
+    int offset = 0;
+    switch (dalvikFormat) {
+      case Instruction::k21t:
+        snprintf(buffer + strlen(buffer), 256, " v%d,", insn.vA);
+        offset = (int) insn.vB;
+        break;
+      case Instruction::k22t:
+        snprintf(buffer + strlen(buffer), 256, " v%d, v%d,", insn.vA, insn.vB);
+        offset = (int) insn.vC;
+        break;
+      case Instruction::k10t:
+      case Instruction::k20t:
+      case Instruction::k30t:
+        offset = (int) insn.vA;
+        break;
+      default:
+        LOG(FATAL) << "Unexpected branch format " << (int)dalvikFormat
+                   << " / opcode " << (int)opcode;
     }
-    else if (dfAttributes & DF_FORMAT_3RC) {
-        snprintf(buffer + strlen(buffer), 256,
-                 " v%d..v%d", insn.vC, insn.vC + insn.vA - 1);
+    snprintf(buffer + strlen(buffer), 256, " (%c%x)",
+             offset > 0 ? '+' : '-',
+             offset > 0 ? offset : -offset);
+  } else if (dfAttributes & DF_FORMAT_35C) {
+    unsigned int i;
+    for (i = 0; i < insn.vA; i++) {
+      if (i != 0) strcat(buffer, ",");
+        snprintf(buffer + strlen(buffer), 256, " v%d", insn.arg[i]);
     }
-    else {
-        if (dfAttributes & DF_A_IS_REG) {
-            snprintf(buffer + strlen(buffer), 256, " v%d", insn.vA);
-        }
-        if (dfAttributes & DF_B_IS_REG) {
-            snprintf(buffer + strlen(buffer), 256, ", v%d", insn.vB);
-        }
-        else if ((int)opcode < (int)kMirOpFirst) {
-            snprintf(buffer + strlen(buffer), 256, ", (#%d)", insn.vB);
-        }
-        if (dfAttributes & DF_C_IS_REG) {
-            snprintf(buffer + strlen(buffer), 256, ", v%d", insn.vC);
-        }
-        else if ((int)opcode < (int)kMirOpFirst) {
-            snprintf(buffer + strlen(buffer), 256, ", (#%d)", insn.vC);
-        }
+  }
+  else if (dfAttributes & DF_FORMAT_3RC) {
+    snprintf(buffer + strlen(buffer), 256,
+             " v%d..v%d", insn.vC, insn.vC + insn.vA - 1);
+  } else {
+    if (dfAttributes & DF_A_IS_REG) {
+      snprintf(buffer + strlen(buffer), 256, " v%d", insn.vA);
     }
-    int length = strlen(buffer) + 1;
-    ret = (char*)oatNew(cUnit, length, false, kAllocDFInfo);
-    memcpy(ret, buffer, length);
-    return ret;
+    if (dfAttributes & DF_B_IS_REG) {
+      snprintf(buffer + strlen(buffer), 256, ", v%d", insn.vB);
+    } else if ((int)opcode < (int)kMirOpFirst) {
+      snprintf(buffer + strlen(buffer), 256, ", (#%d)", insn.vB);
+    }
+    if (dfAttributes & DF_C_IS_REG) {
+      snprintf(buffer + strlen(buffer), 256, ", v%d", insn.vC);
+    } else if ((int)opcode < (int)kMirOpFirst) {
+      snprintf(buffer + strlen(buffer), 256, ", (#%d)", insn.vC);
+    }
+  }
+  int length = strlen(buffer) + 1;
+  ret = (char*)oatNew(cUnit, length, false, kAllocDFInfo);
+  memcpy(ret, buffer, length);
+  return ret;
 }
 
 char* getSSAName(const CompilationUnit* cUnit, int ssaReg, char* name)
 {
-    sprintf(name, "v%d_%d", SRegToVReg(cUnit, ssaReg),
-            SRegToSubscript(cUnit, ssaReg));
-    return name;
+  sprintf(name, "v%d_%d", SRegToVReg(cUnit, ssaReg),
+          SRegToSubscript(cUnit, ssaReg));
+  return name;
 }
 
 /*
@@ -949,156 +946,154 @@
  */
 char* oatFullDisassembler(CompilationUnit* cUnit, const MIR* mir)
 {
-    char buffer[256];
-    char operand0[32], operand1[32];
-    const DecodedInstruction* insn = &mir->dalvikInsn;
-    Instruction::Code opcode = insn->opcode;
-    int dfAttributes = oatDataFlowAttributes[opcode];
-    char* ret;
-    int length;
+  char buffer[256];
+  char operand0[32], operand1[32];
+  const DecodedInstruction* insn = &mir->dalvikInsn;
+  Instruction::Code opcode = insn->opcode;
+  int dfAttributes = oatDataFlowAttributes[opcode];
+  char* ret;
+  int length;
 
-    buffer[0] = 0;
-    if (static_cast<int>(opcode) >= static_cast<int>(kMirOpFirst)) {
-        if (static_cast<int>(opcode) == static_cast<int>(kMirOpPhi)) {
-            snprintf(buffer, 256, "PHI %s = (%s",
-                     getSSAName(cUnit, mir->ssaRep->defs[0], operand0),
-                     getSSAName(cUnit, mir->ssaRep->uses[0], operand1));
-            int i;
-            for (i = 1; i < mir->ssaRep->numUses; i++) {
-                snprintf(buffer + strlen(buffer), 256, ", %s",
-                         getSSAName(cUnit, mir->ssaRep->uses[i], operand0));
-            }
-            snprintf(buffer + strlen(buffer), 256, ")");
-        }
-        else {
-            sprintf(buffer, "Opcode %#x", opcode);
-        }
-        goto done;
+  buffer[0] = 0;
+  if (static_cast<int>(opcode) >= static_cast<int>(kMirOpFirst)) {
+    if (static_cast<int>(opcode) == static_cast<int>(kMirOpPhi)) {
+      snprintf(buffer, 256, "PHI %s = (%s",
+               getSSAName(cUnit, mir->ssaRep->defs[0], operand0),
+               getSSAName(cUnit, mir->ssaRep->uses[0], operand1));
+      int i;
+      for (i = 1; i < mir->ssaRep->numUses; i++) {
+        snprintf(buffer + strlen(buffer), 256, ", %s",
+        getSSAName(cUnit, mir->ssaRep->uses[i], operand0));
+      }
+      snprintf(buffer + strlen(buffer), 256, ")");
     } else {
-        strcpy(buffer, Instruction::Name(opcode));
+      sprintf(buffer, "Opcode %#x", opcode);
     }
+    goto done;
+  } else {
+    strcpy(buffer, Instruction::Name(opcode));
+  }
 
-    /* For branches, decode the instructions to print out the branch targets */
-    if (Instruction::Flags(insn->opcode) & Instruction::kBranch) {
-        Instruction::Format dalvikFormat = Instruction::FormatOf(insn->opcode);
-        int delta = 0;
+  /* For branches, decode the instructions to print out the branch targets */
+  if (Instruction::Flags(insn->opcode) & Instruction::kBranch) {
+    Instruction::Format dalvikFormat = Instruction::FormatOf(insn->opcode);
+    int delta = 0;
+    switch (dalvikFormat) {
+      case Instruction::k21t:
+        snprintf(buffer + strlen(buffer), 256, " %s, ",
+                 getSSAName(cUnit, mir->ssaRep->uses[0], operand0));
+        delta = (int) insn->vB;
+        break;
+      case Instruction::k22t:
+        snprintf(buffer + strlen(buffer), 256, " %s, %s, ",
+                 getSSAName(cUnit, mir->ssaRep->uses[0], operand0),
+                 getSSAName(cUnit, mir->ssaRep->uses[1], operand1));
+        delta = (int) insn->vC;
+        break;
+      case Instruction::k10t:
+      case Instruction::k20t:
+      case Instruction::k30t:
+        delta = (int) insn->vA;
+        break;
+      default:
+        LOG(FATAL) << "Unexpected branch format: " << (int)dalvikFormat;
+      }
+      snprintf(buffer + strlen(buffer), 256, " %04x",
+               mir->offset + delta);
+  } else if (dfAttributes & (DF_FORMAT_35C | DF_FORMAT_3RC)) {
+    unsigned int i;
+    for (i = 0; i < insn->vA; i++) {
+      if (i != 0) strcat(buffer, ",");
+        snprintf(buffer + strlen(buffer), 256, " %s",
+                 getSSAName(cUnit, mir->ssaRep->uses[i], operand0));
+    }
+  } else {
+    int udIdx;
+    if (mir->ssaRep->numDefs) {
+
+      for (udIdx = 0; udIdx < mir->ssaRep->numDefs; udIdx++) {
+        snprintf(buffer + strlen(buffer), 256, " %s",
+                 getSSAName(cUnit, mir->ssaRep->defs[udIdx], operand0));
+      }
+      strcat(buffer, ",");
+    }
+    if (mir->ssaRep->numUses) {
+      /* No leading ',' for the first use */
+      snprintf(buffer + strlen(buffer), 256, " %s",
+               getSSAName(cUnit, mir->ssaRep->uses[0], operand0));
+      for (udIdx = 1; udIdx < mir->ssaRep->numUses; udIdx++) {
+        snprintf(buffer + strlen(buffer), 256, ", %s",
+                 getSSAName(cUnit, mir->ssaRep->uses[udIdx], operand0));
+        }
+      }
+      if (static_cast<int>(opcode) < static_cast<int>(kMirOpFirst)) {
+        Instruction::Format dalvikFormat = Instruction::FormatOf(opcode);
         switch (dalvikFormat) {
-            case Instruction::k21t:
-                snprintf(buffer + strlen(buffer), 256, " %s, ",
-                         getSSAName(cUnit, mir->ssaRep->uses[0], operand0));
-                delta = (int) insn->vB;
-                break;
-            case Instruction::k22t:
-                snprintf(buffer + strlen(buffer), 256, " %s, %s, ",
-                         getSSAName(cUnit, mir->ssaRep->uses[0], operand0),
-                         getSSAName(cUnit, mir->ssaRep->uses[1], operand1));
-                delta = (int) insn->vC;
-                break;
-            case Instruction::k10t:
-            case Instruction::k20t:
-            case Instruction::k30t:
-                delta = (int) insn->vA;
-                break;
-            default:
-                LOG(FATAL) << "Unexpected branch format: " <<
-                   (int)dalvikFormat;
+          case Instruction::k11n:        // op vA, #+B
+          case Instruction::k21s:        // op vAA, #+BBBB
+          case Instruction::k21h:        // op vAA, #+BBBB00000[00000000]
+          case Instruction::k31i:        // op vAA, #+BBBBBBBB
+          case Instruction::k51l:        // op vAA, #+BBBBBBBBBBBBBBBB
+            snprintf(buffer + strlen(buffer), 256, " #%#x", insn->vB);
+            break;
+          case Instruction::k21c:        // op vAA, thing@BBBB
+          case Instruction::k31c:        // op vAA, thing@BBBBBBBB
+            snprintf(buffer + strlen(buffer), 256, " @%#x", insn->vB);
+            break;
+          case Instruction::k22b:        // op vAA, vBB, #+CC
+          case Instruction::k22s:        // op vA, vB, #+CCCC
+            snprintf(buffer + strlen(buffer), 256, " #%#x", insn->vC);
+            break;
+          case Instruction::k22c:        // op vA, vB, thing@CCCC
+            snprintf(buffer + strlen(buffer), 256, " @%#x", insn->vC);
+            break;
+          /* No need for special printing */
+          default:
+            break;
         }
-        snprintf(buffer + strlen(buffer), 256, " %04x",
-                 mir->offset + delta);
-    } else if (dfAttributes & (DF_FORMAT_35C | DF_FORMAT_3RC)) {
-        unsigned int i;
-        for (i = 0; i < insn->vA; i++) {
-            if (i != 0) strcat(buffer, ",");
-            snprintf(buffer + strlen(buffer), 256, " %s",
-                     getSSAName(cUnit, mir->ssaRep->uses[i], operand0));
-        }
-    } else {
-        int udIdx;
-        if (mir->ssaRep->numDefs) {
-
-            for (udIdx = 0; udIdx < mir->ssaRep->numDefs; udIdx++) {
-                snprintf(buffer + strlen(buffer), 256, " %s",
-                         getSSAName(cUnit, mir->ssaRep->defs[udIdx], operand0));
-            }
-            strcat(buffer, ",");
-        }
-        if (mir->ssaRep->numUses) {
-            /* No leading ',' for the first use */
-            snprintf(buffer + strlen(buffer), 256, " %s",
-                     getSSAName(cUnit, mir->ssaRep->uses[0], operand0));
-            for (udIdx = 1; udIdx < mir->ssaRep->numUses; udIdx++) {
-                snprintf(buffer + strlen(buffer), 256, ", %s",
-                         getSSAName(cUnit, mir->ssaRep->uses[udIdx], operand0));
-            }
-        }
-        if (static_cast<int>(opcode) < static_cast<int>(kMirOpFirst)) {
-            Instruction::Format dalvikFormat = Instruction::FormatOf(opcode);
-            switch (dalvikFormat) {
-                case Instruction::k11n:        // op vA, #+B
-                case Instruction::k21s:        // op vAA, #+BBBB
-                case Instruction::k21h:        // op vAA, #+BBBB00000[00000000]
-                case Instruction::k31i:        // op vAA, #+BBBBBBBB
-                case Instruction::k51l:        // op vAA, #+BBBBBBBBBBBBBBBB
-                    snprintf(buffer + strlen(buffer), 256, " #%#x", insn->vB);
-                    break;
-                case Instruction::k21c:        // op vAA, thing@BBBB
-                case Instruction::k31c:        // op vAA, thing@BBBBBBBB
-                    snprintf(buffer + strlen(buffer), 256, " @%#x", insn->vB);
-                    break;
-                case Instruction::k22b:        // op vAA, vBB, #+CC
-                case Instruction::k22s:        // op vA, vB, #+CCCC
-                    snprintf(buffer + strlen(buffer), 256, " #%#x", insn->vC);
-                    break;
-                case Instruction::k22c:        // op vA, vB, thing@CCCC
-                    snprintf(buffer + strlen(buffer), 256, " @%#x", insn->vC);
-                    break;
-                    /* No need for special printing */
-                default:
-                    break;
-            }
-        }
-    }
+     }
+  }
 
 done:
-    length = strlen(buffer) + 1;
-    ret = (char*) oatNew(cUnit, length, false, kAllocDFInfo);
-    memcpy(ret, buffer, length);
-    return ret;
+  length = strlen(buffer) + 1;
+  ret = (char*) oatNew(cUnit, length, false, kAllocDFInfo);
+  memcpy(ret, buffer, length);
+  return ret;
 }
 
 char* oatGetSSAString(CompilationUnit* cUnit, SSARepresentation* ssaRep)
 {
-    char buffer[256];
-    char* ret;
-    int i;
+  char buffer[256];
+  char* ret;
+  int i;
 
-    buffer[0] = 0;
-    for (i = 0; i < ssaRep->numDefs; i++) {
-        int ssaReg = ssaRep->defs[i];
-        sprintf(buffer + strlen(buffer), "s%d(v%d_%d) ", ssaReg,
-                SRegToVReg(cUnit, ssaReg), SRegToSubscript(cUnit, ssaReg));
+  buffer[0] = 0;
+  for (i = 0; i < ssaRep->numDefs; i++) {
+    int ssaReg = ssaRep->defs[i];
+    sprintf(buffer + strlen(buffer), "s%d(v%d_%d) ", ssaReg,
+            SRegToVReg(cUnit, ssaReg), SRegToSubscript(cUnit, ssaReg));
+  }
+
+  if (ssaRep->numDefs) {
+    strcat(buffer, "<- ");
+  }
+
+  for (i = 0; i < ssaRep->numUses; i++) {
+    int len = strlen(buffer);
+    int ssaReg = ssaRep->uses[i];
+
+    if (snprintf(buffer + len, 250 - len, "s%d(v%d_%d) ", ssaReg,
+                 SRegToVReg(cUnit, ssaReg),
+                 SRegToSubscript(cUnit, ssaReg))) {
+      strcat(buffer, "...");
+      break;
     }
+  }
 
-    if (ssaRep->numDefs) {
-        strcat(buffer, "<- ");
-    }
-
-    for (i = 0; i < ssaRep->numUses; i++) {
-        int len = strlen(buffer);
-        int ssaReg = ssaRep->uses[i];
-
-        if (snprintf(buffer + len, 250 - len, "s%d(v%d_%d) ", ssaReg,
-                     SRegToVReg(cUnit, ssaReg),
-                     SRegToSubscript(cUnit, ssaReg))) {
-            strcat(buffer, "...");
-            break;
-        }
-    }
-
-    int length = strlen(buffer) + 1;
-    ret = (char*)oatNew(cUnit, length, false, kAllocDFInfo);
-    memcpy(ret, buffer, length);
-    return ret;
+  int length = strlen(buffer) + 1;
+  ret = (char*)oatNew(cUnit, length, false, kAllocDFInfo);
+  memcpy(ret, buffer, length);
+  return ret;
 }
 
 /* Any register that is used before being defined is considered live-in */
@@ -1106,17 +1101,17 @@
                             ArenaBitVector* defV, ArenaBitVector* liveInV,
                             int dalvikRegId)
 {
-    oatSetBit(cUnit, useV, dalvikRegId);
-    if (!oatIsBitSet(defV, dalvikRegId)) {
-        oatSetBit(cUnit, liveInV, dalvikRegId);
-    }
+  oatSetBit(cUnit, useV, dalvikRegId);
+  if (!oatIsBitSet(defV, dalvikRegId)) {
+    oatSetBit(cUnit, liveInV, dalvikRegId);
+  }
 }
 
 /* Mark a reg as being defined */
 inline void handleDef(CompilationUnit* cUnit, ArenaBitVector* defV,
                       int dalvikRegId)
 {
-    oatSetBit(cUnit, defV, dalvikRegId);
+  oatSetBit(cUnit, defV, dalvikRegId);
 }
 
 /*
@@ -1125,567 +1120,556 @@
  */
 bool oatFindLocalLiveIn(CompilationUnit* cUnit, BasicBlock* bb)
 {
-    MIR* mir;
-    ArenaBitVector *useV, *defV, *liveInV;
+  MIR* mir;
+  ArenaBitVector *useV, *defV, *liveInV;
 
-    if (bb->dataFlowInfo == NULL) return false;
+  if (bb->dataFlowInfo == NULL) return false;
 
-    useV = bb->dataFlowInfo->useV =
-        oatAllocBitVector(cUnit, cUnit->numDalvikRegisters, false, kBitMapUse);
-    defV = bb->dataFlowInfo->defV =
-        oatAllocBitVector(cUnit, cUnit->numDalvikRegisters, false, kBitMapDef);
-    liveInV = bb->dataFlowInfo->liveInV =
-        oatAllocBitVector(cUnit, cUnit->numDalvikRegisters, false,
-                          kBitMapLiveIn);
+  useV = bb->dataFlowInfo->useV =
+      oatAllocBitVector(cUnit, cUnit->numDalvikRegisters, false, kBitMapUse);
+  defV = bb->dataFlowInfo->defV =
+      oatAllocBitVector(cUnit, cUnit->numDalvikRegisters, false, kBitMapDef);
+  liveInV = bb->dataFlowInfo->liveInV =
+      oatAllocBitVector(cUnit, cUnit->numDalvikRegisters, false,
+                        kBitMapLiveIn);
 
-    for (mir = bb->firstMIRInsn; mir; mir = mir->next) {
-        int dfAttributes =
-            oatDataFlowAttributes[mir->dalvikInsn.opcode];
-        DecodedInstruction *dInsn = &mir->dalvikInsn;
+  for (mir = bb->firstMIRInsn; mir; mir = mir->next) {
+    int dfAttributes = oatDataFlowAttributes[mir->dalvikInsn.opcode];
+    DecodedInstruction *dInsn = &mir->dalvikInsn;
 
-        if (dfAttributes & DF_HAS_USES) {
-            if (dfAttributes & DF_UA) {
-                handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vA);
-            } else if (dfAttributes & DF_UA_WIDE) {
-                handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vA);
-                handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vA+1);
-            }
-            if (dfAttributes & DF_UB) {
-                handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vB);
-            } else if (dfAttributes & DF_UB_WIDE) {
-                handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vB);
-                handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vB+1);
-            }
-            if (dfAttributes & DF_UC) {
-                handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vC);
-            } else if (dfAttributes & DF_UC_WIDE) {
-                handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vC);
-                handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vC+1);
-            }
-        }
-        if (dfAttributes & DF_FORMAT_35C) {
-            for (unsigned int i = 0; i < dInsn->vA; i++) {
-                handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->arg[i]);
-           }
-        }
-        if (dfAttributes & DF_FORMAT_3RC) {
-            for (unsigned int i = 0; i < dInsn->vA; i++) {
-                handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vC+i);
-           }
-        }
-        if (dfAttributes & DF_HAS_DEFS) {
-            handleDef(cUnit, defV, dInsn->vA);
-            if (dfAttributes & DF_DA_WIDE) {
-                handleDef(cUnit, defV, dInsn->vA+1);
-            }
-        }
+    if (dfAttributes & DF_HAS_USES) {
+      if (dfAttributes & DF_UA) {
+        handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vA);
+      } else if (dfAttributes & DF_UA_WIDE) {
+        handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vA);
+        handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vA+1);
+      }
+      if (dfAttributes & DF_UB) {
+        handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vB);
+      } else if (dfAttributes & DF_UB_WIDE) {
+        handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vB);
+        handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vB+1);
+      }
+      if (dfAttributes & DF_UC) {
+        handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vC);
+      } else if (dfAttributes & DF_UC_WIDE) {
+        handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vC);
+        handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vC+1);
+      }
     }
-    return true;
+    if (dfAttributes & DF_FORMAT_35C) {
+      for (unsigned int i = 0; i < dInsn->vA; i++) {
+        handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->arg[i]);
+      }
+    }
+    if (dfAttributes & DF_FORMAT_3RC) {
+      for (unsigned int i = 0; i < dInsn->vA; i++) {
+        handleLiveInUse(cUnit, useV, defV, liveInV, dInsn->vC+i);
+      }
+    }
+    if (dfAttributes & DF_HAS_DEFS) {
+      handleDef(cUnit, defV, dInsn->vA);
+      if (dfAttributes & DF_DA_WIDE) {
+        handleDef(cUnit, defV, dInsn->vA+1);
+      }
+    }
+  }
+  return true;
 }
 
 int addNewSReg(CompilationUnit* cUnit, int vReg)
 {
-    // Compiler temps always have a subscript of 0
-    int subscript = (vReg < 0) ? 0 : ++cUnit->SSALastDefs[vReg];
-    int ssaReg = cUnit->numSSARegs++;
-    oatInsertGrowableList(cUnit, cUnit->ssaBaseVRegs, vReg);
-    oatInsertGrowableList(cUnit, cUnit->ssaSubscripts, subscript);
-    DCHECK_EQ(cUnit->ssaBaseVRegs->numUsed, cUnit->ssaSubscripts->numUsed);
-    return ssaReg;
+  // Compiler temps always have a subscript of 0
+  int subscript = (vReg < 0) ? 0 : ++cUnit->SSALastDefs[vReg];
+  int ssaReg = cUnit->numSSARegs++;
+  oatInsertGrowableList(cUnit, cUnit->ssaBaseVRegs, vReg);
+  oatInsertGrowableList(cUnit, cUnit->ssaSubscripts, subscript);
+  DCHECK_EQ(cUnit->ssaBaseVRegs->numUsed, cUnit->ssaSubscripts->numUsed);
+  return ssaReg;
 }
 
 /* Find out the latest SSA register for a given Dalvik register */
 void handleSSAUse(CompilationUnit* cUnit, int* uses, int dalvikReg,
                   int regIndex)
 {
-    DCHECK((dalvikReg >= 0) && (dalvikReg < cUnit->numDalvikRegisters));
-    uses[regIndex] = cUnit->vRegToSSAMap[dalvikReg];
+  DCHECK((dalvikReg >= 0) && (dalvikReg < cUnit->numDalvikRegisters));
+  uses[regIndex] = cUnit->vRegToSSAMap[dalvikReg];
 }
 
 /* Setup a new SSA register for a given Dalvik register */
 void handleSSADef(CompilationUnit* cUnit, int* defs, int dalvikReg,
                   int regIndex)
 {
-    DCHECK((dalvikReg >= 0) && (dalvikReg < cUnit->numDalvikRegisters));
-    int ssaReg = addNewSReg(cUnit, dalvikReg);
-    cUnit->vRegToSSAMap[dalvikReg] = ssaReg;
-    defs[regIndex] = ssaReg;
+  DCHECK((dalvikReg >= 0) && (dalvikReg < cUnit->numDalvikRegisters));
+  int ssaReg = addNewSReg(cUnit, dalvikReg);
+  cUnit->vRegToSSAMap[dalvikReg] = ssaReg;
+  defs[regIndex] = ssaReg;
 }
 
 /* Look up new SSA names for format_35c instructions */
 void dataFlowSSAFormat35C(CompilationUnit* cUnit, MIR* mir)
 {
-    DecodedInstruction *dInsn = &mir->dalvikInsn;
-    int numUses = dInsn->vA;
-    int i;
+  DecodedInstruction *dInsn = &mir->dalvikInsn;
+  int numUses = dInsn->vA;
+  int i;
 
-    mir->ssaRep->numUses = numUses;
-    mir->ssaRep->uses = (int *)oatNew(cUnit, sizeof(int) * numUses, true,
+  mir->ssaRep->numUses = numUses;
+  mir->ssaRep->uses = (int *)oatNew(cUnit, sizeof(int) * numUses, true,
+                                    kAllocDFInfo);
+  // NOTE: will be filled in during type & size inference pass
+  mir->ssaRep->fpUse = (bool *)oatNew(cUnit, sizeof(bool) * numUses, true,
                                       kAllocDFInfo);
-    // NOTE: will be filled in during type & size inference pass
-    mir->ssaRep->fpUse = (bool *)oatNew(cUnit, sizeof(bool) * numUses, true,
-                                        kAllocDFInfo);
 
-    for (i = 0; i < numUses; i++) {
-        handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->arg[i], i);
-    }
+  for (i = 0; i < numUses; i++) {
+    handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->arg[i], i);
+  }
 }
 
 /* Look up new SSA names for format_3rc instructions */
 void dataFlowSSAFormat3RC(CompilationUnit* cUnit, MIR* mir)
 {
-    DecodedInstruction *dInsn = &mir->dalvikInsn;
-    int numUses = dInsn->vA;
-    int i;
+  DecodedInstruction *dInsn = &mir->dalvikInsn;
+  int numUses = dInsn->vA;
+  int i;
 
-    mir->ssaRep->numUses = numUses;
-    mir->ssaRep->uses = (int *)oatNew(cUnit, sizeof(int) * numUses, true,
+  mir->ssaRep->numUses = numUses;
+  mir->ssaRep->uses = (int *)oatNew(cUnit, sizeof(int) * numUses, true,
+                                    kAllocDFInfo);
+  // NOTE: will be filled in during type & size inference pass
+  mir->ssaRep->fpUse = (bool *)oatNew(cUnit, sizeof(bool) * numUses, true,
                                       kAllocDFInfo);
-    // NOTE: will be filled in during type & size inference pass
-    mir->ssaRep->fpUse = (bool *)oatNew(cUnit, sizeof(bool) * numUses, true,
-                                        kAllocDFInfo);
 
-    for (i = 0; i < numUses; i++) {
-        handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vC+i, i);
-    }
+  for (i = 0; i < numUses; i++) {
+    handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vC+i, i);
+  }
 }
 
 /* Entry function to convert a block into SSA representation */
 bool oatDoSSAConversion(CompilationUnit* cUnit, BasicBlock* bb)
 {
-    MIR* mir;
+  MIR* mir;
 
-    if (bb->dataFlowInfo == NULL) return false;
+  if (bb->dataFlowInfo == NULL) return false;
 
-    for (mir = bb->firstMIRInsn; mir; mir = mir->next) {
-        mir->ssaRep = (struct SSARepresentation *)
-            oatNew(cUnit, sizeof(SSARepresentation), true, kAllocDFInfo);
+  for (mir = bb->firstMIRInsn; mir; mir = mir->next) {
+    mir->ssaRep = (struct SSARepresentation *)
+        oatNew(cUnit, sizeof(SSARepresentation), true, kAllocDFInfo);
 
-        int dfAttributes =
-            oatDataFlowAttributes[mir->dalvikInsn.opcode];
+    int dfAttributes = oatDataFlowAttributes[mir->dalvikInsn.opcode];
 
-        // If not a pseudo-op, note non-leaf or can throw
-        if (static_cast<int>(mir->dalvikInsn.opcode) < static_cast<int>(kNumPackedOpcodes)) {
-            int flags = Instruction::Flags(mir->dalvikInsn.opcode);
+      // If not a pseudo-op, note non-leaf or can throw
+    if (static_cast<int>(mir->dalvikInsn.opcode) <
+        static_cast<int>(kNumPackedOpcodes)) {
+      int flags = Instruction::Flags(mir->dalvikInsn.opcode);
 
-            if (flags & Instruction::kThrow) {
-                cUnit->attrs &= ~METHOD_IS_THROW_FREE;
-            }
+      if (flags & Instruction::kThrow) {
+        cUnit->attrs &= ~METHOD_IS_THROW_FREE;
+      }
 
-            if (flags & Instruction::kInvoke) {
-                cUnit->attrs &= ~METHOD_IS_LEAF;
-            }
-        }
-
-        int numUses = 0;
-
-        if (dfAttributes & DF_FORMAT_35C) {
-            dataFlowSSAFormat35C(cUnit, mir);
-            continue;
-        }
-
-        if (dfAttributes & DF_FORMAT_3RC) {
-            dataFlowSSAFormat3RC(cUnit, mir);
-            continue;
-        }
-
-        if (dfAttributes & DF_HAS_USES) {
-            if (dfAttributes & DF_UA) {
-                numUses++;
-            } else if (dfAttributes & DF_UA_WIDE) {
-                numUses += 2;
-            }
-            if (dfAttributes & DF_UB) {
-                numUses++;
-            } else if (dfAttributes & DF_UB_WIDE) {
-                numUses += 2;
-            }
-            if (dfAttributes & DF_UC) {
-                numUses++;
-            } else if (dfAttributes & DF_UC_WIDE) {
-                numUses += 2;
-            }
-        }
-
-        if (numUses) {
-            mir->ssaRep->numUses = numUses;
-            mir->ssaRep->uses = (int *)oatNew(cUnit, sizeof(int) * numUses,
-                                              false, kAllocDFInfo);
-            mir->ssaRep->fpUse = (bool *)oatNew(cUnit, sizeof(bool) * numUses,
-                                                false, kAllocDFInfo);
-        }
-
-        int numDefs = 0;
-
-        if (dfAttributes & DF_HAS_DEFS) {
-            numDefs++;
-            if (dfAttributes & DF_DA_WIDE) {
-                numDefs++;
-            }
-        }
-
-        if (numDefs) {
-            mir->ssaRep->numDefs = numDefs;
-            mir->ssaRep->defs = (int *)oatNew(cUnit, sizeof(int) * numDefs,
-                                              false, kAllocDFInfo);
-            mir->ssaRep->fpDef = (bool *)oatNew(cUnit, sizeof(bool) * numDefs,
-                                                false, kAllocDFInfo);
-        }
-
-        DecodedInstruction *dInsn = &mir->dalvikInsn;
-
-        if (dfAttributes & DF_HAS_USES) {
-            numUses = 0;
-            if (dfAttributes & DF_UA) {
-                mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_A;
-                handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vA, numUses++);
-            } else if (dfAttributes & DF_UA_WIDE) {
-                mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_A;
-                handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vA, numUses++);
-                mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_A;
-                handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vA+1, numUses++);
-            }
-            if (dfAttributes & DF_UB) {
-                mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_B;
-                handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vB, numUses++);
-            } else if (dfAttributes & DF_UB_WIDE) {
-                mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_B;
-                handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vB, numUses++);
-                mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_B;
-                handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vB+1, numUses++);
-            }
-            if (dfAttributes & DF_UC) {
-                mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_C;
-                handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vC, numUses++);
-            } else if (dfAttributes & DF_UC_WIDE) {
-                mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_C;
-                handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vC, numUses++);
-                mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_C;
-                handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vC+1, numUses++);
-            }
-        }
-        if (dfAttributes & DF_HAS_DEFS) {
-            mir->ssaRep->fpDef[0] = dfAttributes & DF_FP_A;
-            handleSSADef(cUnit, mir->ssaRep->defs, dInsn->vA, 0);
-            if (dfAttributes & DF_DA_WIDE) {
-                mir->ssaRep->fpDef[1] = dfAttributes & DF_FP_A;
-                handleSSADef(cUnit, mir->ssaRep->defs, dInsn->vA+1, 1);
-            }
-        }
+      if (flags & Instruction::kInvoke) {
+        cUnit->attrs &= ~METHOD_IS_LEAF;
+      }
     }
 
-    if (!cUnit->disableDataflow) {
-        /*
-         * Take a snapshot of Dalvik->SSA mapping at the end of each block. The
-         * input to PHI nodes can be derived from the snapshot of all
-         * predecessor blocks.
-         */
-        bb->dataFlowInfo->vRegToSSAMap =
-            (int *)oatNew(cUnit, sizeof(int) * cUnit->numDalvikRegisters, false,
-                          kAllocDFInfo);
+    int numUses = 0;
 
-        memcpy(bb->dataFlowInfo->vRegToSSAMap, cUnit->vRegToSSAMap,
-               sizeof(int) * cUnit->numDalvikRegisters);
+    if (dfAttributes & DF_FORMAT_35C) {
+      dataFlowSSAFormat35C(cUnit, mir);
+      continue;
     }
-    return true;
+
+    if (dfAttributes & DF_FORMAT_3RC) {
+      dataFlowSSAFormat3RC(cUnit, mir);
+      continue;
+    }
+
+    if (dfAttributes & DF_HAS_USES) {
+      if (dfAttributes & DF_UA) {
+        numUses++;
+      } else if (dfAttributes & DF_UA_WIDE) {
+        numUses += 2;
+      }
+      if (dfAttributes & DF_UB) {
+        numUses++;
+      } else if (dfAttributes & DF_UB_WIDE) {
+        numUses += 2;
+      }
+      if (dfAttributes & DF_UC) {
+        numUses++;
+      } else if (dfAttributes & DF_UC_WIDE) {
+        numUses += 2;
+      }
+    }
+
+    if (numUses) {
+      mir->ssaRep->numUses = numUses;
+      mir->ssaRep->uses = (int *)oatNew(cUnit, sizeof(int) * numUses,
+                                        false, kAllocDFInfo);
+      mir->ssaRep->fpUse = (bool *)oatNew(cUnit, sizeof(bool) * numUses,
+                                          false, kAllocDFInfo);
+    }
+
+    int numDefs = 0;
+
+    if (dfAttributes & DF_HAS_DEFS) {
+      numDefs++;
+      if (dfAttributes & DF_DA_WIDE) {
+        numDefs++;
+      }
+    }
+
+    if (numDefs) {
+      mir->ssaRep->numDefs = numDefs;
+      mir->ssaRep->defs = (int *)oatNew(cUnit, sizeof(int) * numDefs,
+                                        false, kAllocDFInfo);
+      mir->ssaRep->fpDef = (bool *)oatNew(cUnit, sizeof(bool) * numDefs,
+                                          false, kAllocDFInfo);
+    }
+
+    DecodedInstruction *dInsn = &mir->dalvikInsn;
+
+    if (dfAttributes & DF_HAS_USES) {
+      numUses = 0;
+      if (dfAttributes & DF_UA) {
+        mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_A;
+        handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vA, numUses++);
+      } else if (dfAttributes & DF_UA_WIDE) {
+        mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_A;
+        handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vA, numUses++);
+        mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_A;
+        handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vA+1, numUses++);
+      }
+      if (dfAttributes & DF_UB) {
+        mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_B;
+        handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vB, numUses++);
+      } else if (dfAttributes & DF_UB_WIDE) {
+        mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_B;
+        handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vB, numUses++);
+        mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_B;
+        handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vB+1, numUses++);
+      }
+      if (dfAttributes & DF_UC) {
+        mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_C;
+        handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vC, numUses++);
+      } else if (dfAttributes & DF_UC_WIDE) {
+        mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_C;
+        handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vC, numUses++);
+        mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_C;
+        handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vC+1, numUses++);
+      }
+    }
+    if (dfAttributes & DF_HAS_DEFS) {
+      mir->ssaRep->fpDef[0] = dfAttributes & DF_FP_A;
+      handleSSADef(cUnit, mir->ssaRep->defs, dInsn->vA, 0);
+      if (dfAttributes & DF_DA_WIDE) {
+        mir->ssaRep->fpDef[1] = dfAttributes & DF_FP_A;
+        handleSSADef(cUnit, mir->ssaRep->defs, dInsn->vA+1, 1);
+      }
+    }
+  }
+
+  if (!cUnit->disableDataflow) {
+    /*
+     * Take a snapshot of Dalvik->SSA mapping at the end of each block. The
+     * input to PHI nodes can be derived from the snapshot of all
+     * predecessor blocks.
+     */
+    bb->dataFlowInfo->vRegToSSAMap =
+        (int *)oatNew(cUnit, sizeof(int) * cUnit->numDalvikRegisters, false,
+                      kAllocDFInfo);
+
+    memcpy(bb->dataFlowInfo->vRegToSSAMap, cUnit->vRegToSSAMap,
+           sizeof(int) * cUnit->numDalvikRegisters);
+  }
+  return true;
 }
 
 /* Setup a constant value for opcodes thare have the DF_SETS_CONST attribute */
 void setConstant(CompilationUnit* cUnit, int ssaReg, int value)
 {
-    oatSetBit(cUnit, cUnit->isConstantV, ssaReg);
-    cUnit->constantValues[ssaReg] = value;
+  oatSetBit(cUnit, cUnit->isConstantV, ssaReg);
+  cUnit->constantValues[ssaReg] = value;
 }
 
 bool oatDoConstantPropagation(CompilationUnit* cUnit, BasicBlock* bb)
 {
-    MIR* mir;
-    ArenaBitVector *isConstantV = cUnit->isConstantV;
+  MIR* mir;
+  ArenaBitVector *isConstantV = cUnit->isConstantV;
 
-    for (mir = bb->firstMIRInsn; mir; mir = mir->next) {
-        int dfAttributes =
-            oatDataFlowAttributes[mir->dalvikInsn.opcode];
+  for (mir = bb->firstMIRInsn; mir; mir = mir->next) {
+    int dfAttributes = oatDataFlowAttributes[mir->dalvikInsn.opcode];
 
-        DecodedInstruction *dInsn = &mir->dalvikInsn;
+    DecodedInstruction *dInsn = &mir->dalvikInsn;
 
-        if (!(dfAttributes & DF_HAS_DEFS)) continue;
+    if (!(dfAttributes & DF_HAS_DEFS)) continue;
 
-        /* Handle instructions that set up constants directly */
-        if (dfAttributes & DF_SETS_CONST) {
-            if (dfAttributes & DF_DA) {
-                switch (dInsn->opcode) {
-                    case Instruction::CONST_4:
-                    case Instruction::CONST_16:
-                    case Instruction::CONST:
-                        setConstant(cUnit, mir->ssaRep->defs[0], dInsn->vB);
-                        break;
-                    case Instruction::CONST_HIGH16:
-                        setConstant(cUnit, mir->ssaRep->defs[0],
-                                    dInsn->vB << 16);
-                        break;
-                    default:
-                        break;
-                }
-            } else if (dfAttributes & DF_DA_WIDE) {
-                switch (dInsn->opcode) {
-                    case Instruction::CONST_WIDE_16:
-                    case Instruction::CONST_WIDE_32:
-                        setConstant(cUnit, mir->ssaRep->defs[0], dInsn->vB);
-                        setConstant(cUnit, mir->ssaRep->defs[1], 0);
-                        break;
-                    case Instruction::CONST_WIDE:
-                        setConstant(cUnit, mir->ssaRep->defs[0],
-                                    (int) dInsn->vB_wide);
-                        setConstant(cUnit, mir->ssaRep->defs[1],
-                                    (int) (dInsn->vB_wide >> 32));
-                        break;
-                    case Instruction::CONST_WIDE_HIGH16:
-                        setConstant(cUnit, mir->ssaRep->defs[0], 0);
-                        setConstant(cUnit, mir->ssaRep->defs[1],
-                                    dInsn->vB << 16);
-                        break;
-                    default:
-                        break;
-                }
+    /* Handle instructions that set up constants directly */
+    if (dfAttributes & DF_SETS_CONST) {
+      if (dfAttributes & DF_DA) {
+        switch (dInsn->opcode) {
+          case Instruction::CONST_4:
+          case Instruction::CONST_16:
+          case Instruction::CONST:
+            setConstant(cUnit, mir->ssaRep->defs[0], dInsn->vB);
+            break;
+          case Instruction::CONST_HIGH16:
+            setConstant(cUnit, mir->ssaRep->defs[0], dInsn->vB << 16);
+            break;
+          default:
+            break;
+              }
+          } else if (dfAttributes & DF_DA_WIDE) {
+            switch (dInsn->opcode) {
+              case Instruction::CONST_WIDE_16:
+              case Instruction::CONST_WIDE_32:
+                setConstant(cUnit, mir->ssaRep->defs[0], dInsn->vB);
+                setConstant(cUnit, mir->ssaRep->defs[1], 0);
+                break;
+              case Instruction::CONST_WIDE:
+                setConstant(cUnit, mir->ssaRep->defs[0], (int) dInsn->vB_wide);
+                setConstant(cUnit, mir->ssaRep->defs[1],
+                            (int) (dInsn->vB_wide >> 32));
+                break;
+              case Instruction::CONST_WIDE_HIGH16:
+                setConstant(cUnit, mir->ssaRep->defs[0], 0);
+                setConstant(cUnit, mir->ssaRep->defs[1], dInsn->vB << 16);
+                break;
+              default:
+                break;
             }
-        /* Handle instructions that set up constants directly */
-        } else if (dfAttributes & DF_IS_MOVE) {
-            int i;
+          }
+      /* Handle instructions that set up constants directly */
+      } else if (dfAttributes & DF_IS_MOVE) {
+        int i;
 
-            for (i = 0; i < mir->ssaRep->numUses; i++) {
-                if (!oatIsBitSet(isConstantV, mir->ssaRep->uses[i])) break;
-            }
-            /* Move a register holding a constant to another register */
-            if (i == mir->ssaRep->numUses) {
-                setConstant(cUnit, mir->ssaRep->defs[0],
-                            cUnit->constantValues[mir->ssaRep->uses[0]]);
-                if (dfAttributes & DF_DA_WIDE) {
-                    setConstant(cUnit, mir->ssaRep->defs[1],
-                                cUnit->constantValues[mir->ssaRep->uses[1]]);
-                }
-            }
+        for (i = 0; i < mir->ssaRep->numUses; i++) {
+          if (!oatIsBitSet(isConstantV, mir->ssaRep->uses[i])) break;
+      }
+      /* Move a register holding a constant to another register */
+      if (i == mir->ssaRep->numUses) {
+        setConstant(cUnit, mir->ssaRep->defs[0],
+                    cUnit->constantValues[mir->ssaRep->uses[0]]);
+        if (dfAttributes & DF_DA_WIDE) {
+          setConstant(cUnit, mir->ssaRep->defs[1],
+                      cUnit->constantValues[mir->ssaRep->uses[1]]);
         }
+      }
     }
-    /* TODO: implement code to handle arithmetic operations */
-    return true;
+  }
+  /* TODO: implement code to handle arithmetic operations */
+  return true;
 }
 
 /* Setup the basic data structures for SSA conversion */
 void oatInitializeSSAConversion(CompilationUnit* cUnit)
 {
-    int i;
-    int numDalvikReg = cUnit->numDalvikRegisters;
+  int i;
+  int numDalvikReg = cUnit->numDalvikRegisters;
 
-    cUnit->ssaBaseVRegs = (GrowableList *)oatNew(cUnit, sizeof(GrowableList),
-                                                 false, kAllocDFInfo);
-    cUnit->ssaSubscripts = (GrowableList *)oatNew(cUnit, sizeof(GrowableList),
-                                                  false, kAllocDFInfo);
-    // Create the ssa mappings, estimating the max size
-    oatInitGrowableList(cUnit, cUnit->ssaBaseVRegs,
-                        numDalvikReg + cUnit->defCount + 128,
-                        kListSSAtoDalvikMap);
-    oatInitGrowableList(cUnit, cUnit->ssaSubscripts,
-                        numDalvikReg + cUnit->defCount + 128,
-                        kListSSAtoDalvikMap);
-    /*
-     * Initial number of SSA registers is equal to the number of Dalvik
-     * registers.
-     */
-    cUnit->numSSARegs = numDalvikReg;
+  cUnit->ssaBaseVRegs = (GrowableList *)oatNew(cUnit, sizeof(GrowableList),
+                                               false, kAllocDFInfo);
+  cUnit->ssaSubscripts = (GrowableList *)oatNew(cUnit, sizeof(GrowableList),
+                                                false, kAllocDFInfo);
+  // Create the ssa mappings, estimating the max size
+  oatInitGrowableList(cUnit, cUnit->ssaBaseVRegs,
+                      numDalvikReg + cUnit->defCount + 128,
+                      kListSSAtoDalvikMap);
+  oatInitGrowableList(cUnit, cUnit->ssaSubscripts,
+                      numDalvikReg + cUnit->defCount + 128,
+                      kListSSAtoDalvikMap);
+  /*
+   * Initial number of SSA registers is equal to the number of Dalvik
+   * registers.
+   */
+  cUnit->numSSARegs = numDalvikReg;
 
-    /*
-     * Initialize the SSA2Dalvik map list. For the first numDalvikReg elements,
-     * the subscript is 0 so we use the ENCODE_REG_SUB macro to encode the value
-     * into "(0 << 16) | i"
-     */
-    for (i = 0; i < numDalvikReg; i++) {
-        oatInsertGrowableList(cUnit, cUnit->ssaBaseVRegs, i);
-        oatInsertGrowableList(cUnit, cUnit->ssaSubscripts, 0);
-    }
+  /*
+   * Initialize the SSA2Dalvik map list. For the first numDalvikReg elements,
+   * the subscript is 0 so we use the ENCODE_REG_SUB macro to encode the value
+   * into "(0 << 16) | i"
+   */
+  for (i = 0; i < numDalvikReg; i++) {
+    oatInsertGrowableList(cUnit, cUnit->ssaBaseVRegs, i);
+    oatInsertGrowableList(cUnit, cUnit->ssaSubscripts, 0);
+  }
 
-    /*
-     * Initialize the DalvikToSSAMap map. There is one entry for each
-     * Dalvik register, and the SSA names for those are the same.
-     */
-    cUnit->vRegToSSAMap = (int *)oatNew(cUnit, sizeof(int) * numDalvikReg,
-                                          false, kAllocDFInfo);
-    /* Keep track of the higest def for each dalvik reg */
-    cUnit->SSALastDefs = (int *)oatNew(cUnit, sizeof(int) * numDalvikReg,
-                                       false, kAllocDFInfo);
+  /*
+   * Initialize the DalvikToSSAMap map. There is one entry for each
+   * Dalvik register, and the SSA names for those are the same.
+   */
+  cUnit->vRegToSSAMap = (int *)oatNew(cUnit, sizeof(int) * numDalvikReg,
+                                      false, kAllocDFInfo);
+  /* Keep track of the higest def for each dalvik reg */
+  cUnit->SSALastDefs = (int *)oatNew(cUnit, sizeof(int) * numDalvikReg,
+                                     false, kAllocDFInfo);
 
-    for (i = 0; i < numDalvikReg; i++) {
-        cUnit->vRegToSSAMap[i] = i;
-        cUnit->SSALastDefs[i] = 0;
-    }
+  for (i = 0; i < numDalvikReg; i++) {
+    cUnit->vRegToSSAMap[i] = i;
+    cUnit->SSALastDefs[i] = 0;
+  }
 
-    /* Add ssa reg for Method* */
-    cUnit->methodSReg = addNewSReg(cUnit, SSA_METHOD_BASEREG);
+  /* Add ssa reg for Method* */
+  cUnit->methodSReg = addNewSReg(cUnit, SSA_METHOD_BASEREG);
 
-    /*
-     * Allocate the BasicBlockDataFlow structure for the entry and code blocks
-     */
-    GrowableListIterator iterator;
+  /*
+   * Allocate the BasicBlockDataFlow structure for the entry and code blocks
+   */
+  GrowableListIterator iterator;
 
-    oatGrowableListIteratorInit(&cUnit->blockList, &iterator);
+  oatGrowableListIteratorInit(&cUnit->blockList, &iterator);
 
-    while (true) {
-        BasicBlock* bb = (BasicBlock *) oatGrowableListIteratorNext(&iterator);
-        if (bb == NULL) break;
-        if (bb->hidden == true) continue;
-        if (bb->blockType == kDalvikByteCode ||
-            bb->blockType == kEntryBlock ||
-            bb->blockType == kExitBlock) {
-            bb->dataFlowInfo = (BasicBlockDataFlow *)
-                oatNew(cUnit, sizeof(BasicBlockDataFlow),
-                       true, kAllocDFInfo);
-        }
-    }
+  while (true) {
+    BasicBlock* bb = (BasicBlock *) oatGrowableListIteratorNext(&iterator);
+    if (bb == NULL) break;
+    if (bb->hidden == true) continue;
+    if (bb->blockType == kDalvikByteCode ||
+      bb->blockType == kEntryBlock ||
+      bb->blockType == kExitBlock) {
+      bb->dataFlowInfo = (BasicBlockDataFlow *)
+          oatNew(cUnit, sizeof(BasicBlockDataFlow), true, kAllocDFInfo);
+      }
+  }
 }
 
 /* Clear the visited flag for each BB */
 bool oatClearVisitedFlag(struct CompilationUnit* cUnit, struct BasicBlock* bb)
 {
-    bb->visited = false;
-    return true;
+  bb->visited = false;
+  return true;
 }
 
 void oatDataFlowAnalysisDispatcher(CompilationUnit* cUnit,
-                bool (*func)(CompilationUnit*, BasicBlock*),
-                DataFlowAnalysisMode dfaMode,
-                bool isIterative)
+                                   bool (*func)(CompilationUnit*, BasicBlock*),
+                                   DataFlowAnalysisMode dfaMode,
+                                   bool isIterative)
 {
-    bool change = true;
+  bool change = true;
 
-    while (change) {
-        change = false;
+  while (change) {
+    change = false;
 
-        switch (dfaMode) {
-        /* Scan all blocks and perform the operations specified in func */
-        case kAllNodes:
-            {
-                GrowableListIterator iterator;
-                oatGrowableListIteratorInit(&cUnit->blockList, &iterator);
-                while (true) {
-                    BasicBlock* bb =
-                        (BasicBlock *) oatGrowableListIteratorNext(&iterator);
-                    if (bb == NULL) break;
-                    if (bb->hidden == true) continue;
-                    change |= (*func)(cUnit, bb);
-                }
-            }
-            break;
-        /* Scan reachable blocks and perform the ops specified in func. */
-        case kReachableNodes:
-            {
-                int numReachableBlocks = cUnit->numReachableBlocks;
-                int idx;
-                const GrowableList *blockList = &cUnit->blockList;
-
-                for (idx = 0; idx < numReachableBlocks; idx++) {
-                    int blockIdx = cUnit->dfsOrder.elemList[idx];
-                    BasicBlock* bb =
-                        (BasicBlock *) oatGrowableListGetElement(blockList,
-                                                                 blockIdx);
-                    change |= (*func)(cUnit, bb);
-                }
-            }
-            break;
-
-        /* Scan reachable blocks by pre-order dfs and invoke func on each. */
-        case kPreOrderDFSTraversal:
-            {
-                int numReachableBlocks = cUnit->numReachableBlocks;
-                int idx;
-                const GrowableList *blockList = &cUnit->blockList;
-
-                for (idx = 0; idx < numReachableBlocks; idx++) {
-                    int dfsIdx = cUnit->dfsOrder.elemList[idx];
-                    BasicBlock* bb =
-                        (BasicBlock *) oatGrowableListGetElement(blockList,
-                                                                 dfsIdx);
-                    change |= (*func)(cUnit, bb);
-                }
-            }
-            break;
-        /* Scan reachable blocks post-order dfs and invoke func on each. */
-        case kPostOrderDFSTraversal:
-            {
-                int numReachableBlocks = cUnit->numReachableBlocks;
-                int idx;
-                const GrowableList *blockList = &cUnit->blockList;
-
-                for (idx = numReachableBlocks - 1; idx >= 0; idx--) {
-                    int dfsIdx = cUnit->dfsOrder.elemList[idx];
-                    BasicBlock* bb =
-                        (BasicBlock *) oatGrowableListGetElement(blockList,
-                                                                 dfsIdx);
-                    change |= (*func)(cUnit, bb);
-                }
-            }
-            break;
-        /* Scan reachable post-order dom tree and invoke func on each. */
-        case kPostOrderDOMTraversal:
-            {
-                int numReachableBlocks = cUnit->numReachableBlocks;
-                int idx;
-                const GrowableList *blockList = &cUnit->blockList;
-
-                for (idx = 0; idx < numReachableBlocks; idx++) {
-                    int domIdx = cUnit->domPostOrderTraversal.elemList[idx];
-                    BasicBlock* bb =
-                        (BasicBlock *) oatGrowableListGetElement(blockList,
-                                                                 domIdx);
-                    change |= (*func)(cUnit, bb);
-                }
-            }
-            break;
-        /* Scan reachable blocks reverse post-order dfs, invoke func on each */
-        case kReversePostOrderTraversal:
-            {
-                int numReachableBlocks = cUnit->numReachableBlocks;
-                int idx;
-                const GrowableList *blockList = &cUnit->blockList;
-
-                for (idx = numReachableBlocks - 1; idx >= 0; idx--) {
-                    int revIdx = cUnit->dfsPostOrder.elemList[idx];
-                    BasicBlock* bb =
-                        (BasicBlock *) oatGrowableListGetElement(blockList,
-                                                                 revIdx);
-                    change |= (*func)(cUnit, bb);
-                }
-            }
-            break;
-        default:
-            LOG(FATAL) << "Unknown traversal mode " << (int)dfaMode;
+    switch (dfaMode) {
+      /* Scan all blocks and perform the operations specified in func */
+      case kAllNodes:
+        {
+          GrowableListIterator iterator;
+          oatGrowableListIteratorInit(&cUnit->blockList, &iterator);
+          while (true) {
+            BasicBlock* bb =
+                (BasicBlock *) oatGrowableListIteratorNext(&iterator);
+            if (bb == NULL) break;
+            if (bb->hidden == true) continue;
+              change |= (*func)(cUnit, bb);
+          }
         }
-        /* If isIterative is false, exit the loop after the first iteration */
-        change &= isIterative;
+        break;
+      /* Scan reachable blocks and perform the ops specified in func. */
+      case kReachableNodes:
+        {
+          int numReachableBlocks = cUnit->numReachableBlocks;
+          int idx;
+          const GrowableList *blockList = &cUnit->blockList;
+
+          for (idx = 0; idx < numReachableBlocks; idx++) {
+            int blockIdx = cUnit->dfsOrder.elemList[idx];
+            BasicBlock* bb = (BasicBlock *)
+                oatGrowableListGetElement(blockList, blockIdx);
+            change |= (*func)(cUnit, bb);
+          }
+        }
+        break;
+
+      /* Scan reachable blocks by pre-order dfs and invoke func on each. */
+      case kPreOrderDFSTraversal:
+        {
+          int numReachableBlocks = cUnit->numReachableBlocks;
+          int idx;
+          const GrowableList *blockList = &cUnit->blockList;
+
+          for (idx = 0; idx < numReachableBlocks; idx++) {
+            int dfsIdx = cUnit->dfsOrder.elemList[idx];
+            BasicBlock* bb = (BasicBlock *)
+                oatGrowableListGetElement(blockList, dfsIdx);
+            change |= (*func)(cUnit, bb);
+            }
+        }
+        break;
+      /* Scan reachable blocks post-order dfs and invoke func on each. */
+      case kPostOrderDFSTraversal:
+        {
+          int numReachableBlocks = cUnit->numReachableBlocks;
+          int idx;
+          const GrowableList *blockList = &cUnit->blockList;
+
+          for (idx = numReachableBlocks - 1; idx >= 0; idx--) {
+            int dfsIdx = cUnit->dfsOrder.elemList[idx];
+            BasicBlock* bb = (BasicBlock *)
+                oatGrowableListGetElement(blockList, dfsIdx);
+            change |= (*func)(cUnit, bb);
+            }
+        }
+        break;
+      /* Scan reachable post-order dom tree and invoke func on each. */
+      case kPostOrderDOMTraversal:
+        {
+          int numReachableBlocks = cUnit->numReachableBlocks;
+          int idx;
+          const GrowableList *blockList = &cUnit->blockList;
+
+          for (idx = 0; idx < numReachableBlocks; idx++) {
+            int domIdx = cUnit->domPostOrderTraversal.elemList[idx];
+            BasicBlock* bb = (BasicBlock *)
+                oatGrowableListGetElement(blockList, domIdx);
+            change |= (*func)(cUnit, bb);
+          }
+        }
+        break;
+      /* Scan reachable blocks reverse post-order dfs, invoke func on each */
+      case kReversePostOrderTraversal:
+        {
+          int numReachableBlocks = cUnit->numReachableBlocks;
+          int idx;
+          const GrowableList *blockList = &cUnit->blockList;
+
+          for (idx = numReachableBlocks - 1; idx >= 0; idx--) {
+            int revIdx = cUnit->dfsPostOrder.elemList[idx];
+            BasicBlock* bb = (BasicBlock *)
+                oatGrowableListGetElement(blockList, revIdx);
+            change |= (*func)(cUnit, bb);
+            }
+        }
+        break;
+      default:
+        LOG(FATAL) << "Unknown traversal mode " << (int)dfaMode;
     }
+    /* If isIterative is false, exit the loop after the first iteration */
+    change &= isIterative;
+  }
 }
 
 /* Advance to next strictly dominated MIR node in an extended basic block */
-MIR* advanceMIR(CompilationUnit* cUnit, BasicBlock** pBb, MIR* mir, ArenaBitVector* bv,
-                bool clearMark) {
-    BasicBlock* bb = *pBb;
-    if (mir != NULL) {
-        mir = mir->next;
-        if (mir == NULL) {
-            bb = bb->fallThrough;
-            if ((bb == NULL) || bb->predecessors->numUsed != 1) {
-                mir = NULL;
-            } else {
-                if (bv) {
-                    oatSetBit(cUnit, bv, bb->id);
-                }
-                *pBb = bb;
-                mir = bb->firstMIRInsn;
-            }
+MIR* advanceMIR(CompilationUnit* cUnit, BasicBlock** pBb, MIR* mir,
+                ArenaBitVector* bv, bool clearMark) {
+  BasicBlock* bb = *pBb;
+  if (mir != NULL) {
+    mir = mir->next;
+    if (mir == NULL) {
+      bb = bb->fallThrough;
+      if ((bb == NULL) || bb->predecessors->numUsed != 1) {
+        mir = NULL;
+      } else {
+        if (bv) {
+          oatSetBit(cUnit, bv, bb->id);
         }
+      *pBb = bb;
+      mir = bb->firstMIRInsn;
+      }
     }
-    if (mir && clearMark) {
-        mir->optimizationFlags &= ~MIR_MARK;
-    }
-    return mir;
+  }
+  if (mir && clearMark) {
+    mir->optimizationFlags &= ~MIR_MARK;
+  }
+  return mir;
 }
 
 /*
@@ -1696,563 +1680,562 @@
  * used, a move-result may not be present.
  */
 MIR* oatFindMoveResult(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir,
-                       bool wide)
+                     bool wide)
 {
-    BasicBlock* tbb = bb;
-    mir = advanceMIR(cUnit, &tbb, mir, NULL, false);
-    while (mir != NULL) {
-        if (!wide && mir->dalvikInsn.opcode == Instruction::MOVE_RESULT) {
-            break;
-        }
-        if (wide && mir->dalvikInsn.opcode == Instruction::MOVE_RESULT_WIDE) {
-            break;
-        }
-        // Keep going if pseudo op, otherwise terminate
-        if (mir->dalvikInsn.opcode < static_cast<Instruction::Code>(kNumPackedOpcodes)) {
-            mir = NULL;
-        } else {
-            mir = advanceMIR(cUnit, &tbb, mir, NULL, false);
-        }
+  BasicBlock* tbb = bb;
+  mir = advanceMIR(cUnit, &tbb, mir, NULL, false);
+  while (mir != NULL) {
+    if (!wide && mir->dalvikInsn.opcode == Instruction::MOVE_RESULT) {
+      break;
     }
-    return mir;
+    if (wide && mir->dalvikInsn.opcode == Instruction::MOVE_RESULT_WIDE) {
+      break;
+    }
+    // Keep going if pseudo op, otherwise terminate
+    if (mir->dalvikInsn.opcode <
+        static_cast<Instruction::Code>(kNumPackedOpcodes)) {
+      mir = NULL;
+    } else {
+      mir = advanceMIR(cUnit, &tbb, mir, NULL, false);
+    }
+  }
+  return mir;
 }
 
 void squashDupRangeChecks(CompilationUnit* cUnit, BasicBlock** pBp, MIR* mir,
-                          int arraySreg, int indexSreg)
+                        int arraySreg, int indexSreg)
 {
-    while (true) {
-       mir = advanceMIR(cUnit, pBp, mir, NULL, false);
-       if (!mir) {
-           break;
-       }
-       if ((mir->ssaRep == NULL) ||
-           (mir->optimizationFlags & MIR_IGNORE_RANGE_CHECK)) {
-           continue;
-       }
-       int checkArray = INVALID_SREG;
-       int checkIndex = INVALID_SREG;
-       switch (mir->dalvikInsn.opcode) {
-            case Instruction::AGET:
-            case Instruction::AGET_OBJECT:
-            case Instruction::AGET_BOOLEAN:
-            case Instruction::AGET_BYTE:
-            case Instruction::AGET_CHAR:
-            case Instruction::AGET_SHORT:
-            case Instruction::AGET_WIDE:
-                checkArray = mir->ssaRep->uses[0];
-                checkIndex = mir->ssaRep->uses[1];
-                break;
-                break;
-            case Instruction::APUT:
-            case Instruction::APUT_OBJECT:
-            case Instruction::APUT_SHORT:
-            case Instruction::APUT_CHAR:
-            case Instruction::APUT_BYTE:
-            case Instruction::APUT_BOOLEAN:
-                checkArray = mir->ssaRep->uses[1];
-                checkIndex = mir->ssaRep->uses[2];
-                break;
-            case Instruction::APUT_WIDE:
-                checkArray = mir->ssaRep->uses[2];
-                checkIndex = mir->ssaRep->uses[3];
-            default:
-                break;
-       }
-       if (checkArray == INVALID_SREG) {
-           continue;
-       }
-       if ((arraySreg == checkArray) && (indexSreg == checkIndex)) {
-           if (cUnit->printMe) {
-               LOG(INFO) << "Squashing range check @ 0x" << std::hex
-                         << mir->offset;
-           }
-           mir->optimizationFlags |= MIR_IGNORE_RANGE_CHECK;
-       }
+  while (true) {
+    mir = advanceMIR(cUnit, pBp, mir, NULL, false);
+    if (!mir) {
+      break;
     }
+    if ((mir->ssaRep == NULL) ||
+        (mir->optimizationFlags & MIR_IGNORE_RANGE_CHECK)) {
+       continue;
+    }
+    int checkArray = INVALID_SREG;
+    int checkIndex = INVALID_SREG;
+    switch (mir->dalvikInsn.opcode) {
+      case Instruction::AGET:
+      case Instruction::AGET_OBJECT:
+      case Instruction::AGET_BOOLEAN:
+      case Instruction::AGET_BYTE:
+      case Instruction::AGET_CHAR:
+      case Instruction::AGET_SHORT:
+      case Instruction::AGET_WIDE:
+        checkArray = mir->ssaRep->uses[0];
+        checkIndex = mir->ssaRep->uses[1];
+        break;
+      case Instruction::APUT:
+      case Instruction::APUT_OBJECT:
+      case Instruction::APUT_SHORT:
+      case Instruction::APUT_CHAR:
+      case Instruction::APUT_BYTE:
+      case Instruction::APUT_BOOLEAN:
+        checkArray = mir->ssaRep->uses[1];
+        checkIndex = mir->ssaRep->uses[2];
+        break;
+      case Instruction::APUT_WIDE:
+        checkArray = mir->ssaRep->uses[2];
+        checkIndex = mir->ssaRep->uses[3];
+      default:
+        break;
+    }
+    if (checkArray == INVALID_SREG) {
+      continue;
+    }
+    if ((arraySreg == checkArray) && (indexSreg == checkIndex)) {
+      if (cUnit->printMe) {
+        LOG(INFO) << "Squashing range check @ 0x" << std::hex << mir->offset;
+      }
+      mir->optimizationFlags |= MIR_IGNORE_RANGE_CHECK;
+    }
+  }
 }
 
 /* Allocate a compiler temp, return Sreg.  Reuse existing if no conflict */
 int allocCompilerTempSreg(CompilationUnit* cUnit, ArenaBitVector* bv)
 {
-    for (int i = 0; i < cUnit->numCompilerTemps; i++) {
-        CompilerTemp* ct = (CompilerTemp*)cUnit->compilerTemps.elemList[i];
-        ArenaBitVector* tBv = ct->bv;
-        if (!oatTestBitVectors(bv, tBv)) {
-            // Combine live maps and reuse existing temp
-            oatUnifyBitVectors(tBv, tBv, bv);
-            return ct->sReg;
-        }
+  for (int i = 0; i < cUnit->numCompilerTemps; i++) {
+    CompilerTemp* ct = (CompilerTemp*)cUnit->compilerTemps.elemList[i];
+    ArenaBitVector* tBv = ct->bv;
+    if (!oatTestBitVectors(bv, tBv)) {
+      // Combine live maps and reuse existing temp
+      oatUnifyBitVectors(tBv, tBv, bv);
+      return ct->sReg;
     }
+  }
 
-    // Create a new compiler temp & associated live bitmap
-    CompilerTemp* ct = (CompilerTemp*)oatNew(cUnit, sizeof(CompilerTemp),
-                                             true, kAllocMisc);
-    ArenaBitVector *nBv = oatAllocBitVector(cUnit, cUnit->numBlocks, true,
-                                            kBitMapMisc);
-    oatCopyBitVector(nBv, bv);
-    ct->bv = nBv;
-    ct->sReg = addNewSReg(cUnit, SSA_CTEMP_BASEREG - cUnit->numCompilerTemps);
-    cUnit->numCompilerTemps++;
-    oatInsertGrowableList(cUnit, &cUnit->compilerTemps, (intptr_t)ct);
-    DCHECK_EQ(cUnit->numCompilerTemps, (int)cUnit->compilerTemps.numUsed);
-    return ct->sReg;
+  // Create a new compiler temp & associated live bitmap
+  CompilerTemp* ct = (CompilerTemp*)oatNew(cUnit, sizeof(CompilerTemp),
+                                           true, kAllocMisc);
+  ArenaBitVector *nBv = oatAllocBitVector(cUnit, cUnit->numBlocks, true,
+                                          kBitMapMisc);
+  oatCopyBitVector(nBv, bv);
+  ct->bv = nBv;
+  ct->sReg = addNewSReg(cUnit, SSA_CTEMP_BASEREG - cUnit->numCompilerTemps);
+  cUnit->numCompilerTemps++;
+  oatInsertGrowableList(cUnit, &cUnit->compilerTemps, (intptr_t)ct);
+  DCHECK_EQ(cUnit->numCompilerTemps, (int)cUnit->compilerTemps.numUsed);
+  return ct->sReg;
 }
 
 /* Creata a new MIR node for a new pseudo op. */
-MIR* rawMIR(CompilationUnit* cUnit, Instruction::Code opcode, int defs, int uses)
+MIR* rawMIR(CompilationUnit* cUnit, Instruction::Code opcode, int defs,
+            int uses)
 {
-    MIR* res = (MIR*)oatNew( cUnit, sizeof(MIR), true, kAllocMIR);
-    res->ssaRep =(struct SSARepresentation *)
-            oatNew(cUnit, sizeof(SSARepresentation), true, kAllocDFInfo);
-    if (uses) {
-        res->ssaRep->numUses = uses;
-        res->ssaRep->uses = (int*)oatNew(cUnit, sizeof(int) * uses, false, kAllocDFInfo);
-    }
-    if (defs) {
-        res->ssaRep->numDefs = defs;
-        res->ssaRep->defs = (int*)oatNew(cUnit, sizeof(int) * defs, false, kAllocDFInfo);
-        res->ssaRep->fpDef = (bool*)oatNew(cUnit, sizeof(bool) * defs, true, kAllocDFInfo);
-    }
-    res->dalvikInsn.opcode = opcode;
-    return res;
+  MIR* res = (MIR*)oatNew( cUnit, sizeof(MIR), true, kAllocMIR);
+  res->ssaRep =(struct SSARepresentation *)
+      oatNew(cUnit, sizeof(SSARepresentation), true, kAllocDFInfo);
+  if (uses) {
+    res->ssaRep->numUses = uses;
+    res->ssaRep->uses = (int*)oatNew(cUnit, sizeof(int) * uses, false,
+                                     kAllocDFInfo);
+  }
+  if (defs) {
+    res->ssaRep->numDefs = defs;
+    res->ssaRep->defs = (int*)oatNew(cUnit, sizeof(int) * defs, false,
+                                     kAllocDFInfo);
+    res->ssaRep->fpDef = (bool*)oatNew(cUnit, sizeof(bool) * defs, true,
+                                       kAllocDFInfo);
+  }
+  res->dalvikInsn.opcode = opcode;
+  return res;
 }
 
 /* Do some MIR-level basic block optimizations */
 bool basicBlockOpt(CompilationUnit* cUnit, BasicBlock* bb)
 {
-    int numTemps = 0;
+  int numTemps = 0;
 
-    for (MIR* mir = bb->firstMIRInsn; mir; mir = mir->next) {
-        // Look for interesting opcodes, skip otherwise
-        Instruction::Code opcode = mir->dalvikInsn.opcode;
-        switch (opcode) {
-            case Instruction::AGET:
-            case Instruction::AGET_OBJECT:
-            case Instruction::AGET_BOOLEAN:
-            case Instruction::AGET_BYTE:
-            case Instruction::AGET_CHAR:
-            case Instruction::AGET_SHORT:
-            case Instruction::AGET_WIDE:
-                if (!(mir->optimizationFlags & MIR_IGNORE_RANGE_CHECK)) {
-                    int arrSreg = mir->ssaRep->uses[0];
-                    int idxSreg = mir->ssaRep->uses[1];
-                    BasicBlock* tbb = bb;
-                    squashDupRangeChecks(cUnit, &tbb, mir, arrSreg, idxSreg);
-                }
-                break;
-            case Instruction::APUT:
-            case Instruction::APUT_OBJECT:
-            case Instruction::APUT_SHORT:
-            case Instruction::APUT_CHAR:
-            case Instruction::APUT_BYTE:
-            case Instruction::APUT_BOOLEAN:
-            case Instruction::APUT_WIDE:
-                if (!(mir->optimizationFlags & MIR_IGNORE_RANGE_CHECK)) {
-                    int start = (opcode == Instruction::APUT_WIDE) ? 2 : 1;
-                    int arrSreg = mir->ssaRep->uses[start];
-                    int idxSreg = mir->ssaRep->uses[start + 1];
-                    BasicBlock* tbb = bb;
-                    squashDupRangeChecks(cUnit, &tbb, mir, arrSreg, idxSreg);
-                }
-                break;
-            case Instruction::CMPL_FLOAT:
-            case Instruction::CMPL_DOUBLE:
-            case Instruction::CMPG_FLOAT:
-            case Instruction::CMPG_DOUBLE:
-            case Instruction::CMP_LONG:
-                if (mir->next != NULL) {
-                    MIR* mirNext = mir->next;
-                    Instruction::Code brOpcode = mirNext->dalvikInsn.opcode;
-                    ConditionCode ccode = kCondNv;
-                    switch(brOpcode) {
-                        case Instruction::IF_EQZ:
-                            ccode = kCondEq;
-                            break;
-                        case Instruction::IF_NEZ:
-                            ccode = kCondNe;
-                            break;
-                        case Instruction::IF_LTZ:
-                            ccode = kCondLt;
-                            break;
-                        case Instruction::IF_GEZ:
-                            ccode = kCondGe;
-                            break;
-                        case Instruction::IF_GTZ:
-                            ccode = kCondGt;
-                            break;
-                        case Instruction::IF_LEZ:
-                            ccode = kCondLe;
-                            break;
-                        default:
-                            break;
-                    }
-                    // Make sure result of cmp is used by next insn and nowhere else
-                    if ((ccode != kCondNv) &&
-                        (mir->ssaRep->defs[0] == mirNext->ssaRep->uses[0]) &&
-                        (getSSAUseCount(cUnit, mir->ssaRep->defs[0]) == 1)) {
-                        mirNext->dalvikInsn.arg[0] = ccode;
-                        switch(opcode) {
-                            case Instruction::CMPL_FLOAT:
-                                mirNext->dalvikInsn.opcode =
-                                    static_cast<Instruction::Code>(kMirOpFusedCmplFloat);
-                                break;
-                            case Instruction::CMPL_DOUBLE:
-                                mirNext->dalvikInsn.opcode =
-                                    static_cast<Instruction::Code>(kMirOpFusedCmplDouble);
-                                break;
-                            case Instruction::CMPG_FLOAT:
-                                mirNext->dalvikInsn.opcode =
-                                    static_cast<Instruction::Code>(kMirOpFusedCmpgFloat);
-                                break;
-                            case Instruction::CMPG_DOUBLE:
-                                mirNext->dalvikInsn.opcode =
-                                    static_cast<Instruction::Code>(kMirOpFusedCmpgDouble);
-                                break;
-                            case Instruction::CMP_LONG:
-                                mirNext->dalvikInsn.opcode =
-                                    static_cast<Instruction::Code>(kMirOpFusedCmpLong);
-                                break;
-                            default: LOG(ERROR) << "Unexpected opcode: " << (int)opcode;
-                        }
-                        mir->dalvikInsn.opcode = static_cast<Instruction::Code>(kMirOpNop);
-                        mirNext->ssaRep->numUses = mir->ssaRep->numUses;
-                        mirNext->ssaRep->uses = mir->ssaRep->uses;
-                        mirNext->ssaRep->fpUse = mir->ssaRep->fpUse;
-                        mirNext->ssaRep->numDefs = 0;
-                        mir->ssaRep->numUses = 0;
-                        mir->ssaRep->numDefs = 0;
-                    }
-                }
-                break;
-            default:
-                break;
+  for (MIR* mir = bb->firstMIRInsn; mir; mir = mir->next) {
+    // Look for interesting opcodes, skip otherwise
+    Instruction::Code opcode = mir->dalvikInsn.opcode;
+    switch (opcode) {
+      case Instruction::AGET:
+      case Instruction::AGET_OBJECT:
+      case Instruction::AGET_BOOLEAN:
+      case Instruction::AGET_BYTE:
+      case Instruction::AGET_CHAR:
+      case Instruction::AGET_SHORT:
+      case Instruction::AGET_WIDE:
+        if (!(mir->optimizationFlags & MIR_IGNORE_RANGE_CHECK)) {
+          int arrSreg = mir->ssaRep->uses[0];
+          int idxSreg = mir->ssaRep->uses[1];
+          BasicBlock* tbb = bb;
+          squashDupRangeChecks(cUnit, &tbb, mir, arrSreg, idxSreg);
         }
+        break;
+      case Instruction::APUT:
+      case Instruction::APUT_OBJECT:
+      case Instruction::APUT_SHORT:
+      case Instruction::APUT_CHAR:
+      case Instruction::APUT_BYTE:
+      case Instruction::APUT_BOOLEAN:
+      case Instruction::APUT_WIDE:
+        if (!(mir->optimizationFlags & MIR_IGNORE_RANGE_CHECK)) {
+          int start = (opcode == Instruction::APUT_WIDE) ? 2 : 1;
+          int arrSreg = mir->ssaRep->uses[start];
+          int idxSreg = mir->ssaRep->uses[start + 1];
+          BasicBlock* tbb = bb;
+          squashDupRangeChecks(cUnit, &tbb, mir, arrSreg, idxSreg);
+        }
+        break;
+      case Instruction::CMPL_FLOAT:
+      case Instruction::CMPL_DOUBLE:
+      case Instruction::CMPG_FLOAT:
+      case Instruction::CMPG_DOUBLE:
+      case Instruction::CMP_LONG:
+        if (mir->next != NULL) {
+          MIR* mirNext = mir->next;
+          Instruction::Code brOpcode = mirNext->dalvikInsn.opcode;
+          ConditionCode ccode = kCondNv;
+          switch(brOpcode) {
+            case Instruction::IF_EQZ:
+              ccode = kCondEq;
+              break;
+            case Instruction::IF_NEZ:
+              ccode = kCondNe;
+              break;
+            case Instruction::IF_LTZ:
+              ccode = kCondLt;
+              break;
+            case Instruction::IF_GEZ:
+              ccode = kCondGe;
+              break;
+            case Instruction::IF_GTZ:
+              ccode = kCondGt;
+              break;
+            case Instruction::IF_LEZ:
+              ccode = kCondLe;
+              break;
+            default:
+              break;
+          }
+          // Make sure result of cmp is used by next insn and nowhere else
+          if ((ccode != kCondNv) &&
+              (mir->ssaRep->defs[0] == mirNext->ssaRep->uses[0]) &&
+              (getSSAUseCount(cUnit, mir->ssaRep->defs[0]) == 1)) {
+            mirNext->dalvikInsn.arg[0] = ccode;
+            switch(opcode) {
+              case Instruction::CMPL_FLOAT:
+                mirNext->dalvikInsn.opcode =
+                    static_cast<Instruction::Code>(kMirOpFusedCmplFloat);
+                break;
+              case Instruction::CMPL_DOUBLE:
+                mirNext->dalvikInsn.opcode =
+                    static_cast<Instruction::Code>(kMirOpFusedCmplDouble);
+                break;
+              case Instruction::CMPG_FLOAT:
+                mirNext->dalvikInsn.opcode =
+                    static_cast<Instruction::Code>(kMirOpFusedCmpgFloat);
+                break;
+              case Instruction::CMPG_DOUBLE:
+                mirNext->dalvikInsn.opcode =
+                    static_cast<Instruction::Code>(kMirOpFusedCmpgDouble);
+                break;
+              case Instruction::CMP_LONG:
+                mirNext->dalvikInsn.opcode =
+                    static_cast<Instruction::Code>(kMirOpFusedCmpLong);
+                break;
+              default: LOG(ERROR) << "Unexpected opcode: " << (int)opcode;
+            }
+            mir->dalvikInsn.opcode = static_cast<Instruction::Code>(kMirOpNop);
+            mirNext->ssaRep->numUses = mir->ssaRep->numUses;
+            mirNext->ssaRep->uses = mir->ssaRep->uses;
+            mirNext->ssaRep->fpUse = mir->ssaRep->fpUse;
+            mirNext->ssaRep->numDefs = 0;
+            mir->ssaRep->numUses = 0;
+            mir->ssaRep->numDefs = 0;
+          }
+        }
+        break;
+      default:
+        break;
     }
+  }
 
-    if (numTemps > cUnit->numCompilerTemps) {
-        cUnit->numCompilerTemps = numTemps;
-    }
-    return true;
+  if (numTemps > cUnit->numCompilerTemps) {
+    cUnit->numCompilerTemps = numTemps;
+  }
+  return true;
 }
 
 bool nullCheckEliminationInit(struct CompilationUnit* cUnit,
                               struct BasicBlock* bb)
 {
-    if (bb->dataFlowInfo == NULL) return false;
-    bb->dataFlowInfo->endingNullCheckV =
-        oatAllocBitVector(cUnit, cUnit->numSSARegs, false, kBitMapNullCheck);
-    oatClearAllBits(bb->dataFlowInfo->endingNullCheckV);
-    return true;
+  if (bb->dataFlowInfo == NULL) return false;
+  bb->dataFlowInfo->endingNullCheckV =
+      oatAllocBitVector(cUnit, cUnit->numSSARegs, false, kBitMapNullCheck);
+  oatClearAllBits(bb->dataFlowInfo->endingNullCheckV);
+  return true;
 }
 
 /* Eliminate unnecessary null checks for a basic block. */
 bool eliminateNullChecks( struct CompilationUnit* cUnit, struct BasicBlock* bb)
 {
-    if (bb->dataFlowInfo == NULL) return false;
+  if (bb->dataFlowInfo == NULL) return false;
+
+  /*
+   * Set initial state.  Be conservative with catch
+   * blocks and start with no assumptions about null check
+   * status (except for "this").
+   */
+  if ((bb->blockType == kEntryBlock) | bb->catchEntry) {
+    oatClearAllBits(cUnit->tempSSARegisterV);
+    if ((cUnit->access_flags & kAccStatic) == 0) {
+      // If non-static method, mark "this" as non-null
+      int thisReg = cUnit->numDalvikRegisters - cUnit->numIns;
+      oatSetBit(cUnit, cUnit->tempSSARegisterV, thisReg);
+    }
+  } else {
+    // Starting state is intesection of all incoming arcs
+    GrowableListIterator iter;
+    oatGrowableListIteratorInit(bb->predecessors, &iter);
+    BasicBlock* predBB = (BasicBlock*)oatGrowableListIteratorNext(&iter);
+    DCHECK(predBB != NULL);
+    oatCopyBitVector(cUnit->tempSSARegisterV,
+                     predBB->dataFlowInfo->endingNullCheckV);
+    while (true) {
+      predBB = (BasicBlock*)oatGrowableListIteratorNext(&iter);
+      if (!predBB) break;
+      if ((predBB->dataFlowInfo == NULL) ||
+          (predBB->dataFlowInfo->endingNullCheckV == NULL)) {
+        continue;
+      }
+      oatIntersectBitVectors(cUnit->tempSSARegisterV,
+                             cUnit->tempSSARegisterV,
+                             predBB->dataFlowInfo->endingNullCheckV);
+    }
+  }
+
+  // Walk through the instruction in the block, updating as necessary
+  for (MIR* mir = bb->firstMIRInsn; mir; mir = mir->next) {
+    if (mir->ssaRep == NULL) {
+        continue;
+    }
+    int dfAttributes = oatDataFlowAttributes[mir->dalvikInsn.opcode];
+
+    // Mark target of NEW* as non-null
+    if (dfAttributes & DF_NON_NULL_DST) {
+      oatSetBit(cUnit, cUnit->tempSSARegisterV, mir->ssaRep->defs[0]);
+    }
+
+    // Mark non-null returns from invoke-style NEW*
+    if (dfAttributes & DF_NON_NULL_RET) {
+      MIR* nextMir = mir->next;
+      // Next should be an MOVE_RESULT_OBJECT
+      if (nextMir &&
+          nextMir->dalvikInsn.opcode == Instruction::MOVE_RESULT_OBJECT) {
+        // Mark as null checked
+        oatSetBit(cUnit, cUnit->tempSSARegisterV, nextMir->ssaRep->defs[0]);
+      } else {
+        if (nextMir) {
+          LOG(WARNING) << "Unexpected opcode following new: "
+                       << (int)nextMir->dalvikInsn.opcode;
+        } else if (bb->fallThrough) {
+          // Look in next basic block
+          struct BasicBlock* nextBB = bb->fallThrough;
+          for (MIR* tmir = nextBB->firstMIRInsn; tmir;
+            tmir =tmir->next) {
+            if ((int)tmir->dalvikInsn.opcode >= (int)kMirOpFirst) {
+              continue;
+            }
+            // First non-pseudo should be MOVE_RESULT_OBJECT
+            if (tmir->dalvikInsn.opcode == Instruction::MOVE_RESULT_OBJECT) {
+              // Mark as null checked
+              oatSetBit(cUnit, cUnit->tempSSARegisterV, tmir->ssaRep->defs[0]);
+            } else {
+              LOG(WARNING) << "Unexpected op after new: "
+                           << (int)tmir->dalvikInsn.opcode;
+            }
+            break;
+          }
+        }
+      }
+    }
 
     /*
-     * Set initial state.  Be conservative with catch
-     * blocks and start with no assumptions about null check
-     * status (except for "this").
+     * Propagate nullcheck state on register copies (including
+     * Phi pseudo copies.  For the latter, nullcheck state is
+     * the "and" of all the Phi's operands.
      */
-    if ((bb->blockType == kEntryBlock) | bb->catchEntry) {
-        oatClearAllBits(cUnit->tempSSARegisterV);
-        if ((cUnit->access_flags & kAccStatic) == 0) {
-            // If non-static method, mark "this" as non-null
-            int thisReg = cUnit->numDalvikRegisters - cUnit->numIns;
-            oatSetBit(cUnit, cUnit->tempSSARegisterV, thisReg);
-        }
-    } else {
-        // Starting state is intesection of all incoming arcs
-        GrowableListIterator iter;
-        oatGrowableListIteratorInit(bb->predecessors, &iter);
-        BasicBlock* predBB = (BasicBlock*)oatGrowableListIteratorNext(&iter);
-        DCHECK(predBB != NULL);
-        oatCopyBitVector(cUnit->tempSSARegisterV,
-                         predBB->dataFlowInfo->endingNullCheckV);
-        while (true) {
-            predBB = (BasicBlock*)oatGrowableListIteratorNext(&iter);
-            if (!predBB) break;
-            if ((predBB->dataFlowInfo == NULL) ||
-                (predBB->dataFlowInfo->endingNullCheckV == NULL)) {
-                continue;
-            }
-            oatIntersectBitVectors(cUnit->tempSSARegisterV,
-                cUnit->tempSSARegisterV,
-                predBB->dataFlowInfo->endingNullCheckV);
-        }
+    if (dfAttributes & (DF_NULL_TRANSFER_0 | DF_NULL_TRANSFER_N)) {
+      int tgtSreg = mir->ssaRep->defs[0];
+      int operands = (dfAttributes & DF_NULL_TRANSFER_0) ? 1 :
+          mir->ssaRep->numUses;
+      bool nullChecked = true;
+      for (int i = 0; i < operands; i++) {
+        nullChecked &= oatIsBitSet(cUnit->tempSSARegisterV,
+        mir->ssaRep->uses[i]);
+      }
+      if (nullChecked) {
+        oatSetBit(cUnit, cUnit->tempSSARegisterV, tgtSreg);
+      }
     }
 
-    // Walk through the instruction in the block, updating as necessary
-    for (MIR* mir = bb->firstMIRInsn; mir; mir = mir->next) {
-        if (mir->ssaRep == NULL) {
-            continue;
+    // Already nullchecked?
+    if (dfAttributes & DF_HAS_NULL_CHKS) {
+      int srcIdx;
+      if (dfAttributes & DF_NULL_CHK_1) {
+        srcIdx = 1;
+      } else if (dfAttributes & DF_NULL_CHK_2) {
+        srcIdx = 2;
+      } else {
+        srcIdx = 0;
+      }
+      int srcSreg = mir->ssaRep->uses[srcIdx];
+        if (oatIsBitSet(cUnit->tempSSARegisterV, srcSreg)) {
+          // Eliminate the null check
+          mir->optimizationFlags |= MIR_IGNORE_NULL_CHECK;
+        } else {
+          // Mark sReg as null-checked
+          oatSetBit(cUnit, cUnit->tempSSARegisterV, srcSreg);
         }
-        int dfAttributes =
-            oatDataFlowAttributes[mir->dalvikInsn.opcode];
+     }
+  }
 
-        // Mark target of NEW* as non-null
-        if (dfAttributes & DF_NON_NULL_DST) {
-            oatSetBit(cUnit, cUnit->tempSSARegisterV, mir->ssaRep->defs[0]);
-        }
-
-        // Mark non-null returns from invoke-style NEW*
-        if (dfAttributes & DF_NON_NULL_RET) {
-            MIR* nextMir = mir->next;
-            // Next should be an MOVE_RESULT_OBJECT
-            if (nextMir && nextMir->dalvikInsn.opcode == Instruction::MOVE_RESULT_OBJECT) {
-                // Mark as null checked
-                oatSetBit(cUnit, cUnit->tempSSARegisterV,
-                          nextMir->ssaRep->defs[0]);
-            } else {
-                if (nextMir) {
-                    LOG(WARNING) << "Unexpected opcode following new: " <<
-                    (int)nextMir->dalvikInsn.opcode;
-                } else if (bb->fallThrough) {
-                    // Look in next basic block
-                    struct BasicBlock* nextBB = bb->fallThrough;
-                    for (MIR* tmir = nextBB->firstMIRInsn; tmir;
-                         tmir =tmir->next) {
-                       if ((int)tmir->dalvikInsn.opcode >= (int)kMirOpFirst) {
-                           continue;
-                       }
-                       // First non-pseudo should be MOVE_RESULT_OBJECT
-                       if (tmir->dalvikInsn.opcode == Instruction::MOVE_RESULT_OBJECT) {
-                           // Mark as null checked
-                           oatSetBit(cUnit, cUnit->tempSSARegisterV,
-                                     tmir->ssaRep->defs[0]);
-                       } else {
-                           LOG(WARNING) << "Unexpected op after new: " <<
-                               (int)tmir->dalvikInsn.opcode;
-                       }
-                       break;
-                    }
-                }
-            }
-        }
-
-        /*
-         * Propagate nullcheck state on register copies (including
-         * Phi pseudo copies.  For the latter, nullcheck state is
-         * the "and" of all the Phi's operands.
-         */
-        if (dfAttributes & (DF_NULL_TRANSFER_0 | DF_NULL_TRANSFER_N)) {
-            int tgtSreg = mir->ssaRep->defs[0];
-            int operands = (dfAttributes & DF_NULL_TRANSFER_0) ? 1 :
-                mir->ssaRep->numUses;
-            bool nullChecked = true;
-            for (int i = 0; i < operands; i++) {
-                nullChecked &= oatIsBitSet(cUnit->tempSSARegisterV,
-                    mir->ssaRep->uses[i]);
-            }
-            if (nullChecked) {
-                oatSetBit(cUnit, cUnit->tempSSARegisterV, tgtSreg);
-            }
-        }
-
-        // Already nullchecked?
-        if (dfAttributes & DF_HAS_NULL_CHKS) {
-            int srcIdx;
-            if (dfAttributes & DF_NULL_CHK_1) {
-                srcIdx = 1;
-            } else if (dfAttributes & DF_NULL_CHK_2) {
-                srcIdx = 2;
-            } else {
-                srcIdx = 0;
-            }
-            int srcSreg = mir->ssaRep->uses[srcIdx];
-            if (oatIsBitSet(cUnit->tempSSARegisterV, srcSreg)) {
-                // Eliminate the null check
-                mir->optimizationFlags |= MIR_IGNORE_NULL_CHECK;
-            } else {
-                // Mark sReg as null-checked
-                oatSetBit(cUnit, cUnit->tempSSARegisterV, srcSreg);
-            }
-        }
-    }
-
-    // Did anything change?
-    bool res = oatCompareBitVectors(bb->dataFlowInfo->endingNullCheckV,
-                                    cUnit->tempSSARegisterV);
-    if (res) {
-        oatCopyBitVector(bb->dataFlowInfo->endingNullCheckV,
-                         cUnit->tempSSARegisterV);
-    }
-    return res;
+  // Did anything change?
+  bool res = oatCompareBitVectors(bb->dataFlowInfo->endingNullCheckV,
+                                  cUnit->tempSSARegisterV);
+  if (res) {
+    oatCopyBitVector(bb->dataFlowInfo->endingNullCheckV,
+                     cUnit->tempSSARegisterV);
+  }
+  return res;
 }
 
 void oatMethodNullCheckElimination(CompilationUnit *cUnit)
 {
-    if (!(cUnit->disableOpt & (1 << kNullCheckElimination))) {
-        DCHECK(cUnit->tempSSARegisterV != NULL);
-        oatDataFlowAnalysisDispatcher(cUnit, nullCheckEliminationInit,
-                                      kAllNodes,
-                                      false /* isIterative */);
-        oatDataFlowAnalysisDispatcher(cUnit, eliminateNullChecks,
-                                      kPreOrderDFSTraversal,
-                                      true /* isIterative */);
-    }
+  if (!(cUnit->disableOpt & (1 << kNullCheckElimination))) {
+    DCHECK(cUnit->tempSSARegisterV != NULL);
+    oatDataFlowAnalysisDispatcher(cUnit, nullCheckEliminationInit, kAllNodes,
+                                  false /* isIterative */);
+    oatDataFlowAnalysisDispatcher(cUnit, eliminateNullChecks,
+                                  kPreOrderDFSTraversal,
+                                  true /* isIterative */);
+  }
 }
 
 void oatMethodBasicBlockOptimization(CompilationUnit *cUnit)
 {
+  if (!(cUnit->disableOpt & (1 << kBBOpt))) {
+    oatInitGrowableList(cUnit, &cUnit->compilerTemps, 6, kListMisc);
+    DCHECK_EQ(cUnit->numCompilerTemps, 0);
     if (!(cUnit->disableOpt & (1 << kBBOpt))) {
-        oatInitGrowableList(cUnit, &cUnit->compilerTemps, 6, kListMisc);
-        DCHECK_EQ(cUnit->numCompilerTemps, 0);
-        if (!(cUnit->disableOpt & (1 << kBBOpt))) {
-            oatDataFlowAnalysisDispatcher(cUnit, basicBlockOpt,
-                                          kAllNodes, false /* isIterative */);
-        }
+      oatDataFlowAnalysisDispatcher(cUnit, basicBlockOpt,
+                                    kAllNodes, false /* isIterative */);
     }
+  }
 }
 
 void addLoopHeader(CompilationUnit* cUnit, BasicBlock* header,
-                   BasicBlock* backEdge)
+                 BasicBlock* backEdge)
 {
-    GrowableListIterator iter;
-    oatGrowableListIteratorInit(&cUnit->loopHeaders, &iter);
-    for (LoopInfo* loop = (LoopInfo*)oatGrowableListIteratorNext(&iter);
-         (loop != NULL); loop = (LoopInfo*)oatGrowableListIteratorNext(&iter)) {
-         if (loop->header == header) {
-             oatInsertGrowableList(cUnit, &loop->incomingBackEdges,
-                                   (intptr_t)backEdge);
-             return;
-         }
+  GrowableListIterator iter;
+  oatGrowableListIteratorInit(&cUnit->loopHeaders, &iter);
+  for (LoopInfo* loop = (LoopInfo*)oatGrowableListIteratorNext(&iter);
+      (loop != NULL); loop = (LoopInfo*)oatGrowableListIteratorNext(&iter)) {
+    if (loop->header == header) {
+      oatInsertGrowableList(cUnit, &loop->incomingBackEdges,
+                            (intptr_t)backEdge);
+      return;
     }
-    LoopInfo* info = (LoopInfo*)oatNew(cUnit, sizeof(LoopInfo), true,
-                                       kAllocDFInfo);
-    info->header = header;
-    oatInitGrowableList(cUnit, &info->incomingBackEdges, 2, kListMisc);
-    oatInsertGrowableList(cUnit, &info->incomingBackEdges, (intptr_t)backEdge);
-    oatInsertGrowableList(cUnit, &cUnit->loopHeaders, (intptr_t)info);
+  }
+  LoopInfo* info = (LoopInfo*)oatNew(cUnit, sizeof(LoopInfo), true,
+                                     kAllocDFInfo);
+  info->header = header;
+  oatInitGrowableList(cUnit, &info->incomingBackEdges, 2, kListMisc);
+  oatInsertGrowableList(cUnit, &info->incomingBackEdges, (intptr_t)backEdge);
+  oatInsertGrowableList(cUnit, &cUnit->loopHeaders, (intptr_t)info);
 }
 
 bool findBackEdges(struct CompilationUnit* cUnit, struct BasicBlock* bb)
 {
-    if ((bb->dataFlowInfo == NULL) || (bb->lastMIRInsn == NULL)) {
-        return false;
-    }
-    Instruction::Code opcode = bb->lastMIRInsn->dalvikInsn.opcode;
-    if (Instruction::Flags(opcode) & Instruction::kBranch) {
-        if (bb->taken && (bb->taken->startOffset <= bb->startOffset)) {
-            DCHECK(bb->dominators != NULL);
-            if (oatIsBitSet(bb->dominators, bb->taken->id)) {
-                if (cUnit->printMe) {
-                    LOG(INFO) << "Loop backedge from 0x"
-                              << std::hex << bb->lastMIRInsn->offset
-                              << " to 0x" << std::hex << bb->taken->startOffset;
-                }
-                addLoopHeader(cUnit, bb->taken, bb);
-            }
-        }
-    }
+  if ((bb->dataFlowInfo == NULL) || (bb->lastMIRInsn == NULL)) {
     return false;
+  }
+  Instruction::Code opcode = bb->lastMIRInsn->dalvikInsn.opcode;
+  if (Instruction::Flags(opcode) & Instruction::kBranch) {
+    if (bb->taken && (bb->taken->startOffset <= bb->startOffset)) {
+      DCHECK(bb->dominators != NULL);
+      if (oatIsBitSet(bb->dominators, bb->taken->id)) {
+        if (cUnit->printMe) {
+          LOG(INFO) << "Loop backedge from 0x"
+                    << std::hex << bb->lastMIRInsn->offset
+                    << " to 0x" << std::hex << bb->taken->startOffset;
+        }
+        addLoopHeader(cUnit, bb->taken, bb);
+      }
+    }
+  }
+  return false;
 }
 
 void addBlocksToLoop(CompilationUnit* cUnit, ArenaBitVector* blocks,
-                     BasicBlock* bb, int headId)
+                   BasicBlock* bb, int headId)
 {
-    if (!oatIsBitSet(bb->dominators, headId) ||
-        oatIsBitSet(blocks, bb->id)) {
-        return;
-    }
-    oatSetBit(cUnit, blocks, bb->id);
-    GrowableListIterator iter;
-    oatGrowableListIteratorInit(bb->predecessors, &iter);
-    BasicBlock* predBB;
-    for (predBB = (BasicBlock*)oatGrowableListIteratorNext(&iter); predBB;
-         predBB = (BasicBlock*)oatGrowableListIteratorNext(&iter)) {
-             addBlocksToLoop(cUnit, blocks, predBB, headId);
-    }
+  if (!oatIsBitSet(bb->dominators, headId) ||
+    oatIsBitSet(blocks, bb->id)) {
+    return;
+  }
+  oatSetBit(cUnit, blocks, bb->id);
+  GrowableListIterator iter;
+  oatGrowableListIteratorInit(bb->predecessors, &iter);
+  BasicBlock* predBB;
+  for (predBB = (BasicBlock*)oatGrowableListIteratorNext(&iter); predBB;
+       predBB = (BasicBlock*)oatGrowableListIteratorNext(&iter)) {
+    addBlocksToLoop(cUnit, blocks, predBB, headId);
+  }
 }
 
 void oatDumpLoops(CompilationUnit *cUnit)
 {
+  GrowableListIterator iter;
+  oatGrowableListIteratorInit(&cUnit->loopHeaders, &iter);
+  for (LoopInfo* loop = (LoopInfo*)oatGrowableListIteratorNext(&iter);
+      (loop != NULL); loop = (LoopInfo*)oatGrowableListIteratorNext(&iter)) {
+    LOG(INFO) << "Loop head block id " << loop->header->id
+              << ", offset 0x" << std::hex << loop->header->startOffset
+              << ", Depth: " << loop->header->nestingDepth;
     GrowableListIterator iter;
-    oatGrowableListIteratorInit(&cUnit->loopHeaders, &iter);
-    for (LoopInfo* loop = (LoopInfo*)oatGrowableListIteratorNext(&iter);
-         (loop != NULL); loop = (LoopInfo*)oatGrowableListIteratorNext(&iter)) {
-         LOG(INFO) << "Loop head block id " << loop->header->id
-                   << ", offset 0x" << std::hex << loop->header->startOffset
-                   << ", Depth: " << loop->header->nestingDepth;
-         GrowableListIterator iter;
-         oatGrowableListIteratorInit(&loop->incomingBackEdges, &iter);
-         BasicBlock* edgeBB;
-         for (edgeBB = (BasicBlock*)oatGrowableListIteratorNext(&iter); edgeBB;
-              edgeBB = (BasicBlock*)oatGrowableListIteratorNext(&iter)) {
-              LOG(INFO) << "    Backedge block id " << edgeBB->id
-                        << ", offset 0x" << std::hex << edgeBB->startOffset;
-              ArenaBitVectorIterator bIter;
-              oatBitVectorIteratorInit(loop->blocks, &bIter);
-              for (int bbId = oatBitVectorIteratorNext(&bIter); bbId != -1;
-                   bbId = oatBitVectorIteratorNext(&bIter)) {
-                  BasicBlock *bb;
-                  bb = (BasicBlock*)
-                        oatGrowableListGetElement(&cUnit->blockList, bbId);
-                  LOG(INFO) << "        (" << bb->id << ", 0x" << std::hex
-                            << bb->startOffset << ")";
-              }
-         }
+    oatGrowableListIteratorInit(&loop->incomingBackEdges, &iter);
+    BasicBlock* edgeBB;
+    for (edgeBB = (BasicBlock*)oatGrowableListIteratorNext(&iter); edgeBB;
+         edgeBB = (BasicBlock*)oatGrowableListIteratorNext(&iter)) {
+      LOG(INFO) << "    Backedge block id " << edgeBB->id
+                << ", offset 0x" << std::hex << edgeBB->startOffset;
+      ArenaBitVectorIterator bIter;
+      oatBitVectorIteratorInit(loop->blocks, &bIter);
+      for (int bbId = oatBitVectorIteratorNext(&bIter); bbId != -1;
+           bbId = oatBitVectorIteratorNext(&bIter)) {
+        BasicBlock *bb;
+        bb = (BasicBlock*)
+            oatGrowableListGetElement(&cUnit->blockList, bbId);
+        LOG(INFO) << "        (" << bb->id << ", 0x" << std::hex
+                  << bb->startOffset << ")";
+      }
     }
+  }
 }
 
 void oatMethodLoopDetection(CompilationUnit *cUnit)
 {
-    if (cUnit->disableOpt & (1 << kPromoteRegs)) {
-        return;
-    }
-    oatInitGrowableList(cUnit, &cUnit->loopHeaders, 6, kListMisc);
-    // Find the loop headers
-    oatDataFlowAnalysisDispatcher(cUnit, findBackEdges,
-                                  kAllNodes, false /* isIterative */);
+  if (cUnit->disableOpt & (1 << kPromoteRegs)) {
+    return;
+  }
+  oatInitGrowableList(cUnit, &cUnit->loopHeaders, 6, kListMisc);
+  // Find the loop headers
+  oatDataFlowAnalysisDispatcher(cUnit, findBackEdges,
+                                kAllNodes, false /* isIterative */);
+  GrowableListIterator iter;
+  oatGrowableListIteratorInit(&cUnit->loopHeaders, &iter);
+  // Add blocks to each header
+  for (LoopInfo* loop = (LoopInfo*)oatGrowableListIteratorNext(&iter);
+       loop; loop = (LoopInfo*)oatGrowableListIteratorNext(&iter)) {
+    loop->blocks = oatAllocBitVector(cUnit, cUnit->numBlocks, true,
+                                     kBitMapMisc);
+    oatSetBit(cUnit, loop->blocks, loop->header->id);
     GrowableListIterator iter;
-    oatGrowableListIteratorInit(&cUnit->loopHeaders, &iter);
-    // Add blocks to each header
-    for (LoopInfo* loop = (LoopInfo*)oatGrowableListIteratorNext(&iter);
-         loop; loop = (LoopInfo*)oatGrowableListIteratorNext(&iter)) {
-         loop->blocks = oatAllocBitVector(cUnit, cUnit->numBlocks, true,
-                                          kBitMapMisc);
-         oatSetBit(cUnit, loop->blocks, loop->header->id);
-         GrowableListIterator iter;
-         oatGrowableListIteratorInit(&loop->incomingBackEdges, &iter);
-         BasicBlock* edgeBB;
-         for (edgeBB = (BasicBlock*)oatGrowableListIteratorNext(&iter); edgeBB;
-              edgeBB = (BasicBlock*)oatGrowableListIteratorNext(&iter)) {
-             addBlocksToLoop(cUnit, loop->blocks, edgeBB, loop->header->id);
-         }
+    oatGrowableListIteratorInit(&loop->incomingBackEdges, &iter);
+    BasicBlock* edgeBB;
+    for (edgeBB = (BasicBlock*)oatGrowableListIteratorNext(&iter); edgeBB;
+         edgeBB = (BasicBlock*)oatGrowableListIteratorNext(&iter)) {
+      addBlocksToLoop(cUnit, loop->blocks, edgeBB, loop->header->id);
     }
-    // Compute the nesting depth of each header
-    oatGrowableListIteratorInit(&cUnit->loopHeaders, &iter);
-    for (LoopInfo* loop = (LoopInfo*)oatGrowableListIteratorNext(&iter);
-         loop; loop = (LoopInfo*)oatGrowableListIteratorNext(&iter)) {
-        GrowableListIterator iter2;
-        oatGrowableListIteratorInit(&cUnit->loopHeaders, &iter2);
-        LoopInfo* loop2;
-        for (loop2 = (LoopInfo*)oatGrowableListIteratorNext(&iter2);
-             loop2; loop2 = (LoopInfo*)oatGrowableListIteratorNext(&iter2)) {
-            if (oatIsBitSet(loop2->blocks, loop->header->id)) {
-                loop->header->nestingDepth++;
-            }
-        }
+  }
+  // Compute the nesting depth of each header
+  oatGrowableListIteratorInit(&cUnit->loopHeaders, &iter);
+  for (LoopInfo* loop = (LoopInfo*)oatGrowableListIteratorNext(&iter);
+       loop; loop = (LoopInfo*)oatGrowableListIteratorNext(&iter)) {
+    GrowableListIterator iter2;
+    oatGrowableListIteratorInit(&cUnit->loopHeaders, &iter2);
+    LoopInfo* loop2;
+    for (loop2 = (LoopInfo*)oatGrowableListIteratorNext(&iter2);
+         loop2; loop2 = (LoopInfo*)oatGrowableListIteratorNext(&iter2)) {
+      if (oatIsBitSet(loop2->blocks, loop->header->id)) {
+         loop->header->nestingDepth++;
+      }
     }
-    // Assign nesting depth to each block in all loops
-    oatGrowableListIteratorInit(&cUnit->loopHeaders, &iter);
-    for (LoopInfo* loop = (LoopInfo*)oatGrowableListIteratorNext(&iter);
-         (loop != NULL); loop = (LoopInfo*)oatGrowableListIteratorNext(&iter)) {
-        ArenaBitVectorIterator bIter;
-        oatBitVectorIteratorInit(loop->blocks, &bIter);
-        for (int bbId = oatBitVectorIteratorNext(&bIter); bbId != -1;
-            bbId = oatBitVectorIteratorNext(&bIter)) {
-            BasicBlock *bb;
-            bb = (BasicBlock*) oatGrowableListGetElement(&cUnit->blockList,
-                                                         bbId);
-            bb->nestingDepth = std::max(bb->nestingDepth,
-                                        loop->header->nestingDepth);
-        }
+  }
+  // Assign nesting depth to each block in all loops
+  oatGrowableListIteratorInit(&cUnit->loopHeaders, &iter);
+  for (LoopInfo* loop = (LoopInfo*)oatGrowableListIteratorNext(&iter);
+       (loop != NULL); loop = (LoopInfo*)oatGrowableListIteratorNext(&iter)) {
+    ArenaBitVectorIterator bIter;
+    oatBitVectorIteratorInit(loop->blocks, &bIter);
+    for (int bbId = oatBitVectorIteratorNext(&bIter); bbId != -1;
+        bbId = oatBitVectorIteratorNext(&bIter)) {
+      BasicBlock *bb;
+      bb = (BasicBlock*) oatGrowableListGetElement(&cUnit->blockList, bbId);
+      bb->nestingDepth = std::max(bb->nestingDepth,
+                                  loop->header->nestingDepth);
     }
-    if (cUnit->printMe) {
-        oatDumpLoops(cUnit);
-    }
+  }
+  if (cUnit->printMe) {
+    oatDumpLoops(cUnit);
+  }
 }
 
 /*
@@ -2263,48 +2246,48 @@
  */
 bool invokeUsesMethodStar(CompilationUnit* cUnit, MIR* mir)
 {
-    InvokeType type;
-    Instruction::Code opcode = mir->dalvikInsn.opcode;
-    switch (opcode) {
-        case Instruction::INVOKE_STATIC:
-        case Instruction::INVOKE_STATIC_RANGE:
-            type = kStatic;
-            break;
-        case Instruction::INVOKE_DIRECT:
-        case Instruction::INVOKE_DIRECT_RANGE:
-            type = kDirect;
-            break;
-        case Instruction::INVOKE_VIRTUAL:
-        case Instruction::INVOKE_VIRTUAL_RANGE:
-            type = kVirtual;
-            break;
-        case Instruction::INVOKE_INTERFACE:
-        case Instruction::INVOKE_INTERFACE_RANGE:
-            return false;
-        case Instruction::INVOKE_SUPER_RANGE:
-        case Instruction::INVOKE_SUPER:
-            type = kSuper;
-            break;
-        default:
-            LOG(WARNING) << "Unexpected invoke op: " << (int)opcode;
-            return false;
-    }
-    OatCompilationUnit mUnit(cUnit->class_loader, cUnit->class_linker,
-                             *cUnit->dex_file, *cUnit->dex_cache,
-                             cUnit->code_item, cUnit->method_idx,
-                             cUnit->access_flags);
-    // TODO: add a flag so we don't counts the stats for this twice
-    uint32_t dexMethodIdx = mir->dalvikInsn.vB;
-    int vtableIdx;
-    uintptr_t directCode;
-    uintptr_t directMethod;
-    bool fastPath =
-        cUnit->compiler->ComputeInvokeInfo(dexMethodIdx, &mUnit, type,
-                                           vtableIdx, directCode,
-                                           directMethod) &&
-        !SLOW_INVOKE_PATH;
-    return (((type == kDirect) || (type == kStatic)) &&
-            fastPath && ((directCode == 0) || (directMethod == 0)));
+  InvokeType type;
+  Instruction::Code opcode = mir->dalvikInsn.opcode;
+  switch (opcode) {
+    case Instruction::INVOKE_STATIC:
+    case Instruction::INVOKE_STATIC_RANGE:
+      type = kStatic;
+      break;
+    case Instruction::INVOKE_DIRECT:
+    case Instruction::INVOKE_DIRECT_RANGE:
+      type = kDirect;
+      break;
+    case Instruction::INVOKE_VIRTUAL:
+    case Instruction::INVOKE_VIRTUAL_RANGE:
+      type = kVirtual;
+      break;
+    case Instruction::INVOKE_INTERFACE:
+    case Instruction::INVOKE_INTERFACE_RANGE:
+      return false;
+    case Instruction::INVOKE_SUPER_RANGE:
+    case Instruction::INVOKE_SUPER:
+      type = kSuper;
+      break;
+    default:
+      LOG(WARNING) << "Unexpected invoke op: " << (int)opcode;
+      return false;
+  }
+  OatCompilationUnit mUnit(cUnit->class_loader, cUnit->class_linker,
+                           *cUnit->dex_file, *cUnit->dex_cache,
+                           cUnit->code_item, cUnit->method_idx,
+                           cUnit->access_flags);
+  // TODO: add a flag so we don't counts the stats for this twice
+  uint32_t dexMethodIdx = mir->dalvikInsn.vB;
+  int vtableIdx;
+  uintptr_t directCode;
+  uintptr_t directMethod;
+  bool fastPath =
+      cUnit->compiler->ComputeInvokeInfo(dexMethodIdx, &mUnit, type,
+                                         vtableIdx, directCode,
+                                         directMethod) &&
+      !SLOW_INVOKE_PATH;
+  return (((type == kDirect) || (type == kStatic)) &&
+          fastPath && ((directCode == 0) || (directMethod == 0)));
 }
 
 /*
@@ -2314,61 +2297,61 @@
  */
 bool countUses(struct CompilationUnit* cUnit, struct BasicBlock* bb)
 {
-    if (bb->blockType != kDalvikByteCode) {
-        return false;
-    }
-    for (MIR* mir = bb->firstMIRInsn; (mir != NULL); mir = mir->next) {
-        if (mir->ssaRep == NULL) {
-            continue;
-        }
-        uint32_t weight = std::min(16U, (uint32_t)bb->nestingDepth);
-        for (int i = 0; i < mir->ssaRep->numUses; i++) {
-            int sReg = mir->ssaRep->uses[i];
-            DCHECK_LT(sReg, (int)cUnit->useCounts.numUsed);
-            cUnit->rawUseCounts.elemList[sReg]++;
-            cUnit->useCounts.elemList[sReg] += (1 << weight);
-        }
-        if (!(cUnit->disableOpt & (1 << kPromoteCompilerTemps))) {
-            int dfAttributes = oatDataFlowAttributes[mir->dalvikInsn.opcode];
-            // Implicit use of Method* ? */
-            if (dfAttributes & DF_UMS) {
-                /*
-                 * Some invokes will not use Method* - need to perform test similar
-                 * to that found in genInvoke() to decide whether to count refs
-                 * for Method* on invoke-class opcodes.
-                 * TODO: refactor for common test here, save results for genInvoke
-                 */
-                int usesMethodStar = true;
-                if ((dfAttributes & (DF_FORMAT_35C | DF_FORMAT_3RC)) &&
-                    !(dfAttributes & DF_NON_NULL_RET)) {
-                    usesMethodStar &= invokeUsesMethodStar(cUnit, mir);
-                }
-                if (usesMethodStar) {
-                    cUnit->rawUseCounts.elemList[cUnit->methodSReg]++;
-                    cUnit->useCounts.elemList[cUnit->methodSReg] += (1 << weight);
-                }
-            }
-        }
-    }
+  if (bb->blockType != kDalvikByteCode) {
     return false;
+  }
+  for (MIR* mir = bb->firstMIRInsn; (mir != NULL); mir = mir->next) {
+    if (mir->ssaRep == NULL) {
+      continue;
+    }
+    uint32_t weight = std::min(16U, (uint32_t)bb->nestingDepth);
+    for (int i = 0; i < mir->ssaRep->numUses; i++) {
+      int sReg = mir->ssaRep->uses[i];
+      DCHECK_LT(sReg, (int)cUnit->useCounts.numUsed);
+      cUnit->rawUseCounts.elemList[sReg]++;
+      cUnit->useCounts.elemList[sReg] += (1 << weight);
+    }
+    if (!(cUnit->disableOpt & (1 << kPromoteCompilerTemps))) {
+      int dfAttributes = oatDataFlowAttributes[mir->dalvikInsn.opcode];
+      // Implicit use of Method* ? */
+      if (dfAttributes & DF_UMS) {
+        /*
+         * Some invokes will not use Method* - need to perform test similar
+         * to that found in genInvoke() to decide whether to count refs
+         * for Method* on invoke-class opcodes.
+         * TODO: refactor for common test here, save results for genInvoke
+         */
+        int usesMethodStar = true;
+        if ((dfAttributes & (DF_FORMAT_35C | DF_FORMAT_3RC)) &&
+            !(dfAttributes & DF_NON_NULL_RET)) {
+          usesMethodStar &= invokeUsesMethodStar(cUnit, mir);
+        }
+        if (usesMethodStar) {
+          cUnit->rawUseCounts.elemList[cUnit->methodSReg]++;
+          cUnit->useCounts.elemList[cUnit->methodSReg] += (1 << weight);
+        }
+      }
+    }
+  }
+  return false;
 }
 
 void oatMethodUseCount(CompilationUnit *cUnit)
 {
-    oatInitGrowableList(cUnit, &cUnit->useCounts, cUnit->numSSARegs + 32,
-                        kListMisc);
-    oatInitGrowableList(cUnit, &cUnit->rawUseCounts, cUnit->numSSARegs + 32,
-                        kListMisc);
-    // Initialize list
-    for (int i = 0; i < cUnit->numSSARegs; i++) {
-        oatInsertGrowableList(cUnit, &cUnit->useCounts, 0);
-        oatInsertGrowableList(cUnit, &cUnit->rawUseCounts, 0);
-    }
-    if (cUnit->disableOpt & (1 << kPromoteRegs)) {
-        return;
-    }
-    oatDataFlowAnalysisDispatcher(cUnit, countUses,
-                                  kAllNodes, false /* isIterative */);
+  oatInitGrowableList(cUnit, &cUnit->useCounts, cUnit->numSSARegs + 32,
+                      kListMisc);
+  oatInitGrowableList(cUnit, &cUnit->rawUseCounts, cUnit->numSSARegs + 32,
+                      kListMisc);
+  // Initialize list
+  for (int i = 0; i < cUnit->numSSARegs; i++) {
+    oatInsertGrowableList(cUnit, &cUnit->useCounts, 0);
+    oatInsertGrowableList(cUnit, &cUnit->rawUseCounts, 0);
+  }
+  if (cUnit->disableOpt & (1 << kPromoteRegs)) {
+    return;
+  }
+  oatDataFlowAnalysisDispatcher(cUnit, countUses,
+                                kAllNodes, false /* isIterative */);
 }
 
 }  // namespace art
