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