Home | History | Annotate | Download | only in CodeGen
      1 //===-- ExpandPostRAPseudos.cpp - Pseudo instruction expansion pass -------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file defines a pass that expands COPY and SUBREG_TO_REG pseudo
     11 // instructions after register allocation.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #define DEBUG_TYPE "postrapseudos"
     16 #include "llvm/CodeGen/Passes.h"
     17 #include "llvm/Function.h"
     18 #include "llvm/CodeGen/MachineFunctionPass.h"
     19 #include "llvm/CodeGen/MachineInstr.h"
     20 #include "llvm/CodeGen/MachineInstrBuilder.h"
     21 #include "llvm/CodeGen/MachineRegisterInfo.h"
     22 #include "llvm/Target/TargetRegisterInfo.h"
     23 #include "llvm/Target/TargetInstrInfo.h"
     24 #include "llvm/Target/TargetMachine.h"
     25 #include "llvm/Support/Debug.h"
     26 #include "llvm/Support/raw_ostream.h"
     27 using namespace llvm;
     28 
     29 namespace {
     30 struct ExpandPostRA : public MachineFunctionPass {
     31 private:
     32   const TargetRegisterInfo *TRI;
     33   const TargetInstrInfo *TII;
     34 
     35 public:
     36   static char ID; // Pass identification, replacement for typeid
     37   ExpandPostRA() : MachineFunctionPass(ID) {}
     38 
     39   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
     40     AU.setPreservesCFG();
     41     AU.addPreservedID(MachineLoopInfoID);
     42     AU.addPreservedID(MachineDominatorsID);
     43     MachineFunctionPass::getAnalysisUsage(AU);
     44   }
     45 
     46   /// runOnMachineFunction - pass entry point
     47   bool runOnMachineFunction(MachineFunction&);
     48 
     49 private:
     50   bool LowerSubregToReg(MachineInstr *MI);
     51   bool LowerCopy(MachineInstr *MI);
     52 
     53   void TransferDeadFlag(MachineInstr *MI, unsigned DstReg,
     54                         const TargetRegisterInfo *TRI);
     55   void TransferImplicitDefs(MachineInstr *MI);
     56 };
     57 } // end anonymous namespace
     58 
     59 char ExpandPostRA::ID = 0;
     60 char &llvm::ExpandPostRAPseudosID = ExpandPostRA::ID;
     61 
     62 INITIALIZE_PASS(ExpandPostRA, "postrapseudos",
     63                 "Post-RA pseudo instruction expansion pass", false, false)
     64 
     65 /// TransferDeadFlag - MI is a pseudo-instruction with DstReg dead,
     66 /// and the lowered replacement instructions immediately precede it.
     67 /// Mark the replacement instructions with the dead flag.
     68 void
     69 ExpandPostRA::TransferDeadFlag(MachineInstr *MI, unsigned DstReg,
     70                                const TargetRegisterInfo *TRI) {
     71   for (MachineBasicBlock::iterator MII =
     72         prior(MachineBasicBlock::iterator(MI)); ; --MII) {
     73     if (MII->addRegisterDead(DstReg, TRI))
     74       break;
     75     assert(MII != MI->getParent()->begin() &&
     76            "copyPhysReg output doesn't reference destination register!");
     77   }
     78 }
     79 
     80 /// TransferImplicitDefs - MI is a pseudo-instruction, and the lowered
     81 /// replacement instructions immediately precede it.  Copy any implicit-def
     82 /// operands from MI to the replacement instruction.
     83 void
     84 ExpandPostRA::TransferImplicitDefs(MachineInstr *MI) {
     85   MachineBasicBlock::iterator CopyMI = MI;
     86   --CopyMI;
     87 
     88   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
     89     MachineOperand &MO = MI->getOperand(i);
     90     if (!MO.isReg() || !MO.isImplicit() || MO.isUse())
     91       continue;
     92     CopyMI->addOperand(MachineOperand::CreateReg(MO.getReg(), true, true));
     93   }
     94 }
     95 
     96 bool ExpandPostRA::LowerSubregToReg(MachineInstr *MI) {
     97   MachineBasicBlock *MBB = MI->getParent();
     98   assert((MI->getOperand(0).isReg() && MI->getOperand(0).isDef()) &&
     99          MI->getOperand(1).isImm() &&
    100          (MI->getOperand(2).isReg() && MI->getOperand(2).isUse()) &&
    101           MI->getOperand(3).isImm() && "Invalid subreg_to_reg");
    102 
    103   unsigned DstReg  = MI->getOperand(0).getReg();
    104   unsigned InsReg  = MI->getOperand(2).getReg();
    105   assert(!MI->getOperand(2).getSubReg() && "SubIdx on physreg?");
    106   unsigned SubIdx  = MI->getOperand(3).getImm();
    107 
    108   assert(SubIdx != 0 && "Invalid index for insert_subreg");
    109   unsigned DstSubReg = TRI->getSubReg(DstReg, SubIdx);
    110 
    111   assert(TargetRegisterInfo::isPhysicalRegister(DstReg) &&
    112          "Insert destination must be in a physical register");
    113   assert(TargetRegisterInfo::isPhysicalRegister(InsReg) &&
    114          "Inserted value must be in a physical register");
    115 
    116   DEBUG(dbgs() << "subreg: CONVERTING: " << *MI);
    117 
    118   if (DstSubReg == InsReg) {
    119     // No need to insert an identify copy instruction.
    120     // Watch out for case like this:
    121     // %RAX<def> = SUBREG_TO_REG 0, %EAX<kill>, 3
    122     // We must leave %RAX live.
    123     if (DstReg != InsReg) {
    124       MI->setDesc(TII->get(TargetOpcode::KILL));
    125       MI->RemoveOperand(3);     // SubIdx
    126       MI->RemoveOperand(1);     // Imm
    127       DEBUG(dbgs() << "subreg: replace by: " << *MI);
    128       return true;
    129     }
    130     DEBUG(dbgs() << "subreg: eliminated!");
    131   } else {
    132     TII->copyPhysReg(*MBB, MI, MI->getDebugLoc(), DstSubReg, InsReg,
    133                      MI->getOperand(2).isKill());
    134     // Transfer the kill/dead flags, if needed.
    135     if (MI->getOperand(0).isDead())
    136       TransferDeadFlag(MI, DstSubReg, TRI);
    137     DEBUG({
    138         MachineBasicBlock::iterator dMI = MI;
    139         dbgs() << "subreg: " << *(--dMI);
    140       });
    141   }
    142 
    143   DEBUG(dbgs() << '\n');
    144   MBB->erase(MI);
    145   return true;
    146 }
    147 
    148 bool ExpandPostRA::LowerCopy(MachineInstr *MI) {
    149   MachineOperand &DstMO = MI->getOperand(0);
    150   MachineOperand &SrcMO = MI->getOperand(1);
    151 
    152   if (SrcMO.getReg() == DstMO.getReg()) {
    153     DEBUG(dbgs() << "identity copy: " << *MI);
    154     // No need to insert an identity copy instruction, but replace with a KILL
    155     // if liveness is changed.
    156     if (DstMO.isDead() || SrcMO.isUndef() || MI->getNumOperands() > 2) {
    157       // We must make sure the super-register gets killed. Replace the
    158       // instruction with KILL.
    159       MI->setDesc(TII->get(TargetOpcode::KILL));
    160       DEBUG(dbgs() << "replaced by:   " << *MI);
    161       return true;
    162     }
    163     // Vanilla identity copy.
    164     MI->eraseFromParent();
    165     return true;
    166   }
    167 
    168   DEBUG(dbgs() << "real copy:   " << *MI);
    169   TII->copyPhysReg(*MI->getParent(), MI, MI->getDebugLoc(),
    170                    DstMO.getReg(), SrcMO.getReg(), SrcMO.isKill());
    171 
    172   if (DstMO.isDead())
    173     TransferDeadFlag(MI, DstMO.getReg(), TRI);
    174   if (MI->getNumOperands() > 2)
    175     TransferImplicitDefs(MI);
    176   DEBUG({
    177     MachineBasicBlock::iterator dMI = MI;
    178     dbgs() << "replaced by: " << *(--dMI);
    179   });
    180   MI->eraseFromParent();
    181   return true;
    182 }
    183 
    184 /// runOnMachineFunction - Reduce subregister inserts and extracts to register
    185 /// copies.
    186 ///
    187 bool ExpandPostRA::runOnMachineFunction(MachineFunction &MF) {
    188   DEBUG(dbgs() << "Machine Function\n"
    189                << "********** EXPANDING POST-RA PSEUDO INSTRS **********\n"
    190                << "********** Function: "
    191                << MF.getFunction()->getName() << '\n');
    192   TRI = MF.getTarget().getRegisterInfo();
    193   TII = MF.getTarget().getInstrInfo();
    194 
    195   bool MadeChange = false;
    196 
    197   for (MachineFunction::iterator mbbi = MF.begin(), mbbe = MF.end();
    198        mbbi != mbbe; ++mbbi) {
    199     for (MachineBasicBlock::iterator mi = mbbi->begin(), me = mbbi->end();
    200          mi != me;) {
    201       MachineInstr *MI = mi;
    202       // Advance iterator here because MI may be erased.
    203       ++mi;
    204 
    205       // Only expand pseudos.
    206       if (!MI->isPseudo())
    207         continue;
    208 
    209       // Give targets a chance to expand even standard pseudos.
    210       if (TII->expandPostRAPseudo(MI)) {
    211         MadeChange = true;
    212         continue;
    213       }
    214 
    215       // Expand standard pseudos.
    216       switch (MI->getOpcode()) {
    217       case TargetOpcode::SUBREG_TO_REG:
    218         MadeChange |= LowerSubregToReg(MI);
    219         break;
    220       case TargetOpcode::COPY:
    221         MadeChange |= LowerCopy(MI);
    222         break;
    223       case TargetOpcode::DBG_VALUE:
    224         continue;
    225       case TargetOpcode::INSERT_SUBREG:
    226       case TargetOpcode::EXTRACT_SUBREG:
    227         llvm_unreachable("Sub-register pseudos should have been eliminated.");
    228       }
    229     }
    230   }
    231 
    232   return MadeChange;
    233 }
    234