LLVM API Documentation
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 }