MachineVerifier.cpp revision de67a51b66964e95df05cd2192c05c77dccfa4c9
148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen//===-- MachineVerifier.cpp - Machine Code Verifier -------------*- C++ -*-===// 248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// 348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// The LLVM Compiler Infrastructure 448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// 548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source 648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// License. See LICENSE.TXT for details. 748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// 848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// 1048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// Pass to verify generated machine code. The following is checked: 1148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// 1248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// Operand counts: All explicit operands must be present. 1348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// 1448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// Register classes: All physical and virtual register operands must be 1548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// compatible with the register class required by the instruction descriptor. 1648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// 1748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// Register live intervals: Registers must be defined only once, and must be 1848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// defined before use. 1948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// 2048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// The machine code verifier is enabled from LLVMTargetMachine.cpp with the 2148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// command-line option -verify-machineinstrs, or by defining the environment 2248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// variable LLVM_VERIFY_MACHINEINSTRS to the name of a file that will receive 2348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// the verifier errors. 2448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 2548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 2648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen#include "llvm/ADT/DenseSet.h" 2748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen#include "llvm/ADT/SetOperations.h" 2848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen#include "llvm/ADT/SmallVector.h" 2948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen#include "llvm/Function.h" 3048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen#include "llvm/CodeGen/LiveVariables.h" 3148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen#include "llvm/CodeGen/MachineFunctionPass.h" 3248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen#include "llvm/CodeGen/MachineRegisterInfo.h" 3348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen#include "llvm/CodeGen/Passes.h" 3448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen#include "llvm/Target/TargetMachine.h" 3548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen#include "llvm/Target/TargetRegisterInfo.h" 3648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen#include "llvm/Target/TargetInstrInfo.h" 3748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen#include "llvm/Support/Compiler.h" 3848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen#include "llvm/Support/Debug.h" 3948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen#include <fstream> 4048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 4148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenusing namespace llvm; 4248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 4348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesennamespace { 4448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen struct VISIBILITY_HIDDEN MachineVerifier : public MachineFunctionPass { 4548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen static char ID; // Pass ID, replacement for typeid 4648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 4748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MachineVerifier(bool allowDoubleDefs = false) : 4848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MachineFunctionPass(&ID), 4948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen allowVirtDoubleDefs(allowDoubleDefs), 5048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen allowPhysDoubleDefs(allowDoubleDefs), 5148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen OutFileName(getenv("LLVM_VERIFY_MACHINEINSTRS")) 5248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen {} 5348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 5448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void getAnalysisUsage(AnalysisUsage &AU) const { 5548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen AU.setPreservesAll(); 5648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 5748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 5848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen bool runOnMachineFunction(MachineFunction &MF); 5948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 6048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const bool allowVirtDoubleDefs; 6148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const bool allowPhysDoubleDefs; 6248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 6348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const char *const OutFileName; 6448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen std::ostream *OS; 6548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const MachineFunction *MF; 6648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const TargetMachine *TM; 6748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const TargetRegisterInfo *TRI; 6848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const MachineRegisterInfo *MRI; 6948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 7048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen unsigned foundErrors; 7148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 7248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen typedef SmallVector<unsigned, 16> RegVector; 7348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen typedef DenseSet<unsigned> RegSet; 7448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen typedef DenseMap<unsigned, const MachineInstr*> RegMap; 7548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 7648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BitVector regsReserved; 7748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen RegSet regsLive; 7848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen RegVector regsDefined, regsImpDefined, regsDead, regsKilled; 7948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 8048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Add Reg and any sub-registers to RV 8148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void addRegWithSubRegs(RegVector &RV, unsigned Reg) { 8248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen RV.push_back(Reg); 8348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (TargetRegisterInfo::isPhysicalRegister(Reg)) 8448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (const unsigned *R = TRI->getSubRegisters(Reg); *R; R++) 8548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen RV.push_back(*R); 8648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 8748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 8848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Does RS contain any super-registers of Reg? 8948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen bool anySuperRegisters(const RegSet &RS, unsigned Reg) { 9048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (const unsigned *R = TRI->getSuperRegisters(Reg); *R; R++) 9148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (RS.count(*R)) 9248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen return true; 9348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen return false; 9448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 9548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 9648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen struct BBInfo { 9748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Is this MBB reachable from the MF entry point? 9848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen bool reachable; 9948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 10048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Vregs that must be live in because they are used without being 10148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // defined. Map value is the user. 10248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen RegMap vregsLiveIn; 10348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 10448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Vregs that must be dead in because they are defined without being 10548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // killed first. Map value is the defining instruction. 10648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen RegMap vregsDeadIn; 10748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 10848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Regs killed in MBB. They may be defined again, and will then be in both 10948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // regsKilled and regsLiveOut. 11048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen RegSet regsKilled; 11148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 11248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Regs defined in MBB and live out. Note that vregs passing through may 11348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // be live out without being mentioned here. 11448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen RegSet regsLiveOut; 11548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 11648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Vregs that pass through MBB untouched. This set is disjoint from 11748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // regsKilled and regsLiveOut. 11848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen RegSet vregsPassed; 11948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 12048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo() : reachable(false) {} 12148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 12248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Add register to vregsPassed if it belongs there. Return true if 12348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // anything changed. 12448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen bool addPassed(unsigned Reg) { 12548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!TargetRegisterInfo::isVirtualRegister(Reg)) 12648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen return false; 12748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (regsKilled.count(Reg) || regsLiveOut.count(Reg)) 12848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen return false; 12948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen return vregsPassed.insert(Reg).second; 13048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 13148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 13248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Same for a full set. 13348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen bool addPassed(const RegSet &RS) { 13448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen bool changed = false; 13548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (RegSet::const_iterator I = RS.begin(), E = RS.end(); I != E; ++I) 13648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (addPassed(*I)) 13748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen changed = true; 13848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen return changed; 13948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 14048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 14148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Live-out registers are either in regsLiveOut or vregsPassed. 14248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen bool isLiveOut(unsigned Reg) const { 14348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen return regsLiveOut.count(Reg) || vregsPassed.count(Reg); 14448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 14548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen }; 14648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 14748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Extra register info per MBB. 14848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen DenseMap<const MachineBasicBlock*, BBInfo> MBBInfoMap; 14948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 15048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen bool isReserved(unsigned Reg) { 15148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen return Reg < regsReserved.size() && regsReserved[Reg]; 15248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 15348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 15448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void visitMachineFunctionBefore(); 15548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void visitMachineBasicBlockBefore(const MachineBasicBlock *MBB); 15648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void visitMachineInstrBefore(const MachineInstr *MI); 15748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void visitMachineOperand(const MachineOperand *MO, unsigned MONum); 15848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void visitMachineInstrAfter(const MachineInstr *MI); 15948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void visitMachineBasicBlockAfter(const MachineBasicBlock *MBB); 16048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void visitMachineFunctionAfter(); 16148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 16248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void report(const char *msg, const MachineFunction *MF); 16348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void report(const char *msg, const MachineBasicBlock *MBB); 16448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void report(const char *msg, const MachineInstr *MI); 16548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void report(const char *msg, const MachineOperand *MO, unsigned MONum); 16648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 16748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void markReachable(const MachineBasicBlock *MBB); 16848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void calcMaxRegsPassed(); 16948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void calcMinRegsPassed(); 17048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen void checkPHIOps(const MachineBasicBlock *MBB); 17148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen }; 17248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 17348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 17448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenchar MachineVerifier::ID = 0; 17548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenstatic RegisterPass<MachineVerifier> 176de67a51b66964e95df05cd2192c05c77dccfa4c9Jakob Stoklund OlesenMachineVer("machineverifier", "Verify generated machine code"); 17748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenstatic const PassInfo *const MachineVerifyID = &MachineVer; 17848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 17948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenFunctionPass * 18048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenllvm::createMachineVerifierPass(bool allowPhysDoubleDefs) 18148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 18248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen return new MachineVerifier(allowPhysDoubleDefs); 18348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 18448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 18548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenbool 18648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::runOnMachineFunction(MachineFunction &MF) 18748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 18848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen std::ofstream OutFile; 18948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (OutFileName) { 19048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen OutFile.open(OutFileName, std::ios::out | std::ios::app); 19148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen OS = &OutFile; 19248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } else { 19348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen OS = cerr.stream(); 19448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 19548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 19648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen foundErrors = 0; 19748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 19848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen this->MF = &MF; 19948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen TM = &MF.getTarget(); 20048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen TRI = TM->getRegisterInfo(); 20148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MRI = &MF.getRegInfo(); 20248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 20348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen visitMachineFunctionBefore(); 20448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineFunction::const_iterator MFI = MF.begin(), MFE = MF.end(); 20548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MFI!=MFE; ++MFI) { 20648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen visitMachineBasicBlockBefore(MFI); 20748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineBasicBlock::const_iterator MBBI = MFI->begin(), 20848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MBBE = MFI->end(); MBBI != MBBE; ++MBBI) { 20948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen visitMachineInstrBefore(MBBI); 21048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (unsigned I = 0, E = MBBI->getNumOperands(); I != E; ++I) 21148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen visitMachineOperand(&MBBI->getOperand(I), I); 21248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen visitMachineInstrAfter(MBBI); 21348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 21448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen visitMachineBasicBlockAfter(MFI); 21548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 21648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen visitMachineFunctionAfter(); 21748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 21848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (OutFileName) 21948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen OutFile.close(); 22048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 22148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (foundErrors) { 22248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen cerr << "\nStopping with " << foundErrors << " machine code errors.\n"; 22348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen exit(1); 22448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 22548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 22648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen return false; // no changes 22748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 22848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 22948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 23048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::report(const char *msg, const MachineFunction *MF) 23148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 23248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen assert(MF); 23348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << "\n"; 23448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!foundErrors++) 23548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MF->print(OS); 23648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << "*** Bad machine code: " << msg << " ***\n" 23748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << "- function: " << MF->getFunction()->getName() << "\n"; 23848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 23948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 24048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 24148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::report(const char *msg, const MachineBasicBlock *MBB) 24248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 24348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen assert(MBB); 24448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report(msg, MBB->getParent()); 24548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << "- basic block: " << MBB->getBasicBlock()->getName() 24648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << " " << (void*)MBB 24748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << " (#" << MBB->getNumber() << ")\n"; 24848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 24948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 25048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 25148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::report(const char *msg, const MachineInstr *MI) 25248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 25348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen assert(MI); 25448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report(msg, MI->getParent()); 25548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << "- instruction: "; 25648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MI->print(OS, TM); 25748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 25848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 25948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 26048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::report(const char *msg, 26148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const MachineOperand *MO, unsigned MONum) 26248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 26348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen assert(MO); 26448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report(msg, MO->getParent()); 26548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << "- operand " << MONum << ": "; 26648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MO->print(*OS, TM); 26748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << "\n"; 26848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 26948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 27048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 27148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::markReachable(const MachineBasicBlock *MBB) 27248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 27348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo &MInfo = MBBInfoMap[MBB]; 27448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!MInfo.reachable) { 27548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MInfo.reachable = true; 27648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineBasicBlock::const_succ_iterator SuI = MBB->succ_begin(), 27748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen SuE = MBB->succ_end(); SuI != SuE; ++SuI) 27848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen markReachable(*SuI); 27948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 28048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 28148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 28248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 28348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::visitMachineFunctionBefore() 28448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 28548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen regsReserved = TRI->getReservedRegs(*MF); 28648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen markReachable(&MF->front()); 28748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 28848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 28948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 29048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) 29148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 29248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen regsLive.clear(); 29348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(), 29448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen E = MBB->livein_end(); I != E; ++I) { 29548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!TargetRegisterInfo::isPhysicalRegister(*I)) { 29648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("MBB live-in list contains non-physical register", MBB); 29748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen continue; 29848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 29948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen regsLive.insert(*I); 30048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (const unsigned *R = TRI->getSubRegisters(*I); *R; R++) 30148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen regsLive.insert(*R); 30248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 30348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen regsKilled.clear(); 30448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen regsDefined.clear(); 30548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen regsImpDefined.clear(); 30648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 30748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 30848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 30948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) 31048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 31148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const TargetInstrDesc &TI = MI->getDesc(); 31248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (MI->getNumExplicitOperands() < TI.getNumOperands()) { 31348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("Too few operands", MI); 31448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << TI.getNumOperands() << " operands expected, but " 31548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << MI->getNumExplicitOperands() << " given.\n"; 31648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 31748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!TI.isVariadic()) { 31848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (MI->getNumExplicitOperands() > TI.getNumOperands()) { 31948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("Too many operands", MI); 32048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << TI.getNumOperands() << " operands expected, but " 32148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << MI->getNumExplicitOperands() << " given.\n"; 32248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 32348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 32448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 32548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 32648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 32748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) 32848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 32948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const MachineInstr *MI = MO->getParent(); 33044b27e5c7522e0e2e1a48efefceab8508db711b9Jakob Stoklund Olesen const TargetInstrDesc &TI = MI->getDesc(); 33144b27e5c7522e0e2e1a48efefceab8508db711b9Jakob Stoklund Olesen 33244b27e5c7522e0e2e1a48efefceab8508db711b9Jakob Stoklund Olesen // The first TI.NumDefs operands must be explicit register defines 33344b27e5c7522e0e2e1a48efefceab8508db711b9Jakob Stoklund Olesen if (MONum < TI.getNumDefs()) { 33444b27e5c7522e0e2e1a48efefceab8508db711b9Jakob Stoklund Olesen if (!MO->isReg()) 33544b27e5c7522e0e2e1a48efefceab8508db711b9Jakob Stoklund Olesen report("Explicit definition must be a register", MO, MONum); 33644b27e5c7522e0e2e1a48efefceab8508db711b9Jakob Stoklund Olesen else if (!MO->isDef()) 33744b27e5c7522e0e2e1a48efefceab8508db711b9Jakob Stoklund Olesen report("Explicit definition marked as use", MO, MONum); 33844b27e5c7522e0e2e1a48efefceab8508db711b9Jakob Stoklund Olesen else if (MO->isImplicit()) 33944b27e5c7522e0e2e1a48efefceab8508db711b9Jakob Stoklund Olesen report("Explicit definition marked as implicit", MO, MONum); 34044b27e5c7522e0e2e1a48efefceab8508db711b9Jakob Stoklund Olesen } 34144b27e5c7522e0e2e1a48efefceab8508db711b9Jakob Stoklund Olesen 34248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen switch (MO->getType()) { 34348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen case MachineOperand::MO_Register: { 34448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const unsigned Reg = MO->getReg(); 34548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!Reg) 34648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen return; 34748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 34848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Check Live Variables. 34948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (MO->isUse()) { 35048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (MO->isKill()) { 35148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen addRegWithSubRegs(regsKilled, Reg); 35248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } else { 35348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // TwoAddress instr modyfying a reg is treated as kill+def. 35448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen unsigned defIdx; 35548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (MI->isRegTiedToDefOperand(MONum, &defIdx) && 35648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MI->getOperand(defIdx).getReg() == Reg) 35748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen addRegWithSubRegs(regsKilled, Reg); 35848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 35948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Explicit use of a dead register. 360e556720ea8d60581c95d3ca3f9175a3688150d95Duncan Sands if (!MO->isImplicit() && !regsLive.count(Reg)) { 36148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (TargetRegisterInfo::isPhysicalRegister(Reg)) { 36248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Reserved registers may be used even when 'dead'. 36348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!isReserved(Reg)) 36448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("Using an undefined physical register", MO, MONum); 36548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } else { 36648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo &MInfo = MBBInfoMap[MI->getParent()]; 36748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // We don't know which virtual registers are live in, so only complain 36848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // if vreg was killed in this MBB. Otherwise keep track of vregs that 36948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // must be live in. PHI instructions are handled separately. 37048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (MInfo.regsKilled.count(Reg)) 37148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("Using a killed virtual register", MO, MONum); 37248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen else if (MI->getOpcode() != TargetInstrInfo::PHI) 37348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MInfo.vregsLiveIn.insert(std::make_pair(Reg, MI)); 37448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 375e556720ea8d60581c95d3ca3f9175a3688150d95Duncan Sands } 37648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } else { 37748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Register defined. 37848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // TODO: verify that earlyclobber ops are not used. 37948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (MO->isImplicit()) 38048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen addRegWithSubRegs(regsImpDefined, Reg); 38148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen else 38248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen addRegWithSubRegs(regsDefined, Reg); 38348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 38448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (MO->isDead()) 38548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen addRegWithSubRegs(regsDead, Reg); 38648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 38748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 38848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Check register classes. 38948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (MONum < TI.getNumOperands() && !MO->isImplicit()) { 39048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const TargetOperandInfo &TOI = TI.OpInfo[MONum]; 39148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen unsigned SubIdx = MO->getSubReg(); 39248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 39348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (TargetRegisterInfo::isPhysicalRegister(Reg)) { 39448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen unsigned sr = Reg; 39548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (SubIdx) { 39648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen unsigned s = TRI->getSubReg(Reg, SubIdx); 39748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!s) { 39848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("Invalid subregister index for physical register", 39948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MO, MONum); 40048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen return; 40148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 40248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen sr = s; 40348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 40448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (TOI.RegClass) { 40548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const TargetRegisterClass *DRC = TRI->getRegClass(TOI.RegClass); 40648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!DRC->contains(sr)) { 40748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("Illegal physical register for instruction", MO, MONum); 40848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << TRI->getName(sr) << " is not a " 40948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << DRC->getName() << " register.\n"; 41048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 41148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 41248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } else { 41348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Virtual register. 41448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const TargetRegisterClass *RC = MRI->getRegClass(Reg); 41548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (SubIdx) { 41648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (RC->subregclasses_begin()+SubIdx >= RC->subregclasses_end()) { 41748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("Invalid subregister index for virtual register", MO, MONum); 41848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen return; 41948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 42048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen RC = *(RC->subregclasses_begin()+SubIdx); 42148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 42248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (TOI.RegClass) { 42348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const TargetRegisterClass *DRC = TRI->getRegClass(TOI.RegClass); 42448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (RC != DRC && !RC->hasSuperClass(DRC)) { 42548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("Illegal virtual register for instruction", MO, MONum); 42648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << "Expected a " << DRC->getName() << " register, but got a " 42748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << RC->getName() << " register\n"; 42848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 42948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 43048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 43148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 43248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen break; 43348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 43448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Can PHI instrs refer to MBBs not in the CFG? X86 and ARM do. 43548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // case MachineOperand::MO_MachineBasicBlock: 43648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // if (MI->getOpcode() == TargetInstrInfo::PHI) { 43748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // if (!MO->getMBB()->isSuccessor(MI->getParent())) 43848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // report("PHI operand is not in the CFG", MO, MONum); 43948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // } 44048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // break; 44148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen default: 44248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen break; 44348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 44448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 44548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 44648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 44748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::visitMachineInstrAfter(const MachineInstr *MI) 44848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 44948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo &MInfo = MBBInfoMap[MI->getParent()]; 45048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen set_union(MInfo.regsKilled, regsKilled); 45148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen set_subtract(regsLive, regsKilled); 45248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen regsKilled.clear(); 45348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 45448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (RegVector::const_iterator I = regsDefined.begin(), 45548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen E = regsDefined.end(); I != E; ++I) { 45648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (regsLive.count(*I)) { 45748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (TargetRegisterInfo::isPhysicalRegister(*I)) { 45848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // We allow double defines to physical registers with live 45948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // super-registers. 460d6fb97761e65fd0db19cd48e22dd05d211822d47Jakob Stoklund Olesen if (!allowPhysDoubleDefs && !isReserved(*I) && 461d6fb97761e65fd0db19cd48e22dd05d211822d47Jakob Stoklund Olesen !anySuperRegisters(regsLive, *I)) { 46248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("Redefining a live physical register", MI); 46348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << "Register " << TRI->getName(*I) 46448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << " was defined but already live.\n"; 46548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 46648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } else { 46748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!allowVirtDoubleDefs) { 46848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("Redefining a live virtual register", MI); 46948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << "Virtual register %reg" << *I 47048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << " was defined but already live.\n"; 47148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 47248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 47348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } else if (TargetRegisterInfo::isVirtualRegister(*I) && 47448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen !MInfo.regsKilled.count(*I)) { 47548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Virtual register defined without being killed first must be dead on 47648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // entry. 47748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MInfo.vregsDeadIn.insert(std::make_pair(*I, MI)); 47848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 47948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 48048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 48148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen set_union(regsLive, regsDefined); regsDefined.clear(); 48248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen set_union(regsLive, regsImpDefined); regsImpDefined.clear(); 48348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen set_subtract(regsLive, regsDead); regsDead.clear(); 48448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 48548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 48648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 48748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::visitMachineBasicBlockAfter(const MachineBasicBlock *MBB) 48848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 48948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MBBInfoMap[MBB].regsLiveOut = regsLive; 49048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen regsLive.clear(); 49148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 49248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 49348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// Calculate the largest possible vregsPassed sets. These are the registers that 49448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// can pass through an MBB live, but may not be live every time. It is assumed 49548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// that all vregsPassed sets are empty before the call. 49648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 49748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::calcMaxRegsPassed() 49848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 49948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // First push live-out regs to successors' vregsPassed. Remember the MBBs that 50048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // have any vregsPassed. 50148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen DenseSet<const MachineBasicBlock*> todo; 50248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineFunction::const_iterator MFI = MF->begin(), MFE = MF->end(); 50348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MFI != MFE; ++MFI) { 50448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const MachineBasicBlock &MBB(*MFI); 50548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo &MInfo = MBBInfoMap[&MBB]; 50648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!MInfo.reachable) 50748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen continue; 50848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineBasicBlock::const_succ_iterator SuI = MBB.succ_begin(), 50948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen SuE = MBB.succ_end(); SuI != SuE; ++SuI) { 51048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo &SInfo = MBBInfoMap[*SuI]; 51148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (SInfo.addPassed(MInfo.regsLiveOut)) 51248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen todo.insert(*SuI); 51348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 51448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 51548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 51648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Iteratively push vregsPassed to successors. This will converge to the same 51748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // final state regardless of DenseSet iteration order. 51848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen while (!todo.empty()) { 51948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const MachineBasicBlock *MBB = *todo.begin(); 52048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen todo.erase(MBB); 52148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo &MInfo = MBBInfoMap[MBB]; 52248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineBasicBlock::const_succ_iterator SuI = MBB->succ_begin(), 52348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen SuE = MBB->succ_end(); SuI != SuE; ++SuI) { 52448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (*SuI == MBB) 52548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen continue; 52648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo &SInfo = MBBInfoMap[*SuI]; 52748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (SInfo.addPassed(MInfo.vregsPassed)) 52848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen todo.insert(*SuI); 52948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 53048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 53148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 53248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 53348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// Calculate the minimum vregsPassed set. These are the registers that always 53448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// pass live through an MBB. The calculation assumes that calcMaxRegsPassed has 53548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// been called earlier. 53648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 53748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::calcMinRegsPassed() 53848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 53948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen DenseSet<const MachineBasicBlock*> todo; 54048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineFunction::const_iterator MFI = MF->begin(), MFE = MF->end(); 54148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MFI != MFE; ++MFI) 54248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen todo.insert(MFI); 54348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 54448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen while (!todo.empty()) { 54548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const MachineBasicBlock *MBB = *todo.begin(); 54648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen todo.erase(MBB); 54748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo &MInfo = MBBInfoMap[MBB]; 54848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 54948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Remove entries from vRegsPassed that are not live out from all 55048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // reachable predecessors. 55148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen RegSet dead; 55248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (RegSet::iterator I = MInfo.vregsPassed.begin(), 55348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen E = MInfo.vregsPassed.end(); I != E; ++I) { 55448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineBasicBlock::const_pred_iterator PrI = MBB->pred_begin(), 55548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen PrE = MBB->pred_end(); PrI != PrE; ++PrI) { 55648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo &PrInfo = MBBInfoMap[*PrI]; 55748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (PrInfo.reachable && !PrInfo.isLiveOut(*I)) { 55848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen dead.insert(*I); 55948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen break; 56048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 56148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 56248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 56348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // If any regs removed, we need to recheck successors. 56448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!dead.empty()) { 56548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen set_subtract(MInfo.vregsPassed, dead); 56648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen todo.insert(MBB->succ_begin(), MBB->succ_end()); 56748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 56848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 56948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 57048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 57148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// Check PHI instructions at the beginning of MBB. It is assumed that 57248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen// calcMinRegsPassed has been run so BBInfo::isLiveOut is valid. 57348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 57448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::checkPHIOps(const MachineBasicBlock *MBB) 57548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 57648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineBasicBlock::const_iterator BBI = MBB->begin(), BBE = MBB->end(); 57748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBI != BBE && BBI->getOpcode() == TargetInstrInfo::PHI; ++BBI) { 57848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen DenseSet<const MachineBasicBlock*> seen; 57948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 58048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (unsigned i = 1, e = BBI->getNumOperands(); i != e; i += 2) { 58148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen unsigned Reg = BBI->getOperand(i).getReg(); 58248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen const MachineBasicBlock *Pre = BBI->getOperand(i + 1).getMBB(); 58348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!Pre->isSuccessor(MBB)) 58448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen continue; 58548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen seen.insert(Pre); 58648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo &PrInfo = MBBInfoMap[Pre]; 58748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (PrInfo.reachable && !PrInfo.isLiveOut(Reg)) 58848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("PHI operand is not live-out from predecessor", 58948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen &BBI->getOperand(i), i); 59048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 59148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 59248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Did we see all predecessors? 59348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineBasicBlock::const_pred_iterator PrI = MBB->pred_begin(), 59448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen PrE = MBB->pred_end(); PrI != PrE; ++PrI) { 59548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!seen.count(*PrI)) { 59648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("Missing PHI operand", BBI); 59748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << "MBB #" << (*PrI)->getNumber() 59848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << " is a predecessor according to the CFG.\n"; 59948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 60048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 60148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 60248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 60348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 60448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesenvoid 60548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund OlesenMachineVerifier::visitMachineFunctionAfter() 60648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen{ 60748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen calcMaxRegsPassed(); 60848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 60948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // With the maximal set of vregsPassed we can verify dead-in registers. 61048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineFunction::const_iterator MFI = MF->begin(), MFE = MF->end(); 61148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MFI != MFE; ++MFI) { 61248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo &MInfo = MBBInfoMap[MFI]; 61348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 61448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Skip unreachable MBBs. 61548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!MInfo.reachable) 61648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen continue; 61748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 61848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineBasicBlock::const_pred_iterator PrI = MFI->pred_begin(), 61948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen PrE = MFI->pred_end(); PrI != PrE; ++PrI) { 62048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo &PrInfo = MBBInfoMap[*PrI]; 62148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!PrInfo.reachable) 62248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen continue; 62348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 62448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Verify physical live-ins. EH landing pads have magic live-ins so we 62548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // ignore them. 62648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!MFI->isLandingPad()) { 62748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineBasicBlock::const_livein_iterator I = MFI->livein_begin(), 62848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen E = MFI->livein_end(); I != E; ++I) { 62948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (TargetRegisterInfo::isPhysicalRegister(*I) && 630d6fb97761e65fd0db19cd48e22dd05d211822d47Jakob Stoklund Olesen !isReserved (*I) && !PrInfo.isLiveOut(*I)) { 63148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("Live-in physical register is not live-out from predecessor", 63248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MFI); 63348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << "Register " << TRI->getName(*I) 63448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << " is not live-out from MBB #" << (*PrI)->getNumber() 63548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << ".\n"; 63648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 63748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 63848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 63948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 64048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 64148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Verify dead-in virtual registers. 64248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!allowVirtDoubleDefs) { 64348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (RegMap::iterator I = MInfo.vregsDeadIn.begin(), 64448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen E = MInfo.vregsDeadIn.end(); I != E; ++I) { 64548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // DeadIn register must be in neither regsLiveOut or vregsPassed of 64648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // any predecessor. 64748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (PrInfo.isLiveOut(I->first)) { 64848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("Live-in virtual register redefined", I->second); 64948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << "Register %reg" << I->first 65048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << " was live-out from predecessor MBB #" 65148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << (*PrI)->getNumber() << ".\n"; 65248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 65348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 65448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 65548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 65648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 65748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 65848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen calcMinRegsPassed(); 65948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 66048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // With the minimal set of vregsPassed we can verify live-in virtual 66148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // registers, including PHI instructions. 66248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineFunction::const_iterator MFI = MF->begin(), MFE = MF->end(); 66348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen MFI != MFE; ++MFI) { 66448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo &MInfo = MBBInfoMap[MFI]; 66548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 66648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen // Skip unreachable MBBs. 66748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!MInfo.reachable) 66848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen continue; 66948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 67048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen checkPHIOps(MFI); 67148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 67248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (MachineBasicBlock::const_pred_iterator PrI = MFI->pred_begin(), 67348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen PrE = MFI->pred_end(); PrI != PrE; ++PrI) { 67448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen BBInfo &PrInfo = MBBInfoMap[*PrI]; 67548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!PrInfo.reachable) 67648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen continue; 67748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen 67848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen for (RegMap::iterator I = MInfo.vregsLiveIn.begin(), 67948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen E = MInfo.vregsLiveIn.end(); I != E; ++I) { 68048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen if (!PrInfo.isLiveOut(I->first)) { 68148872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen report("Used virtual register is not live-in", I->second); 68248872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen *OS << "Register %reg" << I->first 68348872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << " is not live-out from predecessor MBB #" 68448872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << (*PrI)->getNumber() 68548872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen << ".\n"; 68648872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 68748872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 68848872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 68948872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen } 69048872e0d84b47769be6c13ae98bf88468b59d921Jakob Stoklund Olesen} 691