xref: /llvm-project/llvm/unittests/MIR/MachineStableHashTest.cpp (revision bb3f5e1fed7c6ba733b7f273e93f5d3930976185)
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