blob: b56d9cd22b3488fb582293934cb97c9d642e4d2d [file] [log] [blame]
Akira Hatanaka90db35a2013-02-14 23:20:15 +00001//===-- MipsDelaySlotFiller.cpp - Mips Delay Slot Filler ------------------===//
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +00007//
Akira Hatanaka4552c9a2011-04-15 21:51:11 +00008//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +00009//
Akira Hatanaka90db35a2013-02-14 23:20:15 +000010// Simple pass to fill delay slots with useful instructions.
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +000011//
Akira Hatanaka4552c9a2011-04-15 21:51:11 +000012//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +000013
14#define DEBUG_TYPE "delay-slot-filler"
15
16#include "Mips.h"
17#include "MipsTargetMachine.h"
Akira Hatanakacd7319d2013-02-14 23:40:57 +000018#include "llvm/ADT/BitVector.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000019#include "llvm/ADT/Statistic.h"
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +000020#include "llvm/CodeGen/MachineFunctionPass.h"
21#include "llvm/CodeGen/MachineInstrBuilder.h"
Akira Hatanakaa3defb02011-09-29 23:52:13 +000022#include "llvm/Support/CommandLine.h"
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +000023#include "llvm/Target/TargetInstrInfo.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000024#include "llvm/Target/TargetMachine.h"
Akira Hatanakaa3defb02011-09-29 23:52:13 +000025#include "llvm/Target/TargetRegisterInfo.h"
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +000026
27using namespace llvm;
28
29STATISTIC(FilledSlots, "Number of delay slots filled");
Akira Hatanaka98f4d4d2011-10-05 01:19:13 +000030STATISTIC(UsefulSlots, "Number of delay slots filled with instructions that"
Akira Hatanaka176965f2011-10-05 02:22:49 +000031 " are not NOP.");
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +000032
Akira Hatanaka6522a9e2012-08-22 02:51:28 +000033static cl::opt<bool> DisableDelaySlotFiller(
34 "disable-mips-delay-filler",
Akira Hatanakaa3defb02011-09-29 23:52:13 +000035 cl::init(false),
Akira Hatanaka90db35a2013-02-14 23:20:15 +000036 cl::desc("Fill all delay slots with NOPs."),
Akira Hatanakaa3defb02011-09-29 23:52:13 +000037 cl::Hidden);
38
Akira Hatanakaf9c3f3b2012-05-14 23:59:17 +000039// This option can be used to silence complaints by machine verifier passes.
40static cl::opt<bool> SkipDelaySlotFiller(
41 "skip-mips-delay-filler",
42 cl::init(false),
43 cl::desc("Skip MIPS' delay slot filling pass."),
44 cl::Hidden);
45
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +000046namespace {
Akira Hatanaka5dd41c92013-02-07 21:32:32 +000047 class Filler : public MachineFunctionPass {
48 public:
Bruno Cardoso Lopes90c59542010-12-09 17:31:11 +000049 Filler(TargetMachine &tm)
Owen Anderson90c579d2010-08-06 18:33:48 +000050 : MachineFunctionPass(ID), TM(tm), TII(tm.getInstrInfo()) { }
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +000051
52 virtual const char *getPassName() const {
53 return "Mips Delay Slot Filler";
54 }
55
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +000056 bool runOnMachineFunction(MachineFunction &F) {
Akira Hatanakaf9c3f3b2012-05-14 23:59:17 +000057 if (SkipDelaySlotFiller)
58 return false;
59
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +000060 bool Changed = false;
61 for (MachineFunction::iterator FI = F.begin(), FE = F.end();
62 FI != FE; ++FI)
63 Changed |= runOnMachineBasicBlock(*FI);
64 return Changed;
65 }
66
Akira Hatanaka5dd41c92013-02-07 21:32:32 +000067 private:
Akira Hatanakaeba97c52013-02-14 23:11:24 +000068 typedef MachineBasicBlock::iterator Iter;
69 typedef MachineBasicBlock::reverse_iterator ReverseIter;
Akira Hatanaka5dd41c92013-02-07 21:32:32 +000070
71 bool runOnMachineBasicBlock(MachineBasicBlock &MBB);
72
Akira Hatanakacd7319d2013-02-14 23:40:57 +000073 /// Initialize RegDefs and RegUses.
74 void initRegDefsUses(const MachineInstr &MI, BitVector &RegDefs,
75 BitVector &RegUses) const;
Akira Hatanakaa3defb02011-09-29 23:52:13 +000076
Akira Hatanakacd7319d2013-02-14 23:40:57 +000077 bool isRegInSet(const BitVector &RegSet, unsigned Reg) const;
Akira Hatanakaa3defb02011-09-29 23:52:13 +000078
Akira Hatanakacd7319d2013-02-14 23:40:57 +000079 bool checkRegDefsUses(const BitVector &RegDefs, const BitVector &RegUses,
80 BitVector &NewDefs, BitVector &NewUses,
81 unsigned Reg, bool IsDef) const;
82
83 bool checkRegDefsUses(BitVector &RegDefs, BitVector &RegUses,
84 const MachineInstr &MI, unsigned Begin,
85 unsigned End) const;
86
87 /// This function checks if it is valid to move Candidate to the delay slot
88 /// and returns true if it isn't. It also updates load and store flags and
89 /// register defs and uses.
Akira Hatanaka90db35a2013-02-14 23:20:15 +000090 bool delayHasHazard(const MachineInstr &Candidate, bool &SawLoad,
Akira Hatanakacd7319d2013-02-14 23:40:57 +000091 bool &SawStore, BitVector &RegDefs,
92 BitVector &RegUses) const;
Akira Hatanakaa3defb02011-09-29 23:52:13 +000093
Akira Hatanaka90db35a2013-02-14 23:20:15 +000094 bool findDelayInstr(MachineBasicBlock &MBB, Iter slot, Iter &Filler) const;
Akira Hatanakaeba97c52013-02-14 23:11:24 +000095
96 bool terminateSearch(const MachineInstr &Candidate) const;
Akira Hatanakaa3defb02011-09-29 23:52:13 +000097
Akira Hatanaka5dd41c92013-02-07 21:32:32 +000098 TargetMachine &TM;
99 const TargetInstrInfo *TII;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000100
Akira Hatanaka5dd41c92013-02-07 21:32:32 +0000101 static char ID;
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +0000102 };
103 char Filler::ID = 0;
104} // end of anonymous namespace
105
106/// runOnMachineBasicBlock - Fill in delay slots for the given basic block.
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000107/// We assume there is only one delay slot per delayed instruction.
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000108bool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) {
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +0000109 bool Changed = false;
Akira Hatanaka53120e02011-10-05 01:30:09 +0000110
Akira Hatanakaeba97c52013-02-14 23:11:24 +0000111 for (Iter I = MBB.begin(); I != MBB.end(); ++I) {
Akira Hatanaka5dd41c92013-02-07 21:32:32 +0000112 if (!I->hasDelaySlot())
113 continue;
Akira Hatanaka6f818ab2011-10-05 01:23:39 +0000114
Akira Hatanaka5dd41c92013-02-07 21:32:32 +0000115 ++FilledSlots;
116 Changed = true;
Akira Hatanakaeba97c52013-02-14 23:11:24 +0000117 Iter D;
Akira Hatanaka6f818ab2011-10-05 01:23:39 +0000118
Akira Hatanaka5dd41c92013-02-07 21:32:32 +0000119 // Delay slot filling is disabled at -O0.
120 if (!DisableDelaySlotFiller && (TM.getOptLevel() != CodeGenOpt::None) &&
121 findDelayInstr(MBB, I, D)) {
122 MBB.splice(llvm::next(I), &MBB, D);
123 ++UsefulSlots;
124 } else
125 BuildMI(MBB, llvm::next(I), I->getDebugLoc(), TII->get(Mips::NOP));
Akira Hatanaka15841392012-06-13 23:25:52 +0000126
Akira Hatanakaeba97c52013-02-14 23:11:24 +0000127 // Bundle the delay slot filler to the instruction with the delay slot.
128 MIBundleBuilder(MBB, I, llvm::next(llvm::next(I)));
Akira Hatanaka5dd41c92013-02-07 21:32:32 +0000129 }
130
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +0000131 return Changed;
132}
133
134/// createMipsDelaySlotFillerPass - Returns a pass that fills in delay
135/// slots in Mips MachineFunctions
136FunctionPass *llvm::createMipsDelaySlotFillerPass(MipsTargetMachine &tm) {
137 return new Filler(tm);
138}
139
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000140bool Filler::findDelayInstr(MachineBasicBlock &MBB, Iter Slot,
141 Iter &Filler) const {
Akira Hatanakacd7319d2013-02-14 23:40:57 +0000142 unsigned NumRegs = TM.getRegisterInfo()->getNumRegs();
143 BitVector RegDefs(NumRegs), RegUses(NumRegs);
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000144
Akira Hatanakacd7319d2013-02-14 23:40:57 +0000145 initRegDefsUses(*Slot, RegDefs, RegUses);
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000146
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000147 bool SawLoad = false;
148 bool SawStore = false;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000149
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000150 for (ReverseIter I(Slot); I != MBB.rend(); ++I) {
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000151 // skip debug value
152 if (I->isDebugValue())
153 continue;
154
Akira Hatanakaeba97c52013-02-14 23:11:24 +0000155 if (terminateSearch(*I))
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000156 break;
157
Akira Hatanakacd7319d2013-02-14 23:40:57 +0000158 if (delayHasHazard(*I, SawLoad, SawStore, RegDefs, RegUses))
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000159 continue;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000160
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000161 Filler = llvm::next(I).base();
Akira Hatanaka6f818ab2011-10-05 01:23:39 +0000162 return true;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000163 }
Akira Hatanaka6f818ab2011-10-05 01:23:39 +0000164
165 return false;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000166}
167
Akira Hatanakacd7319d2013-02-14 23:40:57 +0000168bool Filler::checkRegDefsUses(const BitVector &RegDefs,
169 const BitVector &RegUses,
170 BitVector &NewDefs, BitVector &NewUses,
171 unsigned Reg, bool IsDef) const {
172 if (IsDef) {
173 NewDefs.set(Reg);
174 // check whether Reg has already been defined or used.
175 return (isRegInSet(RegDefs, Reg) || isRegInSet(RegUses, Reg));
176 }
177
178 NewUses.set(Reg);
179 // check whether Reg has already been defined.
180 return isRegInSet(RegDefs, Reg);
181}
182
183bool Filler::checkRegDefsUses(BitVector &RegDefs, BitVector &RegUses,
184 const MachineInstr &MI, unsigned Begin,
185 unsigned End) const {
186 unsigned NumRegs = TM.getRegisterInfo()->getNumRegs();
187 BitVector NewDefs(NumRegs), NewUses(NumRegs);
188 bool HasHazard = false;
189
190 for (unsigned I = Begin; I != End; ++I) {
191 const MachineOperand &MO = MI.getOperand(I);
192
193 if (MO.isReg() && MO.getReg())
194 HasHazard |= checkRegDefsUses(RegDefs, RegUses, NewDefs, NewUses,
195 MO.getReg(), MO.isDef());
196 }
197
198 RegDefs |= NewDefs;
199 RegUses |= NewUses;
200
201 return HasHazard;
202}
203
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000204bool Filler::delayHasHazard(const MachineInstr &Candidate, bool &SawLoad,
Akira Hatanakacd7319d2013-02-14 23:40:57 +0000205 bool &SawStore, BitVector &RegDefs,
206 BitVector &RegUses) const {
207 bool HasHazard = (Candidate.isImplicitDef() || Candidate.isKill());
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000208
Akira Hatanakacfc3fb52011-10-05 01:09:37 +0000209 // Loads or stores cannot be moved past a store to the delay slot
Jia Liubb481f82012-02-28 07:46:26 +0000210 // and stores cannot be moved past a load.
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000211 if (Candidate.mayStore()) {
Akira Hatanakacd7319d2013-02-14 23:40:57 +0000212 HasHazard |= SawStore | SawLoad;
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000213 SawStore = true;
Akira Hatanakacd7319d2013-02-14 23:40:57 +0000214 } else if (Candidate.mayLoad()) {
215 HasHazard |= SawStore;
216 SawLoad = true;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000217 }
218
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000219 assert((!Candidate.isCall() && !Candidate.isReturn()) &&
Akira Hatanaka42be2802011-10-05 18:17:49 +0000220 "Cannot put calls or returns in delay slot.");
Akira Hatanaka0c419a72011-10-05 02:18:58 +0000221
Akira Hatanakacd7319d2013-02-14 23:40:57 +0000222 HasHazard |= checkRegDefsUses(RegDefs, RegUses, Candidate, 0,
223 Candidate.getNumOperands());
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000224
Akira Hatanakacd7319d2013-02-14 23:40:57 +0000225 return HasHazard;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000226}
227
Akira Hatanakacd7319d2013-02-14 23:40:57 +0000228void Filler::initRegDefsUses(const MachineInstr &MI, BitVector &RegDefs,
229 BitVector &RegUses) const {
230 // Add all register operands which are explicit and non-variadic.
231 checkRegDefsUses(RegDefs, RegUses, MI, 0, MI.getDesc().getNumOperands());
Akira Hatanakaa032dbd2012-11-16 02:39:34 +0000232
233 // If MI is a call, add RA to RegDefs to prevent users of RA from going into
234 // delay slot.
Akira Hatanakacd7319d2013-02-14 23:40:57 +0000235 if (MI.isCall())
236 RegDefs.set(Mips::RA);
237
238 // Add all implicit register operands of branch instructions except
239 // register AT.
240 if (MI.isBranch()) {
241 checkRegDefsUses(RegDefs, RegUses, MI, MI.getDesc().getNumOperands(),
242 MI.getNumOperands());
243 RegDefs.reset(Mips::AT);
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000244 }
245}
246
247//returns true if the Reg or its alias is in the RegSet.
Akira Hatanakacd7319d2013-02-14 23:40:57 +0000248bool Filler::isRegInSet(const BitVector &RegSet, unsigned Reg) const {
Jakob Stoklund Olesenf152fe82012-06-01 20:36:54 +0000249 // Check Reg and all aliased Registers.
250 for (MCRegAliasIterator AI(Reg, TM.getRegisterInfo(), true);
251 AI.isValid(); ++AI)
Akira Hatanakacd7319d2013-02-14 23:40:57 +0000252 if (RegSet.test(*AI))
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000253 return true;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000254 return false;
255}
Akira Hatanakaeba97c52013-02-14 23:11:24 +0000256
257bool Filler::terminateSearch(const MachineInstr &Candidate) const {
258 return (Candidate.isTerminator() || Candidate.isCall() ||
259 Candidate.isLabel() || Candidate.isInlineAsm() ||
260 Candidate.hasUnmodeledSideEffects());
261}