1e580952dSDimitry Andric //===-- MachineVerifier.cpp - Machine Code Verifier -----------------------===// 2f22ef01cSRoman Divacky // 3f22ef01cSRoman Divacky // The LLVM Compiler Infrastructure 4f22ef01cSRoman Divacky // 5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source 6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details. 7f22ef01cSRoman Divacky // 8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 9f22ef01cSRoman Divacky // 10f22ef01cSRoman Divacky // Pass to verify generated machine code. The following is checked: 11f22ef01cSRoman Divacky // 12f22ef01cSRoman Divacky // Operand counts: All explicit operands must be present. 13f22ef01cSRoman Divacky // 14f22ef01cSRoman Divacky // Register classes: All physical and virtual register operands must be 15f22ef01cSRoman Divacky // compatible with the register class required by the instruction descriptor. 16f22ef01cSRoman Divacky // 17f22ef01cSRoman Divacky // Register live intervals: Registers must be defined only once, and must be 18f22ef01cSRoman Divacky // defined before use. 19f22ef01cSRoman Divacky // 20f22ef01cSRoman Divacky // The machine code verifier is enabled from LLVMTargetMachine.cpp with the 21f22ef01cSRoman Divacky // command-line option -verify-machineinstrs, or by defining the environment 22f22ef01cSRoman Divacky // variable LLVM_VERIFY_MACHINEINSTRS to the name of a file that will receive 23f22ef01cSRoman Divacky // the verifier errors. 24f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 25f22ef01cSRoman Divacky 26f22ef01cSRoman Divacky #include "llvm/CodeGen/Passes.h" 27f22ef01cSRoman Divacky #include "llvm/ADT/DenseSet.h" 28f785676fSDimitry Andric #include "llvm/ADT/DepthFirstIterator.h" 29f22ef01cSRoman Divacky #include "llvm/ADT/SetOperations.h" 30f22ef01cSRoman Divacky #include "llvm/ADT/SmallVector.h" 31139f7f9bSDimitry Andric #include "llvm/CodeGen/LiveIntervalAnalysis.h" 32139f7f9bSDimitry Andric #include "llvm/CodeGen/LiveStackAnalysis.h" 33139f7f9bSDimitry Andric #include "llvm/CodeGen/LiveVariables.h" 34139f7f9bSDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h" 35139f7f9bSDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h" 36139f7f9bSDimitry Andric #include "llvm/CodeGen/MachineMemOperand.h" 37139f7f9bSDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h" 38139f7f9bSDimitry Andric #include "llvm/IR/BasicBlock.h" 39139f7f9bSDimitry Andric #include "llvm/IR/InlineAsm.h" 40139f7f9bSDimitry Andric #include "llvm/IR/Instructions.h" 41139f7f9bSDimitry Andric #include "llvm/MC/MCAsmInfo.h" 42f22ef01cSRoman Divacky #include "llvm/Support/Debug.h" 43f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h" 4491bc56edSDimitry Andric #include "llvm/Support/FileSystem.h" 45f22ef01cSRoman Divacky #include "llvm/Support/raw_ostream.h" 46139f7f9bSDimitry Andric #include "llvm/Target/TargetInstrInfo.h" 47139f7f9bSDimitry Andric #include "llvm/Target/TargetMachine.h" 48139f7f9bSDimitry Andric #include "llvm/Target/TargetRegisterInfo.h" 49f22ef01cSRoman Divacky using namespace llvm; 50f22ef01cSRoman Divacky 51f22ef01cSRoman Divacky namespace { 52f22ef01cSRoman Divacky struct MachineVerifier { 53f22ef01cSRoman Divacky 542754fe60SDimitry Andric MachineVerifier(Pass *pass, const char *b) : 55f22ef01cSRoman Divacky PASS(pass), 562754fe60SDimitry Andric Banner(b), 57f22ef01cSRoman Divacky OutFileName(getenv("LLVM_VERIFY_MACHINEINSTRS")) 58f22ef01cSRoman Divacky {} 59f22ef01cSRoman Divacky 60f22ef01cSRoman Divacky bool runOnMachineFunction(MachineFunction &MF); 61f22ef01cSRoman Divacky 62f22ef01cSRoman Divacky Pass *const PASS; 632754fe60SDimitry Andric const char *Banner; 64f22ef01cSRoman Divacky const char *const OutFileName; 65f22ef01cSRoman Divacky raw_ostream *OS; 66f22ef01cSRoman Divacky const MachineFunction *MF; 67f22ef01cSRoman Divacky const TargetMachine *TM; 6817a519f9SDimitry Andric const TargetInstrInfo *TII; 69f22ef01cSRoman Divacky const TargetRegisterInfo *TRI; 70f22ef01cSRoman Divacky const MachineRegisterInfo *MRI; 71f22ef01cSRoman Divacky 72f22ef01cSRoman Divacky unsigned foundErrors; 73f22ef01cSRoman Divacky 74f22ef01cSRoman Divacky typedef SmallVector<unsigned, 16> RegVector; 75dff0c46cSDimitry Andric typedef SmallVector<const uint32_t*, 4> RegMaskVector; 76f22ef01cSRoman Divacky typedef DenseSet<unsigned> RegSet; 77f22ef01cSRoman Divacky typedef DenseMap<unsigned, const MachineInstr*> RegMap; 783861d79fSDimitry Andric typedef SmallPtrSet<const MachineBasicBlock*, 8> BlockSet; 79f22ef01cSRoman Divacky 806122f3e6SDimitry Andric const MachineInstr *FirstTerminator; 813861d79fSDimitry Andric BlockSet FunctionBlocks; 826122f3e6SDimitry Andric 83f22ef01cSRoman Divacky BitVector regsReserved; 84f22ef01cSRoman Divacky RegSet regsLive; 85f22ef01cSRoman Divacky RegVector regsDefined, regsDead, regsKilled; 86dff0c46cSDimitry Andric RegMaskVector regMasks; 87f22ef01cSRoman Divacky RegSet regsLiveInButUnused; 88f22ef01cSRoman Divacky 892754fe60SDimitry Andric SlotIndex lastIndex; 902754fe60SDimitry Andric 91f22ef01cSRoman Divacky // Add Reg and any sub-registers to RV 92f22ef01cSRoman Divacky void addRegWithSubRegs(RegVector &RV, unsigned Reg) { 93f22ef01cSRoman Divacky RV.push_back(Reg); 94f22ef01cSRoman Divacky if (TargetRegisterInfo::isPhysicalRegister(Reg)) 957ae0e2c9SDimitry Andric for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) 967ae0e2c9SDimitry Andric RV.push_back(*SubRegs); 97f22ef01cSRoman Divacky } 98f22ef01cSRoman Divacky 99f22ef01cSRoman Divacky struct BBInfo { 100f22ef01cSRoman Divacky // Is this MBB reachable from the MF entry point? 101f22ef01cSRoman Divacky bool reachable; 102f22ef01cSRoman Divacky 103f22ef01cSRoman Divacky // Vregs that must be live in because they are used without being 104f22ef01cSRoman Divacky // defined. Map value is the user. 105f22ef01cSRoman Divacky RegMap vregsLiveIn; 106f22ef01cSRoman Divacky 107f22ef01cSRoman Divacky // Regs killed in MBB. They may be defined again, and will then be in both 108f22ef01cSRoman Divacky // regsKilled and regsLiveOut. 109f22ef01cSRoman Divacky RegSet regsKilled; 110f22ef01cSRoman Divacky 111f22ef01cSRoman Divacky // Regs defined in MBB and live out. Note that vregs passing through may 112f22ef01cSRoman Divacky // be live out without being mentioned here. 113f22ef01cSRoman Divacky RegSet regsLiveOut; 114f22ef01cSRoman Divacky 115f22ef01cSRoman Divacky // Vregs that pass through MBB untouched. This set is disjoint from 116f22ef01cSRoman Divacky // regsKilled and regsLiveOut. 117f22ef01cSRoman Divacky RegSet vregsPassed; 118f22ef01cSRoman Divacky 119f22ef01cSRoman Divacky // Vregs that must pass through MBB because they are needed by a successor 120f22ef01cSRoman Divacky // block. This set is disjoint from regsLiveOut. 121f22ef01cSRoman Divacky RegSet vregsRequired; 122f22ef01cSRoman Divacky 1233861d79fSDimitry Andric // Set versions of block's predecessor and successor lists. 1243861d79fSDimitry Andric BlockSet Preds, Succs; 1253861d79fSDimitry Andric 126f22ef01cSRoman Divacky BBInfo() : reachable(false) {} 127f22ef01cSRoman Divacky 128f22ef01cSRoman Divacky // Add register to vregsPassed if it belongs there. Return true if 129f22ef01cSRoman Divacky // anything changed. 130f22ef01cSRoman Divacky bool addPassed(unsigned Reg) { 131f22ef01cSRoman Divacky if (!TargetRegisterInfo::isVirtualRegister(Reg)) 132f22ef01cSRoman Divacky return false; 133f22ef01cSRoman Divacky if (regsKilled.count(Reg) || regsLiveOut.count(Reg)) 134f22ef01cSRoman Divacky return false; 135f22ef01cSRoman Divacky return vregsPassed.insert(Reg).second; 136f22ef01cSRoman Divacky } 137f22ef01cSRoman Divacky 138f22ef01cSRoman Divacky // Same for a full set. 139f22ef01cSRoman Divacky bool addPassed(const RegSet &RS) { 140f22ef01cSRoman Divacky bool changed = false; 141f22ef01cSRoman Divacky for (RegSet::const_iterator I = RS.begin(), E = RS.end(); I != E; ++I) 142f22ef01cSRoman Divacky if (addPassed(*I)) 143f22ef01cSRoman Divacky changed = true; 144f22ef01cSRoman Divacky return changed; 145f22ef01cSRoman Divacky } 146f22ef01cSRoman Divacky 147f22ef01cSRoman Divacky // Add register to vregsRequired if it belongs there. Return true if 148f22ef01cSRoman Divacky // anything changed. 149f22ef01cSRoman Divacky bool addRequired(unsigned Reg) { 150f22ef01cSRoman Divacky if (!TargetRegisterInfo::isVirtualRegister(Reg)) 151f22ef01cSRoman Divacky return false; 152f22ef01cSRoman Divacky if (regsLiveOut.count(Reg)) 153f22ef01cSRoman Divacky return false; 154f22ef01cSRoman Divacky return vregsRequired.insert(Reg).second; 155f22ef01cSRoman Divacky } 156f22ef01cSRoman Divacky 157f22ef01cSRoman Divacky // Same for a full set. 158f22ef01cSRoman Divacky bool addRequired(const RegSet &RS) { 159f22ef01cSRoman Divacky bool changed = false; 160f22ef01cSRoman Divacky for (RegSet::const_iterator I = RS.begin(), E = RS.end(); I != E; ++I) 161f22ef01cSRoman Divacky if (addRequired(*I)) 162f22ef01cSRoman Divacky changed = true; 163f22ef01cSRoman Divacky return changed; 164f22ef01cSRoman Divacky } 165f22ef01cSRoman Divacky 166f22ef01cSRoman Divacky // Same for a full map. 167f22ef01cSRoman Divacky bool addRequired(const RegMap &RM) { 168f22ef01cSRoman Divacky bool changed = false; 169f22ef01cSRoman Divacky for (RegMap::const_iterator I = RM.begin(), E = RM.end(); I != E; ++I) 170f22ef01cSRoman Divacky if (addRequired(I->first)) 171f22ef01cSRoman Divacky changed = true; 172f22ef01cSRoman Divacky return changed; 173f22ef01cSRoman Divacky } 174f22ef01cSRoman Divacky 175f22ef01cSRoman Divacky // Live-out registers are either in regsLiveOut or vregsPassed. 176f22ef01cSRoman Divacky bool isLiveOut(unsigned Reg) const { 177f22ef01cSRoman Divacky return regsLiveOut.count(Reg) || vregsPassed.count(Reg); 178f22ef01cSRoman Divacky } 179f22ef01cSRoman Divacky }; 180f22ef01cSRoman Divacky 181f22ef01cSRoman Divacky // Extra register info per MBB. 182f22ef01cSRoman Divacky DenseMap<const MachineBasicBlock*, BBInfo> MBBInfoMap; 183f22ef01cSRoman Divacky 184f22ef01cSRoman Divacky bool isReserved(unsigned Reg) { 185f22ef01cSRoman Divacky return Reg < regsReserved.size() && regsReserved.test(Reg); 186f22ef01cSRoman Divacky } 187f22ef01cSRoman Divacky 188dff0c46cSDimitry Andric bool isAllocatable(unsigned Reg) { 1893861d79fSDimitry Andric return Reg < TRI->getNumRegs() && MRI->isAllocatable(Reg); 190dff0c46cSDimitry Andric } 191dff0c46cSDimitry Andric 192f22ef01cSRoman Divacky // Analysis information if available 193f22ef01cSRoman Divacky LiveVariables *LiveVars; 1942754fe60SDimitry Andric LiveIntervals *LiveInts; 1952754fe60SDimitry Andric LiveStacks *LiveStks; 1962754fe60SDimitry Andric SlotIndexes *Indexes; 197f22ef01cSRoman Divacky 198f22ef01cSRoman Divacky void visitMachineFunctionBefore(); 199f22ef01cSRoman Divacky void visitMachineBasicBlockBefore(const MachineBasicBlock *MBB); 2007ae0e2c9SDimitry Andric void visitMachineBundleBefore(const MachineInstr *MI); 201f22ef01cSRoman Divacky void visitMachineInstrBefore(const MachineInstr *MI); 202f22ef01cSRoman Divacky void visitMachineOperand(const MachineOperand *MO, unsigned MONum); 203f22ef01cSRoman Divacky void visitMachineInstrAfter(const MachineInstr *MI); 2047ae0e2c9SDimitry Andric void visitMachineBundleAfter(const MachineInstr *MI); 205f22ef01cSRoman Divacky void visitMachineBasicBlockAfter(const MachineBasicBlock *MBB); 206f22ef01cSRoman Divacky void visitMachineFunctionAfter(); 207f22ef01cSRoman Divacky 208f22ef01cSRoman Divacky void report(const char *msg, const MachineFunction *MF); 209f22ef01cSRoman Divacky void report(const char *msg, const MachineBasicBlock *MBB); 210f22ef01cSRoman Divacky void report(const char *msg, const MachineInstr *MI); 211f22ef01cSRoman Divacky void report(const char *msg, const MachineOperand *MO, unsigned MONum); 2127ae0e2c9SDimitry Andric void report(const char *msg, const MachineFunction *MF, 2137ae0e2c9SDimitry Andric const LiveInterval &LI); 2147ae0e2c9SDimitry Andric void report(const char *msg, const MachineBasicBlock *MBB, 2157ae0e2c9SDimitry Andric const LiveInterval &LI); 216f785676fSDimitry Andric void report(const char *msg, const MachineFunction *MF, 217f785676fSDimitry Andric const LiveRange &LR); 218f785676fSDimitry Andric void report(const char *msg, const MachineBasicBlock *MBB, 219f785676fSDimitry Andric const LiveRange &LR); 220f22ef01cSRoman Divacky 2213861d79fSDimitry Andric void verifyInlineAsm(const MachineInstr *MI); 2223861d79fSDimitry Andric 223dff0c46cSDimitry Andric void checkLiveness(const MachineOperand *MO, unsigned MONum); 224f22ef01cSRoman Divacky void markReachable(const MachineBasicBlock *MBB); 225f22ef01cSRoman Divacky void calcRegsPassed(); 226f22ef01cSRoman Divacky void checkPHIOps(const MachineBasicBlock *MBB); 227f22ef01cSRoman Divacky 228f22ef01cSRoman Divacky void calcRegsRequired(); 229f22ef01cSRoman Divacky void verifyLiveVariables(); 230e580952dSDimitry Andric void verifyLiveIntervals(); 2317ae0e2c9SDimitry Andric void verifyLiveInterval(const LiveInterval&); 232f785676fSDimitry Andric void verifyLiveRangeValue(const LiveRange&, const VNInfo*, unsigned); 233f785676fSDimitry Andric void verifyLiveRangeSegment(const LiveRange&, 234f785676fSDimitry Andric const LiveRange::const_iterator I, unsigned); 235f785676fSDimitry Andric void verifyLiveRange(const LiveRange&, unsigned); 236f785676fSDimitry Andric 237f785676fSDimitry Andric void verifyStackFrame(); 238f22ef01cSRoman Divacky }; 239f22ef01cSRoman Divacky 240f22ef01cSRoman Divacky struct MachineVerifierPass : public MachineFunctionPass { 241f22ef01cSRoman Divacky static char ID; // Pass ID, replacement for typeid 2422754fe60SDimitry Andric const char *const Banner; 243f22ef01cSRoman Divacky 24491bc56edSDimitry Andric MachineVerifierPass(const char *b = nullptr) 2452754fe60SDimitry Andric : MachineFunctionPass(ID), Banner(b) { 2462754fe60SDimitry Andric initializeMachineVerifierPassPass(*PassRegistry::getPassRegistry()); 2472754fe60SDimitry Andric } 248f22ef01cSRoman Divacky 24991bc56edSDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override { 250f22ef01cSRoman Divacky AU.setPreservesAll(); 251f22ef01cSRoman Divacky MachineFunctionPass::getAnalysisUsage(AU); 252f22ef01cSRoman Divacky } 253f22ef01cSRoman Divacky 25491bc56edSDimitry Andric bool runOnMachineFunction(MachineFunction &MF) override { 2552754fe60SDimitry Andric MF.verify(this, Banner); 256f22ef01cSRoman Divacky return false; 257f22ef01cSRoman Divacky } 258f22ef01cSRoman Divacky }; 259f22ef01cSRoman Divacky 260f22ef01cSRoman Divacky } 261f22ef01cSRoman Divacky 262f22ef01cSRoman Divacky char MachineVerifierPass::ID = 0; 263e580952dSDimitry Andric INITIALIZE_PASS(MachineVerifierPass, "machineverifier", 2642754fe60SDimitry Andric "Verify generated machine code", false, false) 265f22ef01cSRoman Divacky 2662754fe60SDimitry Andric FunctionPass *llvm::createMachineVerifierPass(const char *Banner) { 2672754fe60SDimitry Andric return new MachineVerifierPass(Banner); 268f22ef01cSRoman Divacky } 269f22ef01cSRoman Divacky 2702754fe60SDimitry Andric void MachineFunction::verify(Pass *p, const char *Banner) const { 2712754fe60SDimitry Andric MachineVerifier(p, Banner) 2722754fe60SDimitry Andric .runOnMachineFunction(const_cast<MachineFunction&>(*this)); 273f22ef01cSRoman Divacky } 274f22ef01cSRoman Divacky 275f22ef01cSRoman Divacky bool MachineVerifier::runOnMachineFunction(MachineFunction &MF) { 27691bc56edSDimitry Andric raw_ostream *OutFile = nullptr; 277f22ef01cSRoman Divacky if (OutFileName) { 278f22ef01cSRoman Divacky std::string ErrorInfo; 27991bc56edSDimitry Andric OutFile = new raw_fd_ostream(OutFileName, ErrorInfo, 28091bc56edSDimitry Andric sys::fs::F_Append | sys::fs::F_Text); 281f22ef01cSRoman Divacky if (!ErrorInfo.empty()) { 282f22ef01cSRoman Divacky errs() << "Error opening '" << OutFileName << "': " << ErrorInfo << '\n'; 283f22ef01cSRoman Divacky exit(1); 284f22ef01cSRoman Divacky } 285f22ef01cSRoman Divacky 286f22ef01cSRoman Divacky OS = OutFile; 287f22ef01cSRoman Divacky } else { 288f22ef01cSRoman Divacky OS = &errs(); 289f22ef01cSRoman Divacky } 290f22ef01cSRoman Divacky 291f22ef01cSRoman Divacky foundErrors = 0; 292f22ef01cSRoman Divacky 293f22ef01cSRoman Divacky this->MF = &MF; 294f22ef01cSRoman Divacky TM = &MF.getTarget(); 29517a519f9SDimitry Andric TII = TM->getInstrInfo(); 296f22ef01cSRoman Divacky TRI = TM->getRegisterInfo(); 297f22ef01cSRoman Divacky MRI = &MF.getRegInfo(); 298f22ef01cSRoman Divacky 29991bc56edSDimitry Andric LiveVars = nullptr; 30091bc56edSDimitry Andric LiveInts = nullptr; 30191bc56edSDimitry Andric LiveStks = nullptr; 30291bc56edSDimitry Andric Indexes = nullptr; 303e580952dSDimitry Andric if (PASS) { 304e580952dSDimitry Andric LiveInts = PASS->getAnalysisIfAvailable<LiveIntervals>(); 305e580952dSDimitry Andric // We don't want to verify LiveVariables if LiveIntervals is available. 306e580952dSDimitry Andric if (!LiveInts) 307e580952dSDimitry Andric LiveVars = PASS->getAnalysisIfAvailable<LiveVariables>(); 3082754fe60SDimitry Andric LiveStks = PASS->getAnalysisIfAvailable<LiveStacks>(); 3092754fe60SDimitry Andric Indexes = PASS->getAnalysisIfAvailable<SlotIndexes>(); 310f22ef01cSRoman Divacky } 311f22ef01cSRoman Divacky 312f22ef01cSRoman Divacky visitMachineFunctionBefore(); 313f22ef01cSRoman Divacky for (MachineFunction::const_iterator MFI = MF.begin(), MFE = MF.end(); 314f22ef01cSRoman Divacky MFI!=MFE; ++MFI) { 315f22ef01cSRoman Divacky visitMachineBasicBlockBefore(MFI); 3167ae0e2c9SDimitry Andric // Keep track of the current bundle header. 31791bc56edSDimitry Andric const MachineInstr *CurBundle = nullptr; 318139f7f9bSDimitry Andric // Do we expect the next instruction to be part of the same bundle? 319139f7f9bSDimitry Andric bool InBundle = false; 320139f7f9bSDimitry Andric 321dff0c46cSDimitry Andric for (MachineBasicBlock::const_instr_iterator MBBI = MFI->instr_begin(), 322dff0c46cSDimitry Andric MBBE = MFI->instr_end(); MBBI != MBBE; ++MBBI) { 3232754fe60SDimitry Andric if (MBBI->getParent() != MFI) { 3242754fe60SDimitry Andric report("Bad instruction parent pointer", MFI); 3252754fe60SDimitry Andric *OS << "Instruction: " << *MBBI; 3262754fe60SDimitry Andric continue; 3272754fe60SDimitry Andric } 328139f7f9bSDimitry Andric 329139f7f9bSDimitry Andric // Check for consistent bundle flags. 330139f7f9bSDimitry Andric if (InBundle && !MBBI->isBundledWithPred()) 331139f7f9bSDimitry Andric report("Missing BundledPred flag, " 332139f7f9bSDimitry Andric "BundledSucc was set on predecessor", MBBI); 333139f7f9bSDimitry Andric if (!InBundle && MBBI->isBundledWithPred()) 334139f7f9bSDimitry Andric report("BundledPred flag is set, " 335139f7f9bSDimitry Andric "but BundledSucc not set on predecessor", MBBI); 336139f7f9bSDimitry Andric 3377ae0e2c9SDimitry Andric // Is this a bundle header? 3387ae0e2c9SDimitry Andric if (!MBBI->isInsideBundle()) { 3397ae0e2c9SDimitry Andric if (CurBundle) 3407ae0e2c9SDimitry Andric visitMachineBundleAfter(CurBundle); 3417ae0e2c9SDimitry Andric CurBundle = MBBI; 3427ae0e2c9SDimitry Andric visitMachineBundleBefore(CurBundle); 3437ae0e2c9SDimitry Andric } else if (!CurBundle) 3447ae0e2c9SDimitry Andric report("No bundle header", MBBI); 345f22ef01cSRoman Divacky visitMachineInstrBefore(MBBI); 346f22ef01cSRoman Divacky for (unsigned I = 0, E = MBBI->getNumOperands(); I != E; ++I) 347f22ef01cSRoman Divacky visitMachineOperand(&MBBI->getOperand(I), I); 348f22ef01cSRoman Divacky visitMachineInstrAfter(MBBI); 349139f7f9bSDimitry Andric 350139f7f9bSDimitry Andric // Was this the last bundled instruction? 351139f7f9bSDimitry Andric InBundle = MBBI->isBundledWithSucc(); 352f22ef01cSRoman Divacky } 3537ae0e2c9SDimitry Andric if (CurBundle) 3547ae0e2c9SDimitry Andric visitMachineBundleAfter(CurBundle); 355139f7f9bSDimitry Andric if (InBundle) 356139f7f9bSDimitry Andric report("BundledSucc flag set on last instruction in block", &MFI->back()); 357f22ef01cSRoman Divacky visitMachineBasicBlockAfter(MFI); 358f22ef01cSRoman Divacky } 359f22ef01cSRoman Divacky visitMachineFunctionAfter(); 360f22ef01cSRoman Divacky 361f22ef01cSRoman Divacky if (OutFile) 362f22ef01cSRoman Divacky delete OutFile; 363f22ef01cSRoman Divacky else if (foundErrors) 364f22ef01cSRoman Divacky report_fatal_error("Found "+Twine(foundErrors)+" machine code errors."); 365f22ef01cSRoman Divacky 366f22ef01cSRoman Divacky // Clean up. 367f22ef01cSRoman Divacky regsLive.clear(); 368f22ef01cSRoman Divacky regsDefined.clear(); 369f22ef01cSRoman Divacky regsDead.clear(); 370f22ef01cSRoman Divacky regsKilled.clear(); 371dff0c46cSDimitry Andric regMasks.clear(); 372f22ef01cSRoman Divacky regsLiveInButUnused.clear(); 373f22ef01cSRoman Divacky MBBInfoMap.clear(); 374f22ef01cSRoman Divacky 375f22ef01cSRoman Divacky return false; // no changes 376f22ef01cSRoman Divacky } 377f22ef01cSRoman Divacky 378f22ef01cSRoman Divacky void MachineVerifier::report(const char *msg, const MachineFunction *MF) { 379f22ef01cSRoman Divacky assert(MF); 380f22ef01cSRoman Divacky *OS << '\n'; 3812754fe60SDimitry Andric if (!foundErrors++) { 3822754fe60SDimitry Andric if (Banner) 3832754fe60SDimitry Andric *OS << "# " << Banner << '\n'; 3842754fe60SDimitry Andric MF->print(*OS, Indexes); 3852754fe60SDimitry Andric } 386f22ef01cSRoman Divacky *OS << "*** Bad machine code: " << msg << " ***\n" 3873861d79fSDimitry Andric << "- function: " << MF->getName() << "\n"; 388f22ef01cSRoman Divacky } 389f22ef01cSRoman Divacky 390f22ef01cSRoman Divacky void MachineVerifier::report(const char *msg, const MachineBasicBlock *MBB) { 391f22ef01cSRoman Divacky assert(MBB); 392f22ef01cSRoman Divacky report(msg, MBB->getParent()); 3937ae0e2c9SDimitry Andric *OS << "- basic block: BB#" << MBB->getNumber() 3947ae0e2c9SDimitry Andric << ' ' << MBB->getName() 3953861d79fSDimitry Andric << " (" << (const void*)MBB << ')'; 3962754fe60SDimitry Andric if (Indexes) 3972754fe60SDimitry Andric *OS << " [" << Indexes->getMBBStartIdx(MBB) 3982754fe60SDimitry Andric << ';' << Indexes->getMBBEndIdx(MBB) << ')'; 3992754fe60SDimitry Andric *OS << '\n'; 400f22ef01cSRoman Divacky } 401f22ef01cSRoman Divacky 402f22ef01cSRoman Divacky void MachineVerifier::report(const char *msg, const MachineInstr *MI) { 403f22ef01cSRoman Divacky assert(MI); 404f22ef01cSRoman Divacky report(msg, MI->getParent()); 405f22ef01cSRoman Divacky *OS << "- instruction: "; 4062754fe60SDimitry Andric if (Indexes && Indexes->hasIndex(MI)) 4072754fe60SDimitry Andric *OS << Indexes->getInstructionIndex(MI) << '\t'; 408f22ef01cSRoman Divacky MI->print(*OS, TM); 409f22ef01cSRoman Divacky } 410f22ef01cSRoman Divacky 411f22ef01cSRoman Divacky void MachineVerifier::report(const char *msg, 412f22ef01cSRoman Divacky const MachineOperand *MO, unsigned MONum) { 413f22ef01cSRoman Divacky assert(MO); 414f22ef01cSRoman Divacky report(msg, MO->getParent()); 415f22ef01cSRoman Divacky *OS << "- operand " << MONum << ": "; 416f22ef01cSRoman Divacky MO->print(*OS, TM); 417f22ef01cSRoman Divacky *OS << "\n"; 418f22ef01cSRoman Divacky } 419f22ef01cSRoman Divacky 4207ae0e2c9SDimitry Andric void MachineVerifier::report(const char *msg, const MachineFunction *MF, 4217ae0e2c9SDimitry Andric const LiveInterval &LI) { 4227ae0e2c9SDimitry Andric report(msg, MF); 423f785676fSDimitry Andric *OS << "- interval: " << LI << '\n'; 4247ae0e2c9SDimitry Andric } 4257ae0e2c9SDimitry Andric 4267ae0e2c9SDimitry Andric void MachineVerifier::report(const char *msg, const MachineBasicBlock *MBB, 4277ae0e2c9SDimitry Andric const LiveInterval &LI) { 4287ae0e2c9SDimitry Andric report(msg, MBB); 429f785676fSDimitry Andric *OS << "- interval: " << LI << '\n'; 430f785676fSDimitry Andric } 431f785676fSDimitry Andric 432f785676fSDimitry Andric void MachineVerifier::report(const char *msg, const MachineBasicBlock *MBB, 433f785676fSDimitry Andric const LiveRange &LR) { 434f785676fSDimitry Andric report(msg, MBB); 435f785676fSDimitry Andric *OS << "- liverange: " << LR << "\n"; 436f785676fSDimitry Andric } 437f785676fSDimitry Andric 438f785676fSDimitry Andric void MachineVerifier::report(const char *msg, const MachineFunction *MF, 439f785676fSDimitry Andric const LiveRange &LR) { 440f785676fSDimitry Andric report(msg, MF); 441f785676fSDimitry Andric *OS << "- liverange: " << LR << "\n"; 4427ae0e2c9SDimitry Andric } 4437ae0e2c9SDimitry Andric 444f22ef01cSRoman Divacky void MachineVerifier::markReachable(const MachineBasicBlock *MBB) { 445f22ef01cSRoman Divacky BBInfo &MInfo = MBBInfoMap[MBB]; 446f22ef01cSRoman Divacky if (!MInfo.reachable) { 447f22ef01cSRoman Divacky MInfo.reachable = true; 448f22ef01cSRoman Divacky for (MachineBasicBlock::const_succ_iterator SuI = MBB->succ_begin(), 449f22ef01cSRoman Divacky SuE = MBB->succ_end(); SuI != SuE; ++SuI) 450f22ef01cSRoman Divacky markReachable(*SuI); 451f22ef01cSRoman Divacky } 452f22ef01cSRoman Divacky } 453f22ef01cSRoman Divacky 454f22ef01cSRoman Divacky void MachineVerifier::visitMachineFunctionBefore() { 4552754fe60SDimitry Andric lastIndex = SlotIndex(); 4563861d79fSDimitry Andric regsReserved = MRI->getReservedRegs(); 457f22ef01cSRoman Divacky 458f22ef01cSRoman Divacky // A sub-register of a reserved register is also reserved 459f22ef01cSRoman Divacky for (int Reg = regsReserved.find_first(); Reg>=0; 460f22ef01cSRoman Divacky Reg = regsReserved.find_next(Reg)) { 4617ae0e2c9SDimitry Andric for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) { 462f22ef01cSRoman Divacky // FIXME: This should probably be: 4637ae0e2c9SDimitry Andric // assert(regsReserved.test(*SubRegs) && "Non-reserved sub-register"); 4647ae0e2c9SDimitry Andric regsReserved.set(*SubRegs); 465f22ef01cSRoman Divacky } 466f22ef01cSRoman Divacky } 467dff0c46cSDimitry Andric 468f22ef01cSRoman Divacky markReachable(&MF->front()); 4693861d79fSDimitry Andric 4703861d79fSDimitry Andric // Build a set of the basic blocks in the function. 4713861d79fSDimitry Andric FunctionBlocks.clear(); 47291bc56edSDimitry Andric for (const auto &MBB : *MF) { 47391bc56edSDimitry Andric FunctionBlocks.insert(&MBB); 47491bc56edSDimitry Andric BBInfo &MInfo = MBBInfoMap[&MBB]; 4753861d79fSDimitry Andric 47691bc56edSDimitry Andric MInfo.Preds.insert(MBB.pred_begin(), MBB.pred_end()); 47791bc56edSDimitry Andric if (MInfo.Preds.size() != MBB.pred_size()) 47891bc56edSDimitry Andric report("MBB has duplicate entries in its predecessor list.", &MBB); 4793861d79fSDimitry Andric 48091bc56edSDimitry Andric MInfo.Succs.insert(MBB.succ_begin(), MBB.succ_end()); 48191bc56edSDimitry Andric if (MInfo.Succs.size() != MBB.succ_size()) 48291bc56edSDimitry Andric report("MBB has duplicate entries in its successor list.", &MBB); 4833861d79fSDimitry Andric } 484284c1978SDimitry Andric 485284c1978SDimitry Andric // Check that the register use lists are sane. 486284c1978SDimitry Andric MRI->verifyUseLists(); 487f785676fSDimitry Andric 488f785676fSDimitry Andric verifyStackFrame(); 489f22ef01cSRoman Divacky } 490f22ef01cSRoman Divacky 491f22ef01cSRoman Divacky // Does iterator point to a and b as the first two elements? 492f22ef01cSRoman Divacky static bool matchPair(MachineBasicBlock::const_succ_iterator i, 493f22ef01cSRoman Divacky const MachineBasicBlock *a, const MachineBasicBlock *b) { 494f22ef01cSRoman Divacky if (*i == a) 495f22ef01cSRoman Divacky return *++i == b; 496f22ef01cSRoman Divacky if (*i == b) 497f22ef01cSRoman Divacky return *++i == a; 498f22ef01cSRoman Divacky return false; 499f22ef01cSRoman Divacky } 500f22ef01cSRoman Divacky 501f22ef01cSRoman Divacky void 502f22ef01cSRoman Divacky MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) { 50391bc56edSDimitry Andric FirstTerminator = nullptr; 5046122f3e6SDimitry Andric 505dff0c46cSDimitry Andric if (MRI->isSSA()) { 506dff0c46cSDimitry Andric // If this block has allocatable physical registers live-in, check that 507dff0c46cSDimitry Andric // it is an entry block or landing pad. 508dff0c46cSDimitry Andric for (MachineBasicBlock::livein_iterator LI = MBB->livein_begin(), 509dff0c46cSDimitry Andric LE = MBB->livein_end(); 510dff0c46cSDimitry Andric LI != LE; ++LI) { 511dff0c46cSDimitry Andric unsigned reg = *LI; 512dff0c46cSDimitry Andric if (isAllocatable(reg) && !MBB->isLandingPad() && 513dff0c46cSDimitry Andric MBB != MBB->getParent()->begin()) { 514dff0c46cSDimitry Andric report("MBB has allocable live-in, but isn't entry or landing-pad.", MBB); 515dff0c46cSDimitry Andric } 516dff0c46cSDimitry Andric } 517dff0c46cSDimitry Andric } 518dff0c46cSDimitry Andric 5192754fe60SDimitry Andric // Count the number of landing pad successors. 5202754fe60SDimitry Andric SmallPtrSet<MachineBasicBlock*, 4> LandingPadSuccs; 5212754fe60SDimitry Andric for (MachineBasicBlock::const_succ_iterator I = MBB->succ_begin(), 5222754fe60SDimitry Andric E = MBB->succ_end(); I != E; ++I) { 5232754fe60SDimitry Andric if ((*I)->isLandingPad()) 5242754fe60SDimitry Andric LandingPadSuccs.insert(*I); 5253861d79fSDimitry Andric if (!FunctionBlocks.count(*I)) 5263861d79fSDimitry Andric report("MBB has successor that isn't part of the function.", MBB); 5273861d79fSDimitry Andric if (!MBBInfoMap[*I].Preds.count(MBB)) { 5283861d79fSDimitry Andric report("Inconsistent CFG", MBB); 5293861d79fSDimitry Andric *OS << "MBB is not in the predecessor list of the successor BB#" 5303861d79fSDimitry Andric << (*I)->getNumber() << ".\n"; 5313861d79fSDimitry Andric } 5323861d79fSDimitry Andric } 5333861d79fSDimitry Andric 5343861d79fSDimitry Andric // Check the predecessor list. 5353861d79fSDimitry Andric for (MachineBasicBlock::const_pred_iterator I = MBB->pred_begin(), 5363861d79fSDimitry Andric E = MBB->pred_end(); I != E; ++I) { 5373861d79fSDimitry Andric if (!FunctionBlocks.count(*I)) 5383861d79fSDimitry Andric report("MBB has predecessor that isn't part of the function.", MBB); 5393861d79fSDimitry Andric if (!MBBInfoMap[*I].Succs.count(MBB)) { 5403861d79fSDimitry Andric report("Inconsistent CFG", MBB); 5413861d79fSDimitry Andric *OS << "MBB is not in the successor list of the predecessor BB#" 5423861d79fSDimitry Andric << (*I)->getNumber() << ".\n"; 5433861d79fSDimitry Andric } 5442754fe60SDimitry Andric } 545bd5abe19SDimitry Andric 546bd5abe19SDimitry Andric const MCAsmInfo *AsmInfo = TM->getMCAsmInfo(); 547bd5abe19SDimitry Andric const BasicBlock *BB = MBB->getBasicBlock(); 548bd5abe19SDimitry Andric if (LandingPadSuccs.size() > 1 && 549bd5abe19SDimitry Andric !(AsmInfo && 550bd5abe19SDimitry Andric AsmInfo->getExceptionHandlingType() == ExceptionHandling::SjLj && 551bd5abe19SDimitry Andric BB && isa<SwitchInst>(BB->getTerminator()))) 5522754fe60SDimitry Andric report("MBB has more than one landing pad successor", MBB); 5532754fe60SDimitry Andric 554f22ef01cSRoman Divacky // Call AnalyzeBranch. If it succeeds, there several more conditions to check. 55591bc56edSDimitry Andric MachineBasicBlock *TBB = nullptr, *FBB = nullptr; 556f22ef01cSRoman Divacky SmallVector<MachineOperand, 4> Cond; 557f22ef01cSRoman Divacky if (!TII->AnalyzeBranch(*const_cast<MachineBasicBlock *>(MBB), 558f22ef01cSRoman Divacky TBB, FBB, Cond)) { 559f22ef01cSRoman Divacky // Ok, AnalyzeBranch thinks it knows what's going on with this block. Let's 560f22ef01cSRoman Divacky // check whether its answers match up with reality. 561f22ef01cSRoman Divacky if (!TBB && !FBB) { 562f22ef01cSRoman Divacky // Block falls through to its successor. 563f22ef01cSRoman Divacky MachineFunction::const_iterator MBBI = MBB; 564f22ef01cSRoman Divacky ++MBBI; 565f22ef01cSRoman Divacky if (MBBI == MF->end()) { 566f22ef01cSRoman Divacky // It's possible that the block legitimately ends with a noreturn 567f22ef01cSRoman Divacky // call or an unreachable, in which case it won't actually fall 568f22ef01cSRoman Divacky // out the bottom of the function. 5692754fe60SDimitry Andric } else if (MBB->succ_size() == LandingPadSuccs.size()) { 570f22ef01cSRoman Divacky // It's possible that the block legitimately ends with a noreturn 571f22ef01cSRoman Divacky // call or an unreachable, in which case it won't actuall fall 572f22ef01cSRoman Divacky // out of the block. 5732754fe60SDimitry Andric } else if (MBB->succ_size() != 1+LandingPadSuccs.size()) { 574f22ef01cSRoman Divacky report("MBB exits via unconditional fall-through but doesn't have " 575f22ef01cSRoman Divacky "exactly one CFG successor!", MBB); 5762754fe60SDimitry Andric } else if (!MBB->isSuccessor(MBBI)) { 577f22ef01cSRoman Divacky report("MBB exits via unconditional fall-through but its successor " 578f22ef01cSRoman Divacky "differs from its CFG successor!", MBB); 579f22ef01cSRoman Divacky } 58091bc56edSDimitry Andric if (!MBB->empty() && MBB->back().isBarrier() && 58191bc56edSDimitry Andric !TII->isPredicated(&MBB->back())) { 582f22ef01cSRoman Divacky report("MBB exits via unconditional fall-through but ends with a " 583f22ef01cSRoman Divacky "barrier instruction!", MBB); 584f22ef01cSRoman Divacky } 585f22ef01cSRoman Divacky if (!Cond.empty()) { 586f22ef01cSRoman Divacky report("MBB exits via unconditional fall-through but has a condition!", 587f22ef01cSRoman Divacky MBB); 588f22ef01cSRoman Divacky } 589f22ef01cSRoman Divacky } else if (TBB && !FBB && Cond.empty()) { 590f22ef01cSRoman Divacky // Block unconditionally branches somewhere. 5912754fe60SDimitry Andric if (MBB->succ_size() != 1+LandingPadSuccs.size()) { 592f22ef01cSRoman Divacky report("MBB exits via unconditional branch but doesn't have " 593f22ef01cSRoman Divacky "exactly one CFG successor!", MBB); 5942754fe60SDimitry Andric } else if (!MBB->isSuccessor(TBB)) { 595f22ef01cSRoman Divacky report("MBB exits via unconditional branch but the CFG " 596f22ef01cSRoman Divacky "successor doesn't match the actual successor!", MBB); 597f22ef01cSRoman Divacky } 598f22ef01cSRoman Divacky if (MBB->empty()) { 599f22ef01cSRoman Divacky report("MBB exits via unconditional branch but doesn't contain " 600f22ef01cSRoman Divacky "any instructions!", MBB); 60191bc56edSDimitry Andric } else if (!MBB->back().isBarrier()) { 602f22ef01cSRoman Divacky report("MBB exits via unconditional branch but doesn't end with a " 603f22ef01cSRoman Divacky "barrier instruction!", MBB); 60491bc56edSDimitry Andric } else if (!MBB->back().isTerminator()) { 605f22ef01cSRoman Divacky report("MBB exits via unconditional branch but the branch isn't a " 606f22ef01cSRoman Divacky "terminator instruction!", MBB); 607f22ef01cSRoman Divacky } 608f22ef01cSRoman Divacky } else if (TBB && !FBB && !Cond.empty()) { 609f22ef01cSRoman Divacky // Block conditionally branches somewhere, otherwise falls through. 610f22ef01cSRoman Divacky MachineFunction::const_iterator MBBI = MBB; 611f22ef01cSRoman Divacky ++MBBI; 612f22ef01cSRoman Divacky if (MBBI == MF->end()) { 613f22ef01cSRoman Divacky report("MBB conditionally falls through out of function!", MBB); 614139f7f9bSDimitry Andric } else if (MBB->succ_size() == 1) { 6153861d79fSDimitry Andric // A conditional branch with only one successor is weird, but allowed. 6163861d79fSDimitry Andric if (&*MBBI != TBB) 6173861d79fSDimitry Andric report("MBB exits via conditional branch/fall-through but only has " 6183861d79fSDimitry Andric "one CFG successor!", MBB); 6193861d79fSDimitry Andric else if (TBB != *MBB->succ_begin()) 6203861d79fSDimitry Andric report("MBB exits via conditional branch/fall-through but the CFG " 6213861d79fSDimitry Andric "successor don't match the actual successor!", MBB); 6223861d79fSDimitry Andric } else if (MBB->succ_size() != 2) { 623f22ef01cSRoman Divacky report("MBB exits via conditional branch/fall-through but doesn't have " 624f22ef01cSRoman Divacky "exactly two CFG successors!", MBB); 625f22ef01cSRoman Divacky } else if (!matchPair(MBB->succ_begin(), TBB, MBBI)) { 626f22ef01cSRoman Divacky report("MBB exits via conditional branch/fall-through but the CFG " 627f22ef01cSRoman Divacky "successors don't match the actual successors!", MBB); 628f22ef01cSRoman Divacky } 629f22ef01cSRoman Divacky if (MBB->empty()) { 630f22ef01cSRoman Divacky report("MBB exits via conditional branch/fall-through but doesn't " 631f22ef01cSRoman Divacky "contain any instructions!", MBB); 63291bc56edSDimitry Andric } else if (MBB->back().isBarrier()) { 633f22ef01cSRoman Divacky report("MBB exits via conditional branch/fall-through but ends with a " 634f22ef01cSRoman Divacky "barrier instruction!", MBB); 63591bc56edSDimitry Andric } else if (!MBB->back().isTerminator()) { 636f22ef01cSRoman Divacky report("MBB exits via conditional branch/fall-through but the branch " 637f22ef01cSRoman Divacky "isn't a terminator instruction!", MBB); 638f22ef01cSRoman Divacky } 639f22ef01cSRoman Divacky } else if (TBB && FBB) { 640f22ef01cSRoman Divacky // Block conditionally branches somewhere, otherwise branches 641f22ef01cSRoman Divacky // somewhere else. 6423861d79fSDimitry Andric if (MBB->succ_size() == 1) { 6433861d79fSDimitry Andric // A conditional branch with only one successor is weird, but allowed. 6443861d79fSDimitry Andric if (FBB != TBB) 6453861d79fSDimitry Andric report("MBB exits via conditional branch/branch through but only has " 6463861d79fSDimitry Andric "one CFG successor!", MBB); 6473861d79fSDimitry Andric else if (TBB != *MBB->succ_begin()) 6483861d79fSDimitry Andric report("MBB exits via conditional branch/branch through but the CFG " 6493861d79fSDimitry Andric "successor don't match the actual successor!", MBB); 6503861d79fSDimitry Andric } else if (MBB->succ_size() != 2) { 651f22ef01cSRoman Divacky report("MBB exits via conditional branch/branch but doesn't have " 652f22ef01cSRoman Divacky "exactly two CFG successors!", MBB); 653f22ef01cSRoman Divacky } else if (!matchPair(MBB->succ_begin(), TBB, FBB)) { 654f22ef01cSRoman Divacky report("MBB exits via conditional branch/branch but the CFG " 655f22ef01cSRoman Divacky "successors don't match the actual successors!", MBB); 656f22ef01cSRoman Divacky } 657f22ef01cSRoman Divacky if (MBB->empty()) { 658f22ef01cSRoman Divacky report("MBB exits via conditional branch/branch but doesn't " 659f22ef01cSRoman Divacky "contain any instructions!", MBB); 66091bc56edSDimitry Andric } else if (!MBB->back().isBarrier()) { 661f22ef01cSRoman Divacky report("MBB exits via conditional branch/branch but doesn't end with a " 662f22ef01cSRoman Divacky "barrier instruction!", MBB); 66391bc56edSDimitry Andric } else if (!MBB->back().isTerminator()) { 664f22ef01cSRoman Divacky report("MBB exits via conditional branch/branch but the branch " 665f22ef01cSRoman Divacky "isn't a terminator instruction!", MBB); 666f22ef01cSRoman Divacky } 667f22ef01cSRoman Divacky if (Cond.empty()) { 668f22ef01cSRoman Divacky report("MBB exits via conditinal branch/branch but there's no " 669f22ef01cSRoman Divacky "condition!", MBB); 670f22ef01cSRoman Divacky } 671f22ef01cSRoman Divacky } else { 672f22ef01cSRoman Divacky report("AnalyzeBranch returned invalid data!", MBB); 673f22ef01cSRoman Divacky } 674f22ef01cSRoman Divacky } 675f22ef01cSRoman Divacky 676f22ef01cSRoman Divacky regsLive.clear(); 677f22ef01cSRoman Divacky for (MachineBasicBlock::livein_iterator I = MBB->livein_begin(), 678f22ef01cSRoman Divacky E = MBB->livein_end(); I != E; ++I) { 679f22ef01cSRoman Divacky if (!TargetRegisterInfo::isPhysicalRegister(*I)) { 680f22ef01cSRoman Divacky report("MBB live-in list contains non-physical register", MBB); 681f22ef01cSRoman Divacky continue; 682f22ef01cSRoman Divacky } 683f785676fSDimitry Andric for (MCSubRegIterator SubRegs(*I, TRI, /*IncludeSelf=*/true); 684f785676fSDimitry Andric SubRegs.isValid(); ++SubRegs) 6857ae0e2c9SDimitry Andric regsLive.insert(*SubRegs); 686f22ef01cSRoman Divacky } 687f22ef01cSRoman Divacky regsLiveInButUnused = regsLive; 688f22ef01cSRoman Divacky 689f22ef01cSRoman Divacky const MachineFrameInfo *MFI = MF->getFrameInfo(); 690f22ef01cSRoman Divacky assert(MFI && "Function has no frame info"); 691f22ef01cSRoman Divacky BitVector PR = MFI->getPristineRegs(MBB); 692f22ef01cSRoman Divacky for (int I = PR.find_first(); I>0; I = PR.find_next(I)) { 693f785676fSDimitry Andric for (MCSubRegIterator SubRegs(I, TRI, /*IncludeSelf=*/true); 694f785676fSDimitry Andric SubRegs.isValid(); ++SubRegs) 6957ae0e2c9SDimitry Andric regsLive.insert(*SubRegs); 696f22ef01cSRoman Divacky } 697f22ef01cSRoman Divacky 698f22ef01cSRoman Divacky regsKilled.clear(); 699f22ef01cSRoman Divacky regsDefined.clear(); 7002754fe60SDimitry Andric 7012754fe60SDimitry Andric if (Indexes) 7022754fe60SDimitry Andric lastIndex = Indexes->getMBBStartIdx(MBB); 703f22ef01cSRoman Divacky } 704f22ef01cSRoman Divacky 7057ae0e2c9SDimitry Andric // This function gets called for all bundle headers, including normal 7067ae0e2c9SDimitry Andric // stand-alone unbundled instructions. 7077ae0e2c9SDimitry Andric void MachineVerifier::visitMachineBundleBefore(const MachineInstr *MI) { 7087ae0e2c9SDimitry Andric if (Indexes && Indexes->hasIndex(MI)) { 7097ae0e2c9SDimitry Andric SlotIndex idx = Indexes->getInstructionIndex(MI); 7107ae0e2c9SDimitry Andric if (!(idx > lastIndex)) { 7117ae0e2c9SDimitry Andric report("Instruction index out of order", MI); 7127ae0e2c9SDimitry Andric *OS << "Last instruction was at " << lastIndex << '\n'; 7137ae0e2c9SDimitry Andric } 7147ae0e2c9SDimitry Andric lastIndex = idx; 7157ae0e2c9SDimitry Andric } 7167ae0e2c9SDimitry Andric 7177ae0e2c9SDimitry Andric // Ensure non-terminators don't follow terminators. 7187ae0e2c9SDimitry Andric // Ignore predicated terminators formed by if conversion. 7197ae0e2c9SDimitry Andric // FIXME: If conversion shouldn't need to violate this rule. 7207ae0e2c9SDimitry Andric if (MI->isTerminator() && !TII->isPredicated(MI)) { 7217ae0e2c9SDimitry Andric if (!FirstTerminator) 7227ae0e2c9SDimitry Andric FirstTerminator = MI; 7237ae0e2c9SDimitry Andric } else if (FirstTerminator) { 7247ae0e2c9SDimitry Andric report("Non-terminator instruction after the first terminator", MI); 7257ae0e2c9SDimitry Andric *OS << "First terminator was:\t" << *FirstTerminator; 7267ae0e2c9SDimitry Andric } 7277ae0e2c9SDimitry Andric } 7287ae0e2c9SDimitry Andric 7293861d79fSDimitry Andric // The operands on an INLINEASM instruction must follow a template. 7303861d79fSDimitry Andric // Verify that the flag operands make sense. 7313861d79fSDimitry Andric void MachineVerifier::verifyInlineAsm(const MachineInstr *MI) { 7323861d79fSDimitry Andric // The first two operands on INLINEASM are the asm string and global flags. 7333861d79fSDimitry Andric if (MI->getNumOperands() < 2) { 7343861d79fSDimitry Andric report("Too few operands on inline asm", MI); 7353861d79fSDimitry Andric return; 7363861d79fSDimitry Andric } 7373861d79fSDimitry Andric if (!MI->getOperand(0).isSymbol()) 7383861d79fSDimitry Andric report("Asm string must be an external symbol", MI); 7393861d79fSDimitry Andric if (!MI->getOperand(1).isImm()) 7403861d79fSDimitry Andric report("Asm flags must be an immediate", MI); 7413861d79fSDimitry Andric // Allowed flags are Extra_HasSideEffects = 1, Extra_IsAlignStack = 2, 7423861d79fSDimitry Andric // Extra_AsmDialect = 4, Extra_MayLoad = 8, and Extra_MayStore = 16. 7433861d79fSDimitry Andric if (!isUInt<5>(MI->getOperand(1).getImm())) 7443861d79fSDimitry Andric report("Unknown asm flags", &MI->getOperand(1), 1); 7453861d79fSDimitry Andric 7463861d79fSDimitry Andric assert(InlineAsm::MIOp_FirstOperand == 2 && "Asm format changed"); 7473861d79fSDimitry Andric 7483861d79fSDimitry Andric unsigned OpNo = InlineAsm::MIOp_FirstOperand; 7493861d79fSDimitry Andric unsigned NumOps; 7503861d79fSDimitry Andric for (unsigned e = MI->getNumOperands(); OpNo < e; OpNo += NumOps) { 7513861d79fSDimitry Andric const MachineOperand &MO = MI->getOperand(OpNo); 7523861d79fSDimitry Andric // There may be implicit ops after the fixed operands. 7533861d79fSDimitry Andric if (!MO.isImm()) 7543861d79fSDimitry Andric break; 7553861d79fSDimitry Andric NumOps = 1 + InlineAsm::getNumOperandRegisters(MO.getImm()); 7563861d79fSDimitry Andric } 7573861d79fSDimitry Andric 7583861d79fSDimitry Andric if (OpNo > MI->getNumOperands()) 7593861d79fSDimitry Andric report("Missing operands in last group", MI); 7603861d79fSDimitry Andric 7613861d79fSDimitry Andric // An optional MDNode follows the groups. 7623861d79fSDimitry Andric if (OpNo < MI->getNumOperands() && MI->getOperand(OpNo).isMetadata()) 7633861d79fSDimitry Andric ++OpNo; 7643861d79fSDimitry Andric 7653861d79fSDimitry Andric // All trailing operands must be implicit registers. 7663861d79fSDimitry Andric for (unsigned e = MI->getNumOperands(); OpNo < e; ++OpNo) { 7673861d79fSDimitry Andric const MachineOperand &MO = MI->getOperand(OpNo); 7683861d79fSDimitry Andric if (!MO.isReg() || !MO.isImplicit()) 7693861d79fSDimitry Andric report("Expected implicit register after groups", &MO, OpNo); 7703861d79fSDimitry Andric } 7713861d79fSDimitry Andric } 7723861d79fSDimitry Andric 773f22ef01cSRoman Divacky void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) { 77417a519f9SDimitry Andric const MCInstrDesc &MCID = MI->getDesc(); 77517a519f9SDimitry Andric if (MI->getNumOperands() < MCID.getNumOperands()) { 776f22ef01cSRoman Divacky report("Too few operands", MI); 77717a519f9SDimitry Andric *OS << MCID.getNumOperands() << " operands expected, but " 778f785676fSDimitry Andric << MI->getNumOperands() << " given.\n"; 779f22ef01cSRoman Divacky } 780f22ef01cSRoman Divacky 7813861d79fSDimitry Andric // Check the tied operands. 7823861d79fSDimitry Andric if (MI->isInlineAsm()) 7833861d79fSDimitry Andric verifyInlineAsm(MI); 7843861d79fSDimitry Andric 785f22ef01cSRoman Divacky // Check the MachineMemOperands for basic consistency. 786f22ef01cSRoman Divacky for (MachineInstr::mmo_iterator I = MI->memoperands_begin(), 787f22ef01cSRoman Divacky E = MI->memoperands_end(); I != E; ++I) { 788dff0c46cSDimitry Andric if ((*I)->isLoad() && !MI->mayLoad()) 789f22ef01cSRoman Divacky report("Missing mayLoad flag", MI); 790dff0c46cSDimitry Andric if ((*I)->isStore() && !MI->mayStore()) 791f22ef01cSRoman Divacky report("Missing mayStore flag", MI); 792f22ef01cSRoman Divacky } 793e580952dSDimitry Andric 794e580952dSDimitry Andric // Debug values must not have a slot index. 795dff0c46cSDimitry Andric // Other instructions must have one, unless they are inside a bundle. 796e580952dSDimitry Andric if (LiveInts) { 797e580952dSDimitry Andric bool mapped = !LiveInts->isNotInMIMap(MI); 798e580952dSDimitry Andric if (MI->isDebugValue()) { 799e580952dSDimitry Andric if (mapped) 800e580952dSDimitry Andric report("Debug instruction has a slot index", MI); 801dff0c46cSDimitry Andric } else if (MI->isInsideBundle()) { 802dff0c46cSDimitry Andric if (mapped) 803dff0c46cSDimitry Andric report("Instruction inside bundle has a slot index", MI); 804e580952dSDimitry Andric } else { 805e580952dSDimitry Andric if (!mapped) 806e580952dSDimitry Andric report("Missing slot index", MI); 807e580952dSDimitry Andric } 808e580952dSDimitry Andric } 809e580952dSDimitry Andric 8106122f3e6SDimitry Andric StringRef ErrorInfo; 8116122f3e6SDimitry Andric if (!TII->verifyInstruction(MI, ErrorInfo)) 8126122f3e6SDimitry Andric report(ErrorInfo.data(), MI); 813f22ef01cSRoman Divacky } 814f22ef01cSRoman Divacky 815f22ef01cSRoman Divacky void 816f22ef01cSRoman Divacky MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) { 817f22ef01cSRoman Divacky const MachineInstr *MI = MO->getParent(); 81817a519f9SDimitry Andric const MCInstrDesc &MCID = MI->getDesc(); 819f22ef01cSRoman Divacky 82017a519f9SDimitry Andric // The first MCID.NumDefs operands must be explicit register defines 82117a519f9SDimitry Andric if (MONum < MCID.getNumDefs()) { 8227ae0e2c9SDimitry Andric const MCOperandInfo &MCOI = MCID.OpInfo[MONum]; 823f22ef01cSRoman Divacky if (!MO->isReg()) 824f22ef01cSRoman Divacky report("Explicit definition must be a register", MO, MONum); 8257ae0e2c9SDimitry Andric else if (!MO->isDef() && !MCOI.isOptionalDef()) 826f22ef01cSRoman Divacky report("Explicit definition marked as use", MO, MONum); 827f22ef01cSRoman Divacky else if (MO->isImplicit()) 828f22ef01cSRoman Divacky report("Explicit definition marked as implicit", MO, MONum); 82917a519f9SDimitry Andric } else if (MONum < MCID.getNumOperands()) { 8307ae0e2c9SDimitry Andric const MCOperandInfo &MCOI = MCID.OpInfo[MONum]; 8312754fe60SDimitry Andric // Don't check if it's the last operand in a variadic instruction. See, 8322754fe60SDimitry Andric // e.g., LDM_RET in the arm back end. 83317a519f9SDimitry Andric if (MO->isReg() && 834dff0c46cSDimitry Andric !(MI->isVariadic() && MONum == MCID.getNumOperands()-1)) { 83517a519f9SDimitry Andric if (MO->isDef() && !MCOI.isOptionalDef()) 836f22ef01cSRoman Divacky report("Explicit operand marked as def", MO, MONum); 837f22ef01cSRoman Divacky if (MO->isImplicit()) 838f22ef01cSRoman Divacky report("Explicit operand marked as implicit", MO, MONum); 839f22ef01cSRoman Divacky } 8403861d79fSDimitry Andric 8413861d79fSDimitry Andric int TiedTo = MCID.getOperandConstraint(MONum, MCOI::TIED_TO); 8423861d79fSDimitry Andric if (TiedTo != -1) { 8433861d79fSDimitry Andric if (!MO->isReg()) 8443861d79fSDimitry Andric report("Tied use must be a register", MO, MONum); 8453861d79fSDimitry Andric else if (!MO->isTied()) 8463861d79fSDimitry Andric report("Operand should be tied", MO, MONum); 8473861d79fSDimitry Andric else if (unsigned(TiedTo) != MI->findTiedOperandIdx(MONum)) 8483861d79fSDimitry Andric report("Tied def doesn't match MCInstrDesc", MO, MONum); 8493861d79fSDimitry Andric } else if (MO->isReg() && MO->isTied()) 8503861d79fSDimitry Andric report("Explicit operand should not be tied", MO, MONum); 851f22ef01cSRoman Divacky } else { 852f22ef01cSRoman Divacky // ARM adds %reg0 operands to indicate predicates. We'll allow that. 853dff0c46cSDimitry Andric if (MO->isReg() && !MO->isImplicit() && !MI->isVariadic() && MO->getReg()) 854f22ef01cSRoman Divacky report("Extra explicit operand on non-variadic instruction", MO, MONum); 855f22ef01cSRoman Divacky } 856f22ef01cSRoman Divacky 857f22ef01cSRoman Divacky switch (MO->getType()) { 858f22ef01cSRoman Divacky case MachineOperand::MO_Register: { 859f22ef01cSRoman Divacky const unsigned Reg = MO->getReg(); 860f22ef01cSRoman Divacky if (!Reg) 861f22ef01cSRoman Divacky return; 862dff0c46cSDimitry Andric if (MRI->tracksLiveness() && !MI->isDebugValue()) 863dff0c46cSDimitry Andric checkLiveness(MO, MONum); 864f22ef01cSRoman Divacky 8653861d79fSDimitry Andric // Verify the consistency of tied operands. 8663861d79fSDimitry Andric if (MO->isTied()) { 8673861d79fSDimitry Andric unsigned OtherIdx = MI->findTiedOperandIdx(MONum); 8683861d79fSDimitry Andric const MachineOperand &OtherMO = MI->getOperand(OtherIdx); 8693861d79fSDimitry Andric if (!OtherMO.isReg()) 8703861d79fSDimitry Andric report("Must be tied to a register", MO, MONum); 8713861d79fSDimitry Andric if (!OtherMO.isTied()) 8723861d79fSDimitry Andric report("Missing tie flags on tied operand", MO, MONum); 8733861d79fSDimitry Andric if (MI->findTiedOperandIdx(OtherIdx) != MONum) 8743861d79fSDimitry Andric report("Inconsistent tie links", MO, MONum); 8753861d79fSDimitry Andric if (MONum < MCID.getNumDefs()) { 8763861d79fSDimitry Andric if (OtherIdx < MCID.getNumOperands()) { 8773861d79fSDimitry Andric if (-1 == MCID.getOperandConstraint(OtherIdx, MCOI::TIED_TO)) 8783861d79fSDimitry Andric report("Explicit def tied to explicit use without tie constraint", 8793861d79fSDimitry Andric MO, MONum); 8803861d79fSDimitry Andric } else { 8813861d79fSDimitry Andric if (!OtherMO.isImplicit()) 8823861d79fSDimitry Andric report("Explicit def should be tied to implicit use", MO, MONum); 8833861d79fSDimitry Andric } 8843861d79fSDimitry Andric } 8853861d79fSDimitry Andric } 8863861d79fSDimitry Andric 8877ae0e2c9SDimitry Andric // Verify two-address constraints after leaving SSA form. 8887ae0e2c9SDimitry Andric unsigned DefIdx; 8897ae0e2c9SDimitry Andric if (!MRI->isSSA() && MO->isUse() && 8907ae0e2c9SDimitry Andric MI->isRegTiedToDefOperand(MONum, &DefIdx) && 8917ae0e2c9SDimitry Andric Reg != MI->getOperand(DefIdx).getReg()) 8927ae0e2c9SDimitry Andric report("Two-address instruction operands must be identical", MO, MONum); 893f22ef01cSRoman Divacky 894f22ef01cSRoman Divacky // Check register classes. 89517a519f9SDimitry Andric if (MONum < MCID.getNumOperands() && !MO->isImplicit()) { 896f22ef01cSRoman Divacky unsigned SubIdx = MO->getSubReg(); 897f22ef01cSRoman Divacky 898f22ef01cSRoman Divacky if (TargetRegisterInfo::isPhysicalRegister(Reg)) { 899f22ef01cSRoman Divacky if (SubIdx) { 9006122f3e6SDimitry Andric report("Illegal subregister index for physical register", MO, MONum); 901f22ef01cSRoman Divacky return; 902f22ef01cSRoman Divacky } 9037ae0e2c9SDimitry Andric if (const TargetRegisterClass *DRC = 9047ae0e2c9SDimitry Andric TII->getRegClass(MCID, MONum, TRI, *MF)) { 9056122f3e6SDimitry Andric if (!DRC->contains(Reg)) { 906f22ef01cSRoman Divacky report("Illegal physical register for instruction", MO, MONum); 9076122f3e6SDimitry Andric *OS << TRI->getName(Reg) << " is not a " 908f22ef01cSRoman Divacky << DRC->getName() << " register.\n"; 909f22ef01cSRoman Divacky } 910f22ef01cSRoman Divacky } 911f22ef01cSRoman Divacky } else { 912f22ef01cSRoman Divacky // Virtual register. 913f22ef01cSRoman Divacky const TargetRegisterClass *RC = MRI->getRegClass(Reg); 914f22ef01cSRoman Divacky if (SubIdx) { 9156122f3e6SDimitry Andric const TargetRegisterClass *SRC = 9166122f3e6SDimitry Andric TRI->getSubClassWithSubReg(RC, SubIdx); 917f22ef01cSRoman Divacky if (!SRC) { 918f22ef01cSRoman Divacky report("Invalid subregister index for virtual register", MO, MONum); 919f22ef01cSRoman Divacky *OS << "Register class " << RC->getName() 920f22ef01cSRoman Divacky << " does not support subreg index " << SubIdx << "\n"; 921f22ef01cSRoman Divacky return; 922f22ef01cSRoman Divacky } 9236122f3e6SDimitry Andric if (RC != SRC) { 9246122f3e6SDimitry Andric report("Invalid register class for subregister index", MO, MONum); 9256122f3e6SDimitry Andric *OS << "Register class " << RC->getName() 9266122f3e6SDimitry Andric << " does not fully support subreg index " << SubIdx << "\n"; 9276122f3e6SDimitry Andric return; 9286122f3e6SDimitry Andric } 929f22ef01cSRoman Divacky } 9307ae0e2c9SDimitry Andric if (const TargetRegisterClass *DRC = 9317ae0e2c9SDimitry Andric TII->getRegClass(MCID, MONum, TRI, *MF)) { 9326122f3e6SDimitry Andric if (SubIdx) { 9336122f3e6SDimitry Andric const TargetRegisterClass *SuperRC = 9346122f3e6SDimitry Andric TRI->getLargestLegalSuperClass(RC); 9356122f3e6SDimitry Andric if (!SuperRC) { 9366122f3e6SDimitry Andric report("No largest legal super class exists.", MO, MONum); 9376122f3e6SDimitry Andric return; 9386122f3e6SDimitry Andric } 9396122f3e6SDimitry Andric DRC = TRI->getMatchingSuperRegClass(SuperRC, DRC, SubIdx); 9406122f3e6SDimitry Andric if (!DRC) { 9416122f3e6SDimitry Andric report("No matching super-reg register class.", MO, MONum); 9426122f3e6SDimitry Andric return; 9436122f3e6SDimitry Andric } 9446122f3e6SDimitry Andric } 945bd5abe19SDimitry Andric if (!RC->hasSuperClassEq(DRC)) { 946f22ef01cSRoman Divacky report("Illegal virtual register for instruction", MO, MONum); 947f22ef01cSRoman Divacky *OS << "Expected a " << DRC->getName() << " register, but got a " 948f22ef01cSRoman Divacky << RC->getName() << " register\n"; 949f22ef01cSRoman Divacky } 950f22ef01cSRoman Divacky } 951f22ef01cSRoman Divacky } 952f22ef01cSRoman Divacky } 953f22ef01cSRoman Divacky break; 954f22ef01cSRoman Divacky } 955f22ef01cSRoman Divacky 956dff0c46cSDimitry Andric case MachineOperand::MO_RegisterMask: 957dff0c46cSDimitry Andric regMasks.push_back(MO->getRegMask()); 958dff0c46cSDimitry Andric break; 959dff0c46cSDimitry Andric 960f22ef01cSRoman Divacky case MachineOperand::MO_MachineBasicBlock: 961f22ef01cSRoman Divacky if (MI->isPHI() && !MO->getMBB()->isSuccessor(MI->getParent())) 962f22ef01cSRoman Divacky report("PHI operand is not in the CFG", MO, MONum); 963f22ef01cSRoman Divacky break; 964f22ef01cSRoman Divacky 9652754fe60SDimitry Andric case MachineOperand::MO_FrameIndex: 9662754fe60SDimitry Andric if (LiveStks && LiveStks->hasInterval(MO->getIndex()) && 9672754fe60SDimitry Andric LiveInts && !LiveInts->isNotInMIMap(MI)) { 9682754fe60SDimitry Andric LiveInterval &LI = LiveStks->getInterval(MO->getIndex()); 9692754fe60SDimitry Andric SlotIndex Idx = LiveInts->getInstructionIndex(MI); 970dff0c46cSDimitry Andric if (MI->mayLoad() && !LI.liveAt(Idx.getRegSlot(true))) { 9712754fe60SDimitry Andric report("Instruction loads from dead spill slot", MO, MONum); 9722754fe60SDimitry Andric *OS << "Live stack: " << LI << '\n'; 9732754fe60SDimitry Andric } 974dff0c46cSDimitry Andric if (MI->mayStore() && !LI.liveAt(Idx.getRegSlot())) { 9752754fe60SDimitry Andric report("Instruction stores to dead spill slot", MO, MONum); 9762754fe60SDimitry Andric *OS << "Live stack: " << LI << '\n'; 9772754fe60SDimitry Andric } 9782754fe60SDimitry Andric } 9792754fe60SDimitry Andric break; 9802754fe60SDimitry Andric 981f22ef01cSRoman Divacky default: 982f22ef01cSRoman Divacky break; 983f22ef01cSRoman Divacky } 984f22ef01cSRoman Divacky } 985f22ef01cSRoman Divacky 986dff0c46cSDimitry Andric void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) { 987dff0c46cSDimitry Andric const MachineInstr *MI = MO->getParent(); 988dff0c46cSDimitry Andric const unsigned Reg = MO->getReg(); 989dff0c46cSDimitry Andric 990dff0c46cSDimitry Andric // Both use and def operands can read a register. 991dff0c46cSDimitry Andric if (MO->readsReg()) { 992dff0c46cSDimitry Andric regsLiveInButUnused.erase(Reg); 993dff0c46cSDimitry Andric 9947ae0e2c9SDimitry Andric if (MO->isKill()) 995dff0c46cSDimitry Andric addRegWithSubRegs(regsKilled, Reg); 996dff0c46cSDimitry Andric 997dff0c46cSDimitry Andric // Check that LiveVars knows this kill. 998dff0c46cSDimitry Andric if (LiveVars && TargetRegisterInfo::isVirtualRegister(Reg) && 999dff0c46cSDimitry Andric MO->isKill()) { 1000dff0c46cSDimitry Andric LiveVariables::VarInfo &VI = LiveVars->getVarInfo(Reg); 1001dff0c46cSDimitry Andric if (std::find(VI.Kills.begin(), VI.Kills.end(), MI) == VI.Kills.end()) 1002dff0c46cSDimitry Andric report("Kill missing from LiveVariables", MO, MONum); 1003dff0c46cSDimitry Andric } 1004dff0c46cSDimitry Andric 1005dff0c46cSDimitry Andric // Check LiveInts liveness and kill. 10067ae0e2c9SDimitry Andric if (LiveInts && !LiveInts->isNotInMIMap(MI)) { 10077ae0e2c9SDimitry Andric SlotIndex UseIdx = LiveInts->getInstructionIndex(MI); 10087ae0e2c9SDimitry Andric // Check the cached regunit intervals. 10097ae0e2c9SDimitry Andric if (TargetRegisterInfo::isPhysicalRegister(Reg) && !isReserved(Reg)) { 10107ae0e2c9SDimitry Andric for (MCRegUnitIterator Units(Reg, TRI); Units.isValid(); ++Units) { 1011f785676fSDimitry Andric if (const LiveRange *LR = LiveInts->getCachedRegUnit(*Units)) { 1012f785676fSDimitry Andric LiveQueryResult LRQ = LR->Query(UseIdx); 10137ae0e2c9SDimitry Andric if (!LRQ.valueIn()) { 1014f785676fSDimitry Andric report("No live segment at use", MO, MONum); 10157ae0e2c9SDimitry Andric *OS << UseIdx << " is not live in " << PrintRegUnit(*Units, TRI) 1016f785676fSDimitry Andric << ' ' << *LR << '\n'; 10177ae0e2c9SDimitry Andric } 10187ae0e2c9SDimitry Andric if (MO->isKill() && !LRQ.isKill()) { 10197ae0e2c9SDimitry Andric report("Live range continues after kill flag", MO, MONum); 1020f785676fSDimitry Andric *OS << PrintRegUnit(*Units, TRI) << ' ' << *LR << '\n'; 10217ae0e2c9SDimitry Andric } 10227ae0e2c9SDimitry Andric } 10237ae0e2c9SDimitry Andric } 10247ae0e2c9SDimitry Andric } 10257ae0e2c9SDimitry Andric 10267ae0e2c9SDimitry Andric if (TargetRegisterInfo::isVirtualRegister(Reg)) { 1027dff0c46cSDimitry Andric if (LiveInts->hasInterval(Reg)) { 10287ae0e2c9SDimitry Andric // This is a virtual register interval. 1029dff0c46cSDimitry Andric const LiveInterval &LI = LiveInts->getInterval(Reg); 1030f785676fSDimitry Andric LiveQueryResult LRQ = LI.Query(UseIdx); 10317ae0e2c9SDimitry Andric if (!LRQ.valueIn()) { 1032f785676fSDimitry Andric report("No live segment at use", MO, MONum); 1033dff0c46cSDimitry Andric *OS << UseIdx << " is not live in " << LI << '\n'; 1034dff0c46cSDimitry Andric } 1035dff0c46cSDimitry Andric // Check for extra kill flags. 1036dff0c46cSDimitry Andric // Note that we allow missing kill flags for now. 10377ae0e2c9SDimitry Andric if (MO->isKill() && !LRQ.isKill()) { 1038dff0c46cSDimitry Andric report("Live range continues after kill flag", MO, MONum); 1039dff0c46cSDimitry Andric *OS << "Live range: " << LI << '\n'; 1040dff0c46cSDimitry Andric } 1041dff0c46cSDimitry Andric } else { 10427ae0e2c9SDimitry Andric report("Virtual register has no live interval", MO, MONum); 10437ae0e2c9SDimitry Andric } 1044dff0c46cSDimitry Andric } 1045dff0c46cSDimitry Andric } 1046dff0c46cSDimitry Andric 1047dff0c46cSDimitry Andric // Use of a dead register. 1048dff0c46cSDimitry Andric if (!regsLive.count(Reg)) { 1049dff0c46cSDimitry Andric if (TargetRegisterInfo::isPhysicalRegister(Reg)) { 1050dff0c46cSDimitry Andric // Reserved registers may be used even when 'dead'. 1051dff0c46cSDimitry Andric if (!isReserved(Reg)) 1052dff0c46cSDimitry Andric report("Using an undefined physical register", MO, MONum); 10537ae0e2c9SDimitry Andric } else if (MRI->def_empty(Reg)) { 10547ae0e2c9SDimitry Andric report("Reading virtual register without a def", MO, MONum); 1055dff0c46cSDimitry Andric } else { 1056dff0c46cSDimitry Andric BBInfo &MInfo = MBBInfoMap[MI->getParent()]; 1057dff0c46cSDimitry Andric // We don't know which virtual registers are live in, so only complain 1058dff0c46cSDimitry Andric // if vreg was killed in this MBB. Otherwise keep track of vregs that 1059dff0c46cSDimitry Andric // must be live in. PHI instructions are handled separately. 1060dff0c46cSDimitry Andric if (MInfo.regsKilled.count(Reg)) 1061dff0c46cSDimitry Andric report("Using a killed virtual register", MO, MONum); 1062dff0c46cSDimitry Andric else if (!MI->isPHI()) 1063dff0c46cSDimitry Andric MInfo.vregsLiveIn.insert(std::make_pair(Reg, MI)); 1064dff0c46cSDimitry Andric } 1065dff0c46cSDimitry Andric } 1066dff0c46cSDimitry Andric } 1067dff0c46cSDimitry Andric 1068dff0c46cSDimitry Andric if (MO->isDef()) { 1069dff0c46cSDimitry Andric // Register defined. 1070dff0c46cSDimitry Andric // TODO: verify that earlyclobber ops are not used. 1071dff0c46cSDimitry Andric if (MO->isDead()) 1072dff0c46cSDimitry Andric addRegWithSubRegs(regsDead, Reg); 1073dff0c46cSDimitry Andric else 1074dff0c46cSDimitry Andric addRegWithSubRegs(regsDefined, Reg); 1075dff0c46cSDimitry Andric 1076dff0c46cSDimitry Andric // Verify SSA form. 1077dff0c46cSDimitry Andric if (MRI->isSSA() && TargetRegisterInfo::isVirtualRegister(Reg) && 107891bc56edSDimitry Andric std::next(MRI->def_begin(Reg)) != MRI->def_end()) 1079dff0c46cSDimitry Andric report("Multiple virtual register defs in SSA form", MO, MONum); 1080dff0c46cSDimitry Andric 1081f785676fSDimitry Andric // Check LiveInts for a live segment, but only for virtual registers. 1082dff0c46cSDimitry Andric if (LiveInts && TargetRegisterInfo::isVirtualRegister(Reg) && 1083dff0c46cSDimitry Andric !LiveInts->isNotInMIMap(MI)) { 10847ae0e2c9SDimitry Andric SlotIndex DefIdx = LiveInts->getInstructionIndex(MI); 10857ae0e2c9SDimitry Andric DefIdx = DefIdx.getRegSlot(MO->isEarlyClobber()); 1086dff0c46cSDimitry Andric if (LiveInts->hasInterval(Reg)) { 1087dff0c46cSDimitry Andric const LiveInterval &LI = LiveInts->getInterval(Reg); 1088dff0c46cSDimitry Andric if (const VNInfo *VNI = LI.getVNInfoAt(DefIdx)) { 1089dff0c46cSDimitry Andric assert(VNI && "NULL valno is not allowed"); 10907ae0e2c9SDimitry Andric if (VNI->def != DefIdx) { 1091dff0c46cSDimitry Andric report("Inconsistent valno->def", MO, MONum); 1092dff0c46cSDimitry Andric *OS << "Valno " << VNI->id << " is not defined at " 1093dff0c46cSDimitry Andric << DefIdx << " in " << LI << '\n'; 1094dff0c46cSDimitry Andric } 1095dff0c46cSDimitry Andric } else { 1096f785676fSDimitry Andric report("No live segment at def", MO, MONum); 1097dff0c46cSDimitry Andric *OS << DefIdx << " is not live in " << LI << '\n'; 1098dff0c46cSDimitry Andric } 1099f785676fSDimitry Andric // Check that, if the dead def flag is present, LiveInts agree. 1100f785676fSDimitry Andric if (MO->isDead()) { 1101f785676fSDimitry Andric LiveQueryResult LRQ = LI.Query(DefIdx); 1102f785676fSDimitry Andric if (!LRQ.isDeadDef()) { 1103f785676fSDimitry Andric report("Live range continues after dead def flag", MO, MONum); 1104f785676fSDimitry Andric *OS << "Live range: " << LI << '\n'; 1105f785676fSDimitry Andric } 1106f785676fSDimitry Andric } 1107dff0c46cSDimitry Andric } else { 1108dff0c46cSDimitry Andric report("Virtual register has no Live interval", MO, MONum); 1109dff0c46cSDimitry Andric } 1110dff0c46cSDimitry Andric } 1111dff0c46cSDimitry Andric } 1112dff0c46cSDimitry Andric } 1113dff0c46cSDimitry Andric 1114f22ef01cSRoman Divacky void MachineVerifier::visitMachineInstrAfter(const MachineInstr *MI) { 11157ae0e2c9SDimitry Andric } 11167ae0e2c9SDimitry Andric 11177ae0e2c9SDimitry Andric // This function gets called after visiting all instructions in a bundle. The 11187ae0e2c9SDimitry Andric // argument points to the bundle header. 11197ae0e2c9SDimitry Andric // Normal stand-alone instructions are also considered 'bundles', and this 11207ae0e2c9SDimitry Andric // function is called for all of them. 11217ae0e2c9SDimitry Andric void MachineVerifier::visitMachineBundleAfter(const MachineInstr *MI) { 1122f22ef01cSRoman Divacky BBInfo &MInfo = MBBInfoMap[MI->getParent()]; 1123f22ef01cSRoman Divacky set_union(MInfo.regsKilled, regsKilled); 1124e580952dSDimitry Andric set_subtract(regsLive, regsKilled); regsKilled.clear(); 1125dff0c46cSDimitry Andric // Kill any masked registers. 1126dff0c46cSDimitry Andric while (!regMasks.empty()) { 1127dff0c46cSDimitry Andric const uint32_t *Mask = regMasks.pop_back_val(); 1128dff0c46cSDimitry Andric for (RegSet::iterator I = regsLive.begin(), E = regsLive.end(); I != E; ++I) 1129dff0c46cSDimitry Andric if (TargetRegisterInfo::isPhysicalRegister(*I) && 1130dff0c46cSDimitry Andric MachineOperand::clobbersPhysReg(Mask, *I)) 1131dff0c46cSDimitry Andric regsDead.push_back(*I); 1132dff0c46cSDimitry Andric } 1133f22ef01cSRoman Divacky set_subtract(regsLive, regsDead); regsDead.clear(); 1134f22ef01cSRoman Divacky set_union(regsLive, regsDefined); regsDefined.clear(); 1135f22ef01cSRoman Divacky } 1136f22ef01cSRoman Divacky 1137f22ef01cSRoman Divacky void 1138f22ef01cSRoman Divacky MachineVerifier::visitMachineBasicBlockAfter(const MachineBasicBlock *MBB) { 1139f22ef01cSRoman Divacky MBBInfoMap[MBB].regsLiveOut = regsLive; 1140f22ef01cSRoman Divacky regsLive.clear(); 11412754fe60SDimitry Andric 11422754fe60SDimitry Andric if (Indexes) { 11432754fe60SDimitry Andric SlotIndex stop = Indexes->getMBBEndIdx(MBB); 11442754fe60SDimitry Andric if (!(stop > lastIndex)) { 11452754fe60SDimitry Andric report("Block ends before last instruction index", MBB); 11462754fe60SDimitry Andric *OS << "Block ends at " << stop 11472754fe60SDimitry Andric << " last instruction was at " << lastIndex << '\n'; 11482754fe60SDimitry Andric } 11492754fe60SDimitry Andric lastIndex = stop; 11502754fe60SDimitry Andric } 1151f22ef01cSRoman Divacky } 1152f22ef01cSRoman Divacky 1153f22ef01cSRoman Divacky // Calculate the largest possible vregsPassed sets. These are the registers that 1154f22ef01cSRoman Divacky // can pass through an MBB live, but may not be live every time. It is assumed 1155f22ef01cSRoman Divacky // that all vregsPassed sets are empty before the call. 1156f22ef01cSRoman Divacky void MachineVerifier::calcRegsPassed() { 1157f22ef01cSRoman Divacky // First push live-out regs to successors' vregsPassed. Remember the MBBs that 1158f22ef01cSRoman Divacky // have any vregsPassed. 1159dff0c46cSDimitry Andric SmallPtrSet<const MachineBasicBlock*, 8> todo; 116091bc56edSDimitry Andric for (const auto &MBB : *MF) { 1161f22ef01cSRoman Divacky BBInfo &MInfo = MBBInfoMap[&MBB]; 1162f22ef01cSRoman Divacky if (!MInfo.reachable) 1163f22ef01cSRoman Divacky continue; 1164f22ef01cSRoman Divacky for (MachineBasicBlock::const_succ_iterator SuI = MBB.succ_begin(), 1165f22ef01cSRoman Divacky SuE = MBB.succ_end(); SuI != SuE; ++SuI) { 1166f22ef01cSRoman Divacky BBInfo &SInfo = MBBInfoMap[*SuI]; 1167f22ef01cSRoman Divacky if (SInfo.addPassed(MInfo.regsLiveOut)) 1168f22ef01cSRoman Divacky todo.insert(*SuI); 1169f22ef01cSRoman Divacky } 1170f22ef01cSRoman Divacky } 1171f22ef01cSRoman Divacky 1172f22ef01cSRoman Divacky // Iteratively push vregsPassed to successors. This will converge to the same 1173f22ef01cSRoman Divacky // final state regardless of DenseSet iteration order. 1174f22ef01cSRoman Divacky while (!todo.empty()) { 1175f22ef01cSRoman Divacky const MachineBasicBlock *MBB = *todo.begin(); 1176f22ef01cSRoman Divacky todo.erase(MBB); 1177f22ef01cSRoman Divacky BBInfo &MInfo = MBBInfoMap[MBB]; 1178f22ef01cSRoman Divacky for (MachineBasicBlock::const_succ_iterator SuI = MBB->succ_begin(), 1179f22ef01cSRoman Divacky SuE = MBB->succ_end(); SuI != SuE; ++SuI) { 1180f22ef01cSRoman Divacky if (*SuI == MBB) 1181f22ef01cSRoman Divacky continue; 1182f22ef01cSRoman Divacky BBInfo &SInfo = MBBInfoMap[*SuI]; 1183f22ef01cSRoman Divacky if (SInfo.addPassed(MInfo.vregsPassed)) 1184f22ef01cSRoman Divacky todo.insert(*SuI); 1185f22ef01cSRoman Divacky } 1186f22ef01cSRoman Divacky } 1187f22ef01cSRoman Divacky } 1188f22ef01cSRoman Divacky 1189f22ef01cSRoman Divacky // Calculate the set of virtual registers that must be passed through each basic 1190f22ef01cSRoman Divacky // block in order to satisfy the requirements of successor blocks. This is very 1191f22ef01cSRoman Divacky // similar to calcRegsPassed, only backwards. 1192f22ef01cSRoman Divacky void MachineVerifier::calcRegsRequired() { 1193f22ef01cSRoman Divacky // First push live-in regs to predecessors' vregsRequired. 1194dff0c46cSDimitry Andric SmallPtrSet<const MachineBasicBlock*, 8> todo; 119591bc56edSDimitry Andric for (const auto &MBB : *MF) { 1196f22ef01cSRoman Divacky BBInfo &MInfo = MBBInfoMap[&MBB]; 1197f22ef01cSRoman Divacky for (MachineBasicBlock::const_pred_iterator PrI = MBB.pred_begin(), 1198f22ef01cSRoman Divacky PrE = MBB.pred_end(); PrI != PrE; ++PrI) { 1199f22ef01cSRoman Divacky BBInfo &PInfo = MBBInfoMap[*PrI]; 1200f22ef01cSRoman Divacky if (PInfo.addRequired(MInfo.vregsLiveIn)) 1201f22ef01cSRoman Divacky todo.insert(*PrI); 1202f22ef01cSRoman Divacky } 1203f22ef01cSRoman Divacky } 1204f22ef01cSRoman Divacky 1205f22ef01cSRoman Divacky // Iteratively push vregsRequired to predecessors. This will converge to the 1206f22ef01cSRoman Divacky // same final state regardless of DenseSet iteration order. 1207f22ef01cSRoman Divacky while (!todo.empty()) { 1208f22ef01cSRoman Divacky const MachineBasicBlock *MBB = *todo.begin(); 1209f22ef01cSRoman Divacky todo.erase(MBB); 1210f22ef01cSRoman Divacky BBInfo &MInfo = MBBInfoMap[MBB]; 1211f22ef01cSRoman Divacky for (MachineBasicBlock::const_pred_iterator PrI = MBB->pred_begin(), 1212f22ef01cSRoman Divacky PrE = MBB->pred_end(); PrI != PrE; ++PrI) { 1213f22ef01cSRoman Divacky if (*PrI == MBB) 1214f22ef01cSRoman Divacky continue; 1215f22ef01cSRoman Divacky BBInfo &SInfo = MBBInfoMap[*PrI]; 1216f22ef01cSRoman Divacky if (SInfo.addRequired(MInfo.vregsRequired)) 1217f22ef01cSRoman Divacky todo.insert(*PrI); 1218f22ef01cSRoman Divacky } 1219f22ef01cSRoman Divacky } 1220f22ef01cSRoman Divacky } 1221f22ef01cSRoman Divacky 1222f22ef01cSRoman Divacky // Check PHI instructions at the beginning of MBB. It is assumed that 1223f22ef01cSRoman Divacky // calcRegsPassed has been run so BBInfo::isLiveOut is valid. 1224f22ef01cSRoman Divacky void MachineVerifier::checkPHIOps(const MachineBasicBlock *MBB) { 1225dff0c46cSDimitry Andric SmallPtrSet<const MachineBasicBlock*, 8> seen; 122691bc56edSDimitry Andric for (const auto &BBI : *MBB) { 122791bc56edSDimitry Andric if (!BBI.isPHI()) 122891bc56edSDimitry Andric break; 1229dff0c46cSDimitry Andric seen.clear(); 1230f22ef01cSRoman Divacky 123191bc56edSDimitry Andric for (unsigned i = 1, e = BBI.getNumOperands(); i != e; i += 2) { 123291bc56edSDimitry Andric unsigned Reg = BBI.getOperand(i).getReg(); 123391bc56edSDimitry Andric const MachineBasicBlock *Pre = BBI.getOperand(i + 1).getMBB(); 1234f22ef01cSRoman Divacky if (!Pre->isSuccessor(MBB)) 1235f22ef01cSRoman Divacky continue; 1236f22ef01cSRoman Divacky seen.insert(Pre); 1237f22ef01cSRoman Divacky BBInfo &PrInfo = MBBInfoMap[Pre]; 1238f22ef01cSRoman Divacky if (PrInfo.reachable && !PrInfo.isLiveOut(Reg)) 1239f22ef01cSRoman Divacky report("PHI operand is not live-out from predecessor", 124091bc56edSDimitry Andric &BBI.getOperand(i), i); 1241f22ef01cSRoman Divacky } 1242f22ef01cSRoman Divacky 1243f22ef01cSRoman Divacky // Did we see all predecessors? 1244f22ef01cSRoman Divacky for (MachineBasicBlock::const_pred_iterator PrI = MBB->pred_begin(), 1245f22ef01cSRoman Divacky PrE = MBB->pred_end(); PrI != PrE; ++PrI) { 1246f22ef01cSRoman Divacky if (!seen.count(*PrI)) { 124791bc56edSDimitry Andric report("Missing PHI operand", &BBI); 1248f22ef01cSRoman Divacky *OS << "BB#" << (*PrI)->getNumber() 1249f22ef01cSRoman Divacky << " is a predecessor according to the CFG.\n"; 1250f22ef01cSRoman Divacky } 1251f22ef01cSRoman Divacky } 1252f22ef01cSRoman Divacky } 1253f22ef01cSRoman Divacky } 1254f22ef01cSRoman Divacky 1255f22ef01cSRoman Divacky void MachineVerifier::visitMachineFunctionAfter() { 1256f22ef01cSRoman Divacky calcRegsPassed(); 1257f22ef01cSRoman Divacky 125891bc56edSDimitry Andric for (const auto &MBB : *MF) { 125991bc56edSDimitry Andric BBInfo &MInfo = MBBInfoMap[&MBB]; 1260f22ef01cSRoman Divacky 1261f22ef01cSRoman Divacky // Skip unreachable MBBs. 1262f22ef01cSRoman Divacky if (!MInfo.reachable) 1263f22ef01cSRoman Divacky continue; 1264f22ef01cSRoman Divacky 126591bc56edSDimitry Andric checkPHIOps(&MBB); 1266f22ef01cSRoman Divacky } 1267f22ef01cSRoman Divacky 1268e580952dSDimitry Andric // Now check liveness info if available 1269f22ef01cSRoman Divacky calcRegsRequired(); 1270dff0c46cSDimitry Andric 12717ae0e2c9SDimitry Andric // Check for killed virtual registers that should be live out. 127291bc56edSDimitry Andric for (const auto &MBB : *MF) { 127391bc56edSDimitry Andric BBInfo &MInfo = MBBInfoMap[&MBB]; 12747ae0e2c9SDimitry Andric for (RegSet::iterator 12757ae0e2c9SDimitry Andric I = MInfo.vregsRequired.begin(), E = MInfo.vregsRequired.end(); I != E; 12767ae0e2c9SDimitry Andric ++I) 12777ae0e2c9SDimitry Andric if (MInfo.regsKilled.count(*I)) { 127891bc56edSDimitry Andric report("Virtual register killed in block, but needed live out.", &MBB); 12797ae0e2c9SDimitry Andric *OS << "Virtual register " << PrintReg(*I) 12807ae0e2c9SDimitry Andric << " is used after the block.\n"; 12817ae0e2c9SDimitry Andric } 12827ae0e2c9SDimitry Andric } 12837ae0e2c9SDimitry Andric 12847ae0e2c9SDimitry Andric if (!MF->empty()) { 1285dff0c46cSDimitry Andric BBInfo &MInfo = MBBInfoMap[&MF->front()]; 1286dff0c46cSDimitry Andric for (RegSet::iterator 1287dff0c46cSDimitry Andric I = MInfo.vregsRequired.begin(), E = MInfo.vregsRequired.end(); I != E; 1288dff0c46cSDimitry Andric ++I) 1289dff0c46cSDimitry Andric report("Virtual register def doesn't dominate all uses.", 1290dff0c46cSDimitry Andric MRI->getVRegDef(*I)); 1291dff0c46cSDimitry Andric } 1292dff0c46cSDimitry Andric 1293e580952dSDimitry Andric if (LiveVars) 1294f22ef01cSRoman Divacky verifyLiveVariables(); 1295e580952dSDimitry Andric if (LiveInts) 1296e580952dSDimitry Andric verifyLiveIntervals(); 1297f22ef01cSRoman Divacky } 1298f22ef01cSRoman Divacky 1299f22ef01cSRoman Divacky void MachineVerifier::verifyLiveVariables() { 1300f22ef01cSRoman Divacky assert(LiveVars && "Don't call verifyLiveVariables without LiveVars"); 13012754fe60SDimitry Andric for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) { 13022754fe60SDimitry Andric unsigned Reg = TargetRegisterInfo::index2VirtReg(i); 1303f22ef01cSRoman Divacky LiveVariables::VarInfo &VI = LiveVars->getVarInfo(Reg); 130491bc56edSDimitry Andric for (const auto &MBB : *MF) { 130591bc56edSDimitry Andric BBInfo &MInfo = MBBInfoMap[&MBB]; 1306f22ef01cSRoman Divacky 1307f22ef01cSRoman Divacky // Our vregsRequired should be identical to LiveVariables' AliveBlocks 1308f22ef01cSRoman Divacky if (MInfo.vregsRequired.count(Reg)) { 130991bc56edSDimitry Andric if (!VI.AliveBlocks.test(MBB.getNumber())) { 131091bc56edSDimitry Andric report("LiveVariables: Block missing from AliveBlocks", &MBB); 13112754fe60SDimitry Andric *OS << "Virtual register " << PrintReg(Reg) 1312f22ef01cSRoman Divacky << " must be live through the block.\n"; 1313f22ef01cSRoman Divacky } 1314f22ef01cSRoman Divacky } else { 131591bc56edSDimitry Andric if (VI.AliveBlocks.test(MBB.getNumber())) { 131691bc56edSDimitry Andric report("LiveVariables: Block should not be in AliveBlocks", &MBB); 13172754fe60SDimitry Andric *OS << "Virtual register " << PrintReg(Reg) 1318f22ef01cSRoman Divacky << " is not needed live through the block.\n"; 1319f22ef01cSRoman Divacky } 1320f22ef01cSRoman Divacky } 1321f22ef01cSRoman Divacky } 1322f22ef01cSRoman Divacky } 1323f22ef01cSRoman Divacky } 1324f22ef01cSRoman Divacky 1325e580952dSDimitry Andric void MachineVerifier::verifyLiveIntervals() { 1326e580952dSDimitry Andric assert(LiveInts && "Don't call verifyLiveIntervals without LiveInts"); 13277ae0e2c9SDimitry Andric for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) { 13287ae0e2c9SDimitry Andric unsigned Reg = TargetRegisterInfo::index2VirtReg(i); 13292754fe60SDimitry Andric 13302754fe60SDimitry Andric // Spilling and splitting may leave unused registers around. Skip them. 13317ae0e2c9SDimitry Andric if (MRI->reg_nodbg_empty(Reg)) 13322754fe60SDimitry Andric continue; 13332754fe60SDimitry Andric 13347ae0e2c9SDimitry Andric if (!LiveInts->hasInterval(Reg)) { 13357ae0e2c9SDimitry Andric report("Missing live interval for virtual register", MF); 13367ae0e2c9SDimitry Andric *OS << PrintReg(Reg, TRI) << " still has defs or uses\n"; 13372754fe60SDimitry Andric continue; 13387ae0e2c9SDimitry Andric } 13392754fe60SDimitry Andric 13407ae0e2c9SDimitry Andric const LiveInterval &LI = LiveInts->getInterval(Reg); 13417ae0e2c9SDimitry Andric assert(Reg == LI.reg && "Invalid reg to interval mapping"); 13427ae0e2c9SDimitry Andric verifyLiveInterval(LI); 13437ae0e2c9SDimitry Andric } 1344e580952dSDimitry Andric 13457ae0e2c9SDimitry Andric // Verify all the cached regunit intervals. 13467ae0e2c9SDimitry Andric for (unsigned i = 0, e = TRI->getNumRegUnits(); i != e; ++i) 1347f785676fSDimitry Andric if (const LiveRange *LR = LiveInts->getCachedRegUnit(i)) 1348f785676fSDimitry Andric verifyLiveRange(*LR, i); 13497ae0e2c9SDimitry Andric } 13507ae0e2c9SDimitry Andric 1351f785676fSDimitry Andric void MachineVerifier::verifyLiveRangeValue(const LiveRange &LR, 1352f785676fSDimitry Andric const VNInfo *VNI, 1353f785676fSDimitry Andric unsigned Reg) { 13547ae0e2c9SDimitry Andric if (VNI->isUnused()) 13557ae0e2c9SDimitry Andric return; 13567ae0e2c9SDimitry Andric 1357f785676fSDimitry Andric const VNInfo *DefVNI = LR.getVNInfoAt(VNI->def); 1358e580952dSDimitry Andric 13592754fe60SDimitry Andric if (!DefVNI) { 1360f785676fSDimitry Andric report("Valno not live at def and not marked unused", MF, LR); 13617ae0e2c9SDimitry Andric *OS << "Valno #" << VNI->id << '\n'; 13627ae0e2c9SDimitry Andric return; 1363e580952dSDimitry Andric } 1364e580952dSDimitry Andric 13652754fe60SDimitry Andric if (DefVNI != VNI) { 1366f785676fSDimitry Andric report("Live segment at def has different valno", MF, LR); 13672754fe60SDimitry Andric *OS << "Valno #" << VNI->id << " is defined at " << VNI->def 13687ae0e2c9SDimitry Andric << " where valno #" << DefVNI->id << " is live\n"; 13697ae0e2c9SDimitry Andric return; 1370e580952dSDimitry Andric } 1371e580952dSDimitry Andric 13722754fe60SDimitry Andric const MachineBasicBlock *MBB = LiveInts->getMBBFromIndex(VNI->def); 13732754fe60SDimitry Andric if (!MBB) { 1374f785676fSDimitry Andric report("Invalid definition index", MF, LR); 13752754fe60SDimitry Andric *OS << "Valno #" << VNI->id << " is defined at " << VNI->def 1376f785676fSDimitry Andric << " in " << LR << '\n'; 13777ae0e2c9SDimitry Andric return; 13782754fe60SDimitry Andric } 13792754fe60SDimitry Andric 13802754fe60SDimitry Andric if (VNI->isPHIDef()) { 13812754fe60SDimitry Andric if (VNI->def != LiveInts->getMBBStartIdx(MBB)) { 1382f785676fSDimitry Andric report("PHIDef value is not defined at MBB start", MBB, LR); 13832754fe60SDimitry Andric *OS << "Valno #" << VNI->id << " is defined at " << VNI->def 13847ae0e2c9SDimitry Andric << ", not at the beginning of BB#" << MBB->getNumber() << '\n'; 13852754fe60SDimitry Andric } 13867ae0e2c9SDimitry Andric return; 13877ae0e2c9SDimitry Andric } 13887ae0e2c9SDimitry Andric 13892754fe60SDimitry Andric // Non-PHI def. 13902754fe60SDimitry Andric const MachineInstr *MI = LiveInts->getInstructionFromIndex(VNI->def); 13912754fe60SDimitry Andric if (!MI) { 1392f785676fSDimitry Andric report("No instruction at def index", MBB, LR); 13937ae0e2c9SDimitry Andric *OS << "Valno #" << VNI->id << " is defined at " << VNI->def << '\n'; 13947ae0e2c9SDimitry Andric return; 13952754fe60SDimitry Andric } 13962754fe60SDimitry Andric 1397f785676fSDimitry Andric if (Reg != 0) { 1398dff0c46cSDimitry Andric bool hasDef = false; 13992754fe60SDimitry Andric bool isEarlyClobber = false; 1400dff0c46cSDimitry Andric for (ConstMIBundleOperands MOI(MI); MOI.isValid(); ++MOI) { 1401dff0c46cSDimitry Andric if (!MOI->isReg() || !MOI->isDef()) 1402dff0c46cSDimitry Andric continue; 1403f785676fSDimitry Andric if (TargetRegisterInfo::isVirtualRegister(Reg)) { 1404f785676fSDimitry Andric if (MOI->getReg() != Reg) 1405dff0c46cSDimitry Andric continue; 1406dff0c46cSDimitry Andric } else { 1407dff0c46cSDimitry Andric if (!TargetRegisterInfo::isPhysicalRegister(MOI->getReg()) || 1408f785676fSDimitry Andric !TRI->hasRegUnit(MOI->getReg(), Reg)) 1409dff0c46cSDimitry Andric continue; 1410dff0c46cSDimitry Andric } 1411dff0c46cSDimitry Andric hasDef = true; 1412dff0c46cSDimitry Andric if (MOI->isEarlyClobber()) 14132754fe60SDimitry Andric isEarlyClobber = true; 14142754fe60SDimitry Andric } 1415dff0c46cSDimitry Andric 1416dff0c46cSDimitry Andric if (!hasDef) { 1417dff0c46cSDimitry Andric report("Defining instruction does not modify register", MI); 1418f785676fSDimitry Andric *OS << "Valno #" << VNI->id << " in " << LR << '\n'; 14192754fe60SDimitry Andric } 14202754fe60SDimitry Andric 14212754fe60SDimitry Andric // Early clobber defs begin at USE slots, but other defs must begin at 14222754fe60SDimitry Andric // DEF slots. 14232754fe60SDimitry Andric if (isEarlyClobber) { 1424dff0c46cSDimitry Andric if (!VNI->def.isEarlyClobber()) { 1425f785676fSDimitry Andric report("Early clobber def must be at an early-clobber slot", MBB, LR); 14267ae0e2c9SDimitry Andric *OS << "Valno #" << VNI->id << " is defined at " << VNI->def << '\n'; 14272754fe60SDimitry Andric } 1428dff0c46cSDimitry Andric } else if (!VNI->def.isRegister()) { 1429dff0c46cSDimitry Andric report("Non-PHI, non-early clobber def must be at a register slot", 1430f785676fSDimitry Andric MBB, LR); 14317ae0e2c9SDimitry Andric *OS << "Valno #" << VNI->id << " is defined at " << VNI->def << '\n'; 14322754fe60SDimitry Andric } 1433e580952dSDimitry Andric } 1434f785676fSDimitry Andric } 1435e580952dSDimitry Andric 1436f785676fSDimitry Andric void MachineVerifier::verifyLiveRangeSegment(const LiveRange &LR, 1437f785676fSDimitry Andric const LiveRange::const_iterator I, 1438f785676fSDimitry Andric unsigned Reg) { 1439f785676fSDimitry Andric const LiveRange::Segment &S = *I; 1440f785676fSDimitry Andric const VNInfo *VNI = S.valno; 1441f785676fSDimitry Andric assert(VNI && "Live segment has no valno"); 1442e580952dSDimitry Andric 1443f785676fSDimitry Andric if (VNI->id >= LR.getNumValNums() || VNI != LR.getValNumInfo(VNI->id)) { 1444f785676fSDimitry Andric report("Foreign valno in live segment", MF, LR); 1445f785676fSDimitry Andric *OS << S << " has a bad valno\n"; 1446e580952dSDimitry Andric } 1447e580952dSDimitry Andric 14482754fe60SDimitry Andric if (VNI->isUnused()) { 1449f785676fSDimitry Andric report("Live segment valno is marked unused", MF, LR); 1450f785676fSDimitry Andric *OS << S << '\n'; 1451e580952dSDimitry Andric } 1452e580952dSDimitry Andric 1453f785676fSDimitry Andric const MachineBasicBlock *MBB = LiveInts->getMBBFromIndex(S.start); 14542754fe60SDimitry Andric if (!MBB) { 1455f785676fSDimitry Andric report("Bad start of live segment, no basic block", MF, LR); 1456f785676fSDimitry Andric *OS << S << '\n'; 14577ae0e2c9SDimitry Andric return; 14582754fe60SDimitry Andric } 14592754fe60SDimitry Andric SlotIndex MBBStartIdx = LiveInts->getMBBStartIdx(MBB); 1460f785676fSDimitry Andric if (S.start != MBBStartIdx && S.start != VNI->def) { 1461f785676fSDimitry Andric report("Live segment must begin at MBB entry or valno def", MBB, LR); 1462f785676fSDimitry Andric *OS << S << '\n'; 14632754fe60SDimitry Andric } 14642754fe60SDimitry Andric 14652754fe60SDimitry Andric const MachineBasicBlock *EndMBB = 1466f785676fSDimitry Andric LiveInts->getMBBFromIndex(S.end.getPrevSlot()); 14672754fe60SDimitry Andric if (!EndMBB) { 1468f785676fSDimitry Andric report("Bad end of live segment, no basic block", MF, LR); 1469f785676fSDimitry Andric *OS << S << '\n'; 14707ae0e2c9SDimitry Andric return; 14712754fe60SDimitry Andric } 1472dff0c46cSDimitry Andric 1473dff0c46cSDimitry Andric // No more checks for live-out segments. 1474f785676fSDimitry Andric if (S.end == LiveInts->getMBBEndIdx(EndMBB)) 14757ae0e2c9SDimitry Andric return; 14767ae0e2c9SDimitry Andric 14777ae0e2c9SDimitry Andric // RegUnit intervals are allowed dead phis. 1478f785676fSDimitry Andric if (!TargetRegisterInfo::isVirtualRegister(Reg) && VNI->isPHIDef() && 1479f785676fSDimitry Andric S.start == VNI->def && S.end == VNI->def.getDeadSlot()) 14807ae0e2c9SDimitry Andric return; 1481dff0c46cSDimitry Andric 14822754fe60SDimitry Andric // The live segment is ending inside EndMBB 14832754fe60SDimitry Andric const MachineInstr *MI = 1484f785676fSDimitry Andric LiveInts->getInstructionFromIndex(S.end.getPrevSlot()); 14852754fe60SDimitry Andric if (!MI) { 1486f785676fSDimitry Andric report("Live segment doesn't end at a valid instruction", EndMBB, LR); 1487f785676fSDimitry Andric *OS << S << '\n'; 14887ae0e2c9SDimitry Andric return; 1489dff0c46cSDimitry Andric } 1490dff0c46cSDimitry Andric 1491dff0c46cSDimitry Andric // The block slot must refer to a basic block boundary. 1492f785676fSDimitry Andric if (S.end.isBlock()) { 1493f785676fSDimitry Andric report("Live segment ends at B slot of an instruction", EndMBB, LR); 1494f785676fSDimitry Andric *OS << S << '\n'; 1495dff0c46cSDimitry Andric } 1496dff0c46cSDimitry Andric 1497f785676fSDimitry Andric if (S.end.isDead()) { 1498dff0c46cSDimitry Andric // Segment ends on the dead slot. 1499dff0c46cSDimitry Andric // That means there must be a dead def. 1500f785676fSDimitry Andric if (!SlotIndex::isSameInstr(S.start, S.end)) { 1501f785676fSDimitry Andric report("Live segment ending at dead slot spans instructions", EndMBB, LR); 1502f785676fSDimitry Andric *OS << S << '\n'; 15032754fe60SDimitry Andric } 15042754fe60SDimitry Andric } 15052754fe60SDimitry Andric 1506dff0c46cSDimitry Andric // A live segment can only end at an early-clobber slot if it is being 1507dff0c46cSDimitry Andric // redefined by an early-clobber def. 1508f785676fSDimitry Andric if (S.end.isEarlyClobber()) { 1509f785676fSDimitry Andric if (I+1 == LR.end() || (I+1)->start != S.end) { 1510dff0c46cSDimitry Andric report("Live segment ending at early clobber slot must be " 1511f785676fSDimitry Andric "redefined by an EC def in the same instruction", EndMBB, LR); 1512f785676fSDimitry Andric *OS << S << '\n'; 1513dff0c46cSDimitry Andric } 1514dff0c46cSDimitry Andric } 1515dff0c46cSDimitry Andric 1516dff0c46cSDimitry Andric // The following checks only apply to virtual registers. Physreg liveness 1517dff0c46cSDimitry Andric // is too weird to check. 1518f785676fSDimitry Andric if (TargetRegisterInfo::isVirtualRegister(Reg)) { 1519f785676fSDimitry Andric // A live segment can end with either a redefinition, a kill flag on a 1520dff0c46cSDimitry Andric // use, or a dead flag on a def. 1521dff0c46cSDimitry Andric bool hasRead = false; 1522dff0c46cSDimitry Andric for (ConstMIBundleOperands MOI(MI); MOI.isValid(); ++MOI) { 1523f785676fSDimitry Andric if (!MOI->isReg() || MOI->getReg() != Reg) 1524dff0c46cSDimitry Andric continue; 1525dff0c46cSDimitry Andric if (MOI->readsReg()) 1526dff0c46cSDimitry Andric hasRead = true; 1527dff0c46cSDimitry Andric } 1528f785676fSDimitry Andric if (!S.end.isDead()) { 1529dff0c46cSDimitry Andric if (!hasRead) { 1530f785676fSDimitry Andric report("Instruction ending live segment doesn't read the register", MI); 1531f785676fSDimitry Andric *OS << S << " in " << LR << '\n'; 15322754fe60SDimitry Andric } 15332754fe60SDimitry Andric } 15342754fe60SDimitry Andric } 15352754fe60SDimitry Andric 15362754fe60SDimitry Andric // Now check all the basic blocks in this live segment. 15372754fe60SDimitry Andric MachineFunction::const_iterator MFI = MBB; 1538f785676fSDimitry Andric // Is this live segment the beginning of a non-PHIDef VN? 1539f785676fSDimitry Andric if (S.start == VNI->def && !VNI->isPHIDef()) { 15402754fe60SDimitry Andric // Not live-in to any blocks. 15412754fe60SDimitry Andric if (MBB == EndMBB) 15427ae0e2c9SDimitry Andric return; 15432754fe60SDimitry Andric // Skip this block. 15442754fe60SDimitry Andric ++MFI; 15452754fe60SDimitry Andric } 15462754fe60SDimitry Andric for (;;) { 1547f785676fSDimitry Andric assert(LiveInts->isLiveInToMBB(LR, MFI)); 15482754fe60SDimitry Andric // We don't know how to track physregs into a landing pad. 1549f785676fSDimitry Andric if (!TargetRegisterInfo::isVirtualRegister(Reg) && 15502754fe60SDimitry Andric MFI->isLandingPad()) { 15512754fe60SDimitry Andric if (&*MFI == EndMBB) 15522754fe60SDimitry Andric break; 15532754fe60SDimitry Andric ++MFI; 15542754fe60SDimitry Andric continue; 15552754fe60SDimitry Andric } 15567ae0e2c9SDimitry Andric 15577ae0e2c9SDimitry Andric // Is VNI a PHI-def in the current block? 15587ae0e2c9SDimitry Andric bool IsPHI = VNI->isPHIDef() && 15597ae0e2c9SDimitry Andric VNI->def == LiveInts->getMBBStartIdx(MFI); 15607ae0e2c9SDimitry Andric 15612754fe60SDimitry Andric // Check that VNI is live-out of all predecessors. 15622754fe60SDimitry Andric for (MachineBasicBlock::const_pred_iterator PI = MFI->pred_begin(), 15632754fe60SDimitry Andric PE = MFI->pred_end(); PI != PE; ++PI) { 1564dff0c46cSDimitry Andric SlotIndex PEnd = LiveInts->getMBBEndIdx(*PI); 1565f785676fSDimitry Andric const VNInfo *PVNI = LR.getVNInfoBefore(PEnd); 15662754fe60SDimitry Andric 15677ae0e2c9SDimitry Andric // All predecessors must have a live-out value. 15682754fe60SDimitry Andric if (!PVNI) { 1569f785676fSDimitry Andric report("Register not marked live out of predecessor", *PI, LR); 15702754fe60SDimitry Andric *OS << "Valno #" << VNI->id << " live into BB#" << MFI->getNumber() 1571dff0c46cSDimitry Andric << '@' << LiveInts->getMBBStartIdx(MFI) << ", not live before " 15727ae0e2c9SDimitry Andric << PEnd << '\n'; 15732754fe60SDimitry Andric continue; 15742754fe60SDimitry Andric } 15752754fe60SDimitry Andric 15767ae0e2c9SDimitry Andric // Only PHI-defs can take different predecessor values. 15777ae0e2c9SDimitry Andric if (!IsPHI && PVNI != VNI) { 1578f785676fSDimitry Andric report("Different value live out of predecessor", *PI, LR); 15792754fe60SDimitry Andric *OS << "Valno #" << PVNI->id << " live out of BB#" 15802754fe60SDimitry Andric << (*PI)->getNumber() << '@' << PEnd 15812754fe60SDimitry Andric << "\nValno #" << VNI->id << " live into BB#" << MFI->getNumber() 15827ae0e2c9SDimitry Andric << '@' << LiveInts->getMBBStartIdx(MFI) << '\n'; 15832754fe60SDimitry Andric } 15842754fe60SDimitry Andric } 15852754fe60SDimitry Andric if (&*MFI == EndMBB) 15862754fe60SDimitry Andric break; 15872754fe60SDimitry Andric ++MFI; 15882754fe60SDimitry Andric } 15892754fe60SDimitry Andric } 15902754fe60SDimitry Andric 1591f785676fSDimitry Andric void MachineVerifier::verifyLiveRange(const LiveRange &LR, unsigned Reg) { 1592f785676fSDimitry Andric for (LiveRange::const_vni_iterator I = LR.vni_begin(), E = LR.vni_end(); 15937ae0e2c9SDimitry Andric I != E; ++I) 1594f785676fSDimitry Andric verifyLiveRangeValue(LR, *I, Reg); 15957ae0e2c9SDimitry Andric 1596f785676fSDimitry Andric for (LiveRange::const_iterator I = LR.begin(), E = LR.end(); I != E; ++I) 1597f785676fSDimitry Andric verifyLiveRangeSegment(LR, I, Reg); 1598f785676fSDimitry Andric } 1599f785676fSDimitry Andric 1600f785676fSDimitry Andric void MachineVerifier::verifyLiveInterval(const LiveInterval &LI) { 1601f785676fSDimitry Andric verifyLiveRange(LI, LI.reg); 16027ae0e2c9SDimitry Andric 16032754fe60SDimitry Andric // Check the LI only has one connected component. 16042754fe60SDimitry Andric if (TargetRegisterInfo::isVirtualRegister(LI.reg)) { 16052754fe60SDimitry Andric ConnectedVNInfoEqClasses ConEQ(*LiveInts); 16062754fe60SDimitry Andric unsigned NumComp = ConEQ.Classify(&LI); 16072754fe60SDimitry Andric if (NumComp > 1) { 16087ae0e2c9SDimitry Andric report("Multiple connected components in live interval", MF, LI); 16092754fe60SDimitry Andric for (unsigned comp = 0; comp != NumComp; ++comp) { 16102754fe60SDimitry Andric *OS << comp << ": valnos"; 16112754fe60SDimitry Andric for (LiveInterval::const_vni_iterator I = LI.vni_begin(), 16122754fe60SDimitry Andric E = LI.vni_end(); I!=E; ++I) 16132754fe60SDimitry Andric if (comp == ConEQ.getEqClass(*I)) 16142754fe60SDimitry Andric *OS << ' ' << (*I)->id; 16152754fe60SDimitry Andric *OS << '\n'; 16162754fe60SDimitry Andric } 16172754fe60SDimitry Andric } 1618e580952dSDimitry Andric } 1619e580952dSDimitry Andric } 1620f785676fSDimitry Andric 1621f785676fSDimitry Andric namespace { 1622f785676fSDimitry Andric // FrameSetup and FrameDestroy can have zero adjustment, so using a single 1623f785676fSDimitry Andric // integer, we can't tell whether it is a FrameSetup or FrameDestroy if the 1624f785676fSDimitry Andric // value is zero. 1625f785676fSDimitry Andric // We use a bool plus an integer to capture the stack state. 1626f785676fSDimitry Andric struct StackStateOfBB { 1627f785676fSDimitry Andric StackStateOfBB() : EntryValue(0), ExitValue(0), EntryIsSetup(false), 1628f785676fSDimitry Andric ExitIsSetup(false) { } 1629f785676fSDimitry Andric StackStateOfBB(int EntryVal, int ExitVal, bool EntrySetup, bool ExitSetup) : 1630f785676fSDimitry Andric EntryValue(EntryVal), ExitValue(ExitVal), EntryIsSetup(EntrySetup), 1631f785676fSDimitry Andric ExitIsSetup(ExitSetup) { } 1632f785676fSDimitry Andric // Can be negative, which means we are setting up a frame. 1633f785676fSDimitry Andric int EntryValue; 1634f785676fSDimitry Andric int ExitValue; 1635f785676fSDimitry Andric bool EntryIsSetup; 1636f785676fSDimitry Andric bool ExitIsSetup; 1637f785676fSDimitry Andric }; 1638f785676fSDimitry Andric } 1639f785676fSDimitry Andric 1640f785676fSDimitry Andric /// Make sure on every path through the CFG, a FrameSetup <n> is always followed 1641f785676fSDimitry Andric /// by a FrameDestroy <n>, stack adjustments are identical on all 1642f785676fSDimitry Andric /// CFG edges to a merge point, and frame is destroyed at end of a return block. 1643f785676fSDimitry Andric void MachineVerifier::verifyStackFrame() { 1644f785676fSDimitry Andric int FrameSetupOpcode = TII->getCallFrameSetupOpcode(); 1645f785676fSDimitry Andric int FrameDestroyOpcode = TII->getCallFrameDestroyOpcode(); 1646f785676fSDimitry Andric 1647f785676fSDimitry Andric SmallVector<StackStateOfBB, 8> SPState; 1648f785676fSDimitry Andric SPState.resize(MF->getNumBlockIDs()); 1649f785676fSDimitry Andric SmallPtrSet<const MachineBasicBlock*, 8> Reachable; 1650f785676fSDimitry Andric 1651f785676fSDimitry Andric // Visit the MBBs in DFS order. 1652f785676fSDimitry Andric for (df_ext_iterator<const MachineFunction*, 1653f785676fSDimitry Andric SmallPtrSet<const MachineBasicBlock*, 8> > 1654f785676fSDimitry Andric DFI = df_ext_begin(MF, Reachable), DFE = df_ext_end(MF, Reachable); 1655f785676fSDimitry Andric DFI != DFE; ++DFI) { 1656f785676fSDimitry Andric const MachineBasicBlock *MBB = *DFI; 1657f785676fSDimitry Andric 1658f785676fSDimitry Andric StackStateOfBB BBState; 1659f785676fSDimitry Andric // Check the exit state of the DFS stack predecessor. 1660f785676fSDimitry Andric if (DFI.getPathLength() >= 2) { 1661f785676fSDimitry Andric const MachineBasicBlock *StackPred = DFI.getPath(DFI.getPathLength() - 2); 1662f785676fSDimitry Andric assert(Reachable.count(StackPred) && 1663f785676fSDimitry Andric "DFS stack predecessor is already visited.\n"); 1664f785676fSDimitry Andric BBState.EntryValue = SPState[StackPred->getNumber()].ExitValue; 1665f785676fSDimitry Andric BBState.EntryIsSetup = SPState[StackPred->getNumber()].ExitIsSetup; 1666f785676fSDimitry Andric BBState.ExitValue = BBState.EntryValue; 1667f785676fSDimitry Andric BBState.ExitIsSetup = BBState.EntryIsSetup; 1668f785676fSDimitry Andric } 1669f785676fSDimitry Andric 1670f785676fSDimitry Andric // Update stack state by checking contents of MBB. 167191bc56edSDimitry Andric for (const auto &I : *MBB) { 167291bc56edSDimitry Andric if (I.getOpcode() == FrameSetupOpcode) { 1673f785676fSDimitry Andric // The first operand of a FrameOpcode should be i32. 167491bc56edSDimitry Andric int Size = I.getOperand(0).getImm(); 1675f785676fSDimitry Andric assert(Size >= 0 && 1676f785676fSDimitry Andric "Value should be non-negative in FrameSetup and FrameDestroy.\n"); 1677f785676fSDimitry Andric 1678f785676fSDimitry Andric if (BBState.ExitIsSetup) 167991bc56edSDimitry Andric report("FrameSetup is after another FrameSetup", &I); 1680f785676fSDimitry Andric BBState.ExitValue -= Size; 1681f785676fSDimitry Andric BBState.ExitIsSetup = true; 1682f785676fSDimitry Andric } 1683f785676fSDimitry Andric 168491bc56edSDimitry Andric if (I.getOpcode() == FrameDestroyOpcode) { 1685f785676fSDimitry Andric // The first operand of a FrameOpcode should be i32. 168691bc56edSDimitry Andric int Size = I.getOperand(0).getImm(); 1687f785676fSDimitry Andric assert(Size >= 0 && 1688f785676fSDimitry Andric "Value should be non-negative in FrameSetup and FrameDestroy.\n"); 1689f785676fSDimitry Andric 1690f785676fSDimitry Andric if (!BBState.ExitIsSetup) 169191bc56edSDimitry Andric report("FrameDestroy is not after a FrameSetup", &I); 1692f785676fSDimitry Andric int AbsSPAdj = BBState.ExitValue < 0 ? -BBState.ExitValue : 1693f785676fSDimitry Andric BBState.ExitValue; 1694f785676fSDimitry Andric if (BBState.ExitIsSetup && AbsSPAdj != Size) { 169591bc56edSDimitry Andric report("FrameDestroy <n> is after FrameSetup <m>", &I); 1696f785676fSDimitry Andric *OS << "FrameDestroy <" << Size << "> is after FrameSetup <" 1697f785676fSDimitry Andric << AbsSPAdj << ">.\n"; 1698f785676fSDimitry Andric } 1699f785676fSDimitry Andric BBState.ExitValue += Size; 1700f785676fSDimitry Andric BBState.ExitIsSetup = false; 1701f785676fSDimitry Andric } 1702f785676fSDimitry Andric } 1703f785676fSDimitry Andric SPState[MBB->getNumber()] = BBState; 1704f785676fSDimitry Andric 1705f785676fSDimitry Andric // Make sure the exit state of any predecessor is consistent with the entry 1706f785676fSDimitry Andric // state. 1707f785676fSDimitry Andric for (MachineBasicBlock::const_pred_iterator I = MBB->pred_begin(), 1708f785676fSDimitry Andric E = MBB->pred_end(); I != E; ++I) { 1709f785676fSDimitry Andric if (Reachable.count(*I) && 1710f785676fSDimitry Andric (SPState[(*I)->getNumber()].ExitValue != BBState.EntryValue || 1711f785676fSDimitry Andric SPState[(*I)->getNumber()].ExitIsSetup != BBState.EntryIsSetup)) { 1712f785676fSDimitry Andric report("The exit stack state of a predecessor is inconsistent.", MBB); 1713f785676fSDimitry Andric *OS << "Predecessor BB#" << (*I)->getNumber() << " has exit state (" 1714f785676fSDimitry Andric << SPState[(*I)->getNumber()].ExitValue << ", " 1715f785676fSDimitry Andric << SPState[(*I)->getNumber()].ExitIsSetup 1716f785676fSDimitry Andric << "), while BB#" << MBB->getNumber() << " has entry state (" 1717f785676fSDimitry Andric << BBState.EntryValue << ", " << BBState.EntryIsSetup << ").\n"; 1718f785676fSDimitry Andric } 1719f785676fSDimitry Andric } 1720f785676fSDimitry Andric 1721f785676fSDimitry Andric // Make sure the entry state of any successor is consistent with the exit 1722f785676fSDimitry Andric // state. 1723f785676fSDimitry Andric for (MachineBasicBlock::const_succ_iterator I = MBB->succ_begin(), 1724f785676fSDimitry Andric E = MBB->succ_end(); I != E; ++I) { 1725f785676fSDimitry Andric if (Reachable.count(*I) && 1726f785676fSDimitry Andric (SPState[(*I)->getNumber()].EntryValue != BBState.ExitValue || 1727f785676fSDimitry Andric SPState[(*I)->getNumber()].EntryIsSetup != BBState.ExitIsSetup)) { 1728f785676fSDimitry Andric report("The entry stack state of a successor is inconsistent.", MBB); 1729f785676fSDimitry Andric *OS << "Successor BB#" << (*I)->getNumber() << " has entry state (" 1730f785676fSDimitry Andric << SPState[(*I)->getNumber()].EntryValue << ", " 1731f785676fSDimitry Andric << SPState[(*I)->getNumber()].EntryIsSetup 1732f785676fSDimitry Andric << "), while BB#" << MBB->getNumber() << " has exit state (" 1733f785676fSDimitry Andric << BBState.ExitValue << ", " << BBState.ExitIsSetup << ").\n"; 1734f785676fSDimitry Andric } 1735f785676fSDimitry Andric } 1736f785676fSDimitry Andric 1737f785676fSDimitry Andric // Make sure a basic block with return ends with zero stack adjustment. 1738f785676fSDimitry Andric if (!MBB->empty() && MBB->back().isReturn()) { 1739f785676fSDimitry Andric if (BBState.ExitIsSetup) 1740f785676fSDimitry Andric report("A return block ends with a FrameSetup.", MBB); 1741f785676fSDimitry Andric if (BBState.ExitValue) 1742f785676fSDimitry Andric report("A return block ends with a nonzero stack adjustment.", MBB); 1743f785676fSDimitry Andric } 1744f785676fSDimitry Andric } 1745f785676fSDimitry Andric } 1746