1dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta//=- llvm/CodeGen/DFAPacketizer.cpp - DFA Packetizer for VLIW -*- C++ -*-=====//
2dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta//
3dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta//                     The LLVM Compiler Infrastructure
4dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta//
5dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// This file is distributed under the University of Illinois Open Source
6dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// License. See LICENSE.TXT for details.
7dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta//
8dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta//===----------------------------------------------------------------------===//
9dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// This class implements a deterministic finite automaton (DFA) based
10dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// packetizing mechanism for VLIW architectures. It provides APIs to
11dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// determine whether there exists a legal mapping of instructions to
12dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// functional unit assignments in a packet. The DFA is auto-generated from
13dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// the target's Schedule.td file.
14dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta//
15dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// A DFA consists of 3 major elements: states, inputs, and transitions. For
16dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// the packetizing mechanism, the input is the set of instruction classes for
17dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// a target. The state models all possible combinations of functional unit
18dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// consumption for a given set of instructions in a packet. A transition
19dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// models the addition of an instruction to a packet. In the DFA constructed
20dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// by this class, if an instruction can be added to a packet, then a valid
21dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// transition exists from the corresponding state. Invalid transitions
22dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// indicate that the instruction cannot be added to the current packet.
23dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta//
24dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta//===----------------------------------------------------------------------===//
25dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta
26dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta#include "llvm/CodeGen/DFAPacketizer.h"
27dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta#include "llvm/CodeGen/MachineInstr.h"
28ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick#include "llvm/CodeGen/MachineInstrBundle.h"
29d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/ScheduleDAGInstrs.h"
30dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta#include "llvm/MC/MCInstrItineraries.h"
31d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetInstrInfo.h"
32dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasguptausing namespace llvm;
33dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta
34dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman DasguptaDFAPacketizer::DFAPacketizer(const InstrItineraryData *I, const int (*SIT)[2],
35464f3a332f81364ee09794f9502f0b25671149c6Sebastian Pop                             const unsigned *SET):
36dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  InstrItins(I), CurrentState(0), DFAStateInputTable(SIT),
37dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  DFAStateEntryTable(SET) {}
38dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta
39dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta
40dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta//
41f6f77e90a18142e196cbc2a6ee87cdf7461b17dfSebastian Pop// ReadTable - Read the DFA transition table and update CachedTable.
42dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta//
43dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// Format of the transition tables:
44dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// DFAStateInputTable[][2] = pairs of <Input, Transition> for all valid
45dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta//                           transitions
46dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// DFAStateEntryTable[i] = Index of the first entry in DFAStateInputTable
47dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta//                         for the ith state
48dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta//
49dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasguptavoid DFAPacketizer::ReadTable(unsigned int state) {
50dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  unsigned ThisState = DFAStateEntryTable[state];
51dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  unsigned NextStateInTable = DFAStateEntryTable[state+1];
52dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  // Early exit in case CachedTable has already contains this
53f6f77e90a18142e196cbc2a6ee87cdf7461b17dfSebastian Pop  // state's transitions.
54dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  if (CachedTable.count(UnsignPair(state,
55dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta                                   DFAStateInputTable[ThisState][0])))
56dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta    return;
57dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta
58dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  for (unsigned i = ThisState; i < NextStateInTable; i++)
59dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta    CachedTable[UnsignPair(state, DFAStateInputTable[i][0])] =
60dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta      DFAStateInputTable[i][1];
61dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta}
62dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta
63dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta
64dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// canReserveResources - Check if the resources occupied by a MCInstrDesc
65f6f77e90a18142e196cbc2a6ee87cdf7461b17dfSebastian Pop// are available in the current state.
66464f3a332f81364ee09794f9502f0b25671149c6Sebastian Popbool DFAPacketizer::canReserveResources(const llvm::MCInstrDesc *MID) {
67dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  unsigned InsnClass = MID->getSchedClass();
68464f3a332f81364ee09794f9502f0b25671149c6Sebastian Pop  const llvm::InstrStage *IS = InstrItins->beginStage(InsnClass);
69b460a3382961c5be9952a75d46228f624edbd39fHal Finkel  unsigned FuncUnits = IS->getUnits();
70dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  UnsignPair StateTrans = UnsignPair(CurrentState, FuncUnits);
71dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  ReadTable(CurrentState);
72dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  return (CachedTable.count(StateTrans) != 0);
73dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta}
74dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta
75dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta
76dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// reserveResources - Reserve the resources occupied by a MCInstrDesc and
77f6f77e90a18142e196cbc2a6ee87cdf7461b17dfSebastian Pop// change the current state to reflect that change.
78464f3a332f81364ee09794f9502f0b25671149c6Sebastian Popvoid DFAPacketizer::reserveResources(const llvm::MCInstrDesc *MID) {
79dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  unsigned InsnClass = MID->getSchedClass();
80464f3a332f81364ee09794f9502f0b25671149c6Sebastian Pop  const llvm::InstrStage *IS = InstrItins->beginStage(InsnClass);
81b460a3382961c5be9952a75d46228f624edbd39fHal Finkel  unsigned FuncUnits = IS->getUnits();
82dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  UnsignPair StateTrans = UnsignPair(CurrentState, FuncUnits);
83dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  ReadTable(CurrentState);
84dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  assert(CachedTable.count(StateTrans) != 0);
85dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  CurrentState = CachedTable[StateTrans];
86dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta}
87dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta
88dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta
89dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// canReserveResources - Check if the resources occupied by a machine
90f6f77e90a18142e196cbc2a6ee87cdf7461b17dfSebastian Pop// instruction are available in the current state.
91464f3a332f81364ee09794f9502f0b25671149c6Sebastian Popbool DFAPacketizer::canReserveResources(llvm::MachineInstr *MI) {
92464f3a332f81364ee09794f9502f0b25671149c6Sebastian Pop  const llvm::MCInstrDesc &MID = MI->getDesc();
93dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  return canReserveResources(&MID);
94dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta}
95dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta
96dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta// reserveResources - Reserve the resources occupied by a machine
97f6f77e90a18142e196cbc2a6ee87cdf7461b17dfSebastian Pop// instruction and change the current state to reflect that change.
98464f3a332f81364ee09794f9502f0b25671149c6Sebastian Popvoid DFAPacketizer::reserveResources(llvm::MachineInstr *MI) {
99464f3a332f81364ee09794f9502f0b25671149c6Sebastian Pop  const llvm::MCInstrDesc &MID = MI->getDesc();
100dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  reserveResources(&MID);
101dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta}
102ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
103902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pandenamespace llvm {
104ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick// DefaultVLIWScheduler - This class extends ScheduleDAGInstrs and overrides
105ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick// Schedule method to build the dependence graph.
106ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trickclass DefaultVLIWScheduler : public ScheduleDAGInstrs {
107ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trickpublic:
108ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick  DefaultVLIWScheduler(MachineFunction &MF, MachineLoopInfo &MLI,
10937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                       bool IsPostRA);
110ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick  // Schedule - Actual scheduling work.
11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void schedule() override;
112ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick};
113902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande}
114e746186ed4f61bf5eba13112cb8419c95cf58e52Andrew Trick
11537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesDefaultVLIWScheduler::DefaultVLIWScheduler(MachineFunction &MF,
11637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                           MachineLoopInfo &MLI, bool IsPostRA)
11737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    : ScheduleDAGInstrs(MF, &MLI, IsPostRA) {
118902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande  CanHandleTerminators = true;
119ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick}
120ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
121953be893e8cffa0ef9bf410036cd96aeb526e98aAndrew Trickvoid DefaultVLIWScheduler::schedule() {
122ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick  // Build the scheduling graph.
123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  buildSchedGraph(nullptr);
124ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick}
125ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
126ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick// VLIWPacketizerList Ctor
12737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesVLIWPacketizerList::VLIWPacketizerList(MachineFunction &MF,
12837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                       MachineLoopInfo &MLI, bool IsPostRA)
12937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    : MF(MF) {
13037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  TII = MF.getSubtarget().getInstrInfo();
13137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ResourceTracker = TII->CreateTargetScheduleState(MF.getSubtarget());
13237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  VLIWScheduler = new DefaultVLIWScheduler(MF, MLI, IsPostRA);
133ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick}
134ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
135ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick// VLIWPacketizerList Dtor
136ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew TrickVLIWPacketizerList::~VLIWPacketizerList() {
137902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande  if (VLIWScheduler)
138902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande    delete VLIWScheduler;
139ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
140902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande  if (ResourceTracker)
141902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande    delete ResourceTracker;
142ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick}
143ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
144ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick// endPacket - End the current packet, bundle packet instructions and reset
145ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick// DFA state.
146ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trickvoid VLIWPacketizerList::endPacket(MachineBasicBlock *MBB,
147902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande                                         MachineInstr *MI) {
148ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick  if (CurrentPacketMIs.size() > 1) {
149ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick    MachineInstr *MIFirst = CurrentPacketMIs.front();
150902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande    finalizeBundle(*MBB, MIFirst, MI);
151ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick  }
152ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick  CurrentPacketMIs.clear();
153ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick  ResourceTracker->clearResources();
154ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick}
155ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
156ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick// PacketizeMIs - Bundle machine instructions into packets.
157ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trickvoid VLIWPacketizerList::PacketizeMIs(MachineBasicBlock *MBB,
158ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick                                      MachineBasicBlock::iterator BeginItr,
159ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick                                      MachineBasicBlock::iterator EndItr) {
160902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande  assert(VLIWScheduler && "VLIW Scheduler is not initialized!");
161902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande  VLIWScheduler->startBlock(MBB);
162d2763f6ce62eaa497e944331668414e35f3712f3Andrew Trick  VLIWScheduler->enterRegion(MBB, BeginItr, EndItr,
163d2763f6ce62eaa497e944331668414e35f3712f3Andrew Trick                             std::distance(BeginItr, EndItr));
164902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande  VLIWScheduler->schedule();
165902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande
166902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande  // Generate MI -> SU map.
167902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande  MIToSUnit.clear();
168902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande  for (unsigned i = 0, e = VLIWScheduler->SUnits.size(); i != e; ++i) {
169902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande    SUnit *SU = &VLIWScheduler->SUnits[i];
170902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande    MIToSUnit[SU->getInstr()] = SU;
171902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande  }
172ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
173ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick  // The main packetizer loop.
174ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick  for (; BeginItr != EndItr; ++BeginItr) {
175ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick    MachineInstr *MI = BeginItr;
176ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
177902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande    this->initPacketizerState();
178ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
179ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick    // End the current packet if needed.
180902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande    if (this->isSoloInstruction(MI)) {
181ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick      endPacket(MBB, MI);
182ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick      continue;
183ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick    }
184ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
185902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande    // Ignore pseudo instructions.
186902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande    if (this->ignorePseudoInstruction(MI, MBB))
187902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande      continue;
188902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande
189902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande    SUnit *SUI = MIToSUnit[MI];
190ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick    assert(SUI && "Missing SUnit Info!");
191ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
192ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick    // Ask DFA if machine resource is available for MI.
193ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick    bool ResourceAvail = ResourceTracker->canReserveResources(MI);
194ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick    if (ResourceAvail) {
195ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick      // Dependency check for MI with instructions in CurrentPacketMIs.
196ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick      for (std::vector<MachineInstr*>::iterator VI = CurrentPacketMIs.begin(),
197ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick           VE = CurrentPacketMIs.end(); VI != VE; ++VI) {
198ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick        MachineInstr *MJ = *VI;
199902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande        SUnit *SUJ = MIToSUnit[MJ];
200ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick        assert(SUJ && "Missing SUnit Info!");
201ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
202ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick        // Is it legal to packetize SUI and SUJ together.
203902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande        if (!this->isLegalToPacketizeTogether(SUI, SUJ)) {
204ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick          // Allow packetization if dependency can be pruned.
205902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande          if (!this->isLegalToPruneDependencies(SUI, SUJ)) {
206ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick            // End the packet if dependency cannot be pruned.
207ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick            endPacket(MBB, MI);
208ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick            break;
209ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick          } // !isLegalToPruneDependencies.
210ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick        } // !isLegalToPacketizeTogether.
211ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick      } // For all instructions in CurrentPacketMIs.
212ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick    } else {
213ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick      // End the packet if resource is not available.
214ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick      endPacket(MBB, MI);
215ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick    }
216ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
217ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick    // Add MI to the current packet.
218902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande    BeginItr = this->addToPacket(MI);
219ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick  } // For all instructions in BB.
220ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick
221ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick  // End any packet left behind.
222ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick  endPacket(MBB, EndItr);
223902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande  VLIWScheduler->exitRegion();
224902337092fef14ce2519b4c93c37d72bf66ce768Sirish Pande  VLIWScheduler->finishBlock();
225ebafa0c61170682ec0d7025f46f187a164b0db7eAndrew Trick}
226