xref: /aosp_15_r20/external/llvm/lib/Target/Mips/MipsTargetMachine.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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