annotate lib/CodeGen/DFAPacketizer.cpp @ 134:3a76565eade5 LLVM5.0.1

update 5.0.1
author mir3636
date Sat, 17 Feb 2018 09:57:20 +0900
parents 803732b1fca8
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //=- llvm/CodeGen/DFAPacketizer.cpp - DFA Packetizer for VLIW -*- C++ -*-=====//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 // This class implements a deterministic finite automaton (DFA) based
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 // packetizing mechanism for VLIW architectures. It provides APIs to
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 // determine whether there exists a legal mapping of instructions to
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 // functional unit assignments in a packet. The DFA is auto-generated from
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 // the target's Schedule.td file.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 // A DFA consists of 3 major elements: states, inputs, and transitions. For
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 // the packetizing mechanism, the input is the set of instruction classes for
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 // a target. The state models all possible combinations of functional unit
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 // consumption for a given set of instructions in a packet. A transition
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 // models the addition of an instruction to a packet. In the DFA constructed
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 // by this class, if an instruction can be added to a packet, then a valid
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 // transition exists from the corresponding state. Invalid transitions
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 // indicate that the instruction cannot be added to the current packet.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 #include "llvm/CodeGen/DFAPacketizer.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
27 #include "llvm/CodeGen/MachineFunction.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 #include "llvm/CodeGen/MachineInstr.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 #include "llvm/CodeGen/MachineInstrBundle.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
30 #include "llvm/CodeGen/ScheduleDAG.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 #include "llvm/CodeGen/ScheduleDAGInstrs.h"
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
32 #include "llvm/CodeGen/TargetInstrInfo.h"
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
33 #include "llvm/CodeGen/TargetSubtargetInfo.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
34 #include "llvm/MC/MCInstrDesc.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 #include "llvm/MC/MCInstrItineraries.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
36 #include "llvm/Support/CommandLine.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
37 #include "llvm/Support/Debug.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
38 #include "llvm/Support/raw_ostream.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
39 #include <algorithm>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
40 #include <cassert>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
41 #include <iterator>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
42 #include <memory>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
43 #include <vector>
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
44
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 using namespace llvm;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
47 #define DEBUG_TYPE "packets"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
48
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
49 static cl::opt<unsigned> InstrLimit("dfa-instr-limit", cl::Hidden,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
50 cl::init(0), cl::desc("If present, stops packetizing after N instructions"));
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
51
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
52 static unsigned InstrCount = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
53
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
54 // --------------------------------------------------------------------
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
55 // Definitions shared between DFAPacketizer.cpp and DFAPacketizerEmitter.cpp
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
56
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
57 static DFAInput addDFAFuncUnits(DFAInput Inp, unsigned FuncUnits) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
58 return (Inp << DFA_MAX_RESOURCES) | FuncUnits;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
59 }
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
60
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
61 /// Return the DFAInput for an instruction class input vector.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
62 /// This function is used in both DFAPacketizer.cpp and in
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
63 /// DFAPacketizerEmitter.cpp.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
64 static DFAInput getDFAInsnInput(const std::vector<unsigned> &InsnClass) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
65 DFAInput InsnInput = 0;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
66 assert((InsnClass.size() <= DFA_MAX_RESTERMS) &&
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
67 "Exceeded maximum number of DFA terms");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
68 for (auto U : InsnClass)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
69 InsnInput = addDFAFuncUnits(InsnInput, U);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
70 return InsnInput;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
71 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
72
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
73 // --------------------------------------------------------------------
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
74
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
75 DFAPacketizer::DFAPacketizer(const InstrItineraryData *I,
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
76 const DFAStateInput (*SIT)[2],
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 const unsigned *SET):
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
78 InstrItins(I), DFAStateInputTable(SIT), DFAStateEntryTable(SET) {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
79 // Make sure DFA types are large enough for the number of terms & resources.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
80 static_assert((DFA_MAX_RESTERMS * DFA_MAX_RESOURCES) <=
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
81 (8 * sizeof(DFAInput)),
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
82 "(DFA_MAX_RESTERMS * DFA_MAX_RESOURCES) too big for DFAInput");
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
83 static_assert(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
84 (DFA_MAX_RESTERMS * DFA_MAX_RESOURCES) <= (8 * sizeof(DFAStateInput)),
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
85 "(DFA_MAX_RESTERMS * DFA_MAX_RESOURCES) too big for DFAStateInput");
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
86 }
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
88 // Read the DFA transition table and update CachedTable.
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 // Format of the transition tables:
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 // DFAStateInputTable[][2] = pairs of <Input, Transition> for all valid
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 // transitions
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 // DFAStateEntryTable[i] = Index of the first entry in DFAStateInputTable
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 // for the ith state
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 void DFAPacketizer::ReadTable(unsigned int state) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 unsigned ThisState = DFAStateEntryTable[state];
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 unsigned NextStateInTable = DFAStateEntryTable[state+1];
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 // Early exit in case CachedTable has already contains this
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 // state's transitions.
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
101 if (CachedTable.count(UnsignPair(state, DFAStateInputTable[ThisState][0])))
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 return;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 for (unsigned i = ThisState; i < NextStateInTable; i++)
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 CachedTable[UnsignPair(state, DFAStateInputTable[i][0])] =
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 DFAStateInputTable[i][1];
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
109 // Return the DFAInput for an instruction class.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
110 DFAInput DFAPacketizer::getInsnInput(unsigned InsnClass) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
111 // Note: this logic must match that in DFAPacketizerDefs.h for input vectors.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
112 DFAInput InsnInput = 0;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
113 unsigned i = 0;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
114 (void)i;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
115 for (const InstrStage *IS = InstrItins->beginStage(InsnClass),
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
116 *IE = InstrItins->endStage(InsnClass); IS != IE; ++IS) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
117 InsnInput = addDFAFuncUnits(InsnInput, IS->getUnits());
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
118 assert((i++ < DFA_MAX_RESTERMS) && "Exceeded maximum number of DFA inputs");
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
119 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
120 return InsnInput;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
123 // Return the DFAInput for an instruction class input vector.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
124 DFAInput DFAPacketizer::getInsnInput(const std::vector<unsigned> &InsnClass) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
125 return getDFAInsnInput(InsnClass);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
126 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
127
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
128 // Check if the resources occupied by a MCInstrDesc are available in the
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
129 // current state.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
130 bool DFAPacketizer::canReserveResources(const MCInstrDesc *MID) {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
131 unsigned InsnClass = MID->getSchedClass();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
132 DFAInput InsnInput = getInsnInput(InsnClass);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
133 UnsignPair StateTrans = UnsignPair(CurrentState, InsnInput);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
134 ReadTable(CurrentState);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
135 return CachedTable.count(StateTrans) != 0;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
136 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
137
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
138 // Reserve the resources occupied by a MCInstrDesc and change the current
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
139 // state to reflect that change.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
140 void DFAPacketizer::reserveResources(const MCInstrDesc *MID) {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 unsigned InsnClass = MID->getSchedClass();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
142 DFAInput InsnInput = getInsnInput(InsnClass);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
143 UnsignPair StateTrans = UnsignPair(CurrentState, InsnInput);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 ReadTable(CurrentState);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 assert(CachedTable.count(StateTrans) != 0);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 CurrentState = CachedTable[StateTrans];
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
149 // Check if the resources occupied by a machine instruction are available
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
150 // in the current state.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
151 bool DFAPacketizer::canReserveResources(MachineInstr &MI) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
152 const MCInstrDesc &MID = MI.getDesc();
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 return canReserveResources(&MID);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
156 // Reserve the resources occupied by a machine instruction and change the
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
157 // current state to reflect that change.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
158 void DFAPacketizer::reserveResources(MachineInstr &MI) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
159 const MCInstrDesc &MID = MI.getDesc();
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 reserveResources(&MID);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
163 namespace llvm {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
164
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
165 // This class extends ScheduleDAGInstrs and overrides the schedule method
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
166 // to build the dependence graph.
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 class DefaultVLIWScheduler : public ScheduleDAGInstrs {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
168 private:
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
169 AliasAnalysis *AA;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
170 /// Ordered list of DAG postprocessing steps.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
171 std::vector<std::unique_ptr<ScheduleDAGMutation>> Mutations;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
172
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 public:
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 DefaultVLIWScheduler(MachineFunction &MF, MachineLoopInfo &MLI,
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
175 AliasAnalysis *AA);
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
176
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
177 // Actual scheduling work.
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
178 void schedule() override;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
179
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
180 /// DefaultVLIWScheduler takes ownership of the Mutation object.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
181 void addMutation(std::unique_ptr<ScheduleDAGMutation> Mutation) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
182 Mutations.push_back(std::move(Mutation));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
183 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
184
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
185 protected:
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
186 void postprocessDAG();
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 };
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
189 } // end namespace llvm
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
190
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
191 DefaultVLIWScheduler::DefaultVLIWScheduler(MachineFunction &MF,
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
192 MachineLoopInfo &MLI,
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
193 AliasAnalysis *AA)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
194 : ScheduleDAGInstrs(MF, &MLI), AA(AA) {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 CanHandleTerminators = true;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
198 /// Apply each ScheduleDAGMutation step in order.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
199 void DefaultVLIWScheduler::postprocessDAG() {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
200 for (auto &M : Mutations)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
201 M->apply(this);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
202 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
203
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 void DefaultVLIWScheduler::schedule() {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 // Build the scheduling graph.
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
206 buildSchedGraph(AA);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
207 postprocessDAG();
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
210 VLIWPacketizerList::VLIWPacketizerList(MachineFunction &mf,
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
211 MachineLoopInfo &mli, AliasAnalysis *aa)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
212 : MF(mf), TII(mf.getSubtarget().getInstrInfo()), AA(aa) {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
213 ResourceTracker = TII->CreateTargetScheduleState(MF.getSubtarget());
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
214 VLIWScheduler = new DefaultVLIWScheduler(MF, mli, AA);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 VLIWPacketizerList::~VLIWPacketizerList() {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
218 delete VLIWScheduler;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
219 delete ResourceTracker;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
222 // End the current packet, bundle packet instructions and reset DFA state.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
223 void VLIWPacketizerList::endPacket(MachineBasicBlock *MBB,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
224 MachineBasicBlock::iterator MI) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
225 DEBUG({
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
226 if (!CurrentPacketMIs.empty()) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
227 dbgs() << "Finalizing packet:\n";
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
228 for (MachineInstr *MI : CurrentPacketMIs)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
229 dbgs() << " * " << *MI;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
230 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
231 });
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 if (CurrentPacketMIs.size() > 1) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
233 MachineInstr &MIFirst = *CurrentPacketMIs.front();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
234 finalizeBundle(*MBB, MIFirst.getIterator(), MI.getInstrIterator());
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 CurrentPacketMIs.clear();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 ResourceTracker->clearResources();
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
238 DEBUG(dbgs() << "End packet\n");
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
241 // Bundle machine instructions into packets.
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 void VLIWPacketizerList::PacketizeMIs(MachineBasicBlock *MBB,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 MachineBasicBlock::iterator BeginItr,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 MachineBasicBlock::iterator EndItr) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 assert(VLIWScheduler && "VLIW Scheduler is not initialized!");
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 VLIWScheduler->startBlock(MBB);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 VLIWScheduler->enterRegion(MBB, BeginItr, EndItr,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 std::distance(BeginItr, EndItr));
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 VLIWScheduler->schedule();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
250
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
251 DEBUG({
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
252 dbgs() << "Scheduling DAG of the packetize region\n";
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
253 for (SUnit &SU : VLIWScheduler->SUnits)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
254 SU.dumpAll(VLIWScheduler);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
255 });
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
256
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 // Generate MI -> SU map.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 MIToSUnit.clear();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
259 for (SUnit &SU : VLIWScheduler->SUnits)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
260 MIToSUnit[SU.getInstr()] = &SU;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
261
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
262 bool LimitPresent = InstrLimit.getPosition();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
263
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
264 // The main packetizer loop.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
265 for (; BeginItr != EndItr; ++BeginItr) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
266 if (LimitPresent) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
267 if (InstrCount >= InstrLimit) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
268 EndItr = BeginItr;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
269 break;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
270 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
271 InstrCount++;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
272 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
273 MachineInstr &MI = *BeginItr;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
274 initPacketizerState();
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
275
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 // End the current packet if needed.
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
277 if (isSoloInstruction(MI)) {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 endPacket(MBB, MI);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 continue;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
281
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 // Ignore pseudo instructions.
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
283 if (ignorePseudoInstruction(MI, MBB))
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
284 continue;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
285
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
286 SUnit *SUI = MIToSUnit[&MI];
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
287 assert(SUI && "Missing SUnit Info!");
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
288
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
289 // Ask DFA if machine resource is available for MI.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
290 DEBUG(dbgs() << "Checking resources for adding MI to packet " << MI);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
291
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
292 bool ResourceAvail = ResourceTracker->canReserveResources(MI);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
293 DEBUG({
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
294 if (ResourceAvail)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
295 dbgs() << " Resources are available for adding MI to packet\n";
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
296 else
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
297 dbgs() << " Resources NOT available\n";
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
298 });
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
299 if (ResourceAvail && shouldAddToPacket(MI)) {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 // Dependency check for MI with instructions in CurrentPacketMIs.
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
301 for (auto MJ : CurrentPacketMIs) {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 SUnit *SUJ = MIToSUnit[MJ];
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 assert(SUJ && "Missing SUnit Info!");
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
304
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
305 DEBUG(dbgs() << " Checking against MJ " << *MJ);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 // Is it legal to packetize SUI and SUJ together.
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
307 if (!isLegalToPacketizeTogether(SUI, SUJ)) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
308 DEBUG(dbgs() << " Not legal to add MI, try to prune\n");
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 // Allow packetization if dependency can be pruned.
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
310 if (!isLegalToPruneDependencies(SUI, SUJ)) {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
311 // End the packet if dependency cannot be pruned.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
312 DEBUG(dbgs() << " Could not prune dependencies for adding MI\n");
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
313 endPacket(MBB, MI);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 break;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
315 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
316 DEBUG(dbgs() << " Pruned dependence for adding MI\n");
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
317 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
318 }
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 } else {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
320 DEBUG(if (ResourceAvail)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
321 dbgs() << "Resources are available, but instruction should not be "
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
322 "added to packet\n " << MI);
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
323 // End the packet if resource is not available, or if the instruction
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
324 // shoud not be added to the current packet.
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
325 endPacket(MBB, MI);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
327
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
328 // Add MI to the current packet.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
329 DEBUG(dbgs() << "* Adding MI to packet " << MI << '\n');
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
330 BeginItr = addToPacket(MI);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
331 } // For all instructions in the packetization range.
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
332
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
333 // End any packet left behind.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
334 endPacket(MBB, EndItr);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
335 VLIWScheduler->exitRegion();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
336 VLIWScheduler->finishBlock();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
337 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
338
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
339 bool VLIWPacketizerList::alias(const MachineMemOperand &Op1,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
340 const MachineMemOperand &Op2,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
341 bool UseTBAA) const {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
342 if (!Op1.getValue() || !Op2.getValue())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
343 return true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
344
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
345 int64_t MinOffset = std::min(Op1.getOffset(), Op2.getOffset());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
346 int64_t Overlapa = Op1.getSize() + Op1.getOffset() - MinOffset;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
347 int64_t Overlapb = Op2.getSize() + Op2.getOffset() - MinOffset;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
348
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
349 AliasResult AAResult =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
350 AA->alias(MemoryLocation(Op1.getValue(), Overlapa,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
351 UseTBAA ? Op1.getAAInfo() : AAMDNodes()),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
352 MemoryLocation(Op2.getValue(), Overlapb,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
353 UseTBAA ? Op2.getAAInfo() : AAMDNodes()));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
354
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
355 return AAResult != NoAlias;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
356 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
357
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
358 bool VLIWPacketizerList::alias(const MachineInstr &MI1,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
359 const MachineInstr &MI2,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
360 bool UseTBAA) const {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
361 if (MI1.memoperands_empty() || MI2.memoperands_empty())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
362 return true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
363
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
364 for (const MachineMemOperand *Op1 : MI1.memoperands())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
365 for (const MachineMemOperand *Op2 : MI2.memoperands())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
366 if (alias(*Op1, *Op2, UseTBAA))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
367 return true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
368 return false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
369 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
370
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
371 // Add a DAG mutation object to the ordered list.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
372 void VLIWPacketizerList::addMutation(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
373 std::unique_ptr<ScheduleDAGMutation> Mutation) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
374 VLIWScheduler->addMutation(std::move(Mutation));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
375 }