1ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng//===-- lib/CodeGen/MachineInstrBundle.cpp --------------------------------===//
2ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng//
3ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng//                     The LLVM Compiler Infrastructure
4ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng//
5ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// This file is distributed under the University of Illinois Open Source
6ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// License. See LICENSE.TXT for details.
7ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng//
8ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng//===----------------------------------------------------------------------===//
9ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
10ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/CodeGen/MachineInstrBundle.h"
11d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SmallSet.h"
12d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SmallVector.h"
13d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFunctionPass.h"
14ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/CodeGen/MachineInstrBuilder.h"
15ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/CodeGen/Passes.h"
16ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/Target/TargetInstrInfo.h"
17ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/Target/TargetMachine.h"
18ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/Target/TargetRegisterInfo.h"
19ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chengusing namespace llvm;
20ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
21ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chengnamespace {
22ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  class UnpackMachineBundles : public MachineFunctionPass {
23ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  public:
24ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    static char ID; // Pass identification
25ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    UnpackMachineBundles() : MachineFunctionPass(ID) {
26ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      initializeUnpackMachineBundlesPass(*PassRegistry::getPassRegistry());
27ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    }
28ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
29ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    virtual bool runOnMachineFunction(MachineFunction &MF);
30ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  };
31ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} // end anonymous namespace
32ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
33ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chengchar UnpackMachineBundles::ID = 0;
341dd8c8560d45d36a8e507cd014352f1d313f9f9eAndrew Trickchar &llvm::UnpackMachineBundlesID = UnpackMachineBundles::ID;
35ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan ChengINITIALIZE_PASS(UnpackMachineBundles, "unpack-mi-bundles",
36ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng                "Unpack machine instruction bundles", false, false)
37ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
38ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chengbool UnpackMachineBundles::runOnMachineFunction(MachineFunction &MF) {
39ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  bool Changed = false;
40ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) {
41ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    MachineBasicBlock *MBB = &*I;
42ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
43ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    for (MachineBasicBlock::instr_iterator MII = MBB->instr_begin(),
44ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng           MIE = MBB->instr_end(); MII != MIE; ) {
45ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      MachineInstr *MI = &*MII;
46ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
47ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      // Remove BUNDLE instruction and the InsideBundle flags from bundled
48ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      // instructions.
49ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (MI->isBundle()) {
50caf946edf3478fcd00a572de380d9bf0fc00fd26Jakob Stoklund Olesen        while (++MII != MIE && MII->isBundledWithPred()) {
51caf946edf3478fcd00a572de380d9bf0fc00fd26Jakob Stoklund Olesen          MII->unbundleFromPred();
52ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          for (unsigned i = 0, e = MII->getNumOperands(); i != e; ++i) {
53ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng            MachineOperand &MO = MII->getOperand(i);
54ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng            if (MO.isReg() && MO.isInternalRead())
55ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng              MO.setIsInternalRead(false);
56ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          }
57ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        }
58ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        MI->eraseFromParent();
59ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
60ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        Changed = true;
61ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        continue;
62ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      }
63ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
64ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      ++MII;
65ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    }
66ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  }
67ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
68ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  return Changed;
69ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng}
70ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
71ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng
72ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Chengnamespace {
73ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng  class FinalizeMachineBundles : public MachineFunctionPass {
74ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng  public:
75ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng    static char ID; // Pass identification
76ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng    FinalizeMachineBundles() : MachineFunctionPass(ID) {
77ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng      initializeFinalizeMachineBundlesPass(*PassRegistry::getPassRegistry());
78ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng    }
79ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng
80ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng    virtual bool runOnMachineFunction(MachineFunction &MF);
81ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng  };
82ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng} // end anonymous namespace
83ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng
84ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Chengchar FinalizeMachineBundles::ID = 0;
851dd8c8560d45d36a8e507cd014352f1d313f9f9eAndrew Trickchar &llvm::FinalizeMachineBundlesID = FinalizeMachineBundles::ID;
86ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan ChengINITIALIZE_PASS(FinalizeMachineBundles, "finalize-mi-bundles",
87ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng                "Finalize machine instruction bundles", false, false)
88ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng
89ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Chengbool FinalizeMachineBundles::runOnMachineFunction(MachineFunction &MF) {
90ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng  return llvm::finalizeBundles(MF);
91ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng}
92ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng
93ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng
949b159710ebe8a37cba38ca0c5b465e362bd68af7Evan Cheng/// finalizeBundle - Finalize a machine instruction bundle which includes
95bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// a sequence of instructions starting from FirstMI to LastMI (exclusive).
96ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng/// This routine adds a BUNDLE instruction to represent the bundle, it adds
97ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng/// IsInternalRead markers to MachineOperands which are defined inside the
98ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng/// bundle, and it copies externally visible defs and uses to the BUNDLE
99ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng/// instruction.
1009b159710ebe8a37cba38ca0c5b465e362bd68af7Evan Chengvoid llvm::finalizeBundle(MachineBasicBlock &MBB,
101ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng                          MachineBasicBlock::instr_iterator FirstMI,
102ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng                          MachineBasicBlock::instr_iterator LastMI) {
103bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng  assert(FirstMI != LastMI && "Empty bundle?");
104caf946edf3478fcd00a572de380d9bf0fc00fd26Jakob Stoklund Olesen  MIBundleBuilder Bundle(MBB, FirstMI, LastMI);
105bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng
106ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  const TargetMachine &TM = MBB.getParent()->getTarget();
107ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  const TargetInstrInfo *TII = TM.getInstrInfo();
108ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  const TargetRegisterInfo *TRI = TM.getRegisterInfo();
109ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
110caf946edf3478fcd00a572de380d9bf0fc00fd26Jakob Stoklund Olesen  MachineInstrBuilder MIB = BuildMI(*MBB.getParent(), FirstMI->getDebugLoc(),
111ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng                                    TII->get(TargetOpcode::BUNDLE));
112caf946edf3478fcd00a572de380d9bf0fc00fd26Jakob Stoklund Olesen  Bundle.prepend(MIB);
113ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
1148dcc99496d9e32e13e30d6579b7af05f19e7c8d8Michael Ilseman  SmallVector<unsigned, 32> LocalDefs;
1158dcc99496d9e32e13e30d6579b7af05f19e7c8d8Michael Ilseman  SmallSet<unsigned, 32> LocalDefSet;
116ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallSet<unsigned, 8> DeadDefSet;
1178dcc99496d9e32e13e30d6579b7af05f19e7c8d8Michael Ilseman  SmallSet<unsigned, 16> KilledDefSet;
118ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallVector<unsigned, 8> ExternUses;
119ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallSet<unsigned, 8> ExternUseSet;
120ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallSet<unsigned, 8> KilledUseSet;
121ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallSet<unsigned, 8> UndefUseSet;
122ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallVector<MachineOperand*, 4> Defs;
123bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng  for (; FirstMI != LastMI; ++FirstMI) {
124ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    for (unsigned i = 0, e = FirstMI->getNumOperands(); i != e; ++i) {
125ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      MachineOperand &MO = FirstMI->getOperand(i);
126ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (!MO.isReg())
127ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        continue;
128ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (MO.isDef()) {
129ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        Defs.push_back(&MO);
130ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        continue;
131ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      }
132ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
133ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      unsigned Reg = MO.getReg();
134ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (!Reg)
135ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        continue;
136ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      assert(TargetRegisterInfo::isPhysicalRegister(Reg));
137ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (LocalDefSet.count(Reg)) {
138ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        MO.setIsInternalRead();
139ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        if (MO.isKill())
140ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          // Internal def is now killed.
141ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          KilledDefSet.insert(Reg);
142ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      } else {
143ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        if (ExternUseSet.insert(Reg)) {
144ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          ExternUses.push_back(Reg);
145ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          if (MO.isUndef())
146ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng            UndefUseSet.insert(Reg);
147ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        }
148ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        if (MO.isKill())
149ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          // External def is now killed.
150ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          KilledUseSet.insert(Reg);
151ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      }
152ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    }
153ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
154ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    for (unsigned i = 0, e = Defs.size(); i != e; ++i) {
155ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      MachineOperand &MO = *Defs[i];
156ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      unsigned Reg = MO.getReg();
157ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (!Reg)
158ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        continue;
159ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
160ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (LocalDefSet.insert(Reg)) {
161ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        LocalDefs.push_back(Reg);
162ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        if (MO.isDead()) {
163ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          DeadDefSet.insert(Reg);
164ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        }
165ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      } else {
166ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        // Re-defined inside the bundle, it's no longer killed.
167ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        KilledDefSet.erase(Reg);
168ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        if (!MO.isDead())
169ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          // Previously defined but dead.
170ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          DeadDefSet.erase(Reg);
171ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      }
172ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
173ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (!MO.isDead()) {
174396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen        for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
175396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen          unsigned SubReg = *SubRegs;
176ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          if (LocalDefSet.insert(SubReg))
177ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng            LocalDefs.push_back(SubReg);
178ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        }
179ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      }
180ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    }
181ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
182ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    Defs.clear();
183bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng  }
184ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
1858dcc99496d9e32e13e30d6579b7af05f19e7c8d8Michael Ilseman  SmallSet<unsigned, 32> Added;
186ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  for (unsigned i = 0, e = LocalDefs.size(); i != e; ++i) {
187ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    unsigned Reg = LocalDefs[i];
188ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    if (Added.insert(Reg)) {
189ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      // If it's not live beyond end of the bundle, mark it dead.
190ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      bool isDead = DeadDefSet.count(Reg) || KilledDefSet.count(Reg);
191ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      MIB.addReg(Reg, getDefRegState(true) | getDeadRegState(isDead) |
192ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng                 getImplRegState(true));
193ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    }
194ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  }
195ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
196ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  for (unsigned i = 0, e = ExternUses.size(); i != e; ++i) {
197ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    unsigned Reg = ExternUses[i];
198ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    bool isKill = KilledUseSet.count(Reg);
199ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    bool isUndef = UndefUseSet.count(Reg);
200ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    MIB.addReg(Reg, getKillRegState(isKill) | getUndefRegState(isUndef) |
201ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng               getImplRegState(true));
202ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  }
203ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng}
204bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng
205bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// finalizeBundle - Same functionality as the previous finalizeBundle except
206bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// the last instruction in the bundle is not provided as an input. This is
207bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// used in cases where bundles are pre-determined by marking instructions
208a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng/// with 'InsideBundle' marker. It returns the MBB instruction iterator that
209a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng/// points to the end of the bundle.
210a2e435cd23427eef7d8e86c72bb94c756e60e473Evan ChengMachineBasicBlock::instr_iterator
211a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Chengllvm::finalizeBundle(MachineBasicBlock &MBB,
212a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng                     MachineBasicBlock::instr_iterator FirstMI) {
213bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng  MachineBasicBlock::instr_iterator E = MBB.instr_end();
214bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng  MachineBasicBlock::instr_iterator LastMI = llvm::next(FirstMI);
215bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng  while (LastMI != E && LastMI->isInsideBundle())
216bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng    ++LastMI;
217bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng  finalizeBundle(MBB, FirstMI, LastMI);
218a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng  return LastMI;
219bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng}
220ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng
221ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng/// finalizeBundles - Finalize instruction bundles in the specified
222ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng/// MachineFunction. Return true if any bundles are finalized.
223ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Chengbool llvm::finalizeBundles(MachineFunction &MF) {
224ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng  bool Changed = false;
225ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng  for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) {
226ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng    MachineBasicBlock &MBB = *I;
227ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng    MachineBasicBlock::instr_iterator MII = MBB.instr_begin();
228ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng    MachineBasicBlock::instr_iterator MIE = MBB.instr_end();
2298250d7385a16e8d586f608b3040eb6738bbf8e55Evan Cheng    if (MII == MIE)
2308250d7385a16e8d586f608b3040eb6738bbf8e55Evan Cheng      continue;
23173a853f05c913f6127e93cf0df3ba6398bcfc213Jakob Stoklund Olesen    assert(!MII->isInsideBundle() &&
23273a853f05c913f6127e93cf0df3ba6398bcfc213Jakob Stoklund Olesen           "First instr cannot be inside bundle before finalization!");
23373a853f05c913f6127e93cf0df3ba6398bcfc213Jakob Stoklund Olesen
234ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng    for (++MII; MII != MIE; ) {
235ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng      if (!MII->isInsideBundle())
236ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng        ++MII;
237ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng      else {
238ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng        MII = finalizeBundle(MBB, llvm::prior(MII));
239ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng        Changed = true;
240ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng      }
241ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng    }
242ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng  }
243ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng
244ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng  return Changed;
245ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng}
246a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen
247a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen//===----------------------------------------------------------------------===//
248a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen// MachineOperand iterator
249a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen//===----------------------------------------------------------------------===//
250a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen
251b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames MolloyMachineOperandIteratorBase::VirtRegInfo
252a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund OlesenMachineOperandIteratorBase::analyzeVirtReg(unsigned Reg,
253a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen                    SmallVectorImpl<std::pair<MachineInstr*, unsigned> > *Ops) {
254b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy  VirtRegInfo RI = { false, false, false };
255a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen  for(; isValid(); ++*this) {
256a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen    MachineOperand &MO = deref();
257a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen    if (!MO.isReg() || MO.getReg() != Reg)
258a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen      continue;
259a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen
260a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen    // Remember each (MI, OpNo) that refers to Reg.
261a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen    if (Ops)
262a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen      Ops->push_back(std::make_pair(MO.getParent(), getOperandNo()));
263a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen
264a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen    // Both defs and uses can read virtual registers.
265a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen    if (MO.readsReg()) {
266a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen      RI.Reads = true;
267a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen      if (MO.isDef())
268a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen        RI.Tied = true;
269a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen    }
270a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen
271a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen    // Only defs can write.
272a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen    if (MO.isDef())
273a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen      RI.Writes = true;
274a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen    else if (!RI.Tied && MO.getParent()->isRegTiedToDefOperand(getOperandNo()))
275a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen      RI.Tied = true;
276a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen  }
277a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen  return RI;
278a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen}
279b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy
280b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames MolloyMachineOperandIteratorBase::PhysRegInfo
281b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames MolloyMachineOperandIteratorBase::analyzePhysReg(unsigned Reg,
282b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy                                           const TargetRegisterInfo *TRI) {
283b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy  bool AllDefsDead = true;
284310f248c22c5a20eaa4de1e612af3338a89144f3Tim Northover  PhysRegInfo PRI = {false, false, false, false, false, false};
285b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy
286b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy  assert(TargetRegisterInfo::isPhysicalRegister(Reg) &&
287b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy         "analyzePhysReg not given a physical register!");
288b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy  for (; isValid(); ++*this) {
289b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy    MachineOperand &MO = deref();
290b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy
291b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy    if (MO.isRegMask() && MO.clobbersPhysReg(Reg))
292b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy      PRI.Clobbers = true;    // Regmask clobbers Reg.
293b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy
294b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy    if (!MO.isReg())
295b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy      continue;
296b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy
297b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy    unsigned MOReg = MO.getReg();
298b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy    if (!MOReg || !TargetRegisterInfo::isPhysicalRegister(MOReg))
299b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy      continue;
300b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy
301b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy    bool IsRegOrSuperReg = MOReg == Reg || TRI->isSubRegister(MOReg, Reg);
302b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy    bool IsRegOrOverlapping = MOReg == Reg || TRI->regsOverlap(MOReg, Reg);
303b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy
304b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy    if (IsRegOrSuperReg && MO.readsReg()) {
305b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy      // Reg or a super-reg is read, and perhaps killed also.
306b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy      PRI.Reads = true;
307b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy      PRI.Kills = MO.isKill();
308310f248c22c5a20eaa4de1e612af3338a89144f3Tim Northover    }
309310f248c22c5a20eaa4de1e612af3338a89144f3Tim Northover
310310f248c22c5a20eaa4de1e612af3338a89144f3Tim Northover    if (IsRegOrOverlapping && MO.readsReg()) {
311b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy      PRI.ReadsOverlap = true;// Reg or an overlapping register is read.
312b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy    }
3132b9430243373768d5baba046a8c344cce96749a5Michael Ilseman
314b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy    if (!MO.isDef())
315b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy      continue;
316b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy
317b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy    if (IsRegOrSuperReg) {
318b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy      PRI.Defines = true;     // Reg or a super-register is defined.
319b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy      if (!MO.isDead())
320b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy        AllDefsDead = false;
321b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy    }
322b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy    if (IsRegOrOverlapping)
323b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy      PRI.Clobbers = true;    // Reg or an overlapping reg is defined.
324b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy  }
325b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy
326b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy  if (AllDefsDead && PRI.Defines)
327b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy    PRI.DefinesDead = true;   // Reg or super-register was defined and was dead.
328b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy
329b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy  return PRI;
330b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy}
331