blob: 74b0f59bac7de2f7ea9289ab3eee1e6a620091f5 [file] [log] [blame]
Lang Hames233a60e2009-11-03 23:52:08 +00001//===---------------------- ProcessImplicitDefs.cpp -----------------------===//
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#define DEBUG_TYPE "processimplicitdefs"
11
Lang Hames233a60e2009-11-03 23:52:08 +000012#include "llvm/ADT/DepthFirstIterator.h"
13#include "llvm/ADT/SmallSet.h"
14#include "llvm/Analysis/AliasAnalysis.h"
15#include "llvm/CodeGen/LiveVariables.h"
Jakob Stoklund Olesen0cafa132012-06-22 22:27:36 +000016#include "llvm/CodeGen/MachineFunctionPass.h"
Lang Hames233a60e2009-11-03 23:52:08 +000017#include "llvm/CodeGen/MachineInstr.h"
18#include "llvm/CodeGen/MachineRegisterInfo.h"
19#include "llvm/CodeGen/Passes.h"
20#include "llvm/Support/Debug.h"
21#include "llvm/Target/TargetInstrInfo.h"
22#include "llvm/Target/TargetRegisterInfo.h"
23
24
25using namespace llvm;
26
Jakob Stoklund Olesen0cafa132012-06-22 22:27:36 +000027namespace {
28/// Process IMPLICIT_DEF instructions and make sure there is one implicit_def
29/// for each use. Add isUndef marker to implicit_def defs and their uses.
30class ProcessImplicitDefs : public MachineFunctionPass {
31 const TargetInstrInfo *TII;
32 const TargetRegisterInfo *TRI;
33 MachineRegisterInfo *MRI;
34 LiveVariables *LV;
35
36 bool CanTurnIntoImplicitDef(MachineInstr *MI, unsigned Reg,
37 unsigned OpIdx,
38 SmallSet<unsigned, 8> &ImpDefRegs);
39
40public:
41 static char ID;
42
43 ProcessImplicitDefs() : MachineFunctionPass(ID) {
44 initializeProcessImplicitDefsPass(*PassRegistry::getPassRegistry());
45 }
46
47 virtual void getAnalysisUsage(AnalysisUsage &au) const;
48
49 virtual bool runOnMachineFunction(MachineFunction &fn);
50};
51} // end anonymous namespace
52
Lang Hames233a60e2009-11-03 23:52:08 +000053char ProcessImplicitDefs::ID = 0;
Andrew Trick8dd26252012-02-10 04:10:36 +000054char &llvm::ProcessImplicitDefsID = ProcessImplicitDefs::ID;
55
Owen Anderson2ab36d32010-10-12 19:48:12 +000056INITIALIZE_PASS_BEGIN(ProcessImplicitDefs, "processimpdefs",
Cameron Zwarichdd061b32010-12-29 11:49:10 +000057 "Process Implicit Definitions", false, false)
Owen Anderson2ab36d32010-10-12 19:48:12 +000058INITIALIZE_PASS_DEPENDENCY(LiveVariables)
59INITIALIZE_PASS_END(ProcessImplicitDefs, "processimpdefs",
Cameron Zwarichdd061b32010-12-29 11:49:10 +000060 "Process Implicit Definitions", false, false)
Lang Hames233a60e2009-11-03 23:52:08 +000061
62void ProcessImplicitDefs::getAnalysisUsage(AnalysisUsage &AU) const {
63 AU.setPreservesCFG();
64 AU.addPreserved<AliasAnalysis>();
65 AU.addPreserved<LiveVariables>();
Lang Hames233a60e2009-11-03 23:52:08 +000066 AU.addPreservedID(MachineLoopInfoID);
67 AU.addPreservedID(MachineDominatorsID);
68 AU.addPreservedID(TwoAddressInstructionPassID);
69 AU.addPreservedID(PHIEliminationID);
70 MachineFunctionPass::getAnalysisUsage(AU);
71}
72
Evan Chengdb898092010-07-14 01:22:19 +000073bool
74ProcessImplicitDefs::CanTurnIntoImplicitDef(MachineInstr *MI,
75 unsigned Reg, unsigned OpIdx,
Evan Chengdb898092010-07-14 01:22:19 +000076 SmallSet<unsigned, 8> &ImpDefRegs) {
Jakob Stoklund Olesen273f7e42010-07-03 00:04:37 +000077 switch(OpIdx) {
Evan Chengdb898092010-07-14 01:22:19 +000078 case 1:
Jakob Stoklund Olesene8838d52012-01-25 23:36:27 +000079 return MI->isCopy() && (!MI->getOperand(0).readsReg() ||
Evan Chengdb898092010-07-14 01:22:19 +000080 ImpDefRegs.count(MI->getOperand(0).getReg()));
81 case 2:
Jakob Stoklund Olesene8838d52012-01-25 23:36:27 +000082 return MI->isSubregToReg() && (!MI->getOperand(0).readsReg() ||
Evan Chengdb898092010-07-14 01:22:19 +000083 ImpDefRegs.count(MI->getOperand(0).getReg()));
84 default: return false;
Jakob Stoklund Olesen273f7e42010-07-03 00:04:37 +000085 }
Lang Hames233a60e2009-11-03 23:52:08 +000086}
87
Evan Chengdb898092010-07-14 01:22:19 +000088static bool isUndefCopy(MachineInstr *MI, unsigned Reg,
Evan Chengdb898092010-07-14 01:22:19 +000089 SmallSet<unsigned, 8> &ImpDefRegs) {
90 if (MI->isCopy()) {
91 MachineOperand &MO0 = MI->getOperand(0);
92 MachineOperand &MO1 = MI->getOperand(1);
93 if (MO1.getReg() != Reg)
94 return false;
Jakob Stoklund Olesene8838d52012-01-25 23:36:27 +000095 if (!MO0.readsReg() || ImpDefRegs.count(MO0.getReg()))
Evan Chengdb898092010-07-14 01:22:19 +000096 return true;
97 return false;
98 }
Evan Chengdb898092010-07-14 01:22:19 +000099 return false;
100}
101
Lang Hames233a60e2009-11-03 23:52:08 +0000102/// processImplicitDefs - Process IMPLICIT_DEF instructions and make sure
103/// there is one implicit_def for each use. Add isUndef marker to
104/// implicit_def defs and their uses.
105bool ProcessImplicitDefs::runOnMachineFunction(MachineFunction &fn) {
106
David Greene7530efb2010-01-05 01:24:28 +0000107 DEBUG(dbgs() << "********** PROCESS IMPLICIT DEFS **********\n"
Lang Hames233a60e2009-11-03 23:52:08 +0000108 << "********** Function: "
109 << ((Value*)fn.getFunction())->getName() << '\n');
110
111 bool Changed = false;
112
Jakob Stoklund Olesencf03e352011-03-14 20:57:14 +0000113 TII = fn.getTarget().getInstrInfo();
114 TRI = fn.getTarget().getRegisterInfo();
115 MRI = &fn.getRegInfo();
Andrew Trick8dd26252012-02-10 04:10:36 +0000116 LV = getAnalysisIfAvailable<LiveVariables>();
Lang Hames233a60e2009-11-03 23:52:08 +0000117
118 SmallSet<unsigned, 8> ImpDefRegs;
119 SmallVector<MachineInstr*, 8> ImpDefMIs;
Evan Chenge7c91952009-11-25 21:13:39 +0000120 SmallVector<MachineInstr*, 4> RUses;
Lang Hames233a60e2009-11-03 23:52:08 +0000121 SmallPtrSet<MachineBasicBlock*,16> Visited;
Evan Cheng285a7d52009-11-16 05:52:06 +0000122 SmallPtrSet<MachineInstr*, 8> ModInsts;
Lang Hames233a60e2009-11-03 23:52:08 +0000123
Evan Chenge7c91952009-11-25 21:13:39 +0000124 MachineBasicBlock *Entry = fn.begin();
Lang Hames233a60e2009-11-03 23:52:08 +0000125 for (df_ext_iterator<MachineBasicBlock*, SmallPtrSet<MachineBasicBlock*,16> >
126 DFI = df_ext_begin(Entry, Visited), E = df_ext_end(Entry, Visited);
127 DFI != E; ++DFI) {
128 MachineBasicBlock *MBB = *DFI;
129 for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end();
130 I != E; ) {
131 MachineInstr *MI = &*I;
132 ++I;
Chris Lattner518bb532010-02-09 19:54:29 +0000133 if (MI->isImplicitDef()) {
Jakob Stoklund Olesene8838d52012-01-25 23:36:27 +0000134 ImpDefMIs.push_back(MI);
135 // Is this a sub-register read-modify-write?
136 if (MI->getOperand(0).readsReg())
Evan Cheng9cc9bfa2010-05-10 21:25:30 +0000137 continue;
Lang Hames233a60e2009-11-03 23:52:08 +0000138 unsigned Reg = MI->getOperand(0).getReg();
139 ImpDefRegs.insert(Reg);
140 if (TargetRegisterInfo::isPhysicalRegister(Reg)) {
Jakob Stoklund Olesen396618b2012-06-01 23:28:30 +0000141 for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
142 ImpDefRegs.insert(*SubRegs);
Lang Hames233a60e2009-11-03 23:52:08 +0000143 }
Lang Hames233a60e2009-11-03 23:52:08 +0000144 continue;
145 }
146
Jakob Stoklund Olesened2185e2010-07-06 23:26:25 +0000147 // Eliminate %reg1032:sub<def> = COPY undef.
Jakob Stoklund Olesene8838d52012-01-25 23:36:27 +0000148 if (MI->isCopy() && MI->getOperand(0).readsReg()) {
Jakob Stoklund Olesened2185e2010-07-06 23:26:25 +0000149 MachineOperand &MO = MI->getOperand(1);
Evan Chengdb898092010-07-14 01:22:19 +0000150 if (MO.isUndef() || ImpDefRegs.count(MO.getReg())) {
Andrew Trick8dd26252012-02-10 04:10:36 +0000151 if (LV && MO.isKill()) {
Jakob Stoklund Olesencf03e352011-03-14 20:57:14 +0000152 LiveVariables::VarInfo& vi = LV->getVarInfo(MO.getReg());
Jakob Stoklund Olesened2185e2010-07-06 23:26:25 +0000153 vi.removeKill(MI);
154 }
Jakob Stoklund Olesenf6c69002011-07-28 21:38:51 +0000155 unsigned Reg = MI->getOperand(0).getReg();
Jakob Stoklund Olesened2185e2010-07-06 23:26:25 +0000156 MI->eraseFromParent();
157 Changed = true;
Jakob Stoklund Olesenf6c69002011-07-28 21:38:51 +0000158
159 // A REG_SEQUENCE may have been expanded into partial definitions.
160 // If this was the last one, mark Reg as implicitly defined.
161 if (TargetRegisterInfo::isVirtualRegister(Reg) && MRI->def_empty(Reg))
162 ImpDefRegs.insert(Reg);
Jakob Stoklund Olesened2185e2010-07-06 23:26:25 +0000163 continue;
164 }
165 }
166
Lang Hames233a60e2009-11-03 23:52:08 +0000167 bool ChangedToImpDef = false;
168 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
169 MachineOperand& MO = MI->getOperand(i);
Jakob Stoklund Olesene8838d52012-01-25 23:36:27 +0000170 if (!MO.isReg() || !MO.readsReg())
Lang Hames233a60e2009-11-03 23:52:08 +0000171 continue;
172 unsigned Reg = MO.getReg();
173 if (!Reg)
174 continue;
175 if (!ImpDefRegs.count(Reg))
176 continue;
177 // Use is a copy, just turn it into an implicit_def.
Jakob Stoklund Olesencf03e352011-03-14 20:57:14 +0000178 if (CanTurnIntoImplicitDef(MI, Reg, i, ImpDefRegs)) {
Lang Hames233a60e2009-11-03 23:52:08 +0000179 bool isKill = MO.isKill();
Jakob Stoklund Olesencf03e352011-03-14 20:57:14 +0000180 MI->setDesc(TII->get(TargetOpcode::IMPLICIT_DEF));
Lang Hames233a60e2009-11-03 23:52:08 +0000181 for (int j = MI->getNumOperands() - 1, ee = 0; j > ee; --j)
182 MI->RemoveOperand(j);
183 if (isKill) {
184 ImpDefRegs.erase(Reg);
Andrew Trick8dd26252012-02-10 04:10:36 +0000185 if (LV) {
186 LiveVariables::VarInfo& vi = LV->getVarInfo(Reg);
187 vi.removeKill(MI);
188 }
Lang Hames233a60e2009-11-03 23:52:08 +0000189 }
190 ChangedToImpDef = true;
191 Changed = true;
192 break;
193 }
194
195 Changed = true;
196 MO.setIsUndef();
Jakob Stoklund Olesened2185e2010-07-06 23:26:25 +0000197 // This is a partial register redef of an implicit def.
198 // Make sure the whole register is defined by the instruction.
199 if (MO.isDef()) {
200 MI->addRegisterDefined(Reg);
201 continue;
202 }
Lang Hames233a60e2009-11-03 23:52:08 +0000203 if (MO.isKill() || MI->isRegTiedToDefOperand(i)) {
Jakob Stoklund Olesene8838d52012-01-25 23:36:27 +0000204 // Make sure other reads of Reg are also marked <undef>.
Lang Hames233a60e2009-11-03 23:52:08 +0000205 for (unsigned j = i+1; j != e; ++j) {
206 MachineOperand &MOJ = MI->getOperand(j);
Jakob Stoklund Olesene8838d52012-01-25 23:36:27 +0000207 if (MOJ.isReg() && MOJ.getReg() == Reg && MOJ.readsReg())
Lang Hames233a60e2009-11-03 23:52:08 +0000208 MOJ.setIsUndef();
209 }
210 ImpDefRegs.erase(Reg);
211 }
212 }
213
214 if (ChangedToImpDef) {
215 // Backtrack to process this new implicit_def.
216 --I;
217 } else {
218 for (unsigned i = 0; i != MI->getNumOperands(); ++i) {
219 MachineOperand& MO = MI->getOperand(i);
220 if (!MO.isReg() || !MO.isDef())
221 continue;
222 ImpDefRegs.erase(MO.getReg());
223 }
224 }
225 }
226
227 // Any outstanding liveout implicit_def's?
228 for (unsigned i = 0, e = ImpDefMIs.size(); i != e; ++i) {
229 MachineInstr *MI = ImpDefMIs[i];
230 unsigned Reg = MI->getOperand(0).getReg();
231 if (TargetRegisterInfo::isPhysicalRegister(Reg) ||
232 !ImpDefRegs.count(Reg)) {
233 // Delete all "local" implicit_def's. That include those which define
234 // physical registers since they cannot be liveout.
235 MI->eraseFromParent();
236 Changed = true;
237 continue;
238 }
239
240 // If there are multiple defs of the same register and at least one
241 // is not an implicit_def, do not insert implicit_def's before the
242 // uses.
243 bool Skip = false;
Evan Cheng40ea0e22009-11-26 00:32:36 +0000244 SmallVector<MachineInstr*, 4> DeadImpDefs;
Jakob Stoklund Olesencf03e352011-03-14 20:57:14 +0000245 for (MachineRegisterInfo::def_iterator DI = MRI->def_begin(Reg),
246 DE = MRI->def_end(); DI != DE; ++DI) {
Evan Cheng40ea0e22009-11-26 00:32:36 +0000247 MachineInstr *DeadImpDef = &*DI;
Chris Lattner518bb532010-02-09 19:54:29 +0000248 if (!DeadImpDef->isImplicitDef()) {
Lang Hames233a60e2009-11-03 23:52:08 +0000249 Skip = true;
250 break;
251 }
Evan Cheng40ea0e22009-11-26 00:32:36 +0000252 DeadImpDefs.push_back(DeadImpDef);
Lang Hames233a60e2009-11-03 23:52:08 +0000253 }
254 if (Skip)
255 continue;
256
257 // The only implicit_def which we want to keep are those that are live
258 // out of its block.
Evan Cheng40ea0e22009-11-26 00:32:36 +0000259 for (unsigned j = 0, ee = DeadImpDefs.size(); j != ee; ++j)
260 DeadImpDefs[j]->eraseFromParent();
Lang Hames233a60e2009-11-03 23:52:08 +0000261 Changed = true;
262
Evan Chenge7c91952009-11-25 21:13:39 +0000263 // Process each use instruction once.
Jakob Stoklund Olesencf03e352011-03-14 20:57:14 +0000264 for (MachineRegisterInfo::use_iterator UI = MRI->use_begin(Reg),
265 UE = MRI->use_end(); UI != UE; ++UI) {
Jakob Stoklund Olesen8eea48a2010-02-15 22:03:29 +0000266 if (UI.getOperand().isUndef())
Lang Hames233a60e2009-11-03 23:52:08 +0000267 continue;
Jakob Stoklund Olesen8eea48a2010-02-15 22:03:29 +0000268 MachineInstr *RMI = &*UI;
Evan Chenge7c91952009-11-25 21:13:39 +0000269 if (ModInsts.insert(RMI))
270 RUses.push_back(RMI);
271 }
272
273 for (unsigned i = 0, e = RUses.size(); i != e; ++i) {
274 MachineInstr *RMI = RUses[i];
Lang Hames233a60e2009-11-03 23:52:08 +0000275
276 // Turn a copy use into an implicit_def.
Jakob Stoklund Olesencf03e352011-03-14 20:57:14 +0000277 if (isUndefCopy(RMI, Reg, ImpDefRegs)) {
278 RMI->setDesc(TII->get(TargetOpcode::IMPLICIT_DEF));
Evan Chenge7c91952009-11-25 21:13:39 +0000279
280 bool isKill = false;
281 SmallVector<unsigned, 4> Ops;
282 for (unsigned j = 0, ee = RMI->getNumOperands(); j != ee; ++j) {
283 MachineOperand &RRMO = RMI->getOperand(j);
284 if (RRMO.isReg() && RRMO.getReg() == Reg) {
285 Ops.push_back(j);
286 if (RRMO.isKill())
287 isKill = true;
288 }
289 }
290 // Leave the other operands along.
291 for (unsigned j = 0, ee = Ops.size(); j != ee; ++j) {
292 unsigned OpIdx = Ops[j];
293 RMI->RemoveOperand(OpIdx-j);
294 }
295
296 // Update LiveVariables varinfo if the instruction is a kill.
Andrew Trick8dd26252012-02-10 04:10:36 +0000297 if (LV && isKill) {
Jakob Stoklund Olesencf03e352011-03-14 20:57:14 +0000298 LiveVariables::VarInfo& vi = LV->getVarInfo(Reg);
Lang Hames79ac32d2009-11-16 02:07:31 +0000299 vi.removeKill(RMI);
300 }
Lang Hames233a60e2009-11-03 23:52:08 +0000301 continue;
302 }
303
Evan Chenge7c91952009-11-25 21:13:39 +0000304 // Replace Reg with a new vreg that's marked implicit.
Jakob Stoklund Olesencf03e352011-03-14 20:57:14 +0000305 const TargetRegisterClass* RC = MRI->getRegClass(Reg);
306 unsigned NewVReg = MRI->createVirtualRegister(RC);
Evan Chenge7c91952009-11-25 21:13:39 +0000307 bool isKill = true;
308 for (unsigned j = 0, ee = RMI->getNumOperands(); j != ee; ++j) {
309 MachineOperand &RRMO = RMI->getOperand(j);
310 if (RRMO.isReg() && RRMO.getReg() == Reg) {
311 RRMO.setReg(NewVReg);
312 RRMO.setIsUndef();
313 if (isKill) {
314 // Only the first operand of NewVReg is marked kill.
315 RRMO.setIsKill();
316 isKill = false;
317 }
318 }
319 }
Lang Hames233a60e2009-11-03 23:52:08 +0000320 }
Evan Chenge7c91952009-11-25 21:13:39 +0000321 RUses.clear();
Jakob Stoklund Olesene4d2d962010-02-04 18:46:28 +0000322 ModInsts.clear();
Lang Hames233a60e2009-11-03 23:52:08 +0000323 }
Lang Hames233a60e2009-11-03 23:52:08 +0000324 ImpDefRegs.clear();
325 ImpDefMIs.clear();
326 }
327
328 return Changed;
329}
330