Home | History | Annotate | Download | only in dex
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "compiler_internals.h"
     18 #include "dataflow_iterator.h"
     19 #include "dataflow_iterator-inl.h"
     20 #include "global_value_numbering.h"
     21 #include "local_value_numbering.h"
     22 #include "gtest/gtest.h"
     23 
     24 namespace art {
     25 
     26 class GlobalValueNumberingTest : public testing::Test {
     27  protected:
     28   struct IFieldDef {
     29     uint16_t field_idx;
     30     uintptr_t declaring_dex_file;
     31     uint16_t declaring_field_idx;
     32     bool is_volatile;
     33   };
     34 
     35   struct SFieldDef {
     36     uint16_t field_idx;
     37     uintptr_t declaring_dex_file;
     38     uint16_t declaring_field_idx;
     39     bool is_volatile;
     40   };
     41 
     42   struct BBDef {
     43     static constexpr size_t kMaxSuccessors = 4;
     44     static constexpr size_t kMaxPredecessors = 4;
     45 
     46     BBType type;
     47     size_t num_successors;
     48     BasicBlockId successors[kMaxPredecessors];
     49     size_t num_predecessors;
     50     BasicBlockId predecessors[kMaxPredecessors];
     51   };
     52 
     53   struct MIRDef {
     54     static constexpr size_t kMaxSsaDefs = 2;
     55     static constexpr size_t kMaxSsaUses = 4;
     56 
     57     BasicBlockId bbid;
     58     Instruction::Code opcode;
     59     int64_t value;
     60     uint32_t field_info;
     61     size_t num_uses;
     62     int32_t uses[kMaxSsaUses];
     63     size_t num_defs;
     64     int32_t defs[kMaxSsaDefs];
     65   };
     66 
     67 #define DEF_SUCC0() \
     68     0u, { }
     69 #define DEF_SUCC1(s1) \
     70     1u, { s1 }
     71 #define DEF_SUCC2(s1, s2) \
     72     2u, { s1, s2 }
     73 #define DEF_SUCC3(s1, s2, s3) \
     74     3u, { s1, s2, s3 }
     75 #define DEF_SUCC4(s1, s2, s3, s4) \
     76     4u, { s1, s2, s3, s4 }
     77 #define DEF_PRED0() \
     78     0u, { }
     79 #define DEF_PRED1(p1) \
     80     1u, { p1 }
     81 #define DEF_PRED2(p1, p2) \
     82     2u, { p1, p2 }
     83 #define DEF_PRED3(p1, p2, p3) \
     84     3u, { p1, p2, p3 }
     85 #define DEF_PRED4(p1, p2, p3, p4) \
     86     4u, { p1, p2, p3, p4 }
     87 #define DEF_BB(type, succ, pred) \
     88     { type, succ, pred }
     89 
     90 #define DEF_CONST(bb, opcode, reg, value) \
     91     { bb, opcode, value, 0u, 0, { }, 1, { reg } }
     92 #define DEF_CONST_WIDE(bb, opcode, reg, value) \
     93     { bb, opcode, value, 0u, 0, { }, 2, { reg, reg + 1 } }
     94 #define DEF_CONST_STRING(bb, opcode, reg, index) \
     95     { bb, opcode, index, 0u, 0, { }, 1, { reg } }
     96 #define DEF_IGET(bb, opcode, reg, obj, field_info) \
     97     { bb, opcode, 0u, field_info, 1, { obj }, 1, { reg } }
     98 #define DEF_IGET_WIDE(bb, opcode, reg, obj, field_info) \
     99     { bb, opcode, 0u, field_info, 1, { obj }, 2, { reg, reg + 1 } }
    100 #define DEF_IPUT(bb, opcode, reg, obj, field_info) \
    101     { bb, opcode, 0u, field_info, 2, { reg, obj }, 0, { } }
    102 #define DEF_IPUT_WIDE(bb, opcode, reg, obj, field_info) \
    103     { bb, opcode, 0u, field_info, 3, { reg, reg + 1, obj }, 0, { } }
    104 #define DEF_SGET(bb, opcode, reg, field_info) \
    105     { bb, opcode, 0u, field_info, 0, { }, 1, { reg } }
    106 #define DEF_SGET_WIDE(bb, opcode, reg, field_info) \
    107     { bb, opcode, 0u, field_info, 0, { }, 2, { reg, reg + 1 } }
    108 #define DEF_SPUT(bb, opcode, reg, field_info) \
    109     { bb, opcode, 0u, field_info, 1, { reg }, 0, { } }
    110 #define DEF_SPUT_WIDE(bb, opcode, reg, field_info) \
    111     { bb, opcode, 0u, field_info, 2, { reg, reg + 1 }, 0, { } }
    112 #define DEF_AGET(bb, opcode, reg, obj, idx) \
    113     { bb, opcode, 0u, 0u, 2, { obj, idx }, 1, { reg } }
    114 #define DEF_AGET_WIDE(bb, opcode, reg, obj, idx) \
    115     { bb, opcode, 0u, 0u, 2, { obj, idx }, 2, { reg, reg + 1 } }
    116 #define DEF_APUT(bb, opcode, reg, obj, idx) \
    117     { bb, opcode, 0u, 0u, 3, { reg, obj, idx }, 0, { } }
    118 #define DEF_APUT_WIDE(bb, opcode, reg, obj, idx) \
    119     { bb, opcode, 0u, 0u, 4, { reg, reg + 1, obj, idx }, 0, { } }
    120 #define DEF_INVOKE1(bb, opcode, reg) \
    121     { bb, opcode, 0u, 0u, 1, { reg }, 0, { } }
    122 #define DEF_UNIQUE_REF(bb, opcode, reg) \
    123     { bb, opcode, 0u, 0u, 0, { }, 1, { reg } }  // CONST_CLASS, CONST_STRING, NEW_ARRAY, ...
    124 #define DEF_IFZ(bb, opcode, reg) \
    125     { bb, opcode, 0u, 0u, 1, { reg }, 0, { } }
    126 #define DEF_MOVE(bb, opcode, reg, src) \
    127     { bb, opcode, 0u, 0u, 1, { src }, 1, { reg } }
    128 #define DEF_PHI2(bb, reg, src1, src2) \
    129     { bb, static_cast<Instruction::Code>(kMirOpPhi), 0, 0u, 2u, { src1, src2 }, 1, { reg } }
    130 
    131   void DoPrepareIFields(const IFieldDef* defs, size_t count) {
    132     cu_.mir_graph->ifield_lowering_infos_.Reset();
    133     cu_.mir_graph->ifield_lowering_infos_.Resize(count);
    134     for (size_t i = 0u; i != count; ++i) {
    135       const IFieldDef* def = &defs[i];
    136       MirIFieldLoweringInfo field_info(def->field_idx);
    137       if (def->declaring_dex_file != 0u) {
    138         field_info.declaring_dex_file_ = reinterpret_cast<const DexFile*>(def->declaring_dex_file);
    139         field_info.declaring_field_idx_ = def->declaring_field_idx;
    140         field_info.flags_ = 0u |  // Without kFlagIsStatic.
    141             (def->is_volatile ? MirIFieldLoweringInfo::kFlagIsVolatile : 0u);
    142       }
    143       cu_.mir_graph->ifield_lowering_infos_.Insert(field_info);
    144     }
    145   }
    146 
    147   template <size_t count>
    148   void PrepareIFields(const IFieldDef (&defs)[count]) {
    149     DoPrepareIFields(defs, count);
    150   }
    151 
    152   void DoPrepareSFields(const SFieldDef* defs, size_t count) {
    153     cu_.mir_graph->sfield_lowering_infos_.Reset();
    154     cu_.mir_graph->sfield_lowering_infos_.Resize(count);
    155     for (size_t i = 0u; i != count; ++i) {
    156       const SFieldDef* def = &defs[i];
    157       MirSFieldLoweringInfo field_info(def->field_idx);
    158       // Mark even unresolved fields as initialized.
    159       field_info.flags_ = MirSFieldLoweringInfo::kFlagIsStatic |
    160           MirSFieldLoweringInfo::kFlagIsInitialized;
    161       if (def->declaring_dex_file != 0u) {
    162         field_info.declaring_dex_file_ = reinterpret_cast<const DexFile*>(def->declaring_dex_file);
    163         field_info.declaring_field_idx_ = def->declaring_field_idx;
    164         field_info.flags_ |= (def->is_volatile ? MirSFieldLoweringInfo::kFlagIsVolatile : 0u);
    165       }
    166       cu_.mir_graph->sfield_lowering_infos_.Insert(field_info);
    167     }
    168   }
    169 
    170   template <size_t count>
    171   void PrepareSFields(const SFieldDef (&defs)[count]) {
    172     DoPrepareSFields(defs, count);
    173   }
    174 
    175   void DoPrepareBasicBlocks(const BBDef* defs, size_t count) {
    176     cu_.mir_graph->block_id_map_.clear();
    177     cu_.mir_graph->block_list_.Reset();
    178     ASSERT_LT(3u, count);  // null, entry, exit and at least one bytecode block.
    179     ASSERT_EQ(kNullBlock, defs[0].type);
    180     ASSERT_EQ(kEntryBlock, defs[1].type);
    181     ASSERT_EQ(kExitBlock, defs[2].type);
    182     for (size_t i = 0u; i != count; ++i) {
    183       const BBDef* def = &defs[i];
    184       BasicBlock* bb = cu_.mir_graph->NewMemBB(def->type, i);
    185       cu_.mir_graph->block_list_.Insert(bb);
    186       if (def->num_successors <= 2) {
    187         bb->successor_block_list_type = kNotUsed;
    188         bb->successor_blocks = nullptr;
    189         bb->fall_through = (def->num_successors >= 1) ? def->successors[0] : 0u;
    190         bb->taken = (def->num_successors >= 2) ? def->successors[1] : 0u;
    191       } else {
    192         bb->successor_block_list_type = kPackedSwitch;
    193         bb->fall_through = 0u;
    194         bb->taken = 0u;
    195         bb->successor_blocks = new (&cu_.arena) GrowableArray<SuccessorBlockInfo*>(
    196             &cu_.arena, def->num_successors, kGrowableArraySuccessorBlocks);
    197         for (size_t j = 0u; j != def->num_successors; ++j) {
    198           SuccessorBlockInfo* successor_block_info =
    199               static_cast<SuccessorBlockInfo*>(cu_.arena.Alloc(sizeof(SuccessorBlockInfo),
    200                                                                kArenaAllocSuccessor));
    201           successor_block_info->block = j;
    202           successor_block_info->key = 0u;  // Not used by class init check elimination.
    203           bb->successor_blocks->Insert(successor_block_info);
    204         }
    205       }
    206       bb->predecessors = new (&cu_.arena) GrowableArray<BasicBlockId>(
    207           &cu_.arena, def->num_predecessors, kGrowableArrayPredecessors);
    208       for (size_t j = 0u; j != def->num_predecessors; ++j) {
    209         ASSERT_NE(0u, def->predecessors[j]);
    210         bb->predecessors->Insert(def->predecessors[j]);
    211       }
    212       if (def->type == kDalvikByteCode || def->type == kEntryBlock || def->type == kExitBlock) {
    213         bb->data_flow_info = static_cast<BasicBlockDataFlow*>(
    214             cu_.arena.Alloc(sizeof(BasicBlockDataFlow), kArenaAllocDFInfo));
    215         bb->data_flow_info->live_in_v = live_in_v_;
    216       }
    217     }
    218     cu_.mir_graph->num_blocks_ = count;
    219     ASSERT_EQ(count, cu_.mir_graph->block_list_.Size());
    220     cu_.mir_graph->entry_block_ = cu_.mir_graph->block_list_.Get(1);
    221     ASSERT_EQ(kEntryBlock, cu_.mir_graph->entry_block_->block_type);
    222     cu_.mir_graph->exit_block_ = cu_.mir_graph->block_list_.Get(2);
    223     ASSERT_EQ(kExitBlock, cu_.mir_graph->exit_block_->block_type);
    224   }
    225 
    226   template <size_t count>
    227   void PrepareBasicBlocks(const BBDef (&defs)[count]) {
    228     DoPrepareBasicBlocks(defs, count);
    229   }
    230 
    231   void DoPrepareMIRs(const MIRDef* defs, size_t count) {
    232     mir_count_ = count;
    233     mirs_ = reinterpret_cast<MIR*>(cu_.arena.Alloc(sizeof(MIR) * count, kArenaAllocMIR));
    234     ssa_reps_.resize(count);
    235     for (size_t i = 0u; i != count; ++i) {
    236       const MIRDef* def = &defs[i];
    237       MIR* mir = &mirs_[i];
    238       ASSERT_LT(def->bbid, cu_.mir_graph->block_list_.Size());
    239       BasicBlock* bb = cu_.mir_graph->block_list_.Get(def->bbid);
    240       bb->AppendMIR(mir);
    241       mir->dalvikInsn.opcode = def->opcode;
    242       mir->dalvikInsn.vB = static_cast<int32_t>(def->value);
    243       mir->dalvikInsn.vB_wide = def->value;
    244       if (def->opcode >= Instruction::IGET && def->opcode <= Instruction::IPUT_SHORT) {
    245         ASSERT_LT(def->field_info, cu_.mir_graph->ifield_lowering_infos_.Size());
    246         mir->meta.ifield_lowering_info = def->field_info;
    247       } else if (def->opcode >= Instruction::SGET && def->opcode <= Instruction::SPUT_SHORT) {
    248         ASSERT_LT(def->field_info, cu_.mir_graph->sfield_lowering_infos_.Size());
    249         mir->meta.sfield_lowering_info = def->field_info;
    250       } else if (def->opcode == static_cast<Instruction::Code>(kMirOpPhi)) {
    251         mir->meta.phi_incoming = static_cast<BasicBlockId*>(
    252             allocator_->Alloc(def->num_uses * sizeof(BasicBlockId), kArenaAllocDFInfo));
    253         for (size_t i = 0; i != def->num_uses; ++i) {
    254           mir->meta.phi_incoming[i] = bb->predecessors->Get(i);
    255         }
    256       }
    257       mir->ssa_rep = &ssa_reps_[i];
    258       mir->ssa_rep->num_uses = def->num_uses;
    259       mir->ssa_rep->uses = const_cast<int32_t*>(def->uses);  // Not modified by LVN.
    260       mir->ssa_rep->fp_use = nullptr;  // Not used by LVN.
    261       mir->ssa_rep->num_defs = def->num_defs;
    262       mir->ssa_rep->defs = const_cast<int32_t*>(def->defs);  // Not modified by LVN.
    263       mir->ssa_rep->fp_def = nullptr;  // Not used by LVN.
    264       mir->dalvikInsn.opcode = def->opcode;
    265       mir->offset = i;  // LVN uses offset only for debug output
    266       mir->optimization_flags = 0u;
    267     }
    268     mirs_[count - 1u].next = nullptr;
    269   }
    270 
    271   template <size_t count>
    272   void PrepareMIRs(const MIRDef (&defs)[count]) {
    273     DoPrepareMIRs(defs, count);
    274   }
    275 
    276   void PerformGVN() {
    277     DoPerformGVN<LoopRepeatingTopologicalSortIterator>();
    278   }
    279 
    280   void PerformPreOrderDfsGVN() {
    281     DoPerformGVN<RepeatingPreOrderDfsIterator>();
    282   }
    283 
    284   template <typename IteratorType>
    285   void DoPerformGVN() {
    286     cu_.mir_graph->SSATransformationStart();
    287     cu_.mir_graph->ComputeDFSOrders();
    288     cu_.mir_graph->ComputeDominators();
    289     cu_.mir_graph->ComputeTopologicalSortOrder();
    290     cu_.mir_graph->SSATransformationEnd();
    291     ASSERT_TRUE(gvn_ == nullptr);
    292     gvn_.reset(new (allocator_.get()) GlobalValueNumbering(&cu_, allocator_.get()));
    293     ASSERT_FALSE(gvn_->CanModify());
    294     value_names_.resize(mir_count_, 0xffffu);
    295     IteratorType iterator(cu_.mir_graph.get());
    296     bool change = false;
    297     for (BasicBlock* bb = iterator.Next(change); bb != nullptr; bb = iterator.Next(change)) {
    298       LocalValueNumbering* lvn = gvn_->PrepareBasicBlock(bb);
    299       if (lvn != nullptr) {
    300         for (MIR* mir = bb->first_mir_insn; mir != nullptr; mir = mir->next) {
    301           value_names_[mir - mirs_] = lvn->GetValueNumber(mir);
    302         }
    303       }
    304       change = (lvn != nullptr) && gvn_->FinishBasicBlock(bb);
    305       ASSERT_TRUE(gvn_->Good());
    306     }
    307   }
    308 
    309   void PerformGVNCodeModifications() {
    310     ASSERT_TRUE(gvn_ != nullptr);
    311     ASSERT_TRUE(gvn_->Good());
    312     ASSERT_FALSE(gvn_->CanModify());
    313     gvn_->AllowModifications();
    314     TopologicalSortIterator iterator(cu_.mir_graph.get());
    315     for (BasicBlock* bb = iterator.Next(); bb != nullptr; bb = iterator.Next()) {
    316       LocalValueNumbering* lvn = gvn_->PrepareBasicBlock(bb);
    317       if (lvn != nullptr) {
    318         for (MIR* mir = bb->first_mir_insn; mir != nullptr; mir = mir->next) {
    319           uint16_t value_name = lvn->GetValueNumber(mir);
    320           ASSERT_EQ(value_name, value_names_[mir - mirs_]);
    321         }
    322       }
    323       bool change = (lvn != nullptr) && gvn_->FinishBasicBlock(bb);
    324       ASSERT_FALSE(change);
    325       ASSERT_TRUE(gvn_->Good());
    326     }
    327   }
    328 
    329   GlobalValueNumberingTest()
    330       : pool_(),
    331         cu_(&pool_),
    332         mir_count_(0u),
    333         mirs_(nullptr),
    334         ssa_reps_(),
    335         allocator_(),
    336         gvn_(),
    337         value_names_(),
    338         live_in_v_(new (&cu_.arena) ArenaBitVector(&cu_.arena, kMaxSsaRegs, false, kBitMapMisc)) {
    339     cu_.mir_graph.reset(new MIRGraph(&cu_, &cu_.arena));
    340     cu_.access_flags = kAccStatic;  // Don't let "this" interfere with this test.
    341     allocator_.reset(ScopedArenaAllocator::Create(&cu_.arena_stack));
    342     // Bind all possible sregs to live vregs for test purposes.
    343     live_in_v_->SetInitialBits(kMaxSsaRegs);
    344     cu_.mir_graph->ssa_base_vregs_ = new (&cu_.arena) GrowableArray<int>(&cu_.arena, kMaxSsaRegs);
    345     cu_.mir_graph->ssa_subscripts_ = new (&cu_.arena) GrowableArray<int>(&cu_.arena, kMaxSsaRegs);
    346     for (unsigned int i = 0; i < kMaxSsaRegs; i++) {
    347       cu_.mir_graph->ssa_base_vregs_->Insert(i);
    348       cu_.mir_graph->ssa_subscripts_->Insert(0);
    349     }
    350   }
    351 
    352   static constexpr size_t kMaxSsaRegs = 16384u;
    353 
    354   ArenaPool pool_;
    355   CompilationUnit cu_;
    356   size_t mir_count_;
    357   MIR* mirs_;
    358   std::vector<SSARepresentation> ssa_reps_;
    359   std::unique_ptr<ScopedArenaAllocator> allocator_;
    360   std::unique_ptr<GlobalValueNumbering> gvn_;
    361   std::vector<uint16_t> value_names_;
    362   ArenaBitVector* live_in_v_;
    363 };
    364 
    365 class GlobalValueNumberingTestDiamond : public GlobalValueNumberingTest {
    366  public:
    367   GlobalValueNumberingTestDiamond();
    368 
    369  private:
    370   static const BBDef kDiamondBbs[];
    371 };
    372 
    373 const GlobalValueNumberingTest::BBDef GlobalValueNumberingTestDiamond::kDiamondBbs[] = {
    374     DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
    375     DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
    376     DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(6)),
    377     DEF_BB(kDalvikByteCode, DEF_SUCC2(4, 5), DEF_PRED1(1)),  // Block #3, top of the diamond.
    378     DEF_BB(kDalvikByteCode, DEF_SUCC1(6), DEF_PRED1(3)),     // Block #4, left side.
    379     DEF_BB(kDalvikByteCode, DEF_SUCC1(6), DEF_PRED1(3)),     // Block #5, right side.
    380     DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED2(4, 5)),  // Block #6, bottom.
    381 };
    382 
    383 GlobalValueNumberingTestDiamond::GlobalValueNumberingTestDiamond()
    384     : GlobalValueNumberingTest() {
    385   PrepareBasicBlocks(kDiamondBbs);
    386 }
    387 
    388 class GlobalValueNumberingTestLoop : public GlobalValueNumberingTest {
    389  public:
    390   GlobalValueNumberingTestLoop();
    391 
    392  private:
    393   static const BBDef kLoopBbs[];
    394 };
    395 
    396 const GlobalValueNumberingTest::BBDef GlobalValueNumberingTestLoop::kLoopBbs[] = {
    397     DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
    398     DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
    399     DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(5)),
    400     DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(1)),
    401     DEF_BB(kDalvikByteCode, DEF_SUCC2(5, 4), DEF_PRED2(3, 4)),  // "taken" loops to self.
    402     DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED1(4)),
    403 };
    404 
    405 GlobalValueNumberingTestLoop::GlobalValueNumberingTestLoop()
    406     : GlobalValueNumberingTest() {
    407   PrepareBasicBlocks(kLoopBbs);
    408 }
    409 
    410 class GlobalValueNumberingTestCatch : public GlobalValueNumberingTest {
    411  public:
    412   GlobalValueNumberingTestCatch();
    413 
    414  private:
    415   static const BBDef kCatchBbs[];
    416 };
    417 
    418 const GlobalValueNumberingTest::BBDef GlobalValueNumberingTestCatch::kCatchBbs[] = {
    419     DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
    420     DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
    421     DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(6)),
    422     DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(1)),     // The top.
    423     DEF_BB(kDalvikByteCode, DEF_SUCC1(6), DEF_PRED1(3)),     // The throwing insn.
    424     DEF_BB(kDalvikByteCode, DEF_SUCC1(6), DEF_PRED1(3)),     // Catch handler.
    425     DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED2(4, 5)),  // The merged block.
    426 };
    427 
    428 GlobalValueNumberingTestCatch::GlobalValueNumberingTestCatch()
    429     : GlobalValueNumberingTest() {
    430   PrepareBasicBlocks(kCatchBbs);
    431   // Mark catch handler.
    432   BasicBlock* catch_handler = cu_.mir_graph->GetBasicBlock(5u);
    433   catch_handler->catch_entry = true;
    434   // Add successor block info to the check block.
    435   BasicBlock* check_bb = cu_.mir_graph->GetBasicBlock(3u);
    436   check_bb->successor_block_list_type = kCatch;
    437   check_bb->successor_blocks = new (&cu_.arena) GrowableArray<SuccessorBlockInfo*>(
    438       &cu_.arena, 2, kGrowableArraySuccessorBlocks);
    439   SuccessorBlockInfo* successor_block_info = reinterpret_cast<SuccessorBlockInfo*>
    440       (cu_.arena.Alloc(sizeof(SuccessorBlockInfo), kArenaAllocSuccessor));
    441   successor_block_info->block = catch_handler->id;
    442   check_bb->successor_blocks->Insert(successor_block_info);
    443 }
    444 
    445 class GlobalValueNumberingTestTwoConsecutiveLoops : public GlobalValueNumberingTest {
    446  public:
    447   GlobalValueNumberingTestTwoConsecutiveLoops();
    448 
    449  private:
    450   static const BBDef kTwoConsecutiveLoopsBbs[];
    451 };
    452 
    453 const GlobalValueNumberingTest::BBDef
    454 GlobalValueNumberingTestTwoConsecutiveLoops::kTwoConsecutiveLoopsBbs[] = {
    455     DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
    456     DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
    457     DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(9)),
    458     DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(1)),
    459     DEF_BB(kDalvikByteCode, DEF_SUCC2(5, 6), DEF_PRED2(3, 5)),  // "taken" skips over the loop.
    460     DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(4)),
    461     DEF_BB(kDalvikByteCode, DEF_SUCC1(7), DEF_PRED1(4)),
    462     DEF_BB(kDalvikByteCode, DEF_SUCC2(8, 9), DEF_PRED2(6, 8)),  // "taken" skips over the loop.
    463     DEF_BB(kDalvikByteCode, DEF_SUCC1(7), DEF_PRED1(7)),
    464     DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED1(7)),
    465 };
    466 
    467 GlobalValueNumberingTestTwoConsecutiveLoops::GlobalValueNumberingTestTwoConsecutiveLoops()
    468     : GlobalValueNumberingTest() {
    469   PrepareBasicBlocks(kTwoConsecutiveLoopsBbs);
    470 }
    471 
    472 class GlobalValueNumberingTestTwoNestedLoops : public GlobalValueNumberingTest {
    473  public:
    474   GlobalValueNumberingTestTwoNestedLoops();
    475 
    476  private:
    477   static const BBDef kTwoNestedLoopsBbs[];
    478 };
    479 
    480 const GlobalValueNumberingTest::BBDef
    481 GlobalValueNumberingTestTwoNestedLoops::kTwoNestedLoopsBbs[] = {
    482     DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
    483     DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
    484     DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(8)),
    485     DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(1)),
    486     DEF_BB(kDalvikByteCode, DEF_SUCC2(5, 8), DEF_PRED2(3, 7)),  // "taken" skips over the loop.
    487     DEF_BB(kDalvikByteCode, DEF_SUCC2(6, 7), DEF_PRED2(4, 6)),  // "taken" skips over the loop.
    488     DEF_BB(kDalvikByteCode, DEF_SUCC1(5), DEF_PRED1(5)),
    489     DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(5)),
    490     DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED1(4)),
    491 };
    492 
    493 GlobalValueNumberingTestTwoNestedLoops::GlobalValueNumberingTestTwoNestedLoops()
    494     : GlobalValueNumberingTest() {
    495   PrepareBasicBlocks(kTwoNestedLoopsBbs);
    496 }
    497 
    498 TEST_F(GlobalValueNumberingTestDiamond, NonAliasingIFields) {
    499   static const IFieldDef ifields[] = {
    500       { 0u, 1u, 0u, false },  // Int.
    501       { 1u, 1u, 1u, false },  // Int.
    502       { 2u, 1u, 2u, false },  // Int.
    503       { 3u, 1u, 3u, false },  // Int.
    504       { 4u, 1u, 4u, false },  // Short.
    505       { 5u, 1u, 5u, false },  // Char.
    506       { 6u, 0u, 0u, false },  // Unresolved, Short.
    507       { 7u, 1u, 7u, false },  // Int.
    508       { 8u, 0u, 0u, false },  // Unresolved, Int.
    509       { 9u, 1u, 9u, false },  // Int.
    510       { 10u, 1u, 10u, false },  // Int.
    511       { 11u, 1u, 11u, false },  // Int.
    512   };
    513   static const MIRDef mirs[] = {
    514       // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
    515       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 100u),
    516       DEF_IGET(3, Instruction::IGET, 1u, 100u, 0u),
    517       DEF_IGET(6, Instruction::IGET, 2u, 100u, 0u),   // Same as at the top.
    518 
    519       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 200u),
    520       DEF_IGET(4, Instruction::IGET, 4u, 200u, 1u),
    521       DEF_IGET(6, Instruction::IGET, 5u, 200u, 1u),   // Same as at the left side.
    522 
    523       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 300u),
    524       DEF_IGET(3, Instruction::IGET, 7u, 300u, 2u),
    525       DEF_CONST(5, Instruction::CONST, 8u, 1000),
    526       DEF_IPUT(5, Instruction::IPUT, 8u, 300u, 2u),
    527       DEF_IGET(6, Instruction::IGET, 10u, 300u, 2u),  // Differs from the top and the CONST.
    528 
    529       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 400u),
    530       DEF_IGET(3, Instruction::IGET, 12u, 400u, 3u),
    531       DEF_CONST(3, Instruction::CONST, 13u, 2000),
    532       DEF_IPUT(4, Instruction::IPUT, 13u, 400u, 3u),
    533       DEF_IPUT(5, Instruction::IPUT, 13u, 400u, 3u),
    534       DEF_IGET(6, Instruction::IGET, 16u, 400u, 3u),  // Differs from the top, equals the CONST.
    535 
    536       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 500u),
    537       DEF_IGET(3, Instruction::IGET_SHORT, 18u, 500u, 4u),
    538       DEF_IGET(3, Instruction::IGET_CHAR, 19u, 500u, 5u),
    539       DEF_IPUT(4, Instruction::IPUT_SHORT, 20u, 500u, 6u),  // Clobbers field #4, not #5.
    540       DEF_IGET(6, Instruction::IGET_SHORT, 21u, 500u, 4u),  // Differs from the top.
    541       DEF_IGET(6, Instruction::IGET_CHAR, 22u, 500u, 5u),   // Same as the top.
    542 
    543       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 600u),
    544       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 601u),
    545       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 602u),
    546       DEF_IGET(3, Instruction::IGET, 26u, 600u, 7u),
    547       DEF_IGET(3, Instruction::IGET, 27u, 601u, 7u),
    548       DEF_IPUT(4, Instruction::IPUT, 28u, 602u, 8u),  // Doesn't clobber field #7 for other refs.
    549       DEF_IGET(6, Instruction::IGET, 29u, 600u, 7u),  // Same as the top.
    550       DEF_IGET(6, Instruction::IGET, 30u, 601u, 7u),  // Same as the top.
    551 
    552       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 700u),
    553       DEF_CONST(4, Instruction::CONST, 32u, 3000),
    554       DEF_IPUT(4, Instruction::IPUT, 32u, 700u, 9u),
    555       DEF_IPUT(4, Instruction::IPUT, 32u, 700u, 10u),
    556       DEF_CONST(5, Instruction::CONST, 35u, 3001),
    557       DEF_IPUT(5, Instruction::IPUT, 35u, 700u, 9u),
    558       DEF_IPUT(5, Instruction::IPUT, 35u, 700u, 10u),
    559       DEF_IGET(6, Instruction::IGET, 38u, 700u, 9u),
    560       DEF_IGET(6, Instruction::IGET, 39u, 700u, 10u),  // Same value as read from field #9.
    561 
    562       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 800u),
    563       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 801u),
    564       DEF_CONST(4, Instruction::CONST, 42u, 3000),
    565       DEF_IPUT(4, Instruction::IPUT, 42u, 800u, 11u),
    566       DEF_IPUT(4, Instruction::IPUT, 42u, 801u, 11u),
    567       DEF_CONST(5, Instruction::CONST, 45u, 3001),
    568       DEF_IPUT(5, Instruction::IPUT, 45u, 800u, 11u),
    569       DEF_IPUT(5, Instruction::IPUT, 45u, 801u, 11u),
    570       DEF_IGET(6, Instruction::IGET, 48u, 800u, 11u),
    571       DEF_IGET(6, Instruction::IGET, 49u, 801u, 11u),  // Same value as read from ref 46u.
    572 
    573       // Invoke doesn't interfere with non-aliasing refs. There's one test above where a reference
    574       // escapes in the left BB (we let a reference escape if we use it to store to an unresolved
    575       // field) and the INVOKE in the right BB shouldn't interfere with that either.
    576       DEF_INVOKE1(5, Instruction::INVOKE_STATIC, 48u),
    577   };
    578 
    579   PrepareIFields(ifields);
    580   PrepareMIRs(mirs);
    581   PerformGVN();
    582   ASSERT_EQ(arraysize(mirs), value_names_.size());
    583   EXPECT_EQ(value_names_[1], value_names_[2]);
    584 
    585   EXPECT_EQ(value_names_[4], value_names_[5]);
    586 
    587   EXPECT_NE(value_names_[7], value_names_[10]);
    588   EXPECT_NE(value_names_[8], value_names_[10]);
    589 
    590   EXPECT_NE(value_names_[12], value_names_[16]);
    591   EXPECT_EQ(value_names_[13], value_names_[16]);
    592 
    593   EXPECT_NE(value_names_[18], value_names_[21]);
    594   EXPECT_EQ(value_names_[19], value_names_[22]);
    595 
    596   EXPECT_EQ(value_names_[26], value_names_[29]);
    597   EXPECT_EQ(value_names_[27], value_names_[30]);
    598 
    599   EXPECT_EQ(value_names_[38], value_names_[39]);
    600 
    601   EXPECT_EQ(value_names_[48], value_names_[49]);
    602 }
    603 
    604 TEST_F(GlobalValueNumberingTestDiamond, AliasingIFieldsSingleObject) {
    605   static const IFieldDef ifields[] = {
    606       { 0u, 1u, 0u, false },  // Int.
    607       { 1u, 1u, 1u, false },  // Int.
    608       { 2u, 1u, 2u, false },  // Int.
    609       { 3u, 1u, 3u, false },  // Int.
    610       { 4u, 1u, 4u, false },  // Short.
    611       { 5u, 1u, 5u, false },  // Char.
    612       { 6u, 0u, 0u, false },  // Unresolved, Short.
    613       { 7u, 1u, 7u, false },  // Int.
    614       { 8u, 1u, 8u, false },  // Int.
    615   };
    616   static const MIRDef mirs[] = {
    617       // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
    618       DEF_IGET(3, Instruction::IGET, 0u, 100u, 0u),
    619       DEF_IGET(6, Instruction::IGET, 1u, 100u, 0u),   // Same as at the top.
    620 
    621       DEF_IGET(4, Instruction::IGET, 2u, 100u, 1u),
    622       DEF_IGET(6, Instruction::IGET, 3u, 100u, 1u),   // Same as at the left side.
    623 
    624       DEF_IGET(3, Instruction::IGET, 4u, 100u, 2u),
    625       DEF_CONST(5, Instruction::CONST, 5u, 1000),
    626       DEF_IPUT(5, Instruction::IPUT, 5u, 100u, 2u),
    627       DEF_IGET(6, Instruction::IGET, 7u, 100u, 2u),   // Differs from the top and the CONST.
    628 
    629       DEF_IGET(3, Instruction::IGET, 8u, 100u, 3u),
    630       DEF_CONST(3, Instruction::CONST, 9u, 2000),
    631       DEF_IPUT(4, Instruction::IPUT, 9u, 100u, 3u),
    632       DEF_IPUT(5, Instruction::IPUT, 9u, 100u, 3u),
    633       DEF_IGET(6, Instruction::IGET, 12u, 100u, 3u),  // Differs from the top, equals the CONST.
    634 
    635       DEF_IGET(3, Instruction::IGET_SHORT, 13u, 100u, 4u),
    636       DEF_IGET(3, Instruction::IGET_CHAR, 14u, 100u, 5u),
    637       DEF_IPUT(4, Instruction::IPUT_SHORT, 15u, 100u, 6u),  // Clobbers field #4, not #5.
    638       DEF_IGET(6, Instruction::IGET_SHORT, 16u, 100u, 4u),  // Differs from the top.
    639       DEF_IGET(6, Instruction::IGET_CHAR, 17u, 100u, 5u),   // Same as the top.
    640 
    641       DEF_CONST(4, Instruction::CONST, 18u, 3000),
    642       DEF_IPUT(4, Instruction::IPUT, 18u, 100u, 7u),
    643       DEF_IPUT(4, Instruction::IPUT, 18u, 100u, 8u),
    644       DEF_CONST(5, Instruction::CONST, 21u, 3001),
    645       DEF_IPUT(5, Instruction::IPUT, 21u, 100u, 7u),
    646       DEF_IPUT(5, Instruction::IPUT, 21u, 100u, 8u),
    647       DEF_IGET(6, Instruction::IGET, 24u, 100u, 7u),
    648       DEF_IGET(6, Instruction::IGET, 25u, 100u, 8u),  // Same value as read from field #7.
    649   };
    650 
    651   PrepareIFields(ifields);
    652   PrepareMIRs(mirs);
    653   PerformGVN();
    654   ASSERT_EQ(arraysize(mirs), value_names_.size());
    655   EXPECT_EQ(value_names_[0], value_names_[1]);
    656 
    657   EXPECT_EQ(value_names_[2], value_names_[3]);
    658 
    659   EXPECT_NE(value_names_[4], value_names_[7]);
    660   EXPECT_NE(value_names_[5], value_names_[7]);
    661 
    662   EXPECT_NE(value_names_[8], value_names_[12]);
    663   EXPECT_EQ(value_names_[9], value_names_[12]);
    664 
    665   EXPECT_NE(value_names_[13], value_names_[16]);
    666   EXPECT_EQ(value_names_[14], value_names_[17]);
    667 
    668   EXPECT_EQ(value_names_[24], value_names_[25]);
    669 }
    670 
    671 TEST_F(GlobalValueNumberingTestDiamond, AliasingIFieldsTwoObjects) {
    672   static const IFieldDef ifields[] = {
    673       { 0u, 1u, 0u, false },  // Int.
    674       { 1u, 1u, 1u, false },  // Int.
    675       { 2u, 1u, 2u, false },  // Int.
    676       { 3u, 1u, 3u, false },  // Int.
    677       { 4u, 1u, 4u, false },  // Short.
    678       { 5u, 1u, 5u, false },  // Char.
    679       { 6u, 0u, 0u, false },  // Unresolved, Short.
    680       { 7u, 1u, 7u, false },  // Int.
    681       { 8u, 1u, 8u, false },  // Int.
    682   };
    683   static const MIRDef mirs[] = {
    684       // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
    685       DEF_IGET(3, Instruction::IGET, 0u, 100u, 0u),
    686       DEF_IPUT(4, Instruction::IPUT, 1u, 101u, 0u),   // May alias with the IGET at the top.
    687       DEF_IGET(6, Instruction::IGET, 2u, 100u, 0u),   // Differs from the top.
    688 
    689       DEF_IGET(3, Instruction::IGET, 3u, 100u, 1u),
    690       DEF_IPUT(5, Instruction::IPUT, 3u, 101u, 1u),   // If aliasing, stores the same value.
    691       DEF_IGET(6, Instruction::IGET, 5u, 100u, 1u),   // Same as the top.
    692 
    693       DEF_IGET(3, Instruction::IGET, 6u, 100u, 2u),
    694       DEF_CONST(5, Instruction::CONST, 7u, 1000),
    695       DEF_IPUT(5, Instruction::IPUT, 7u, 101u, 2u),
    696       DEF_IGET(6, Instruction::IGET, 9u, 100u, 2u),   // Differs from the top and the CONST.
    697 
    698       DEF_IGET(3, Instruction::IGET, 10u, 100u, 3u),
    699       DEF_CONST(3, Instruction::CONST, 11u, 2000),
    700       DEF_IPUT(4, Instruction::IPUT, 11u, 101u, 3u),
    701       DEF_IPUT(5, Instruction::IPUT, 11u, 101u, 3u),
    702       DEF_IGET(6, Instruction::IGET, 14u, 100u, 3u),  // Differs from the top and the CONST.
    703 
    704       DEF_IGET(3, Instruction::IGET_SHORT, 15u, 100u, 4u),
    705       DEF_IGET(3, Instruction::IGET_CHAR, 16u, 100u, 5u),
    706       DEF_IPUT(4, Instruction::IPUT_SHORT, 17u, 101u, 6u),  // Clobbers field #4, not #5.
    707       DEF_IGET(6, Instruction::IGET_SHORT, 18u, 100u, 4u),  // Differs from the top.
    708       DEF_IGET(6, Instruction::IGET_CHAR, 19u, 100u, 5u),   // Same as the top.
    709 
    710       DEF_CONST(4, Instruction::CONST, 20u, 3000),
    711       DEF_IPUT(4, Instruction::IPUT, 20u, 100u, 7u),
    712       DEF_IPUT(4, Instruction::IPUT, 20u, 101u, 8u),
    713       DEF_CONST(5, Instruction::CONST, 23u, 3001),
    714       DEF_IPUT(5, Instruction::IPUT, 23u, 100u, 7u),
    715       DEF_IPUT(5, Instruction::IPUT, 23u, 101u, 8u),
    716       DEF_IGET(6, Instruction::IGET, 26u, 100u, 7u),
    717       DEF_IGET(6, Instruction::IGET, 27u, 101u, 8u),  // Same value as read from field #7.
    718   };
    719 
    720   PrepareIFields(ifields);
    721   PrepareMIRs(mirs);
    722   PerformGVN();
    723   ASSERT_EQ(arraysize(mirs), value_names_.size());
    724   EXPECT_NE(value_names_[0], value_names_[2]);
    725 
    726   EXPECT_EQ(value_names_[3], value_names_[5]);
    727 
    728   EXPECT_NE(value_names_[6], value_names_[9]);
    729   EXPECT_NE(value_names_[7], value_names_[9]);
    730 
    731   EXPECT_NE(value_names_[10], value_names_[14]);
    732   EXPECT_NE(value_names_[10], value_names_[14]);
    733 
    734   EXPECT_NE(value_names_[15], value_names_[18]);
    735   EXPECT_EQ(value_names_[16], value_names_[19]);
    736 
    737   EXPECT_EQ(value_names_[26], value_names_[27]);
    738 }
    739 
    740 TEST_F(GlobalValueNumberingTestDiamond, SFields) {
    741   static const SFieldDef sfields[] = {
    742       { 0u, 1u, 0u, false },  // Int.
    743       { 1u, 1u, 1u, false },  // Int.
    744       { 2u, 1u, 2u, false },  // Int.
    745       { 3u, 1u, 3u, false },  // Int.
    746       { 4u, 1u, 4u, false },  // Short.
    747       { 5u, 1u, 5u, false },  // Char.
    748       { 6u, 0u, 0u, false },  // Unresolved, Short.
    749       { 7u, 1u, 7u, false },  // Int.
    750       { 8u, 1u, 8u, false },  // Int.
    751   };
    752   static const MIRDef mirs[] = {
    753       // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
    754       DEF_SGET(3, Instruction::SGET, 0u, 0u),
    755       DEF_SGET(6, Instruction::SGET, 1u, 0u),         // Same as at the top.
    756 
    757       DEF_SGET(4, Instruction::SGET, 2u, 1u),
    758       DEF_SGET(6, Instruction::SGET, 3u, 1u),         // Same as at the left side.
    759 
    760       DEF_SGET(3, Instruction::SGET, 4u, 2u),
    761       DEF_CONST(5, Instruction::CONST, 5u, 100),
    762       DEF_SPUT(5, Instruction::SPUT, 5u, 2u),
    763       DEF_SGET(6, Instruction::SGET, 7u, 2u),         // Differs from the top and the CONST.
    764 
    765       DEF_SGET(3, Instruction::SGET, 8u, 3u),
    766       DEF_CONST(3, Instruction::CONST, 9u, 200),
    767       DEF_SPUT(4, Instruction::SPUT, 9u, 3u),
    768       DEF_SPUT(5, Instruction::SPUT, 9u, 3u),
    769       DEF_SGET(6, Instruction::SGET, 12u, 3u),        // Differs from the top, equals the CONST.
    770 
    771       DEF_SGET(3, Instruction::SGET_SHORT, 13u, 4u),
    772       DEF_SGET(3, Instruction::SGET_CHAR, 14u, 5u),
    773       DEF_SPUT(4, Instruction::SPUT_SHORT, 15u, 6u),  // Clobbers field #4, not #5.
    774       DEF_SGET(6, Instruction::SGET_SHORT, 16u, 4u),  // Differs from the top.
    775       DEF_SGET(6, Instruction::SGET_CHAR, 17u, 5u),   // Same as the top.
    776 
    777       DEF_CONST(4, Instruction::CONST, 18u, 300),
    778       DEF_SPUT(4, Instruction::SPUT, 18u, 7u),
    779       DEF_SPUT(4, Instruction::SPUT, 18u, 8u),
    780       DEF_CONST(5, Instruction::CONST, 21u, 301),
    781       DEF_SPUT(5, Instruction::SPUT, 21u, 7u),
    782       DEF_SPUT(5, Instruction::SPUT, 21u, 8u),
    783       DEF_SGET(6, Instruction::SGET, 24u, 7u),
    784       DEF_SGET(6, Instruction::SGET, 25u, 8u),        // Same value as read from field #7.
    785   };
    786 
    787   PrepareSFields(sfields);
    788   PrepareMIRs(mirs);
    789   PerformGVN();
    790   ASSERT_EQ(arraysize(mirs), value_names_.size());
    791   EXPECT_EQ(value_names_[0], value_names_[1]);
    792 
    793   EXPECT_EQ(value_names_[2], value_names_[3]);
    794 
    795   EXPECT_NE(value_names_[4], value_names_[7]);
    796   EXPECT_NE(value_names_[5], value_names_[7]);
    797 
    798   EXPECT_NE(value_names_[8], value_names_[12]);
    799   EXPECT_EQ(value_names_[9], value_names_[12]);
    800 
    801   EXPECT_NE(value_names_[13], value_names_[16]);
    802   EXPECT_EQ(value_names_[14], value_names_[17]);
    803 
    804   EXPECT_EQ(value_names_[24], value_names_[25]);
    805 }
    806 
    807 TEST_F(GlobalValueNumberingTestDiamond, NonAliasingArrays) {
    808   static const MIRDef mirs[] = {
    809       // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
    810       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 100u),
    811       DEF_AGET(3, Instruction::AGET, 1u, 100u, 101u),
    812       DEF_AGET(6, Instruction::AGET, 2u, 100u, 101u),   // Same as at the top.
    813 
    814       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 200u),
    815       DEF_IGET(4, Instruction::AGET, 4u, 200u, 201u),
    816       DEF_IGET(6, Instruction::AGET, 5u, 200u, 201u),   // Same as at the left side.
    817 
    818       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 300u),
    819       DEF_AGET(3, Instruction::AGET, 7u, 300u, 301u),
    820       DEF_CONST(5, Instruction::CONST, 8u, 1000),
    821       DEF_APUT(5, Instruction::APUT, 8u, 300u, 301u),
    822       DEF_AGET(6, Instruction::AGET, 10u, 300u, 301u),  // Differs from the top and the CONST.
    823 
    824       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 400u),
    825       DEF_AGET(3, Instruction::AGET, 12u, 400u, 401u),
    826       DEF_CONST(3, Instruction::CONST, 13u, 2000),
    827       DEF_APUT(4, Instruction::APUT, 13u, 400u, 401u),
    828       DEF_APUT(5, Instruction::APUT, 13u, 400u, 401u),
    829       DEF_AGET(6, Instruction::AGET, 16u, 400u, 401u),  // Differs from the top, equals the CONST.
    830 
    831       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 500u),
    832       DEF_AGET(3, Instruction::AGET, 18u, 500u, 501u),
    833       DEF_APUT(4, Instruction::APUT, 19u, 500u, 502u),  // Clobbers value at index 501u.
    834       DEF_AGET(6, Instruction::AGET, 20u, 500u, 501u),  // Differs from the top.
    835 
    836       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 600u),
    837       DEF_CONST(4, Instruction::CONST, 22u, 3000),
    838       DEF_APUT(4, Instruction::APUT, 22u, 600u, 601u),
    839       DEF_APUT(4, Instruction::APUT, 22u, 600u, 602u),
    840       DEF_CONST(5, Instruction::CONST, 25u, 3001),
    841       DEF_APUT(5, Instruction::APUT, 25u, 600u, 601u),
    842       DEF_APUT(5, Instruction::APUT, 25u, 600u, 602u),
    843       DEF_AGET(6, Instruction::AGET, 28u, 600u, 601u),
    844       DEF_AGET(6, Instruction::AGET, 29u, 600u, 602u),  // Same value as read from index 601u.
    845 
    846       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 700u),
    847       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 701u),
    848       DEF_AGET(3, Instruction::AGET, 32u, 700u, 702u),
    849       DEF_APUT(4, Instruction::APUT, 33u, 701u, 702u),  // Doesn't interfere with unrelated array.
    850       DEF_AGET(6, Instruction::AGET, 34u, 700u, 702u),  // Same value as at the top.
    851   };
    852 
    853   PrepareMIRs(mirs);
    854   PerformGVN();
    855   ASSERT_EQ(arraysize(mirs), value_names_.size());
    856   EXPECT_EQ(value_names_[1], value_names_[2]);
    857 
    858   EXPECT_EQ(value_names_[4], value_names_[5]);
    859 
    860   EXPECT_NE(value_names_[7], value_names_[10]);
    861   EXPECT_NE(value_names_[8], value_names_[10]);
    862 
    863   EXPECT_NE(value_names_[12], value_names_[16]);
    864   EXPECT_EQ(value_names_[13], value_names_[16]);
    865 
    866   EXPECT_NE(value_names_[18], value_names_[20]);
    867 
    868   EXPECT_NE(value_names_[28], value_names_[22]);
    869   EXPECT_NE(value_names_[28], value_names_[25]);
    870   EXPECT_EQ(value_names_[28], value_names_[29]);
    871 
    872   EXPECT_EQ(value_names_[32], value_names_[34]);
    873 }
    874 
    875 TEST_F(GlobalValueNumberingTestDiamond, AliasingArrays) {
    876   static const MIRDef mirs[] = {
    877       // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
    878       // NOTE: We're also testing that these tests really do not interfere with each other.
    879 
    880       DEF_AGET(3, Instruction::AGET_BOOLEAN, 0u, 100u, 101u),
    881       DEF_AGET(6, Instruction::AGET_BOOLEAN, 1u, 100u, 101u),  // Same as at the top.
    882 
    883       DEF_IGET(4, Instruction::AGET_OBJECT, 2u, 200u, 201u),
    884       DEF_IGET(6, Instruction::AGET_OBJECT, 3u, 200u, 201u),  // Same as at the left side.
    885 
    886       DEF_AGET(3, Instruction::AGET_WIDE, 4u, 300u, 301u),
    887       DEF_CONST(5, Instruction::CONST_WIDE, 5u, 1000),
    888       DEF_APUT(5, Instruction::APUT_WIDE, 5u, 300u, 301u),
    889       DEF_AGET(6, Instruction::AGET_WIDE, 7u, 300u, 301u),  // Differs from the top and the CONST.
    890 
    891       DEF_AGET(3, Instruction::AGET_SHORT, 8u, 400u, 401u),
    892       DEF_CONST(3, Instruction::CONST, 9u, 2000),
    893       DEF_APUT(4, Instruction::APUT_SHORT, 9u, 400u, 401u),
    894       DEF_APUT(5, Instruction::APUT_SHORT, 9u, 400u, 401u),
    895       DEF_AGET(6, Instruction::AGET_SHORT, 12u, 400u, 401u),  // Differs from the top, == CONST.
    896 
    897       DEF_AGET(3, Instruction::AGET_CHAR, 13u, 500u, 501u),
    898       DEF_APUT(4, Instruction::APUT_CHAR, 14u, 500u, 502u),  // Clobbers value at index 501u.
    899       DEF_AGET(6, Instruction::AGET_CHAR, 15u, 500u, 501u),  // Differs from the top.
    900 
    901       DEF_AGET(3, Instruction::AGET_BYTE, 16u, 600u, 602u),
    902       DEF_APUT(4, Instruction::APUT_BYTE, 17u, 601u, 602u),  // Clobbers values in array 600u.
    903       DEF_AGET(6, Instruction::AGET_BYTE, 18u, 600u, 602u),  // Differs from the top.
    904 
    905       DEF_CONST(4, Instruction::CONST, 19u, 3000),
    906       DEF_APUT(4, Instruction::APUT, 19u, 700u, 701u),
    907       DEF_APUT(4, Instruction::APUT, 19u, 700u, 702u),
    908       DEF_CONST(5, Instruction::CONST, 22u, 3001),
    909       DEF_APUT(5, Instruction::APUT, 22u, 700u, 701u),
    910       DEF_APUT(5, Instruction::APUT, 22u, 700u, 702u),
    911       DEF_AGET(6, Instruction::AGET, 25u, 700u, 701u),
    912       DEF_AGET(6, Instruction::AGET, 26u, 700u, 702u),  // Same value as read from index 601u.
    913   };
    914 
    915   PrepareMIRs(mirs);
    916   PerformGVN();
    917   ASSERT_EQ(arraysize(mirs), value_names_.size());
    918   EXPECT_EQ(value_names_[0], value_names_[1]);
    919 
    920   EXPECT_EQ(value_names_[2], value_names_[3]);
    921 
    922   EXPECT_NE(value_names_[4], value_names_[7]);
    923   EXPECT_NE(value_names_[5], value_names_[7]);
    924 
    925   EXPECT_NE(value_names_[8], value_names_[12]);
    926   EXPECT_EQ(value_names_[9], value_names_[12]);
    927 
    928   EXPECT_NE(value_names_[13], value_names_[15]);
    929 
    930   EXPECT_NE(value_names_[16], value_names_[18]);
    931 
    932   EXPECT_NE(value_names_[25], value_names_[19]);
    933   EXPECT_NE(value_names_[25], value_names_[22]);
    934   EXPECT_EQ(value_names_[25], value_names_[26]);
    935 }
    936 
    937 TEST_F(GlobalValueNumberingTestDiamond, Phi) {
    938   static const MIRDef mirs[] = {
    939       DEF_CONST(3, Instruction::CONST, 0u, 1000),
    940       DEF_CONST(4, Instruction::CONST, 1u, 2000),
    941       DEF_CONST(5, Instruction::CONST, 2u, 3000),
    942       DEF_MOVE(4, Instruction::MOVE, 3u, 0u),
    943       DEF_MOVE(4, Instruction::MOVE, 4u, 1u),
    944       DEF_MOVE(5, Instruction::MOVE, 5u, 0u),
    945       DEF_MOVE(5, Instruction::MOVE, 6u, 2u),
    946       DEF_PHI2(6, 7u, 3u, 5u),    // Same as CONST 0u (1000).
    947       DEF_PHI2(6, 8u, 3u, 0u),    // Same as CONST 0u (1000).
    948       DEF_PHI2(6, 9u, 0u, 5u),    // Same as CONST 0u (1000).
    949       DEF_PHI2(6, 10u, 4u, 5u),   // Merge 1u (2000) and 0u (1000).
    950       DEF_PHI2(6, 11u, 1u, 5u),   // Merge 1u (2000) and 0u (1000).
    951       DEF_PHI2(6, 12u, 4u, 0u),   // Merge 1u (2000) and 0u (1000).
    952       DEF_PHI2(6, 13u, 1u, 0u),   // Merge 1u (2000) and 0u (1000).
    953       DEF_PHI2(6, 14u, 3u, 6u),   // Merge 0u (1000) and 2u (3000).
    954       DEF_PHI2(6, 15u, 0u, 6u),   // Merge 0u (1000) and 2u (3000).
    955       DEF_PHI2(6, 16u, 3u, 2u),   // Merge 0u (1000) and 2u (3000).
    956       DEF_PHI2(6, 17u, 0u, 2u),   // Merge 0u (1000) and 2u (3000).
    957       DEF_PHI2(6, 18u, 4u, 6u),   // Merge 1u (2000) and 2u (3000).
    958       DEF_PHI2(6, 19u, 1u, 6u),   // Merge 1u (2000) and 2u (3000).
    959       DEF_PHI2(6, 20u, 4u, 2u),   // Merge 1u (2000) and 2u (3000).
    960       DEF_PHI2(6, 21u, 1u, 2u),   // Merge 1u (2000) and 2u (3000).
    961   };
    962 
    963   PrepareMIRs(mirs);
    964   PerformGVN();
    965   ASSERT_EQ(arraysize(mirs), value_names_.size());
    966   EXPECT_EQ(value_names_[0], value_names_[7]);
    967   EXPECT_EQ(value_names_[0], value_names_[8]);
    968   EXPECT_EQ(value_names_[0], value_names_[9]);
    969   EXPECT_NE(value_names_[10], value_names_[0]);
    970   EXPECT_NE(value_names_[10], value_names_[1]);
    971   EXPECT_NE(value_names_[10], value_names_[2]);
    972   EXPECT_EQ(value_names_[10], value_names_[11]);
    973   EXPECT_EQ(value_names_[10], value_names_[12]);
    974   EXPECT_EQ(value_names_[10], value_names_[13]);
    975   EXPECT_NE(value_names_[14], value_names_[0]);
    976   EXPECT_NE(value_names_[14], value_names_[1]);
    977   EXPECT_NE(value_names_[14], value_names_[2]);
    978   EXPECT_NE(value_names_[14], value_names_[10]);
    979   EXPECT_EQ(value_names_[14], value_names_[15]);
    980   EXPECT_EQ(value_names_[14], value_names_[16]);
    981   EXPECT_EQ(value_names_[14], value_names_[17]);
    982   EXPECT_NE(value_names_[18], value_names_[0]);
    983   EXPECT_NE(value_names_[18], value_names_[1]);
    984   EXPECT_NE(value_names_[18], value_names_[2]);
    985   EXPECT_NE(value_names_[18], value_names_[10]);
    986   EXPECT_NE(value_names_[18], value_names_[14]);
    987   EXPECT_EQ(value_names_[18], value_names_[19]);
    988   EXPECT_EQ(value_names_[18], value_names_[20]);
    989   EXPECT_EQ(value_names_[18], value_names_[21]);
    990 }
    991 
    992 TEST_F(GlobalValueNumberingTestLoop, NonAliasingIFields) {
    993   static const IFieldDef ifields[] = {
    994       { 0u, 1u, 0u, false },  // Int.
    995       { 1u, 1u, 1u, false },  // Int.
    996       { 2u, 1u, 2u, false },  // Int.
    997       { 3u, 1u, 3u, false },  // Int.
    998       { 4u, 1u, 4u, false },  // Int.
    999       { 5u, 1u, 5u, false },  // Short.
   1000       { 6u, 1u, 6u, false },  // Char.
   1001       { 7u, 0u, 0u, false },  // Unresolved, Short.
   1002       { 8u, 1u, 8u, false },  // Int.
   1003       { 9u, 0u, 0u, false },  // Unresolved, Int.
   1004       { 10u, 1u, 10u, false },  // Int.
   1005       { 11u, 1u, 11u, false },  // Int.
   1006   };
   1007   static const MIRDef mirs[] = {
   1008       // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
   1009       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 100u),
   1010       DEF_IGET(3, Instruction::IGET, 1u, 100u, 0u),
   1011       DEF_IGET(4, Instruction::IGET, 2u, 100u, 0u),   // Same as at the top.
   1012       DEF_IGET(5, Instruction::IGET, 3u, 100u, 0u),   // Same as at the top.
   1013 
   1014       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 200u),
   1015       DEF_IGET(3, Instruction::IGET, 5u, 200u, 1u),
   1016       DEF_IGET(4, Instruction::IGET, 6u, 200u, 1u),   // Differs from top...
   1017       DEF_IPUT(4, Instruction::IPUT, 7u, 200u, 1u),   // Because of this IPUT.
   1018       DEF_IGET(5, Instruction::IGET, 8u, 200u, 1u),   // Differs from top and the loop IGET.
   1019 
   1020       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 300u),
   1021       DEF_IGET(3, Instruction::IGET, 10u, 300u, 2u),
   1022       DEF_IPUT(4, Instruction::IPUT, 11u, 300u, 2u),  // Because of this IPUT...
   1023       DEF_IGET(4, Instruction::IGET, 12u, 300u, 2u),  // Differs from top.
   1024       DEF_IGET(5, Instruction::IGET, 13u, 300u, 2u),  // Differs from top but same as the loop IGET.
   1025 
   1026       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 400u),
   1027       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 401u),
   1028       DEF_CONST(3, Instruction::CONST, 16u, 3000),
   1029       DEF_IPUT(3, Instruction::IPUT, 16u, 400u, 3u),
   1030       DEF_IPUT(3, Instruction::IPUT, 16u, 400u, 4u),
   1031       DEF_IPUT(3, Instruction::IPUT, 16u, 401u, 3u),
   1032       DEF_IGET(4, Instruction::IGET, 20u, 400u, 3u),  // Differs from 16u and 23u.
   1033       DEF_IGET(4, Instruction::IGET, 21u, 400u, 4u),  // Same as 20u.
   1034       DEF_IGET(4, Instruction::IGET, 22u, 401u, 3u),  // Same as 20u.
   1035       DEF_CONST(4, Instruction::CONST, 23u, 4000),
   1036       DEF_IPUT(4, Instruction::IPUT, 23u, 400u, 3u),
   1037       DEF_IPUT(4, Instruction::IPUT, 23u, 400u, 4u),
   1038       DEF_IPUT(4, Instruction::IPUT, 23u, 401u, 3u),
   1039       DEF_IGET(5, Instruction::IGET, 27u, 400u, 3u),  // Differs from 16u and 20u...
   1040       DEF_IGET(5, Instruction::IGET, 28u, 400u, 4u),  // and same as the CONST 23u
   1041       DEF_IGET(5, Instruction::IGET, 29u, 400u, 4u),  // and same as the CONST 23u.
   1042 
   1043       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 500u),
   1044       DEF_IGET(3, Instruction::IGET_SHORT, 31u, 500u, 5u),
   1045       DEF_IGET(3, Instruction::IGET_CHAR, 32u, 500u, 6u),
   1046       DEF_IPUT(4, Instruction::IPUT_SHORT, 33u, 500u, 7u),  // Clobbers field #5, not #6.
   1047       DEF_IGET(5, Instruction::IGET_SHORT, 34u, 500u, 5u),  // Differs from the top.
   1048       DEF_IGET(5, Instruction::IGET_CHAR, 35u, 500u, 6u),   // Same as the top.
   1049 
   1050       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 600u),
   1051       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 601u),
   1052       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 602u),
   1053       DEF_IGET(3, Instruction::IGET, 39u, 600u, 8u),
   1054       DEF_IGET(3, Instruction::IGET, 40u, 601u, 8u),
   1055       DEF_IPUT(4, Instruction::IPUT, 41u, 602u, 9u),  // Doesn't clobber field #8 for other refs.
   1056       DEF_IGET(5, Instruction::IGET, 42u, 600u, 8u),  // Same as the top.
   1057       DEF_IGET(5, Instruction::IGET, 43u, 601u, 8u),  // Same as the top.
   1058 
   1059       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 700u),
   1060       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 701u),
   1061       DEF_CONST(3, Instruction::CONST, 46u, 3000),
   1062       DEF_IPUT(3, Instruction::IPUT, 46u, 700u, 10u),
   1063       DEF_IPUT(3, Instruction::IPUT, 46u, 700u, 11u),
   1064       DEF_IPUT(3, Instruction::IPUT, 46u, 701u, 10u),
   1065       DEF_IGET(4, Instruction::IGET, 50u, 700u, 10u),  // Differs from the CONSTs 46u and 53u.
   1066       DEF_IGET(4, Instruction::IGET, 51u, 700u, 11u),  // Same as 50u.
   1067       DEF_IGET(4, Instruction::IGET, 52u, 701u, 10u),  // Same as 50u.
   1068       DEF_CONST(4, Instruction::CONST, 53u, 3001),
   1069       DEF_IPUT(4, Instruction::IPUT, 53u, 700u, 10u),
   1070       DEF_IPUT(4, Instruction::IPUT, 53u, 700u, 11u),
   1071       DEF_IPUT(4, Instruction::IPUT, 53u, 701u, 10u),
   1072       DEF_IGET(5, Instruction::IGET, 57u, 700u, 10u),  // Same as the CONST 53u.
   1073       DEF_IGET(5, Instruction::IGET, 58u, 700u, 11u),  // Same as the CONST 53u.
   1074       DEF_IGET(5, Instruction::IGET, 59u, 701u, 10u),  // Same as the CONST 53u.
   1075   };
   1076 
   1077   PrepareIFields(ifields);
   1078   PrepareMIRs(mirs);
   1079   PerformGVN();
   1080   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1081   EXPECT_EQ(value_names_[1], value_names_[2]);
   1082   EXPECT_EQ(value_names_[1], value_names_[3]);
   1083 
   1084   EXPECT_NE(value_names_[5], value_names_[6]);
   1085   EXPECT_NE(value_names_[5], value_names_[7]);
   1086   EXPECT_NE(value_names_[6], value_names_[7]);
   1087 
   1088   EXPECT_NE(value_names_[10], value_names_[12]);
   1089   EXPECT_EQ(value_names_[12], value_names_[13]);
   1090 
   1091   EXPECT_NE(value_names_[20], value_names_[16]);
   1092   EXPECT_NE(value_names_[20], value_names_[23]);
   1093   EXPECT_EQ(value_names_[20], value_names_[21]);
   1094   EXPECT_EQ(value_names_[20], value_names_[22]);
   1095   EXPECT_NE(value_names_[27], value_names_[16]);
   1096   EXPECT_NE(value_names_[27], value_names_[20]);
   1097   EXPECT_EQ(value_names_[27], value_names_[28]);
   1098   EXPECT_EQ(value_names_[27], value_names_[29]);
   1099 
   1100   EXPECT_NE(value_names_[31], value_names_[34]);
   1101   EXPECT_EQ(value_names_[32], value_names_[35]);
   1102 
   1103   EXPECT_EQ(value_names_[39], value_names_[42]);
   1104   EXPECT_EQ(value_names_[40], value_names_[43]);
   1105 
   1106   EXPECT_NE(value_names_[50], value_names_[46]);
   1107   EXPECT_NE(value_names_[50], value_names_[53]);
   1108   EXPECT_EQ(value_names_[50], value_names_[51]);
   1109   EXPECT_EQ(value_names_[50], value_names_[52]);
   1110   EXPECT_EQ(value_names_[57], value_names_[53]);
   1111   EXPECT_EQ(value_names_[58], value_names_[53]);
   1112   EXPECT_EQ(value_names_[59], value_names_[53]);
   1113 }
   1114 
   1115 TEST_F(GlobalValueNumberingTestLoop, AliasingIFieldsSingleObject) {
   1116   static const IFieldDef ifields[] = {
   1117       { 0u, 1u, 0u, false },  // Int.
   1118       { 1u, 1u, 1u, false },  // Int.
   1119       { 2u, 1u, 2u, false },  // Int.
   1120       { 3u, 1u, 3u, false },  // Int.
   1121       { 4u, 1u, 4u, false },  // Int.
   1122       { 5u, 1u, 5u, false },  // Short.
   1123       { 6u, 1u, 6u, false },  // Char.
   1124       { 7u, 0u, 0u, false },  // Unresolved, Short.
   1125   };
   1126   static const MIRDef mirs[] = {
   1127       // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
   1128       DEF_IGET(3, Instruction::IGET, 0u, 100u, 0u),
   1129       DEF_IGET(4, Instruction::IGET, 1u, 100u, 0u),   // Same as at the top.
   1130       DEF_IGET(5, Instruction::IGET, 2u, 100u, 0u),   // Same as at the top.
   1131 
   1132       DEF_IGET(3, Instruction::IGET, 3u, 100u, 1u),
   1133       DEF_IGET(4, Instruction::IGET, 4u, 100u, 1u),   // Differs from top...
   1134       DEF_IPUT(4, Instruction::IPUT, 5u, 100u, 1u),   // Because of this IPUT.
   1135       DEF_IGET(5, Instruction::IGET, 6u, 100u, 1u),   // Differs from top and the loop IGET.
   1136 
   1137       DEF_IGET(3, Instruction::IGET, 7u, 100u, 2u),
   1138       DEF_IPUT(4, Instruction::IPUT, 8u, 100u, 2u),   // Because of this IPUT...
   1139       DEF_IGET(4, Instruction::IGET, 9u, 100u, 2u),   // Differs from top.
   1140       DEF_IGET(5, Instruction::IGET, 10u, 100u, 2u),  // Differs from top but same as the loop IGET.
   1141 
   1142       DEF_CONST(3, Instruction::CONST, 11u, 3000),
   1143       DEF_IPUT(3, Instruction::IPUT, 11u, 100u, 3u),
   1144       DEF_IPUT(3, Instruction::IPUT, 11u, 100u, 4u),
   1145       DEF_IGET(4, Instruction::IGET, 14u, 100u, 3u),  // Differs from 11u and 16u.
   1146       DEF_IGET(4, Instruction::IGET, 15u, 100u, 4u),  // Same as 14u.
   1147       DEF_CONST(4, Instruction::CONST, 16u, 4000),
   1148       DEF_IPUT(4, Instruction::IPUT, 16u, 100u, 3u),
   1149       DEF_IPUT(4, Instruction::IPUT, 16u, 100u, 4u),
   1150       DEF_IGET(5, Instruction::IGET, 19u, 100u, 3u),  // Differs from 11u and 14u...
   1151       DEF_IGET(5, Instruction::IGET, 20u, 100u, 4u),  // and same as the CONST 16u.
   1152 
   1153       DEF_IGET(3, Instruction::IGET_SHORT, 21u, 100u, 5u),
   1154       DEF_IGET(3, Instruction::IGET_CHAR, 22u, 100u, 6u),
   1155       DEF_IPUT(4, Instruction::IPUT_SHORT, 23u, 100u, 7u),  // Clobbers field #5, not #6.
   1156       DEF_IGET(5, Instruction::IGET_SHORT, 24u, 100u, 5u),  // Differs from the top.
   1157       DEF_IGET(5, Instruction::IGET_CHAR, 25u, 100u, 6u),   // Same as the top.
   1158   };
   1159 
   1160   PrepareIFields(ifields);
   1161   PrepareMIRs(mirs);
   1162   PerformGVN();
   1163   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1164   EXPECT_EQ(value_names_[0], value_names_[1]);
   1165   EXPECT_EQ(value_names_[0], value_names_[2]);
   1166 
   1167   EXPECT_NE(value_names_[3], value_names_[4]);
   1168   EXPECT_NE(value_names_[3], value_names_[6]);
   1169   EXPECT_NE(value_names_[4], value_names_[6]);
   1170 
   1171   EXPECT_NE(value_names_[7], value_names_[9]);
   1172   EXPECT_EQ(value_names_[9], value_names_[10]);
   1173 
   1174   EXPECT_NE(value_names_[14], value_names_[11]);
   1175   EXPECT_NE(value_names_[14], value_names_[16]);
   1176   EXPECT_EQ(value_names_[14], value_names_[15]);
   1177   EXPECT_NE(value_names_[19], value_names_[11]);
   1178   EXPECT_NE(value_names_[19], value_names_[14]);
   1179   EXPECT_EQ(value_names_[19], value_names_[16]);
   1180   EXPECT_EQ(value_names_[19], value_names_[20]);
   1181 
   1182   EXPECT_NE(value_names_[21], value_names_[24]);
   1183   EXPECT_EQ(value_names_[22], value_names_[25]);
   1184 }
   1185 
   1186 TEST_F(GlobalValueNumberingTestLoop, AliasingIFieldsTwoObjects) {
   1187   static const IFieldDef ifields[] = {
   1188       { 0u, 1u, 0u, false },  // Int.
   1189       { 1u, 1u, 1u, false },  // Int.
   1190       { 2u, 1u, 2u, false },  // Int.
   1191       { 3u, 1u, 3u, false },  // Short.
   1192       { 4u, 1u, 4u, false },  // Char.
   1193       { 5u, 0u, 0u, false },  // Unresolved, Short.
   1194       { 6u, 1u, 6u, false },  // Int.
   1195       { 7u, 1u, 7u, false },  // Int.
   1196   };
   1197   static const MIRDef mirs[] = {
   1198       // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
   1199       DEF_IGET(3, Instruction::IGET, 0u, 100u, 0u),
   1200       DEF_IPUT(4, Instruction::IPUT, 1u, 101u, 0u),   // May alias with the IGET at the top.
   1201       DEF_IGET(5, Instruction::IGET, 2u, 100u, 0u),   // Differs from the top.
   1202 
   1203       DEF_IGET(3, Instruction::IGET, 3u, 100u, 1u),
   1204       DEF_IPUT(4, Instruction::IPUT, 3u, 101u, 1u),   // If aliasing, stores the same value.
   1205       DEF_IGET(5, Instruction::IGET, 5u, 100u, 1u),   // Same as the top.
   1206 
   1207       DEF_IGET(3, Instruction::IGET, 6u, 100u, 2u),
   1208       DEF_CONST(4, Instruction::CONST, 7u, 1000),
   1209       DEF_IPUT(4, Instruction::IPUT, 7u, 101u, 2u),
   1210       DEF_IGET(5, Instruction::IGET, 9u, 100u, 2u),   // Differs from the top and the CONST.
   1211 
   1212       DEF_IGET(3, Instruction::IGET_SHORT, 10u, 100u, 3u),
   1213       DEF_IGET(3, Instruction::IGET_CHAR, 11u, 100u, 4u),
   1214       DEF_IPUT(4, Instruction::IPUT_SHORT, 12u, 101u, 5u),  // Clobbers field #3, not #4.
   1215       DEF_IGET(5, Instruction::IGET_SHORT, 13u, 100u, 3u),  // Differs from the top.
   1216       DEF_IGET(5, Instruction::IGET_CHAR, 14u, 100u, 4u),   // Same as the top.
   1217 
   1218       DEF_CONST(3, Instruction::CONST, 15u, 3000),
   1219       DEF_IPUT(3, Instruction::IPUT, 15u, 100u, 6u),
   1220       DEF_IPUT(3, Instruction::IPUT, 15u, 100u, 7u),
   1221       DEF_IPUT(3, Instruction::IPUT, 15u, 101u, 6u),
   1222       DEF_IGET(4, Instruction::IGET, 19u, 100u, 6u),  // Differs from CONSTs 15u and 22u.
   1223       DEF_IGET(4, Instruction::IGET, 20u, 100u, 7u),  // Same value as 19u.
   1224       DEF_IGET(4, Instruction::IGET, 21u, 101u, 6u),  // Same value as read from field #7.
   1225       DEF_CONST(4, Instruction::CONST, 22u, 3001),
   1226       DEF_IPUT(4, Instruction::IPUT, 22u, 100u, 6u),
   1227       DEF_IPUT(4, Instruction::IPUT, 22u, 100u, 7u),
   1228       DEF_IPUT(4, Instruction::IPUT, 22u, 101u, 6u),
   1229       DEF_IGET(5, Instruction::IGET, 26u, 100u, 6u),  // Same as CONST 22u.
   1230       DEF_IGET(5, Instruction::IGET, 27u, 100u, 7u),  // Same as CONST 22u.
   1231       DEF_IGET(5, Instruction::IGET, 28u, 101u, 6u),  // Same as CONST 22u.
   1232   };
   1233 
   1234   PrepareIFields(ifields);
   1235   PrepareMIRs(mirs);
   1236   PerformGVN();
   1237   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1238   EXPECT_NE(value_names_[0], value_names_[2]);
   1239 
   1240   EXPECT_EQ(value_names_[3], value_names_[5]);
   1241 
   1242   EXPECT_NE(value_names_[6], value_names_[9]);
   1243   EXPECT_NE(value_names_[7], value_names_[9]);
   1244 
   1245   EXPECT_NE(value_names_[10], value_names_[13]);
   1246   EXPECT_EQ(value_names_[11], value_names_[14]);
   1247 
   1248   EXPECT_NE(value_names_[19], value_names_[15]);
   1249   EXPECT_NE(value_names_[19], value_names_[22]);
   1250   EXPECT_EQ(value_names_[22], value_names_[26]);
   1251   EXPECT_EQ(value_names_[22], value_names_[27]);
   1252   EXPECT_EQ(value_names_[22], value_names_[28]);
   1253 }
   1254 
   1255 TEST_F(GlobalValueNumberingTestLoop, IFieldToBaseDependency) {
   1256   static const IFieldDef ifields[] = {
   1257       { 0u, 1u, 0u, false },  // Int.
   1258   };
   1259   static const MIRDef mirs[] = {
   1260       // For the IGET that loads sreg 3u using base 2u, the following IPUT creates a dependency
   1261       // from the field value to the base. However, this dependency does not result in an
   1262       // infinite loop since the merge of the field value for base 0u gets assigned a value name
   1263       // based only on the base 0u, not on the actual value, and breaks the dependency cycle.
   1264       DEF_IGET(3, Instruction::IGET, 0u, 100u, 0u),
   1265       DEF_IGET(3, Instruction::IGET, 1u, 0u, 0u),
   1266       DEF_IGET(4, Instruction::IGET, 2u, 0u, 0u),
   1267       DEF_IGET(4, Instruction::IGET, 3u, 2u, 0u),
   1268       DEF_IPUT(4, Instruction::IPUT, 3u, 0u, 0u),
   1269       DEF_IGET(5, Instruction::IGET, 5u, 0u, 0u),
   1270   };
   1271 
   1272   PrepareIFields(ifields);
   1273   PrepareMIRs(mirs);
   1274   PerformGVN();
   1275   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1276   EXPECT_NE(value_names_[1], value_names_[2]);
   1277   EXPECT_EQ(value_names_[3], value_names_[5]);
   1278 }
   1279 
   1280 TEST_F(GlobalValueNumberingTestLoop, SFields) {
   1281   static const SFieldDef sfields[] = {
   1282       { 0u, 1u, 0u, false },  // Int.
   1283       { 1u, 1u, 1u, false },  // Int.
   1284       { 2u, 1u, 2u, false },  // Int.
   1285   };
   1286   static const MIRDef mirs[] = {
   1287       // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
   1288       DEF_SGET(3, Instruction::SGET, 0u, 0u),
   1289       DEF_SGET(4, Instruction::SGET, 1u, 0u),         // Same as at the top.
   1290       DEF_SGET(5, Instruction::SGET, 2u, 0u),         // Same as at the top.
   1291 
   1292       DEF_SGET(3, Instruction::SGET, 3u, 1u),
   1293       DEF_SGET(4, Instruction::SGET, 4u, 1u),         // Differs from top...
   1294       DEF_SPUT(4, Instruction::SPUT, 5u, 1u),         // Because of this SPUT.
   1295       DEF_SGET(5, Instruction::SGET, 6u, 1u),         // Differs from top and the loop SGET.
   1296 
   1297       DEF_SGET(3, Instruction::SGET, 7u, 2u),
   1298       DEF_SPUT(4, Instruction::SPUT, 8u, 2u),         // Because of this SPUT...
   1299       DEF_SGET(4, Instruction::SGET, 9u, 2u),         // Differs from top.
   1300       DEF_SGET(5, Instruction::SGET, 10u, 2u),        // Differs from top but same as the loop SGET.
   1301   };
   1302 
   1303   PrepareSFields(sfields);
   1304   PrepareMIRs(mirs);
   1305   PerformGVN();
   1306   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1307   EXPECT_EQ(value_names_[0], value_names_[1]);
   1308   EXPECT_EQ(value_names_[0], value_names_[2]);
   1309 
   1310   EXPECT_NE(value_names_[3], value_names_[4]);
   1311   EXPECT_NE(value_names_[3], value_names_[6]);
   1312   EXPECT_NE(value_names_[4], value_names_[5]);
   1313 
   1314   EXPECT_NE(value_names_[7], value_names_[9]);
   1315   EXPECT_EQ(value_names_[9], value_names_[10]);
   1316 }
   1317 
   1318 TEST_F(GlobalValueNumberingTestLoop, NonAliasingArrays) {
   1319   static const MIRDef mirs[] = {
   1320       // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
   1321       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 100u),
   1322       DEF_AGET(3, Instruction::AGET, 1u, 100u, 101u),
   1323       DEF_AGET(4, Instruction::AGET, 2u, 100u, 101u),   // Same as at the top.
   1324       DEF_AGET(5, Instruction::AGET, 3u, 100u, 101u),   // Same as at the top.
   1325 
   1326       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 200u),
   1327       DEF_AGET(3, Instruction::AGET, 5u, 200u, 201u),
   1328       DEF_AGET(4, Instruction::AGET, 6u, 200u, 201u),  // Differs from top...
   1329       DEF_APUT(4, Instruction::APUT, 7u, 200u, 201u),  // Because of this IPUT.
   1330       DEF_AGET(5, Instruction::AGET, 8u, 200u, 201u),  // Differs from top and the loop AGET.
   1331 
   1332       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 300u),
   1333       DEF_AGET(3, Instruction::AGET, 10u, 300u, 301u),
   1334       DEF_APUT(4, Instruction::APUT, 11u, 300u, 301u),  // Because of this IPUT...
   1335       DEF_AGET(4, Instruction::AGET, 12u, 300u, 301u),  // Differs from top.
   1336       DEF_AGET(5, Instruction::AGET, 13u, 300u, 301u),  // Differs from top but == the loop AGET.
   1337 
   1338       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 400u),
   1339       DEF_CONST(3, Instruction::CONST, 15u, 3000),
   1340       DEF_APUT(3, Instruction::APUT, 15u, 400u, 401u),
   1341       DEF_APUT(3, Instruction::APUT, 15u, 400u, 402u),
   1342       DEF_AGET(4, Instruction::AGET, 18u, 400u, 401u),  // Differs from 15u and 20u.
   1343       DEF_AGET(4, Instruction::AGET, 19u, 400u, 402u),  // Same as 18u.
   1344       DEF_CONST(4, Instruction::CONST, 20u, 4000),
   1345       DEF_APUT(4, Instruction::APUT, 20u, 400u, 401u),
   1346       DEF_APUT(4, Instruction::APUT, 20u, 400u, 402u),
   1347       DEF_AGET(5, Instruction::AGET, 23u, 400u, 401u),  // Differs from 15u and 18u...
   1348       DEF_AGET(5, Instruction::AGET, 24u, 400u, 402u),  // and same as the CONST 20u.
   1349 
   1350       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 500u),
   1351       DEF_AGET(3, Instruction::AGET, 26u, 500u, 501u),
   1352       DEF_APUT(4, Instruction::APUT, 27u, 500u, 502u),  // Clobbers element at index 501u.
   1353       DEF_AGET(5, Instruction::AGET, 28u, 500u, 501u),  // Differs from the top.
   1354   };
   1355 
   1356   PrepareMIRs(mirs);
   1357   PerformGVN();
   1358   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1359   EXPECT_EQ(value_names_[1], value_names_[2]);
   1360   EXPECT_EQ(value_names_[1], value_names_[3]);
   1361 
   1362   EXPECT_NE(value_names_[5], value_names_[6]);
   1363   EXPECT_NE(value_names_[5], value_names_[8]);
   1364   EXPECT_NE(value_names_[6], value_names_[8]);
   1365 
   1366   EXPECT_NE(value_names_[10], value_names_[12]);
   1367   EXPECT_EQ(value_names_[12], value_names_[13]);
   1368 
   1369   EXPECT_NE(value_names_[18], value_names_[15]);
   1370   EXPECT_NE(value_names_[18], value_names_[20]);
   1371   EXPECT_EQ(value_names_[18], value_names_[19]);
   1372   EXPECT_NE(value_names_[23], value_names_[15]);
   1373   EXPECT_NE(value_names_[23], value_names_[18]);
   1374   EXPECT_EQ(value_names_[23], value_names_[20]);
   1375   EXPECT_EQ(value_names_[23], value_names_[24]);
   1376 
   1377   EXPECT_NE(value_names_[26], value_names_[28]);
   1378 }
   1379 
   1380 TEST_F(GlobalValueNumberingTestLoop, AliasingArrays) {
   1381   static const MIRDef mirs[] = {
   1382       // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
   1383       DEF_AGET(3, Instruction::AGET_WIDE, 0u, 100u, 101u),
   1384       DEF_AGET(4, Instruction::AGET_WIDE, 1u, 100u, 101u),   // Same as at the top.
   1385       DEF_AGET(5, Instruction::AGET_WIDE, 2u, 100u, 101u),   // Same as at the top.
   1386 
   1387       DEF_AGET(3, Instruction::AGET_BYTE, 3u, 200u, 201u),
   1388       DEF_AGET(4, Instruction::AGET_BYTE, 4u, 200u, 201u),  // Differs from top...
   1389       DEF_APUT(4, Instruction::APUT_BYTE, 5u, 200u, 201u),  // Because of this IPUT.
   1390       DEF_AGET(5, Instruction::AGET_BYTE, 6u, 200u, 201u),  // Differs from top and the loop AGET.
   1391 
   1392       DEF_AGET(3, Instruction::AGET, 7u, 300u, 301u),
   1393       DEF_APUT(4, Instruction::APUT, 8u, 300u, 301u),   // Because of this IPUT...
   1394       DEF_AGET(4, Instruction::AGET, 9u, 300u, 301u),   // Differs from top.
   1395       DEF_AGET(5, Instruction::AGET, 10u, 300u, 301u),  // Differs from top but == the loop AGET.
   1396 
   1397       DEF_CONST(3, Instruction::CONST, 11u, 3000),
   1398       DEF_APUT(3, Instruction::APUT_CHAR, 11u, 400u, 401u),
   1399       DEF_APUT(3, Instruction::APUT_CHAR, 11u, 400u, 402u),
   1400       DEF_AGET(4, Instruction::AGET_CHAR, 14u, 400u, 401u),  // Differs from 11u and 16u.
   1401       DEF_AGET(4, Instruction::AGET_CHAR, 15u, 400u, 402u),  // Same as 14u.
   1402       DEF_CONST(4, Instruction::CONST, 16u, 4000),
   1403       DEF_APUT(4, Instruction::APUT_CHAR, 16u, 400u, 401u),
   1404       DEF_APUT(4, Instruction::APUT_CHAR, 16u, 400u, 402u),
   1405       DEF_AGET(5, Instruction::AGET_CHAR, 19u, 400u, 401u),  // Differs from 11u and 14u...
   1406       DEF_AGET(5, Instruction::AGET_CHAR, 20u, 400u, 402u),  // and same as the CONST 16u.
   1407 
   1408       DEF_AGET(3, Instruction::AGET_SHORT, 21u, 500u, 501u),
   1409       DEF_APUT(4, Instruction::APUT_SHORT, 22u, 500u, 502u),  // Clobbers element at index 501u.
   1410       DEF_AGET(5, Instruction::AGET_SHORT, 23u, 500u, 501u),  // Differs from the top.
   1411 
   1412       DEF_AGET(3, Instruction::AGET_OBJECT, 24u, 600u, 601u),
   1413       DEF_APUT(4, Instruction::APUT_OBJECT, 25u, 601u, 602u),  // Clobbers 600u/601u.
   1414       DEF_AGET(5, Instruction::AGET_OBJECT, 26u, 600u, 601u),  // Differs from the top.
   1415 
   1416       DEF_AGET(3, Instruction::AGET_BOOLEAN, 27u, 700u, 701u),
   1417       DEF_APUT(4, Instruction::APUT_BOOLEAN, 27u, 701u, 702u),  // Storing the same value.
   1418       DEF_AGET(5, Instruction::AGET_BOOLEAN, 29u, 700u, 701u),  // Differs from the top.
   1419   };
   1420 
   1421   PrepareMIRs(mirs);
   1422   PerformGVN();
   1423   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1424   EXPECT_EQ(value_names_[0], value_names_[1]);
   1425   EXPECT_EQ(value_names_[0], value_names_[2]);
   1426 
   1427   EXPECT_NE(value_names_[3], value_names_[4]);
   1428   EXPECT_NE(value_names_[3], value_names_[6]);
   1429   EXPECT_NE(value_names_[4], value_names_[6]);
   1430 
   1431   EXPECT_NE(value_names_[7], value_names_[9]);
   1432   EXPECT_EQ(value_names_[9], value_names_[10]);
   1433 
   1434   EXPECT_NE(value_names_[14], value_names_[11]);
   1435   EXPECT_NE(value_names_[14], value_names_[16]);
   1436   EXPECT_EQ(value_names_[14], value_names_[15]);
   1437   EXPECT_NE(value_names_[19], value_names_[11]);
   1438   EXPECT_NE(value_names_[19], value_names_[14]);
   1439   EXPECT_EQ(value_names_[19], value_names_[16]);
   1440   EXPECT_EQ(value_names_[19], value_names_[20]);
   1441 
   1442   EXPECT_NE(value_names_[21], value_names_[23]);
   1443 
   1444   EXPECT_NE(value_names_[24], value_names_[26]);
   1445 
   1446   EXPECT_EQ(value_names_[27], value_names_[29]);
   1447 }
   1448 
   1449 TEST_F(GlobalValueNumberingTestLoop, Phi) {
   1450   static const MIRDef mirs[] = {
   1451       DEF_CONST(3, Instruction::CONST, 0u, 1000),
   1452       DEF_PHI2(4, 1u, 0u, 6u),                     // Merge CONST 0u (1000) with the same.
   1453       DEF_PHI2(4, 2u, 0u, 7u),                     // Merge CONST 0u (1000) with the Phi itself.
   1454       DEF_PHI2(4, 3u, 0u, 8u),                     // Merge CONST 0u (1000) and CONST 4u (2000).
   1455       DEF_PHI2(4, 4u, 0u, 9u),                     // Merge CONST 0u (1000) and Phi 3u.
   1456       DEF_CONST(4, Instruction::CONST, 5u, 2000),
   1457       DEF_MOVE(4, Instruction::MOVE, 6u, 0u),
   1458       DEF_MOVE(4, Instruction::MOVE, 7u, 2u),
   1459       DEF_MOVE(4, Instruction::MOVE, 8u, 5u),
   1460       DEF_MOVE(4, Instruction::MOVE, 9u, 3u),
   1461   };
   1462 
   1463   PrepareMIRs(mirs);
   1464   PerformGVN();
   1465   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1466   EXPECT_EQ(value_names_[1], value_names_[0]);
   1467   EXPECT_EQ(value_names_[2], value_names_[0]);
   1468 
   1469   EXPECT_NE(value_names_[3], value_names_[0]);
   1470   EXPECT_NE(value_names_[3], value_names_[5]);
   1471   EXPECT_NE(value_names_[4], value_names_[0]);
   1472   EXPECT_NE(value_names_[4], value_names_[5]);
   1473   EXPECT_NE(value_names_[4], value_names_[3]);
   1474 }
   1475 
   1476 TEST_F(GlobalValueNumberingTestCatch, IFields) {
   1477   static const IFieldDef ifields[] = {
   1478       { 0u, 1u, 0u, false },
   1479       { 1u, 1u, 1u, false },
   1480   };
   1481   static const MIRDef mirs[] = {
   1482       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 200u),
   1483       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 201u),
   1484       DEF_IGET(3, Instruction::IGET, 2u, 100u, 0u),
   1485       DEF_IGET(3, Instruction::IGET, 3u, 200u, 0u),
   1486       DEF_IGET(3, Instruction::IGET, 4u, 201u, 0u),
   1487       DEF_INVOKE1(4, Instruction::INVOKE_STATIC, 201u),     // Clobbering catch, 201u escapes.
   1488       DEF_IGET(4, Instruction::IGET, 6u, 100u, 0u),         // Differs from IGET 2u.
   1489       DEF_IPUT(4, Instruction::IPUT, 6u, 100u, 1u),
   1490       DEF_IPUT(4, Instruction::IPUT, 6u, 101u, 0u),
   1491       DEF_IPUT(4, Instruction::IPUT, 6u, 200u, 0u),
   1492       DEF_IGET(5, Instruction::IGET, 10u, 100u, 0u),        // Differs from IGETs 2u and 6u.
   1493       DEF_IGET(5, Instruction::IGET, 11u, 200u, 0u),        // Same as the top.
   1494       DEF_IGET(5, Instruction::IGET, 12u, 201u, 0u),        // Differs from the top, 201u escaped.
   1495       DEF_IPUT(5, Instruction::IPUT, 10u, 100u, 1u),
   1496       DEF_IPUT(5, Instruction::IPUT, 10u, 101u, 0u),
   1497       DEF_IPUT(5, Instruction::IPUT, 10u, 200u, 0u),
   1498       DEF_IGET(6, Instruction::IGET, 16u, 100u, 0u),        // Differs from IGETs 2u, 6u and 10u.
   1499       DEF_IGET(6, Instruction::IGET, 17u, 100u, 1u),        // Same as IGET 16u.
   1500       DEF_IGET(6, Instruction::IGET, 18u, 101u, 0u),        // Same as IGET 16u.
   1501       DEF_IGET(6, Instruction::IGET, 19u, 200u, 0u),        // Same as IGET 16u.
   1502   };
   1503 
   1504   PrepareIFields(ifields);
   1505   PrepareMIRs(mirs);
   1506   PerformGVN();
   1507   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1508   EXPECT_NE(value_names_[2], value_names_[6]);
   1509   EXPECT_NE(value_names_[2], value_names_[10]);
   1510   EXPECT_NE(value_names_[6], value_names_[10]);
   1511   EXPECT_EQ(value_names_[3], value_names_[11]);
   1512   EXPECT_NE(value_names_[4], value_names_[12]);
   1513 
   1514   EXPECT_NE(value_names_[2], value_names_[16]);
   1515   EXPECT_NE(value_names_[6], value_names_[16]);
   1516   EXPECT_NE(value_names_[10], value_names_[16]);
   1517   EXPECT_EQ(value_names_[16], value_names_[17]);
   1518   EXPECT_EQ(value_names_[16], value_names_[18]);
   1519   EXPECT_EQ(value_names_[16], value_names_[19]);
   1520 }
   1521 
   1522 TEST_F(GlobalValueNumberingTestCatch, SFields) {
   1523   static const SFieldDef sfields[] = {
   1524       { 0u, 1u, 0u, false },
   1525       { 1u, 1u, 1u, false },
   1526   };
   1527   static const MIRDef mirs[] = {
   1528       DEF_SGET(3, Instruction::SGET, 0u, 0u),
   1529       DEF_INVOKE1(4, Instruction::INVOKE_STATIC, 100u),     // Clobbering catch.
   1530       DEF_SGET(4, Instruction::SGET, 2u, 0u),               // Differs from SGET 0u.
   1531       DEF_SPUT(4, Instruction::SPUT, 2u, 1u),
   1532       DEF_SGET(5, Instruction::SGET, 4u, 0u),               // Differs from SGETs 0u and 2u.
   1533       DEF_SPUT(5, Instruction::SPUT, 4u, 1u),
   1534       DEF_SGET(6, Instruction::SGET, 6u, 0u),               // Differs from SGETs 0u, 2u and 4u.
   1535       DEF_SGET(6, Instruction::SGET, 7u, 1u),               // Same as field #1.
   1536   };
   1537 
   1538   PrepareSFields(sfields);
   1539   PrepareMIRs(mirs);
   1540   PerformGVN();
   1541   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1542   EXPECT_NE(value_names_[0], value_names_[2]);
   1543   EXPECT_NE(value_names_[0], value_names_[4]);
   1544   EXPECT_NE(value_names_[2], value_names_[4]);
   1545   EXPECT_NE(value_names_[0], value_names_[6]);
   1546   EXPECT_NE(value_names_[2], value_names_[6]);
   1547   EXPECT_NE(value_names_[4], value_names_[6]);
   1548   EXPECT_EQ(value_names_[6], value_names_[7]);
   1549 }
   1550 
   1551 TEST_F(GlobalValueNumberingTestCatch, Arrays) {
   1552   static const MIRDef mirs[] = {
   1553       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 200u),
   1554       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 201u),
   1555       DEF_AGET(3, Instruction::AGET, 2u, 100u, 101u),
   1556       DEF_AGET(3, Instruction::AGET, 3u, 200u, 202u),
   1557       DEF_AGET(3, Instruction::AGET, 4u, 200u, 203u),
   1558       DEF_AGET(3, Instruction::AGET, 5u, 201u, 202u),
   1559       DEF_AGET(3, Instruction::AGET, 6u, 201u, 203u),
   1560       DEF_INVOKE1(4, Instruction::INVOKE_STATIC, 201u),     // Clobbering catch, 201u escapes.
   1561       DEF_AGET(4, Instruction::AGET, 8u, 100u, 101u),       // Differs from AGET 2u.
   1562       DEF_APUT(4, Instruction::APUT, 8u, 100u, 102u),
   1563       DEF_APUT(4, Instruction::APUT, 8u, 200u, 202u),
   1564       DEF_APUT(4, Instruction::APUT, 8u, 200u, 203u),
   1565       DEF_APUT(4, Instruction::APUT, 8u, 201u, 202u),
   1566       DEF_APUT(4, Instruction::APUT, 8u, 201u, 203u),
   1567       DEF_AGET(5, Instruction::AGET, 14u, 100u, 101u),      // Differs from AGETs 2u and 8u.
   1568       DEF_AGET(5, Instruction::AGET, 15u, 200u, 202u),      // Same as AGET 3u.
   1569       DEF_AGET(5, Instruction::AGET, 16u, 200u, 203u),      // Same as AGET 4u.
   1570       DEF_AGET(5, Instruction::AGET, 17u, 201u, 202u),      // Differs from AGET 5u.
   1571       DEF_AGET(5, Instruction::AGET, 18u, 201u, 203u),      // Differs from AGET 6u.
   1572       DEF_APUT(5, Instruction::APUT, 14u, 100u, 102u),
   1573       DEF_APUT(5, Instruction::APUT, 14u, 200u, 202u),
   1574       DEF_APUT(5, Instruction::APUT, 14u, 200u, 203u),
   1575       DEF_APUT(5, Instruction::APUT, 14u, 201u, 202u),
   1576       DEF_APUT(5, Instruction::APUT, 14u, 201u, 203u),
   1577       DEF_AGET(6, Instruction::AGET, 24u, 100u, 101u),      // Differs from AGETs 2u, 8u and 14u.
   1578       DEF_AGET(6, Instruction::AGET, 25u, 100u, 101u),      // Same as AGET 24u.
   1579       DEF_AGET(6, Instruction::AGET, 26u, 200u, 202u),      // Same as AGET 24u.
   1580       DEF_AGET(6, Instruction::AGET, 27u, 200u, 203u),      // Same as AGET 24u.
   1581       DEF_AGET(6, Instruction::AGET, 28u, 201u, 202u),      // Same as AGET 24u.
   1582       DEF_AGET(6, Instruction::AGET, 29u, 201u, 203u),      // Same as AGET 24u.
   1583   };
   1584 
   1585   PrepareMIRs(mirs);
   1586   PerformGVN();
   1587   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1588   EXPECT_NE(value_names_[2], value_names_[8]);
   1589   EXPECT_NE(value_names_[2], value_names_[14]);
   1590   EXPECT_NE(value_names_[8], value_names_[14]);
   1591   EXPECT_EQ(value_names_[3], value_names_[15]);
   1592   EXPECT_EQ(value_names_[4], value_names_[16]);
   1593   EXPECT_NE(value_names_[5], value_names_[17]);
   1594   EXPECT_NE(value_names_[6], value_names_[18]);
   1595   EXPECT_NE(value_names_[2], value_names_[24]);
   1596   EXPECT_NE(value_names_[8], value_names_[24]);
   1597   EXPECT_NE(value_names_[14], value_names_[24]);
   1598   EXPECT_EQ(value_names_[24], value_names_[25]);
   1599   EXPECT_EQ(value_names_[24], value_names_[26]);
   1600   EXPECT_EQ(value_names_[24], value_names_[27]);
   1601   EXPECT_EQ(value_names_[24], value_names_[28]);
   1602   EXPECT_EQ(value_names_[24], value_names_[29]);
   1603 }
   1604 
   1605 TEST_F(GlobalValueNumberingTestCatch, Phi) {
   1606   static const MIRDef mirs[] = {
   1607       DEF_CONST(3, Instruction::CONST, 0u, 1000),
   1608       DEF_CONST(3, Instruction::CONST, 1u, 2000),
   1609       DEF_MOVE(3, Instruction::MOVE, 2u, 1u),
   1610       DEF_INVOKE1(4, Instruction::INVOKE_STATIC, 100u),     // Clobbering catch.
   1611       DEF_CONST(5, Instruction::CONST, 4u, 1000),
   1612       DEF_CONST(5, Instruction::CONST, 5u, 3000),
   1613       DEF_MOVE(5, Instruction::MOVE, 6u, 5u),
   1614       DEF_PHI2(6, 7u, 0u, 4u),
   1615       DEF_PHI2(6, 8u, 0u, 5u),
   1616       DEF_PHI2(6, 9u, 0u, 6u),
   1617       DEF_PHI2(6, 10u, 1u, 4u),
   1618       DEF_PHI2(6, 11u, 1u, 5u),
   1619       DEF_PHI2(6, 12u, 1u, 6u),
   1620       DEF_PHI2(6, 13u, 2u, 4u),
   1621       DEF_PHI2(6, 14u, 2u, 5u),
   1622       DEF_PHI2(6, 15u, 2u, 6u),
   1623   };
   1624   PrepareMIRs(mirs);
   1625   PerformGVN();
   1626   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1627   ASSERT_EQ(value_names_[4], value_names_[0]);  // Both CONSTs are 1000.
   1628   EXPECT_EQ(value_names_[7], value_names_[0]);  // Merging CONST 0u and CONST 4u, both 1000.
   1629   EXPECT_NE(value_names_[8], value_names_[0]);
   1630   EXPECT_NE(value_names_[8], value_names_[5]);
   1631   EXPECT_EQ(value_names_[9], value_names_[8]);
   1632   EXPECT_NE(value_names_[10], value_names_[1]);
   1633   EXPECT_NE(value_names_[10], value_names_[4]);
   1634   EXPECT_NE(value_names_[10], value_names_[8]);
   1635   EXPECT_NE(value_names_[11], value_names_[1]);
   1636   EXPECT_NE(value_names_[11], value_names_[5]);
   1637   EXPECT_NE(value_names_[11], value_names_[8]);
   1638   EXPECT_NE(value_names_[11], value_names_[10]);
   1639   EXPECT_EQ(value_names_[12], value_names_[11]);
   1640   EXPECT_EQ(value_names_[13], value_names_[10]);
   1641   EXPECT_EQ(value_names_[14], value_names_[11]);
   1642   EXPECT_EQ(value_names_[15], value_names_[11]);
   1643 }
   1644 
   1645 TEST_F(GlobalValueNumberingTest, NullCheckIFields) {
   1646   static const IFieldDef ifields[] = {
   1647       { 0u, 1u, 0u, false },  // Object.
   1648       { 1u, 1u, 1u, false },  // Object.
   1649   };
   1650   static const BBDef bbs[] = {
   1651       DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
   1652       DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
   1653       DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(5)),
   1654       DEF_BB(kDalvikByteCode, DEF_SUCC2(4, 5), DEF_PRED1(1)),  // 4 is fall-through, 5 is taken.
   1655       DEF_BB(kDalvikByteCode, DEF_SUCC1(5), DEF_PRED1(3)),
   1656       DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED2(3, 4)),
   1657   };
   1658   static const MIRDef mirs[] = {
   1659       DEF_IGET(3, Instruction::IGET_OBJECT, 0u, 100u, 0u),
   1660       DEF_IGET(3, Instruction::IGET_OBJECT, 1u, 100u, 1u),
   1661       DEF_IGET(3, Instruction::IGET_OBJECT, 2u, 101u, 0u),
   1662       DEF_IFZ(3, Instruction::IF_NEZ, 0u),            // Null-check for field #0 for taken.
   1663       DEF_UNIQUE_REF(4, Instruction::NEW_ARRAY, 4u),
   1664       DEF_IPUT(4, Instruction::IPUT_OBJECT, 4u, 100u, 0u),
   1665       DEF_IPUT(4, Instruction::IPUT_OBJECT, 4u, 100u, 1u),
   1666       DEF_IPUT(4, Instruction::IPUT_OBJECT, 4u, 101u, 0u),
   1667       DEF_IGET(5, Instruction::IGET_OBJECT, 8u, 100u, 0u),   // 100u/#0, IF_NEZ/NEW_ARRAY.
   1668       DEF_IGET(5, Instruction::IGET_OBJECT, 9u, 100u, 1u),   // 100u/#1, -/NEW_ARRAY.
   1669       DEF_IGET(5, Instruction::IGET_OBJECT, 10u, 101u, 0u),  // 101u/#0, -/NEW_ARRAY.
   1670       DEF_CONST(5, Instruction::CONST, 11u, 0),
   1671       DEF_AGET(5, Instruction::AGET, 12u, 8u, 11u),   // Null-check eliminated.
   1672       DEF_AGET(5, Instruction::AGET, 13u, 9u, 11u),   // Null-check kept.
   1673       DEF_AGET(5, Instruction::AGET, 14u, 10u, 11u),  // Null-check kept.
   1674   };
   1675   static const bool expected_ignore_null_check[] = {
   1676       false, true, false, false,                      // BB #3; unimportant.
   1677       false, true, true, true,                        // BB #4; unimportant.
   1678       true, true, true, false, true, false, false,    // BB #5; only the last three are important.
   1679   };
   1680 
   1681   PrepareIFields(ifields);
   1682   PrepareBasicBlocks(bbs);
   1683   PrepareMIRs(mirs);
   1684   PerformGVN();
   1685   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1686   PerformGVNCodeModifications();
   1687   ASSERT_EQ(arraysize(expected_ignore_null_check), mir_count_);
   1688   for (size_t i = 0u; i != arraysize(mirs); ++i) {
   1689     EXPECT_EQ(expected_ignore_null_check[i],
   1690               (mirs_[i].optimization_flags & MIR_IGNORE_NULL_CHECK) != 0) << i;
   1691   }
   1692 }
   1693 
   1694 TEST_F(GlobalValueNumberingTest, NullCheckSFields) {
   1695   static const SFieldDef sfields[] = {
   1696       { 0u, 1u, 0u, false },  // Object.
   1697       { 1u, 1u, 1u, false },  // Object.
   1698   };
   1699   static const BBDef bbs[] = {
   1700       DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
   1701       DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
   1702       DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(5)),
   1703       DEF_BB(kDalvikByteCode, DEF_SUCC2(4, 5), DEF_PRED1(1)),  // 4 is fall-through, 5 is taken.
   1704       DEF_BB(kDalvikByteCode, DEF_SUCC1(5), DEF_PRED1(3)),
   1705       DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED2(3, 4)),
   1706   };
   1707   static const MIRDef mirs[] = {
   1708       DEF_SGET(3, Instruction::SGET_OBJECT, 0u, 0u),
   1709       DEF_SGET(3, Instruction::SGET_OBJECT, 1u, 1u),
   1710       DEF_IFZ(3, Instruction::IF_NEZ, 0u),            // Null-check for field #0 for taken.
   1711       DEF_UNIQUE_REF(4, Instruction::NEW_ARRAY, 3u),
   1712       DEF_SPUT(4, Instruction::SPUT_OBJECT, 3u, 0u),
   1713       DEF_SPUT(4, Instruction::SPUT_OBJECT, 3u, 1u),
   1714       DEF_SGET(5, Instruction::SGET_OBJECT, 6u, 0u),  // Field #0 is null-checked, IF_NEZ/NEW_ARRAY.
   1715       DEF_SGET(5, Instruction::SGET_OBJECT, 7u, 1u),  // Field #1 is not null-checked, -/NEW_ARRAY.
   1716       DEF_CONST(5, Instruction::CONST, 8u, 0),
   1717       DEF_AGET(5, Instruction::AGET, 9u, 6u, 8u),     // Null-check eliminated.
   1718       DEF_AGET(5, Instruction::AGET, 10u, 7u, 8u),    // Null-check kept.
   1719   };
   1720   static const bool expected_ignore_null_check[] = {
   1721       false, false, false, false, false, false, false, false, false, true, false
   1722   };
   1723 
   1724   PrepareSFields(sfields);
   1725   PrepareBasicBlocks(bbs);
   1726   PrepareMIRs(mirs);
   1727   PerformGVN();
   1728   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1729   PerformGVNCodeModifications();
   1730   ASSERT_EQ(arraysize(expected_ignore_null_check), mir_count_);
   1731   for (size_t i = 0u; i != arraysize(mirs); ++i) {
   1732     EXPECT_EQ(expected_ignore_null_check[i],
   1733               (mirs_[i].optimization_flags & MIR_IGNORE_NULL_CHECK) != 0) << i;
   1734   }
   1735 }
   1736 
   1737 TEST_F(GlobalValueNumberingTest, NullCheckArrays) {
   1738   static const BBDef bbs[] = {
   1739       DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
   1740       DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
   1741       DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(5)),
   1742       DEF_BB(kDalvikByteCode, DEF_SUCC2(4, 5), DEF_PRED1(1)),  // 4 is fall-through, 5 is taken.
   1743       DEF_BB(kDalvikByteCode, DEF_SUCC1(5), DEF_PRED1(3)),
   1744       DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED2(3, 4)),
   1745   };
   1746   static const MIRDef mirs[] = {
   1747       DEF_AGET(3, Instruction::AGET_OBJECT, 0u, 100u, 102u),
   1748       DEF_AGET(3, Instruction::AGET_OBJECT, 1u, 100u, 103u),
   1749       DEF_AGET(3, Instruction::AGET_OBJECT, 2u, 101u, 102u),
   1750       DEF_IFZ(3, Instruction::IF_NEZ, 0u),            // Null-check for field #0 for taken.
   1751       DEF_UNIQUE_REF(4, Instruction::NEW_ARRAY, 4u),
   1752       DEF_APUT(4, Instruction::APUT_OBJECT, 4u, 100u, 102u),
   1753       DEF_APUT(4, Instruction::APUT_OBJECT, 4u, 100u, 103u),
   1754       DEF_APUT(4, Instruction::APUT_OBJECT, 4u, 101u, 102u),
   1755       DEF_AGET(5, Instruction::AGET_OBJECT, 8u, 100u, 102u),   // Null-checked, IF_NEZ/NEW_ARRAY.
   1756       DEF_AGET(5, Instruction::AGET_OBJECT, 9u, 100u, 103u),   // Not null-checked, -/NEW_ARRAY.
   1757       DEF_AGET(5, Instruction::AGET_OBJECT, 10u, 101u, 102u),  // Not null-checked, -/NEW_ARRAY.
   1758       DEF_CONST(5, Instruction::CONST, 11u, 0),
   1759       DEF_AGET(5, Instruction::AGET, 12u, 8u, 11u),    // Null-check eliminated.
   1760       DEF_AGET(5, Instruction::AGET, 13u, 9u, 11u),    // Null-check kept.
   1761       DEF_AGET(5, Instruction::AGET, 14u, 10u, 11u),   // Null-check kept.
   1762   };
   1763   static const bool expected_ignore_null_check[] = {
   1764       false, true, false, false,                      // BB #3; unimportant.
   1765       false, true, true, true,                        // BB #4; unimportant.
   1766       true, true, true, false, true, false, false,    // BB #5; only the last three are important.
   1767   };
   1768 
   1769   PrepareBasicBlocks(bbs);
   1770   PrepareMIRs(mirs);
   1771   PerformGVN();
   1772   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1773   PerformGVNCodeModifications();
   1774   ASSERT_EQ(arraysize(expected_ignore_null_check), mir_count_);
   1775   for (size_t i = 0u; i != arraysize(mirs); ++i) {
   1776     EXPECT_EQ(expected_ignore_null_check[i],
   1777               (mirs_[i].optimization_flags & MIR_IGNORE_NULL_CHECK) != 0) << i;
   1778   }
   1779 }
   1780 
   1781 TEST_F(GlobalValueNumberingTestDiamond, RangeCheckArrays) {
   1782   // NOTE: We don't merge range checks when we merge value names for Phis or memory locations.
   1783   static const MIRDef mirs[] = {
   1784       DEF_AGET(4, Instruction::AGET, 0u, 100u, 101u),
   1785       DEF_AGET(5, Instruction::AGET, 1u, 100u, 101u),
   1786       DEF_APUT(6, Instruction::APUT, 2u, 100u, 101u),
   1787 
   1788       DEF_AGET(4, Instruction::AGET, 3u, 200u, 201u),
   1789       DEF_AGET(5, Instruction::AGET, 4u, 200u, 202u),
   1790       DEF_APUT(6, Instruction::APUT, 5u, 200u, 201u),
   1791 
   1792       DEF_AGET(4, Instruction::AGET, 6u, 300u, 302u),
   1793       DEF_AGET(5, Instruction::AGET, 7u, 301u, 302u),
   1794       DEF_APUT(6, Instruction::APUT, 8u, 300u, 302u),
   1795   };
   1796   static const bool expected_ignore_null_check[] = {
   1797       false, false, true,
   1798       false, false, true,
   1799       false, false, false,
   1800   };
   1801   static const bool expected_ignore_range_check[] = {
   1802       false, false, true,
   1803       false, false, false,
   1804       false, false, false,
   1805   };
   1806 
   1807   PrepareMIRs(mirs);
   1808   PerformGVN();
   1809   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1810   PerformGVNCodeModifications();
   1811   ASSERT_EQ(arraysize(expected_ignore_null_check), mir_count_);
   1812   ASSERT_EQ(arraysize(expected_ignore_range_check), mir_count_);
   1813   for (size_t i = 0u; i != arraysize(mirs); ++i) {
   1814     EXPECT_EQ(expected_ignore_null_check[i],
   1815               (mirs_[i].optimization_flags & MIR_IGNORE_NULL_CHECK) != 0) << i;
   1816     EXPECT_EQ(expected_ignore_range_check[i],
   1817               (mirs_[i].optimization_flags & MIR_IGNORE_RANGE_CHECK) != 0) << i;
   1818   }
   1819 }
   1820 
   1821 TEST_F(GlobalValueNumberingTestDiamond, MergeSameValueInDifferentMemoryLocations) {
   1822   static const IFieldDef ifields[] = {
   1823       { 0u, 1u, 0u, false },  // Int.
   1824       { 1u, 1u, 1u, false },  // Int.
   1825   };
   1826   static const SFieldDef sfields[] = {
   1827       { 0u, 1u, 0u, false },  // Int.
   1828       { 1u, 1u, 1u, false },  // Int.
   1829   };
   1830   static const MIRDef mirs[] = {
   1831       DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 100u),
   1832       DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 200u),
   1833       DEF_CONST(4, Instruction::CONST, 2u, 1000),
   1834       DEF_IPUT(4, Instruction::IPUT, 2u, 100u, 0u),
   1835       DEF_IPUT(4, Instruction::IPUT, 2u, 100u, 1u),
   1836       DEF_IPUT(4, Instruction::IPUT, 2u, 101u, 0u),
   1837       DEF_APUT(4, Instruction::APUT, 2u, 200u, 202u),
   1838       DEF_APUT(4, Instruction::APUT, 2u, 200u, 203u),
   1839       DEF_APUT(4, Instruction::APUT, 2u, 201u, 202u),
   1840       DEF_APUT(4, Instruction::APUT, 2u, 201u, 203u),
   1841       DEF_SPUT(4, Instruction::SPUT, 2u, 0u),
   1842       DEF_SPUT(4, Instruction::SPUT, 2u, 1u),
   1843       DEF_CONST(5, Instruction::CONST, 12u, 2000),
   1844       DEF_IPUT(5, Instruction::IPUT, 12u, 100u, 0u),
   1845       DEF_IPUT(5, Instruction::IPUT, 12u, 100u, 1u),
   1846       DEF_IPUT(5, Instruction::IPUT, 12u, 101u, 0u),
   1847       DEF_APUT(5, Instruction::APUT, 12u, 200u, 202u),
   1848       DEF_APUT(5, Instruction::APUT, 12u, 200u, 203u),
   1849       DEF_APUT(5, Instruction::APUT, 12u, 201u, 202u),
   1850       DEF_APUT(5, Instruction::APUT, 12u, 201u, 203u),
   1851       DEF_SPUT(5, Instruction::SPUT, 12u, 0u),
   1852       DEF_SPUT(5, Instruction::SPUT, 12u, 1u),
   1853       DEF_PHI2(6, 22u, 2u, 12u),
   1854       DEF_IGET(6, Instruction::IGET, 23u, 100u, 0u),
   1855       DEF_IGET(6, Instruction::IGET, 24u, 100u, 1u),
   1856       DEF_IGET(6, Instruction::IGET, 25u, 101u, 0u),
   1857       DEF_AGET(6, Instruction::AGET, 26u, 200u, 202u),
   1858       DEF_AGET(6, Instruction::AGET, 27u, 200u, 203u),
   1859       DEF_AGET(6, Instruction::AGET, 28u, 201u, 202u),
   1860       DEF_AGET(6, Instruction::AGET, 29u, 201u, 203u),
   1861       DEF_SGET(6, Instruction::SGET, 30u, 0u),
   1862       DEF_SGET(6, Instruction::SGET, 31u, 1u),
   1863   };
   1864   PrepareIFields(ifields);
   1865   PrepareSFields(sfields);
   1866   PrepareMIRs(mirs);
   1867   PerformGVN();
   1868   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1869   EXPECT_NE(value_names_[2], value_names_[12]);
   1870   EXPECT_NE(value_names_[2], value_names_[22]);
   1871   EXPECT_NE(value_names_[12], value_names_[22]);
   1872   for (size_t i = 23; i != arraysize(mirs); ++i) {
   1873     EXPECT_EQ(value_names_[22], value_names_[i]) << i;
   1874   }
   1875 }
   1876 
   1877 TEST_F(GlobalValueNumberingTest, InfiniteLocationLoop) {
   1878   // This is a pattern that lead to an infinite loop during the GVN development. This has been
   1879   // fixed by rewriting the merging of AliasingValues to merge only locations read from or
   1880   // written to in each incoming LVN rather than merging all locations read from or written to
   1881   // in any incoming LVN. It also showed up only when the GVN used the DFS ordering instead of
   1882   // the "topological" ordering but, since the "topological" ordering is not really topological
   1883   // when there are cycles and an optimizing Java compiler (or a tool like proguard) could
   1884   // theoretically create any sort of flow graph, this could have shown up in real code.
   1885   //
   1886   // While we were merging all the locations:
   1887   // The first time the Phi evaluates to the same value name as CONST 0u.  After the second
   1888   // evaluation, when the BB #9 has been processed, the Phi receives its own value name.
   1889   // However, the index from the first evaluation keeps disappearing and reappearing in the
   1890   // LVN's aliasing_array_value_map_'s load_value_map for BBs #9, #4, #5, #7 because of the
   1891   // DFS ordering of LVN evaluation.
   1892   static const IFieldDef ifields[] = {
   1893       { 0u, 1u, 0u, false },  // Object.
   1894   };
   1895   static const BBDef bbs[] = {
   1896       DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
   1897       DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
   1898       DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(4)),
   1899       DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(1)),
   1900       DEF_BB(kDalvikByteCode, DEF_SUCC2(5, 2), DEF_PRED2(3, 9)),
   1901       DEF_BB(kDalvikByteCode, DEF_SUCC2(6, 7), DEF_PRED1(4)),
   1902       DEF_BB(kDalvikByteCode, DEF_SUCC1(9), DEF_PRED1(5)),
   1903       DEF_BB(kDalvikByteCode, DEF_SUCC2(8, 9), DEF_PRED1(5)),
   1904       DEF_BB(kDalvikByteCode, DEF_SUCC1(9), DEF_PRED1(7)),
   1905       DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED3(6, 7, 8)),
   1906   };
   1907   static const MIRDef mirs[] = {
   1908       DEF_CONST(3, Instruction::CONST, 0u, 0),
   1909       DEF_PHI2(4, 1u, 0u, 10u),
   1910       DEF_INVOKE1(6, Instruction::INVOKE_STATIC, 100u),
   1911       DEF_IGET(6, Instruction::IGET_OBJECT, 3u, 100u, 0u),
   1912       DEF_CONST(6, Instruction::CONST, 4u, 1000),
   1913       DEF_APUT(6, Instruction::APUT, 4u, 3u, 1u),            // Index is Phi 1u.
   1914       DEF_INVOKE1(8, Instruction::INVOKE_STATIC, 100u),
   1915       DEF_IGET(8, Instruction::IGET_OBJECT, 7u, 100u, 0u),
   1916       DEF_CONST(8, Instruction::CONST, 8u, 2000),
   1917       DEF_APUT(8, Instruction::APUT, 9u, 7u, 1u),            // Index is Phi 1u.
   1918       DEF_CONST(9, Instruction::CONST, 10u, 3000),
   1919   };
   1920   PrepareIFields(ifields);
   1921   PrepareBasicBlocks(bbs);
   1922   PrepareMIRs(mirs);
   1923   // Using DFS order for this test. The GVN result should not depend on the used ordering
   1924   // once the GVN actually converges. But creating a test for this convergence issue with
   1925   // the topological ordering could be a very challenging task.
   1926   PerformPreOrderDfsGVN();
   1927 }
   1928 
   1929 TEST_F(GlobalValueNumberingTestTwoConsecutiveLoops, IFieldAndPhi) {
   1930   static const IFieldDef ifields[] = {
   1931       { 0u, 1u, 0u, false },  // Int.
   1932   };
   1933   static const MIRDef mirs[] = {
   1934       DEF_MOVE(3, Instruction::MOVE_OBJECT, 0u, 100u),
   1935       DEF_IPUT(3, Instruction::IPUT_OBJECT, 0u, 200u, 0u),
   1936       DEF_PHI2(4, 2u, 0u, 3u),
   1937       DEF_MOVE(5, Instruction::MOVE_OBJECT, 3u, 300u),
   1938       DEF_IPUT(5, Instruction::IPUT_OBJECT, 3u, 200u, 0u),
   1939       DEF_MOVE(6, Instruction::MOVE_OBJECT, 5u, 2u),
   1940       DEF_IGET(6, Instruction::IGET_OBJECT, 6u, 200u, 0u),
   1941       DEF_MOVE(7, Instruction::MOVE_OBJECT, 7u, 5u),
   1942       DEF_IGET(7, Instruction::IGET_OBJECT, 8u, 200u, 0u),
   1943       DEF_MOVE(8, Instruction::MOVE_OBJECT, 9u, 5u),
   1944       DEF_IGET(8, Instruction::IGET_OBJECT, 10u, 200u, 0u),
   1945       DEF_MOVE(9, Instruction::MOVE_OBJECT, 11u, 5u),
   1946       DEF_IGET(9, Instruction::IGET_OBJECT, 12u, 200u, 0u),
   1947   };
   1948 
   1949   PrepareIFields(ifields);
   1950   PrepareMIRs(mirs);
   1951   PerformGVN();
   1952   ASSERT_EQ(arraysize(mirs), value_names_.size());
   1953   EXPECT_NE(value_names_[0], value_names_[3]);
   1954   EXPECT_NE(value_names_[0], value_names_[2]);
   1955   EXPECT_NE(value_names_[3], value_names_[2]);
   1956   EXPECT_EQ(value_names_[2], value_names_[5]);
   1957   EXPECT_EQ(value_names_[5], value_names_[6]);
   1958   EXPECT_EQ(value_names_[5], value_names_[7]);
   1959   EXPECT_EQ(value_names_[5], value_names_[8]);
   1960   EXPECT_EQ(value_names_[5], value_names_[9]);
   1961   EXPECT_EQ(value_names_[5], value_names_[10]);
   1962   EXPECT_EQ(value_names_[5], value_names_[11]);
   1963   EXPECT_EQ(value_names_[5], value_names_[12]);
   1964 }
   1965 
   1966 TEST_F(GlobalValueNumberingTestTwoConsecutiveLoops, NullCheck) {
   1967   static const IFieldDef ifields[] = {
   1968       { 0u, 1u, 0u, false },  // Int.
   1969   };
   1970   static const SFieldDef sfields[] = {
   1971       { 0u, 1u, 0u, false },  // Int.
   1972   };
   1973   static const MIRDef mirs[] = {
   1974       DEF_MOVE(3, Instruction::MOVE_OBJECT, 0u, 100u),
   1975       DEF_IGET(3, Instruction::IGET_OBJECT, 1u, 200u, 0u),
   1976       DEF_SGET(3, Instruction::SGET_OBJECT, 2u, 0u),
   1977       DEF_AGET(3, Instruction::AGET_OBJECT, 3u, 300u, 201u),
   1978       DEF_PHI2(4, 4u, 0u, 8u),
   1979       DEF_IGET(5, Instruction::IGET_OBJECT, 5u, 200u, 0u),
   1980       DEF_SGET(5, Instruction::SGET_OBJECT, 6u, 0u),
   1981       DEF_AGET(5, Instruction::AGET_OBJECT, 7u, 300u, 201u),
   1982       DEF_MOVE(5, Instruction::MOVE_OBJECT, 8u, 400u),
   1983       DEF_IPUT(5, Instruction::IPUT_OBJECT, 4u, 200u, 0u),          // PUT the Phi 4u.
   1984       DEF_SPUT(5, Instruction::SPUT_OBJECT, 4u, 0u),                // PUT the Phi 4u.
   1985       DEF_APUT(5, Instruction::APUT_OBJECT, 4u, 300u, 201u),        // PUT the Phi 4u.
   1986       DEF_MOVE(6, Instruction::MOVE_OBJECT, 12u, 4u),
   1987       DEF_IGET(6, Instruction::IGET_OBJECT, 13u, 200u, 0u),
   1988       DEF_SGET(6, Instruction::SGET_OBJECT, 14u, 0u),
   1989       DEF_AGET(6, Instruction::AGET_OBJECT, 15u, 300u, 201u),
   1990       DEF_AGET(6, Instruction::AGET_OBJECT, 16u, 12u, 600u),
   1991       DEF_AGET(6, Instruction::AGET_OBJECT, 17u, 13u, 600u),
   1992       DEF_AGET(6, Instruction::AGET_OBJECT, 18u, 14u, 600u),
   1993       DEF_AGET(6, Instruction::AGET_OBJECT, 19u, 15u, 600u),
   1994       DEF_MOVE(8, Instruction::MOVE_OBJECT, 20u, 12u),
   1995       DEF_IGET(8, Instruction::IGET_OBJECT, 21u, 200u, 0u),
   1996       DEF_SGET(8, Instruction::SGET_OBJECT, 22u, 0u),
   1997       DEF_AGET(8, Instruction::AGET_OBJECT, 23u, 300u, 201u),
   1998       DEF_AGET(8, Instruction::AGET_OBJECT, 24u, 12u, 600u),
   1999       DEF_AGET(8, Instruction::AGET_OBJECT, 25u, 13u, 600u),
   2000       DEF_AGET(8, Instruction::AGET_OBJECT, 26u, 14u, 600u),
   2001       DEF_AGET(8, Instruction::AGET_OBJECT, 27u, 15u, 600u),
   2002       DEF_MOVE(9, Instruction::MOVE_OBJECT, 28u, 12u),
   2003       DEF_IGET(9, Instruction::IGET_OBJECT, 29u, 200u, 0u),
   2004       DEF_SGET(9, Instruction::SGET_OBJECT, 30u, 0u),
   2005       DEF_AGET(9, Instruction::AGET_OBJECT, 31u, 300u, 201u),
   2006       DEF_AGET(9, Instruction::AGET_OBJECT, 32u, 12u, 600u),
   2007       DEF_AGET(9, Instruction::AGET_OBJECT, 33u, 13u, 600u),
   2008       DEF_AGET(9, Instruction::AGET_OBJECT, 34u, 14u, 600u),
   2009       DEF_AGET(9, Instruction::AGET_OBJECT, 35u, 15u, 600u),
   2010   };
   2011   static const bool expected_ignore_null_check[] = {
   2012       false, false, false, false,                                   // BB #3.
   2013       false, true, false, true, false, true, false, true,           // BBs #4 and #5.
   2014       false, true, false, true, false, false, false, false,         // BB #6.
   2015       false, true, false, true, true, true, true, true,             // BB #7.
   2016       false, true, false, true, true, true, true, true,             // BB #8.
   2017   };
   2018   static const bool expected_ignore_range_check[] = {
   2019       false, false, false, false,                                   // BB #3.
   2020       false, false, false, true, false, false, false, true,         // BBs #4 and #5.
   2021       false, false, false, true, false, false, false, false,        // BB #6.
   2022       false, false, false, true, true, true, true, true,            // BB #7.
   2023       false, false, false, true, true, true, true, true,            // BB #8.
   2024   };
   2025 
   2026   PrepareIFields(ifields);
   2027   PrepareSFields(sfields);
   2028   PrepareMIRs(mirs);
   2029   PerformGVN();
   2030   ASSERT_EQ(arraysize(mirs), value_names_.size());
   2031   EXPECT_NE(value_names_[0], value_names_[4]);
   2032   EXPECT_NE(value_names_[1], value_names_[5]);
   2033   EXPECT_NE(value_names_[2], value_names_[6]);
   2034   EXPECT_NE(value_names_[3], value_names_[7]);
   2035   EXPECT_NE(value_names_[4], value_names_[8]);
   2036   EXPECT_EQ(value_names_[4], value_names_[12]);
   2037   EXPECT_EQ(value_names_[5], value_names_[13]);
   2038   EXPECT_EQ(value_names_[6], value_names_[14]);
   2039   EXPECT_EQ(value_names_[7], value_names_[15]);
   2040   EXPECT_EQ(value_names_[12], value_names_[20]);
   2041   EXPECT_EQ(value_names_[13], value_names_[21]);
   2042   EXPECT_EQ(value_names_[14], value_names_[22]);
   2043   EXPECT_EQ(value_names_[15], value_names_[23]);
   2044   EXPECT_EQ(value_names_[12], value_names_[28]);
   2045   EXPECT_EQ(value_names_[13], value_names_[29]);
   2046   EXPECT_EQ(value_names_[14], value_names_[30]);
   2047   EXPECT_EQ(value_names_[15], value_names_[31]);
   2048   PerformGVNCodeModifications();
   2049   for (size_t i = 0u; i != arraysize(mirs); ++i) {
   2050     EXPECT_EQ(expected_ignore_null_check[i],
   2051               (mirs_[i].optimization_flags & MIR_IGNORE_NULL_CHECK) != 0) << i;
   2052     EXPECT_EQ(expected_ignore_range_check[i],
   2053               (mirs_[i].optimization_flags & MIR_IGNORE_RANGE_CHECK) != 0) << i;
   2054   }
   2055 }
   2056 
   2057 TEST_F(GlobalValueNumberingTestTwoNestedLoops, IFieldAndPhi) {
   2058   static const IFieldDef ifields[] = {
   2059       { 0u, 1u, 0u, false },  // Int.
   2060   };
   2061   static const MIRDef mirs[] = {
   2062       DEF_MOVE(3, Instruction::MOVE_OBJECT, 0u, 100u),
   2063       DEF_IPUT(3, Instruction::IPUT_OBJECT, 0u, 200u, 0u),
   2064       DEF_PHI2(4, 2u, 0u, 11u),
   2065       DEF_MOVE(4, Instruction::MOVE_OBJECT, 3u, 2u),
   2066       DEF_IGET(4, Instruction::IGET_OBJECT, 4u, 200u, 0u),
   2067       DEF_MOVE(5, Instruction::MOVE_OBJECT, 5u, 3u),
   2068       DEF_IGET(5, Instruction::IGET_OBJECT, 6u, 200u, 0u),
   2069       DEF_MOVE(6, Instruction::MOVE_OBJECT, 7u, 3u),
   2070       DEF_IGET(6, Instruction::IGET_OBJECT, 8u, 200u, 0u),
   2071       DEF_MOVE(7, Instruction::MOVE_OBJECT, 9u, 3u),
   2072       DEF_IGET(7, Instruction::IGET_OBJECT, 10u, 200u, 0u),
   2073       DEF_MOVE(7, Instruction::MOVE_OBJECT, 11u, 300u),
   2074       DEF_IPUT(7, Instruction::IPUT_OBJECT, 11u, 200u, 0u),
   2075       DEF_MOVE(8, Instruction::MOVE_OBJECT, 13u, 3u),
   2076       DEF_IGET(8, Instruction::IGET_OBJECT, 14u, 200u, 0u),
   2077   };
   2078 
   2079   PrepareIFields(ifields);
   2080   PrepareMIRs(mirs);
   2081   PerformGVN();
   2082   ASSERT_EQ(arraysize(mirs), value_names_.size());
   2083   EXPECT_NE(value_names_[0], value_names_[11]);
   2084   EXPECT_NE(value_names_[0], value_names_[2]);
   2085   EXPECT_NE(value_names_[11], value_names_[2]);
   2086   EXPECT_EQ(value_names_[2], value_names_[3]);
   2087   EXPECT_EQ(value_names_[3], value_names_[4]);
   2088   EXPECT_EQ(value_names_[3], value_names_[5]);
   2089   EXPECT_EQ(value_names_[3], value_names_[6]);
   2090   EXPECT_EQ(value_names_[3], value_names_[7]);
   2091   EXPECT_EQ(value_names_[3], value_names_[8]);
   2092   EXPECT_EQ(value_names_[3], value_names_[9]);
   2093   EXPECT_EQ(value_names_[3], value_names_[10]);
   2094   EXPECT_EQ(value_names_[3], value_names_[13]);
   2095   EXPECT_EQ(value_names_[3], value_names_[14]);
   2096 }
   2097 
   2098 TEST_F(GlobalValueNumberingTest, NormalPathToCatchEntry) {
   2099   // When there's an empty catch block, all the exception paths lead to the next block in
   2100   // the normal path and we can also have normal "taken" or "fall-through" branches to that
   2101   // path. Check that LocalValueNumbering::PruneNonAliasingRefsForCatch() can handle it.
   2102   static const BBDef bbs[] = {
   2103       DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
   2104       DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
   2105       DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(5)),
   2106       DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(1)),
   2107       DEF_BB(kDalvikByteCode, DEF_SUCC1(5), DEF_PRED1(3)),
   2108       DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED2(3, 4)),
   2109   };
   2110   static const MIRDef mirs[] = {
   2111       DEF_INVOKE1(4, Instruction::INVOKE_STATIC, 100u),
   2112   };
   2113   PrepareBasicBlocks(bbs);
   2114   BasicBlock* catch_handler = cu_.mir_graph->GetBasicBlock(5u);
   2115   catch_handler->catch_entry = true;
   2116   // Add successor block info to the check block.
   2117   BasicBlock* check_bb = cu_.mir_graph->GetBasicBlock(3u);
   2118   check_bb->successor_block_list_type = kCatch;
   2119   check_bb->successor_blocks = new (&cu_.arena) GrowableArray<SuccessorBlockInfo*>(
   2120       &cu_.arena, 2, kGrowableArraySuccessorBlocks);
   2121   SuccessorBlockInfo* successor_block_info = reinterpret_cast<SuccessorBlockInfo*>
   2122       (cu_.arena.Alloc(sizeof(SuccessorBlockInfo), kArenaAllocSuccessor));
   2123   successor_block_info->block = catch_handler->id;
   2124   check_bb->successor_blocks->Insert(successor_block_info);
   2125   BasicBlock* merge_block = cu_.mir_graph->GetBasicBlock(4u);
   2126   std::swap(merge_block->taken, merge_block->fall_through);
   2127   PrepareMIRs(mirs);
   2128   PerformGVN();
   2129 }
   2130 
   2131 }  // namespace art
   2132