blob: 1590b205defbdce9dd59c7ba8cba1ed22f8d6ffd [file] [log] [blame]
Evan Cheng00b1a3c2012-01-07 03:02:36 +00001//===- MachineCopyPropagation.cpp - Machine Copy Propagation Pass ---------===//
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//
Geoff Berryfabedba2017-10-03 16:59:13 +000010// This is an extremely simple MachineInstr-level copy propagation pass.
Evan Cheng00b1a3c2012-01-07 03:02:36 +000011//
12//===----------------------------------------------------------------------===//
13
Evan Cheng00b1a3c2012-01-07 03:02:36 +000014#include "llvm/ADT/DenseMap.h"
Eugene Zelenko900b6332017-08-29 22:32:07 +000015#include "llvm/ADT/STLExtras.h"
Evan Cheng00b1a3c2012-01-07 03:02:36 +000016#include "llvm/ADT/SetVector.h"
17#include "llvm/ADT/SmallVector.h"
18#include "llvm/ADT/Statistic.h"
Eugene Zelenko900b6332017-08-29 22:32:07 +000019#include "llvm/ADT/iterator_range.h"
20#include "llvm/CodeGen/MachineBasicBlock.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000021#include "llvm/CodeGen/MachineFunction.h"
22#include "llvm/CodeGen/MachineFunctionPass.h"
Eugene Zelenko900b6332017-08-29 22:32:07 +000023#include "llvm/CodeGen/MachineInstr.h"
24#include "llvm/CodeGen/MachineOperand.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000025#include "llvm/CodeGen/MachineRegisterInfo.h"
David Blaikie3f833ed2017-11-08 01:01:31 +000026#include "llvm/CodeGen/TargetInstrInfo.h"
David Blaikieb3bde2e2017-11-17 01:07:10 +000027#include "llvm/CodeGen/TargetRegisterInfo.h"
28#include "llvm/CodeGen/TargetSubtargetInfo.h"
Eugene Zelenko900b6332017-08-29 22:32:07 +000029#include "llvm/MC/MCRegisterInfo.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000030#include "llvm/Pass.h"
31#include "llvm/Support/Debug.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000032#include "llvm/Support/raw_ostream.h"
Eugene Zelenko900b6332017-08-29 22:32:07 +000033#include <cassert>
34#include <iterator>
35
Evan Cheng00b1a3c2012-01-07 03:02:36 +000036using namespace llvm;
37
Matthias Braun1527baa2017-05-25 21:26:32 +000038#define DEBUG_TYPE "machine-cp"
Chandler Carruth1b9dde02014-04-22 02:02:50 +000039
Evan Cheng00b1a3c2012-01-07 03:02:36 +000040STATISTIC(NumDeletes, "Number of dead copies deleted");
41
42namespace {
Eugene Zelenko900b6332017-08-29 22:32:07 +000043
44using RegList = SmallVector<unsigned, 4>;
45using SourceMap = DenseMap<unsigned, RegList>;
46using Reg2MIMap = DenseMap<unsigned, MachineInstr *>;
Matthias Braune39ff702016-02-26 03:18:50 +000047
Geoff Berryfabedba2017-10-03 16:59:13 +000048 class MachineCopyPropagation : public MachineFunctionPass {
Evan Cheng00b1a3c2012-01-07 03:02:36 +000049 const TargetRegisterInfo *TRI;
Jakob Stoklund Olesenbb1e9832012-11-30 23:53:00 +000050 const TargetInstrInfo *TII;
Geoff Berryfabedba2017-10-03 16:59:13 +000051 const MachineRegisterInfo *MRI;
Andrew Trick9e761992012-02-08 21:22:43 +000052
Evan Cheng00b1a3c2012-01-07 03:02:36 +000053 public:
54 static char ID; // Pass identification, replacement for typeid
Eugene Zelenko900b6332017-08-29 22:32:07 +000055
Geoff Berryfabedba2017-10-03 16:59:13 +000056 MachineCopyPropagation() : MachineFunctionPass(ID) {
Matthias Braun273575d2016-02-20 03:56:36 +000057 initializeMachineCopyPropagationPass(*PassRegistry::getPassRegistry());
Evan Cheng00b1a3c2012-01-07 03:02:36 +000058 }
59
Matt Arsenault8f4d43a2016-06-02 00:04:26 +000060 void getAnalysisUsage(AnalysisUsage &AU) const override {
61 AU.setPreservesCFG();
62 MachineFunctionPass::getAnalysisUsage(AU);
63 }
64
Craig Topper4584cd52014-03-07 09:26:03 +000065 bool runOnMachineFunction(MachineFunction &MF) override;
Evan Cheng00b1a3c2012-01-07 03:02:36 +000066
Derek Schuffad154c82016-03-28 17:05:30 +000067 MachineFunctionProperties getRequiredProperties() const override {
68 return MachineFunctionProperties().set(
Matthias Braun1eb47362016-08-25 01:27:13 +000069 MachineFunctionProperties::Property::NoVRegs);
Derek Schuffad154c82016-03-28 17:05:30 +000070 }
71
Evan Cheng00b1a3c2012-01-07 03:02:36 +000072 private:
Matthias Braune39ff702016-02-26 03:18:50 +000073 void ClobberRegister(unsigned Reg);
Matthias Braun82e7f4d2017-02-04 02:27:20 +000074 void ReadRegister(unsigned Reg);
Matthias Braunbd18d752016-02-20 03:56:39 +000075 void CopyPropagateBlock(MachineBasicBlock &MBB);
Matthias Braun9dcd65f2016-02-26 03:18:55 +000076 bool eraseIfRedundant(MachineInstr &Copy, unsigned Src, unsigned Def);
Matthias Braunbd18d752016-02-20 03:56:39 +000077
78 /// Candidates for deletion.
79 SmallSetVector<MachineInstr*, 8> MaybeDeadCopies;
Eugene Zelenko900b6332017-08-29 22:32:07 +000080
Matthias Braunbd18d752016-02-20 03:56:39 +000081 /// Def -> available copies map.
Matthias Braunc65e9042016-02-20 03:56:41 +000082 Reg2MIMap AvailCopyMap;
Eugene Zelenko900b6332017-08-29 22:32:07 +000083
Matthias Braunbd18d752016-02-20 03:56:39 +000084 /// Def -> copies map.
Matthias Braunc65e9042016-02-20 03:56:41 +000085 Reg2MIMap CopyMap;
Eugene Zelenko900b6332017-08-29 22:32:07 +000086
Matthias Braunbd18d752016-02-20 03:56:39 +000087 /// Src -> Def map
88 SourceMap SrcMap;
Eugene Zelenko900b6332017-08-29 22:32:07 +000089
Matthias Braunbd18d752016-02-20 03:56:39 +000090 bool Changed;
Evan Cheng00b1a3c2012-01-07 03:02:36 +000091 };
Eugene Zelenko900b6332017-08-29 22:32:07 +000092
93} // end anonymous namespace
94
Evan Cheng00b1a3c2012-01-07 03:02:36 +000095char MachineCopyPropagation::ID = 0;
Eugene Zelenko900b6332017-08-29 22:32:07 +000096
Andrew Trick1fa5bcb2012-02-08 21:23:13 +000097char &llvm::MachineCopyPropagationID = MachineCopyPropagation::ID;
Evan Cheng00b1a3c2012-01-07 03:02:36 +000098
Matthias Braun1527baa2017-05-25 21:26:32 +000099INITIALIZE_PASS(MachineCopyPropagation, DEBUG_TYPE,
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000100 "Machine Copy Propagation Pass", false, false)
101
Matthias Braune39ff702016-02-26 03:18:50 +0000102/// Remove any entry in \p Map where the register is a subregister or equal to
103/// a register contained in \p Regs.
104static void removeRegsFromMap(Reg2MIMap &Map, const RegList &Regs,
105 const TargetRegisterInfo &TRI) {
106 for (unsigned Reg : Regs) {
107 // Source of copy is no longer available for propagation.
108 for (MCSubRegIterator SR(Reg, &TRI, true); SR.isValid(); ++SR)
109 Map.erase(*SR);
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000110 }
111}
112
Matthias Braune39ff702016-02-26 03:18:50 +0000113/// Remove any entry in \p Map that is marked clobbered in \p RegMask.
114/// The map will typically have a lot fewer entries than the regmask clobbers,
115/// so this is more efficient than iterating the clobbered registers and calling
116/// ClobberRegister() on them.
117static void removeClobberedRegsFromMap(Reg2MIMap &Map,
118 const MachineOperand &RegMask) {
119 for (Reg2MIMap::iterator I = Map.begin(), E = Map.end(), Next; I != E;
120 I = Next) {
121 Next = std::next(I);
122 unsigned Reg = I->first;
123 if (RegMask.clobbersPhysReg(Reg))
124 Map.erase(I);
Evan Cheng520730f2012-01-08 19:52:28 +0000125 }
Matthias Braune39ff702016-02-26 03:18:50 +0000126}
127
128void MachineCopyPropagation::ClobberRegister(unsigned Reg) {
129 for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) {
130 CopyMap.erase(*AI);
131 AvailCopyMap.erase(*AI);
132
133 SourceMap::iterator SI = SrcMap.find(*AI);
134 if (SI != SrcMap.end()) {
135 removeRegsFromMap(AvailCopyMap, SI->second, *TRI);
136 SrcMap.erase(SI);
137 }
138 }
Evan Cheng520730f2012-01-08 19:52:28 +0000139}
140
Matthias Braun82e7f4d2017-02-04 02:27:20 +0000141void MachineCopyPropagation::ReadRegister(unsigned Reg) {
142 // If 'Reg' is defined by a copy, the copy is no longer a candidate
143 // for elimination.
144 for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) {
145 Reg2MIMap::iterator CI = CopyMap.find(*AI);
146 if (CI != CopyMap.end()) {
147 DEBUG(dbgs() << "MCP: Copy is used - not dead: "; CI->second->dump());
148 MaybeDeadCopies.remove(CI->second);
149 }
150 }
151}
152
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000153/// Return true if \p PreviousCopy did copy register \p Src to register \p Def.
154/// This fact may have been obscured by sub register usage or may not be true at
155/// all even though Src and Def are subregisters of the registers used in
156/// PreviousCopy. e.g.
157/// isNopCopy("ecx = COPY eax", AX, CX) == true
158/// isNopCopy("ecx = COPY eax", AH, CL) == false
159static bool isNopCopy(const MachineInstr &PreviousCopy, unsigned Src,
160 unsigned Def, const TargetRegisterInfo *TRI) {
161 unsigned PreviousSrc = PreviousCopy.getOperand(1).getReg();
162 unsigned PreviousDef = PreviousCopy.getOperand(0).getReg();
163 if (Src == PreviousSrc) {
164 assert(Def == PreviousDef);
Evan Cheng63618f92012-02-20 23:28:17 +0000165 return true;
Evan Cheng63618f92012-02-20 23:28:17 +0000166 }
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000167 if (!TRI->isSubRegister(PreviousSrc, Src))
168 return false;
169 unsigned SubIdx = TRI->getSubRegIndex(PreviousSrc, Src);
170 return SubIdx == TRI->getSubRegIndex(PreviousDef, Def);
171}
Evan Cheng63618f92012-02-20 23:28:17 +0000172
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000173/// Remove instruction \p Copy if there exists a previous copy that copies the
174/// register \p Src to the register \p Def; This may happen indirectly by
175/// copying the super registers.
176bool MachineCopyPropagation::eraseIfRedundant(MachineInstr &Copy, unsigned Src,
177 unsigned Def) {
178 // Avoid eliminating a copy from/to a reserved registers as we cannot predict
179 // the value (Example: The sparc zero register is writable but stays zero).
180 if (MRI->isReserved(Src) || MRI->isReserved(Def))
181 return false;
182
183 // Search for an existing copy.
184 Reg2MIMap::iterator CI = AvailCopyMap.find(Def);
185 if (CI == AvailCopyMap.end())
186 return false;
187
188 // Check that the existing copy uses the correct sub registers.
189 MachineInstr &PrevCopy = *CI->second;
Alexander Timofeev28da0672017-11-10 12:21:10 +0000190 if (PrevCopy.getOperand(0).isDead())
191 return false;
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000192 if (!isNopCopy(PrevCopy, Src, Def, TRI))
193 return false;
194
195 DEBUG(dbgs() << "MCP: copy is a NOP, removing: "; Copy.dump());
196
197 // Copy was redundantly redefining either Src or Def. Remove earlier kill
198 // flags between Copy and PrevCopy because the value will be reused now.
199 assert(Copy.isCopy());
200 unsigned CopyDef = Copy.getOperand(0).getReg();
201 assert(CopyDef == Src || CopyDef == Def);
202 for (MachineInstr &MI :
203 make_range(PrevCopy.getIterator(), Copy.getIterator()))
204 MI.clearRegisterKills(CopyDef, TRI);
205
206 Copy.eraseFromParent();
207 Changed = true;
208 ++NumDeletes;
209 return true;
Evan Cheng63618f92012-02-20 23:28:17 +0000210}
211
Matthias Braunbd18d752016-02-20 03:56:39 +0000212void MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
James Molloyd787d3e2014-01-22 09:12:27 +0000213 DEBUG(dbgs() << "MCP: CopyPropagateBlock " << MBB.getName() << "\n");
214
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000215 for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ) {
216 MachineInstr *MI = &*I;
217 ++I;
218
219 if (MI->isCopy()) {
Geoff Berryfabedba2017-10-03 16:59:13 +0000220 unsigned Def = MI->getOperand(0).getReg();
221 unsigned Src = MI->getOperand(1).getReg();
222
223 assert(!TargetRegisterInfo::isVirtualRegister(Def) &&
224 !TargetRegisterInfo::isVirtualRegister(Src) &&
225 "MachineCopyPropagation should be run after register allocation!");
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000226
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000227 // The two copies cancel out and the source of the first copy
228 // hasn't been overridden, eliminate the second one. e.g.
Francis Visoiu Mistrih9d7bb0c2017-11-28 17:15:09 +0000229 // %ecx<def> = COPY %eax
230 // ... nothing clobbered eax.
231 // %eax<def> = COPY %ecx
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000232 // =>
Francis Visoiu Mistrih9d7bb0c2017-11-28 17:15:09 +0000233 // %ecx<def> = COPY %eax
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000234 //
235 // or
236 //
Francis Visoiu Mistrih9d7bb0c2017-11-28 17:15:09 +0000237 // %ecx<def> = COPY %eax
238 // ... nothing clobbered eax.
239 // %ecx<def> = COPY %eax
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000240 // =>
Francis Visoiu Mistrih9d7bb0c2017-11-28 17:15:09 +0000241 // %ecx<def> = COPY %eax
Geoff Berryfabedba2017-10-03 16:59:13 +0000242 if (eraseIfRedundant(*MI, Def, Src) || eraseIfRedundant(*MI, Src, Def))
243 continue;
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000244
Jun Bum Lim59df5e82016-02-03 15:56:27 +0000245 // If Src is defined by a previous copy, the previous copy cannot be
246 // eliminated.
Matthias Braun82e7f4d2017-02-04 02:27:20 +0000247 ReadRegister(Src);
248 for (const MachineOperand &MO : MI->implicit_operands()) {
249 if (!MO.isReg() || !MO.readsReg())
250 continue;
251 unsigned Reg = MO.getReg();
252 if (!Reg)
253 continue;
254 ReadRegister(Reg);
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000255 }
256
James Molloyd787d3e2014-01-22 09:12:27 +0000257 DEBUG(dbgs() << "MCP: Copy is a deletion candidate: "; MI->dump());
258
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000259 // Copy is now a candidate for deletion.
Geoff Berryfabedba2017-10-03 16:59:13 +0000260 if (!MRI->isReserved(Def))
Matthias Braun273575d2016-02-20 03:56:36 +0000261 MaybeDeadCopies.insert(MI);
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000262
Jun Bum Lim59df5e82016-02-03 15:56:27 +0000263 // If 'Def' is previously source of another copy, then this earlier copy's
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000264 // source is no longer available. e.g.
265 // %xmm9<def> = copy %xmm2
266 // ...
267 // %xmm2<def> = copy %xmm0
268 // ...
269 // %xmm2<def> = copy %xmm9
Geoff Berryfabedba2017-10-03 16:59:13 +0000270 ClobberRegister(Def);
Matthias Braun82e7f4d2017-02-04 02:27:20 +0000271 for (const MachineOperand &MO : MI->implicit_operands()) {
272 if (!MO.isReg() || !MO.isDef())
273 continue;
Geoff Berryfabedba2017-10-03 16:59:13 +0000274 unsigned Reg = MO.getReg();
Matthias Braun82e7f4d2017-02-04 02:27:20 +0000275 if (!Reg)
276 continue;
277 ClobberRegister(Reg);
278 }
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000279
Alexander Timofeev9dff31c2017-10-16 16:57:37 +0000280 // Remember Def is defined by the copy.
281 for (MCSubRegIterator SR(Def, TRI, /*IncludeSelf=*/true); SR.isValid();
282 ++SR) {
283 CopyMap[*SR] = MI;
284 AvailCopyMap[*SR] = MI;
Alexander Timofeev38282422017-10-16 14:35:29 +0000285 }
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000286
Alexander Timofeev9dff31c2017-10-16 16:57:37 +0000287 // Remember source that's copied to Def. Once it's clobbered, then
288 // it's no longer available for copy propagation.
289 RegList &DestList = SrcMap[Src];
290 if (!is_contained(DestList, Def))
291 DestList.push_back(Def);
292
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000293 continue;
294 }
295
296 // Not a copy.
297 SmallVector<unsigned, 2> Defs;
Matthias Braun273575d2016-02-20 03:56:36 +0000298 const MachineOperand *RegMask = nullptr;
299 for (const MachineOperand &MO : MI->operands()) {
Jakob Stoklund Olesen8610a592012-02-08 22:37:35 +0000300 if (MO.isRegMask())
Matthias Braun273575d2016-02-20 03:56:36 +0000301 RegMask = &MO;
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000302 if (!MO.isReg())
303 continue;
Geoff Berryfabedba2017-10-03 16:59:13 +0000304 unsigned Reg = MO.getReg();
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000305 if (!Reg)
306 continue;
307
Geoff Berryfabedba2017-10-03 16:59:13 +0000308 assert(!TargetRegisterInfo::isVirtualRegister(Reg) &&
309 "MachineCopyPropagation should be run after register allocation!");
310
311 if (MO.isDef()) {
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000312 Defs.push_back(Reg);
313 continue;
Matthias Braun82e7f4d2017-02-04 02:27:20 +0000314 } else if (MO.readsReg())
315 ReadRegister(Reg);
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000316 }
317
Jakob Stoklund Olesen8610a592012-02-08 22:37:35 +0000318 // The instruction has a register mask operand which means that it clobbers
Matthias Braune39ff702016-02-26 03:18:50 +0000319 // a large set of registers. Treat clobbered registers the same way as
320 // defined registers.
Matthias Braun273575d2016-02-20 03:56:36 +0000321 if (RegMask) {
Jakob Stoklund Olesen938b4d22012-02-09 00:19:08 +0000322 // Erase any MaybeDeadCopies whose destination register is clobbered.
Jun Bum Lim36c53fe2016-03-25 21:15:35 +0000323 for (SmallSetVector<MachineInstr *, 8>::iterator DI =
324 MaybeDeadCopies.begin();
325 DI != MaybeDeadCopies.end();) {
326 MachineInstr *MaybeDead = *DI;
Matthias Braun273575d2016-02-20 03:56:36 +0000327 unsigned Reg = MaybeDead->getOperand(0).getReg();
328 assert(!MRI->isReserved(Reg));
Jun Bum Lim36c53fe2016-03-25 21:15:35 +0000329
330 if (!RegMask->clobbersPhysReg(Reg)) {
331 ++DI;
Jakob Stoklund Olesen938b4d22012-02-09 00:19:08 +0000332 continue;
Jun Bum Lim36c53fe2016-03-25 21:15:35 +0000333 }
334
James Molloyd787d3e2014-01-22 09:12:27 +0000335 DEBUG(dbgs() << "MCP: Removing copy due to regmask clobbering: ";
Matthias Braun273575d2016-02-20 03:56:36 +0000336 MaybeDead->dump());
Jun Bum Lim36c53fe2016-03-25 21:15:35 +0000337
338 // erase() will return the next valid iterator pointing to the next
339 // element after the erased one.
340 DI = MaybeDeadCopies.erase(DI);
Matthias Braun273575d2016-02-20 03:56:36 +0000341 MaybeDead->eraseFromParent();
Jakob Stoklund Olesen938b4d22012-02-09 00:19:08 +0000342 Changed = true;
343 ++NumDeletes;
344 }
Matthias Braune39ff702016-02-26 03:18:50 +0000345
346 removeClobberedRegsFromMap(AvailCopyMap, *RegMask);
347 removeClobberedRegsFromMap(CopyMap, *RegMask);
348 for (SourceMap::iterator I = SrcMap.begin(), E = SrcMap.end(), Next;
349 I != E; I = Next) {
350 Next = std::next(I);
351 if (RegMask->clobbersPhysReg(I->first)) {
352 removeRegsFromMap(AvailCopyMap, I->second, *TRI);
353 SrcMap.erase(I);
354 }
355 }
Jakob Stoklund Olesen8610a592012-02-08 22:37:35 +0000356 }
357
Matthias Braune39ff702016-02-26 03:18:50 +0000358 // Any previous copy definition or reading the Defs is no longer available.
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000359 for (unsigned Reg : Defs)
Matthias Braune39ff702016-02-26 03:18:50 +0000360 ClobberRegister(Reg);
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000361 }
362
363 // If MBB doesn't have successors, delete the copies whose defs are not used.
364 // If MBB does have successors, then conservative assume the defs are live-out
365 // since we don't want to trust live-in lists.
366 if (MBB.succ_empty()) {
Matthias Braun273575d2016-02-20 03:56:36 +0000367 for (MachineInstr *MaybeDead : MaybeDeadCopies) {
368 assert(!MRI->isReserved(MaybeDead->getOperand(0).getReg()));
369 MaybeDead->eraseFromParent();
370 Changed = true;
371 ++NumDeletes;
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000372 }
373 }
374
Matthias Braunbd18d752016-02-20 03:56:39 +0000375 MaybeDeadCopies.clear();
376 AvailCopyMap.clear();
377 CopyMap.clear();
378 SrcMap.clear();
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000379}
380
381bool MachineCopyPropagation::runOnMachineFunction(MachineFunction &MF) {
Andrew Kayloraa641a52016-04-22 22:06:11 +0000382 if (skipFunction(*MF.getFunction()))
Paul Robinson7c99ec52014-03-31 17:43:35 +0000383 return false;
384
Matthias Braunbd18d752016-02-20 03:56:39 +0000385 Changed = false;
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000386
Eric Christopherfc6de422014-08-05 02:39:49 +0000387 TRI = MF.getSubtarget().getRegisterInfo();
388 TII = MF.getSubtarget().getInstrInfo();
Jakob Stoklund Olesenc30a9af2012-10-15 21:57:41 +0000389 MRI = &MF.getRegInfo();
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000390
Matthias Braun273575d2016-02-20 03:56:36 +0000391 for (MachineBasicBlock &MBB : MF)
Matthias Braunbd18d752016-02-20 03:56:39 +0000392 CopyPropagateBlock(MBB);
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000393
394 return Changed;
395}