]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp
Merge ^/head r314270 through r314419.
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / Mips / MipsDelaySlotFiller.cpp
1 //===-- MipsDelaySlotFiller.cpp - Mips Delay Slot Filler ------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Simple pass to fill delay slots with useful instructions.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "MCTargetDesc/MipsMCNaCl.h"
15 #include "Mips.h"
16 #include "MipsInstrInfo.h"
17 #include "MipsTargetMachine.h"
18 #include "llvm/ADT/BitVector.h"
19 #include "llvm/ADT/SmallPtrSet.h"
20 #include "llvm/ADT/Statistic.h"
21 #include "llvm/Analysis/AliasAnalysis.h"
22 #include "llvm/Analysis/ValueTracking.h"
23 #include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
24 #include "llvm/CodeGen/MachineFunctionPass.h"
25 #include "llvm/CodeGen/MachineInstrBuilder.h"
26 #include "llvm/CodeGen/MachineRegisterInfo.h"
27 #include "llvm/CodeGen/PseudoSourceValue.h"
28 #include "llvm/Support/CommandLine.h"
29 #include "llvm/Target/TargetInstrInfo.h"
30 #include "llvm/Target/TargetMachine.h"
31 #include "llvm/Target/TargetRegisterInfo.h"
32
33 using namespace llvm;
34
35 #define DEBUG_TYPE "delay-slot-filler"
36
37 STATISTIC(FilledSlots, "Number of delay slots filled");
38 STATISTIC(UsefulSlots, "Number of delay slots filled with instructions that"
39                        " are not NOP.");
40
41 static cl::opt<bool> DisableDelaySlotFiller(
42   "disable-mips-delay-filler",
43   cl::init(false),
44   cl::desc("Fill all delay slots with NOPs."),
45   cl::Hidden);
46
47 static cl::opt<bool> DisableForwardSearch(
48   "disable-mips-df-forward-search",
49   cl::init(true),
50   cl::desc("Disallow MIPS delay filler to search forward."),
51   cl::Hidden);
52
53 static cl::opt<bool> DisableSuccBBSearch(
54   "disable-mips-df-succbb-search",
55   cl::init(true),
56   cl::desc("Disallow MIPS delay filler to search successor basic blocks."),
57   cl::Hidden);
58
59 static cl::opt<bool> DisableBackwardSearch(
60   "disable-mips-df-backward-search",
61   cl::init(false),
62   cl::desc("Disallow MIPS delay filler to search backward."),
63   cl::Hidden);
64
65 enum CompactBranchPolicy {
66   CB_Never,   ///< The policy 'never' may in some circumstances or for some
67               ///< ISAs not be absolutely adhered to.
68   CB_Optimal, ///< Optimal is the default and will produce compact branches
69               ///< when delay slots cannot be filled.
70   CB_Always   ///< 'always' may in some circumstances may not be
71               ///< absolutely adhered to there may not be a corresponding
72               ///< compact form of a branch.
73 };
74
75 static cl::opt<CompactBranchPolicy> MipsCompactBranchPolicy(
76   "mips-compact-branches",cl::Optional,
77   cl::init(CB_Optimal),
78   cl::desc("MIPS Specific: Compact branch policy."),
79   cl::values(
80     clEnumValN(CB_Never, "never", "Do not use compact branches if possible."),
81     clEnumValN(CB_Optimal, "optimal", "Use compact branches where appropiate (default)."),
82     clEnumValN(CB_Always, "always", "Always use compact branches if possible.")
83   )
84 );
85
86 namespace {
87   typedef MachineBasicBlock::iterator Iter;
88   typedef MachineBasicBlock::reverse_iterator ReverseIter;
89   typedef SmallDenseMap<MachineBasicBlock*, MachineInstr*, 2> BB2BrMap;
90
91   class RegDefsUses {
92   public:
93     RegDefsUses(const TargetRegisterInfo &TRI);
94     void init(const MachineInstr &MI);
95
96     /// This function sets all caller-saved registers in Defs.
97     void setCallerSaved(const MachineInstr &MI);
98
99     /// This function sets all unallocatable registers in Defs.
100     void setUnallocatableRegs(const MachineFunction &MF);
101
102     /// Set bits in Uses corresponding to MBB's live-out registers except for
103     /// the registers that are live-in to SuccBB.
104     void addLiveOut(const MachineBasicBlock &MBB,
105                     const MachineBasicBlock &SuccBB);
106
107     bool update(const MachineInstr &MI, unsigned Begin, unsigned End);
108
109   private:
110     bool checkRegDefsUses(BitVector &NewDefs, BitVector &NewUses, unsigned Reg,
111                           bool IsDef) const;
112
113     /// Returns true if Reg or its alias is in RegSet.
114     bool isRegInSet(const BitVector &RegSet, unsigned Reg) const;
115
116     const TargetRegisterInfo &TRI;
117     BitVector Defs, Uses;
118   };
119
120   /// Base class for inspecting loads and stores.
121   class InspectMemInstr {
122   public:
123     InspectMemInstr(bool ForbidMemInstr_)
124       : OrigSeenLoad(false), OrigSeenStore(false), SeenLoad(false),
125         SeenStore(false), ForbidMemInstr(ForbidMemInstr_) {}
126
127     /// Return true if MI cannot be moved to delay slot.
128     bool hasHazard(const MachineInstr &MI);
129
130     virtual ~InspectMemInstr() {}
131
132   protected:
133     /// Flags indicating whether loads or stores have been seen.
134     bool OrigSeenLoad, OrigSeenStore, SeenLoad, SeenStore;
135
136     /// Memory instructions are not allowed to move to delay slot if this flag
137     /// is true.
138     bool ForbidMemInstr;
139
140   private:
141     virtual bool hasHazard_(const MachineInstr &MI) = 0;
142   };
143
144   /// This subclass rejects any memory instructions.
145   class NoMemInstr : public InspectMemInstr {
146   public:
147     NoMemInstr() : InspectMemInstr(true) {}
148   private:
149     bool hasHazard_(const MachineInstr &MI) override { return true; }
150   };
151
152   /// This subclass accepts loads from stacks and constant loads.
153   class LoadFromStackOrConst : public InspectMemInstr {
154   public:
155     LoadFromStackOrConst() : InspectMemInstr(false) {}
156   private:
157     bool hasHazard_(const MachineInstr &MI) override;
158   };
159
160   /// This subclass uses memory dependence information to determine whether a
161   /// memory instruction can be moved to a delay slot.
162   class MemDefsUses : public InspectMemInstr {
163   public:
164     MemDefsUses(const DataLayout &DL, const MachineFrameInfo *MFI);
165
166   private:
167     typedef PointerUnion<const Value *, const PseudoSourceValue *> ValueType;
168
169     bool hasHazard_(const MachineInstr &MI) override;
170
171     /// Update Defs and Uses. Return true if there exist dependences that
172     /// disqualify the delay slot candidate between V and values in Uses and
173     /// Defs.
174     bool updateDefsUses(ValueType V, bool MayStore);
175
176     /// Get the list of underlying objects of MI's memory operand.
177     bool getUnderlyingObjects(const MachineInstr &MI,
178                               SmallVectorImpl<ValueType> &Objects) const;
179
180     const MachineFrameInfo *MFI;
181     SmallPtrSet<ValueType, 4> Uses, Defs;
182     const DataLayout &DL;
183
184     /// Flags indicating whether loads or stores with no underlying objects have
185     /// been seen.
186     bool SeenNoObjLoad, SeenNoObjStore;
187   };
188
189   class Filler : public MachineFunctionPass {
190   public:
191     Filler(TargetMachine &tm)
192       : MachineFunctionPass(ID), TM(tm) { }
193
194     StringRef getPassName() const override { return "Mips Delay Slot Filler"; }
195
196     bool runOnMachineFunction(MachineFunction &F) override {
197       bool Changed = false;
198       for (MachineFunction::iterator FI = F.begin(), FE = F.end();
199            FI != FE; ++FI)
200         Changed |= runOnMachineBasicBlock(*FI);
201
202       // This pass invalidates liveness information when it reorders
203       // instructions to fill delay slot. Without this, -verify-machineinstrs
204       // will fail.
205       if (Changed)
206         F.getRegInfo().invalidateLiveness();
207
208       return Changed;
209     }
210
211     MachineFunctionProperties getRequiredProperties() const override {
212       return MachineFunctionProperties().set(
213           MachineFunctionProperties::Property::NoVRegs);
214     }
215
216     void getAnalysisUsage(AnalysisUsage &AU) const override {
217       AU.addRequired<MachineBranchProbabilityInfo>();
218       MachineFunctionPass::getAnalysisUsage(AU);
219     }
220
221   private:
222     bool runOnMachineBasicBlock(MachineBasicBlock &MBB);
223
224     Iter replaceWithCompactBranch(MachineBasicBlock &MBB, Iter Branch,
225                                   const DebugLoc &DL);
226
227     /// This function checks if it is valid to move Candidate to the delay slot
228     /// and returns true if it isn't. It also updates memory and register
229     /// dependence information.
230     bool delayHasHazard(const MachineInstr &Candidate, RegDefsUses &RegDU,
231                         InspectMemInstr &IM) const;
232
233     /// This function searches range [Begin, End) for an instruction that can be
234     /// moved to the delay slot. Returns true on success.
235     template<typename IterTy>
236     bool searchRange(MachineBasicBlock &MBB, IterTy Begin, IterTy End,
237                      RegDefsUses &RegDU, InspectMemInstr &IM, Iter Slot,
238                      IterTy &Filler) const;
239
240     /// This function searches in the backward direction for an instruction that
241     /// can be moved to the delay slot. Returns true on success.
242     bool searchBackward(MachineBasicBlock &MBB, MachineInstr &Slot) const;
243
244     /// This function searches MBB in the forward direction for an instruction
245     /// that can be moved to the delay slot. Returns true on success.
246     bool searchForward(MachineBasicBlock &MBB, Iter Slot) const;
247
248     /// This function searches one of MBB's successor blocks for an instruction
249     /// that can be moved to the delay slot and inserts clones of the
250     /// instruction into the successor's predecessor blocks.
251     bool searchSuccBBs(MachineBasicBlock &MBB, Iter Slot) const;
252
253     /// Pick a successor block of MBB. Return NULL if MBB doesn't have a
254     /// successor block that is not a landing pad.
255     MachineBasicBlock *selectSuccBB(MachineBasicBlock &B) const;
256
257     /// This function analyzes MBB and returns an instruction with an unoccupied
258     /// slot that branches to Dst.
259     std::pair<MipsInstrInfo::BranchType, MachineInstr *>
260     getBranch(MachineBasicBlock &MBB, const MachineBasicBlock &Dst) const;
261
262     /// Examine Pred and see if it is possible to insert an instruction into
263     /// one of its branches delay slot or its end.
264     bool examinePred(MachineBasicBlock &Pred, const MachineBasicBlock &Succ,
265                      RegDefsUses &RegDU, bool &HasMultipleSuccs,
266                      BB2BrMap &BrMap) const;
267
268     bool terminateSearch(const MachineInstr &Candidate) const;
269
270     TargetMachine &TM;
271
272     static char ID;
273   };
274   char Filler::ID = 0;
275 } // end of anonymous namespace
276
277 static bool hasUnoccupiedSlot(const MachineInstr *MI) {
278   return MI->hasDelaySlot() && !MI->isBundledWithSucc();
279 }
280
281 /// This function inserts clones of Filler into predecessor blocks.
282 static void insertDelayFiller(Iter Filler, const BB2BrMap &BrMap) {
283   MachineFunction *MF = Filler->getParent()->getParent();
284
285   for (BB2BrMap::const_iterator I = BrMap.begin(); I != BrMap.end(); ++I) {
286     if (I->second) {
287       MIBundleBuilder(I->second).append(MF->CloneMachineInstr(&*Filler));
288       ++UsefulSlots;
289     } else {
290       I->first->insert(I->first->end(), MF->CloneMachineInstr(&*Filler));
291     }
292   }
293 }
294
295 /// This function adds registers Filler defines to MBB's live-in register list.
296 static void addLiveInRegs(Iter Filler, MachineBasicBlock &MBB) {
297   for (unsigned I = 0, E = Filler->getNumOperands(); I != E; ++I) {
298     const MachineOperand &MO = Filler->getOperand(I);
299     unsigned R;
300
301     if (!MO.isReg() || !MO.isDef() || !(R = MO.getReg()))
302       continue;
303
304 #ifndef NDEBUG
305     const MachineFunction &MF = *MBB.getParent();
306     assert(MF.getSubtarget().getRegisterInfo()->getAllocatableSet(MF).test(R) &&
307            "Shouldn't move an instruction with unallocatable registers across "
308            "basic block boundaries.");
309 #endif
310
311     if (!MBB.isLiveIn(R))
312       MBB.addLiveIn(R);
313   }
314 }
315
316 RegDefsUses::RegDefsUses(const TargetRegisterInfo &TRI)
317     : TRI(TRI), Defs(TRI.getNumRegs(), false), Uses(TRI.getNumRegs(), false) {}
318
319 void RegDefsUses::init(const MachineInstr &MI) {
320   // Add all register operands which are explicit and non-variadic.
321   update(MI, 0, MI.getDesc().getNumOperands());
322
323   // If MI is a call, add RA to Defs to prevent users of RA from going into
324   // delay slot.
325   if (MI.isCall())
326     Defs.set(Mips::RA);
327
328   // Add all implicit register operands of branch instructions except
329   // register AT.
330   if (MI.isBranch()) {
331     update(MI, MI.getDesc().getNumOperands(), MI.getNumOperands());
332     Defs.reset(Mips::AT);
333   }
334 }
335
336 void RegDefsUses::setCallerSaved(const MachineInstr &MI) {
337   assert(MI.isCall());
338
339   // Add RA/RA_64 to Defs to prevent users of RA/RA_64 from going into
340   // the delay slot. The reason is that RA/RA_64 must not be changed
341   // in the delay slot so that the callee can return to the caller.
342   if (MI.definesRegister(Mips::RA) || MI.definesRegister(Mips::RA_64)) {
343     Defs.set(Mips::RA);
344     Defs.set(Mips::RA_64);
345   }
346
347   // If MI is a call, add all caller-saved registers to Defs.
348   BitVector CallerSavedRegs(TRI.getNumRegs(), true);
349
350   CallerSavedRegs.reset(Mips::ZERO);
351   CallerSavedRegs.reset(Mips::ZERO_64);
352
353   for (const MCPhysReg *R = TRI.getCalleeSavedRegs(MI.getParent()->getParent());
354        *R; ++R)
355     for (MCRegAliasIterator AI(*R, &TRI, true); AI.isValid(); ++AI)
356       CallerSavedRegs.reset(*AI);
357
358   Defs |= CallerSavedRegs;
359 }
360
361 void RegDefsUses::setUnallocatableRegs(const MachineFunction &MF) {
362   BitVector AllocSet = TRI.getAllocatableSet(MF);
363
364   for (int R = AllocSet.find_first(); R != -1; R = AllocSet.find_next(R))
365     for (MCRegAliasIterator AI(R, &TRI, false); AI.isValid(); ++AI)
366       AllocSet.set(*AI);
367
368   AllocSet.set(Mips::ZERO);
369   AllocSet.set(Mips::ZERO_64);
370
371   Defs |= AllocSet.flip();
372 }
373
374 void RegDefsUses::addLiveOut(const MachineBasicBlock &MBB,
375                              const MachineBasicBlock &SuccBB) {
376   for (MachineBasicBlock::const_succ_iterator SI = MBB.succ_begin(),
377        SE = MBB.succ_end(); SI != SE; ++SI)
378     if (*SI != &SuccBB)
379       for (const auto &LI : (*SI)->liveins())
380         Uses.set(LI.PhysReg);
381 }
382
383 bool RegDefsUses::update(const MachineInstr &MI, unsigned Begin, unsigned End) {
384   BitVector NewDefs(TRI.getNumRegs()), NewUses(TRI.getNumRegs());
385   bool HasHazard = false;
386
387   for (unsigned I = Begin; I != End; ++I) {
388     const MachineOperand &MO = MI.getOperand(I);
389
390     if (MO.isReg() && MO.getReg())
391       HasHazard |= checkRegDefsUses(NewDefs, NewUses, MO.getReg(), MO.isDef());
392   }
393
394   Defs |= NewDefs;
395   Uses |= NewUses;
396
397   return HasHazard;
398 }
399
400 bool RegDefsUses::checkRegDefsUses(BitVector &NewDefs, BitVector &NewUses,
401                                    unsigned Reg, bool IsDef) const {
402   if (IsDef) {
403     NewDefs.set(Reg);
404     // check whether Reg has already been defined or used.
405     return (isRegInSet(Defs, Reg) || isRegInSet(Uses, Reg));
406   }
407
408   NewUses.set(Reg);
409   // check whether Reg has already been defined.
410   return isRegInSet(Defs, Reg);
411 }
412
413 bool RegDefsUses::isRegInSet(const BitVector &RegSet, unsigned Reg) const {
414   // Check Reg and all aliased Registers.
415   for (MCRegAliasIterator AI(Reg, &TRI, true); AI.isValid(); ++AI)
416     if (RegSet.test(*AI))
417       return true;
418   return false;
419 }
420
421 bool InspectMemInstr::hasHazard(const MachineInstr &MI) {
422   if (!MI.mayStore() && !MI.mayLoad())
423     return false;
424
425   if (ForbidMemInstr)
426     return true;
427
428   OrigSeenLoad = SeenLoad;
429   OrigSeenStore = SeenStore;
430   SeenLoad |= MI.mayLoad();
431   SeenStore |= MI.mayStore();
432
433   // If MI is an ordered or volatile memory reference, disallow moving
434   // subsequent loads and stores to delay slot.
435   if (MI.hasOrderedMemoryRef() && (OrigSeenLoad || OrigSeenStore)) {
436     ForbidMemInstr = true;
437     return true;
438   }
439
440   return hasHazard_(MI);
441 }
442
443 bool LoadFromStackOrConst::hasHazard_(const MachineInstr &MI) {
444   if (MI.mayStore())
445     return true;
446
447   if (!MI.hasOneMemOperand() || !(*MI.memoperands_begin())->getPseudoValue())
448     return true;
449
450   if (const PseudoSourceValue *PSV =
451       (*MI.memoperands_begin())->getPseudoValue()) {
452     if (isa<FixedStackPseudoSourceValue>(PSV))
453       return false;
454     return !PSV->isConstant(nullptr) && !PSV->isStack();
455   }
456
457   return true;
458 }
459
460 MemDefsUses::MemDefsUses(const DataLayout &DL, const MachineFrameInfo *MFI_)
461     : InspectMemInstr(false), MFI(MFI_), DL(DL), SeenNoObjLoad(false),
462       SeenNoObjStore(false) {}
463
464 bool MemDefsUses::hasHazard_(const MachineInstr &MI) {
465   bool HasHazard = false;
466   SmallVector<ValueType, 4> Objs;
467
468   // Check underlying object list.
469   if (getUnderlyingObjects(MI, Objs)) {
470     for (SmallVectorImpl<ValueType>::const_iterator I = Objs.begin();
471          I != Objs.end(); ++I)
472       HasHazard |= updateDefsUses(*I, MI.mayStore());
473
474     return HasHazard;
475   }
476
477   // No underlying objects found.
478   HasHazard = MI.mayStore() && (OrigSeenLoad || OrigSeenStore);
479   HasHazard |= MI.mayLoad() || OrigSeenStore;
480
481   SeenNoObjLoad |= MI.mayLoad();
482   SeenNoObjStore |= MI.mayStore();
483
484   return HasHazard;
485 }
486
487 bool MemDefsUses::updateDefsUses(ValueType V, bool MayStore) {
488   if (MayStore)
489     return !Defs.insert(V).second || Uses.count(V) || SeenNoObjStore ||
490            SeenNoObjLoad;
491
492   Uses.insert(V);
493   return Defs.count(V) || SeenNoObjStore;
494 }
495
496 bool MemDefsUses::
497 getUnderlyingObjects(const MachineInstr &MI,
498                      SmallVectorImpl<ValueType> &Objects) const {
499   if (!MI.hasOneMemOperand() ||
500       (!(*MI.memoperands_begin())->getValue() &&
501        !(*MI.memoperands_begin())->getPseudoValue()))
502     return false;
503
504   if (const PseudoSourceValue *PSV =
505       (*MI.memoperands_begin())->getPseudoValue()) {
506     if (!PSV->isAliased(MFI))
507       return false;
508     Objects.push_back(PSV);
509     return true;
510   }
511
512   const Value *V = (*MI.memoperands_begin())->getValue();
513
514   SmallVector<Value *, 4> Objs;
515   GetUnderlyingObjects(const_cast<Value *>(V), Objs, DL);
516
517   for (SmallVectorImpl<Value *>::iterator I = Objs.begin(), E = Objs.end();
518        I != E; ++I) {
519     if (!isIdentifiedObject(V))
520       return false;
521
522     Objects.push_back(*I);
523   }
524
525   return true;
526 }
527
528 // Replace Branch with the compact branch instruction.
529 Iter Filler::replaceWithCompactBranch(MachineBasicBlock &MBB, Iter Branch,
530                                       const DebugLoc &DL) {
531   const MipsSubtarget &STI = MBB.getParent()->getSubtarget<MipsSubtarget>();
532   const MipsInstrInfo *TII = STI.getInstrInfo();
533
534   unsigned NewOpcode = TII->getEquivalentCompactForm(Branch);
535   Branch = TII->genInstrWithNewOpc(NewOpcode, Branch);
536
537   std::next(Branch)->eraseFromParent();
538   return Branch;
539 }
540
541 // For given opcode returns opcode of corresponding instruction with short
542 // delay slot.
543 // For the pseudo TAILCALL*_MM instrunctions return the short delay slot
544 // form. Unfortunately, TAILCALL<->b16 is denied as b16 has a limited range
545 // that is too short to make use of for tail calls.
546 static int getEquivalentCallShort(int Opcode) {
547   switch (Opcode) {
548   case Mips::BGEZAL:
549     return Mips::BGEZALS_MM;
550   case Mips::BLTZAL:
551     return Mips::BLTZALS_MM;
552   case Mips::JAL:
553     return Mips::JALS_MM;
554   case Mips::JALR:
555     return Mips::JALRS_MM;
556   case Mips::JALR16_MM:
557     return Mips::JALRS16_MM;
558   case Mips::TAILCALL_MM:
559     llvm_unreachable("Attempting to shorten the TAILCALL_MM pseudo!");
560   case Mips::TAILCALLREG:
561     return Mips::JR16_MM;
562   default:
563     llvm_unreachable("Unexpected call instruction for microMIPS.");
564   }
565 }
566
567 /// runOnMachineBasicBlock - Fill in delay slots for the given basic block.
568 /// We assume there is only one delay slot per delayed instruction.
569 bool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) {
570   bool Changed = false;
571   const MipsSubtarget &STI = MBB.getParent()->getSubtarget<MipsSubtarget>();
572   bool InMicroMipsMode = STI.inMicroMipsMode();
573   const MipsInstrInfo *TII = STI.getInstrInfo();
574
575   if (InMicroMipsMode && STI.hasMips32r6()) {
576     // This is microMIPS32r6 or microMIPS64r6 processor. Delay slot for
577     // branching instructions is not needed.
578     return Changed;
579   }
580
581   for (Iter I = MBB.begin(); I != MBB.end(); ++I) {
582     if (!hasUnoccupiedSlot(&*I))
583       continue;
584
585     ++FilledSlots;
586     Changed = true;
587
588     // Delay slot filling is disabled at -O0.
589     if (!DisableDelaySlotFiller && (TM.getOptLevel() != CodeGenOpt::None)) {
590       bool Filled = false;
591
592       if (MipsCompactBranchPolicy.getValue() != CB_Always ||
593            !TII->getEquivalentCompactForm(I)) {
594         if (searchBackward(MBB, *I)) {
595           Filled = true;
596         } else if (I->isTerminator()) {
597           if (searchSuccBBs(MBB, I)) {
598             Filled = true;
599           }
600         } else if (searchForward(MBB, I)) {
601           Filled = true;
602         }
603       }
604
605       if (Filled) {
606         // Get instruction with delay slot.
607         MachineBasicBlock::instr_iterator DSI = I.getInstrIterator();
608
609         if (InMicroMipsMode && TII->getInstSizeInBytes(*std::next(DSI)) == 2 &&
610             DSI->isCall()) {
611           // If instruction in delay slot is 16b change opcode to
612           // corresponding instruction with short delay slot.
613
614           // TODO: Implement an instruction mapping table of 16bit opcodes to
615           // 32bit opcodes so that an instruction can be expanded. This would
616           // save 16 bits as a TAILCALL_MM pseudo requires a fullsized nop.
617           // TODO: Permit b16 when branching backwards to the the same function
618           // if it is in range.
619           DSI->setDesc(TII->get(getEquivalentCallShort(DSI->getOpcode())));
620         }
621         continue;
622       }
623     }
624
625     // For microMIPS if instruction is BEQ or BNE with one ZERO register, then
626     // instead of adding NOP replace this instruction with the corresponding
627     // compact branch instruction, i.e. BEQZC or BNEZC. Additionally
628     // PseudoReturn and PseudoIndirectBranch are expanded to JR_MM, so they can
629     // be replaced with JRC16_MM.
630
631     // For MIPSR6 attempt to produce the corresponding compact (no delay slot)
632     // form of the CTI. For indirect jumps this will not require inserting a
633     // NOP and for branches will hopefully avoid requiring a NOP.
634     if ((InMicroMipsMode ||
635          (STI.hasMips32r6() && MipsCompactBranchPolicy != CB_Never)) &&
636         TII->getEquivalentCompactForm(I)) {
637       I = replaceWithCompactBranch(MBB, I, I->getDebugLoc());
638       continue;
639     }
640
641     // Bundle the NOP to the instruction with the delay slot.
642     BuildMI(MBB, std::next(I), I->getDebugLoc(), TII->get(Mips::NOP));
643     MIBundleBuilder(MBB, I, std::next(I, 2));
644   }
645
646   return Changed;
647 }
648
649 /// createMipsDelaySlotFillerPass - Returns a pass that fills in delay
650 /// slots in Mips MachineFunctions
651 FunctionPass *llvm::createMipsDelaySlotFillerPass(MipsTargetMachine &tm) {
652   return new Filler(tm);
653 }
654
655 template<typename IterTy>
656 bool Filler::searchRange(MachineBasicBlock &MBB, IterTy Begin, IterTy End,
657                          RegDefsUses &RegDU, InspectMemInstr& IM, Iter Slot,
658                          IterTy &Filler) const {
659   for (IterTy I = Begin; I != End;) {
660     IterTy CurrI = I;
661     ++I;
662
663     // skip debug value
664     if (CurrI->isDebugValue())
665       continue;
666
667     if (terminateSearch(*CurrI))
668       break;
669
670     assert((!CurrI->isCall() && !CurrI->isReturn() && !CurrI->isBranch()) &&
671            "Cannot put calls, returns or branches in delay slot.");
672
673     if (CurrI->isKill()) {
674       CurrI->eraseFromParent();
675       continue;
676     }
677
678     if (delayHasHazard(*CurrI, RegDU, IM))
679       continue;
680
681     const MipsSubtarget &STI = MBB.getParent()->getSubtarget<MipsSubtarget>();
682     if (STI.isTargetNaCl()) {
683       // In NaCl, instructions that must be masked are forbidden in delay slots.
684       // We only check for loads, stores and SP changes.  Calls, returns and
685       // branches are not checked because non-NaCl targets never put them in
686       // delay slots.
687       unsigned AddrIdx;
688       if ((isBasePlusOffsetMemoryAccess(CurrI->getOpcode(), &AddrIdx) &&
689            baseRegNeedsLoadStoreMask(CurrI->getOperand(AddrIdx).getReg())) ||
690           CurrI->modifiesRegister(Mips::SP, STI.getRegisterInfo()))
691         continue;
692     }
693
694     bool InMicroMipsMode = STI.inMicroMipsMode();
695     const MipsInstrInfo *TII = STI.getInstrInfo();
696     unsigned Opcode = (*Slot).getOpcode();
697     // This is complicated by the tail call optimization. For non-PIC code
698     // there is only a 32bit sized unconditional branch which can be assumed
699     // to be able to reach the target. b16 only has a range of +/- 1 KB.
700     // It's entirely possible that the target function is reachable with b16
701     // but we don't have enough information to make that decision.
702      if (InMicroMipsMode && TII->getInstSizeInBytes(*CurrI) == 2 &&
703         (Opcode == Mips::JR || Opcode == Mips::PseudoIndirectBranch ||
704          Opcode == Mips::PseudoReturn || Opcode == Mips::TAILCALL))
705       continue;
706
707     Filler = CurrI;
708     return true;
709   }
710
711   return false;
712 }
713
714 bool Filler::searchBackward(MachineBasicBlock &MBB, MachineInstr &Slot) const {
715   if (DisableBackwardSearch)
716     return false;
717
718   auto *Fn = MBB.getParent();
719   RegDefsUses RegDU(*Fn->getSubtarget().getRegisterInfo());
720   MemDefsUses MemDU(Fn->getDataLayout(), &Fn->getFrameInfo());
721   ReverseIter Filler;
722
723   RegDU.init(Slot);
724
725   MachineBasicBlock::iterator SlotI = Slot;
726   if (!searchRange(MBB, ++SlotI.getReverse(), MBB.rend(), RegDU, MemDU, Slot,
727                    Filler))
728     return false;
729
730   MBB.splice(std::next(SlotI), &MBB, Filler.getReverse());
731   MIBundleBuilder(MBB, SlotI, std::next(SlotI, 2));
732   ++UsefulSlots;
733   return true;
734 }
735
736 bool Filler::searchForward(MachineBasicBlock &MBB, Iter Slot) const {
737   // Can handle only calls.
738   if (DisableForwardSearch || !Slot->isCall())
739     return false;
740
741   RegDefsUses RegDU(*MBB.getParent()->getSubtarget().getRegisterInfo());
742   NoMemInstr NM;
743   Iter Filler;
744
745   RegDU.setCallerSaved(*Slot);
746
747   if (!searchRange(MBB, std::next(Slot), MBB.end(), RegDU, NM, Slot, Filler))
748     return false;
749
750   MBB.splice(std::next(Slot), &MBB, Filler);
751   MIBundleBuilder(MBB, Slot, std::next(Slot, 2));
752   ++UsefulSlots;
753   return true;
754 }
755
756 bool Filler::searchSuccBBs(MachineBasicBlock &MBB, Iter Slot) const {
757   if (DisableSuccBBSearch)
758     return false;
759
760   MachineBasicBlock *SuccBB = selectSuccBB(MBB);
761
762   if (!SuccBB)
763     return false;
764
765   RegDefsUses RegDU(*MBB.getParent()->getSubtarget().getRegisterInfo());
766   bool HasMultipleSuccs = false;
767   BB2BrMap BrMap;
768   std::unique_ptr<InspectMemInstr> IM;
769   Iter Filler;
770   auto *Fn = MBB.getParent();
771
772   // Iterate over SuccBB's predecessor list.
773   for (MachineBasicBlock::pred_iterator PI = SuccBB->pred_begin(),
774        PE = SuccBB->pred_end(); PI != PE; ++PI)
775     if (!examinePred(**PI, *SuccBB, RegDU, HasMultipleSuccs, BrMap))
776       return false;
777
778   // Do not allow moving instructions which have unallocatable register operands
779   // across basic block boundaries.
780   RegDU.setUnallocatableRegs(*Fn);
781
782   // Only allow moving loads from stack or constants if any of the SuccBB's
783   // predecessors have multiple successors.
784   if (HasMultipleSuccs) {
785     IM.reset(new LoadFromStackOrConst());
786   } else {
787     const MachineFrameInfo &MFI = Fn->getFrameInfo();
788     IM.reset(new MemDefsUses(Fn->getDataLayout(), &MFI));
789   }
790
791   if (!searchRange(MBB, SuccBB->begin(), SuccBB->end(), RegDU, *IM, Slot,
792                    Filler))
793     return false;
794
795   insertDelayFiller(Filler, BrMap);
796   addLiveInRegs(Filler, *SuccBB);
797   Filler->eraseFromParent();
798
799   return true;
800 }
801
802 MachineBasicBlock *Filler::selectSuccBB(MachineBasicBlock &B) const {
803   if (B.succ_empty())
804     return nullptr;
805
806   // Select the successor with the larget edge weight.
807   auto &Prob = getAnalysis<MachineBranchProbabilityInfo>();
808   MachineBasicBlock *S = *std::max_element(
809       B.succ_begin(), B.succ_end(),
810       [&](const MachineBasicBlock *Dst0, const MachineBasicBlock *Dst1) {
811         return Prob.getEdgeProbability(&B, Dst0) <
812                Prob.getEdgeProbability(&B, Dst1);
813       });
814   return S->isEHPad() ? nullptr : S;
815 }
816
817 std::pair<MipsInstrInfo::BranchType, MachineInstr *>
818 Filler::getBranch(MachineBasicBlock &MBB, const MachineBasicBlock &Dst) const {
819   const MipsInstrInfo *TII =
820       MBB.getParent()->getSubtarget<MipsSubtarget>().getInstrInfo();
821   MachineBasicBlock *TrueBB = nullptr, *FalseBB = nullptr;
822   SmallVector<MachineInstr*, 2> BranchInstrs;
823   SmallVector<MachineOperand, 2> Cond;
824
825   MipsInstrInfo::BranchType R =
826       TII->analyzeBranch(MBB, TrueBB, FalseBB, Cond, false, BranchInstrs);
827
828   if ((R == MipsInstrInfo::BT_None) || (R == MipsInstrInfo::BT_NoBranch))
829     return std::make_pair(R, nullptr);
830
831   if (R != MipsInstrInfo::BT_CondUncond) {
832     if (!hasUnoccupiedSlot(BranchInstrs[0]))
833       return std::make_pair(MipsInstrInfo::BT_None, nullptr);
834
835     assert(((R != MipsInstrInfo::BT_Uncond) || (TrueBB == &Dst)));
836
837     return std::make_pair(R, BranchInstrs[0]);
838   }
839
840   assert((TrueBB == &Dst) || (FalseBB == &Dst));
841
842   // Examine the conditional branch. See if its slot is occupied.
843   if (hasUnoccupiedSlot(BranchInstrs[0]))
844     return std::make_pair(MipsInstrInfo::BT_Cond, BranchInstrs[0]);
845
846   // If that fails, try the unconditional branch.
847   if (hasUnoccupiedSlot(BranchInstrs[1]) && (FalseBB == &Dst))
848     return std::make_pair(MipsInstrInfo::BT_Uncond, BranchInstrs[1]);
849
850   return std::make_pair(MipsInstrInfo::BT_None, nullptr);
851 }
852
853 bool Filler::examinePred(MachineBasicBlock &Pred, const MachineBasicBlock &Succ,
854                          RegDefsUses &RegDU, bool &HasMultipleSuccs,
855                          BB2BrMap &BrMap) const {
856   std::pair<MipsInstrInfo::BranchType, MachineInstr *> P =
857     getBranch(Pred, Succ);
858
859   // Return if either getBranch wasn't able to analyze the branches or there
860   // were no branches with unoccupied slots.
861   if (P.first == MipsInstrInfo::BT_None)
862     return false;
863
864   if ((P.first != MipsInstrInfo::BT_Uncond) &&
865       (P.first != MipsInstrInfo::BT_NoBranch)) {
866     HasMultipleSuccs = true;
867     RegDU.addLiveOut(Pred, Succ);
868   }
869
870   BrMap[&Pred] = P.second;
871   return true;
872 }
873
874 bool Filler::delayHasHazard(const MachineInstr &Candidate, RegDefsUses &RegDU,
875                             InspectMemInstr &IM) const {
876   assert(!Candidate.isKill() &&
877          "KILL instructions should have been eliminated at this point.");
878
879   bool HasHazard = Candidate.isImplicitDef();
880
881   HasHazard |= IM.hasHazard(Candidate);
882   HasHazard |= RegDU.update(Candidate, 0, Candidate.getNumOperands());
883
884   return HasHazard;
885 }
886
887 bool Filler::terminateSearch(const MachineInstr &Candidate) const {
888   return (Candidate.isTerminator() || Candidate.isCall() ||
889           Candidate.isPosition() || Candidate.isInlineAsm() ||
890           Candidate.hasUnmodeledSideEffects());
891 }