annotate lib/CodeGen/TargetSchedule.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
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1 //===- llvm/Target/TargetSchedule.cpp - Sched Machine Model ---------------===//
0
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 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 // This file implements a wrapper around MCSchedModel that allows the interface
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 // to benefit from information currently only available in TargetInstrInfo.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 //===----------------------------------------------------------------------===//
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 #include "llvm/CodeGen/TargetSchedule.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
16 #include "llvm/CodeGen/MachineFunction.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
17 #include "llvm/CodeGen/MachineInstr.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
18 #include "llvm/CodeGen/MachineOperand.h"
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
19 #include "llvm/CodeGen/TargetInstrInfo.h"
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
20 #include "llvm/CodeGen/TargetRegisterInfo.h"
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
21 #include "llvm/CodeGen/TargetSubtargetInfo.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
22 #include "llvm/MC/MCInstrDesc.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
23 #include "llvm/MC/MCInstrItineraries.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
24 #include "llvm/MC/MCSchedule.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 #include "llvm/Support/CommandLine.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
26 #include "llvm/Support/ErrorHandling.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 #include "llvm/Support/raw_ostream.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
28 #include <algorithm>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
29 #include <cassert>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
30 #include <cstdint>
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 using namespace llvm;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 static cl::opt<bool> EnableSchedModel("schedmodel", cl::Hidden, cl::init(true),
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 cl::desc("Use TargetSchedModel for latency lookup"));
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 static cl::opt<bool> EnableSchedItins("scheditins", cl::Hidden, cl::init(true),
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 cl::desc("Use InstrItineraryData for latency lookup"));
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 bool TargetSchedModel::hasInstrSchedModel() const {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 return EnableSchedModel && SchedModel.hasInstrSchedModel();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 bool TargetSchedModel::hasInstrItineraries() const {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 return EnableSchedItins && !InstrItins.isEmpty();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 static unsigned gcd(unsigned Dividend, unsigned Divisor) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 // Dividend and Divisor will be naturally swapped as needed.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
50 while (Divisor) {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 unsigned Rem = Dividend % Divisor;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 Dividend = Divisor;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 Divisor = Rem;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 };
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 return Dividend;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
57
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 static unsigned lcm(unsigned A, unsigned B) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 unsigned LCM = (uint64_t(A) * B) / gcd(A, B);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 assert((LCM >= A && LCM >= B) && "LCM overflow");
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 return LCM;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 void TargetSchedModel::init(const MCSchedModel &sm,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 const TargetSubtargetInfo *sti,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 const TargetInstrInfo *tii) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 SchedModel = sm;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 STI = sti;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 TII = tii;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 STI->initInstrItins(InstrItins);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 unsigned NumRes = SchedModel.getNumProcResourceKinds();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 ResourceFactors.resize(NumRes);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 ResourceLCM = SchedModel.IssueWidth;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 for (unsigned Idx = 0; Idx < NumRes; ++Idx) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 unsigned NumUnits = SchedModel.getProcResource(Idx)->NumUnits;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 if (NumUnits > 0)
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 ResourceLCM = lcm(ResourceLCM, NumUnits);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 MicroOpFactor = ResourceLCM / SchedModel.IssueWidth;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 for (unsigned Idx = 0; Idx < NumRes; ++Idx) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 unsigned NumUnits = SchedModel.getProcResource(Idx)->NumUnits;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 ResourceFactors[Idx] = NumUnits ? (ResourceLCM / NumUnits) : 0;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
87 /// Returns true only if instruction is specified as single issue.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
88 bool TargetSchedModel::mustBeginGroup(const MachineInstr *MI,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
89 const MCSchedClassDesc *SC) const {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
90 if (hasInstrSchedModel()) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
91 if (!SC)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
92 SC = resolveSchedClass(MI);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
93 if (SC->isValid())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
94 return SC->BeginGroup;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
95 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
96 return false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
97 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
98
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
99 bool TargetSchedModel::mustEndGroup(const MachineInstr *MI,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
100 const MCSchedClassDesc *SC) const {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
101 if (hasInstrSchedModel()) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
102 if (!SC)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
103 SC = resolveSchedClass(MI);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
104 if (SC->isValid())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
105 return SC->EndGroup;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
106 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
107 return false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
108 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
109
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 unsigned TargetSchedModel::getNumMicroOps(const MachineInstr *MI,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 const MCSchedClassDesc *SC) const {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 if (hasInstrItineraries()) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 int UOps = InstrItins.getNumMicroOps(MI->getDesc().getSchedClass());
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
114 return (UOps >= 0) ? UOps : TII->getNumMicroOps(&InstrItins, *MI);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 if (hasInstrSchedModel()) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 if (!SC)
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 SC = resolveSchedClass(MI);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 if (SC->isValid())
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 return SC->NumMicroOps;
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 return MI->isTransient() ? 0 : 1;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 // The machine model may explicitly specify an invalid latency, which
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 // effectively means infinite latency. Since users of the TargetSchedule API
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 // don't know how to handle this, we convert it to a very large latency that is
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 // easy to distinguish when debugging the DAG but won't induce overflow.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 static unsigned capLatency(int Cycles) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 return Cycles >= 0 ? Cycles : 1000;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 /// Return the MCSchedClassDesc for this instruction. Some SchedClasses require
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 /// evaluation of predicates that depend on instruction operands or flags.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 const MCSchedClassDesc *TargetSchedModel::
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 resolveSchedClass(const MachineInstr *MI) const {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 // Get the definition's scheduling class descriptor from this machine model.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 unsigned SchedClass = MI->getDesc().getSchedClass();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 const MCSchedClassDesc *SCDesc = SchedModel.getSchedClassDesc(SchedClass);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 if (!SCDesc->isValid())
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 return SCDesc;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 #ifndef NDEBUG
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 unsigned NIter = 0;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 #endif
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 while (SCDesc->isVariant()) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 assert(++NIter < 6 && "Variants are nested deeper than the magic number");
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 SchedClass = STI->resolveSchedClass(SchedClass, MI, this);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 SCDesc = SchedModel.getSchedClassDesc(SchedClass);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 return SCDesc;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 }
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 /// Find the def index of this operand. This index maps to the machine model and
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 /// is independent of use operands. Def operands may be reordered with uses or
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 /// merged with uses without affecting the def index (e.g. before/after
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 /// regalloc). However, an instruction's def operands must never be reordered
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 /// with respect to each other.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 static unsigned findDefIdx(const MachineInstr *MI, unsigned DefOperIdx) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 unsigned DefIdx = 0;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 for (unsigned i = 0; i != DefOperIdx; ++i) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 const MachineOperand &MO = MI->getOperand(i);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 if (MO.isReg() && MO.isDef())
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 ++DefIdx;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 return DefIdx;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 /// Find the use index of this operand. This is independent of the instruction's
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 /// def operands.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 ///
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 /// Note that uses are not determined by the operand's isUse property, which
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 /// is simply the inverse of isDef. Here we consider any readsReg operand to be
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 /// a "use". The machine model allows an operand to be both a Def and Use.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 static unsigned findUseIdx(const MachineInstr *MI, unsigned UseOperIdx) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 unsigned UseIdx = 0;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 for (unsigned i = 0; i != UseOperIdx; ++i) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 const MachineOperand &MO = MI->getOperand(i);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
180 if (MO.isReg() && MO.readsReg() && !MO.isDef())
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 ++UseIdx;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 return UseIdx;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
185
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 // Top-level API for clients that know the operand indices.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 unsigned TargetSchedModel::computeOperandLatency(
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 const MachineInstr *DefMI, unsigned DefOperIdx,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 const MachineInstr *UseMI, unsigned UseOperIdx) const {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
190
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 if (!hasInstrSchedModel() && !hasInstrItineraries())
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
192 return TII->defaultDefLatency(SchedModel, *DefMI);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 if (hasInstrItineraries()) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 int OperLatency = 0;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 if (UseMI) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
197 OperLatency = TII->getOperandLatency(&InstrItins, *DefMI, DefOperIdx,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
198 *UseMI, UseOperIdx);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 else {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 unsigned DefClass = DefMI->getDesc().getSchedClass();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 OperLatency = InstrItins.getOperandCycle(DefClass, DefOperIdx);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 if (OperLatency >= 0)
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 return OperLatency;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 // No operand latency was found.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
208 unsigned InstrLatency = TII->getInstrLatency(&InstrItins, *DefMI);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 // Expected latency is the max of the stage latency and itinerary props.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 // Rather than directly querying InstrItins stage latency, we call a TII
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 // hook to allow subtargets to specialize latency. This hook is only
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 // applicable to the InstrItins model. InstrSchedModel should model all
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 // special cases without TII hooks.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
215 InstrLatency =
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
216 std::max(InstrLatency, TII->defaultDefLatency(SchedModel, *DefMI));
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 return InstrLatency;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 // hasInstrSchedModel()
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 const MCSchedClassDesc *SCDesc = resolveSchedClass(DefMI);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 unsigned DefIdx = findDefIdx(DefMI, DefOperIdx);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 if (DefIdx < SCDesc->NumWriteLatencyEntries) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 // Lookup the definition's write latency in SubtargetInfo.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 const MCWriteLatencyEntry *WLEntry =
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 STI->getWriteLatencyEntry(SCDesc, DefIdx);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 unsigned WriteID = WLEntry->WriteResourceID;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 unsigned Latency = capLatency(WLEntry->Cycles);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 if (!UseMI)
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 return Latency;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 // Lookup the use's latency adjustment in SubtargetInfo.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 const MCSchedClassDesc *UseDesc = resolveSchedClass(UseMI);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 if (UseDesc->NumReadAdvanceEntries == 0)
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 return Latency;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 unsigned UseIdx = findUseIdx(UseMI, UseOperIdx);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 int Advance = STI->getReadAdvanceCycles(UseDesc, UseIdx, WriteID);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 if (Advance > 0 && (unsigned)Advance > Latency) // unsigned wrap
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 return 0;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 return Latency - Advance;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 // If DefIdx does not exist in the model (e.g. implicit defs), then return
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 // unit latency (defaultDefLatency may be too conservative).
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 #ifndef NDEBUG
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 if (SCDesc->isValid() && !DefMI->getOperand(DefOperIdx).isImplicit()
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 && !DefMI->getDesc().OpInfo[DefOperIdx].isOptionalDef()
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 && SchedModel.isComplete()) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
247 errs() << "DefIdx " << DefIdx << " exceeds machine model writes for "
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
248 << *DefMI << " (Try with MCSchedModel.CompleteModel set to false)";
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
249 llvm_unreachable("incomplete machine model");
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
250 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 #endif
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 // FIXME: Automatically giving all implicit defs defaultDefLatency is
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 // undesirable. We should only do it for defs that are known to the MC
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 // desc like flags. Truly implicit defs should get 1 cycle latency.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
255 return DefMI->isTransient() ? 0 : TII->defaultDefLatency(SchedModel, *DefMI);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
256 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
257
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
258 unsigned
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
259 TargetSchedModel::computeInstrLatency(const MCSchedClassDesc &SCDesc) const {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
260 unsigned Latency = 0;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
261 for (unsigned DefIdx = 0, DefEnd = SCDesc.NumWriteLatencyEntries;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
262 DefIdx != DefEnd; ++DefIdx) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
263 // Lookup the definition's write latency in SubtargetInfo.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
264 const MCWriteLatencyEntry *WLEntry =
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
265 STI->getWriteLatencyEntry(&SCDesc, DefIdx);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
266 Latency = std::max(Latency, capLatency(WLEntry->Cycles));
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
267 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
268 return Latency;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
269 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
270
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
271 unsigned TargetSchedModel::computeInstrLatency(unsigned Opcode) const {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
272 assert(hasInstrSchedModel() && "Only call this function with a SchedModel");
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
273
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
274 unsigned SCIdx = TII->get(Opcode).getSchedClass();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
275 const MCSchedClassDesc *SCDesc = SchedModel.getSchedClassDesc(SCIdx);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
276
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
277 if (SCDesc->isValid() && !SCDesc->isVariant())
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
278 return computeInstrLatency(*SCDesc);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
279
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
280 if (SCDesc->isValid()) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
281 assert (!SCDesc->isVariant() && "No MI sched latency: SCDesc->isVariant()");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
282 return computeInstrLatency(*SCDesc);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
283 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
284 return 0;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
285 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
286
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
287 unsigned
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
288 TargetSchedModel::computeInstrLatency(const MachineInstr *MI,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
289 bool UseDefaultDefLatency) const {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
290 // For the itinerary model, fall back to the old subtarget hook.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
291 // Allow subtargets to compute Bundle latencies outside the machine model.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
292 if (hasInstrItineraries() || MI->isBundle() ||
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
293 (!hasInstrSchedModel() && !UseDefaultDefLatency))
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
294 return TII->getInstrLatency(&InstrItins, *MI);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
295
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 if (hasInstrSchedModel()) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
297 const MCSchedClassDesc *SCDesc = resolveSchedClass(MI);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
298 if (SCDesc->isValid())
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
299 return computeInstrLatency(*SCDesc);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
301 return TII->defaultDefLatency(SchedModel, *MI);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
303
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 unsigned TargetSchedModel::
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 computeOutputLatency(const MachineInstr *DefMI, unsigned DefOperIdx,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 const MachineInstr *DepMI) const {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
307 if (!SchedModel.isOutOfOrder())
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 return 1;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
309
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
310 // Out-of-order processor can dispatch WAW dependencies in the same cycle.
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
311
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 // Treat predication as a data dependency for out-of-order cpus. In-order
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
313 // cpus do not need to treat predicated writes specially.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
315 // TODO: The following hack exists because predication passes do not
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 // correctly append imp-use operands, and readsReg() strangely returns false
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
317 // for predicated defs.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
318 unsigned Reg = DefMI->getOperand(DefOperIdx).getReg();
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
319 const MachineFunction &MF = *DefMI->getMF();
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
320 const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
321 if (!DepMI->readsRegister(Reg, TRI) && TII->isPredicated(*DepMI))
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
322 return computeInstrLatency(DefMI);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
323
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 // If we have a per operand scheduling model, check if this def is writing
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
325 // an unbuffered resource. If so, it treated like an in-order cpu.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 if (hasInstrSchedModel()) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
327 const MCSchedClassDesc *SCDesc = resolveSchedClass(DefMI);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
328 if (SCDesc->isValid()) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
329 for (const MCWriteProcResEntry *PRI = STI->getWriteProcResBegin(SCDesc),
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
330 *PRE = STI->getWriteProcResEnd(SCDesc); PRI != PRE; ++PRI) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
331 if (!SchedModel.getProcResource(PRI->ProcResourceIdx)->BufferSize)
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
332 return 1;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
333 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
334 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
335 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
336 return 0;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
337 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
338
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
339 static Optional<double>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
340 getRThroughputFromItineraries(unsigned schedClass,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
341 const InstrItineraryData *IID){
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
342 Optional<double> Throughput;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
343
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
344 for (const InstrStage *IS = IID->beginStage(schedClass),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
345 *E = IID->endStage(schedClass);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
346 IS != E; ++IS) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
347 if (IS->getCycles()) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
348 double Temp = countPopulation(IS->getUnits()) * 1.0 / IS->getCycles();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
349 Throughput = Throughput.hasValue()
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
350 ? std::min(Throughput.getValue(), Temp)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
351 : Temp;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
352 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
353 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
354 if (Throughput.hasValue())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
355 // We need reciprocal throughput that's why we return such value.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
356 return 1 / Throughput.getValue();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
357 return Throughput;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
358 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
359
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
360 static Optional<double>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
361 getRThroughputFromInstrSchedModel(const MCSchedClassDesc *SCDesc,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
362 const TargetSubtargetInfo *STI,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
363 const MCSchedModel &SchedModel) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
364 Optional<double> Throughput;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
365
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
366 for (const MCWriteProcResEntry *WPR = STI->getWriteProcResBegin(SCDesc),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
367 *WEnd = STI->getWriteProcResEnd(SCDesc);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
368 WPR != WEnd; ++WPR) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
369 if (WPR->Cycles) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
370 unsigned NumUnits =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
371 SchedModel.getProcResource(WPR->ProcResourceIdx)->NumUnits;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
372 double Temp = NumUnits * 1.0 / WPR->Cycles;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
373 Throughput = Throughput.hasValue()
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
374 ? std::min(Throughput.getValue(), Temp)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
375 : Temp;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
376 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
377 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
378 if (Throughput.hasValue())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
379 // We need reciprocal throughput that's why we return such value.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
380 return 1 / Throughput.getValue();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
381 return Throughput;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
382 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
383
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
384 Optional<double>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
385 TargetSchedModel::computeInstrRThroughput(const MachineInstr *MI) const {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
386 if (hasInstrItineraries())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
387 return getRThroughputFromItineraries(MI->getDesc().getSchedClass(),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
388 getInstrItineraries());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
389 if (hasInstrSchedModel())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
390 return getRThroughputFromInstrSchedModel(resolveSchedClass(MI), STI,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
391 SchedModel);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
392 return Optional<double>();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
393 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
394
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
395 Optional<double>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
396 TargetSchedModel::computeInstrRThroughput(unsigned Opcode) const {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
397 unsigned SchedClass = TII->get(Opcode).getSchedClass();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
398 if (hasInstrItineraries())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
399 return getRThroughputFromItineraries(SchedClass, getInstrItineraries());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
400 if (hasInstrSchedModel()) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
401 const MCSchedClassDesc *SCDesc = SchedModel.getSchedClassDesc(SchedClass);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
402 if (SCDesc->isValid() && !SCDesc->isVariant())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
403 return getRThroughputFromInstrSchedModel(SCDesc, STI, SchedModel);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
404 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
405 return Optional<double>();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
406 }