LLVM API Documentation

LowerSubregs.cpp

Go to the documentation of this file.
00001 //===-- LowerSubregs.cpp - Subregister Lowering instruction pass ----------===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This file defines a MachineFunction pass which runs after register
00011 // allocation that turns subreg insert/extract instructions into register
00012 // copies, as needed. This ensures correct codegen even if the coalescer
00013 // isn't able to remove all subreg instructions.
00014 //
00015 //===----------------------------------------------------------------------===//
00016 
00017 #define DEBUG_TYPE "lowersubregs"
00018 #include "llvm/CodeGen/Passes.h"
00019 #include "llvm/Function.h"
00020 #include "llvm/CodeGen/MachineFunctionPass.h"
00021 #include "llvm/CodeGen/MachineInstr.h"
00022 #include "llvm/CodeGen/MachineRegisterInfo.h"
00023 #include "llvm/Target/TargetRegisterInfo.h"
00024 #include "llvm/Target/TargetInstrInfo.h"
00025 #include "llvm/Target/TargetMachine.h"
00026 #include "llvm/Support/Debug.h"
00027 #include "llvm/Support/Compiler.h"
00028 using namespace llvm;
00029 
00030 namespace {
00031   struct VISIBILITY_HIDDEN LowerSubregsInstructionPass
00032    : public MachineFunctionPass {
00033     static char ID; // Pass identification, replacement for typeid
00034     LowerSubregsInstructionPass() : MachineFunctionPass(&ID) {}
00035     
00036     const char *getPassName() const {
00037       return "Subregister lowering instruction pass";
00038     }
00039 
00040     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
00041       AU.addPreservedID(MachineLoopInfoID);
00042       AU.addPreservedID(MachineDominatorsID);
00043       MachineFunctionPass::getAnalysisUsage(AU);
00044     }
00045 
00046     /// runOnMachineFunction - pass entry point
00047     bool runOnMachineFunction(MachineFunction&);
00048     
00049     bool LowerExtract(MachineInstr *MI);
00050     bool LowerInsert(MachineInstr *MI);
00051     bool LowerSubregToReg(MachineInstr *MI);
00052 
00053     void TransferDeadFlag(MachineInstr *MI, unsigned DstReg,
00054                           const TargetRegisterInfo &TRI);
00055     void TransferKillFlag(MachineInstr *MI, unsigned SrcReg,
00056                           const TargetRegisterInfo &TRI);
00057   };
00058 
00059   char LowerSubregsInstructionPass::ID = 0;
00060 }
00061 
00062 FunctionPass *llvm::createLowerSubregsPass() { 
00063   return new LowerSubregsInstructionPass(); 
00064 }
00065 
00066 /// TransferDeadFlag - MI is a pseudo-instruction with DstReg dead,
00067 /// and the lowered replacement instructions immediately precede it.
00068 /// Mark the replacement instructions with the dead flag.
00069 void
00070 LowerSubregsInstructionPass::TransferDeadFlag(MachineInstr *MI,
00071                                               unsigned DstReg,
00072                                               const TargetRegisterInfo &TRI) {
00073   for (MachineBasicBlock::iterator MII =
00074         prior(MachineBasicBlock::iterator(MI)); ; --MII) {
00075     if (MII->addRegisterDead(DstReg, &TRI))
00076       break;
00077     assert(MII != MI->getParent()->begin() &&
00078            "copyRegToReg output doesn't reference destination register!");
00079   }
00080 }
00081 
00082 /// TransferKillFlag - MI is a pseudo-instruction with SrcReg killed,
00083 /// and the lowered replacement instructions immediately precede it.
00084 /// Mark the replacement instructions with the kill flag.
00085 void
00086 LowerSubregsInstructionPass::TransferKillFlag(MachineInstr *MI,
00087                                               unsigned SrcReg,
00088                                               const TargetRegisterInfo &TRI) {
00089   for (MachineBasicBlock::iterator MII =
00090         prior(MachineBasicBlock::iterator(MI)); ; --MII) {
00091     if (MII->addRegisterKilled(SrcReg, &TRI))
00092       break;
00093     assert(MII != MI->getParent()->begin() &&
00094            "copyRegToReg output doesn't reference source register!");
00095   }
00096 }
00097 
00098 bool LowerSubregsInstructionPass::LowerExtract(MachineInstr *MI) {
00099   MachineBasicBlock *MBB = MI->getParent();
00100   MachineFunction &MF = *MBB->getParent();
00101   const TargetRegisterInfo &TRI = *MF.getTarget().getRegisterInfo();
00102   const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
00103   
00104   assert(MI->getOperand(0).isReg() && MI->getOperand(0).isDef() &&
00105          MI->getOperand(1).isReg() && MI->getOperand(1).isUse() &&
00106          MI->getOperand(2).isImm() && "Malformed extract_subreg");
00107 
00108   unsigned DstReg   = MI->getOperand(0).getReg();
00109   unsigned SuperReg = MI->getOperand(1).getReg();
00110   unsigned SubIdx   = MI->getOperand(2).getImm();
00111   unsigned SrcReg   = TRI.getSubReg(SuperReg, SubIdx);
00112 
00113   assert(TargetRegisterInfo::isPhysicalRegister(SuperReg) &&
00114          "Extract supperg source must be a physical register");
00115   assert(TargetRegisterInfo::isPhysicalRegister(DstReg) &&
00116          "Extract destination must be in a physical register");
00117          
00118   DOUT << "subreg: CONVERTING: " << *MI;
00119 
00120   if (SrcReg == DstReg) {
00121     // No need to insert an identify copy instruction.
00122     DOUT << "subreg: eliminated!";
00123     // Find the kill of the destination register's live range, and insert
00124     // a kill of the source register at that point.
00125     if (MI->getOperand(1).isKill() && !MI->getOperand(0).isDead())
00126       for (MachineBasicBlock::iterator MII =
00127              next(MachineBasicBlock::iterator(MI));
00128            MII != MBB->end(); ++MII)
00129         if (MII->killsRegister(DstReg, &TRI)) {
00130           MII->addRegisterKilled(SuperReg, &TRI, /*AddIfNotFound=*/true);
00131           break;
00132         }
00133   } else {
00134     // Insert copy
00135     const TargetRegisterClass *TRC = TRI.getPhysicalRegisterRegClass(DstReg);
00136     assert(TRC == TRI.getPhysicalRegisterRegClass(SrcReg) &&
00137             "Extract subreg and Dst must be of same register class");
00138     TII.copyRegToReg(*MBB, MI, DstReg, SrcReg, TRC, TRC);
00139     // Transfer the kill/dead flags, if needed.
00140     if (MI->getOperand(0).isDead())
00141       TransferDeadFlag(MI, DstReg, TRI);
00142     if (MI->getOperand(1).isKill())
00143       TransferKillFlag(MI, SrcReg, TRI);
00144 
00145 #ifndef NDEBUG
00146     MachineBasicBlock::iterator dMI = MI;
00147     DOUT << "subreg: " << *(--dMI);
00148 #endif
00149   }
00150 
00151   DOUT << "\n";
00152   MBB->erase(MI);
00153   return true;
00154 }
00155 
00156 bool LowerSubregsInstructionPass::LowerSubregToReg(MachineInstr *MI) {
00157   MachineBasicBlock *MBB = MI->getParent();
00158   MachineFunction &MF = *MBB->getParent();
00159   const TargetRegisterInfo &TRI = *MF.getTarget().getRegisterInfo(); 
00160   const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
00161   assert((MI->getOperand(0).isReg() && MI->getOperand(0).isDef()) &&
00162          MI->getOperand(1).isImm() &&
00163          (MI->getOperand(2).isReg() && MI->getOperand(2).isUse()) &&
00164           MI->getOperand(3).isImm() && "Invalid subreg_to_reg");
00165           
00166   unsigned DstReg  = MI->getOperand(0).getReg();
00167   unsigned InsReg  = MI->getOperand(2).getReg();
00168   unsigned SubIdx  = MI->getOperand(3).getImm();     
00169 
00170   assert(SubIdx != 0 && "Invalid index for insert_subreg");
00171   unsigned DstSubReg = TRI.getSubReg(DstReg, SubIdx);
00172   
00173   assert(TargetRegisterInfo::isPhysicalRegister(DstReg) &&
00174          "Insert destination must be in a physical register");
00175   assert(TargetRegisterInfo::isPhysicalRegister(InsReg) &&
00176          "Inserted value must be in a physical register");
00177 
00178   DOUT << "subreg: CONVERTING: " << *MI;
00179 
00180   if (DstSubReg == InsReg) {
00181     // No need to insert an identify copy instruction.
00182     DOUT << "subreg: eliminated!";
00183   } else {
00184     // Insert sub-register copy
00185     const TargetRegisterClass *TRC0= TRI.getPhysicalRegisterRegClass(DstSubReg);
00186     const TargetRegisterClass *TRC1= TRI.getPhysicalRegisterRegClass(InsReg);
00187     TII.copyRegToReg(*MBB, MI, DstSubReg, InsReg, TRC0, TRC1);
00188     // Transfer the kill/dead flags, if needed.
00189     if (MI->getOperand(0).isDead())
00190       TransferDeadFlag(MI, DstSubReg, TRI);
00191     if (MI->getOperand(2).isKill())
00192       TransferKillFlag(MI, InsReg, TRI);
00193 
00194 #ifndef NDEBUG
00195     MachineBasicBlock::iterator dMI = MI;
00196     DOUT << "subreg: " << *(--dMI);
00197 #endif
00198   }
00199 
00200   DOUT << "\n";
00201   MBB->erase(MI);
00202   return true;                    
00203 }
00204 
00205 bool LowerSubregsInstructionPass::LowerInsert(MachineInstr *MI) {
00206   MachineBasicBlock *MBB = MI->getParent();
00207   MachineFunction &MF = *MBB->getParent();
00208   const TargetRegisterInfo &TRI = *MF.getTarget().getRegisterInfo(); 
00209   const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
00210   assert((MI->getOperand(0).isReg() && MI->getOperand(0).isDef()) &&
00211          (MI->getOperand(1).isReg() && MI->getOperand(1).isUse()) &&
00212          (MI->getOperand(2).isReg() && MI->getOperand(2).isUse()) &&
00213           MI->getOperand(3).isImm() && "Invalid insert_subreg");
00214           
00215   unsigned DstReg = MI->getOperand(0).getReg();
00216 #ifndef NDEBUG
00217   unsigned SrcReg = MI->getOperand(1).getReg();
00218 #endif
00219   unsigned InsReg = MI->getOperand(2).getReg();
00220   unsigned SubIdx = MI->getOperand(3).getImm();     
00221 
00222   assert(DstReg == SrcReg && "insert_subreg not a two-address instruction?");
00223   assert(SubIdx != 0 && "Invalid index for insert_subreg");
00224   unsigned DstSubReg = TRI.getSubReg(DstReg, SubIdx);
00225   
00226   assert(TargetRegisterInfo::isPhysicalRegister(SrcReg) &&
00227          "Insert superreg source must be in a physical register");
00228   assert(TargetRegisterInfo::isPhysicalRegister(InsReg) &&
00229          "Inserted value must be in a physical register");
00230 
00231   DOUT << "subreg: CONVERTING: " << *MI;
00232 
00233   if (DstSubReg == InsReg) {
00234     // No need to insert an identify copy instruction.
00235     DOUT << "subreg: eliminated!";
00236   } else {
00237     // Insert sub-register copy
00238     const TargetRegisterClass *TRC0= TRI.getPhysicalRegisterRegClass(DstSubReg);
00239     const TargetRegisterClass *TRC1= TRI.getPhysicalRegisterRegClass(InsReg);
00240     TII.copyRegToReg(*MBB, MI, DstSubReg, InsReg, TRC0, TRC1);
00241     // Transfer the kill/dead flags, if needed.
00242     if (MI->getOperand(0).isDead())
00243       TransferDeadFlag(MI, DstSubReg, TRI);
00244     if (MI->getOperand(1).isKill())
00245       TransferKillFlag(MI, InsReg, TRI);
00246 
00247 #ifndef NDEBUG
00248     MachineBasicBlock::iterator dMI = MI;
00249     DOUT << "subreg: " << *(--dMI);
00250 #endif
00251   }
00252 
00253   DOUT << "\n";
00254   MBB->erase(MI);
00255   return true;                    
00256 }
00257 
00258 /// runOnMachineFunction - Reduce subregister inserts and extracts to register
00259 /// copies.
00260 ///
00261 bool LowerSubregsInstructionPass::runOnMachineFunction(MachineFunction &MF) {
00262   DOUT << "Machine Function\n";
00263   
00264   bool MadeChange = false;
00265 
00266   DOUT << "********** LOWERING SUBREG INSTRS **********\n";
00267   DOUT << "********** Function: " << MF.getFunction()->getName() << '\n';
00268 
00269   for (MachineFunction::iterator mbbi = MF.begin(), mbbe = MF.end();
00270        mbbi != mbbe; ++mbbi) {
00271     for (MachineBasicBlock::iterator mi = mbbi->begin(), me = mbbi->end();
00272          mi != me;) {
00273       MachineInstr *MI = mi++;
00274            
00275       if (MI->getOpcode() == TargetInstrInfo::EXTRACT_SUBREG) {
00276         MadeChange |= LowerExtract(MI);
00277       } else if (MI->getOpcode() == TargetInstrInfo::INSERT_SUBREG) {
00278         MadeChange |= LowerInsert(MI);
00279       } else if (MI->getOpcode() == TargetInstrInfo::SUBREG_TO_REG) {
00280         MadeChange |= LowerSubregToReg(MI);
00281       }
00282     }
00283   }
00284 
00285   return MadeChange;
00286 }