1 //===- MachineInstrTest.cpp -----------------------------------------------===//
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
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"
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
) {
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}};
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
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
) {
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}};
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
) {
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
);
212 MachineInstr
*MI
= MF
->CreateMachineInstr(MCID
, DL
);
213 MI
->addOperand(*MF
, MachineOperand::CreateReg(0, /*isDef*/ true));
216 raw_string_ostream
OS(str
);
217 MI
->print(OS
, /*IsStandalone*/true, /*SkipOpers*/false, /*SkipDebugLoc*/false,
218 /*AddNewLine*/false);
220 StringRef(OS
.str()).startswith("$noreg = UNKNOWN debug-location "));
222 StringRef(OS
.str()).endswith("filename:1:5"));
225 TEST(MachineInstrSpan
, DistanceBegin
) {
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
) {
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
) {
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
;
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
) {
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
;
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
);
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
) {
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
;
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
) {
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
= {
432 0, 0, (1ULL << MCID::Pseudo
) | (1ULL << MCID::Variadic
),
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
) {
454 MDNode
*PCS
= MDNode::getDistinct(Ctx
, None
);
455 MDNode
*DI
= MDNode::getDistinct(Ctx
, None
);
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");