1*9880d681SAndroid Build Coastguard Worker //===-- MipsTargetMachine.cpp - Define TargetMachine for Mips -------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // Implements the info about Mips target spec.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "MipsTargetMachine.h"
15*9880d681SAndroid Build Coastguard Worker #include "Mips.h"
16*9880d681SAndroid Build Coastguard Worker #include "Mips16FrameLowering.h"
17*9880d681SAndroid Build Coastguard Worker #include "Mips16ISelDAGToDAG.h"
18*9880d681SAndroid Build Coastguard Worker #include "Mips16ISelLowering.h"
19*9880d681SAndroid Build Coastguard Worker #include "Mips16InstrInfo.h"
20*9880d681SAndroid Build Coastguard Worker #include "MipsFrameLowering.h"
21*9880d681SAndroid Build Coastguard Worker #include "MipsInstrInfo.h"
22*9880d681SAndroid Build Coastguard Worker #include "MipsSEFrameLowering.h"
23*9880d681SAndroid Build Coastguard Worker #include "MipsSEISelDAGToDAG.h"
24*9880d681SAndroid Build Coastguard Worker #include "MipsSEISelLowering.h"
25*9880d681SAndroid Build Coastguard Worker #include "MipsSEInstrInfo.h"
26*9880d681SAndroid Build Coastguard Worker #include "MipsTargetObjectFile.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/TargetTransformInfo.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/Passes.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/TargetPassConfig.h"
30*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LegacyPassManager.h"
31*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
32*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetRegistry.h"
33*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
34*9880d681SAndroid Build Coastguard Worker #include "llvm/Transforms/Scalar.h"
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker using namespace llvm;
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "mips"
39*9880d681SAndroid Build Coastguard Worker
LLVMInitializeMipsTarget()40*9880d681SAndroid Build Coastguard Worker extern "C" void LLVMInitializeMipsTarget() {
41*9880d681SAndroid Build Coastguard Worker // Register the target.
42*9880d681SAndroid Build Coastguard Worker RegisterTargetMachine<MipsebTargetMachine> X(TheMipsTarget);
43*9880d681SAndroid Build Coastguard Worker RegisterTargetMachine<MipselTargetMachine> Y(TheMipselTarget);
44*9880d681SAndroid Build Coastguard Worker RegisterTargetMachine<MipsebTargetMachine> A(TheMips64Target);
45*9880d681SAndroid Build Coastguard Worker RegisterTargetMachine<MipselTargetMachine> B(TheMips64elTarget);
46*9880d681SAndroid Build Coastguard Worker }
47*9880d681SAndroid Build Coastguard Worker
computeDataLayout(const Triple & TT,StringRef CPU,const TargetOptions & Options,bool isLittle)48*9880d681SAndroid Build Coastguard Worker static std::string computeDataLayout(const Triple &TT, StringRef CPU,
49*9880d681SAndroid Build Coastguard Worker const TargetOptions &Options,
50*9880d681SAndroid Build Coastguard Worker bool isLittle) {
51*9880d681SAndroid Build Coastguard Worker std::string Ret = "";
52*9880d681SAndroid Build Coastguard Worker MipsABIInfo ABI = MipsABIInfo::computeTargetABI(TT, CPU, Options.MCOptions);
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker // There are both little and big endian mips.
55*9880d681SAndroid Build Coastguard Worker if (isLittle)
56*9880d681SAndroid Build Coastguard Worker Ret += "e";
57*9880d681SAndroid Build Coastguard Worker else
58*9880d681SAndroid Build Coastguard Worker Ret += "E";
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker Ret += "-m:m";
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker // Pointers are 32 bit on some ABIs.
63*9880d681SAndroid Build Coastguard Worker if (!ABI.IsN64())
64*9880d681SAndroid Build Coastguard Worker Ret += "-p:32:32";
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker // 8 and 16 bit integers only need to have natural alignment, but try to
67*9880d681SAndroid Build Coastguard Worker // align them to 32 bits. 64 bit integers have natural alignment.
68*9880d681SAndroid Build Coastguard Worker Ret += "-i8:8:32-i16:16:32-i64:64";
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker // 32 bit registers are always available and the stack is at least 64 bit
71*9880d681SAndroid Build Coastguard Worker // aligned. On N64 64 bit registers are also available and the stack is
72*9880d681SAndroid Build Coastguard Worker // 128 bit aligned.
73*9880d681SAndroid Build Coastguard Worker if (ABI.IsN64() || ABI.IsN32())
74*9880d681SAndroid Build Coastguard Worker Ret += "-n32:64-S128";
75*9880d681SAndroid Build Coastguard Worker else
76*9880d681SAndroid Build Coastguard Worker Ret += "-n32-S64";
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker return Ret;
79*9880d681SAndroid Build Coastguard Worker }
80*9880d681SAndroid Build Coastguard Worker
getEffectiveRelocModel(CodeModel::Model CM,Optional<Reloc::Model> RM)81*9880d681SAndroid Build Coastguard Worker static Reloc::Model getEffectiveRelocModel(CodeModel::Model CM,
82*9880d681SAndroid Build Coastguard Worker Optional<Reloc::Model> RM) {
83*9880d681SAndroid Build Coastguard Worker if (!RM.hasValue() || CM == CodeModel::JITDefault)
84*9880d681SAndroid Build Coastguard Worker return Reloc::Static;
85*9880d681SAndroid Build Coastguard Worker return *RM;
86*9880d681SAndroid Build Coastguard Worker }
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker // On function prologue, the stack is created by decrementing
89*9880d681SAndroid Build Coastguard Worker // its pointer. Once decremented, all references are done with positive
90*9880d681SAndroid Build Coastguard Worker // offset from the stack/frame pointer, using StackGrowsUp enables
91*9880d681SAndroid Build Coastguard Worker // an easier handling.
92*9880d681SAndroid Build Coastguard Worker // Using CodeModel::Large enables different CALL behavior.
MipsTargetMachine(const Target & T,const Triple & TT,StringRef CPU,StringRef FS,const TargetOptions & Options,Optional<Reloc::Model> RM,CodeModel::Model CM,CodeGenOpt::Level OL,bool isLittle)93*9880d681SAndroid Build Coastguard Worker MipsTargetMachine::MipsTargetMachine(const Target &T, const Triple &TT,
94*9880d681SAndroid Build Coastguard Worker StringRef CPU, StringRef FS,
95*9880d681SAndroid Build Coastguard Worker const TargetOptions &Options,
96*9880d681SAndroid Build Coastguard Worker Optional<Reloc::Model> RM,
97*9880d681SAndroid Build Coastguard Worker CodeModel::Model CM, CodeGenOpt::Level OL,
98*9880d681SAndroid Build Coastguard Worker bool isLittle)
99*9880d681SAndroid Build Coastguard Worker : LLVMTargetMachine(T, computeDataLayout(TT, CPU, Options, isLittle), TT,
100*9880d681SAndroid Build Coastguard Worker CPU, FS, Options, getEffectiveRelocModel(CM, RM), CM,
101*9880d681SAndroid Build Coastguard Worker OL),
102*9880d681SAndroid Build Coastguard Worker isLittle(isLittle), TLOF(make_unique<MipsTargetObjectFile>()),
103*9880d681SAndroid Build Coastguard Worker ABI(MipsABIInfo::computeTargetABI(TT, CPU, Options.MCOptions)),
104*9880d681SAndroid Build Coastguard Worker Subtarget(nullptr), DefaultSubtarget(TT, CPU, FS, isLittle, *this),
105*9880d681SAndroid Build Coastguard Worker NoMips16Subtarget(TT, CPU, FS.empty() ? "-mips16" : FS.str() + ",-mips16",
106*9880d681SAndroid Build Coastguard Worker isLittle, *this),
107*9880d681SAndroid Build Coastguard Worker Mips16Subtarget(TT, CPU, FS.empty() ? "+mips16" : FS.str() + ",+mips16",
108*9880d681SAndroid Build Coastguard Worker isLittle, *this) {
109*9880d681SAndroid Build Coastguard Worker Subtarget = &DefaultSubtarget;
110*9880d681SAndroid Build Coastguard Worker initAsmInfo();
111*9880d681SAndroid Build Coastguard Worker }
112*9880d681SAndroid Build Coastguard Worker
~MipsTargetMachine()113*9880d681SAndroid Build Coastguard Worker MipsTargetMachine::~MipsTargetMachine() {}
114*9880d681SAndroid Build Coastguard Worker
anchor()115*9880d681SAndroid Build Coastguard Worker void MipsebTargetMachine::anchor() { }
116*9880d681SAndroid Build Coastguard Worker
MipsebTargetMachine(const Target & T,const Triple & TT,StringRef CPU,StringRef FS,const TargetOptions & Options,Optional<Reloc::Model> RM,CodeModel::Model CM,CodeGenOpt::Level OL)117*9880d681SAndroid Build Coastguard Worker MipsebTargetMachine::MipsebTargetMachine(const Target &T, const Triple &TT,
118*9880d681SAndroid Build Coastguard Worker StringRef CPU, StringRef FS,
119*9880d681SAndroid Build Coastguard Worker const TargetOptions &Options,
120*9880d681SAndroid Build Coastguard Worker Optional<Reloc::Model> RM,
121*9880d681SAndroid Build Coastguard Worker CodeModel::Model CM,
122*9880d681SAndroid Build Coastguard Worker CodeGenOpt::Level OL)
123*9880d681SAndroid Build Coastguard Worker : MipsTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, false) {}
124*9880d681SAndroid Build Coastguard Worker
anchor()125*9880d681SAndroid Build Coastguard Worker void MipselTargetMachine::anchor() { }
126*9880d681SAndroid Build Coastguard Worker
MipselTargetMachine(const Target & T,const Triple & TT,StringRef CPU,StringRef FS,const TargetOptions & Options,Optional<Reloc::Model> RM,CodeModel::Model CM,CodeGenOpt::Level OL)127*9880d681SAndroid Build Coastguard Worker MipselTargetMachine::MipselTargetMachine(const Target &T, const Triple &TT,
128*9880d681SAndroid Build Coastguard Worker StringRef CPU, StringRef FS,
129*9880d681SAndroid Build Coastguard Worker const TargetOptions &Options,
130*9880d681SAndroid Build Coastguard Worker Optional<Reloc::Model> RM,
131*9880d681SAndroid Build Coastguard Worker CodeModel::Model CM,
132*9880d681SAndroid Build Coastguard Worker CodeGenOpt::Level OL)
133*9880d681SAndroid Build Coastguard Worker : MipsTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true) {}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker const MipsSubtarget *
getSubtargetImpl(const Function & F) const136*9880d681SAndroid Build Coastguard Worker MipsTargetMachine::getSubtargetImpl(const Function &F) const {
137*9880d681SAndroid Build Coastguard Worker Attribute CPUAttr = F.getFnAttribute("target-cpu");
138*9880d681SAndroid Build Coastguard Worker Attribute FSAttr = F.getFnAttribute("target-features");
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker std::string CPU = !CPUAttr.hasAttribute(Attribute::None)
141*9880d681SAndroid Build Coastguard Worker ? CPUAttr.getValueAsString().str()
142*9880d681SAndroid Build Coastguard Worker : TargetCPU;
143*9880d681SAndroid Build Coastguard Worker std::string FS = !FSAttr.hasAttribute(Attribute::None)
144*9880d681SAndroid Build Coastguard Worker ? FSAttr.getValueAsString().str()
145*9880d681SAndroid Build Coastguard Worker : TargetFS;
146*9880d681SAndroid Build Coastguard Worker bool hasMips16Attr =
147*9880d681SAndroid Build Coastguard Worker !F.getFnAttribute("mips16").hasAttribute(Attribute::None);
148*9880d681SAndroid Build Coastguard Worker bool hasNoMips16Attr =
149*9880d681SAndroid Build Coastguard Worker !F.getFnAttribute("nomips16").hasAttribute(Attribute::None);
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker // FIXME: This is related to the code below to reset the target options,
152*9880d681SAndroid Build Coastguard Worker // we need to know whether or not the soft float flag is set on the
153*9880d681SAndroid Build Coastguard Worker // function, so we can enable it as a subtarget feature.
154*9880d681SAndroid Build Coastguard Worker bool softFloat =
155*9880d681SAndroid Build Coastguard Worker F.hasFnAttribute("use-soft-float") &&
156*9880d681SAndroid Build Coastguard Worker F.getFnAttribute("use-soft-float").getValueAsString() == "true";
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker if (hasMips16Attr)
159*9880d681SAndroid Build Coastguard Worker FS += FS.empty() ? "+mips16" : ",+mips16";
160*9880d681SAndroid Build Coastguard Worker else if (hasNoMips16Attr)
161*9880d681SAndroid Build Coastguard Worker FS += FS.empty() ? "-mips16" : ",-mips16";
162*9880d681SAndroid Build Coastguard Worker if (softFloat)
163*9880d681SAndroid Build Coastguard Worker FS += FS.empty() ? "+soft-float" : ",+soft-float";
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker auto &I = SubtargetMap[CPU + FS];
166*9880d681SAndroid Build Coastguard Worker if (!I) {
167*9880d681SAndroid Build Coastguard Worker // This needs to be done before we create a new subtarget since any
168*9880d681SAndroid Build Coastguard Worker // creation will depend on the TM and the code generation flags on the
169*9880d681SAndroid Build Coastguard Worker // function that reside in TargetOptions.
170*9880d681SAndroid Build Coastguard Worker resetTargetOptions(F);
171*9880d681SAndroid Build Coastguard Worker I = llvm::make_unique<MipsSubtarget>(TargetTriple, CPU, FS, isLittle,
172*9880d681SAndroid Build Coastguard Worker *this);
173*9880d681SAndroid Build Coastguard Worker }
174*9880d681SAndroid Build Coastguard Worker return I.get();
175*9880d681SAndroid Build Coastguard Worker }
176*9880d681SAndroid Build Coastguard Worker
resetSubtarget(MachineFunction * MF)177*9880d681SAndroid Build Coastguard Worker void MipsTargetMachine::resetSubtarget(MachineFunction *MF) {
178*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "resetSubtarget\n");
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker Subtarget = const_cast<MipsSubtarget *>(getSubtargetImpl(*MF->getFunction()));
181*9880d681SAndroid Build Coastguard Worker MF->setSubtarget(Subtarget);
182*9880d681SAndroid Build Coastguard Worker return;
183*9880d681SAndroid Build Coastguard Worker }
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker namespace {
186*9880d681SAndroid Build Coastguard Worker /// Mips Code Generator Pass Configuration Options.
187*9880d681SAndroid Build Coastguard Worker class MipsPassConfig : public TargetPassConfig {
188*9880d681SAndroid Build Coastguard Worker public:
MipsPassConfig(MipsTargetMachine * TM,PassManagerBase & PM)189*9880d681SAndroid Build Coastguard Worker MipsPassConfig(MipsTargetMachine *TM, PassManagerBase &PM)
190*9880d681SAndroid Build Coastguard Worker : TargetPassConfig(TM, PM) {
191*9880d681SAndroid Build Coastguard Worker // The current implementation of long branch pass requires a scratch
192*9880d681SAndroid Build Coastguard Worker // register ($at) to be available before branch instructions. Tail merging
193*9880d681SAndroid Build Coastguard Worker // can break this requirement, so disable it when long branch pass is
194*9880d681SAndroid Build Coastguard Worker // enabled.
195*9880d681SAndroid Build Coastguard Worker EnableTailMerge = !getMipsSubtarget().enableLongBranchPass();
196*9880d681SAndroid Build Coastguard Worker }
197*9880d681SAndroid Build Coastguard Worker
getMipsTargetMachine() const198*9880d681SAndroid Build Coastguard Worker MipsTargetMachine &getMipsTargetMachine() const {
199*9880d681SAndroid Build Coastguard Worker return getTM<MipsTargetMachine>();
200*9880d681SAndroid Build Coastguard Worker }
201*9880d681SAndroid Build Coastguard Worker
getMipsSubtarget() const202*9880d681SAndroid Build Coastguard Worker const MipsSubtarget &getMipsSubtarget() const {
203*9880d681SAndroid Build Coastguard Worker return *getMipsTargetMachine().getSubtargetImpl();
204*9880d681SAndroid Build Coastguard Worker }
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Worker void addIRPasses() override;
207*9880d681SAndroid Build Coastguard Worker bool addInstSelector() override;
208*9880d681SAndroid Build Coastguard Worker void addMachineSSAOptimization() override;
209*9880d681SAndroid Build Coastguard Worker void addPreEmitPass() override;
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Worker void addPreRegAlloc() override;
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Worker };
214*9880d681SAndroid Build Coastguard Worker } // namespace
215*9880d681SAndroid Build Coastguard Worker
createPassConfig(PassManagerBase & PM)216*9880d681SAndroid Build Coastguard Worker TargetPassConfig *MipsTargetMachine::createPassConfig(PassManagerBase &PM) {
217*9880d681SAndroid Build Coastguard Worker return new MipsPassConfig(this, PM);
218*9880d681SAndroid Build Coastguard Worker }
219*9880d681SAndroid Build Coastguard Worker
addIRPasses()220*9880d681SAndroid Build Coastguard Worker void MipsPassConfig::addIRPasses() {
221*9880d681SAndroid Build Coastguard Worker TargetPassConfig::addIRPasses();
222*9880d681SAndroid Build Coastguard Worker addPass(createAtomicExpandPass(&getMipsTargetMachine()));
223*9880d681SAndroid Build Coastguard Worker if (getMipsSubtarget().os16())
224*9880d681SAndroid Build Coastguard Worker addPass(createMipsOs16Pass(getMipsTargetMachine()));
225*9880d681SAndroid Build Coastguard Worker if (getMipsSubtarget().inMips16HardFloat())
226*9880d681SAndroid Build Coastguard Worker addPass(createMips16HardFloatPass(getMipsTargetMachine()));
227*9880d681SAndroid Build Coastguard Worker }
228*9880d681SAndroid Build Coastguard Worker // Install an instruction selector pass using
229*9880d681SAndroid Build Coastguard Worker // the ISelDag to gen Mips code.
addInstSelector()230*9880d681SAndroid Build Coastguard Worker bool MipsPassConfig::addInstSelector() {
231*9880d681SAndroid Build Coastguard Worker addPass(createMipsModuleISelDagPass(getMipsTargetMachine()));
232*9880d681SAndroid Build Coastguard Worker addPass(createMips16ISelDag(getMipsTargetMachine(), getOptLevel()));
233*9880d681SAndroid Build Coastguard Worker addPass(createMipsSEISelDag(getMipsTargetMachine(), getOptLevel()));
234*9880d681SAndroid Build Coastguard Worker return false;
235*9880d681SAndroid Build Coastguard Worker }
236*9880d681SAndroid Build Coastguard Worker
addMachineSSAOptimization()237*9880d681SAndroid Build Coastguard Worker void MipsPassConfig::addMachineSSAOptimization() {
238*9880d681SAndroid Build Coastguard Worker addPass(createMipsOptimizePICCallPass(getMipsTargetMachine()));
239*9880d681SAndroid Build Coastguard Worker TargetPassConfig::addMachineSSAOptimization();
240*9880d681SAndroid Build Coastguard Worker }
241*9880d681SAndroid Build Coastguard Worker
addPreRegAlloc()242*9880d681SAndroid Build Coastguard Worker void MipsPassConfig::addPreRegAlloc() {
243*9880d681SAndroid Build Coastguard Worker if (getOptLevel() == CodeGenOpt::None)
244*9880d681SAndroid Build Coastguard Worker addPass(createMipsOptimizePICCallPass(getMipsTargetMachine()));
245*9880d681SAndroid Build Coastguard Worker }
246*9880d681SAndroid Build Coastguard Worker
getTargetIRAnalysis()247*9880d681SAndroid Build Coastguard Worker TargetIRAnalysis MipsTargetMachine::getTargetIRAnalysis() {
248*9880d681SAndroid Build Coastguard Worker return TargetIRAnalysis([this](const Function &F) {
249*9880d681SAndroid Build Coastguard Worker if (Subtarget->allowMixed16_32()) {
250*9880d681SAndroid Build Coastguard Worker DEBUG(errs() << "No Target Transform Info Pass Added\n");
251*9880d681SAndroid Build Coastguard Worker // FIXME: This is no longer necessary as the TTI returned is per-function.
252*9880d681SAndroid Build Coastguard Worker return TargetTransformInfo(F.getParent()->getDataLayout());
253*9880d681SAndroid Build Coastguard Worker }
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker DEBUG(errs() << "Target Transform Info Pass Added\n");
256*9880d681SAndroid Build Coastguard Worker return TargetTransformInfo(BasicTTIImpl(this, F));
257*9880d681SAndroid Build Coastguard Worker });
258*9880d681SAndroid Build Coastguard Worker }
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker // Implemented by targets that want to run passes immediately before
261*9880d681SAndroid Build Coastguard Worker // machine code is emitted. return true if -print-machineinstrs should
262*9880d681SAndroid Build Coastguard Worker // print out the code after the passes.
addPreEmitPass()263*9880d681SAndroid Build Coastguard Worker void MipsPassConfig::addPreEmitPass() {
264*9880d681SAndroid Build Coastguard Worker MipsTargetMachine &TM = getMipsTargetMachine();
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Worker // The delay slot filler pass can potientially create forbidden slot (FS)
267*9880d681SAndroid Build Coastguard Worker // hazards for MIPSR6 which the hazard schedule pass (HSP) will fix. Any
268*9880d681SAndroid Build Coastguard Worker // (new) pass that creates compact branches after the HSP must handle FS
269*9880d681SAndroid Build Coastguard Worker // hazards itself or be pipelined before the HSP.
270*9880d681SAndroid Build Coastguard Worker addPass(createMipsDelaySlotFillerPass(TM));
271*9880d681SAndroid Build Coastguard Worker addPass(createMipsHazardSchedule());
272*9880d681SAndroid Build Coastguard Worker addPass(createMipsLongBranchPass(TM));
273*9880d681SAndroid Build Coastguard Worker addPass(createMipsConstantIslandPass());
274*9880d681SAndroid Build Coastguard Worker }
275