14a5f522dSDiana Picus //===- MachineInstrTest.cpp -----------------------------------------------===// 24a5f522dSDiana Picus // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 64a5f522dSDiana Picus // 74a5f522dSDiana Picus //===----------------------------------------------------------------------===// 84a5f522dSDiana Picus 9*8d6ea2d4SMichael Liao #include "llvm/CodeGen/MachineBasicBlock.h" 104a5f522dSDiana Picus #include "llvm/CodeGen/MachineInstr.h" 114a5f522dSDiana Picus #include "llvm/CodeGen/MachineFunction.h" 124a5f522dSDiana Picus #include "llvm/CodeGen/MachineModuleInfo.h" 133f833edcSDavid Blaikie #include "llvm/CodeGen/TargetFrameLowering.h" 143f833edcSDavid Blaikie #include "llvm/CodeGen/TargetInstrInfo.h" 15b3bde2eaSDavid Blaikie #include "llvm/CodeGen/TargetLowering.h" 16b3bde2eaSDavid Blaikie #include "llvm/CodeGen/TargetSubtargetInfo.h" 17548add99SFrancis Visoiu Mistrih #include "llvm/IR/DebugInfoMetadata.h" 18548add99SFrancis Visoiu Mistrih #include "llvm/IR/ModuleSlotTracker.h" 194a5f522dSDiana Picus #include "llvm/Support/TargetRegistry.h" 204a5f522dSDiana Picus #include "llvm/Support/TargetSelect.h" 214a5f522dSDiana Picus #include "llvm/Target/TargetMachine.h" 224a5f522dSDiana Picus #include "llvm/Target/TargetOptions.h" 234a5f522dSDiana Picus #include "gtest/gtest.h" 244a5f522dSDiana Picus 254a5f522dSDiana Picus using namespace llvm; 264a5f522dSDiana Picus 274a5f522dSDiana Picus namespace { 284a5f522dSDiana Picus // Add a few Bogus backend classes so we can create MachineInstrs without 294a5f522dSDiana Picus // depending on a real target. 304a5f522dSDiana Picus class BogusTargetLowering : public TargetLowering { 314a5f522dSDiana Picus public: 324a5f522dSDiana Picus BogusTargetLowering(TargetMachine &TM) : TargetLowering(TM) {} 334a5f522dSDiana Picus }; 344a5f522dSDiana Picus 354a5f522dSDiana Picus class BogusFrameLowering : public TargetFrameLowering { 364a5f522dSDiana Picus public: 374a5f522dSDiana Picus BogusFrameLowering() 384a5f522dSDiana Picus : TargetFrameLowering(TargetFrameLowering::StackGrowsDown, 4, 4) {} 394a5f522dSDiana Picus 404a5f522dSDiana Picus void emitPrologue(MachineFunction &MF, 414a5f522dSDiana Picus MachineBasicBlock &MBB) const override {} 424a5f522dSDiana Picus void emitEpilogue(MachineFunction &MF, 434a5f522dSDiana Picus MachineBasicBlock &MBB) const override {} 444a5f522dSDiana Picus bool hasFP(const MachineFunction &MF) const override { return false; } 454a5f522dSDiana Picus }; 464a5f522dSDiana Picus 474a5f522dSDiana Picus class BogusSubtarget : public TargetSubtargetInfo { 484a5f522dSDiana Picus public: 494a5f522dSDiana Picus BogusSubtarget(TargetMachine &TM) 504a5f522dSDiana Picus : TargetSubtargetInfo(Triple(""), "", "", {}, {}, nullptr, nullptr, 512982b846SCraig Topper nullptr, nullptr, nullptr, nullptr), 524a5f522dSDiana Picus FL(), TL(TM) {} 534a5f522dSDiana Picus ~BogusSubtarget() override {} 544a5f522dSDiana Picus 554a5f522dSDiana Picus const TargetFrameLowering *getFrameLowering() const override { return &FL; } 564a5f522dSDiana Picus 574a5f522dSDiana Picus const TargetLowering *getTargetLowering() const override { return &TL; } 584a5f522dSDiana Picus 594a5f522dSDiana Picus const TargetInstrInfo *getInstrInfo() const override { return &TII; } 604a5f522dSDiana Picus 614a5f522dSDiana Picus private: 624a5f522dSDiana Picus BogusFrameLowering FL; 634a5f522dSDiana Picus BogusTargetLowering TL; 644a5f522dSDiana Picus TargetInstrInfo TII; 654a5f522dSDiana Picus }; 664a5f522dSDiana Picus 67bb8507e6SMatthias Braun class BogusTargetMachine : public LLVMTargetMachine { 684a5f522dSDiana Picus public: 694a5f522dSDiana Picus BogusTargetMachine() 70bb8507e6SMatthias Braun : LLVMTargetMachine(Target(), "", Triple(""), "", "", TargetOptions(), 714a5f522dSDiana Picus Reloc::Static, CodeModel::Small, CodeGenOpt::Default), 724a5f522dSDiana Picus ST(*this) {} 734a5f522dSDiana Picus ~BogusTargetMachine() override {} 744a5f522dSDiana Picus 754a5f522dSDiana Picus const TargetSubtargetInfo *getSubtargetImpl(const Function &) const override { 764a5f522dSDiana Picus return &ST; 774a5f522dSDiana Picus } 784a5f522dSDiana Picus 794a5f522dSDiana Picus private: 804a5f522dSDiana Picus BogusSubtarget ST; 814a5f522dSDiana Picus }; 824a5f522dSDiana Picus 834a5f522dSDiana Picus std::unique_ptr<BogusTargetMachine> createTargetMachine() { 844a5f522dSDiana Picus return llvm::make_unique<BogusTargetMachine>(); 854a5f522dSDiana Picus } 864a5f522dSDiana Picus 874a5f522dSDiana Picus std::unique_ptr<MachineFunction> createMachineFunction() { 884a5f522dSDiana Picus LLVMContext Ctx; 894a5f522dSDiana Picus Module M("Module", Ctx); 904a5f522dSDiana Picus auto Type = FunctionType::get(Type::getVoidTy(Ctx), false); 914a5f522dSDiana Picus auto F = Function::Create(Type, GlobalValue::ExternalLinkage, "Test", &M); 924a5f522dSDiana Picus 934a5f522dSDiana Picus auto TM = createTargetMachine(); 944a5f522dSDiana Picus unsigned FunctionNum = 42; 954a5f522dSDiana Picus MachineModuleInfo MMI(TM.get()); 964684033aSMatthias Braun const TargetSubtargetInfo &STI = *TM->getSubtargetImpl(*F); 974a5f522dSDiana Picus 984684033aSMatthias Braun return llvm::make_unique<MachineFunction>(*F, *TM, STI, FunctionNum, MMI); 994a5f522dSDiana Picus } 1004a5f522dSDiana Picus 1014a5f522dSDiana Picus // This test makes sure that MachineInstr::isIdenticalTo handles Defs correctly 1024a5f522dSDiana Picus // for various combinations of IgnoreDefs, and also that it is symmetrical. 1034a5f522dSDiana Picus TEST(IsIdenticalToTest, DifferentDefs) { 1044a5f522dSDiana Picus auto MF = createMachineFunction(); 1054a5f522dSDiana Picus 1064a5f522dSDiana Picus unsigned short NumOps = 2; 1074a5f522dSDiana Picus unsigned char NumDefs = 1; 1084a5f522dSDiana Picus MCOperandInfo OpInfo[] = { 1094a5f522dSDiana Picus {0, 0, MCOI::OPERAND_REGISTER, 0}, 1104a5f522dSDiana Picus {0, 1 << MCOI::OptionalDef, MCOI::OPERAND_REGISTER, 0}}; 1114a5f522dSDiana Picus MCInstrDesc MCID = { 1124a5f522dSDiana Picus 0, NumOps, NumDefs, 0, 0, 1ULL << MCID::HasOptionalDef, 1134a5f522dSDiana Picus 0, nullptr, nullptr, OpInfo, 0, nullptr}; 1144a5f522dSDiana Picus 1154a5f522dSDiana Picus // Create two MIs with different virtual reg defs and the same uses. 1164a5f522dSDiana Picus unsigned VirtualDef1 = -42; // The value doesn't matter, but the sign does. 1174a5f522dSDiana Picus unsigned VirtualDef2 = -43; 1184a5f522dSDiana Picus unsigned VirtualUse = -44; 1194a5f522dSDiana Picus 1204a5f522dSDiana Picus auto MI1 = MF->CreateMachineInstr(MCID, DebugLoc()); 1214a5f522dSDiana Picus MI1->addOperand(*MF, MachineOperand::CreateReg(VirtualDef1, /*isDef*/ true)); 1224a5f522dSDiana Picus MI1->addOperand(*MF, MachineOperand::CreateReg(VirtualUse, /*isDef*/ false)); 1234a5f522dSDiana Picus 1244a5f522dSDiana Picus auto MI2 = MF->CreateMachineInstr(MCID, DebugLoc()); 1254a5f522dSDiana Picus MI2->addOperand(*MF, MachineOperand::CreateReg(VirtualDef2, /*isDef*/ true)); 1264a5f522dSDiana Picus MI2->addOperand(*MF, MachineOperand::CreateReg(VirtualUse, /*isDef*/ false)); 1274a5f522dSDiana Picus 1284a5f522dSDiana Picus // Check that they are identical when we ignore virtual register defs, but not 1294a5f522dSDiana Picus // when we check defs. 1304a5f522dSDiana Picus ASSERT_FALSE(MI1->isIdenticalTo(*MI2, MachineInstr::CheckDefs)); 1314a5f522dSDiana Picus ASSERT_FALSE(MI2->isIdenticalTo(*MI1, MachineInstr::CheckDefs)); 1324a5f522dSDiana Picus 1334a5f522dSDiana Picus ASSERT_TRUE(MI1->isIdenticalTo(*MI2, MachineInstr::IgnoreVRegDefs)); 1344a5f522dSDiana Picus ASSERT_TRUE(MI2->isIdenticalTo(*MI1, MachineInstr::IgnoreVRegDefs)); 1354a5f522dSDiana Picus 1364a5f522dSDiana Picus // Create two MIs with different virtual reg defs, and a def or use of a 1374a5f522dSDiana Picus // sentinel register. 1384a5f522dSDiana Picus unsigned SentinelReg = 0; 1394a5f522dSDiana Picus 1404a5f522dSDiana Picus auto MI3 = MF->CreateMachineInstr(MCID, DebugLoc()); 1414a5f522dSDiana Picus MI3->addOperand(*MF, MachineOperand::CreateReg(VirtualDef1, /*isDef*/ true)); 1424a5f522dSDiana Picus MI3->addOperand(*MF, MachineOperand::CreateReg(SentinelReg, /*isDef*/ true)); 1434a5f522dSDiana Picus 1444a5f522dSDiana Picus auto MI4 = MF->CreateMachineInstr(MCID, DebugLoc()); 1454a5f522dSDiana Picus MI4->addOperand(*MF, MachineOperand::CreateReg(VirtualDef2, /*isDef*/ true)); 1464a5f522dSDiana Picus MI4->addOperand(*MF, MachineOperand::CreateReg(SentinelReg, /*isDef*/ false)); 1474a5f522dSDiana Picus 1484a5f522dSDiana Picus // Check that they are never identical. 1494a5f522dSDiana Picus ASSERT_FALSE(MI3->isIdenticalTo(*MI4, MachineInstr::CheckDefs)); 1504a5f522dSDiana Picus ASSERT_FALSE(MI4->isIdenticalTo(*MI3, MachineInstr::CheckDefs)); 1514a5f522dSDiana Picus 1524a5f522dSDiana Picus ASSERT_FALSE(MI3->isIdenticalTo(*MI4, MachineInstr::IgnoreVRegDefs)); 1534a5f522dSDiana Picus ASSERT_FALSE(MI4->isIdenticalTo(*MI3, MachineInstr::IgnoreVRegDefs)); 1544a5f522dSDiana Picus } 1554a5f522dSDiana Picus 1564a5f522dSDiana Picus // Check that MachineInstrExpressionTrait::isEqual is symmetric and in sync with 1574a5f522dSDiana Picus // MachineInstrExpressionTrait::getHashValue 1584a5f522dSDiana Picus void checkHashAndIsEqualMatch(MachineInstr *MI1, MachineInstr *MI2) { 1594a5f522dSDiana Picus bool IsEqual1 = MachineInstrExpressionTrait::isEqual(MI1, MI2); 1604a5f522dSDiana Picus bool IsEqual2 = MachineInstrExpressionTrait::isEqual(MI2, MI1); 1614a5f522dSDiana Picus 1624a5f522dSDiana Picus ASSERT_EQ(IsEqual1, IsEqual2); 1634a5f522dSDiana Picus 1644a5f522dSDiana Picus auto Hash1 = MachineInstrExpressionTrait::getHashValue(MI1); 1654a5f522dSDiana Picus auto Hash2 = MachineInstrExpressionTrait::getHashValue(MI2); 1664a5f522dSDiana Picus 1674a5f522dSDiana Picus ASSERT_EQ(IsEqual1, Hash1 == Hash2); 1684a5f522dSDiana Picus } 1694a5f522dSDiana Picus 1704a5f522dSDiana Picus // This test makes sure that MachineInstrExpressionTraits::isEqual is in sync 1714a5f522dSDiana Picus // with MachineInstrExpressionTraits::getHashValue. 1724a5f522dSDiana Picus TEST(MachineInstrExpressionTraitTest, IsEqualAgreesWithGetHashValue) { 1734a5f522dSDiana Picus auto MF = createMachineFunction(); 1744a5f522dSDiana Picus 1754a5f522dSDiana Picus unsigned short NumOps = 2; 1764a5f522dSDiana Picus unsigned char NumDefs = 1; 1774a5f522dSDiana Picus MCOperandInfo OpInfo[] = { 1784a5f522dSDiana Picus {0, 0, MCOI::OPERAND_REGISTER, 0}, 1794a5f522dSDiana Picus {0, 1 << MCOI::OptionalDef, MCOI::OPERAND_REGISTER, 0}}; 1804a5f522dSDiana Picus MCInstrDesc MCID = { 1814a5f522dSDiana Picus 0, NumOps, NumDefs, 0, 0, 1ULL << MCID::HasOptionalDef, 1824a5f522dSDiana Picus 0, nullptr, nullptr, OpInfo, 0, nullptr}; 1834a5f522dSDiana Picus 1844a5f522dSDiana Picus // Define a series of instructions with different kinds of operands and make 1854a5f522dSDiana Picus // sure that the hash function is consistent with isEqual for various 1864a5f522dSDiana Picus // combinations of them. 1874a5f522dSDiana Picus unsigned VirtualDef1 = -42; 1884a5f522dSDiana Picus unsigned VirtualDef2 = -43; 1894a5f522dSDiana Picus unsigned VirtualReg = -44; 1904a5f522dSDiana Picus unsigned SentinelReg = 0; 1914a5f522dSDiana Picus unsigned PhysicalReg = 45; 1924a5f522dSDiana Picus 1934a5f522dSDiana Picus auto VD1VU = MF->CreateMachineInstr(MCID, DebugLoc()); 1944a5f522dSDiana Picus VD1VU->addOperand(*MF, 1954a5f522dSDiana Picus MachineOperand::CreateReg(VirtualDef1, /*isDef*/ true)); 1964a5f522dSDiana Picus VD1VU->addOperand(*MF, 1974a5f522dSDiana Picus MachineOperand::CreateReg(VirtualReg, /*isDef*/ false)); 1984a5f522dSDiana Picus 1994a5f522dSDiana Picus auto VD2VU = MF->CreateMachineInstr(MCID, DebugLoc()); 2004a5f522dSDiana Picus VD2VU->addOperand(*MF, 2014a5f522dSDiana Picus MachineOperand::CreateReg(VirtualDef2, /*isDef*/ true)); 2024a5f522dSDiana Picus VD2VU->addOperand(*MF, 2034a5f522dSDiana Picus MachineOperand::CreateReg(VirtualReg, /*isDef*/ false)); 2044a5f522dSDiana Picus 2054a5f522dSDiana Picus auto VD1SU = MF->CreateMachineInstr(MCID, DebugLoc()); 2064a5f522dSDiana Picus VD1SU->addOperand(*MF, 2074a5f522dSDiana Picus MachineOperand::CreateReg(VirtualDef1, /*isDef*/ true)); 2084a5f522dSDiana Picus VD1SU->addOperand(*MF, 2094a5f522dSDiana Picus MachineOperand::CreateReg(SentinelReg, /*isDef*/ false)); 2104a5f522dSDiana Picus 2114a5f522dSDiana Picus auto VD1SD = MF->CreateMachineInstr(MCID, DebugLoc()); 2124a5f522dSDiana Picus VD1SD->addOperand(*MF, 2134a5f522dSDiana Picus MachineOperand::CreateReg(VirtualDef1, /*isDef*/ true)); 2144a5f522dSDiana Picus VD1SD->addOperand(*MF, 2154a5f522dSDiana Picus MachineOperand::CreateReg(SentinelReg, /*isDef*/ true)); 2164a5f522dSDiana Picus 2174a5f522dSDiana Picus auto VD2PU = MF->CreateMachineInstr(MCID, DebugLoc()); 2184a5f522dSDiana Picus VD2PU->addOperand(*MF, 2194a5f522dSDiana Picus MachineOperand::CreateReg(VirtualDef2, /*isDef*/ true)); 2204a5f522dSDiana Picus VD2PU->addOperand(*MF, 2214a5f522dSDiana Picus MachineOperand::CreateReg(PhysicalReg, /*isDef*/ false)); 2224a5f522dSDiana Picus 2234a5f522dSDiana Picus auto VD2PD = MF->CreateMachineInstr(MCID, DebugLoc()); 2244a5f522dSDiana Picus VD2PD->addOperand(*MF, 2254a5f522dSDiana Picus MachineOperand::CreateReg(VirtualDef2, /*isDef*/ true)); 2264a5f522dSDiana Picus VD2PD->addOperand(*MF, 2274a5f522dSDiana Picus MachineOperand::CreateReg(PhysicalReg, /*isDef*/ true)); 2284a5f522dSDiana Picus 2294a5f522dSDiana Picus checkHashAndIsEqualMatch(VD1VU, VD2VU); 2304a5f522dSDiana Picus checkHashAndIsEqualMatch(VD1VU, VD1SU); 2314a5f522dSDiana Picus checkHashAndIsEqualMatch(VD1VU, VD1SD); 2324a5f522dSDiana Picus checkHashAndIsEqualMatch(VD1VU, VD2PU); 2334a5f522dSDiana Picus checkHashAndIsEqualMatch(VD1VU, VD2PD); 2344a5f522dSDiana Picus 2354a5f522dSDiana Picus checkHashAndIsEqualMatch(VD2VU, VD1SU); 2364a5f522dSDiana Picus checkHashAndIsEqualMatch(VD2VU, VD1SD); 2374a5f522dSDiana Picus checkHashAndIsEqualMatch(VD2VU, VD2PU); 2384a5f522dSDiana Picus checkHashAndIsEqualMatch(VD2VU, VD2PD); 2394a5f522dSDiana Picus 2404a5f522dSDiana Picus checkHashAndIsEqualMatch(VD1SU, VD1SD); 2414a5f522dSDiana Picus checkHashAndIsEqualMatch(VD1SU, VD2PU); 2424a5f522dSDiana Picus checkHashAndIsEqualMatch(VD1SU, VD2PD); 2434a5f522dSDiana Picus 2444a5f522dSDiana Picus checkHashAndIsEqualMatch(VD1SD, VD2PU); 2454a5f522dSDiana Picus checkHashAndIsEqualMatch(VD1SD, VD2PD); 2464a5f522dSDiana Picus 2474a5f522dSDiana Picus checkHashAndIsEqualMatch(VD2PU, VD2PD); 2484a5f522dSDiana Picus } 249548add99SFrancis Visoiu Mistrih 250548add99SFrancis Visoiu Mistrih TEST(MachineInstrPrintingTest, DebugLocPrinting) { 251548add99SFrancis Visoiu Mistrih auto MF = createMachineFunction(); 252548add99SFrancis Visoiu Mistrih 253548add99SFrancis Visoiu Mistrih MCOperandInfo OpInfo{0, 0, MCOI::OPERAND_REGISTER, 0}; 254548add99SFrancis Visoiu Mistrih MCInstrDesc MCID = {0, 1, 1, 0, 0, 0, 255548add99SFrancis Visoiu Mistrih 0, nullptr, nullptr, &OpInfo, 0, nullptr}; 256548add99SFrancis Visoiu Mistrih 257548add99SFrancis Visoiu Mistrih LLVMContext Ctx; 2588ed0f741SFrancis Visoiu Mistrih DIFile *DIF = DIFile::getDistinct(Ctx, "filename", ""); 2598ed0f741SFrancis Visoiu Mistrih DISubprogram *DIS = DISubprogram::getDistinct( 260cda54210SPaul Robinson Ctx, nullptr, "", "", DIF, 0, nullptr, 0, nullptr, 0, 0, DINode::FlagZero, 261cda54210SPaul Robinson DISubprogram::SPFlagZero, nullptr); 2628ed0f741SFrancis Visoiu Mistrih DILocation *DIL = DILocation::get(Ctx, 1, 5, DIS); 263548add99SFrancis Visoiu Mistrih DebugLoc DL(DIL); 264548add99SFrancis Visoiu Mistrih MachineInstr *MI = MF->CreateMachineInstr(MCID, DL); 265548add99SFrancis Visoiu Mistrih MI->addOperand(*MF, MachineOperand::CreateReg(0, /*isDef*/ true)); 266548add99SFrancis Visoiu Mistrih 267548add99SFrancis Visoiu Mistrih std::string str; 268548add99SFrancis Visoiu Mistrih raw_string_ostream OS(str); 26978c794a7SCraig Topper MI->print(OS, /*IsStandalone*/true, /*SkipOpers*/false, /*SkipDebugLoc*/false, 27078c794a7SCraig Topper /*AddNewLine*/false); 271548add99SFrancis Visoiu Mistrih ASSERT_TRUE( 27243e94b15SPuyan Lotfi StringRef(OS.str()).startswith("$noreg = UNKNOWN debug-location ")); 2738ed0f741SFrancis Visoiu Mistrih ASSERT_TRUE( 2748ed0f741SFrancis Visoiu Mistrih StringRef(OS.str()).endswith("filename:1:5")); 275548add99SFrancis Visoiu Mistrih } 276548add99SFrancis Visoiu Mistrih 277*8d6ea2d4SMichael Liao TEST(MachineInstrSpan, DistanceBegin) { 278*8d6ea2d4SMichael Liao auto MF = createMachineFunction(); 279*8d6ea2d4SMichael Liao auto MBB = MF->CreateMachineBasicBlock(); 280*8d6ea2d4SMichael Liao 281*8d6ea2d4SMichael Liao MCInstrDesc MCID = {0, 0, 0, 0, 0, 0, 282*8d6ea2d4SMichael Liao 0, nullptr, nullptr, nullptr, 0, nullptr}; 283*8d6ea2d4SMichael Liao 284*8d6ea2d4SMichael Liao auto MII = MBB->begin(); 285*8d6ea2d4SMichael Liao MachineInstrSpan MIS(MII, MBB); 286*8d6ea2d4SMichael Liao ASSERT_TRUE(MIS.empty()); 287*8d6ea2d4SMichael Liao 288*8d6ea2d4SMichael Liao auto MI = MF->CreateMachineInstr(MCID, DebugLoc()); 289*8d6ea2d4SMichael Liao MBB->insert(MII, MI); 290*8d6ea2d4SMichael Liao ASSERT_TRUE(std::distance(MIS.begin(), MII) == 1); 291*8d6ea2d4SMichael Liao } 292*8d6ea2d4SMichael Liao 293*8d6ea2d4SMichael Liao TEST(MachineInstrSpan, DistanceEnd) { 294*8d6ea2d4SMichael Liao auto MF = createMachineFunction(); 295*8d6ea2d4SMichael Liao auto MBB = MF->CreateMachineBasicBlock(); 296*8d6ea2d4SMichael Liao 297*8d6ea2d4SMichael Liao MCInstrDesc MCID = {0, 0, 0, 0, 0, 0, 298*8d6ea2d4SMichael Liao 0, nullptr, nullptr, nullptr, 0, nullptr}; 299*8d6ea2d4SMichael Liao 300*8d6ea2d4SMichael Liao auto MII = MBB->end(); 301*8d6ea2d4SMichael Liao MachineInstrSpan MIS(MII, MBB); 302*8d6ea2d4SMichael Liao ASSERT_TRUE(MIS.empty()); 303*8d6ea2d4SMichael Liao 304*8d6ea2d4SMichael Liao auto MI = MF->CreateMachineInstr(MCID, DebugLoc()); 305*8d6ea2d4SMichael Liao MBB->insert(MII, MI); 306*8d6ea2d4SMichael Liao ASSERT_TRUE(std::distance(MIS.begin(), MII) == 1); 307*8d6ea2d4SMichael Liao } 308*8d6ea2d4SMichael Liao 309be88539bSSerge Guelton static_assert(is_trivially_copyable<MCOperand>::value, "trivially copyable"); 310be88539bSSerge Guelton 3114a5f522dSDiana Picus } // end namespace 312