195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko/*
295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko * Copyright (C) 2014 The Android Open Source Project
395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko *
495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko * Licensed under the Apache License, Version 2.0 (the "License");
595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko * you may not use this file except in compliance with the License.
695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko * You may obtain a copy of the License at
795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko *
895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko *      http://www.apache.org/licenses/LICENSE-2.0
995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko *
1095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko * Unless required by applicable law or agreed to in writing, software
1195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko * distributed under the License is distributed on an "AS IS" BASIS,
1295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko * See the License for the specific language governing permissions and
1495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko * limitations under the License.
1595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko */
1695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
1795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#include "compiler_internals.h"
1895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#include "dataflow_iterator.h"
1995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#include "dataflow_iterator-inl.h"
2095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#include "global_value_numbering.h"
2195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#include "local_value_numbering.h"
2295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#include "gtest/gtest.h"
2395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
2495a059793c4c194f026afc74c713cc295d75d91aVladimir Markonamespace art {
2595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
2695a059793c4c194f026afc74c713cc295d75d91aVladimir Markoclass GlobalValueNumberingTest : public testing::Test {
2795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko protected:
2895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  struct IFieldDef {
2995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    uint16_t field_idx;
3095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    uintptr_t declaring_dex_file;
3195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    uint16_t declaring_field_idx;
3295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    bool is_volatile;
3395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
3495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
3595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  struct SFieldDef {
3695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    uint16_t field_idx;
3795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    uintptr_t declaring_dex_file;
3895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    uint16_t declaring_field_idx;
3995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    bool is_volatile;
4095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
4195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
4295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  struct BBDef {
4395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    static constexpr size_t kMaxSuccessors = 4;
4495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    static constexpr size_t kMaxPredecessors = 4;
4595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
4695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    BBType type;
4795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    size_t num_successors;
4895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    BasicBlockId successors[kMaxPredecessors];
4995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    size_t num_predecessors;
5095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    BasicBlockId predecessors[kMaxPredecessors];
5195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
5295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
5395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  struct MIRDef {
5495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    static constexpr size_t kMaxSsaDefs = 2;
5595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    static constexpr size_t kMaxSsaUses = 4;
5695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
5795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    BasicBlockId bbid;
5895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    Instruction::Code opcode;
5995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    int64_t value;
6095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    uint32_t field_info;
6195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    size_t num_uses;
6295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    int32_t uses[kMaxSsaUses];
6395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    size_t num_defs;
6495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    int32_t defs[kMaxSsaDefs];
6595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
6695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
6795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_SUCC0() \
6895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    0u, { }
6995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_SUCC1(s1) \
7095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    1u, { s1 }
7195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_SUCC2(s1, s2) \
7295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    2u, { s1, s2 }
7395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_SUCC3(s1, s2, s3) \
7495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    3u, { s1, s2, s3 }
7595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_SUCC4(s1, s2, s3, s4) \
7695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    4u, { s1, s2, s3, s4 }
7795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_PRED0() \
7895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    0u, { }
7995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_PRED1(p1) \
8095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    1u, { p1 }
8195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_PRED2(p1, p2) \
8295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    2u, { p1, p2 }
8395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_PRED3(p1, p2, p3) \
8495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    3u, { p1, p2, p3 }
8595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_PRED4(p1, p2, p3, p4) \
8695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    4u, { p1, p2, p3, p4 }
8795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_BB(type, succ, pred) \
8895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { type, succ, pred }
8995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
9095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_CONST(bb, opcode, reg, value) \
9195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, value, 0u, 0, { }, 1, { reg } }
9295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_CONST_WIDE(bb, opcode, reg, value) \
9395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, value, 0u, 0, { }, 2, { reg, reg + 1 } }
9495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_CONST_STRING(bb, opcode, reg, index) \
9595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, index, 0u, 0, { }, 1, { reg } }
9695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_IGET(bb, opcode, reg, obj, field_info) \
9795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, field_info, 1, { obj }, 1, { reg } }
9895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_IGET_WIDE(bb, opcode, reg, obj, field_info) \
9995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, field_info, 1, { obj }, 2, { reg, reg + 1 } }
10095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_IPUT(bb, opcode, reg, obj, field_info) \
10195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, field_info, 2, { reg, obj }, 0, { } }
10295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_IPUT_WIDE(bb, opcode, reg, obj, field_info) \
10395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, field_info, 3, { reg, reg + 1, obj }, 0, { } }
10495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_SGET(bb, opcode, reg, field_info) \
10595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, field_info, 0, { }, 1, { reg } }
10695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_SGET_WIDE(bb, opcode, reg, field_info) \
10795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, field_info, 0, { }, 2, { reg, reg + 1 } }
10895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_SPUT(bb, opcode, reg, field_info) \
10995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, field_info, 1, { reg }, 0, { } }
11095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_SPUT_WIDE(bb, opcode, reg, field_info) \
11195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, field_info, 2, { reg, reg + 1 }, 0, { } }
11295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_AGET(bb, opcode, reg, obj, idx) \
11395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, 0u, 2, { obj, idx }, 1, { reg } }
11495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_AGET_WIDE(bb, opcode, reg, obj, idx) \
11595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, 0u, 2, { obj, idx }, 2, { reg, reg + 1 } }
11695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_APUT(bb, opcode, reg, obj, idx) \
11795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, 0u, 3, { reg, obj, idx }, 0, { } }
11895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_APUT_WIDE(bb, opcode, reg, obj, idx) \
11995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, 0u, 4, { reg, reg + 1, obj, idx }, 0, { } }
12095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_INVOKE1(bb, opcode, reg) \
12195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, 0u, 1, { reg }, 0, { } }
12295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_UNIQUE_REF(bb, opcode, reg) \
12395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, 0u, 0, { }, 1, { reg } }  // CONST_CLASS, CONST_STRING, NEW_ARRAY, ...
12495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_IFZ(bb, opcode, reg) \
12595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, 0u, 1, { reg }, 0, { } }
12695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_MOVE(bb, opcode, reg, src) \
12795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, opcode, 0u, 0u, 1, { src }, 1, { reg } }
12895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko#define DEF_PHI2(bb, reg, src1, src2) \
12995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    { bb, static_cast<Instruction::Code>(kMirOpPhi), 0, 0u, 2u, { src1, src2 }, 1, { reg } }
13095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
13195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  void DoPrepareIFields(const IFieldDef* defs, size_t count) {
13295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    cu_.mir_graph->ifield_lowering_infos_.Reset();
13395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    cu_.mir_graph->ifield_lowering_infos_.Resize(count);
13495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    for (size_t i = 0u; i != count; ++i) {
13595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      const IFieldDef* def = &defs[i];
13695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      MirIFieldLoweringInfo field_info(def->field_idx);
13795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      if (def->declaring_dex_file != 0u) {
13895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        field_info.declaring_dex_file_ = reinterpret_cast<const DexFile*>(def->declaring_dex_file);
13995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        field_info.declaring_field_idx_ = def->declaring_field_idx;
14095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        field_info.flags_ = 0u |  // Without kFlagIsStatic.
14195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko            (def->is_volatile ? MirIFieldLoweringInfo::kFlagIsVolatile : 0u);
14295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      }
14395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      cu_.mir_graph->ifield_lowering_infos_.Insert(field_info);
14495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    }
14595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
14695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
14795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  template <size_t count>
14895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  void PrepareIFields(const IFieldDef (&defs)[count]) {
14995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DoPrepareIFields(defs, count);
15095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
15195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
15295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  void DoPrepareSFields(const SFieldDef* defs, size_t count) {
15395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    cu_.mir_graph->sfield_lowering_infos_.Reset();
15495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    cu_.mir_graph->sfield_lowering_infos_.Resize(count);
15595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    for (size_t i = 0u; i != count; ++i) {
15695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      const SFieldDef* def = &defs[i];
15795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      MirSFieldLoweringInfo field_info(def->field_idx);
15895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // Mark even unresolved fields as initialized.
15995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      field_info.flags_ = MirSFieldLoweringInfo::kFlagIsStatic |
16095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko          MirSFieldLoweringInfo::kFlagIsInitialized;
16195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      if (def->declaring_dex_file != 0u) {
16295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        field_info.declaring_dex_file_ = reinterpret_cast<const DexFile*>(def->declaring_dex_file);
16395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        field_info.declaring_field_idx_ = def->declaring_field_idx;
16495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        field_info.flags_ |= (def->is_volatile ? MirSFieldLoweringInfo::kFlagIsVolatile : 0u);
16595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      }
16695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      cu_.mir_graph->sfield_lowering_infos_.Insert(field_info);
16795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    }
16895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
16995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
17095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  template <size_t count>
17195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  void PrepareSFields(const SFieldDef (&defs)[count]) {
17295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DoPrepareSFields(defs, count);
17395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
17495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
17595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  void DoPrepareBasicBlocks(const BBDef* defs, size_t count) {
17695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    cu_.mir_graph->block_id_map_.clear();
17795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    cu_.mir_graph->block_list_.Reset();
17895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    ASSERT_LT(3u, count);  // null, entry, exit and at least one bytecode block.
17995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    ASSERT_EQ(kNullBlock, defs[0].type);
18095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    ASSERT_EQ(kEntryBlock, defs[1].type);
18195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    ASSERT_EQ(kExitBlock, defs[2].type);
18295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    for (size_t i = 0u; i != count; ++i) {
18395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      const BBDef* def = &defs[i];
18495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      BasicBlock* bb = cu_.mir_graph->NewMemBB(def->type, i);
18595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      cu_.mir_graph->block_list_.Insert(bb);
18695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      if (def->num_successors <= 2) {
18795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        bb->successor_block_list_type = kNotUsed;
18895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        bb->successor_blocks = nullptr;
18995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        bb->fall_through = (def->num_successors >= 1) ? def->successors[0] : 0u;
19095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        bb->taken = (def->num_successors >= 2) ? def->successors[1] : 0u;
19195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      } else {
19295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        bb->successor_block_list_type = kPackedSwitch;
19395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        bb->fall_through = 0u;
19495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        bb->taken = 0u;
19595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        bb->successor_blocks = new (&cu_.arena) GrowableArray<SuccessorBlockInfo*>(
19695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko            &cu_.arena, def->num_successors, kGrowableArraySuccessorBlocks);
19795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        for (size_t j = 0u; j != def->num_successors; ++j) {
19895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko          SuccessorBlockInfo* successor_block_info =
19995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko              static_cast<SuccessorBlockInfo*>(cu_.arena.Alloc(sizeof(SuccessorBlockInfo),
20095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko                                                               kArenaAllocSuccessor));
20195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko          successor_block_info->block = j;
20295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko          successor_block_info->key = 0u;  // Not used by class init check elimination.
20395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko          bb->successor_blocks->Insert(successor_block_info);
20495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        }
20595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      }
20695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      bb->predecessors = new (&cu_.arena) GrowableArray<BasicBlockId>(
20795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko          &cu_.arena, def->num_predecessors, kGrowableArrayPredecessors);
20895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      for (size_t j = 0u; j != def->num_predecessors; ++j) {
20995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        ASSERT_NE(0u, def->predecessors[j]);
21095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        bb->predecessors->Insert(def->predecessors[j]);
21195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      }
21295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      if (def->type == kDalvikByteCode || def->type == kEntryBlock || def->type == kExitBlock) {
21395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        bb->data_flow_info = static_cast<BasicBlockDataFlow*>(
21495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko            cu_.arena.Alloc(sizeof(BasicBlockDataFlow), kArenaAllocDFInfo));
215b19955d3c8fbd9588f7e17299e559d02938154b6Vladimir Marko        bb->data_flow_info->live_in_v = live_in_v_;
21695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      }
21795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    }
21895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    cu_.mir_graph->num_blocks_ = count;
21995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    ASSERT_EQ(count, cu_.mir_graph->block_list_.Size());
22095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    cu_.mir_graph->entry_block_ = cu_.mir_graph->block_list_.Get(1);
22195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    ASSERT_EQ(kEntryBlock, cu_.mir_graph->entry_block_->block_type);
22295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    cu_.mir_graph->exit_block_ = cu_.mir_graph->block_list_.Get(2);
22395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    ASSERT_EQ(kExitBlock, cu_.mir_graph->exit_block_->block_type);
22495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
22595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
22695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  template <size_t count>
22795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  void PrepareBasicBlocks(const BBDef (&defs)[count]) {
22895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DoPrepareBasicBlocks(defs, count);
22995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
23095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
23195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  void DoPrepareMIRs(const MIRDef* defs, size_t count) {
23295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    mir_count_ = count;
23395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    mirs_ = reinterpret_cast<MIR*>(cu_.arena.Alloc(sizeof(MIR) * count, kArenaAllocMIR));
23495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    ssa_reps_.resize(count);
23595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    for (size_t i = 0u; i != count; ++i) {
23695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      const MIRDef* def = &defs[i];
23795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      MIR* mir = &mirs_[i];
23895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      ASSERT_LT(def->bbid, cu_.mir_graph->block_list_.Size());
23995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      BasicBlock* bb = cu_.mir_graph->block_list_.Get(def->bbid);
24095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      bb->AppendMIR(mir);
24195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      mir->dalvikInsn.opcode = def->opcode;
24295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      mir->dalvikInsn.vB = static_cast<int32_t>(def->value);
24395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      mir->dalvikInsn.vB_wide = def->value;
24495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      if (def->opcode >= Instruction::IGET && def->opcode <= Instruction::IPUT_SHORT) {
24595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        ASSERT_LT(def->field_info, cu_.mir_graph->ifield_lowering_infos_.Size());
24695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        mir->meta.ifield_lowering_info = def->field_info;
24795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      } else if (def->opcode >= Instruction::SGET && def->opcode <= Instruction::SPUT_SHORT) {
24895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        ASSERT_LT(def->field_info, cu_.mir_graph->sfield_lowering_infos_.Size());
24995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        mir->meta.sfield_lowering_info = def->field_info;
25095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      } else if (def->opcode == static_cast<Instruction::Code>(kMirOpPhi)) {
25195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        mir->meta.phi_incoming = static_cast<BasicBlockId*>(
25295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko            allocator_->Alloc(def->num_uses * sizeof(BasicBlockId), kArenaAllocDFInfo));
25395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        for (size_t i = 0; i != def->num_uses; ++i) {
25495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko          mir->meta.phi_incoming[i] = bb->predecessors->Get(i);
25595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        }
25695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      }
25795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      mir->ssa_rep = &ssa_reps_[i];
25895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      mir->ssa_rep->num_uses = def->num_uses;
25995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      mir->ssa_rep->uses = const_cast<int32_t*>(def->uses);  // Not modified by LVN.
26095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      mir->ssa_rep->fp_use = nullptr;  // Not used by LVN.
26195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      mir->ssa_rep->num_defs = def->num_defs;
26295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      mir->ssa_rep->defs = const_cast<int32_t*>(def->defs);  // Not modified by LVN.
26395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      mir->ssa_rep->fp_def = nullptr;  // Not used by LVN.
26495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      mir->dalvikInsn.opcode = def->opcode;
26595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      mir->offset = i;  // LVN uses offset only for debug output
26695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      mir->optimization_flags = 0u;
26795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    }
26895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    mirs_[count - 1u].next = nullptr;
26995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
27095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
27195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  template <size_t count>
27295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  void PrepareMIRs(const MIRDef (&defs)[count]) {
27395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DoPrepareMIRs(defs, count);
27495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
27595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
27695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  void PerformGVN() {
27755fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko    DoPerformGVN<LoopRepeatingTopologicalSortIterator>();
27895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
27995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
28095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  void PerformPreOrderDfsGVN() {
28195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DoPerformGVN<RepeatingPreOrderDfsIterator>();
28295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
28395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
28495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  template <typename IteratorType>
28595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  void DoPerformGVN() {
28655fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko    cu_.mir_graph->SSATransformationStart();
28755fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko    cu_.mir_graph->ComputeDFSOrders();
28855fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko    cu_.mir_graph->ComputeDominators();
28955fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko    cu_.mir_graph->ComputeTopologicalSortOrder();
29055fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko    cu_.mir_graph->SSATransformationEnd();
29195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    ASSERT_TRUE(gvn_ == nullptr);
29295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    gvn_.reset(new (allocator_.get()) GlobalValueNumbering(&cu_, allocator_.get()));
29395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    ASSERT_FALSE(gvn_->CanModify());
29495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    value_names_.resize(mir_count_, 0xffffu);
29595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    IteratorType iterator(cu_.mir_graph.get());
29695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    bool change = false;
29795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    for (BasicBlock* bb = iterator.Next(change); bb != nullptr; bb = iterator.Next(change)) {
29895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      LocalValueNumbering* lvn = gvn_->PrepareBasicBlock(bb);
29995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      if (lvn != nullptr) {
30095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        for (MIR* mir = bb->first_mir_insn; mir != nullptr; mir = mir->next) {
30195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko          value_names_[mir - mirs_] = lvn->GetValueNumber(mir);
30295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        }
30395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      }
30495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      change = (lvn != nullptr) && gvn_->FinishBasicBlock(bb);
30595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      ASSERT_TRUE(gvn_->Good());
30695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    }
30795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
30895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
30995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  void PerformGVNCodeModifications() {
31095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    ASSERT_TRUE(gvn_ != nullptr);
31195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    ASSERT_TRUE(gvn_->Good());
31295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    ASSERT_FALSE(gvn_->CanModify());
31395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    gvn_->AllowModifications();
31455fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko    TopologicalSortIterator iterator(cu_.mir_graph.get());
31595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    for (BasicBlock* bb = iterator.Next(); bb != nullptr; bb = iterator.Next()) {
31695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      LocalValueNumbering* lvn = gvn_->PrepareBasicBlock(bb);
31795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      if (lvn != nullptr) {
31895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        for (MIR* mir = bb->first_mir_insn; mir != nullptr; mir = mir->next) {
31995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko          uint16_t value_name = lvn->GetValueNumber(mir);
32095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko          ASSERT_EQ(value_name, value_names_[mir - mirs_]);
32195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        }
32295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      }
32395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      bool change = (lvn != nullptr) && gvn_->FinishBasicBlock(bb);
32495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      ASSERT_FALSE(change);
32595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      ASSERT_TRUE(gvn_->Good());
32695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    }
32795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
32895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
32995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  GlobalValueNumberingTest()
33095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      : pool_(),
33195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        cu_(&pool_),
33295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        mir_count_(0u),
33395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        mirs_(nullptr),
33495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        ssa_reps_(),
33595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        allocator_(),
33695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko        gvn_(),
337b19955d3c8fbd9588f7e17299e559d02938154b6Vladimir Marko        value_names_(),
338b19955d3c8fbd9588f7e17299e559d02938154b6Vladimir Marko        live_in_v_(new (&cu_.arena) ArenaBitVector(&cu_.arena, kMaxSsaRegs, false, kBitMapMisc)) {
33995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    cu_.mir_graph.reset(new MIRGraph(&cu_, &cu_.arena));
34095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    cu_.access_flags = kAccStatic;  // Don't let "this" interfere with this test.
34195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    allocator_.reset(ScopedArenaAllocator::Create(&cu_.arena_stack));
342b19955d3c8fbd9588f7e17299e559d02938154b6Vladimir Marko    // Bind all possible sregs to live vregs for test purposes.
343b19955d3c8fbd9588f7e17299e559d02938154b6Vladimir Marko    live_in_v_->SetInitialBits(kMaxSsaRegs);
344b19955d3c8fbd9588f7e17299e559d02938154b6Vladimir Marko    cu_.mir_graph->ssa_base_vregs_ = new (&cu_.arena) GrowableArray<int>(&cu_.arena, kMaxSsaRegs);
345b19955d3c8fbd9588f7e17299e559d02938154b6Vladimir Marko    cu_.mir_graph->ssa_subscripts_ = new (&cu_.arena) GrowableArray<int>(&cu_.arena, kMaxSsaRegs);
346b19955d3c8fbd9588f7e17299e559d02938154b6Vladimir Marko    for (unsigned int i = 0; i < kMaxSsaRegs; i++) {
347b19955d3c8fbd9588f7e17299e559d02938154b6Vladimir Marko      cu_.mir_graph->ssa_base_vregs_->Insert(i);
348b19955d3c8fbd9588f7e17299e559d02938154b6Vladimir Marko      cu_.mir_graph->ssa_subscripts_->Insert(0);
349b19955d3c8fbd9588f7e17299e559d02938154b6Vladimir Marko    }
35095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
35195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
352b19955d3c8fbd9588f7e17299e559d02938154b6Vladimir Marko  static constexpr size_t kMaxSsaRegs = 16384u;
353b19955d3c8fbd9588f7e17299e559d02938154b6Vladimir Marko
35495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ArenaPool pool_;
35595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  CompilationUnit cu_;
35695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  size_t mir_count_;
35795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  MIR* mirs_;
35895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  std::vector<SSARepresentation> ssa_reps_;
35995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  std::unique_ptr<ScopedArenaAllocator> allocator_;
36095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  std::unique_ptr<GlobalValueNumbering> gvn_;
36195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  std::vector<uint16_t> value_names_;
362b19955d3c8fbd9588f7e17299e559d02938154b6Vladimir Marko  ArenaBitVector* live_in_v_;
36395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko};
36495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
36595a059793c4c194f026afc74c713cc295d75d91aVladimir Markoclass GlobalValueNumberingTestDiamond : public GlobalValueNumberingTest {
36695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko public:
36795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  GlobalValueNumberingTestDiamond();
36895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
36995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko private:
37095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const BBDef kDiamondBbs[];
37195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko};
37295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
37395a059793c4c194f026afc74c713cc295d75d91aVladimir Markoconst GlobalValueNumberingTest::BBDef GlobalValueNumberingTestDiamond::kDiamondBbs[] = {
37495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
37595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
37695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(6)),
37795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC2(4, 5), DEF_PRED1(1)),  // Block #3, top of the diamond.
37895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(6), DEF_PRED1(3)),     // Block #4, left side.
37995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(6), DEF_PRED1(3)),     // Block #5, right side.
38095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED2(4, 5)),  // Block #6, bottom.
38195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko};
38295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
38395a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoGlobalValueNumberingTestDiamond::GlobalValueNumberingTestDiamond()
38495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    : GlobalValueNumberingTest() {
38595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareBasicBlocks(kDiamondBbs);
38695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
38795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
38895a059793c4c194f026afc74c713cc295d75d91aVladimir Markoclass GlobalValueNumberingTestLoop : public GlobalValueNumberingTest {
38995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko public:
39095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  GlobalValueNumberingTestLoop();
39195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
39295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko private:
39395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const BBDef kLoopBbs[];
39495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko};
39595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
39695a059793c4c194f026afc74c713cc295d75d91aVladimir Markoconst GlobalValueNumberingTest::BBDef GlobalValueNumberingTestLoop::kLoopBbs[] = {
39795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
39895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
39995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(5)),
40095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(1)),
40195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC2(5, 4), DEF_PRED2(3, 4)),  // "taken" loops to self.
40295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED1(4)),
40395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko};
40495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
40595a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoGlobalValueNumberingTestLoop::GlobalValueNumberingTestLoop()
40695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    : GlobalValueNumberingTest() {
40795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareBasicBlocks(kLoopBbs);
40895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
40995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
41095a059793c4c194f026afc74c713cc295d75d91aVladimir Markoclass GlobalValueNumberingTestCatch : public GlobalValueNumberingTest {
41195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko public:
41295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  GlobalValueNumberingTestCatch();
41395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
41495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko private:
41595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const BBDef kCatchBbs[];
41695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko};
41795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
41895a059793c4c194f026afc74c713cc295d75d91aVladimir Markoconst GlobalValueNumberingTest::BBDef GlobalValueNumberingTestCatch::kCatchBbs[] = {
41995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
42095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
42195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(6)),
42295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(1)),     // The top.
42395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(6), DEF_PRED1(3)),     // The throwing insn.
42495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(6), DEF_PRED1(3)),     // Catch handler.
42595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED2(4, 5)),  // The merged block.
42695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko};
42795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
42895a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoGlobalValueNumberingTestCatch::GlobalValueNumberingTestCatch()
42995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    : GlobalValueNumberingTest() {
43095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareBasicBlocks(kCatchBbs);
43195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // Mark catch handler.
43295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  BasicBlock* catch_handler = cu_.mir_graph->GetBasicBlock(5u);
43395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  catch_handler->catch_entry = true;
43495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // Add successor block info to the check block.
43595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  BasicBlock* check_bb = cu_.mir_graph->GetBasicBlock(3u);
43695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  check_bb->successor_block_list_type = kCatch;
43795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  check_bb->successor_blocks = new (&cu_.arena) GrowableArray<SuccessorBlockInfo*>(
43895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      &cu_.arena, 2, kGrowableArraySuccessorBlocks);
43995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  SuccessorBlockInfo* successor_block_info = reinterpret_cast<SuccessorBlockInfo*>
44095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      (cu_.arena.Alloc(sizeof(SuccessorBlockInfo), kArenaAllocSuccessor));
44195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  successor_block_info->block = catch_handler->id;
44295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  check_bb->successor_blocks->Insert(successor_block_info);
44395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
44495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
44595a059793c4c194f026afc74c713cc295d75d91aVladimir Markoclass GlobalValueNumberingTestTwoConsecutiveLoops : public GlobalValueNumberingTest {
44695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko public:
44795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  GlobalValueNumberingTestTwoConsecutiveLoops();
44895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
44995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko private:
45095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const BBDef kTwoConsecutiveLoopsBbs[];
45195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko};
45295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
45395a059793c4c194f026afc74c713cc295d75d91aVladimir Markoconst GlobalValueNumberingTest::BBDef
45495a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoGlobalValueNumberingTestTwoConsecutiveLoops::kTwoConsecutiveLoopsBbs[] = {
45595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
45695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
45795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(9)),
45895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(1)),
45995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC2(5, 6), DEF_PRED2(3, 5)),  // "taken" skips over the loop.
46095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(4)),
46195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(7), DEF_PRED1(4)),
46295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC2(8, 9), DEF_PRED2(6, 8)),  // "taken" skips over the loop.
46395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(7), DEF_PRED1(7)),
46495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED1(7)),
46595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko};
46695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
46795a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoGlobalValueNumberingTestTwoConsecutiveLoops::GlobalValueNumberingTestTwoConsecutiveLoops()
46895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    : GlobalValueNumberingTest() {
46995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareBasicBlocks(kTwoConsecutiveLoopsBbs);
47095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
47195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
47295a059793c4c194f026afc74c713cc295d75d91aVladimir Markoclass GlobalValueNumberingTestTwoNestedLoops : public GlobalValueNumberingTest {
47395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko public:
47495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  GlobalValueNumberingTestTwoNestedLoops();
47595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
47695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko private:
47795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const BBDef kTwoNestedLoopsBbs[];
47895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko};
47995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
48095a059793c4c194f026afc74c713cc295d75d91aVladimir Markoconst GlobalValueNumberingTest::BBDef
48195a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoGlobalValueNumberingTestTwoNestedLoops::kTwoNestedLoopsBbs[] = {
48295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
48395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
48495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(8)),
48595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(1)),
48695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC2(5, 8), DEF_PRED2(3, 7)),  // "taken" skips over the loop.
48795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC2(6, 7), DEF_PRED2(4, 6)),  // "taken" skips over the loop.
48895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(5), DEF_PRED1(5)),
48995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(5)),
49095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED1(4)),
49195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko};
49295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
49395a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoGlobalValueNumberingTestTwoNestedLoops::GlobalValueNumberingTestTwoNestedLoops()
49495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    : GlobalValueNumberingTest() {
49595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareBasicBlocks(kTwoNestedLoopsBbs);
49695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
49795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
49895a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestDiamond, NonAliasingIFields) {
49995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const IFieldDef ifields[] = {
50095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
50195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 1u, 1u, 1u, false },  // Int.
50295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 2u, 1u, 2u, false },  // Int.
50395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 3u, 1u, 3u, false },  // Int.
50495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 4u, 1u, 4u, false },  // Short.
50595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 5u, 1u, 5u, false },  // Char.
50695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 6u, 0u, 0u, false },  // Unresolved, Short.
50795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 7u, 1u, 7u, false },  // Int.
50895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 8u, 0u, 0u, false },  // Unresolved, Int.
50995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 9u, 1u, 9u, false },  // Int.
51095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 10u, 1u, 10u, false },  // Int.
51195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 11u, 1u, 11u, false },  // Int.
51295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
51395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
51495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
51595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 100u),
51695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 1u, 100u, 0u),
51795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 2u, 100u, 0u),   // Same as at the top.
51895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
51995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 200u),
52095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 4u, 200u, 1u),
52195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 5u, 200u, 1u),   // Same as at the left side.
52295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
52395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 300u),
52495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 7u, 300u, 2u),
52595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 8u, 1000),
52695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 8u, 300u, 2u),
52795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 10u, 300u, 2u),  // Differs from the top and the CONST.
52895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
52995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 400u),
53095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 12u, 400u, 3u),
53195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 13u, 2000),
53295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 13u, 400u, 3u),
53395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 13u, 400u, 3u),
53495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 16u, 400u, 3u),  // Differs from the top, equals the CONST.
53595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
53695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 500u),
53795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_SHORT, 18u, 500u, 4u),
53895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_CHAR, 19u, 500u, 5u),
53995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT_SHORT, 20u, 500u, 6u),  // Clobbers field #4, not #5.
54095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET_SHORT, 21u, 500u, 4u),  // Differs from the top.
54195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET_CHAR, 22u, 500u, 5u),   // Same as the top.
54295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
54395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 600u),
54495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 601u),
54595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 602u),
54695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 26u, 600u, 7u),
54795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 27u, 601u, 7u),
54895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 28u, 602u, 8u),  // Doesn't clobber field #7 for other refs.
54995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 29u, 600u, 7u),  // Same as the top.
55095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 30u, 601u, 7u),  // Same as the top.
55195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
55295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 700u),
55395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 32u, 3000),
55495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 32u, 700u, 9u),
55595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 32u, 700u, 10u),
55695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 35u, 3001),
55795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 35u, 700u, 9u),
55895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 35u, 700u, 10u),
55995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 38u, 700u, 9u),
56095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 39u, 700u, 10u),  // Same value as read from field #9.
56195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
56295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 800u),
56395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 801u),
56495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 42u, 3000),
56595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 42u, 800u, 11u),
56695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 42u, 801u, 11u),
56795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 45u, 3001),
56895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 45u, 800u, 11u),
56995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 45u, 801u, 11u),
57095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 48u, 800u, 11u),
57195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 49u, 801u, 11u),  // Same value as read from ref 46u.
57295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
57395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // Invoke doesn't interfere with non-aliasing refs. There's one test above where a reference
57495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // escapes in the left BB (we let a reference escape if we use it to store to an unresolved
57595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // field) and the INVOKE in the right BB shouldn't interfere with that either.
57695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_INVOKE1(5, Instruction::INVOKE_STATIC, 48u),
57795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
57895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
57995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareIFields(ifields);
58095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
58195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
58295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
58395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[1], value_names_[2]);
58495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
58595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[4], value_names_[5]);
58695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
58795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[7], value_names_[10]);
58895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[8], value_names_[10]);
58995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
59095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[12], value_names_[16]);
59195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[13], value_names_[16]);
59295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
59395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[18], value_names_[21]);
59495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[19], value_names_[22]);
59595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
59695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[26], value_names_[29]);
59795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[27], value_names_[30]);
59895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
59995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[38], value_names_[39]);
60095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
60195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[48], value_names_[49]);
60295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
60395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
60495a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestDiamond, AliasingIFieldsSingleObject) {
60595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const IFieldDef ifields[] = {
60695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
60795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 1u, 1u, 1u, false },  // Int.
60895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 2u, 1u, 2u, false },  // Int.
60995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 3u, 1u, 3u, false },  // Int.
61095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 4u, 1u, 4u, false },  // Short.
61195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 5u, 1u, 5u, false },  // Char.
61295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 6u, 0u, 0u, false },  // Unresolved, Short.
61395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 7u, 1u, 7u, false },  // Int.
61495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 8u, 1u, 8u, false },  // Int.
61595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
61695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
61795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
61895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 0u, 100u, 0u),
61995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 1u, 100u, 0u),   // Same as at the top.
62095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
62195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 2u, 100u, 1u),
62295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 3u, 100u, 1u),   // Same as at the left side.
62395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
62495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 4u, 100u, 2u),
62595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 5u, 1000),
62695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 5u, 100u, 2u),
62795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 7u, 100u, 2u),   // Differs from the top and the CONST.
62895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
62995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 8u, 100u, 3u),
63095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 9u, 2000),
63195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 9u, 100u, 3u),
63295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 9u, 100u, 3u),
63395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 12u, 100u, 3u),  // Differs from the top, equals the CONST.
63495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
63595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_SHORT, 13u, 100u, 4u),
63695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_CHAR, 14u, 100u, 5u),
63795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT_SHORT, 15u, 100u, 6u),  // Clobbers field #4, not #5.
63895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET_SHORT, 16u, 100u, 4u),  // Differs from the top.
63995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET_CHAR, 17u, 100u, 5u),   // Same as the top.
64095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
64195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 18u, 3000),
64295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 18u, 100u, 7u),
64395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 18u, 100u, 8u),
64495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 21u, 3001),
64595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 21u, 100u, 7u),
64695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 21u, 100u, 8u),
64795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 24u, 100u, 7u),
64895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 25u, 100u, 8u),  // Same value as read from field #7.
64995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
65095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
65195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareIFields(ifields);
65295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
65395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
65495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
65595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[0], value_names_[1]);
65695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
65795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[2], value_names_[3]);
65895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
65995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[4], value_names_[7]);
66095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[5], value_names_[7]);
66195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
66295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[8], value_names_[12]);
66395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[9], value_names_[12]);
66495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
66595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[13], value_names_[16]);
66695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[14], value_names_[17]);
66795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
66895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[24], value_names_[25]);
66995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
67095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
67195a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestDiamond, AliasingIFieldsTwoObjects) {
67295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const IFieldDef ifields[] = {
67395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
67495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 1u, 1u, 1u, false },  // Int.
67595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 2u, 1u, 2u, false },  // Int.
67695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 3u, 1u, 3u, false },  // Int.
67795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 4u, 1u, 4u, false },  // Short.
67895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 5u, 1u, 5u, false },  // Char.
67995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 6u, 0u, 0u, false },  // Unresolved, Short.
68095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 7u, 1u, 7u, false },  // Int.
68195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 8u, 1u, 8u, false },  // Int.
68295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
68395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
68495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
68595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 0u, 100u, 0u),
68695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 1u, 101u, 0u),   // May alias with the IGET at the top.
68795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 2u, 100u, 0u),   // Differs from the top.
68895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
68995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 3u, 100u, 1u),
69095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 3u, 101u, 1u),   // If aliasing, stores the same value.
69195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 5u, 100u, 1u),   // Same as the top.
69295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
69395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 6u, 100u, 2u),
69495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 7u, 1000),
69595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 7u, 101u, 2u),
69695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 9u, 100u, 2u),   // Differs from the top and the CONST.
69795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
69895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 10u, 100u, 3u),
69995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 11u, 2000),
70095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 11u, 101u, 3u),
70195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 11u, 101u, 3u),
70295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 14u, 100u, 3u),  // Differs from the top and the CONST.
70395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
70495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_SHORT, 15u, 100u, 4u),
70595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_CHAR, 16u, 100u, 5u),
70695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT_SHORT, 17u, 101u, 6u),  // Clobbers field #4, not #5.
70795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET_SHORT, 18u, 100u, 4u),  // Differs from the top.
70895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET_CHAR, 19u, 100u, 5u),   // Same as the top.
70995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
71095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 20u, 3000),
71195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 20u, 100u, 7u),
71295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 20u, 101u, 8u),
71395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 23u, 3001),
71495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 23u, 100u, 7u),
71595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 23u, 101u, 8u),
71695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 26u, 100u, 7u),
71795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 27u, 101u, 8u),  // Same value as read from field #7.
71895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
71995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
72095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareIFields(ifields);
72195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
72295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
72395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
72495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[0], value_names_[2]);
72595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
72695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[3], value_names_[5]);
72795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
72895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[6], value_names_[9]);
72995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[7], value_names_[9]);
73095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
73195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[10], value_names_[14]);
73295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[10], value_names_[14]);
73395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
73495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[15], value_names_[18]);
73595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[16], value_names_[19]);
73695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
73795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[26], value_names_[27]);
73895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
73995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
74095a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestDiamond, SFields) {
74195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const SFieldDef sfields[] = {
74295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
74395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 1u, 1u, 1u, false },  // Int.
74495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 2u, 1u, 2u, false },  // Int.
74595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 3u, 1u, 3u, false },  // Int.
74695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 4u, 1u, 4u, false },  // Short.
74795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 5u, 1u, 5u, false },  // Char.
74895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 6u, 0u, 0u, false },  // Unresolved, Short.
74995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 7u, 1u, 7u, false },  // Int.
75095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 8u, 1u, 8u, false },  // Int.
75195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
75295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
75395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
75495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(3, Instruction::SGET, 0u, 0u),
75595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(6, Instruction::SGET, 1u, 0u),         // Same as at the top.
75695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
75795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(4, Instruction::SGET, 2u, 1u),
75895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(6, Instruction::SGET, 3u, 1u),         // Same as at the left side.
75995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
76095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(3, Instruction::SGET, 4u, 2u),
76195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 5u, 100),
76295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(5, Instruction::SPUT, 5u, 2u),
76395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(6, Instruction::SGET, 7u, 2u),         // Differs from the top and the CONST.
76495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
76595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(3, Instruction::SGET, 8u, 3u),
76695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 9u, 200),
76795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(4, Instruction::SPUT, 9u, 3u),
76895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(5, Instruction::SPUT, 9u, 3u),
76995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(6, Instruction::SGET, 12u, 3u),        // Differs from the top, equals the CONST.
77095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
77195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(3, Instruction::SGET_SHORT, 13u, 4u),
77295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(3, Instruction::SGET_CHAR, 14u, 5u),
77395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(4, Instruction::SPUT_SHORT, 15u, 6u),  // Clobbers field #4, not #5.
77495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(6, Instruction::SGET_SHORT, 16u, 4u),  // Differs from the top.
77595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(6, Instruction::SGET_CHAR, 17u, 5u),   // Same as the top.
77695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
77795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 18u, 300),
77895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(4, Instruction::SPUT, 18u, 7u),
77995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(4, Instruction::SPUT, 18u, 8u),
78095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 21u, 301),
78195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(5, Instruction::SPUT, 21u, 7u),
78295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(5, Instruction::SPUT, 21u, 8u),
78395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(6, Instruction::SGET, 24u, 7u),
78495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(6, Instruction::SGET, 25u, 8u),        // Same value as read from field #7.
78595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
78695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
78795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareSFields(sfields);
78895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
78995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
79095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
79195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[0], value_names_[1]);
79295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
79395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[2], value_names_[3]);
79495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
79595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[4], value_names_[7]);
79695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[5], value_names_[7]);
79795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
79895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[8], value_names_[12]);
79995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[9], value_names_[12]);
80095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
80195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[13], value_names_[16]);
80295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[14], value_names_[17]);
80395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
80495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[24], value_names_[25]);
80595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
80695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
80795a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestDiamond, NonAliasingArrays) {
80895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
80995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
81095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 100u),
81195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 1u, 100u, 101u),
81295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 2u, 100u, 101u),   // Same as at the top.
81395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
81495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 200u),
81595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::AGET, 4u, 200u, 201u),
81695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::AGET, 5u, 200u, 201u),   // Same as at the left side.
81795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
81895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 300u),
81995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 7u, 300u, 301u),
82095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 8u, 1000),
82195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 8u, 300u, 301u),
82295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 10u, 300u, 301u),  // Differs from the top and the CONST.
82395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
82495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 400u),
82595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 12u, 400u, 401u),
82695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 13u, 2000),
82795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 13u, 400u, 401u),
82895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 13u, 400u, 401u),
82995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 16u, 400u, 401u),  // Differs from the top, equals the CONST.
83095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
83195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 500u),
83295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 18u, 500u, 501u),
83395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 19u, 500u, 502u),  // Clobbers value at index 501u.
83495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 20u, 500u, 501u),  // Differs from the top.
83595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
83695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 600u),
83795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 22u, 3000),
83895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 22u, 600u, 601u),
83995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 22u, 600u, 602u),
84095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 25u, 3001),
84195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 25u, 600u, 601u),
84295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 25u, 600u, 602u),
84395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 28u, 600u, 601u),
84495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 29u, 600u, 602u),  // Same value as read from index 601u.
84595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
84695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 700u),
84795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 701u),
84895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 32u, 700u, 702u),
84995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 33u, 701u, 702u),  // Doesn't interfere with unrelated array.
85095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 34u, 700u, 702u),  // Same value as at the top.
85195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
85295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
85395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
85495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
85595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
85695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[1], value_names_[2]);
85795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
85895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[4], value_names_[5]);
85995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
86095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[7], value_names_[10]);
86195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[8], value_names_[10]);
86295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
86395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[12], value_names_[16]);
86495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[13], value_names_[16]);
86595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
86695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[18], value_names_[20]);
86795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
86895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[28], value_names_[22]);
86995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[28], value_names_[25]);
87095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[28], value_names_[29]);
87195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
87295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[32], value_names_[34]);
87395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
87495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
87595a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestDiamond, AliasingArrays) {
87695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
87795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
87895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // NOTE: We're also testing that these tests really do not interfere with each other.
87995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
88095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET_BOOLEAN, 0u, 100u, 101u),
88195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET_BOOLEAN, 1u, 100u, 101u),  // Same as at the top.
88295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
88395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::AGET_OBJECT, 2u, 200u, 201u),
88495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::AGET_OBJECT, 3u, 200u, 201u),  // Same as at the left side.
88595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
88695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET_WIDE, 4u, 300u, 301u),
88795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST_WIDE, 5u, 1000),
88895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT_WIDE, 5u, 300u, 301u),
88995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET_WIDE, 7u, 300u, 301u),  // Differs from the top and the CONST.
89095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
89195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET_SHORT, 8u, 400u, 401u),
89295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 9u, 2000),
89395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT_SHORT, 9u, 400u, 401u),
89495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT_SHORT, 9u, 400u, 401u),
89595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET_SHORT, 12u, 400u, 401u),  // Differs from the top, == CONST.
89695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
89795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET_CHAR, 13u, 500u, 501u),
89895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT_CHAR, 14u, 500u, 502u),  // Clobbers value at index 501u.
89995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET_CHAR, 15u, 500u, 501u),  // Differs from the top.
90095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
90195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET_BYTE, 16u, 600u, 602u),
90295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT_BYTE, 17u, 601u, 602u),  // Clobbers values in array 600u.
90395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET_BYTE, 18u, 600u, 602u),  // Differs from the top.
90495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
90595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 19u, 3000),
90695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 19u, 700u, 701u),
90795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 19u, 700u, 702u),
90895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 22u, 3001),
90995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 22u, 700u, 701u),
91095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 22u, 700u, 702u),
91195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 25u, 700u, 701u),
91295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 26u, 700u, 702u),  // Same value as read from index 601u.
91395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
91495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
91595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
91695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
91795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
91895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[0], value_names_[1]);
91995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
92095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[2], value_names_[3]);
92195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
92295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[4], value_names_[7]);
92395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[5], value_names_[7]);
92495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
92595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[8], value_names_[12]);
92695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[9], value_names_[12]);
92795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
92895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[13], value_names_[15]);
92995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
93095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[16], value_names_[18]);
93195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
93295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[25], value_names_[19]);
93395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[25], value_names_[22]);
93495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[25], value_names_[26]);
93595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
93695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
93795a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestDiamond, Phi) {
93895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
93995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 0u, 1000),
94095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 1u, 2000),
94195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 2u, 3000),
94295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(4, Instruction::MOVE, 3u, 0u),
94395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(4, Instruction::MOVE, 4u, 1u),
94495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(5, Instruction::MOVE, 5u, 0u),
94595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(5, Instruction::MOVE, 6u, 2u),
94695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 7u, 3u, 5u),    // Same as CONST 0u (1000).
94795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 8u, 3u, 0u),    // Same as CONST 0u (1000).
94895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 9u, 0u, 5u),    // Same as CONST 0u (1000).
94995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 10u, 4u, 5u),   // Merge 1u (2000) and 0u (1000).
95095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 11u, 1u, 5u),   // Merge 1u (2000) and 0u (1000).
95195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 12u, 4u, 0u),   // Merge 1u (2000) and 0u (1000).
95295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 13u, 1u, 0u),   // Merge 1u (2000) and 0u (1000).
95395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 14u, 3u, 6u),   // Merge 0u (1000) and 2u (3000).
95495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 15u, 0u, 6u),   // Merge 0u (1000) and 2u (3000).
95595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 16u, 3u, 2u),   // Merge 0u (1000) and 2u (3000).
95695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 17u, 0u, 2u),   // Merge 0u (1000) and 2u (3000).
95795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 18u, 4u, 6u),   // Merge 1u (2000) and 2u (3000).
95895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 19u, 1u, 6u),   // Merge 1u (2000) and 2u (3000).
95995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 20u, 4u, 2u),   // Merge 1u (2000) and 2u (3000).
96095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 21u, 1u, 2u),   // Merge 1u (2000) and 2u (3000).
96195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
96295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
96395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
96495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
96595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
96695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[0], value_names_[7]);
96795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[0], value_names_[8]);
96895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[0], value_names_[9]);
96995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[10], value_names_[0]);
97095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[10], value_names_[1]);
97195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[10], value_names_[2]);
97295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[10], value_names_[11]);
97395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[10], value_names_[12]);
97495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[10], value_names_[13]);
97595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[14], value_names_[0]);
97695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[14], value_names_[1]);
97795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[14], value_names_[2]);
97895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[14], value_names_[10]);
97995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[14], value_names_[15]);
98095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[14], value_names_[16]);
98195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[14], value_names_[17]);
98295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[18], value_names_[0]);
98395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[18], value_names_[1]);
98495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[18], value_names_[2]);
98595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[18], value_names_[10]);
98695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[18], value_names_[14]);
98795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[18], value_names_[19]);
98895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[18], value_names_[20]);
98995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[18], value_names_[21]);
99095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
99195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
99295a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestLoop, NonAliasingIFields) {
99395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const IFieldDef ifields[] = {
99495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
99595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 1u, 1u, 1u, false },  // Int.
99695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 2u, 1u, 2u, false },  // Int.
99795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 3u, 1u, 3u, false },  // Int.
99895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 4u, 1u, 4u, false },  // Int.
99995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 5u, 1u, 5u, false },  // Short.
100095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 6u, 1u, 6u, false },  // Char.
100195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 7u, 0u, 0u, false },  // Unresolved, Short.
100295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 8u, 1u, 8u, false },  // Int.
100395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 9u, 0u, 0u, false },  // Unresolved, Int.
100495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 10u, 1u, 10u, false },  // Int.
100595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 11u, 1u, 11u, false },  // Int.
100695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
100795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
100895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
100995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 100u),
101095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 1u, 100u, 0u),
101195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 2u, 100u, 0u),   // Same as at the top.
101295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 3u, 100u, 0u),   // Same as at the top.
101395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
101495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 200u),
101595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 5u, 200u, 1u),
101695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 6u, 200u, 1u),   // Differs from top...
101795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 7u, 200u, 1u),   // Because of this IPUT.
101895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 8u, 200u, 1u),   // Differs from top and the loop IGET.
101995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
102095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 300u),
102195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 10u, 300u, 2u),
102295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 11u, 300u, 2u),  // Because of this IPUT...
102395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 12u, 300u, 2u),  // Differs from top.
102495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 13u, 300u, 2u),  // Differs from top but same as the loop IGET.
102595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
102695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 400u),
102795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 401u),
102895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 16u, 3000),
102995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(3, Instruction::IPUT, 16u, 400u, 3u),
103095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(3, Instruction::IPUT, 16u, 400u, 4u),
103195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(3, Instruction::IPUT, 16u, 401u, 3u),
103295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 20u, 400u, 3u),  // Differs from 16u and 23u.
103395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 21u, 400u, 4u),  // Same as 20u.
103495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 22u, 401u, 3u),  // Same as 20u.
103595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 23u, 4000),
103695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 23u, 400u, 3u),
103795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 23u, 400u, 4u),
103895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 23u, 401u, 3u),
103995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 27u, 400u, 3u),  // Differs from 16u and 20u...
104095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 28u, 400u, 4u),  // and same as the CONST 23u
104195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 29u, 400u, 4u),  // and same as the CONST 23u.
104295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
104395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 500u),
104495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_SHORT, 31u, 500u, 5u),
104595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_CHAR, 32u, 500u, 6u),
104695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT_SHORT, 33u, 500u, 7u),  // Clobbers field #5, not #6.
104795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET_SHORT, 34u, 500u, 5u),  // Differs from the top.
104895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET_CHAR, 35u, 500u, 6u),   // Same as the top.
104995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
105095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 600u),
105195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 601u),
105295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 602u),
105395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 39u, 600u, 8u),
105495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 40u, 601u, 8u),
105595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 41u, 602u, 9u),  // Doesn't clobber field #8 for other refs.
105695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 42u, 600u, 8u),  // Same as the top.
105795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 43u, 601u, 8u),  // Same as the top.
105895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
105995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 700u),
106095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 701u),
106195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 46u, 3000),
106295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(3, Instruction::IPUT, 46u, 700u, 10u),
106395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(3, Instruction::IPUT, 46u, 700u, 11u),
106495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(3, Instruction::IPUT, 46u, 701u, 10u),
106595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 50u, 700u, 10u),  // Differs from the CONSTs 46u and 53u.
106695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 51u, 700u, 11u),  // Same as 50u.
106795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 52u, 701u, 10u),  // Same as 50u.
106895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 53u, 3001),
106995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 53u, 700u, 10u),
107095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 53u, 700u, 11u),
107195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 53u, 701u, 10u),
107295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 57u, 700u, 10u),  // Same as the CONST 53u.
107395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 58u, 700u, 11u),  // Same as the CONST 53u.
107495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 59u, 701u, 10u),  // Same as the CONST 53u.
107595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
107695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
107795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareIFields(ifields);
107895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
107995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
108095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
108195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[1], value_names_[2]);
108295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[1], value_names_[3]);
108395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
108495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[5], value_names_[6]);
108595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[5], value_names_[7]);
108695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[6], value_names_[7]);
108795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
108895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[10], value_names_[12]);
108995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[12], value_names_[13]);
109095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
109195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[20], value_names_[16]);
109295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[20], value_names_[23]);
109395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[20], value_names_[21]);
109495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[20], value_names_[22]);
109595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[27], value_names_[16]);
109695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[27], value_names_[20]);
109795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[27], value_names_[28]);
109895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[27], value_names_[29]);
109995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
110095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[31], value_names_[34]);
110195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[32], value_names_[35]);
110295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
110395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[39], value_names_[42]);
110495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[40], value_names_[43]);
110595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
110695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[50], value_names_[46]);
110795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[50], value_names_[53]);
110895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[50], value_names_[51]);
110995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[50], value_names_[52]);
111095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[57], value_names_[53]);
111195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[58], value_names_[53]);
111295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[59], value_names_[53]);
111395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
111495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
111595a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestLoop, AliasingIFieldsSingleObject) {
111695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const IFieldDef ifields[] = {
111795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
111895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 1u, 1u, 1u, false },  // Int.
111995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 2u, 1u, 2u, false },  // Int.
112095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 3u, 1u, 3u, false },  // Int.
112195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 4u, 1u, 4u, false },  // Int.
112295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 5u, 1u, 5u, false },  // Short.
112395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 6u, 1u, 6u, false },  // Char.
112495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 7u, 0u, 0u, false },  // Unresolved, Short.
112595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
112695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
112795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
112895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 0u, 100u, 0u),
112995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 1u, 100u, 0u),   // Same as at the top.
113095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 2u, 100u, 0u),   // Same as at the top.
113195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
113295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 3u, 100u, 1u),
113395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 4u, 100u, 1u),   // Differs from top...
113495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 5u, 100u, 1u),   // Because of this IPUT.
113595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 6u, 100u, 1u),   // Differs from top and the loop IGET.
113695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
113795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 7u, 100u, 2u),
113895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 8u, 100u, 2u),   // Because of this IPUT...
113995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 9u, 100u, 2u),   // Differs from top.
114095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 10u, 100u, 2u),  // Differs from top but same as the loop IGET.
114195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
114295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 11u, 3000),
114395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(3, Instruction::IPUT, 11u, 100u, 3u),
114495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(3, Instruction::IPUT, 11u, 100u, 4u),
114595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 14u, 100u, 3u),  // Differs from 11u and 16u.
114695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 15u, 100u, 4u),  // Same as 14u.
114795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 16u, 4000),
114895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 16u, 100u, 3u),
114995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 16u, 100u, 4u),
115095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 19u, 100u, 3u),  // Differs from 11u and 14u...
115195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 20u, 100u, 4u),  // and same as the CONST 16u.
115295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
115395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_SHORT, 21u, 100u, 5u),
115495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_CHAR, 22u, 100u, 6u),
115595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT_SHORT, 23u, 100u, 7u),  // Clobbers field #5, not #6.
115695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET_SHORT, 24u, 100u, 5u),  // Differs from the top.
115795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET_CHAR, 25u, 100u, 6u),   // Same as the top.
115895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
115995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
116095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareIFields(ifields);
116195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
116295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
116395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
116495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[0], value_names_[1]);
116595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[0], value_names_[2]);
116695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
116795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[3], value_names_[4]);
116895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[3], value_names_[6]);
116995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[4], value_names_[6]);
117095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
117195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[7], value_names_[9]);
117295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[9], value_names_[10]);
117395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
117495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[14], value_names_[11]);
117595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[14], value_names_[16]);
117695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[14], value_names_[15]);
117795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[19], value_names_[11]);
117895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[19], value_names_[14]);
117995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[19], value_names_[16]);
118095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[19], value_names_[20]);
118195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
118295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[21], value_names_[24]);
118395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[22], value_names_[25]);
118495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
118595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
118695a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestLoop, AliasingIFieldsTwoObjects) {
118795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const IFieldDef ifields[] = {
118895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
118995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 1u, 1u, 1u, false },  // Int.
119095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 2u, 1u, 2u, false },  // Int.
119195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 3u, 1u, 3u, false },  // Short.
119295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 4u, 1u, 4u, false },  // Char.
119395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 5u, 0u, 0u, false },  // Unresolved, Short.
119495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 6u, 1u, 6u, false },  // Int.
119595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 7u, 1u, 7u, false },  // Int.
119695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
119795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
119895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
119995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 0u, 100u, 0u),
120095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 1u, 101u, 0u),   // May alias with the IGET at the top.
120195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 2u, 100u, 0u),   // Differs from the top.
120295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
120395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 3u, 100u, 1u),
120495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 3u, 101u, 1u),   // If aliasing, stores the same value.
120595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 5u, 100u, 1u),   // Same as the top.
120695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
120795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 6u, 100u, 2u),
120895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 7u, 1000),
120995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 7u, 101u, 2u),
121095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 9u, 100u, 2u),   // Differs from the top and the CONST.
121195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
121295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_SHORT, 10u, 100u, 3u),
121395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_CHAR, 11u, 100u, 4u),
121495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT_SHORT, 12u, 101u, 5u),  // Clobbers field #3, not #4.
121595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET_SHORT, 13u, 100u, 3u),  // Differs from the top.
121695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET_CHAR, 14u, 100u, 4u),   // Same as the top.
121795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
121895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 15u, 3000),
121995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(3, Instruction::IPUT, 15u, 100u, 6u),
122095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(3, Instruction::IPUT, 15u, 100u, 7u),
122195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(3, Instruction::IPUT, 15u, 101u, 6u),
122295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 19u, 100u, 6u),  // Differs from CONSTs 15u and 22u.
122395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 20u, 100u, 7u),  // Same value as 19u.
122495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 21u, 101u, 6u),  // Same value as read from field #7.
122595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 22u, 3001),
122695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 22u, 100u, 6u),
122795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 22u, 100u, 7u),
122895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 22u, 101u, 6u),
122995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 26u, 100u, 6u),  // Same as CONST 22u.
123095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 27u, 100u, 7u),  // Same as CONST 22u.
123195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 28u, 101u, 6u),  // Same as CONST 22u.
123295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
123395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
123495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareIFields(ifields);
123595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
123695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
123795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
123895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[0], value_names_[2]);
123995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
124095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[3], value_names_[5]);
124195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
124295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[6], value_names_[9]);
124395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[7], value_names_[9]);
124495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
124595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[10], value_names_[13]);
124695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[11], value_names_[14]);
124795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
124895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[19], value_names_[15]);
124995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[19], value_names_[22]);
125095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[22], value_names_[26]);
125195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[22], value_names_[27]);
125295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[22], value_names_[28]);
125395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
125495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
125595a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestLoop, IFieldToBaseDependency) {
125695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const IFieldDef ifields[] = {
125795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
125895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
125995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
126095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // For the IGET that loads sreg 3u using base 2u, the following IPUT creates a dependency
126195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // from the field value to the base. However, this dependency does not result in an
126295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // infinite loop since the merge of the field value for base 0u gets assigned a value name
126395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // based only on the base 0u, not on the actual value, and breaks the dependency cycle.
126495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 0u, 100u, 0u),
126595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 1u, 0u, 0u),
126695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 2u, 0u, 0u),
126795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 3u, 2u, 0u),
126895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 3u, 0u, 0u),
126995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 5u, 0u, 0u),
127095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
127195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
127295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareIFields(ifields);
127395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
127495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
127595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
127695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[1], value_names_[2]);
127795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[3], value_names_[5]);
127895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
127995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
128095a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestLoop, SFields) {
128195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const SFieldDef sfields[] = {
128295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
128395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 1u, 1u, 1u, false },  // Int.
128495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 2u, 1u, 2u, false },  // Int.
128595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
128695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
128795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
128895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(3, Instruction::SGET, 0u, 0u),
128995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(4, Instruction::SGET, 1u, 0u),         // Same as at the top.
129095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(5, Instruction::SGET, 2u, 0u),         // Same as at the top.
129195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
129295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(3, Instruction::SGET, 3u, 1u),
129395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(4, Instruction::SGET, 4u, 1u),         // Differs from top...
129495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(4, Instruction::SPUT, 5u, 1u),         // Because of this SPUT.
129595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(5, Instruction::SGET, 6u, 1u),         // Differs from top and the loop SGET.
129695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
129795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(3, Instruction::SGET, 7u, 2u),
129895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(4, Instruction::SPUT, 8u, 2u),         // Because of this SPUT...
129995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(4, Instruction::SGET, 9u, 2u),         // Differs from top.
130095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(5, Instruction::SGET, 10u, 2u),        // Differs from top but same as the loop SGET.
130195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
130295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
130395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareSFields(sfields);
130495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
130595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
130695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
130795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[0], value_names_[1]);
130895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[0], value_names_[2]);
130995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
131095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[3], value_names_[4]);
131195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[3], value_names_[6]);
131295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[4], value_names_[5]);
131395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
131495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[7], value_names_[9]);
131595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[9], value_names_[10]);
131695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
131795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
131895a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestLoop, NonAliasingArrays) {
131995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
132095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
132195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 100u),
132295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 1u, 100u, 101u),
132395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(4, Instruction::AGET, 2u, 100u, 101u),   // Same as at the top.
132495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 3u, 100u, 101u),   // Same as at the top.
132595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
132695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 200u),
132795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 5u, 200u, 201u),
132895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(4, Instruction::AGET, 6u, 200u, 201u),  // Differs from top...
132995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 7u, 200u, 201u),  // Because of this IPUT.
133095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 8u, 200u, 201u),  // Differs from top and the loop AGET.
133195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
133295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 300u),
133395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 10u, 300u, 301u),
133495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 11u, 300u, 301u),  // Because of this IPUT...
133595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(4, Instruction::AGET, 12u, 300u, 301u),  // Differs from top.
133695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 13u, 300u, 301u),  // Differs from top but == the loop AGET.
133795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
133895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 400u),
133995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 15u, 3000),
134095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(3, Instruction::APUT, 15u, 400u, 401u),
134195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(3, Instruction::APUT, 15u, 400u, 402u),
134295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(4, Instruction::AGET, 18u, 400u, 401u),  // Differs from 15u and 20u.
134395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(4, Instruction::AGET, 19u, 400u, 402u),  // Same as 18u.
134495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 20u, 4000),
134595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 20u, 400u, 401u),
134695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 20u, 400u, 402u),
134795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 23u, 400u, 401u),  // Differs from 15u and 18u...
134895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 24u, 400u, 402u),  // and same as the CONST 20u.
134995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
135095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 500u),
135195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 26u, 500u, 501u),
135295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 27u, 500u, 502u),  // Clobbers element at index 501u.
135395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 28u, 500u, 501u),  // Differs from the top.
135495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
135595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
135695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
135795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
135895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
135995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[1], value_names_[2]);
136095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[1], value_names_[3]);
136195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
136295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[5], value_names_[6]);
136395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[5], value_names_[8]);
136495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[6], value_names_[8]);
136595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
136695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[10], value_names_[12]);
136795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[12], value_names_[13]);
136895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
136995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[18], value_names_[15]);
137095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[18], value_names_[20]);
137195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[18], value_names_[19]);
137295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[23], value_names_[15]);
137395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[23], value_names_[18]);
137495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[23], value_names_[20]);
137595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[23], value_names_[24]);
137695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
137795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[26], value_names_[28]);
137895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
137995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
138095a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestLoop, AliasingArrays) {
138195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
138295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      // NOTE: MIRs here are ordered by unique tests. They will be put into appropriate blocks.
138395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET_WIDE, 0u, 100u, 101u),
138495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(4, Instruction::AGET_WIDE, 1u, 100u, 101u),   // Same as at the top.
138595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET_WIDE, 2u, 100u, 101u),   // Same as at the top.
138695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
138795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET_BYTE, 3u, 200u, 201u),
138895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(4, Instruction::AGET_BYTE, 4u, 200u, 201u),  // Differs from top...
138995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT_BYTE, 5u, 200u, 201u),  // Because of this IPUT.
139095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET_BYTE, 6u, 200u, 201u),  // Differs from top and the loop AGET.
139195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
139295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 7u, 300u, 301u),
139395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 8u, 300u, 301u),   // Because of this IPUT...
139495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(4, Instruction::AGET, 9u, 300u, 301u),   // Differs from top.
139595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 10u, 300u, 301u),  // Differs from top but == the loop AGET.
139695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
139795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 11u, 3000),
139895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(3, Instruction::APUT_CHAR, 11u, 400u, 401u),
139995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(3, Instruction::APUT_CHAR, 11u, 400u, 402u),
140095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(4, Instruction::AGET_CHAR, 14u, 400u, 401u),  // Differs from 11u and 16u.
140195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(4, Instruction::AGET_CHAR, 15u, 400u, 402u),  // Same as 14u.
140295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 16u, 4000),
140395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT_CHAR, 16u, 400u, 401u),
140495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT_CHAR, 16u, 400u, 402u),
140595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET_CHAR, 19u, 400u, 401u),  // Differs from 11u and 14u...
140695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET_CHAR, 20u, 400u, 402u),  // and same as the CONST 16u.
140795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
140895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET_SHORT, 21u, 500u, 501u),
140995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT_SHORT, 22u, 500u, 502u),  // Clobbers element at index 501u.
141095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET_SHORT, 23u, 500u, 501u),  // Differs from the top.
141195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
141295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET_OBJECT, 24u, 600u, 601u),
141395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT_OBJECT, 25u, 601u, 602u),  // Clobbers 600u/601u.
141495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET_OBJECT, 26u, 600u, 601u),  // Differs from the top.
141595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
141695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET_BOOLEAN, 27u, 700u, 701u),
141795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT_BOOLEAN, 27u, 701u, 702u),  // Storing the same value.
141895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET_BOOLEAN, 29u, 700u, 701u),  // Differs from the top.
141995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
142095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
142195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
142295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
142395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
142495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[0], value_names_[1]);
142595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[0], value_names_[2]);
142695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
142795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[3], value_names_[4]);
142895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[3], value_names_[6]);
142995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[4], value_names_[6]);
143095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
143195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[7], value_names_[9]);
143295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[9], value_names_[10]);
143395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
143495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[14], value_names_[11]);
143595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[14], value_names_[16]);
143695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[14], value_names_[15]);
143795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[19], value_names_[11]);
143895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[19], value_names_[14]);
143995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[19], value_names_[16]);
144095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[19], value_names_[20]);
144195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
144295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[21], value_names_[23]);
144395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
144495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[24], value_names_[26]);
144595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
144695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[27], value_names_[29]);
144795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
144895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
144995a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestLoop, Phi) {
145095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
145195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 0u, 1000),
145295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(4, 1u, 0u, 6u),                     // Merge CONST 0u (1000) with the same.
145395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(4, 2u, 0u, 7u),                     // Merge CONST 0u (1000) with the Phi itself.
145495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(4, 3u, 0u, 8u),                     // Merge CONST 0u (1000) and CONST 4u (2000).
145595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(4, 4u, 0u, 9u),                     // Merge CONST 0u (1000) and Phi 3u.
145695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 5u, 2000),
145795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(4, Instruction::MOVE, 6u, 0u),
145895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(4, Instruction::MOVE, 7u, 2u),
145995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(4, Instruction::MOVE, 8u, 5u),
146095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(4, Instruction::MOVE, 9u, 3u),
146195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
146295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
146395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
146495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
146595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
146695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[1], value_names_[0]);
146795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[2], value_names_[0]);
146895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
146995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[3], value_names_[0]);
147095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[3], value_names_[5]);
147195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[4], value_names_[0]);
147295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[4], value_names_[5]);
147395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[4], value_names_[3]);
147495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
147595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
147695a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestCatch, IFields) {
147795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const IFieldDef ifields[] = {
147895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },
147995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 1u, 1u, 1u, false },
148095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
148195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
148295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 200u),
148395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 201u),
148495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 2u, 100u, 0u),
148595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 3u, 200u, 0u),
148695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET, 4u, 201u, 0u),
148795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_INVOKE1(4, Instruction::INVOKE_STATIC, 201u),     // Clobbering catch, 201u escapes.
148895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET, 6u, 100u, 0u),         // Differs from IGET 2u.
148995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 6u, 100u, 1u),
149095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 6u, 101u, 0u),
149195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 6u, 200u, 0u),
149295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 10u, 100u, 0u),        // Differs from IGETs 2u and 6u.
149395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 11u, 200u, 0u),        // Same as the top.
149495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET, 12u, 201u, 0u),        // Differs from the top, 201u escaped.
149595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 10u, 100u, 1u),
149695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 10u, 101u, 0u),
149795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 10u, 200u, 0u),
149895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 16u, 100u, 0u),        // Differs from IGETs 2u, 6u and 10u.
149995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 17u, 100u, 1u),        // Same as IGET 16u.
150095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 18u, 101u, 0u),        // Same as IGET 16u.
150195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 19u, 200u, 0u),        // Same as IGET 16u.
150295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
150395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
150495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareIFields(ifields);
150595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
150695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
150795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
150895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[2], value_names_[6]);
150995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[2], value_names_[10]);
151095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[6], value_names_[10]);
151195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[3], value_names_[11]);
151295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[4], value_names_[12]);
151395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
151495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[2], value_names_[16]);
151595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[6], value_names_[16]);
151695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[10], value_names_[16]);
151795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[16], value_names_[17]);
151895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[16], value_names_[18]);
151995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[16], value_names_[19]);
152095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
152195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
152295a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestCatch, SFields) {
152395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const SFieldDef sfields[] = {
152495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },
152595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 1u, 1u, 1u, false },
152695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
152795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
152895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(3, Instruction::SGET, 0u, 0u),
152995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_INVOKE1(4, Instruction::INVOKE_STATIC, 100u),     // Clobbering catch.
153095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(4, Instruction::SGET, 2u, 0u),               // Differs from SGET 0u.
153195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(4, Instruction::SPUT, 2u, 1u),
153295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(5, Instruction::SGET, 4u, 0u),               // Differs from SGETs 0u and 2u.
153395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(5, Instruction::SPUT, 4u, 1u),
153495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(6, Instruction::SGET, 6u, 0u),               // Differs from SGETs 0u, 2u and 4u.
153595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(6, Instruction::SGET, 7u, 1u),               // Same as field #1.
153695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
153795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
153895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareSFields(sfields);
153995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
154095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
154195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
154295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[0], value_names_[2]);
154395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[0], value_names_[4]);
154495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[2], value_names_[4]);
154595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[0], value_names_[6]);
154695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[2], value_names_[6]);
154795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[4], value_names_[6]);
154895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[6], value_names_[7]);
154995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
155095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
155195a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestCatch, Arrays) {
155295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
155395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 200u),
155495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 201u),
155595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 2u, 100u, 101u),
155695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 3u, 200u, 202u),
155795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 4u, 200u, 203u),
155895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 5u, 201u, 202u),
155995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET, 6u, 201u, 203u),
156095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_INVOKE1(4, Instruction::INVOKE_STATIC, 201u),     // Clobbering catch, 201u escapes.
156195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(4, Instruction::AGET, 8u, 100u, 101u),       // Differs from AGET 2u.
156295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 8u, 100u, 102u),
156395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 8u, 200u, 202u),
156495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 8u, 200u, 203u),
156595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 8u, 201u, 202u),
156695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 8u, 201u, 203u),
156795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 14u, 100u, 101u),      // Differs from AGETs 2u and 8u.
156895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 15u, 200u, 202u),      // Same as AGET 3u.
156995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 16u, 200u, 203u),      // Same as AGET 4u.
157095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 17u, 201u, 202u),      // Differs from AGET 5u.
157195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 18u, 201u, 203u),      // Differs from AGET 6u.
157295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 14u, 100u, 102u),
157395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 14u, 200u, 202u),
157495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 14u, 200u, 203u),
157595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 14u, 201u, 202u),
157695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 14u, 201u, 203u),
157795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 24u, 100u, 101u),      // Differs from AGETs 2u, 8u and 14u.
157895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 25u, 100u, 101u),      // Same as AGET 24u.
157995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 26u, 200u, 202u),      // Same as AGET 24u.
158095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 27u, 200u, 203u),      // Same as AGET 24u.
158195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 28u, 201u, 202u),      // Same as AGET 24u.
158295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 29u, 201u, 203u),      // Same as AGET 24u.
158395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
158495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
158595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
158695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
158795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
158895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[2], value_names_[8]);
158995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[2], value_names_[14]);
159095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[8], value_names_[14]);
159195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[3], value_names_[15]);
159295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[4], value_names_[16]);
159395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[5], value_names_[17]);
159495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[6], value_names_[18]);
159595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[2], value_names_[24]);
159695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[8], value_names_[24]);
159795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[14], value_names_[24]);
159895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[24], value_names_[25]);
159995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[24], value_names_[26]);
160095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[24], value_names_[27]);
160195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[24], value_names_[28]);
160295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[24], value_names_[29]);
160395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
160495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
160595a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestCatch, Phi) {
160695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
160795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 0u, 1000),
160895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 1u, 2000),
160995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(3, Instruction::MOVE, 2u, 1u),
161095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_INVOKE1(4, Instruction::INVOKE_STATIC, 100u),     // Clobbering catch.
161195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 4u, 1000),
161295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 5u, 3000),
161395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(5, Instruction::MOVE, 6u, 5u),
161495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 7u, 0u, 4u),
161595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 8u, 0u, 5u),
161695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 9u, 0u, 6u),
161795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 10u, 1u, 4u),
161895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 11u, 1u, 5u),
161995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 12u, 1u, 6u),
162095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 13u, 2u, 4u),
162195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 14u, 2u, 5u),
162295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 15u, 2u, 6u),
162395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
162495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
162595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
162695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
162795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(value_names_[4], value_names_[0]);  // Both CONSTs are 1000.
162895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[7], value_names_[0]);  // Merging CONST 0u and CONST 4u, both 1000.
162995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[8], value_names_[0]);
163095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[8], value_names_[5]);
163195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[9], value_names_[8]);
163295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[10], value_names_[1]);
163395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[10], value_names_[4]);
163495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[10], value_names_[8]);
163595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[11], value_names_[1]);
163695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[11], value_names_[5]);
163795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[11], value_names_[8]);
163895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[11], value_names_[10]);
163995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[12], value_names_[11]);
164095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[13], value_names_[10]);
164195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[14], value_names_[11]);
164295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[15], value_names_[11]);
164395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
164495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
164595a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTest, NullCheckIFields) {
164695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const IFieldDef ifields[] = {
164795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Object.
164895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 1u, 1u, 1u, false },  // Object.
164995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
165095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const BBDef bbs[] = {
165195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
165295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
165395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(5)),
165495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC2(4, 5), DEF_PRED1(1)),  // 4 is fall-through, 5 is taken.
165595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC1(5), DEF_PRED1(3)),
165695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED2(3, 4)),
165795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
165895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
165995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_OBJECT, 0u, 100u, 0u),
166095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_OBJECT, 1u, 100u, 1u),
166195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_OBJECT, 2u, 101u, 0u),
166295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IFZ(3, Instruction::IF_NEZ, 0u),            // Null-check for field #0 for taken.
166395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(4, Instruction::NEW_ARRAY, 4u),
166495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT_OBJECT, 4u, 100u, 0u),
166595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT_OBJECT, 4u, 100u, 1u),
166695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT_OBJECT, 4u, 101u, 0u),
166795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET_OBJECT, 8u, 100u, 0u),   // 100u/#0, IF_NEZ/NEW_ARRAY.
166895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET_OBJECT, 9u, 100u, 1u),   // 100u/#1, -/NEW_ARRAY.
166995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET_OBJECT, 10u, 101u, 0u),  // 101u/#0, -/NEW_ARRAY.
167095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 11u, 0),
167195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 12u, 8u, 11u),   // Null-check eliminated.
167295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 13u, 9u, 11u),   // Null-check kept.
167395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 14u, 10u, 11u),  // Null-check kept.
167495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
167595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const bool expected_ignore_null_check[] = {
167695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, true, false, false,                      // BB #3; unimportant.
167795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, true, true, true,                        // BB #4; unimportant.
167895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      true, true, true, false, true, false, false,    // BB #5; only the last three are important.
167995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
168095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
168195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareIFields(ifields);
168295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareBasicBlocks(bbs);
168395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
168495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
168595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
168695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVNCodeModifications();
168795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(expected_ignore_null_check), mir_count_);
168895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  for (size_t i = 0u; i != arraysize(mirs); ++i) {
168995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    EXPECT_EQ(expected_ignore_null_check[i],
169095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko              (mirs_[i].optimization_flags & MIR_IGNORE_NULL_CHECK) != 0) << i;
169195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
169295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
169395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
169495a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTest, NullCheckSFields) {
169595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const SFieldDef sfields[] = {
169695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Object.
169795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 1u, 1u, 1u, false },  // Object.
169895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
169995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const BBDef bbs[] = {
170095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
170195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
170295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(5)),
170395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC2(4, 5), DEF_PRED1(1)),  // 4 is fall-through, 5 is taken.
170495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC1(5), DEF_PRED1(3)),
170595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED2(3, 4)),
170695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
170795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
170895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(3, Instruction::SGET_OBJECT, 0u, 0u),
170995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(3, Instruction::SGET_OBJECT, 1u, 1u),
171095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IFZ(3, Instruction::IF_NEZ, 0u),            // Null-check for field #0 for taken.
171195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(4, Instruction::NEW_ARRAY, 3u),
171295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(4, Instruction::SPUT_OBJECT, 3u, 0u),
171395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(4, Instruction::SPUT_OBJECT, 3u, 1u),
171495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(5, Instruction::SGET_OBJECT, 6u, 0u),  // Field #0 is null-checked, IF_NEZ/NEW_ARRAY.
171595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(5, Instruction::SGET_OBJECT, 7u, 1u),  // Field #1 is not null-checked, -/NEW_ARRAY.
171695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 8u, 0),
171795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 9u, 6u, 8u),     // Null-check eliminated.
171895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 10u, 7u, 8u),    // Null-check kept.
171995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
172095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const bool expected_ignore_null_check[] = {
172195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, false, false, false, false, false, false, false, false, true, false
172295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
172395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
172495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareSFields(sfields);
172595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareBasicBlocks(bbs);
172695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
172795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
172895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
172995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVNCodeModifications();
173095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(expected_ignore_null_check), mir_count_);
173195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  for (size_t i = 0u; i != arraysize(mirs); ++i) {
173295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    EXPECT_EQ(expected_ignore_null_check[i],
173395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko              (mirs_[i].optimization_flags & MIR_IGNORE_NULL_CHECK) != 0) << i;
173495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
173595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
173695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
173795a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTest, NullCheckArrays) {
173895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const BBDef bbs[] = {
173995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
174095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
174195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(5)),
174295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC2(4, 5), DEF_PRED1(1)),  // 4 is fall-through, 5 is taken.
174395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC1(5), DEF_PRED1(3)),
174495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED2(3, 4)),
174595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
174695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
174795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET_OBJECT, 0u, 100u, 102u),
174895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET_OBJECT, 1u, 100u, 103u),
174995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET_OBJECT, 2u, 101u, 102u),
175095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IFZ(3, Instruction::IF_NEZ, 0u),            // Null-check for field #0 for taken.
175195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(4, Instruction::NEW_ARRAY, 4u),
175295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT_OBJECT, 4u, 100u, 102u),
175395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT_OBJECT, 4u, 100u, 103u),
175495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT_OBJECT, 4u, 101u, 102u),
175595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET_OBJECT, 8u, 100u, 102u),   // Null-checked, IF_NEZ/NEW_ARRAY.
175695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET_OBJECT, 9u, 100u, 103u),   // Not null-checked, -/NEW_ARRAY.
175795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET_OBJECT, 10u, 101u, 102u),  // Not null-checked, -/NEW_ARRAY.
175895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 11u, 0),
175995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 12u, 8u, 11u),    // Null-check eliminated.
176095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 13u, 9u, 11u),    // Null-check kept.
176195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 14u, 10u, 11u),   // Null-check kept.
176295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
176395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const bool expected_ignore_null_check[] = {
176495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, true, false, false,                      // BB #3; unimportant.
176595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, true, true, true,                        // BB #4; unimportant.
176695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      true, true, true, false, true, false, false,    // BB #5; only the last three are important.
176795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
176895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
176995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareBasicBlocks(bbs);
177095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
177195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
177295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
177395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVNCodeModifications();
177495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(expected_ignore_null_check), mir_count_);
177595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  for (size_t i = 0u; i != arraysize(mirs); ++i) {
177695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    EXPECT_EQ(expected_ignore_null_check[i],
177795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko              (mirs_[i].optimization_flags & MIR_IGNORE_NULL_CHECK) != 0) << i;
177895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
177995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
178095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
178195a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestDiamond, RangeCheckArrays) {
178295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // NOTE: We don't merge range checks when we merge value names for Phis or memory locations.
178395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
178495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(4, Instruction::AGET, 0u, 100u, 101u),
178595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 1u, 100u, 101u),
178695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(6, Instruction::APUT, 2u, 100u, 101u),
178795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
178895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(4, Instruction::AGET, 3u, 200u, 201u),
178995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 4u, 200u, 202u),
179095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(6, Instruction::APUT, 5u, 200u, 201u),
179195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
179295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(4, Instruction::AGET, 6u, 300u, 302u),
179395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET, 7u, 301u, 302u),
179495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(6, Instruction::APUT, 8u, 300u, 302u),
179595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
179695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const bool expected_ignore_null_check[] = {
179795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, false, true,
179895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, false, true,
179995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, false, false,
180095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
180195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const bool expected_ignore_range_check[] = {
180295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, false, true,
180395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, false, false,
180495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, false, false,
180595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
180695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
180795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
180895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
180995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
181095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVNCodeModifications();
181195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(expected_ignore_null_check), mir_count_);
181295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(expected_ignore_range_check), mir_count_);
181395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  for (size_t i = 0u; i != arraysize(mirs); ++i) {
181495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    EXPECT_EQ(expected_ignore_null_check[i],
181595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko              (mirs_[i].optimization_flags & MIR_IGNORE_NULL_CHECK) != 0) << i;
181695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    EXPECT_EQ(expected_ignore_range_check[i],
181795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko              (mirs_[i].optimization_flags & MIR_IGNORE_RANGE_CHECK) != 0) << i;
181895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
181995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
182095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
182195a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTestDiamond, MergeSameValueInDifferentMemoryLocations) {
182295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const IFieldDef ifields[] = {
182395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
182495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 1u, 1u, 1u, false },  // Int.
182595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
182695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const SFieldDef sfields[] = {
182795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
182895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 1u, 1u, 1u, false },  // Int.
182995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
183095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
183195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_INSTANCE, 100u),
183295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_UNIQUE_REF(3, Instruction::NEW_ARRAY, 200u),
183395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(4, Instruction::CONST, 2u, 1000),
183495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 2u, 100u, 0u),
183595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 2u, 100u, 1u),
183695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(4, Instruction::IPUT, 2u, 101u, 0u),
183795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 2u, 200u, 202u),
183895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 2u, 200u, 203u),
183995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 2u, 201u, 202u),
184095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(4, Instruction::APUT, 2u, 201u, 203u),
184195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(4, Instruction::SPUT, 2u, 0u),
184295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(4, Instruction::SPUT, 2u, 1u),
184395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(5, Instruction::CONST, 12u, 2000),
184495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 12u, 100u, 0u),
184595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 12u, 100u, 1u),
184695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT, 12u, 101u, 0u),
184795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 12u, 200u, 202u),
184895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 12u, 200u, 203u),
184995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 12u, 201u, 202u),
185095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT, 12u, 201u, 203u),
185195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(5, Instruction::SPUT, 12u, 0u),
185295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(5, Instruction::SPUT, 12u, 1u),
185395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(6, 22u, 2u, 12u),
185495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 23u, 100u, 0u),
185595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 24u, 100u, 1u),
185695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET, 25u, 101u, 0u),
185795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 26u, 200u, 202u),
185895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 27u, 200u, 203u),
185995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 28u, 201u, 202u),
186095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET, 29u, 201u, 203u),
186195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(6, Instruction::SGET, 30u, 0u),
186295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(6, Instruction::SGET, 31u, 1u),
186395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
186495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareIFields(ifields);
186595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareSFields(sfields);
186695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
186795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
186895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
186995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[2], value_names_[12]);
187095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[2], value_names_[22]);
187195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[12], value_names_[22]);
187295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  for (size_t i = 23; i != arraysize(mirs); ++i) {
187395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    EXPECT_EQ(value_names_[22], value_names_[i]) << i;
187495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
187595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
187695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
187795a059793c4c194f026afc74c713cc295d75d91aVladimir MarkoTEST_F(GlobalValueNumberingTest, InfiniteLocationLoop) {
187895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // This is a pattern that lead to an infinite loop during the GVN development. This has been
187995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // fixed by rewriting the merging of AliasingValues to merge only locations read from or
188095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // written to in each incoming LVN rather than merging all locations read from or written to
188195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // in any incoming LVN. It also showed up only when the GVN used the DFS ordering instead of
188295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // the "topological" ordering but, since the "topological" ordering is not really topological
188395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // when there are cycles and an optimizing Java compiler (or a tool like proguard) could
188495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // theoretically create any sort of flow graph, this could have shown up in real code.
188595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  //
188695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // While we were merging all the locations:
188795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // The first time the Phi evaluates to the same value name as CONST 0u.  After the second
188895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // evaluation, when the BB #9 has been processed, the Phi receives its own value name.
188995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // However, the index from the first evaluation keeps disappearing and reappearing in the
189095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // LVN's aliasing_array_value_map_'s load_value_map for BBs #9, #4, #5, #7 because of the
189195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // DFS ordering of LVN evaluation.
189295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const IFieldDef ifields[] = {
189395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Object.
189495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
189595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const BBDef bbs[] = {
189695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
189795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
189895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(4)),
189995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(1)),
190095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC2(5, 2), DEF_PRED2(3, 9)),
190195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC2(6, 7), DEF_PRED1(4)),
190295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC1(9), DEF_PRED1(5)),
190395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC2(8, 9), DEF_PRED1(5)),
190495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC1(9), DEF_PRED1(7)),
190595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED3(6, 7, 8)),
190695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
190795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
190895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(3, Instruction::CONST, 0u, 0),
190995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(4, 1u, 0u, 10u),
191095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_INVOKE1(6, Instruction::INVOKE_STATIC, 100u),
191195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET_OBJECT, 3u, 100u, 0u),
191295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(6, Instruction::CONST, 4u, 1000),
191395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(6, Instruction::APUT, 4u, 3u, 1u),            // Index is Phi 1u.
191495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_INVOKE1(8, Instruction::INVOKE_STATIC, 100u),
191595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(8, Instruction::IGET_OBJECT, 7u, 100u, 0u),
191695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(8, Instruction::CONST, 8u, 2000),
191795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(8, Instruction::APUT, 9u, 7u, 1u),            // Index is Phi 1u.
191895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_CONST(9, Instruction::CONST, 10u, 3000),
191995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
192095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareIFields(ifields);
192195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareBasicBlocks(bbs);
192295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
192395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // Using DFS order for this test. The GVN result should not depend on the used ordering
192495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // once the GVN actually converges. But creating a test for this convergence issue with
192595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  // the topological ordering could be a very challenging task.
192695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformPreOrderDfsGVN();
192795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
192895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
192955fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir MarkoTEST_F(GlobalValueNumberingTestTwoConsecutiveLoops, IFieldAndPhi) {
193095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const IFieldDef ifields[] = {
193195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
193295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
193395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
193495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(3, Instruction::MOVE_OBJECT, 0u, 100u),
193595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(3, Instruction::IPUT_OBJECT, 0u, 200u, 0u),
193695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(4, 2u, 0u, 3u),
193795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(5, Instruction::MOVE_OBJECT, 3u, 300u),
193895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT_OBJECT, 3u, 200u, 0u),
193995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(6, Instruction::MOVE_OBJECT, 5u, 2u),
194095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET_OBJECT, 6u, 200u, 0u),
194195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(7, Instruction::MOVE_OBJECT, 7u, 5u),
194295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(7, Instruction::IGET_OBJECT, 8u, 200u, 0u),
194395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(8, Instruction::MOVE_OBJECT, 9u, 5u),
194495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(8, Instruction::IGET_OBJECT, 10u, 200u, 0u),
194595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(9, Instruction::MOVE_OBJECT, 11u, 5u),
194695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(9, Instruction::IGET_OBJECT, 12u, 200u, 0u),
194795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
194895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
194995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareIFields(ifields);
195095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
195195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
195295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
195395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[0], value_names_[3]);
195495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[0], value_names_[2]);
195595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[3], value_names_[2]);
195695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[2], value_names_[5]);
195795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[5], value_names_[6]);
195895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[5], value_names_[7]);
195995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[5], value_names_[8]);
196095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[5], value_names_[9]);
196195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[5], value_names_[10]);
196295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[5], value_names_[11]);
196395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[5], value_names_[12]);
196495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
196595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
196655fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir MarkoTEST_F(GlobalValueNumberingTestTwoConsecutiveLoops, NullCheck) {
196795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const IFieldDef ifields[] = {
196895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
196995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
197095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const SFieldDef sfields[] = {
197195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
197295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
197395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
197495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(3, Instruction::MOVE_OBJECT, 0u, 100u),
197595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(3, Instruction::IGET_OBJECT, 1u, 200u, 0u),
197695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(3, Instruction::SGET_OBJECT, 2u, 0u),
197795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(3, Instruction::AGET_OBJECT, 3u, 300u, 201u),
197895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(4, 4u, 0u, 8u),
197995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET_OBJECT, 5u, 200u, 0u),
198095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(5, Instruction::SGET_OBJECT, 6u, 0u),
198195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(5, Instruction::AGET_OBJECT, 7u, 300u, 201u),
198295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(5, Instruction::MOVE_OBJECT, 8u, 400u),
198395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(5, Instruction::IPUT_OBJECT, 4u, 200u, 0u),          // PUT the Phi 4u.
198495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SPUT(5, Instruction::SPUT_OBJECT, 4u, 0u),                // PUT the Phi 4u.
198595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_APUT(5, Instruction::APUT_OBJECT, 4u, 300u, 201u),        // PUT the Phi 4u.
198695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(6, Instruction::MOVE_OBJECT, 12u, 4u),
198795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET_OBJECT, 13u, 200u, 0u),
198895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(6, Instruction::SGET_OBJECT, 14u, 0u),
198995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET_OBJECT, 15u, 300u, 201u),
199095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET_OBJECT, 16u, 12u, 600u),
199195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET_OBJECT, 17u, 13u, 600u),
199295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET_OBJECT, 18u, 14u, 600u),
199395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(6, Instruction::AGET_OBJECT, 19u, 15u, 600u),
199495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(8, Instruction::MOVE_OBJECT, 20u, 12u),
199595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(8, Instruction::IGET_OBJECT, 21u, 200u, 0u),
199695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(8, Instruction::SGET_OBJECT, 22u, 0u),
199795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(8, Instruction::AGET_OBJECT, 23u, 300u, 201u),
199895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(8, Instruction::AGET_OBJECT, 24u, 12u, 600u),
199995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(8, Instruction::AGET_OBJECT, 25u, 13u, 600u),
200095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(8, Instruction::AGET_OBJECT, 26u, 14u, 600u),
200195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(8, Instruction::AGET_OBJECT, 27u, 15u, 600u),
200295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(9, Instruction::MOVE_OBJECT, 28u, 12u),
200395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(9, Instruction::IGET_OBJECT, 29u, 200u, 0u),
200495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_SGET(9, Instruction::SGET_OBJECT, 30u, 0u),
200595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(9, Instruction::AGET_OBJECT, 31u, 300u, 201u),
200695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(9, Instruction::AGET_OBJECT, 32u, 12u, 600u),
200795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(9, Instruction::AGET_OBJECT, 33u, 13u, 600u),
200895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(9, Instruction::AGET_OBJECT, 34u, 14u, 600u),
200995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_AGET(9, Instruction::AGET_OBJECT, 35u, 15u, 600u),
201095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
201195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const bool expected_ignore_null_check[] = {
201295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, false, false, false,                                   // BB #3.
201395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, true, false, true, false, true, false, true,           // BBs #4 and #5.
201495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, true, false, true, false, false, false, false,         // BB #6.
201595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, true, false, true, true, true, true, true,             // BB #7.
201695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, true, false, true, true, true, true, true,             // BB #8.
201795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
201895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const bool expected_ignore_range_check[] = {
201995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, false, false, false,                                   // BB #3.
202095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, false, false, true, false, false, false, true,         // BBs #4 and #5.
202195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, false, false, true, false, false, false, false,        // BB #6.
202295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, false, false, true, true, true, true, true,            // BB #7.
202395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      false, false, false, true, true, true, true, true,            // BB #8.
202495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
202595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
202695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareIFields(ifields);
202795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareSFields(sfields);
202895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
202995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
203095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
203195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[0], value_names_[4]);
203295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[1], value_names_[5]);
203395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[2], value_names_[6]);
203495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[3], value_names_[7]);
203595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[4], value_names_[8]);
203695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[4], value_names_[12]);
203755fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko  EXPECT_EQ(value_names_[5], value_names_[13]);
203855fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko  EXPECT_EQ(value_names_[6], value_names_[14]);
203955fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko  EXPECT_EQ(value_names_[7], value_names_[15]);
204095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[12], value_names_[20]);
204195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[13], value_names_[21]);
204295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[14], value_names_[22]);
204395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[15], value_names_[23]);
204495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[12], value_names_[28]);
204595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[13], value_names_[29]);
204695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[14], value_names_[30]);
204795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[15], value_names_[31]);
204895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVNCodeModifications();
204995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  for (size_t i = 0u; i != arraysize(mirs); ++i) {
205095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    EXPECT_EQ(expected_ignore_null_check[i],
205195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko              (mirs_[i].optimization_flags & MIR_IGNORE_NULL_CHECK) != 0) << i;
205295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko    EXPECT_EQ(expected_ignore_range_check[i],
205395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko              (mirs_[i].optimization_flags & MIR_IGNORE_RANGE_CHECK) != 0) << i;
205495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  }
205595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
205695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
205755fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir MarkoTEST_F(GlobalValueNumberingTestTwoNestedLoops, IFieldAndPhi) {
205895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const IFieldDef ifields[] = {
205995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      { 0u, 1u, 0u, false },  // Int.
206095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
206195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  static const MIRDef mirs[] = {
206295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(3, Instruction::MOVE_OBJECT, 0u, 100u),
206395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(3, Instruction::IPUT_OBJECT, 0u, 200u, 0u),
206495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_PHI2(4, 2u, 0u, 11u),
206595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(4, Instruction::MOVE_OBJECT, 3u, 2u),
206695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(4, Instruction::IGET_OBJECT, 4u, 200u, 0u),
206795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(5, Instruction::MOVE_OBJECT, 5u, 3u),
206895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(5, Instruction::IGET_OBJECT, 6u, 200u, 0u),
206995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(6, Instruction::MOVE_OBJECT, 7u, 3u),
207095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(6, Instruction::IGET_OBJECT, 8u, 200u, 0u),
207195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(7, Instruction::MOVE_OBJECT, 9u, 3u),
207295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(7, Instruction::IGET_OBJECT, 10u, 200u, 0u),
207395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(7, Instruction::MOVE_OBJECT, 11u, 300u),
207495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IPUT(7, Instruction::IPUT_OBJECT, 11u, 200u, 0u),
207595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_MOVE(8, Instruction::MOVE_OBJECT, 13u, 3u),
207695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko      DEF_IGET(8, Instruction::IGET_OBJECT, 14u, 200u, 0u),
207795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  };
207895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
207995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareIFields(ifields);
208095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PrepareMIRs(mirs);
208195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  PerformGVN();
208295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  ASSERT_EQ(arraysize(mirs), value_names_.size());
208395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[0], value_names_[11]);
208495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[0], value_names_[2]);
208595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_NE(value_names_[11], value_names_[2]);
208695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[2], value_names_[3]);
208795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[3], value_names_[4]);
208895a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[3], value_names_[5]);
208995a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[3], value_names_[6]);
209095a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[3], value_names_[7]);
209195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[3], value_names_[8]);
209295a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[3], value_names_[9]);
209395a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[3], value_names_[10]);
209495a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[3], value_names_[13]);
209595a059793c4c194f026afc74c713cc295d75d91aVladimir Marko  EXPECT_EQ(value_names_[3], value_names_[14]);
209695a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}
209795a059793c4c194f026afc74c713cc295d75d91aVladimir Marko
209811ca61259be6ec8e03eaff1e98905232728b3d45Vladimir MarkoTEST_F(GlobalValueNumberingTest, NormalPathToCatchEntry) {
209911ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko  // When there's an empty catch block, all the exception paths lead to the next block in
210011ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko  // the normal path and we can also have normal "taken" or "fall-through" branches to that
210111ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko  // path. Check that LocalValueNumbering::PruneNonAliasingRefsForCatch() can handle it.
210211ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko  static const BBDef bbs[] = {
210311ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko      DEF_BB(kNullBlock, DEF_SUCC0(), DEF_PRED0()),
210411ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko      DEF_BB(kEntryBlock, DEF_SUCC1(3), DEF_PRED0()),
210555fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko      DEF_BB(kExitBlock, DEF_SUCC0(), DEF_PRED1(5)),
210611ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC1(4), DEF_PRED1(1)),
210711ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC1(5), DEF_PRED1(3)),
210811ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko      DEF_BB(kDalvikByteCode, DEF_SUCC1(2), DEF_PRED2(3, 4)),
210911ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko  };
211011ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko  static const MIRDef mirs[] = {
211111ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko      DEF_INVOKE1(4, Instruction::INVOKE_STATIC, 100u),
211211ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko  };
211311ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko  PrepareBasicBlocks(bbs);
211411ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko  BasicBlock* catch_handler = cu_.mir_graph->GetBasicBlock(5u);
211511ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko  catch_handler->catch_entry = true;
211655fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko  // Add successor block info to the check block.
211755fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko  BasicBlock* check_bb = cu_.mir_graph->GetBasicBlock(3u);
211855fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko  check_bb->successor_block_list_type = kCatch;
211955fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko  check_bb->successor_blocks = new (&cu_.arena) GrowableArray<SuccessorBlockInfo*>(
212055fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko      &cu_.arena, 2, kGrowableArraySuccessorBlocks);
212155fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko  SuccessorBlockInfo* successor_block_info = reinterpret_cast<SuccessorBlockInfo*>
212255fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko      (cu_.arena.Alloc(sizeof(SuccessorBlockInfo), kArenaAllocSuccessor));
212355fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko  successor_block_info->block = catch_handler->id;
212455fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko  check_bb->successor_blocks->Insert(successor_block_info);
212511ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko  BasicBlock* merge_block = cu_.mir_graph->GetBasicBlock(4u);
212611ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko  std::swap(merge_block->taken, merge_block->fall_through);
212711ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko  PrepareMIRs(mirs);
212811ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko  PerformGVN();
212911ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko}
213011ca61259be6ec8e03eaff1e98905232728b3d45Vladimir Marko
213195a059793c4c194f026afc74c713cc295d75d91aVladimir Marko}  // namespace art
2132