blob: 6ddb39b5e2b64e1700276bd021773f8f091cd9e7 [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"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000018#include "llvm/ADT/SmallSet.h"
19#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 Hatanaka90db35a2013-02-14 23:20:15 +000073 void insertDefsUses(const MachineInstr &MI, SmallSet<unsigned, 32> &RegDefs,
74 SmallSet<unsigned, 32> &RegUses) const;
Akira Hatanakaa3defb02011-09-29 23:52:13 +000075
Akira Hatanaka90db35a2013-02-14 23:20:15 +000076 bool isRegInSet(const SmallSet<unsigned, 32> &RegSet, unsigned Reg) const;
Akira Hatanakaa3defb02011-09-29 23:52:13 +000077
Akira Hatanaka90db35a2013-02-14 23:20:15 +000078 bool delayHasHazard(const MachineInstr &Candidate, bool &SawLoad,
79 bool &SawStore, const SmallSet<unsigned, 32> &RegDefs,
80 const SmallSet<unsigned, 32> &RegUses) const;
Akira Hatanakaa3defb02011-09-29 23:52:13 +000081
Akira Hatanaka90db35a2013-02-14 23:20:15 +000082 bool findDelayInstr(MachineBasicBlock &MBB, Iter slot, Iter &Filler) const;
Akira Hatanakaeba97c52013-02-14 23:11:24 +000083
84 bool terminateSearch(const MachineInstr &Candidate) const;
Akira Hatanakaa3defb02011-09-29 23:52:13 +000085
Akira Hatanaka5dd41c92013-02-07 21:32:32 +000086 TargetMachine &TM;
87 const TargetInstrInfo *TII;
Akira Hatanakaa3defb02011-09-29 23:52:13 +000088
Akira Hatanaka5dd41c92013-02-07 21:32:32 +000089 static char ID;
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +000090 };
91 char Filler::ID = 0;
92} // end of anonymous namespace
93
94/// runOnMachineBasicBlock - Fill in delay slots for the given basic block.
Akira Hatanakaa3defb02011-09-29 23:52:13 +000095/// We assume there is only one delay slot per delayed instruction.
Akira Hatanaka90db35a2013-02-14 23:20:15 +000096bool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) {
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +000097 bool Changed = false;
Akira Hatanaka53120e02011-10-05 01:30:09 +000098
Akira Hatanakaeba97c52013-02-14 23:11:24 +000099 for (Iter I = MBB.begin(); I != MBB.end(); ++I) {
Akira Hatanaka5dd41c92013-02-07 21:32:32 +0000100 if (!I->hasDelaySlot())
101 continue;
Akira Hatanaka6f818ab2011-10-05 01:23:39 +0000102
Akira Hatanaka5dd41c92013-02-07 21:32:32 +0000103 ++FilledSlots;
104 Changed = true;
Akira Hatanakaeba97c52013-02-14 23:11:24 +0000105 Iter D;
Akira Hatanaka6f818ab2011-10-05 01:23:39 +0000106
Akira Hatanaka5dd41c92013-02-07 21:32:32 +0000107 // Delay slot filling is disabled at -O0.
108 if (!DisableDelaySlotFiller && (TM.getOptLevel() != CodeGenOpt::None) &&
109 findDelayInstr(MBB, I, D)) {
110 MBB.splice(llvm::next(I), &MBB, D);
111 ++UsefulSlots;
112 } else
113 BuildMI(MBB, llvm::next(I), I->getDebugLoc(), TII->get(Mips::NOP));
Akira Hatanaka15841392012-06-13 23:25:52 +0000114
Akira Hatanakaeba97c52013-02-14 23:11:24 +0000115 // Bundle the delay slot filler to the instruction with the delay slot.
116 MIBundleBuilder(MBB, I, llvm::next(llvm::next(I)));
Akira Hatanaka5dd41c92013-02-07 21:32:32 +0000117 }
118
Bruno Cardoso Lopes9684a692007-08-18 01:50:47 +0000119 return Changed;
120}
121
122/// createMipsDelaySlotFillerPass - Returns a pass that fills in delay
123/// slots in Mips MachineFunctions
124FunctionPass *llvm::createMipsDelaySlotFillerPass(MipsTargetMachine &tm) {
125 return new Filler(tm);
126}
127
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000128bool Filler::findDelayInstr(MachineBasicBlock &MBB, Iter Slot,
129 Iter &Filler) const {
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000130 SmallSet<unsigned, 32> RegDefs;
131 SmallSet<unsigned, 32> RegUses;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000132
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000133 insertDefsUses(*Slot, RegDefs, RegUses);
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000134
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000135 bool SawLoad = false;
136 bool SawStore = false;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000137
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000138 for (ReverseIter I(Slot); I != MBB.rend(); ++I) {
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000139 // skip debug value
140 if (I->isDebugValue())
141 continue;
142
Akira Hatanakaeba97c52013-02-14 23:11:24 +0000143 if (terminateSearch(*I))
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000144 break;
145
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000146 if (delayHasHazard(*I, SawLoad, SawStore, RegDefs, RegUses)) {
147 insertDefsUses(*I, RegDefs, RegUses);
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000148 continue;
149 }
150
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000151 Filler = llvm::next(I).base();
Akira Hatanaka6f818ab2011-10-05 01:23:39 +0000152 return true;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000153 }
Akira Hatanaka6f818ab2011-10-05 01:23:39 +0000154
155 return false;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000156}
157
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000158bool Filler::delayHasHazard(const MachineInstr &Candidate, bool &SawLoad,
159 bool &SawStore,
160 const SmallSet<unsigned, 32> &RegDefs,
161 const SmallSet<unsigned, 32> &RegUses) const {
162 if (Candidate.isImplicitDef() || Candidate.isKill())
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000163 return true;
164
Akira Hatanakacfc3fb52011-10-05 01:09:37 +0000165 // Loads or stores cannot be moved past a store to the delay slot
Jia Liubb481f82012-02-28 07:46:26 +0000166 // and stores cannot be moved past a load.
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000167 if (Candidate.mayLoad()) {
168 if (SawStore)
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000169 return true;
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000170 SawLoad = true;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000171 }
172
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000173 if (Candidate.mayStore()) {
174 if (SawStore)
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000175 return true;
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000176 SawStore = true;
177 if (SawLoad)
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000178 return true;
179 }
180
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000181 assert((!Candidate.isCall() && !Candidate.isReturn()) &&
Akira Hatanaka42be2802011-10-05 18:17:49 +0000182 "Cannot put calls or returns in delay slot.");
Akira Hatanaka0c419a72011-10-05 02:18:58 +0000183
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000184 for (unsigned I = 0, E = Candidate.getNumOperands(); I != E; ++I) {
185 const MachineOperand &MO = Candidate.getOperand(I);
Akira Hatanaka0c419a72011-10-05 02:18:58 +0000186 unsigned Reg;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000187
Akira Hatanaka0c419a72011-10-05 02:18:58 +0000188 if (!MO.isReg() || !(Reg = MO.getReg()))
189 continue; // skip
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000190
191 if (MO.isDef()) {
192 // check whether Reg is defined or used before delay slot.
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000193 if (isRegInSet(RegDefs, Reg) || isRegInSet(RegUses, Reg))
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000194 return true;
195 }
196 if (MO.isUse()) {
197 // check whether Reg is defined before delay slot.
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000198 if (isRegInSet(RegDefs, Reg))
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000199 return true;
200 }
201 }
202 return false;
203}
204
Akira Hatanakaa032dbd2012-11-16 02:39:34 +0000205// Helper function for getting a MachineOperand's register number and adding it
206// to RegDefs or RegUses.
207static void insertDefUse(const MachineOperand &MO,
208 SmallSet<unsigned, 32> &RegDefs,
209 SmallSet<unsigned, 32> &RegUses,
210 unsigned ExcludedReg = 0) {
211 unsigned Reg;
212
213 if (!MO.isReg() || !(Reg = MO.getReg()) || (Reg == ExcludedReg))
214 return;
215
216 if (MO.isDef())
217 RegDefs.insert(Reg);
218 else if (MO.isUse())
219 RegUses.insert(Reg);
220}
221
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000222// Insert Defs and Uses of MI into the sets RegDefs and RegUses.
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000223void Filler::insertDefsUses(const MachineInstr &MI,
Akira Hatanaka864f6602012-06-14 21:10:56 +0000224 SmallSet<unsigned, 32> &RegDefs,
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000225 SmallSet<unsigned, 32> &RegUses) const {
226 unsigned I, E = MI.getDesc().getNumOperands();
Jia Liubb481f82012-02-28 07:46:26 +0000227
Akira Hatanakaa032dbd2012-11-16 02:39:34 +0000228 for (I = 0; I != E; ++I)
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000229 insertDefUse(MI.getOperand(I), RegDefs, RegUses);
Akira Hatanakaa032dbd2012-11-16 02:39:34 +0000230
231 // If MI is a call, add RA to RegDefs to prevent users of RA from going into
232 // delay slot.
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000233 if (MI.isCall()) {
Akira Hatanaka2f523382011-10-05 18:11:44 +0000234 RegDefs.insert(Mips::RA);
Akira Hatanakaa032dbd2012-11-16 02:39:34 +0000235 return;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000236 }
Akira Hatanakaa032dbd2012-11-16 02:39:34 +0000237
238 // Return if MI is a return.
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000239 if (MI.isReturn())
Akira Hatanakaa032dbd2012-11-16 02:39:34 +0000240 return;
241
242 // Examine the implicit operands. Exclude register AT which is in the list of
243 // clobbered registers of branch instructions.
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000244 E = MI.getNumOperands();
Akira Hatanakaa032dbd2012-11-16 02:39:34 +0000245 for (; I != E; ++I)
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000246 insertDefUse(MI.getOperand(I), RegDefs, RegUses, Mips::AT);
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000247}
248
249//returns true if the Reg or its alias is in the RegSet.
Akira Hatanaka90db35a2013-02-14 23:20:15 +0000250bool Filler::isRegInSet(const SmallSet<unsigned, 32> &RegSet,
251 unsigned Reg) const {
Jakob Stoklund Olesenf152fe82012-06-01 20:36:54 +0000252 // Check Reg and all aliased Registers.
253 for (MCRegAliasIterator AI(Reg, TM.getRegisterInfo(), true);
254 AI.isValid(); ++AI)
255 if (RegSet.count(*AI))
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000256 return true;
Akira Hatanakaa3defb02011-09-29 23:52:13 +0000257 return false;
258}
Akira Hatanakaeba97c52013-02-14 23:11:24 +0000259
260bool Filler::terminateSearch(const MachineInstr &Candidate) const {
261 return (Candidate.isTerminator() || Candidate.isCall() ||
262 Candidate.isLabel() || Candidate.isInlineAsm() ||
263 Candidate.hasUnmodeledSideEffects());
264}