174e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen//===-- ExpandPostRAPseudos.cpp - Pseudo instruction expansion pass -------===// 2bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb// 3bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb// The LLVM Compiler Infrastructure 4bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb// 8bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb//===----------------------------------------------------------------------===// 9bd0f144cc2549e8c2f853ea0a914abd0aa29444fDan Gohman// 1074e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen// This file defines a pass that expands COPY and SUBREG_TO_REG pseudo 1174e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen// instructions after register allocation. 12bd0f144cc2549e8c2f853ea0a914abd0aa29444fDan Gohman// 13bd0f144cc2549e8c2f853ea0a914abd0aa29444fDan Gohman//===----------------------------------------------------------------------===// 14bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb 15bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb#include "llvm/CodeGen/Passes.h" 16bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb#include "llvm/CodeGen/MachineFunctionPass.h" 17bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb#include "llvm/CodeGen/MachineInstr.h" 18980daea857719b3eeb7dc88fe013049d361d955bJakob Stoklund Olesen#include "llvm/CodeGen/MachineInstrBuilder.h" 1984bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/CodeGen/MachineRegisterInfo.h" 20bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb#include "llvm/Support/Debug.h" 21ce63ffb52f249b62cdf2d250c128007b13f27e71Daniel Dunbar#include "llvm/Support/raw_ostream.h" 22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetInstrInfo.h" 23d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h" 24d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetRegisterInfo.h" 25bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lambusing namespace llvm; 26bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb 27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "postrapseudos" 28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 29bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lambnamespace { 3074e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesenstruct ExpandPostRA : public MachineFunctionPass { 3174e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesenprivate: 3274e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen const TargetRegisterInfo *TRI; 3374e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen const TargetInstrInfo *TII; 34d98e30f618266a50219990e9a76a024a0fa90436Evan Cheng 3574e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesenpublic: 3674e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen static char ID; // Pass identification, replacement for typeid 3774e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen ExpandPostRA() : MachineFunctionPass(ID) {} 3808da6365df66abbada3246d01a3d8df869ea9aa3Jim Grosbach 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getAnalysisUsage(AnalysisUsage &AU) const override { 4074e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen AU.setPreservesCFG(); 4174e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen AU.addPreservedID(MachineLoopInfoID); 4274e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen AU.addPreservedID(MachineDominatorsID); 4374e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen MachineFunctionPass::getAnalysisUsage(AU); 4474e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen } 45bbeeb2a61ea19fbb5449260165b56c40fdc4860bEvan Cheng 4674e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen /// runOnMachineFunction - pass entry point 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnMachineFunction(MachineFunction&) override; 48d98e30f618266a50219990e9a76a024a0fa90436Evan Cheng 4974e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesenprivate: 5074e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen bool LowerSubregToReg(MachineInstr *MI); 5174e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen bool LowerCopy(MachineInstr *MI); 52a5b2fee75790e30436b4b40bb2e0a3397d0fc650Dan Gohman 5374e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen void TransferImplicitDefs(MachineInstr *MI); 5474e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen}; 5574e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen} // end anonymous namespace 56bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb 5774e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesenchar ExpandPostRA::ID = 0; 581dd8c8560d45d36a8e507cd014352f1d313f9f9eAndrew Trickchar &llvm::ExpandPostRAPseudosID = ExpandPostRA::ID; 59bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb 601dd8c8560d45d36a8e507cd014352f1d313f9f9eAndrew TrickINITIALIZE_PASS(ExpandPostRA, "postrapseudos", 611dd8c8560d45d36a8e507cd014352f1d313f9f9eAndrew Trick "Post-RA pseudo instruction expansion pass", false, false) 62bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb 635d52165e4e2f83e6e66063382f323435da21090dBob Wilson/// TransferImplicitDefs - MI is a pseudo-instruction, and the lowered 645d52165e4e2f83e6e66063382f323435da21090dBob Wilson/// replacement instructions immediately precede it. Copy any implicit-def 655d52165e4e2f83e6e66063382f323435da21090dBob Wilson/// operands from MI to the replacement instruction. 665d52165e4e2f83e6e66063382f323435da21090dBob Wilsonvoid 6774e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund OlesenExpandPostRA::TransferImplicitDefs(MachineInstr *MI) { 685d52165e4e2f83e6e66063382f323435da21090dBob Wilson MachineBasicBlock::iterator CopyMI = MI; 695d52165e4e2f83e6e66063382f323435da21090dBob Wilson --CopyMI; 705d52165e4e2f83e6e66063382f323435da21090dBob Wilson 715d52165e4e2f83e6e66063382f323435da21090dBob Wilson for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 725d52165e4e2f83e6e66063382f323435da21090dBob Wilson MachineOperand &MO = MI->getOperand(i); 735d52165e4e2f83e6e66063382f323435da21090dBob Wilson if (!MO.isReg() || !MO.isImplicit() || MO.isUse()) 745d52165e4e2f83e6e66063382f323435da21090dBob Wilson continue; 755d52165e4e2f83e6e66063382f323435da21090dBob Wilson CopyMI->addOperand(MachineOperand::CreateReg(MO.getReg(), true, true)); 765d52165e4e2f83e6e66063382f323435da21090dBob Wilson } 775d52165e4e2f83e6e66063382f323435da21090dBob Wilson} 785d52165e4e2f83e6e66063382f323435da21090dBob Wilson 7974e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesenbool ExpandPostRA::LowerSubregToReg(MachineInstr *MI) { 8098363225a3badb3cfbe539b0a000ef108b0fea87Christopher Lamb MachineBasicBlock *MBB = MI->getParent(); 81d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert((MI->getOperand(0).isReg() && MI->getOperand(0).isDef()) && 82d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman MI->getOperand(1).isImm() && 83d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman (MI->getOperand(2).isReg() && MI->getOperand(2).isUse()) && 84d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman MI->getOperand(3).isImm() && "Invalid subreg_to_reg"); 85f175c5c82891f0f68807d8b88020cd2a3a9cdbf6Jakob Stoklund Olesen 86c9298235251b014e86a7368d92b589d093acb64aChristopher Lamb unsigned DstReg = MI->getOperand(0).getReg(); 87c9298235251b014e86a7368d92b589d093acb64aChristopher Lamb unsigned InsReg = MI->getOperand(2).getReg(); 88f175c5c82891f0f68807d8b88020cd2a3a9cdbf6Jakob Stoklund Olesen assert(!MI->getOperand(2).getSubReg() && "SubIdx on physreg?"); 897d6d4b360fb8c1895b57eeb1284e792f953ea7eeEvan Cheng unsigned SubIdx = MI->getOperand(3).getImm(); 9098363225a3badb3cfbe539b0a000ef108b0fea87Christopher Lamb 91c9298235251b014e86a7368d92b589d093acb64aChristopher Lamb assert(SubIdx != 0 && "Invalid index for insert_subreg"); 92d98e30f618266a50219990e9a76a024a0fa90436Evan Cheng unsigned DstSubReg = TRI->getSubReg(DstReg, SubIdx); 937d6d4b360fb8c1895b57eeb1284e792f953ea7eeEvan Cheng 946f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman assert(TargetRegisterInfo::isPhysicalRegister(DstReg) && 9598363225a3badb3cfbe539b0a000ef108b0fea87Christopher Lamb "Insert destination must be in a physical register"); 966f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman assert(TargetRegisterInfo::isPhysicalRegister(InsReg) && 9798363225a3badb3cfbe539b0a000ef108b0fea87Christopher Lamb "Inserted value must be in a physical register"); 9898363225a3badb3cfbe539b0a000ef108b0fea87Christopher Lamb 996d206f8fc90e0e4222fd4f9e93f0ce40197560f3David Greene DEBUG(dbgs() << "subreg: CONVERTING: " << *MI); 100c9298235251b014e86a7368d92b589d093acb64aChristopher Lamb 101b489e29976afed1a015eecd00c5726fe565b038cLang Hames if (MI->allDefsAreDead()) { 102b489e29976afed1a015eecd00c5726fe565b038cLang Hames MI->setDesc(TII->get(TargetOpcode::KILL)); 103b489e29976afed1a015eecd00c5726fe565b038cLang Hames DEBUG(dbgs() << "subreg: replaced by: " << *MI); 104b489e29976afed1a015eecd00c5726fe565b038cLang Hames return true; 105b489e29976afed1a015eecd00c5726fe565b038cLang Hames } 106b489e29976afed1a015eecd00c5726fe565b038cLang Hames 107f175c5c82891f0f68807d8b88020cd2a3a9cdbf6Jakob Stoklund Olesen if (DstSubReg == InsReg) { 108d2f8df50fbd2d91cc9f9e4c6b9c4b65304e710c1Matthias Braun // No need to insert an identity copy instruction. 1097d6d4b360fb8c1895b57eeb1284e792f953ea7eeEvan Cheng // Watch out for case like this: 110f175c5c82891f0f68807d8b88020cd2a3a9cdbf6Jakob Stoklund Olesen // %RAX<def> = SUBREG_TO_REG 0, %EAX<kill>, 3 111f175c5c82891f0f68807d8b88020cd2a3a9cdbf6Jakob Stoklund Olesen // We must leave %RAX live. 112f175c5c82891f0f68807d8b88020cd2a3a9cdbf6Jakob Stoklund Olesen if (DstReg != InsReg) { 113f175c5c82891f0f68807d8b88020cd2a3a9cdbf6Jakob Stoklund Olesen MI->setDesc(TII->get(TargetOpcode::KILL)); 114f175c5c82891f0f68807d8b88020cd2a3a9cdbf6Jakob Stoklund Olesen MI->RemoveOperand(3); // SubIdx 115f175c5c82891f0f68807d8b88020cd2a3a9cdbf6Jakob Stoklund Olesen MI->RemoveOperand(1); // Imm 116f175c5c82891f0f68807d8b88020cd2a3a9cdbf6Jakob Stoklund Olesen DEBUG(dbgs() << "subreg: replace by: " << *MI); 117f175c5c82891f0f68807d8b88020cd2a3a9cdbf6Jakob Stoklund Olesen return true; 118f175c5c82891f0f68807d8b88020cd2a3a9cdbf6Jakob Stoklund Olesen } 1196d206f8fc90e0e4222fd4f9e93f0ce40197560f3David Greene DEBUG(dbgs() << "subreg: eliminated!"); 120e3d920699c6df959f3e0844aeadd983b2955b23eDan Gohman } else { 1213651d92d91062ea4b1ee8b2a88eca03bd39e1968Jakob Stoklund Olesen TII->copyPhysReg(*MBB, MI, MI->getDebugLoc(), DstSubReg, InsReg, 1223651d92d91062ea4b1ee8b2a88eca03bd39e1968Jakob Stoklund Olesen MI->getOperand(2).isKill()); 123f6c80bde655c1f08f7a42a55150727b0a7fad65dLang Hames 12472e7dbf88be36b96aefd9fe8912f33ab8afb7352Jakob Stoklund Olesen // Implicitly define DstReg for subsequent uses. 12572e7dbf88be36b96aefd9fe8912f33ab8afb7352Jakob Stoklund Olesen MachineBasicBlock::iterator CopyMI = MI; 12672e7dbf88be36b96aefd9fe8912f33ab8afb7352Jakob Stoklund Olesen --CopyMI; 12772e7dbf88be36b96aefd9fe8912f33ab8afb7352Jakob Stoklund Olesen CopyMI->addRegisterDefined(DstReg); 12872e7dbf88be36b96aefd9fe8912f33ab8afb7352Jakob Stoklund Olesen DEBUG(dbgs() << "subreg: " << *CopyMI); 129e3d920699c6df959f3e0844aeadd983b2955b23eDan Gohman } 13098363225a3badb3cfbe539b0a000ef108b0fea87Christopher Lamb 1316d206f8fc90e0e4222fd4f9e93f0ce40197560f3David Greene DEBUG(dbgs() << '\n'); 1322c3f7ae3843bdc9dcfe85393e178211976c1f9bdDan Gohman MBB->erase(MI); 133efcd89a5f66826430d077476564afe41109290cbAnton Korobeynikov return true; 134c9298235251b014e86a7368d92b589d093acb64aChristopher Lamb} 13598363225a3badb3cfbe539b0a000ef108b0fea87Christopher Lamb 13674e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesenbool ExpandPostRA::LowerCopy(MachineInstr *MI) { 137b489e29976afed1a015eecd00c5726fe565b038cLang Hames 138b489e29976afed1a015eecd00c5726fe565b038cLang Hames if (MI->allDefsAreDead()) { 139b489e29976afed1a015eecd00c5726fe565b038cLang Hames DEBUG(dbgs() << "dead copy: " << *MI); 140b489e29976afed1a015eecd00c5726fe565b038cLang Hames MI->setDesc(TII->get(TargetOpcode::KILL)); 141b489e29976afed1a015eecd00c5726fe565b038cLang Hames DEBUG(dbgs() << "replaced by: " << *MI); 142b489e29976afed1a015eecd00c5726fe565b038cLang Hames return true; 143b489e29976afed1a015eecd00c5726fe565b038cLang Hames } 144b489e29976afed1a015eecd00c5726fe565b038cLang Hames 145a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen MachineOperand &DstMO = MI->getOperand(0); 146a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen MachineOperand &SrcMO = MI->getOperand(1); 147a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen 148a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen if (SrcMO.getReg() == DstMO.getReg()) { 149a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen DEBUG(dbgs() << "identity copy: " << *MI); 150a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen // No need to insert an identity copy instruction, but replace with a KILL 151a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen // if liveness is changed. 152b489e29976afed1a015eecd00c5726fe565b038cLang Hames if (SrcMO.isUndef() || MI->getNumOperands() > 2) { 153a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen // We must make sure the super-register gets killed. Replace the 154a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen // instruction with KILL. 155a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen MI->setDesc(TII->get(TargetOpcode::KILL)); 156a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen DEBUG(dbgs() << "replaced by: " << *MI); 157a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen return true; 158a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen } 159a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen // Vanilla identity copy. 160a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen MI->eraseFromParent(); 161a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen return true; 162a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen } 163a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen 164a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen DEBUG(dbgs() << "real copy: " << *MI); 1653651d92d91062ea4b1ee8b2a88eca03bd39e1968Jakob Stoklund Olesen TII->copyPhysReg(*MI->getParent(), MI, MI->getDebugLoc(), 1663651d92d91062ea4b1ee8b2a88eca03bd39e1968Jakob Stoklund Olesen DstMO.getReg(), SrcMO.getReg(), SrcMO.isKill()); 167a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen 168a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen if (MI->getNumOperands() > 2) 169a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen TransferImplicitDefs(MI); 170a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen DEBUG({ 171a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen MachineBasicBlock::iterator dMI = MI; 172a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen dbgs() << "replaced by: " << *(--dMI); 173a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen }); 174a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen MI->eraseFromParent(); 175a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen return true; 176a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen} 177a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen 178bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb/// runOnMachineFunction - Reduce subregister inserts and extracts to register 179bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb/// copies. 180bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb/// 18174e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesenbool ExpandPostRA::runOnMachineFunction(MachineFunction &MF) { 18208da6365df66abbada3246d01a3d8df869ea9aa3Jim Grosbach DEBUG(dbgs() << "Machine Function\n" 18374e2d6ea66a9289fc3c00583f3c2b2abd84e1866Jakob Stoklund Olesen << "********** EXPANDING POST-RA PSEUDO INSTRS **********\n" 184986d76d7b3844b9a2f3d01a48975952749267a93David Blaikie << "********** Function: " << MF.getName() << '\n'); 185d98e30f618266a50219990e9a76a024a0fa90436Evan Cheng TRI = MF.getTarget().getRegisterInfo(); 186d98e30f618266a50219990e9a76a024a0fa90436Evan Cheng TII = MF.getTarget().getInstrInfo(); 187bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb 1880d6b1b124888e568b4dd2037a9e31dcd54e62d18Bill Wendling bool MadeChange = false; 189bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb 190bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb for (MachineFunction::iterator mbbi = MF.begin(), mbbe = MF.end(); 191bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb mbbi != mbbe; ++mbbi) { 192bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb for (MachineBasicBlock::iterator mi = mbbi->begin(), me = mbbi->end(); 19398363225a3badb3cfbe539b0a000ef108b0fea87Christopher Lamb mi != me;) { 194d98e30f618266a50219990e9a76a024a0fa90436Evan Cheng MachineInstr *MI = mi; 195c291e2f5780c3a8470113a2a58c1fa680cd54b20Jakob Stoklund Olesen // Advance iterator here because MI may be erased. 196c291e2f5780c3a8470113a2a58c1fa680cd54b20Jakob Stoklund Olesen ++mi; 197735fe0f9d00facc5961fbb8b822844f5088cd81dJakob Stoklund Olesen 198735fe0f9d00facc5961fbb8b822844f5088cd81dJakob Stoklund Olesen // Only expand pseudos. 1995a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng if (!MI->isPseudo()) 200735fe0f9d00facc5961fbb8b822844f5088cd81dJakob Stoklund Olesen continue; 201735fe0f9d00facc5961fbb8b822844f5088cd81dJakob Stoklund Olesen 202735fe0f9d00facc5961fbb8b822844f5088cd81dJakob Stoklund Olesen // Give targets a chance to expand even standard pseudos. 203735fe0f9d00facc5961fbb8b822844f5088cd81dJakob Stoklund Olesen if (TII->expandPostRAPseudo(MI)) { 204735fe0f9d00facc5961fbb8b822844f5088cd81dJakob Stoklund Olesen MadeChange = true; 205735fe0f9d00facc5961fbb8b822844f5088cd81dJakob Stoklund Olesen continue; 206735fe0f9d00facc5961fbb8b822844f5088cd81dJakob Stoklund Olesen } 207735fe0f9d00facc5961fbb8b822844f5088cd81dJakob Stoklund Olesen 208735fe0f9d00facc5961fbb8b822844f5088cd81dJakob Stoklund Olesen // Expand standard pseudos. 209c291e2f5780c3a8470113a2a58c1fa680cd54b20Jakob Stoklund Olesen switch (MI->getOpcode()) { 210c291e2f5780c3a8470113a2a58c1fa680cd54b20Jakob Stoklund Olesen case TargetOpcode::SUBREG_TO_REG: 211c9298235251b014e86a7368d92b589d093acb64aChristopher Lamb MadeChange |= LowerSubregToReg(MI); 212c291e2f5780c3a8470113a2a58c1fa680cd54b20Jakob Stoklund Olesen break; 213c291e2f5780c3a8470113a2a58c1fa680cd54b20Jakob Stoklund Olesen case TargetOpcode::COPY: 214a4e1ba53ddedd08669886b2849926bb33facc198Jakob Stoklund Olesen MadeChange |= LowerCopy(MI); 215c291e2f5780c3a8470113a2a58c1fa680cd54b20Jakob Stoklund Olesen break; 216c291e2f5780c3a8470113a2a58c1fa680cd54b20Jakob Stoklund Olesen case TargetOpcode::DBG_VALUE: 217c291e2f5780c3a8470113a2a58c1fa680cd54b20Jakob Stoklund Olesen continue; 218c291e2f5780c3a8470113a2a58c1fa680cd54b20Jakob Stoklund Olesen case TargetOpcode::INSERT_SUBREG: 219c291e2f5780c3a8470113a2a58c1fa680cd54b20Jakob Stoklund Olesen case TargetOpcode::EXTRACT_SUBREG: 220c291e2f5780c3a8470113a2a58c1fa680cd54b20Jakob Stoklund Olesen llvm_unreachable("Sub-register pseudos should have been eliminated."); 221bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb } 222bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb } 223bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb } 224bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb 225bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb return MadeChange; 226bab2474b64e81be0ed4fc35d16cdfac65f283361Christopher Lamb} 227