xref: /aosp_15_r20/external/llvm/unittests/MI/LiveIntervalTest.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
2*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
3*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/LiveIntervalAnalysis.h"
4*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MIRParser/MIRParser.h"
5*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFunction.h"
6*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineModuleInfo.h"
7*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineRegisterInfo.h"
8*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/Passes.h"
9*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MemoryBuffer.h"
10*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SourceMgr.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetRegistry.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetSelect.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetMachine.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetOptions.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetRegisterInfo.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LegacyPassManager.h"
17*9880d681SAndroid Build Coastguard Worker 
18*9880d681SAndroid Build Coastguard Worker using namespace llvm;
19*9880d681SAndroid Build Coastguard Worker 
20*9880d681SAndroid Build Coastguard Worker namespace llvm {
21*9880d681SAndroid Build Coastguard Worker   void initializeTestPassPass(PassRegistry &);
22*9880d681SAndroid Build Coastguard Worker }
23*9880d681SAndroid Build Coastguard Worker 
24*9880d681SAndroid Build Coastguard Worker namespace {
25*9880d681SAndroid Build Coastguard Worker 
initLLVM()26*9880d681SAndroid Build Coastguard Worker void initLLVM() {
27*9880d681SAndroid Build Coastguard Worker   InitializeAllTargets();
28*9880d681SAndroid Build Coastguard Worker   InitializeAllTargetMCs();
29*9880d681SAndroid Build Coastguard Worker   InitializeAllAsmPrinters();
30*9880d681SAndroid Build Coastguard Worker   InitializeAllAsmParsers();
31*9880d681SAndroid Build Coastguard Worker 
32*9880d681SAndroid Build Coastguard Worker   PassRegistry *Registry = PassRegistry::getPassRegistry();
33*9880d681SAndroid Build Coastguard Worker   initializeCore(*Registry);
34*9880d681SAndroid Build Coastguard Worker   initializeCodeGen(*Registry);
35*9880d681SAndroid Build Coastguard Worker }
36*9880d681SAndroid Build Coastguard Worker 
37*9880d681SAndroid Build Coastguard Worker /// Create a TargetMachine. As we lack a dedicated always available target for
38*9880d681SAndroid Build Coastguard Worker /// unittests, we go for "x86_64" which should be available in most builds.
createTargetMachine()39*9880d681SAndroid Build Coastguard Worker std::unique_ptr<TargetMachine> createTargetMachine() {
40*9880d681SAndroid Build Coastguard Worker   Triple TargetTriple("x86_64--");
41*9880d681SAndroid Build Coastguard Worker   std::string Error;
42*9880d681SAndroid Build Coastguard Worker   const Target *T = TargetRegistry::lookupTarget("", TargetTriple, Error);
43*9880d681SAndroid Build Coastguard Worker   if (!T)
44*9880d681SAndroid Build Coastguard Worker     return nullptr;
45*9880d681SAndroid Build Coastguard Worker 
46*9880d681SAndroid Build Coastguard Worker   TargetOptions Options;
47*9880d681SAndroid Build Coastguard Worker   return std::unique_ptr<TargetMachine>(
48*9880d681SAndroid Build Coastguard Worker       T->createTargetMachine("x86_64", "", "", Options, None,
49*9880d681SAndroid Build Coastguard Worker                              CodeModel::Default, CodeGenOpt::Aggressive));
50*9880d681SAndroid Build Coastguard Worker }
51*9880d681SAndroid Build Coastguard Worker 
parseMIR(LLVMContext & Context,legacy::PassManagerBase & PM,std::unique_ptr<MIRParser> & MIR,const TargetMachine & TM,StringRef MIRCode,const char * FuncName)52*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> parseMIR(LLVMContext &Context,
53*9880d681SAndroid Build Coastguard Worker     legacy::PassManagerBase &PM, std::unique_ptr<MIRParser> &MIR,
54*9880d681SAndroid Build Coastguard Worker     const TargetMachine &TM, StringRef MIRCode, const char *FuncName) {
55*9880d681SAndroid Build Coastguard Worker   SMDiagnostic Diagnostic;
56*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<MemoryBuffer> MBuffer = MemoryBuffer::getMemBuffer(MIRCode);
57*9880d681SAndroid Build Coastguard Worker   MIR = createMIRParser(std::move(MBuffer), Context);
58*9880d681SAndroid Build Coastguard Worker   if (!MIR)
59*9880d681SAndroid Build Coastguard Worker     return nullptr;
60*9880d681SAndroid Build Coastguard Worker 
61*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Module> M = MIR->parseLLVMModule();
62*9880d681SAndroid Build Coastguard Worker   if (!M)
63*9880d681SAndroid Build Coastguard Worker     return nullptr;
64*9880d681SAndroid Build Coastguard Worker 
65*9880d681SAndroid Build Coastguard Worker   M->setDataLayout(TM.createDataLayout());
66*9880d681SAndroid Build Coastguard Worker 
67*9880d681SAndroid Build Coastguard Worker   Function *F = M->getFunction(FuncName);
68*9880d681SAndroid Build Coastguard Worker   if (!F)
69*9880d681SAndroid Build Coastguard Worker     return nullptr;
70*9880d681SAndroid Build Coastguard Worker 
71*9880d681SAndroid Build Coastguard Worker   const LLVMTargetMachine &LLVMTM = static_cast<const LLVMTargetMachine&>(TM);
72*9880d681SAndroid Build Coastguard Worker   LLVMTM.addMachineModuleInfo(PM);
73*9880d681SAndroid Build Coastguard Worker   LLVMTM.addMachineFunctionAnalysis(PM, MIR.get());
74*9880d681SAndroid Build Coastguard Worker 
75*9880d681SAndroid Build Coastguard Worker   return M;
76*9880d681SAndroid Build Coastguard Worker }
77*9880d681SAndroid Build Coastguard Worker 
78*9880d681SAndroid Build Coastguard Worker typedef std::function<void(MachineFunction&,LiveIntervals&)> LiveIntervalTest;
79*9880d681SAndroid Build Coastguard Worker 
80*9880d681SAndroid Build Coastguard Worker struct TestPass : public MachineFunctionPass {
81*9880d681SAndroid Build Coastguard Worker   static char ID;
TestPass__anon45909f9e0111::TestPass82*9880d681SAndroid Build Coastguard Worker   TestPass() : MachineFunctionPass(ID) {
83*9880d681SAndroid Build Coastguard Worker     // We should never call this but always use PM.add(new TestPass(...))
84*9880d681SAndroid Build Coastguard Worker     abort();
85*9880d681SAndroid Build Coastguard Worker   }
TestPass__anon45909f9e0111::TestPass86*9880d681SAndroid Build Coastguard Worker   TestPass(LiveIntervalTest T) : MachineFunctionPass(ID), T(T) {
87*9880d681SAndroid Build Coastguard Worker     initializeTestPassPass(*PassRegistry::getPassRegistry());
88*9880d681SAndroid Build Coastguard Worker   }
89*9880d681SAndroid Build Coastguard Worker 
runOnMachineFunction__anon45909f9e0111::TestPass90*9880d681SAndroid Build Coastguard Worker   bool runOnMachineFunction(MachineFunction &MF) override {
91*9880d681SAndroid Build Coastguard Worker     LiveIntervals &LIS = getAnalysis<LiveIntervals>();
92*9880d681SAndroid Build Coastguard Worker     T(MF, LIS);
93*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(MF.verify(this));
94*9880d681SAndroid Build Coastguard Worker     return true;
95*9880d681SAndroid Build Coastguard Worker   }
96*9880d681SAndroid Build Coastguard Worker 
getAnalysisUsage__anon45909f9e0111::TestPass97*9880d681SAndroid Build Coastguard Worker   void getAnalysisUsage(AnalysisUsage &AU) const override {
98*9880d681SAndroid Build Coastguard Worker     AU.setPreservesAll();
99*9880d681SAndroid Build Coastguard Worker     AU.addRequired<LiveIntervals>();
100*9880d681SAndroid Build Coastguard Worker     AU.addPreserved<LiveIntervals>();
101*9880d681SAndroid Build Coastguard Worker     MachineFunctionPass::getAnalysisUsage(AU);
102*9880d681SAndroid Build Coastguard Worker   }
103*9880d681SAndroid Build Coastguard Worker private:
104*9880d681SAndroid Build Coastguard Worker   LiveIntervalTest T;
105*9880d681SAndroid Build Coastguard Worker };
106*9880d681SAndroid Build Coastguard Worker 
107*9880d681SAndroid Build Coastguard Worker /**
108*9880d681SAndroid Build Coastguard Worker  * Move instruction number \p From in front of instruction number \p To and
109*9880d681SAndroid Build Coastguard Worker  * update affected liveness intervals with LiveIntervalAnalysis::handleMove().
110*9880d681SAndroid Build Coastguard Worker  */
testHandleMove(MachineFunction & MF,LiveIntervals & LIS,unsigned From,unsigned To,unsigned BlockNum=0)111*9880d681SAndroid Build Coastguard Worker static void testHandleMove(MachineFunction &MF, LiveIntervals &LIS,
112*9880d681SAndroid Build Coastguard Worker                            unsigned From, unsigned To, unsigned BlockNum = 0) {
113*9880d681SAndroid Build Coastguard Worker   MachineBasicBlock &MBB = *MF.getBlockNumbered(BlockNum);
114*9880d681SAndroid Build Coastguard Worker 
115*9880d681SAndroid Build Coastguard Worker   unsigned I = 0;
116*9880d681SAndroid Build Coastguard Worker   MachineInstr *FromInstr = nullptr;
117*9880d681SAndroid Build Coastguard Worker   MachineInstr *ToInstr = nullptr;
118*9880d681SAndroid Build Coastguard Worker   for (MachineInstr &MI : MBB) {
119*9880d681SAndroid Build Coastguard Worker     if (I == From)
120*9880d681SAndroid Build Coastguard Worker       FromInstr = &MI;
121*9880d681SAndroid Build Coastguard Worker     if (I == To)
122*9880d681SAndroid Build Coastguard Worker       ToInstr = &MI;
123*9880d681SAndroid Build Coastguard Worker     ++I;
124*9880d681SAndroid Build Coastguard Worker   }
125*9880d681SAndroid Build Coastguard Worker   assert(FromInstr != nullptr && ToInstr != nullptr);
126*9880d681SAndroid Build Coastguard Worker 
127*9880d681SAndroid Build Coastguard Worker   MBB.splice(ToInstr->getIterator(), &MBB, FromInstr->getIterator());
128*9880d681SAndroid Build Coastguard Worker   LIS.handleMove(*FromInstr, true);
129*9880d681SAndroid Build Coastguard Worker }
130*9880d681SAndroid Build Coastguard Worker 
liveIntervalTest(StringRef MIRFunc,LiveIntervalTest T)131*9880d681SAndroid Build Coastguard Worker static void liveIntervalTest(StringRef MIRFunc, LiveIntervalTest T) {
132*9880d681SAndroid Build Coastguard Worker   LLVMContext Context;
133*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<TargetMachine> TM = createTargetMachine();
134*9880d681SAndroid Build Coastguard Worker   // This test is designed for the X86 backend; stop if it is not available.
135*9880d681SAndroid Build Coastguard Worker   if (!TM)
136*9880d681SAndroid Build Coastguard Worker     return;
137*9880d681SAndroid Build Coastguard Worker 
138*9880d681SAndroid Build Coastguard Worker   legacy::PassManager PM;
139*9880d681SAndroid Build Coastguard Worker 
140*9880d681SAndroid Build Coastguard Worker   SmallString<160> S;
141*9880d681SAndroid Build Coastguard Worker   StringRef MIRString = (Twine(
142*9880d681SAndroid Build Coastguard Worker "---\n"
143*9880d681SAndroid Build Coastguard Worker "...\n"
144*9880d681SAndroid Build Coastguard Worker "name: func\n"
145*9880d681SAndroid Build Coastguard Worker "registers:\n"
146*9880d681SAndroid Build Coastguard Worker "  - { id: 0, class: gr64 }\n"
147*9880d681SAndroid Build Coastguard Worker "body: |\n"
148*9880d681SAndroid Build Coastguard Worker "  bb.0:\n"
149*9880d681SAndroid Build Coastguard Worker   ) + Twine(MIRFunc) + Twine("...\n")).toNullTerminatedStringRef(S);
150*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<MIRParser> MIR;
151*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Module> M = parseMIR(Context, PM, MIR, *TM, MIRString,
152*9880d681SAndroid Build Coastguard Worker                                        "func");
153*9880d681SAndroid Build Coastguard Worker 
154*9880d681SAndroid Build Coastguard Worker   PM.add(new TestPass(T));
155*9880d681SAndroid Build Coastguard Worker 
156*9880d681SAndroid Build Coastguard Worker   PM.run(*M);
157*9880d681SAndroid Build Coastguard Worker }
158*9880d681SAndroid Build Coastguard Worker 
159*9880d681SAndroid Build Coastguard Worker } // End of anonymous namespace.
160*9880d681SAndroid Build Coastguard Worker 
161*9880d681SAndroid Build Coastguard Worker char TestPass::ID = 0;
162*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS(TestPass, "testpass", "testpass", false, false)
163*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveUpDef)164*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveUpDef) {
165*9880d681SAndroid Build Coastguard Worker   // Value defined.
166*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
167*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
168*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
169*9880d681SAndroid Build Coastguard Worker "    early-clobber %0 = IMPLICIT_DEF\n"
170*9880d681SAndroid Build Coastguard Worker "    RETQ %0\n",
171*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
172*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 2, 1);
173*9880d681SAndroid Build Coastguard Worker   });
174*9880d681SAndroid Build Coastguard Worker }
175*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveUpRedef)176*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveUpRedef) {
177*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
178*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF\n"
179*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
180*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF implicit %0(tied-def 0)\n"
181*9880d681SAndroid Build Coastguard Worker "    RETQ %0\n",
182*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
183*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 2, 1);
184*9880d681SAndroid Build Coastguard Worker   });
185*9880d681SAndroid Build Coastguard Worker }
186*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveUpEarlyDef)187*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveUpEarlyDef) {
188*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
189*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
190*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
191*9880d681SAndroid Build Coastguard Worker "    early-clobber %0 = IMPLICIT_DEF\n"
192*9880d681SAndroid Build Coastguard Worker "    RETQ %0\n",
193*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
194*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 2, 1);
195*9880d681SAndroid Build Coastguard Worker   });
196*9880d681SAndroid Build Coastguard Worker }
197*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveUpEarlyRedef)198*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveUpEarlyRedef) {
199*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
200*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF\n"
201*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
202*9880d681SAndroid Build Coastguard Worker "    early-clobber %0 = IMPLICIT_DEF implicit %0(tied-def 0)\n"
203*9880d681SAndroid Build Coastguard Worker "    RETQ %0\n",
204*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
205*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 2, 1);
206*9880d681SAndroid Build Coastguard Worker   });
207*9880d681SAndroid Build Coastguard Worker }
208*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveUpKill)209*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveUpKill) {
210*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
211*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF\n"
212*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
213*9880d681SAndroid Build Coastguard Worker "    NOOP implicit %0\n",
214*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
215*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 2, 1);
216*9880d681SAndroid Build Coastguard Worker   });
217*9880d681SAndroid Build Coastguard Worker }
218*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveUpKillFollowing)219*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveUpKillFollowing) {
220*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
221*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF\n"
222*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
223*9880d681SAndroid Build Coastguard Worker "    NOOP implicit %0\n"
224*9880d681SAndroid Build Coastguard Worker "    RETQ %0\n",
225*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
226*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 2, 1);
227*9880d681SAndroid Build Coastguard Worker   });
228*9880d681SAndroid Build Coastguard Worker }
229*9880d681SAndroid Build Coastguard Worker 
230*9880d681SAndroid Build Coastguard Worker // TODO: Construct a situation where we have intervals following a hole
231*9880d681SAndroid Build Coastguard Worker // while still having connected components.
232*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveDownDef)233*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveDownDef) {
234*9880d681SAndroid Build Coastguard Worker   // Value defined.
235*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
236*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
237*9880d681SAndroid Build Coastguard Worker "    early-clobber %0 = IMPLICIT_DEF\n"
238*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
239*9880d681SAndroid Build Coastguard Worker "    RETQ %0\n",
240*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
241*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 1, 2);
242*9880d681SAndroid Build Coastguard Worker   });
243*9880d681SAndroid Build Coastguard Worker }
244*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveDownRedef)245*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveDownRedef) {
246*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
247*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF\n"
248*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF implicit %0(tied-def 0)\n"
249*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
250*9880d681SAndroid Build Coastguard Worker "    RETQ %0\n",
251*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
252*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 1, 2);
253*9880d681SAndroid Build Coastguard Worker   });
254*9880d681SAndroid Build Coastguard Worker }
255*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveDownEarlyDef)256*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveDownEarlyDef) {
257*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
258*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
259*9880d681SAndroid Build Coastguard Worker "    early-clobber %0 = IMPLICIT_DEF\n"
260*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
261*9880d681SAndroid Build Coastguard Worker "    RETQ %0\n",
262*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
263*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 1, 2);
264*9880d681SAndroid Build Coastguard Worker   });
265*9880d681SAndroid Build Coastguard Worker }
266*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveDownEarlyRedef)267*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveDownEarlyRedef) {
268*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
269*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF\n"
270*9880d681SAndroid Build Coastguard Worker "    early-clobber %0 = IMPLICIT_DEF implicit %0(tied-def 0)\n"
271*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
272*9880d681SAndroid Build Coastguard Worker "    RETQ %0\n",
273*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
274*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 1, 2);
275*9880d681SAndroid Build Coastguard Worker   });
276*9880d681SAndroid Build Coastguard Worker }
277*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveDownKill)278*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveDownKill) {
279*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
280*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF\n"
281*9880d681SAndroid Build Coastguard Worker "    NOOP implicit %0\n"
282*9880d681SAndroid Build Coastguard Worker "    NOOP\n",
283*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
284*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 1, 2);
285*9880d681SAndroid Build Coastguard Worker   });
286*9880d681SAndroid Build Coastguard Worker }
287*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveDownKillFollowing)288*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveDownKillFollowing) {
289*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
290*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF\n"
291*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
292*9880d681SAndroid Build Coastguard Worker "    NOOP implicit %0\n"
293*9880d681SAndroid Build Coastguard Worker "    RETQ %0\n",
294*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
295*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 1, 2);
296*9880d681SAndroid Build Coastguard Worker   });
297*9880d681SAndroid Build Coastguard Worker }
298*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveUndefUse)299*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveUndefUse) {
300*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
301*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF\n"
302*9880d681SAndroid Build Coastguard Worker "    NOOP implicit undef %0\n"
303*9880d681SAndroid Build Coastguard Worker "    NOOP implicit %0\n"
304*9880d681SAndroid Build Coastguard Worker "    NOOP\n",
305*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
306*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 1, 3);
307*9880d681SAndroid Build Coastguard Worker   });
308*9880d681SAndroid Build Coastguard Worker }
309*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveUpValNos)310*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveUpValNos) {
311*9880d681SAndroid Build Coastguard Worker   // handleMoveUp() had a bug where it would reuse the value number of the
312*9880d681SAndroid Build Coastguard Worker   // destination segment, even though we have no guarntee that this valno wasn't
313*9880d681SAndroid Build Coastguard Worker   // used in other segments.
314*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
315*9880d681SAndroid Build Coastguard Worker "    successors: %bb.1, %bb.2\n"
316*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF\n"
317*9880d681SAndroid Build Coastguard Worker "    JG_1 %bb.2, implicit %eflags\n"
318*9880d681SAndroid Build Coastguard Worker "    JMP_1 %bb.1\n"
319*9880d681SAndroid Build Coastguard Worker "  bb.2:\n"
320*9880d681SAndroid Build Coastguard Worker "    NOOP implicit %0\n"
321*9880d681SAndroid Build Coastguard Worker "  bb.1:\n"
322*9880d681SAndroid Build Coastguard Worker "    successors: %bb.2\n"
323*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF implicit %0(tied-def 0)\n"
324*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF implicit %0(tied-def 0)\n"
325*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF implicit %0(tied-def 0)\n"
326*9880d681SAndroid Build Coastguard Worker "    JMP_1 %bb.2\n",
327*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
328*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 2, 0, 2);
329*9880d681SAndroid Build Coastguard Worker   });
330*9880d681SAndroid Build Coastguard Worker }
331*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveOverUndefUse0)332*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveOverUndefUse0) {
333*9880d681SAndroid Build Coastguard Worker   // findLastUseBefore() used by handleMoveUp() must ignore undef operands.
334*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
335*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF\n"
336*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
337*9880d681SAndroid Build Coastguard Worker "    NOOP implicit undef %0\n"
338*9880d681SAndroid Build Coastguard Worker "    %0 = IMPLICIT_DEF implicit %0(tied-def 0)\n",
339*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
340*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 3, 1);
341*9880d681SAndroid Build Coastguard Worker   });
342*9880d681SAndroid Build Coastguard Worker }
343*9880d681SAndroid Build Coastguard Worker 
TEST(LiveIntervalTest,MoveOverUndefUse1)344*9880d681SAndroid Build Coastguard Worker TEST(LiveIntervalTest, MoveOverUndefUse1) {
345*9880d681SAndroid Build Coastguard Worker   // findLastUseBefore() used by handleMoveUp() must ignore undef operands.
346*9880d681SAndroid Build Coastguard Worker   liveIntervalTest(
347*9880d681SAndroid Build Coastguard Worker "    %rax = IMPLICIT_DEF\n"
348*9880d681SAndroid Build Coastguard Worker "    NOOP\n"
349*9880d681SAndroid Build Coastguard Worker "    NOOP implicit undef %rax\n"
350*9880d681SAndroid Build Coastguard Worker "    %rax = IMPLICIT_DEF implicit %rax(tied-def 0)\n",
351*9880d681SAndroid Build Coastguard Worker   [](MachineFunction &MF, LiveIntervals &LIS) {
352*9880d681SAndroid Build Coastguard Worker     testHandleMove(MF, LIS, 3, 1);
353*9880d681SAndroid Build Coastguard Worker   });
354*9880d681SAndroid Build Coastguard Worker }
355*9880d681SAndroid Build Coastguard Worker 
main(int argc,char ** argv)356*9880d681SAndroid Build Coastguard Worker int main(int argc, char **argv) {
357*9880d681SAndroid Build Coastguard Worker   ::testing::InitGoogleTest(&argc, argv);
358*9880d681SAndroid Build Coastguard Worker   initLLVM();
359*9880d681SAndroid Build Coastguard Worker   return RUN_ALL_TESTS();
360*9880d681SAndroid Build Coastguard Worker }
361