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