1f9ad2494SKyungwoo Lee //===- MachineStableHashTest.cpp ------------------------------------------===// 2f9ad2494SKyungwoo Lee // 3f9ad2494SKyungwoo Lee // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4f9ad2494SKyungwoo Lee // See https://llvm.org/LICENSE.txt for license information. 5f9ad2494SKyungwoo Lee // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6f9ad2494SKyungwoo Lee // 7f9ad2494SKyungwoo Lee //===----------------------------------------------------------------------===// 8f9ad2494SKyungwoo Lee 9f9ad2494SKyungwoo Lee #include "llvm/CodeGen/MachineStableHash.h" 10f9ad2494SKyungwoo Lee #include "llvm/CodeGen/MIRParser/MIRParser.h" 11f9ad2494SKyungwoo Lee #include "llvm/CodeGen/MachineFunction.h" 12f9ad2494SKyungwoo Lee #include "llvm/CodeGen/MachineModuleInfo.h" 13f9ad2494SKyungwoo Lee #include "llvm/FileCheck/FileCheck.h" 14f9ad2494SKyungwoo Lee #include "llvm/IR/Module.h" 15f9ad2494SKyungwoo Lee #include "llvm/MC/TargetRegistry.h" 16f9ad2494SKyungwoo Lee #include "llvm/Support/SourceMgr.h" 17f9ad2494SKyungwoo Lee #include "llvm/Support/TargetSelect.h" 18f9ad2494SKyungwoo Lee #include "llvm/Target/TargetMachine.h" 19f9ad2494SKyungwoo Lee #include "gtest/gtest.h" 20f9ad2494SKyungwoo Lee 21f9ad2494SKyungwoo Lee using namespace llvm; 22f9ad2494SKyungwoo Lee 23f9ad2494SKyungwoo Lee class MachineStableHashTest : public testing::Test { 24f9ad2494SKyungwoo Lee public: 25f9ad2494SKyungwoo Lee MachineStableHashTest() {} 26f9ad2494SKyungwoo Lee 27f9ad2494SKyungwoo Lee protected: 28f9ad2494SKyungwoo Lee LLVMContext Context; 29f9ad2494SKyungwoo Lee std::unique_ptr<Module> M; 30f9ad2494SKyungwoo Lee std::unique_ptr<MIRParser> MIR; 31f9ad2494SKyungwoo Lee 32f9ad2494SKyungwoo Lee static void SetUpTestCase() { 33f9ad2494SKyungwoo Lee InitializeAllTargetInfos(); 34f9ad2494SKyungwoo Lee InitializeAllTargets(); 35f9ad2494SKyungwoo Lee InitializeAllTargetMCs(); 36f9ad2494SKyungwoo Lee } 37f9ad2494SKyungwoo Lee 38f9ad2494SKyungwoo Lee void SetUp() override { M = std::make_unique<Module>("Dummy", Context); } 39f9ad2494SKyungwoo Lee 40*bb3f5e1fSMatin Raayai std::unique_ptr<TargetMachine> 41f9ad2494SKyungwoo Lee createTargetMachine(std::string TT, StringRef CPU, StringRef FS) { 42f9ad2494SKyungwoo Lee std::string Error; 43f9ad2494SKyungwoo Lee const Target *T = TargetRegistry::lookupTarget(TT, Error); 44f9ad2494SKyungwoo Lee if (!T) 45f9ad2494SKyungwoo Lee return nullptr; 46f9ad2494SKyungwoo Lee TargetOptions Options; 47*bb3f5e1fSMatin Raayai return std::unique_ptr<TargetMachine>(T->createTargetMachine( 48*bb3f5e1fSMatin Raayai TT, CPU, FS, Options, std::nullopt, std::nullopt)); 49f9ad2494SKyungwoo Lee } 50f9ad2494SKyungwoo Lee 51f9ad2494SKyungwoo Lee std::unique_ptr<Module> parseMIR(const TargetMachine &TM, StringRef MIRCode, 52f9ad2494SKyungwoo Lee MachineModuleInfo &MMI) { 53f9ad2494SKyungwoo Lee SMDiagnostic Diagnostic; 54f9ad2494SKyungwoo Lee std::unique_ptr<MemoryBuffer> MBuffer = MemoryBuffer::getMemBuffer(MIRCode); 55f9ad2494SKyungwoo Lee MIR = createMIRParser(std::move(MBuffer), Context); 56f9ad2494SKyungwoo Lee if (!MIR) 57f9ad2494SKyungwoo Lee return nullptr; 58f9ad2494SKyungwoo Lee 59f9ad2494SKyungwoo Lee std::unique_ptr<Module> Mod = MIR->parseIRModule(); 60f9ad2494SKyungwoo Lee if (!Mod) 61f9ad2494SKyungwoo Lee return nullptr; 62f9ad2494SKyungwoo Lee 63f9ad2494SKyungwoo Lee Mod->setDataLayout(TM.createDataLayout()); 64f9ad2494SKyungwoo Lee 65f9ad2494SKyungwoo Lee if (MIR->parseMachineFunctions(*Mod, MMI)) { 66f9ad2494SKyungwoo Lee M.reset(); 67f9ad2494SKyungwoo Lee return nullptr; 68f9ad2494SKyungwoo Lee } 69f9ad2494SKyungwoo Lee 70f9ad2494SKyungwoo Lee return Mod; 71f9ad2494SKyungwoo Lee } 72f9ad2494SKyungwoo Lee }; 73f9ad2494SKyungwoo Lee 74f9ad2494SKyungwoo Lee TEST_F(MachineStableHashTest, StableGlobalName) { 75f9ad2494SKyungwoo Lee auto TM = createTargetMachine(("aarch64--"), "", ""); 76f9ad2494SKyungwoo Lee if (!TM) 77f9ad2494SKyungwoo Lee GTEST_SKIP(); 78f9ad2494SKyungwoo Lee StringRef MIRString = R"MIR( 79f9ad2494SKyungwoo Lee --- | 80f9ad2494SKyungwoo Lee define void @f1() { ret void } 81f9ad2494SKyungwoo Lee define void @f2() { ret void } 82f9ad2494SKyungwoo Lee define void @f3() { ret void } 83f9ad2494SKyungwoo Lee define void @f4() { ret void } 84f9ad2494SKyungwoo Lee declare void @goo() 85f9ad2494SKyungwoo Lee declare void @goo.llvm.123() 86f9ad2494SKyungwoo Lee declare void @goo.__uniq.456() 87f9ad2494SKyungwoo Lee declare void @goo.invalid.789() 88f9ad2494SKyungwoo Lee ... 89f9ad2494SKyungwoo Lee --- 90f9ad2494SKyungwoo Lee name: f1 91f9ad2494SKyungwoo Lee alignment: 16 92f9ad2494SKyungwoo Lee tracksRegLiveness: true 93f9ad2494SKyungwoo Lee frameInfo: 94f9ad2494SKyungwoo Lee maxAlignment: 16 95f9ad2494SKyungwoo Lee machineFunctionInfo: {} 96f9ad2494SKyungwoo Lee body: | 97f9ad2494SKyungwoo Lee bb.0: 98f9ad2494SKyungwoo Lee liveins: $lr 99f9ad2494SKyungwoo Lee BL @goo 100f9ad2494SKyungwoo Lee RET undef $lr 101f9ad2494SKyungwoo Lee 102f9ad2494SKyungwoo Lee ... 103f9ad2494SKyungwoo Lee --- 104f9ad2494SKyungwoo Lee name: f2 105f9ad2494SKyungwoo Lee body: | 106f9ad2494SKyungwoo Lee bb.0: 107f9ad2494SKyungwoo Lee liveins: $lr 108f9ad2494SKyungwoo Lee BL @goo.llvm.123 109f9ad2494SKyungwoo Lee RET undef $lr 110f9ad2494SKyungwoo Lee ... 111f9ad2494SKyungwoo Lee --- 112f9ad2494SKyungwoo Lee name: f3 113f9ad2494SKyungwoo Lee body: | 114f9ad2494SKyungwoo Lee bb.0: 115f9ad2494SKyungwoo Lee liveins: $lr 116f9ad2494SKyungwoo Lee BL @goo.__uniq.456 117f9ad2494SKyungwoo Lee RET undef $lr 118f9ad2494SKyungwoo Lee ... 119f9ad2494SKyungwoo Lee --- 120f9ad2494SKyungwoo Lee name: f4 121f9ad2494SKyungwoo Lee body: | 122f9ad2494SKyungwoo Lee bb.0: 123f9ad2494SKyungwoo Lee liveins: $lr 124f9ad2494SKyungwoo Lee BL @goo.invalid.789 125f9ad2494SKyungwoo Lee RET undef $lr 126f9ad2494SKyungwoo Lee ... 127f9ad2494SKyungwoo Lee )MIR"; 128f9ad2494SKyungwoo Lee MachineModuleInfo MMI(TM.get()); 129f9ad2494SKyungwoo Lee M = parseMIR(*TM, MIRString, MMI); 130f9ad2494SKyungwoo Lee ASSERT_TRUE(M); 131f9ad2494SKyungwoo Lee auto *MF1 = MMI.getMachineFunction(*M->getFunction("f1")); 132f9ad2494SKyungwoo Lee auto *MF2 = MMI.getMachineFunction(*M->getFunction("f2")); 133f9ad2494SKyungwoo Lee auto *MF3 = MMI.getMachineFunction(*M->getFunction("f3")); 134f9ad2494SKyungwoo Lee auto *MF4 = MMI.getMachineFunction(*M->getFunction("f4")); 135f9ad2494SKyungwoo Lee 136f9ad2494SKyungwoo Lee EXPECT_EQ(stableHashValue(*MF1), stableHashValue(*MF2)) 137f9ad2494SKyungwoo Lee << "Expect the suffix, `.llvm.{number}` to be ignored."; 138f9ad2494SKyungwoo Lee EXPECT_EQ(stableHashValue(*MF1), stableHashValue(*MF3)) 139f9ad2494SKyungwoo Lee << "Expect the suffix, `.__uniq.{number}` to be ignored."; 140f9ad2494SKyungwoo Lee // Do not ignore `.invalid.{number}`. 141f9ad2494SKyungwoo Lee EXPECT_NE(stableHashValue(*MF1), stableHashValue(*MF4)); 142f9ad2494SKyungwoo Lee } 1430f525452SKyungwoo Lee 1440f525452SKyungwoo Lee TEST_F(MachineStableHashTest, ContentName) { 1450f525452SKyungwoo Lee auto TM = createTargetMachine(("aarch64--"), "", ""); 1460f525452SKyungwoo Lee if (!TM) 1470f525452SKyungwoo Lee GTEST_SKIP(); 1480f525452SKyungwoo Lee StringRef MIRString = R"MIR( 1490f525452SKyungwoo Lee --- | 1500f525452SKyungwoo Lee define void @f1() { ret void } 1510f525452SKyungwoo Lee define void @f2() { ret void } 1520f525452SKyungwoo Lee define void @f3() { ret void } 1530f525452SKyungwoo Lee define void @f4() { ret void } 1540f525452SKyungwoo Lee declare void @goo() 1550f525452SKyungwoo Lee declare void @goo.content.123() 1560f525452SKyungwoo Lee declare void @zoo.content.123() 1570f525452SKyungwoo Lee declare void @goo.content.456() 1580f525452SKyungwoo Lee ... 1590f525452SKyungwoo Lee --- 1600f525452SKyungwoo Lee name: f1 1610f525452SKyungwoo Lee alignment: 16 1620f525452SKyungwoo Lee tracksRegLiveness: true 1630f525452SKyungwoo Lee frameInfo: 1640f525452SKyungwoo Lee maxAlignment: 16 1650f525452SKyungwoo Lee machineFunctionInfo: {} 1660f525452SKyungwoo Lee body: | 1670f525452SKyungwoo Lee bb.0: 1680f525452SKyungwoo Lee liveins: $lr 1690f525452SKyungwoo Lee BL @goo 1700f525452SKyungwoo Lee RET undef $lr 1710f525452SKyungwoo Lee ... 1720f525452SKyungwoo Lee --- 1730f525452SKyungwoo Lee name: f2 1740f525452SKyungwoo Lee body: | 1750f525452SKyungwoo Lee bb.0: 1760f525452SKyungwoo Lee liveins: $lr 1770f525452SKyungwoo Lee BL @goo.content.123 1780f525452SKyungwoo Lee RET undef $lr 1790f525452SKyungwoo Lee ... 1800f525452SKyungwoo Lee --- 1810f525452SKyungwoo Lee name: f3 1820f525452SKyungwoo Lee body: | 1830f525452SKyungwoo Lee bb.0: 1840f525452SKyungwoo Lee liveins: $lr 1850f525452SKyungwoo Lee BL @zoo.content.123 1860f525452SKyungwoo Lee RET undef $lr 1870f525452SKyungwoo Lee ... 1880f525452SKyungwoo Lee --- 1890f525452SKyungwoo Lee name: f4 1900f525452SKyungwoo Lee body: | 1910f525452SKyungwoo Lee bb.0: 1920f525452SKyungwoo Lee liveins: $lr 1930f525452SKyungwoo Lee BL @goo.content.456 1940f525452SKyungwoo Lee RET undef $lr 1950f525452SKyungwoo Lee ... 1960f525452SKyungwoo Lee )MIR"; 1970f525452SKyungwoo Lee MachineModuleInfo MMI(TM.get()); 1980f525452SKyungwoo Lee M = parseMIR(*TM, MIRString, MMI); 1990f525452SKyungwoo Lee ASSERT_TRUE(M); 2000f525452SKyungwoo Lee auto *MF1 = MMI.getMachineFunction(*M->getFunction("f1")); 2010f525452SKyungwoo Lee auto *MF2 = MMI.getMachineFunction(*M->getFunction("f2")); 2020f525452SKyungwoo Lee auto *MF3 = MMI.getMachineFunction(*M->getFunction("f3")); 2030f525452SKyungwoo Lee auto *MF4 = MMI.getMachineFunction(*M->getFunction("f4")); 2040f525452SKyungwoo Lee 2050f525452SKyungwoo Lee // Do not ignore `.content.{number}`. 2060f525452SKyungwoo Lee EXPECT_NE(stableHashValue(*MF1), stableHashValue(*MF2)); 2070f525452SKyungwoo Lee EXPECT_EQ(stableHashValue(*MF2), stableHashValue(*MF3)) 2080f525452SKyungwoo Lee << "Expect the same hash for the same suffix, `.content.{number}`"; 2090f525452SKyungwoo Lee // Different suffixes should result in different hashes. 2100f525452SKyungwoo Lee EXPECT_NE(stableHashValue(*MF2), stableHashValue(*MF4)); 2110f525452SKyungwoo Lee EXPECT_NE(stableHashValue(*MF3), stableHashValue(*MF4)); 2120f525452SKyungwoo Lee } 213