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"
11ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/CodeGen/MachineInstrBuilder.h"
12ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/CodeGen/Passes.h"
13ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/CodeGen/MachineFunctionPass.h"
14ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/Target/TargetInstrInfo.h"
15ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/Target/TargetMachine.h"
16ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/Target/TargetRegisterInfo.h"
17ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/ADT/SmallSet.h"
18ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/ADT/SmallVector.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()) {
50ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        while (++MII != MIE && MII->isInsideBundle()) {
51ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          MII->setIsInsideBundle(false);
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?");
104bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng
105ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  const TargetMachine &TM = MBB.getParent()->getTarget();
106ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  const TargetInstrInfo *TII = TM.getInstrInfo();
107ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  const TargetRegisterInfo *TRI = TM.getRegisterInfo();
108ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
109ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  MachineInstrBuilder MIB = BuildMI(MBB, FirstMI, FirstMI->getDebugLoc(),
110ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng                                    TII->get(TargetOpcode::BUNDLE));
111ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
112ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallVector<unsigned, 8> LocalDefs;
113ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallSet<unsigned, 8> LocalDefSet;
114ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallSet<unsigned, 8> DeadDefSet;
115ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallSet<unsigned, 8> KilledDefSet;
116ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallVector<unsigned, 8> ExternUses;
117ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallSet<unsigned, 8> ExternUseSet;
118ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallSet<unsigned, 8> KilledUseSet;
119ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallSet<unsigned, 8> UndefUseSet;
120ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallVector<MachineOperand*, 4> Defs;
121bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng  for (; FirstMI != LastMI; ++FirstMI) {
122ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    for (unsigned i = 0, e = FirstMI->getNumOperands(); i != e; ++i) {
123ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      MachineOperand &MO = FirstMI->getOperand(i);
124ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (!MO.isReg())
125ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        continue;
126ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (MO.isDef()) {
127ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        Defs.push_back(&MO);
128ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        continue;
129ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      }
130ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
131ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      unsigned Reg = MO.getReg();
132ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (!Reg)
133ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        continue;
134ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      assert(TargetRegisterInfo::isPhysicalRegister(Reg));
135ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (LocalDefSet.count(Reg)) {
136ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        MO.setIsInternalRead();
137ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        if (MO.isKill())
138ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          // Internal def is now killed.
139ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          KilledDefSet.insert(Reg);
140ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      } else {
141ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        if (ExternUseSet.insert(Reg)) {
142ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          ExternUses.push_back(Reg);
143ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          if (MO.isUndef())
144ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng            UndefUseSet.insert(Reg);
145ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        }
146ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        if (MO.isKill())
147ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          // External def is now killed.
148ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          KilledUseSet.insert(Reg);
149ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      }
150ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    }
151ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
152ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    for (unsigned i = 0, e = Defs.size(); i != e; ++i) {
153ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      MachineOperand &MO = *Defs[i];
154ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      unsigned Reg = MO.getReg();
155ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (!Reg)
156ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        continue;
157ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
158ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (LocalDefSet.insert(Reg)) {
159ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        LocalDefs.push_back(Reg);
160ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        if (MO.isDead()) {
161ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          DeadDefSet.insert(Reg);
162ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        }
163ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      } else {
164ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        // Re-defined inside the bundle, it's no longer killed.
165ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        KilledDefSet.erase(Reg);
166ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        if (!MO.isDead())
167ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          // Previously defined but dead.
168ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          DeadDefSet.erase(Reg);
169ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      }
170ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
171ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      if (!MO.isDead()) {
172396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen        for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
173396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen          unsigned SubReg = *SubRegs;
174ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng          if (LocalDefSet.insert(SubReg))
175ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng            LocalDefs.push_back(SubReg);
176ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng        }
177ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      }
178ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    }
179ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
180ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    FirstMI->setIsInsideBundle();
181ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    Defs.clear();
182bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng  }
183ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
184ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  SmallSet<unsigned, 8> Added;
185ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  for (unsigned i = 0, e = LocalDefs.size(); i != e; ++i) {
186ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    unsigned Reg = LocalDefs[i];
187ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    if (Added.insert(Reg)) {
188ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      // If it's not live beyond end of the bundle, mark it dead.
189ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      bool isDead = DeadDefSet.count(Reg) || KilledDefSet.count(Reg);
190ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng      MIB.addReg(Reg, getDefRegState(true) | getDeadRegState(isDead) |
191ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng                 getImplRegState(true));
192ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    }
193ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  }
194ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng
195ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  for (unsigned i = 0, e = ExternUses.size(); i != e; ++i) {
196ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    unsigned Reg = ExternUses[i];
197ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    bool isKill = KilledUseSet.count(Reg);
198ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    bool isUndef = UndefUseSet.count(Reg);
199ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng    MIB.addReg(Reg, getKillRegState(isKill) | getUndefRegState(isUndef) |
200ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng               getImplRegState(true));
201ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng  }
202ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng}
203bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng
204bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// finalizeBundle - Same functionality as the previous finalizeBundle except
205bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// the last instruction in the bundle is not provided as an input. This is
206bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// used in cases where bundles are pre-determined by marking instructions
207a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng/// with 'InsideBundle' marker. It returns the MBB instruction iterator that
208a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng/// points to the end of the bundle.
209a2e435cd23427eef7d8e86c72bb94c756e60e473Evan ChengMachineBasicBlock::instr_iterator
210a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Chengllvm::finalizeBundle(MachineBasicBlock &MBB,
211a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng                     MachineBasicBlock::instr_iterator FirstMI) {
212bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng  MachineBasicBlock::instr_iterator E = MBB.instr_end();
213bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng  MachineBasicBlock::instr_iterator LastMI = llvm::next(FirstMI);
214bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng  while (LastMI != E && LastMI->isInsideBundle())
215bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng    ++LastMI;
216bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng  finalizeBundle(MBB, FirstMI, LastMI);
217a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng  return LastMI;
218bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng}
219ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng
220ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng/// finalizeBundles - Finalize instruction bundles in the specified
221ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng/// MachineFunction. Return true if any bundles are finalized.
222ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Chengbool llvm::finalizeBundles(MachineFunction &MF) {
223ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng  bool Changed = false;
224ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng  for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) {
225ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng    MachineBasicBlock &MBB = *I;
226ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng
227ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng    MachineBasicBlock::instr_iterator MII = MBB.instr_begin();
228ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng    assert(!MII->isInsideBundle() &&
229ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng           "First instr cannot be inside bundle before finalization!");
230ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng
231ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng    MachineBasicBlock::instr_iterator MIE = MBB.instr_end();
2328250d7385a16e8d586f608b3040eb6738bbf8e55Evan Cheng    if (MII == MIE)
2338250d7385a16e8d586f608b3040eb6738bbf8e55Evan Cheng      continue;
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
251a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund OlesenMachineOperandIteratorBase::RegInfo
252a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund OlesenMachineOperandIteratorBase::analyzeVirtReg(unsigned Reg,
253a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen                    SmallVectorImpl<std::pair<MachineInstr*, unsigned> > *Ops) {
254a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen  RegInfo 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}
279