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