blob: fcec05adc7325e30e0c659f3d2a0d564490a56ac [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 Blaikieb3bde2e2017-11-17 01:07:10 +000026#include "llvm/CodeGen/TargetRegisterInfo.h"
27#include "llvm/CodeGen/TargetSubtargetInfo.h"
Eugene Zelenko900b6332017-08-29 22:32:07 +000028#include "llvm/MC/MCRegisterInfo.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000029#include "llvm/Pass.h"
30#include "llvm/Support/Debug.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000031#include "llvm/Support/raw_ostream.h"
Eugene Zelenko900b6332017-08-29 22:32:07 +000032#include <cassert>
33#include <iterator>
34
Evan Cheng00b1a3c2012-01-07 03:02:36 +000035using namespace llvm;
36
Matthias Braun1527baa2017-05-25 21:26:32 +000037#define DEBUG_TYPE "machine-cp"
Chandler Carruth1b9dde02014-04-22 02:02:50 +000038
Evan Cheng00b1a3c2012-01-07 03:02:36 +000039STATISTIC(NumDeletes, "Number of dead copies deleted");
40
41namespace {
Eugene Zelenko900b6332017-08-29 22:32:07 +000042
43using RegList = SmallVector<unsigned, 4>;
44using SourceMap = DenseMap<unsigned, RegList>;
45using Reg2MIMap = DenseMap<unsigned, MachineInstr *>;
Matthias Braune39ff702016-02-26 03:18:50 +000046
Geoff Berryfabedba2017-10-03 16:59:13 +000047 class MachineCopyPropagation : public MachineFunctionPass {
Evan Cheng00b1a3c2012-01-07 03:02:36 +000048 const TargetRegisterInfo *TRI;
Jakob Stoklund Olesenbb1e9832012-11-30 23:53:00 +000049 const TargetInstrInfo *TII;
Geoff Berryfabedba2017-10-03 16:59:13 +000050 const MachineRegisterInfo *MRI;
Andrew Trick9e761992012-02-08 21:22:43 +000051
Evan Cheng00b1a3c2012-01-07 03:02:36 +000052 public:
53 static char ID; // Pass identification, replacement for typeid
Eugene Zelenko900b6332017-08-29 22:32:07 +000054
Geoff Berryfabedba2017-10-03 16:59:13 +000055 MachineCopyPropagation() : MachineFunctionPass(ID) {
Matthias Braun273575d2016-02-20 03:56:36 +000056 initializeMachineCopyPropagationPass(*PassRegistry::getPassRegistry());
Evan Cheng00b1a3c2012-01-07 03:02:36 +000057 }
58
Matt Arsenault8f4d43a2016-06-02 00:04:26 +000059 void getAnalysisUsage(AnalysisUsage &AU) const override {
60 AU.setPreservesCFG();
61 MachineFunctionPass::getAnalysisUsage(AU);
62 }
63
Craig Topper4584cd52014-03-07 09:26:03 +000064 bool runOnMachineFunction(MachineFunction &MF) override;
Evan Cheng00b1a3c2012-01-07 03:02:36 +000065
Derek Schuffad154c82016-03-28 17:05:30 +000066 MachineFunctionProperties getRequiredProperties() const override {
67 return MachineFunctionProperties().set(
Matthias Braun1eb47362016-08-25 01:27:13 +000068 MachineFunctionProperties::Property::NoVRegs);
Derek Schuffad154c82016-03-28 17:05:30 +000069 }
70
Evan Cheng00b1a3c2012-01-07 03:02:36 +000071 private:
Matthias Braune39ff702016-02-26 03:18:50 +000072 void ClobberRegister(unsigned Reg);
Matthias Braun82e7f4d2017-02-04 02:27:20 +000073 void ReadRegister(unsigned Reg);
Matthias Braunbd18d752016-02-20 03:56:39 +000074 void CopyPropagateBlock(MachineBasicBlock &MBB);
Matthias Braun9dcd65f2016-02-26 03:18:55 +000075 bool eraseIfRedundant(MachineInstr &Copy, unsigned Src, unsigned Def);
Matthias Braunbd18d752016-02-20 03:56:39 +000076
77 /// Candidates for deletion.
78 SmallSetVector<MachineInstr*, 8> MaybeDeadCopies;
Eugene Zelenko900b6332017-08-29 22:32:07 +000079
Matthias Braunbd18d752016-02-20 03:56:39 +000080 /// Def -> available copies map.
Matthias Braunc65e9042016-02-20 03:56:41 +000081 Reg2MIMap AvailCopyMap;
Eugene Zelenko900b6332017-08-29 22:32:07 +000082
Matthias Braunbd18d752016-02-20 03:56:39 +000083 /// Def -> copies map.
Matthias Braunc65e9042016-02-20 03:56:41 +000084 Reg2MIMap CopyMap;
Eugene Zelenko900b6332017-08-29 22:32:07 +000085
Matthias Braunbd18d752016-02-20 03:56:39 +000086 /// Src -> Def map
87 SourceMap SrcMap;
Eugene Zelenko900b6332017-08-29 22:32:07 +000088
Matthias Braunbd18d752016-02-20 03:56:39 +000089 bool Changed;
Evan Cheng00b1a3c2012-01-07 03:02:36 +000090 };
Eugene Zelenko900b6332017-08-29 22:32:07 +000091
92} // end anonymous namespace
93
Evan Cheng00b1a3c2012-01-07 03:02:36 +000094char MachineCopyPropagation::ID = 0;
Eugene Zelenko900b6332017-08-29 22:32:07 +000095
Andrew Trick1fa5bcb2012-02-08 21:23:13 +000096char &llvm::MachineCopyPropagationID = MachineCopyPropagation::ID;
Evan Cheng00b1a3c2012-01-07 03:02:36 +000097
Matthias Braun1527baa2017-05-25 21:26:32 +000098INITIALIZE_PASS(MachineCopyPropagation, DEBUG_TYPE,
Evan Cheng00b1a3c2012-01-07 03:02:36 +000099 "Machine Copy Propagation Pass", false, false)
100
Matthias Braune39ff702016-02-26 03:18:50 +0000101/// Remove any entry in \p Map where the register is a subregister or equal to
102/// a register contained in \p Regs.
103static void removeRegsFromMap(Reg2MIMap &Map, const RegList &Regs,
104 const TargetRegisterInfo &TRI) {
105 for (unsigned Reg : Regs) {
106 // Source of copy is no longer available for propagation.
107 for (MCSubRegIterator SR(Reg, &TRI, true); SR.isValid(); ++SR)
108 Map.erase(*SR);
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000109 }
110}
111
Matthias Braune39ff702016-02-26 03:18:50 +0000112/// Remove any entry in \p Map that is marked clobbered in \p RegMask.
113/// The map will typically have a lot fewer entries than the regmask clobbers,
114/// so this is more efficient than iterating the clobbered registers and calling
115/// ClobberRegister() on them.
116static void removeClobberedRegsFromMap(Reg2MIMap &Map,
117 const MachineOperand &RegMask) {
118 for (Reg2MIMap::iterator I = Map.begin(), E = Map.end(), Next; I != E;
119 I = Next) {
120 Next = std::next(I);
121 unsigned Reg = I->first;
122 if (RegMask.clobbersPhysReg(Reg))
123 Map.erase(I);
Evan Cheng520730f2012-01-08 19:52:28 +0000124 }
Matthias Braune39ff702016-02-26 03:18:50 +0000125}
126
127void MachineCopyPropagation::ClobberRegister(unsigned Reg) {
128 for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) {
129 CopyMap.erase(*AI);
130 AvailCopyMap.erase(*AI);
131
132 SourceMap::iterator SI = SrcMap.find(*AI);
133 if (SI != SrcMap.end()) {
134 removeRegsFromMap(AvailCopyMap, SI->second, *TRI);
135 SrcMap.erase(SI);
136 }
137 }
Evan Cheng520730f2012-01-08 19:52:28 +0000138}
139
Matthias Braun82e7f4d2017-02-04 02:27:20 +0000140void MachineCopyPropagation::ReadRegister(unsigned Reg) {
141 // If 'Reg' is defined by a copy, the copy is no longer a candidate
142 // for elimination.
143 for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) {
144 Reg2MIMap::iterator CI = CopyMap.find(*AI);
145 if (CI != CopyMap.end()) {
146 DEBUG(dbgs() << "MCP: Copy is used - not dead: "; CI->second->dump());
147 MaybeDeadCopies.remove(CI->second);
148 }
149 }
150}
151
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000152/// Return true if \p PreviousCopy did copy register \p Src to register \p Def.
153/// This fact may have been obscured by sub register usage or may not be true at
154/// all even though Src and Def are subregisters of the registers used in
155/// PreviousCopy. e.g.
156/// isNopCopy("ecx = COPY eax", AX, CX) == true
157/// isNopCopy("ecx = COPY eax", AH, CL) == false
158static bool isNopCopy(const MachineInstr &PreviousCopy, unsigned Src,
159 unsigned Def, const TargetRegisterInfo *TRI) {
160 unsigned PreviousSrc = PreviousCopy.getOperand(1).getReg();
161 unsigned PreviousDef = PreviousCopy.getOperand(0).getReg();
162 if (Src == PreviousSrc) {
163 assert(Def == PreviousDef);
Evan Cheng63618f92012-02-20 23:28:17 +0000164 return true;
Evan Cheng63618f92012-02-20 23:28:17 +0000165 }
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000166 if (!TRI->isSubRegister(PreviousSrc, Src))
167 return false;
168 unsigned SubIdx = TRI->getSubRegIndex(PreviousSrc, Src);
169 return SubIdx == TRI->getSubRegIndex(PreviousDef, Def);
170}
Evan Cheng63618f92012-02-20 23:28:17 +0000171
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000172/// Remove instruction \p Copy if there exists a previous copy that copies the
173/// register \p Src to the register \p Def; This may happen indirectly by
174/// copying the super registers.
175bool MachineCopyPropagation::eraseIfRedundant(MachineInstr &Copy, unsigned Src,
176 unsigned Def) {
177 // Avoid eliminating a copy from/to a reserved registers as we cannot predict
178 // the value (Example: The sparc zero register is writable but stays zero).
179 if (MRI->isReserved(Src) || MRI->isReserved(Def))
180 return false;
181
182 // Search for an existing copy.
183 Reg2MIMap::iterator CI = AvailCopyMap.find(Def);
184 if (CI == AvailCopyMap.end())
185 return false;
186
187 // Check that the existing copy uses the correct sub registers.
188 MachineInstr &PrevCopy = *CI->second;
Alexander Timofeev28da0672017-11-10 12:21:10 +0000189 if (PrevCopy.getOperand(0).isDead())
190 return false;
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000191 if (!isNopCopy(PrevCopy, Src, Def, TRI))
192 return false;
193
194 DEBUG(dbgs() << "MCP: copy is a NOP, removing: "; Copy.dump());
195
196 // Copy was redundantly redefining either Src or Def. Remove earlier kill
197 // flags between Copy and PrevCopy because the value will be reused now.
198 assert(Copy.isCopy());
199 unsigned CopyDef = Copy.getOperand(0).getReg();
200 assert(CopyDef == Src || CopyDef == Def);
201 for (MachineInstr &MI :
202 make_range(PrevCopy.getIterator(), Copy.getIterator()))
203 MI.clearRegisterKills(CopyDef, TRI);
204
205 Copy.eraseFromParent();
206 Changed = true;
207 ++NumDeletes;
208 return true;
Evan Cheng63618f92012-02-20 23:28:17 +0000209}
210
Matthias Braunbd18d752016-02-20 03:56:39 +0000211void MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
James Molloyd787d3e2014-01-22 09:12:27 +0000212 DEBUG(dbgs() << "MCP: CopyPropagateBlock " << MBB.getName() << "\n");
213
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000214 for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ) {
215 MachineInstr *MI = &*I;
216 ++I;
217
218 if (MI->isCopy()) {
Geoff Berryfabedba2017-10-03 16:59:13 +0000219 unsigned Def = MI->getOperand(0).getReg();
220 unsigned Src = MI->getOperand(1).getReg();
221
222 assert(!TargetRegisterInfo::isVirtualRegister(Def) &&
223 !TargetRegisterInfo::isVirtualRegister(Src) &&
224 "MachineCopyPropagation should be run after register allocation!");
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000225
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000226 // The two copies cancel out and the source of the first copy
227 // hasn't been overridden, eliminate the second one. e.g.
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000228 // %ecx = COPY %eax
Francis Visoiu Mistrih9d7bb0c2017-11-28 17:15:09 +0000229 // ... nothing clobbered eax.
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000230 // %eax = COPY %ecx
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000231 // =>
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000232 // %ecx = COPY %eax
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000233 //
234 // or
235 //
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000236 // %ecx = COPY %eax
Francis Visoiu Mistrih9d7bb0c2017-11-28 17:15:09 +0000237 // ... nothing clobbered eax.
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000238 // %ecx = COPY %eax
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000239 // =>
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000240 // %ecx = COPY %eax
Geoff Berryfabedba2017-10-03 16:59:13 +0000241 if (eraseIfRedundant(*MI, Def, Src) || eraseIfRedundant(*MI, Src, Def))
242 continue;
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000243
Jun Bum Lim59df5e82016-02-03 15:56:27 +0000244 // If Src is defined by a previous copy, the previous copy cannot be
245 // eliminated.
Matthias Braun82e7f4d2017-02-04 02:27:20 +0000246 ReadRegister(Src);
247 for (const MachineOperand &MO : MI->implicit_operands()) {
248 if (!MO.isReg() || !MO.readsReg())
249 continue;
250 unsigned Reg = MO.getReg();
251 if (!Reg)
252 continue;
253 ReadRegister(Reg);
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000254 }
255
James Molloyd787d3e2014-01-22 09:12:27 +0000256 DEBUG(dbgs() << "MCP: Copy is a deletion candidate: "; MI->dump());
257
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000258 // Copy is now a candidate for deletion.
Geoff Berryfabedba2017-10-03 16:59:13 +0000259 if (!MRI->isReserved(Def))
Matthias Braun273575d2016-02-20 03:56:36 +0000260 MaybeDeadCopies.insert(MI);
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000261
Jun Bum Lim59df5e82016-02-03 15:56:27 +0000262 // If 'Def' is previously source of another copy, then this earlier copy's
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000263 // source is no longer available. e.g.
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000264 // %xmm9 = copy %xmm2
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000265 // ...
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000266 // %xmm2 = copy %xmm0
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000267 // ...
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000268 // %xmm2 = copy %xmm9
Geoff Berryfabedba2017-10-03 16:59:13 +0000269 ClobberRegister(Def);
Matthias Braun82e7f4d2017-02-04 02:27:20 +0000270 for (const MachineOperand &MO : MI->implicit_operands()) {
271 if (!MO.isReg() || !MO.isDef())
272 continue;
Geoff Berryfabedba2017-10-03 16:59:13 +0000273 unsigned Reg = MO.getReg();
Matthias Braun82e7f4d2017-02-04 02:27:20 +0000274 if (!Reg)
275 continue;
276 ClobberRegister(Reg);
277 }
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000278
Alexander Timofeev9dff31c2017-10-16 16:57:37 +0000279 // Remember Def is defined by the copy.
280 for (MCSubRegIterator SR(Def, TRI, /*IncludeSelf=*/true); SR.isValid();
281 ++SR) {
282 CopyMap[*SR] = MI;
283 AvailCopyMap[*SR] = MI;
Alexander Timofeev38282422017-10-16 14:35:29 +0000284 }
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000285
Alexander Timofeev9dff31c2017-10-16 16:57:37 +0000286 // Remember source that's copied to Def. Once it's clobbered, then
287 // it's no longer available for copy propagation.
288 RegList &DestList = SrcMap[Src];
289 if (!is_contained(DestList, Def))
290 DestList.push_back(Def);
291
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000292 continue;
293 }
294
295 // Not a copy.
296 SmallVector<unsigned, 2> Defs;
Matthias Braun273575d2016-02-20 03:56:36 +0000297 const MachineOperand *RegMask = nullptr;
298 for (const MachineOperand &MO : MI->operands()) {
Jakob Stoklund Olesen8610a592012-02-08 22:37:35 +0000299 if (MO.isRegMask())
Matthias Braun273575d2016-02-20 03:56:36 +0000300 RegMask = &MO;
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000301 if (!MO.isReg())
302 continue;
Geoff Berryfabedba2017-10-03 16:59:13 +0000303 unsigned Reg = MO.getReg();
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000304 if (!Reg)
305 continue;
306
Geoff Berryfabedba2017-10-03 16:59:13 +0000307 assert(!TargetRegisterInfo::isVirtualRegister(Reg) &&
308 "MachineCopyPropagation should be run after register allocation!");
309
310 if (MO.isDef()) {
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000311 Defs.push_back(Reg);
312 continue;
Matthias Braun82e7f4d2017-02-04 02:27:20 +0000313 } else if (MO.readsReg())
314 ReadRegister(Reg);
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000315 }
316
Jakob Stoklund Olesen8610a592012-02-08 22:37:35 +0000317 // The instruction has a register mask operand which means that it clobbers
Matthias Braune39ff702016-02-26 03:18:50 +0000318 // a large set of registers. Treat clobbered registers the same way as
319 // defined registers.
Matthias Braun273575d2016-02-20 03:56:36 +0000320 if (RegMask) {
Jakob Stoklund Olesen938b4d22012-02-09 00:19:08 +0000321 // Erase any MaybeDeadCopies whose destination register is clobbered.
Jun Bum Lim36c53fe2016-03-25 21:15:35 +0000322 for (SmallSetVector<MachineInstr *, 8>::iterator DI =
323 MaybeDeadCopies.begin();
324 DI != MaybeDeadCopies.end();) {
325 MachineInstr *MaybeDead = *DI;
Matthias Braun273575d2016-02-20 03:56:36 +0000326 unsigned Reg = MaybeDead->getOperand(0).getReg();
327 assert(!MRI->isReserved(Reg));
Jun Bum Lim36c53fe2016-03-25 21:15:35 +0000328
329 if (!RegMask->clobbersPhysReg(Reg)) {
330 ++DI;
Jakob Stoklund Olesen938b4d22012-02-09 00:19:08 +0000331 continue;
Jun Bum Lim36c53fe2016-03-25 21:15:35 +0000332 }
333
James Molloyd787d3e2014-01-22 09:12:27 +0000334 DEBUG(dbgs() << "MCP: Removing copy due to regmask clobbering: ";
Matthias Braun273575d2016-02-20 03:56:36 +0000335 MaybeDead->dump());
Jun Bum Lim36c53fe2016-03-25 21:15:35 +0000336
337 // erase() will return the next valid iterator pointing to the next
338 // element after the erased one.
339 DI = MaybeDeadCopies.erase(DI);
Matthias Braun273575d2016-02-20 03:56:36 +0000340 MaybeDead->eraseFromParent();
Jakob Stoklund Olesen938b4d22012-02-09 00:19:08 +0000341 Changed = true;
342 ++NumDeletes;
343 }
Matthias Braune39ff702016-02-26 03:18:50 +0000344
345 removeClobberedRegsFromMap(AvailCopyMap, *RegMask);
346 removeClobberedRegsFromMap(CopyMap, *RegMask);
347 for (SourceMap::iterator I = SrcMap.begin(), E = SrcMap.end(), Next;
348 I != E; I = Next) {
349 Next = std::next(I);
350 if (RegMask->clobbersPhysReg(I->first)) {
351 removeRegsFromMap(AvailCopyMap, I->second, *TRI);
352 SrcMap.erase(I);
353 }
354 }
Jakob Stoklund Olesen8610a592012-02-08 22:37:35 +0000355 }
356
Matthias Braune39ff702016-02-26 03:18:50 +0000357 // Any previous copy definition or reading the Defs is no longer available.
Matthias Braun9dcd65f2016-02-26 03:18:55 +0000358 for (unsigned Reg : Defs)
Matthias Braune39ff702016-02-26 03:18:50 +0000359 ClobberRegister(Reg);
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000360 }
361
362 // If MBB doesn't have successors, delete the copies whose defs are not used.
363 // If MBB does have successors, then conservative assume the defs are live-out
364 // since we don't want to trust live-in lists.
365 if (MBB.succ_empty()) {
Matthias Braun273575d2016-02-20 03:56:36 +0000366 for (MachineInstr *MaybeDead : MaybeDeadCopies) {
367 assert(!MRI->isReserved(MaybeDead->getOperand(0).getReg()));
368 MaybeDead->eraseFromParent();
369 Changed = true;
370 ++NumDeletes;
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000371 }
372 }
373
Matthias Braunbd18d752016-02-20 03:56:39 +0000374 MaybeDeadCopies.clear();
375 AvailCopyMap.clear();
376 CopyMap.clear();
377 SrcMap.clear();
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000378}
379
380bool MachineCopyPropagation::runOnMachineFunction(MachineFunction &MF) {
Matthias Braunf1caa282017-12-15 22:22:58 +0000381 if (skipFunction(MF.getFunction()))
Paul Robinson7c99ec52014-03-31 17:43:35 +0000382 return false;
383
Matthias Braunbd18d752016-02-20 03:56:39 +0000384 Changed = false;
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000385
Eric Christopherfc6de422014-08-05 02:39:49 +0000386 TRI = MF.getSubtarget().getRegisterInfo();
387 TII = MF.getSubtarget().getInstrInfo();
Jakob Stoklund Olesenc30a9af2012-10-15 21:57:41 +0000388 MRI = &MF.getRegInfo();
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000389
Matthias Braun273575d2016-02-20 03:56:36 +0000390 for (MachineBasicBlock &MBB : MF)
Matthias Braunbd18d752016-02-20 03:56:39 +0000391 CopyPropagateBlock(MBB);
Evan Cheng00b1a3c2012-01-07 03:02:36 +0000392
393 return Changed;
394}