[docs] Fix build-docs.sh
[llvm-project.git] / llvm / unittests / CodeGen / MachineInstrTest.cpp
blob6488f24e54a8a6abd2c96b98ca7c40cd95b402be
1 //===- MachineInstrTest.cpp -----------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
9 #include "llvm/CodeGen/MachineInstr.h"
10 #include "llvm/ADT/Triple.h"
11 #include "llvm/CodeGen/MachineBasicBlock.h"
12 #include "llvm/CodeGen/MachineFunction.h"
13 #include "llvm/CodeGen/MachineInstrBuilder.h"
14 #include "llvm/CodeGen/MachineMemOperand.h"
15 #include "llvm/CodeGen/MachineModuleInfo.h"
16 #include "llvm/CodeGen/TargetFrameLowering.h"
17 #include "llvm/CodeGen/TargetInstrInfo.h"
18 #include "llvm/CodeGen/TargetLowering.h"
19 #include "llvm/CodeGen/TargetSubtargetInfo.h"
20 #include "llvm/IR/DebugInfoMetadata.h"
21 #include "llvm/IR/IRBuilder.h"
22 #include "llvm/IR/ModuleSlotTracker.h"
23 #include "llvm/MC/MCAsmInfo.h"
24 #include "llvm/MC/MCSymbol.h"
25 #include "llvm/MC/TargetRegistry.h"
26 #include "llvm/Support/TargetSelect.h"
27 #include "llvm/Target/TargetMachine.h"
28 #include "llvm/Target/TargetOptions.h"
29 #include "gmock/gmock.h"
30 #include "gtest/gtest.h"
32 using namespace llvm;
34 namespace {
35 // Include helper functions to ease the manipulation of MachineFunctions.
36 #include "MFCommon.inc"
38 std::unique_ptr<MCContext> createMCContext(MCAsmInfo *AsmInfo) {
39 Triple TheTriple(/*ArchStr=*/"", /*VendorStr=*/"", /*OSStr=*/"",
40 /*EnvironmentStr=*/"elf");
41 return std::make_unique<MCContext>(TheTriple, AsmInfo, nullptr, nullptr,
42 nullptr, nullptr, false);
45 // This test makes sure that MachineInstr::isIdenticalTo handles Defs correctly
46 // for various combinations of IgnoreDefs, and also that it is symmetrical.
47 TEST(IsIdenticalToTest, DifferentDefs) {
48 LLVMContext Ctx;
49 Module Mod("Module", Ctx);
50 auto MF = createMachineFunction(Ctx, Mod);
52 unsigned short NumOps = 2;
53 unsigned char NumDefs = 1;
54 MCOperandInfo OpInfo[] = {
55 {0, 0, MCOI::OPERAND_REGISTER, 0},
56 {0, 1 << MCOI::OptionalDef, MCOI::OPERAND_REGISTER, 0}};
57 MCInstrDesc MCID = {
58 0, NumOps, NumDefs, 0, 0, 1ULL << MCID::HasOptionalDef,
59 0, nullptr, nullptr, OpInfo};
61 // Create two MIs with different virtual reg defs and the same uses.
62 unsigned VirtualDef1 = -42; // The value doesn't matter, but the sign does.
63 unsigned VirtualDef2 = -43;
64 unsigned VirtualUse = -44;
66 auto MI1 = MF->CreateMachineInstr(MCID, DebugLoc());
67 MI1->addOperand(*MF, MachineOperand::CreateReg(VirtualDef1, /*isDef*/ true));
68 MI1->addOperand(*MF, MachineOperand::CreateReg(VirtualUse, /*isDef*/ false));
70 auto MI2 = MF->CreateMachineInstr(MCID, DebugLoc());
71 MI2->addOperand(*MF, MachineOperand::CreateReg(VirtualDef2, /*isDef*/ true));
72 MI2->addOperand(*MF, MachineOperand::CreateReg(VirtualUse, /*isDef*/ false));
74 // Check that they are identical when we ignore virtual register defs, but not
75 // when we check defs.
76 ASSERT_FALSE(MI1->isIdenticalTo(*MI2, MachineInstr::CheckDefs));
77 ASSERT_FALSE(MI2->isIdenticalTo(*MI1, MachineInstr::CheckDefs));
79 ASSERT_TRUE(MI1->isIdenticalTo(*MI2, MachineInstr::IgnoreVRegDefs));
80 ASSERT_TRUE(MI2->isIdenticalTo(*MI1, MachineInstr::IgnoreVRegDefs));
82 // Create two MIs with different virtual reg defs, and a def or use of a
83 // sentinel register.
84 unsigned SentinelReg = 0;
86 auto MI3 = MF->CreateMachineInstr(MCID, DebugLoc());
87 MI3->addOperand(*MF, MachineOperand::CreateReg(VirtualDef1, /*isDef*/ true));
88 MI3->addOperand(*MF, MachineOperand::CreateReg(SentinelReg, /*isDef*/ true));
90 auto MI4 = MF->CreateMachineInstr(MCID, DebugLoc());
91 MI4->addOperand(*MF, MachineOperand::CreateReg(VirtualDef2, /*isDef*/ true));
92 MI4->addOperand(*MF, MachineOperand::CreateReg(SentinelReg, /*isDef*/ false));
94 // Check that they are never identical.
95 ASSERT_FALSE(MI3->isIdenticalTo(*MI4, MachineInstr::CheckDefs));
96 ASSERT_FALSE(MI4->isIdenticalTo(*MI3, MachineInstr::CheckDefs));
98 ASSERT_FALSE(MI3->isIdenticalTo(*MI4, MachineInstr::IgnoreVRegDefs));
99 ASSERT_FALSE(MI4->isIdenticalTo(*MI3, MachineInstr::IgnoreVRegDefs));
102 // Check that MachineInstrExpressionTrait::isEqual is symmetric and in sync with
103 // MachineInstrExpressionTrait::getHashValue
104 void checkHashAndIsEqualMatch(MachineInstr *MI1, MachineInstr *MI2) {
105 bool IsEqual1 = MachineInstrExpressionTrait::isEqual(MI1, MI2);
106 bool IsEqual2 = MachineInstrExpressionTrait::isEqual(MI2, MI1);
108 ASSERT_EQ(IsEqual1, IsEqual2);
110 auto Hash1 = MachineInstrExpressionTrait::getHashValue(MI1);
111 auto Hash2 = MachineInstrExpressionTrait::getHashValue(MI2);
113 ASSERT_EQ(IsEqual1, Hash1 == Hash2);
116 // This test makes sure that MachineInstrExpressionTraits::isEqual is in sync
117 // with MachineInstrExpressionTraits::getHashValue.
118 TEST(MachineInstrExpressionTraitTest, IsEqualAgreesWithGetHashValue) {
119 LLVMContext Ctx;
120 Module Mod("Module", Ctx);
121 auto MF = createMachineFunction(Ctx, Mod);
123 unsigned short NumOps = 2;
124 unsigned char NumDefs = 1;
125 MCOperandInfo OpInfo[] = {
126 {0, 0, MCOI::OPERAND_REGISTER, 0},
127 {0, 1 << MCOI::OptionalDef, MCOI::OPERAND_REGISTER, 0}};
128 MCInstrDesc MCID = {
129 0, NumOps, NumDefs, 0, 0, 1ULL << MCID::HasOptionalDef,
130 0, nullptr, nullptr, OpInfo};
132 // Define a series of instructions with different kinds of operands and make
133 // sure that the hash function is consistent with isEqual for various
134 // combinations of them.
135 unsigned VirtualDef1 = -42;
136 unsigned VirtualDef2 = -43;
137 unsigned VirtualReg = -44;
138 unsigned SentinelReg = 0;
139 unsigned PhysicalReg = 45;
141 auto VD1VU = MF->CreateMachineInstr(MCID, DebugLoc());
142 VD1VU->addOperand(*MF,
143 MachineOperand::CreateReg(VirtualDef1, /*isDef*/ true));
144 VD1VU->addOperand(*MF,
145 MachineOperand::CreateReg(VirtualReg, /*isDef*/ false));
147 auto VD2VU = MF->CreateMachineInstr(MCID, DebugLoc());
148 VD2VU->addOperand(*MF,
149 MachineOperand::CreateReg(VirtualDef2, /*isDef*/ true));
150 VD2VU->addOperand(*MF,
151 MachineOperand::CreateReg(VirtualReg, /*isDef*/ false));
153 auto VD1SU = MF->CreateMachineInstr(MCID, DebugLoc());
154 VD1SU->addOperand(*MF,
155 MachineOperand::CreateReg(VirtualDef1, /*isDef*/ true));
156 VD1SU->addOperand(*MF,
157 MachineOperand::CreateReg(SentinelReg, /*isDef*/ false));
159 auto VD1SD = MF->CreateMachineInstr(MCID, DebugLoc());
160 VD1SD->addOperand(*MF,
161 MachineOperand::CreateReg(VirtualDef1, /*isDef*/ true));
162 VD1SD->addOperand(*MF,
163 MachineOperand::CreateReg(SentinelReg, /*isDef*/ true));
165 auto VD2PU = MF->CreateMachineInstr(MCID, DebugLoc());
166 VD2PU->addOperand(*MF,
167 MachineOperand::CreateReg(VirtualDef2, /*isDef*/ true));
168 VD2PU->addOperand(*MF,
169 MachineOperand::CreateReg(PhysicalReg, /*isDef*/ false));
171 auto VD2PD = MF->CreateMachineInstr(MCID, DebugLoc());
172 VD2PD->addOperand(*MF,
173 MachineOperand::CreateReg(VirtualDef2, /*isDef*/ true));
174 VD2PD->addOperand(*MF,
175 MachineOperand::CreateReg(PhysicalReg, /*isDef*/ true));
177 checkHashAndIsEqualMatch(VD1VU, VD2VU);
178 checkHashAndIsEqualMatch(VD1VU, VD1SU);
179 checkHashAndIsEqualMatch(VD1VU, VD1SD);
180 checkHashAndIsEqualMatch(VD1VU, VD2PU);
181 checkHashAndIsEqualMatch(VD1VU, VD2PD);
183 checkHashAndIsEqualMatch(VD2VU, VD1SU);
184 checkHashAndIsEqualMatch(VD2VU, VD1SD);
185 checkHashAndIsEqualMatch(VD2VU, VD2PU);
186 checkHashAndIsEqualMatch(VD2VU, VD2PD);
188 checkHashAndIsEqualMatch(VD1SU, VD1SD);
189 checkHashAndIsEqualMatch(VD1SU, VD2PU);
190 checkHashAndIsEqualMatch(VD1SU, VD2PD);
192 checkHashAndIsEqualMatch(VD1SD, VD2PU);
193 checkHashAndIsEqualMatch(VD1SD, VD2PD);
195 checkHashAndIsEqualMatch(VD2PU, VD2PD);
198 TEST(MachineInstrPrintingTest, DebugLocPrinting) {
199 LLVMContext Ctx;
200 Module Mod("Module", Ctx);
201 auto MF = createMachineFunction(Ctx, Mod);
203 MCOperandInfo OpInfo{0, 0, MCOI::OPERAND_REGISTER, 0};
204 MCInstrDesc MCID = {0, 1, 1, 0, 0, 0, 0, nullptr, nullptr, &OpInfo};
206 DIFile *DIF = DIFile::getDistinct(Ctx, "filename", "");
207 DISubprogram *DIS = DISubprogram::getDistinct(
208 Ctx, nullptr, "", "", DIF, 0, nullptr, 0, nullptr, 0, 0, DINode::FlagZero,
209 DISubprogram::SPFlagZero, nullptr);
210 DILocation *DIL = DILocation::get(Ctx, 1, 5, DIS);
211 DebugLoc DL(DIL);
212 MachineInstr *MI = MF->CreateMachineInstr(MCID, DL);
213 MI->addOperand(*MF, MachineOperand::CreateReg(0, /*isDef*/ true));
215 std::string str;
216 raw_string_ostream OS(str);
217 MI->print(OS, /*IsStandalone*/true, /*SkipOpers*/false, /*SkipDebugLoc*/false,
218 /*AddNewLine*/false);
219 ASSERT_TRUE(
220 StringRef(OS.str()).startswith("$noreg = UNKNOWN debug-location "));
221 ASSERT_TRUE(
222 StringRef(OS.str()).endswith("filename:1:5"));
225 TEST(MachineInstrSpan, DistanceBegin) {
226 LLVMContext Ctx;
227 Module Mod("Module", Ctx);
228 auto MF = createMachineFunction(Ctx, Mod);
229 auto MBB = MF->CreateMachineBasicBlock();
231 MCInstrDesc MCID = {0, 0, 0, 0, 0, 0, 0, nullptr, nullptr, nullptr};
233 auto MII = MBB->begin();
234 MachineInstrSpan MIS(MII, MBB);
235 ASSERT_TRUE(MIS.empty());
237 auto MI = MF->CreateMachineInstr(MCID, DebugLoc());
238 MBB->insert(MII, MI);
239 ASSERT_TRUE(std::distance(MIS.begin(), MII) == 1);
242 TEST(MachineInstrSpan, DistanceEnd) {
243 LLVMContext Ctx;
244 Module Mod("Module", Ctx);
245 auto MF = createMachineFunction(Ctx, Mod);
246 auto MBB = MF->CreateMachineBasicBlock();
248 MCInstrDesc MCID = {0, 0, 0, 0, 0, 0, 0, nullptr, nullptr, nullptr};
250 auto MII = MBB->end();
251 MachineInstrSpan MIS(MII, MBB);
252 ASSERT_TRUE(MIS.empty());
254 auto MI = MF->CreateMachineInstr(MCID, DebugLoc());
255 MBB->insert(MII, MI);
256 ASSERT_TRUE(std::distance(MIS.begin(), MII) == 1);
259 TEST(MachineInstrExtraInfo, AddExtraInfo) {
260 LLVMContext Ctx;
261 Module Mod("Module", Ctx);
262 auto MF = createMachineFunction(Ctx, Mod);
263 MCInstrDesc MCID = {0, 0, 0, 0, 0, 0, 0, nullptr, nullptr, nullptr};
265 auto MI = MF->CreateMachineInstr(MCID, DebugLoc());
266 auto MAI = MCAsmInfo();
267 auto MC = createMCContext(&MAI);
268 auto MMO = MF->getMachineMemOperand(MachinePointerInfo(),
269 MachineMemOperand::MOLoad, 8, Align(8));
270 SmallVector<MachineMemOperand *, 2> MMOs;
271 MMOs.push_back(MMO);
272 MCSymbol *Sym1 = MC->createTempSymbol("pre_label", false);
273 MCSymbol *Sym2 = MC->createTempSymbol("post_label", false);
274 MDNode *HAM = MDNode::getDistinct(Ctx, None);
275 MDNode *PCS = MDNode::getDistinct(Ctx, None);
277 ASSERT_TRUE(MI->memoperands_empty());
278 ASSERT_FALSE(MI->getPreInstrSymbol());
279 ASSERT_FALSE(MI->getPostInstrSymbol());
280 ASSERT_FALSE(MI->getHeapAllocMarker());
281 ASSERT_FALSE(MI->getPCSections());
283 MI->setMemRefs(*MF, MMOs);
284 ASSERT_TRUE(MI->memoperands().size() == 1);
285 ASSERT_FALSE(MI->getPreInstrSymbol());
286 ASSERT_FALSE(MI->getPostInstrSymbol());
287 ASSERT_FALSE(MI->getHeapAllocMarker());
288 ASSERT_FALSE(MI->getPCSections());
290 MI->setPreInstrSymbol(*MF, Sym1);
291 ASSERT_TRUE(MI->memoperands().size() == 1);
292 ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
293 ASSERT_FALSE(MI->getPostInstrSymbol());
294 ASSERT_FALSE(MI->getHeapAllocMarker());
295 ASSERT_FALSE(MI->getPCSections());
297 MI->setPostInstrSymbol(*MF, Sym2);
298 ASSERT_TRUE(MI->memoperands().size() == 1);
299 ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
300 ASSERT_TRUE(MI->getPostInstrSymbol() == Sym2);
301 ASSERT_FALSE(MI->getHeapAllocMarker());
302 ASSERT_FALSE(MI->getPCSections());
304 MI->setHeapAllocMarker(*MF, HAM);
305 ASSERT_TRUE(MI->memoperands().size() == 1);
306 ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
307 ASSERT_TRUE(MI->getPostInstrSymbol() == Sym2);
308 ASSERT_TRUE(MI->getHeapAllocMarker() == HAM);
309 ASSERT_FALSE(MI->getPCSections());
311 MI->setPCSections(*MF, PCS);
312 ASSERT_TRUE(MI->memoperands().size() == 1);
313 ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
314 ASSERT_TRUE(MI->getPostInstrSymbol() == Sym2);
315 ASSERT_TRUE(MI->getHeapAllocMarker() == HAM);
316 ASSERT_TRUE(MI->getPCSections() == PCS);
319 TEST(MachineInstrExtraInfo, ChangeExtraInfo) {
320 LLVMContext Ctx;
321 Module Mod("Module", Ctx);
322 auto MF = createMachineFunction(Ctx, Mod);
323 MCInstrDesc MCID = {0, 0, 0, 0, 0, 0, 0, nullptr, nullptr, nullptr};
325 auto MI = MF->CreateMachineInstr(MCID, DebugLoc());
326 auto MAI = MCAsmInfo();
327 auto MC = createMCContext(&MAI);
328 auto MMO = MF->getMachineMemOperand(MachinePointerInfo(),
329 MachineMemOperand::MOLoad, 8, Align(8));
330 SmallVector<MachineMemOperand *, 2> MMOs;
331 MMOs.push_back(MMO);
332 MCSymbol *Sym1 = MC->createTempSymbol("pre_label", false);
333 MCSymbol *Sym2 = MC->createTempSymbol("post_label", false);
334 MDNode *HAM = MDNode::getDistinct(Ctx, None);
335 MDNode *PCS = MDNode::getDistinct(Ctx, None);
337 MI->setMemRefs(*MF, MMOs);
338 MI->setPreInstrSymbol(*MF, Sym1);
339 MI->setPostInstrSymbol(*MF, Sym2);
340 MI->setHeapAllocMarker(*MF, HAM);
341 MI->setPCSections(*MF, PCS);
343 MMOs.push_back(MMO);
345 MI->setMemRefs(*MF, MMOs);
346 ASSERT_TRUE(MI->memoperands().size() == 2);
347 ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
348 ASSERT_TRUE(MI->getPostInstrSymbol() == Sym2);
349 ASSERT_TRUE(MI->getHeapAllocMarker() == HAM);
350 ASSERT_TRUE(MI->getPCSections() == PCS);
352 MI->setPostInstrSymbol(*MF, Sym1);
353 ASSERT_TRUE(MI->memoperands().size() == 2);
354 ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
355 ASSERT_TRUE(MI->getPostInstrSymbol() == Sym1);
356 ASSERT_TRUE(MI->getHeapAllocMarker() == HAM);
357 ASSERT_TRUE(MI->getPCSections() == PCS);
360 TEST(MachineInstrExtraInfo, RemoveExtraInfo) {
361 LLVMContext Ctx;
362 Module Mod("Module", Ctx);
363 auto MF = createMachineFunction(Ctx, Mod);
364 MCInstrDesc MCID = {0, 0, 0, 0, 0, 0, 0, nullptr, nullptr, nullptr};
366 auto MI = MF->CreateMachineInstr(MCID, DebugLoc());
367 auto MAI = MCAsmInfo();
368 auto MC = createMCContext(&MAI);
369 auto MMO = MF->getMachineMemOperand(MachinePointerInfo(),
370 MachineMemOperand::MOLoad, 8, Align(8));
371 SmallVector<MachineMemOperand *, 2> MMOs;
372 MMOs.push_back(MMO);
373 MMOs.push_back(MMO);
374 MCSymbol *Sym1 = MC->createTempSymbol("pre_label", false);
375 MCSymbol *Sym2 = MC->createTempSymbol("post_label", false);
376 MDNode *HAM = MDNode::getDistinct(Ctx, None);
377 MDNode *PCS = MDNode::getDistinct(Ctx, None);
379 MI->setMemRefs(*MF, MMOs);
380 MI->setPreInstrSymbol(*MF, Sym1);
381 MI->setPostInstrSymbol(*MF, Sym2);
382 MI->setHeapAllocMarker(*MF, HAM);
383 MI->setPCSections(*MF, PCS);
385 MI->setPostInstrSymbol(*MF, nullptr);
386 ASSERT_TRUE(MI->memoperands().size() == 2);
387 ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
388 ASSERT_FALSE(MI->getPostInstrSymbol());
389 ASSERT_TRUE(MI->getHeapAllocMarker() == HAM);
390 ASSERT_TRUE(MI->getPCSections() == PCS);
392 MI->setHeapAllocMarker(*MF, nullptr);
393 ASSERT_TRUE(MI->memoperands().size() == 2);
394 ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
395 ASSERT_FALSE(MI->getPostInstrSymbol());
396 ASSERT_FALSE(MI->getHeapAllocMarker());
397 ASSERT_TRUE(MI->getPCSections() == PCS);
399 MI->setPCSections(*MF, nullptr);
400 ASSERT_TRUE(MI->memoperands().size() == 2);
401 ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
402 ASSERT_FALSE(MI->getPostInstrSymbol());
403 ASSERT_FALSE(MI->getHeapAllocMarker());
404 ASSERT_FALSE(MI->getPCSections());
406 MI->setPreInstrSymbol(*MF, nullptr);
407 ASSERT_TRUE(MI->memoperands().size() == 2);
408 ASSERT_FALSE(MI->getPreInstrSymbol());
409 ASSERT_FALSE(MI->getPostInstrSymbol());
410 ASSERT_FALSE(MI->getHeapAllocMarker());
411 ASSERT_FALSE(MI->getPCSections());
413 MI->setMemRefs(*MF, {});
414 ASSERT_TRUE(MI->memoperands_empty());
415 ASSERT_FALSE(MI->getPreInstrSymbol());
416 ASSERT_FALSE(MI->getPostInstrSymbol());
417 ASSERT_FALSE(MI->getHeapAllocMarker());
418 ASSERT_FALSE(MI->getPCSections());
421 TEST(MachineInstrDebugValue, AddDebugValueOperand) {
422 LLVMContext Ctx;
423 Module Mod("Module", Ctx);
424 auto MF = createMachineFunction(Ctx, Mod);
426 for (const unsigned short Opcode :
427 {TargetOpcode::DBG_VALUE, TargetOpcode::DBG_VALUE_LIST,
428 TargetOpcode::DBG_INSTR_REF, TargetOpcode::DBG_PHI,
429 TargetOpcode::DBG_LABEL}) {
430 const MCInstrDesc MCID = {
431 Opcode, 0, 0,
432 0, 0, (1ULL << MCID::Pseudo) | (1ULL << MCID::Variadic),
433 0, nullptr, nullptr,
434 nullptr};
436 auto *MI = MF->CreateMachineInstr(MCID, DebugLoc());
437 MI->addOperand(*MF, MachineOperand::CreateReg(0, /*isDef*/ false));
439 MI->addOperand(*MF, MachineOperand::CreateImm(0));
440 MI->getOperand(1).ChangeToRegister(0, false);
442 ASSERT_TRUE(MI->getOperand(0).isDebug());
443 ASSERT_TRUE(MI->getOperand(1).isDebug());
447 MATCHER_P(HasMIMetadata, MIMD, "") {
448 return arg->getDebugLoc() == MIMD.getDL() &&
449 arg->getPCSections() == MIMD.getPCSections();
452 TEST(MachineInstrBuilder, BuildMI) {
453 LLVMContext Ctx;
454 MDNode *PCS = MDNode::getDistinct(Ctx, None);
455 MDNode *DI = MDNode::getDistinct(Ctx, None);
456 DebugLoc DL(DI);
457 MIMetadata MIMD(DL, PCS);
458 EXPECT_EQ(MIMD.getDL(), DL);
459 EXPECT_EQ(MIMD.getPCSections(), PCS);
460 // Check common BuildMI() overloads propagate MIMetadata.
461 Module Mod("Module", Ctx);
462 auto MF = createMachineFunction(Ctx, Mod);
463 auto MBB = MF->CreateMachineBasicBlock();
464 MCInstrDesc MCID = {0, 0, 0, 0, 0, 0, 0, nullptr, nullptr, nullptr};
465 EXPECT_THAT(BuildMI(*MF, MIMD, MCID), HasMIMetadata(MIMD));
466 EXPECT_THAT(BuildMI(*MF, MIMD, MCID), HasMIMetadata(MIMD));
467 EXPECT_THAT(BuildMI(*MBB, MBB->end(), MIMD, MCID), HasMIMetadata(MIMD));
468 EXPECT_THAT(BuildMI(*MBB, MBB->end(), MIMD, MCID), HasMIMetadata(MIMD));
469 EXPECT_THAT(BuildMI(*MBB, MBB->instr_end(), MIMD, MCID), HasMIMetadata(MIMD));
470 EXPECT_THAT(BuildMI(*MBB, *MBB->begin(), MIMD, MCID), HasMIMetadata(MIMD));
471 EXPECT_THAT(BuildMI(*MBB, &*MBB->begin(), MIMD, MCID), HasMIMetadata(MIMD));
472 EXPECT_THAT(BuildMI(MBB, MIMD, MCID), HasMIMetadata(MIMD));
475 static_assert(std::is_trivially_copyable<MCOperand>::value,
476 "trivially copyable");
478 } // end namespace