LLVM 22.0.0git
TwoAddressInstructionPass.cpp
Go to the documentation of this file.
1//===- TwoAddressInstructionPass.cpp - Two-Address instruction pass -------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the TwoAddress instruction pass which is used
10// by most register allocators. Two-Address instructions are rewritten
11// from:
12//
13// A = B op C
14//
15// to:
16//
17// A = B
18// A op= C
19//
20// Note that if a register allocator chooses to use this pass, that it
21// has to be capable of handling the non-SSA nature of these rewritten
22// virtual registers.
23//
24// It is also worth noting that the duplicate operand of the two
25// address instruction is removed.
26//
27//===----------------------------------------------------------------------===//
28
30#include "llvm/ADT/DenseMap.h"
33#include "llvm/ADT/Statistic.h"
48#include "llvm/CodeGen/Passes.h"
54#include "llvm/MC/MCInstrDesc.h"
55#include "llvm/Pass.h"
58#include "llvm/Support/Debug.h"
62#include <cassert>
63#include <iterator>
64#include <utility>
65
66using namespace llvm;
67
68#define DEBUG_TYPE "twoaddressinstruction"
69
70STATISTIC(NumTwoAddressInstrs, "Number of two-address instructions");
71STATISTIC(NumCommuted , "Number of instructions commuted to coalesce");
72STATISTIC(NumAggrCommuted , "Number of instructions aggressively commuted");
73STATISTIC(NumConvertedTo3Addr, "Number of instructions promoted to 3-address");
74STATISTIC(NumReSchedUps, "Number of instructions re-scheduled up");
75STATISTIC(NumReSchedDowns, "Number of instructions re-scheduled down");
76
77// Temporary flag to disable rescheduling.
78static cl::opt<bool>
79EnableRescheduling("twoaddr-reschedule",
80 cl::desc("Coalesce copies by rescheduling (default=true)"),
81 cl::init(true), cl::Hidden);
82
83// Limit the number of dataflow edges to traverse when evaluating the benefit
84// of commuting operands.
86 "dataflow-edge-limit", cl::Hidden, cl::init(3),
87 cl::desc("Maximum number of dataflow edges to traverse when evaluating "
88 "the benefit of commuting operands"));
89
90namespace {
91
92class TwoAddressInstructionImpl {
93 MachineFunction *MF = nullptr;
94 const TargetInstrInfo *TII = nullptr;
95 const TargetRegisterInfo *TRI = nullptr;
96 const InstrItineraryData *InstrItins = nullptr;
97 MachineRegisterInfo *MRI = nullptr;
98 LiveVariables *LV = nullptr;
99 LiveIntervals *LIS = nullptr;
100 AliasAnalysis *AA = nullptr;
102
103 // The current basic block being processed.
104 MachineBasicBlock *MBB = nullptr;
105
106 // Keep track the distance of a MI from the start of the current basic block.
108
109 // Set of already processed instructions in the current block.
111
112 // A map from virtual registers to physical registers which are likely targets
113 // to be coalesced to due to copies from physical registers to virtual
114 // registers. e.g. v1024 = move r0.
116
117 // A map from virtual registers to physical registers which are likely targets
118 // to be coalesced to due to copies to physical registers from virtual
119 // registers. e.g. r1 = move v1024.
121
122 MachineInstr *getSingleDef(Register Reg, MachineBasicBlock *BB) const;
123
124 bool isRevCopyChain(Register FromReg, Register ToReg, int Maxlen);
125
126 bool noUseAfterLastDef(Register Reg, unsigned Dist, unsigned &LastDef);
127
128 bool isCopyToReg(MachineInstr &MI, Register &SrcReg, Register &DstReg,
129 bool &IsSrcPhys, bool &IsDstPhys) const;
130
131 bool isPlainlyKilled(const MachineInstr *MI, LiveRange &LR) const;
132 bool isPlainlyKilled(const MachineInstr *MI, Register Reg) const;
133 bool isPlainlyKilled(const MachineOperand &MO) const;
134
135 bool isKilled(MachineInstr &MI, Register Reg, bool allowFalsePositives) const;
136
137 MachineInstr *findOnlyInterestingUse(Register Reg, MachineBasicBlock *MBB,
138 bool &IsCopy, Register &DstReg,
139 bool &IsDstPhys) const;
140
141 bool regsAreCompatible(Register RegA, Register RegB) const;
142
143 void removeMapRegEntry(const MachineOperand &MO,
144 DenseMap<Register, Register> &RegMap) const;
145
146 void removeClobberedSrcRegMap(MachineInstr *MI);
147
148 bool regOverlapsSet(const SmallVectorImpl<Register> &Set, Register Reg) const;
149
150 bool isProfitableToCommute(Register RegA, Register RegB, Register RegC,
151 MachineInstr *MI, unsigned Dist);
152
153 bool commuteInstruction(MachineInstr *MI, unsigned DstIdx,
154 unsigned RegBIdx, unsigned RegCIdx, unsigned Dist);
155
156 bool isProfitableToConv3Addr(Register RegA, Register RegB);
157
158 bool convertInstTo3Addr(MachineBasicBlock::iterator &mi,
160 Register RegB, unsigned &Dist);
161
162 bool isDefTooClose(Register Reg, unsigned Dist, MachineInstr *MI);
163
164 bool rescheduleMIBelowKill(MachineBasicBlock::iterator &mi,
166 bool rescheduleKillAboveMI(MachineBasicBlock::iterator &mi,
168
169 bool tryInstructionTransform(MachineBasicBlock::iterator &mi,
171 unsigned SrcIdx, unsigned DstIdx,
172 unsigned &Dist, bool shouldOnlyCommute);
173
174 bool tryInstructionCommute(MachineInstr *MI,
175 unsigned DstOpIdx,
176 unsigned BaseOpIdx,
177 bool BaseOpKilled,
178 unsigned Dist);
179 void scanUses(Register DstReg);
180
181 void processCopy(MachineInstr *MI);
182
183 using TiedPairList = SmallVector<std::pair<unsigned, unsigned>, 4>;
184 using TiedOperandMap = SmallDenseMap<Register, TiedPairList>;
185
186 bool collectTiedOperands(MachineInstr *MI, TiedOperandMap&);
187 void processTiedPairs(MachineInstr *MI, TiedPairList&, unsigned &Dist);
188 void eliminateRegSequence(MachineBasicBlock::iterator&);
189 bool processStatepoint(MachineInstr *MI, TiedOperandMap &TiedOperands);
190
191public:
192 TwoAddressInstructionImpl(MachineFunction &MF, MachineFunctionPass *P);
193 TwoAddressInstructionImpl(MachineFunction &MF,
195 void setOptLevel(CodeGenOptLevel Level) { OptLevel = Level; }
196 bool run();
197};
198
199class TwoAddressInstructionLegacyPass : public MachineFunctionPass {
200public:
201 static char ID; // Pass identification, replacement for typeid
202
203 TwoAddressInstructionLegacyPass() : MachineFunctionPass(ID) {
206 }
207
208 /// Pass entry point.
209 bool runOnMachineFunction(MachineFunction &MF) override {
210 TwoAddressInstructionImpl Impl(MF, this);
211 // Disable optimizations if requested. We cannot skip the whole pass as some
212 // fixups are necessary for correctness.
213 if (skipFunction(MF.getFunction()))
214 Impl.setOptLevel(CodeGenOptLevel::None);
215 return Impl.run();
216 }
217
218 void getAnalysisUsage(AnalysisUsage &AU) const override {
219 AU.setPreservesCFG();
220 AU.addUsedIfAvailable<AAResultsWrapperPass>();
221 AU.addUsedIfAvailable<LiveVariablesWrapperPass>();
222 AU.addPreserved<LiveVariablesWrapperPass>();
223 AU.addPreserved<SlotIndexesWrapperPass>();
224 AU.addPreserved<LiveIntervalsWrapperPass>();
228 }
229};
230
231} // end anonymous namespace
232
236 // Disable optimizations if requested. We cannot skip the whole pass as some
237 // fixups are necessary for correctness.
238 TwoAddressInstructionImpl Impl(MF, MFAM);
239 if (MF.getFunction().hasOptNone())
240 Impl.setOptLevel(CodeGenOptLevel::None);
241
242 MFPropsModifier _(*this, MF);
243 bool Changed = Impl.run();
244 if (!Changed)
245 return PreservedAnalyses::all();
247 PA.preserve<LiveIntervalsAnalysis>();
248 PA.preserve<LiveVariablesAnalysis>();
249 PA.preserve<MachineDominatorTreeAnalysis>();
250 PA.preserve<MachineLoopAnalysis>();
251 PA.preserve<SlotIndexesAnalysis>();
252 PA.preserveSet<CFGAnalyses>();
253 return PA;
254}
255
256char TwoAddressInstructionLegacyPass::ID = 0;
257
258char &llvm::TwoAddressInstructionPassID = TwoAddressInstructionLegacyPass::ID;
259
260INITIALIZE_PASS_BEGIN(TwoAddressInstructionLegacyPass, DEBUG_TYPE,
261 "Two-Address instruction pass", false, false)
263INITIALIZE_PASS_END(TwoAddressInstructionLegacyPass, DEBUG_TYPE,
264 "Two-Address instruction pass", false, false)
265
266TwoAddressInstructionImpl::TwoAddressInstructionImpl(
268 : MF(&Func), TII(Func.getSubtarget().getInstrInfo()),
269 TRI(Func.getSubtarget().getRegisterInfo()),
270 InstrItins(Func.getSubtarget().getInstrItineraryData()),
271 MRI(&Func.getRegInfo()),
272 LV(MFAM.getCachedResult<LiveVariablesAnalysis>(Func)),
273 LIS(MFAM.getCachedResult<LiveIntervalsAnalysis>(Func)),
274 OptLevel(Func.getTarget().getOptLevel()) {
275 auto &FAM = MFAM.getResult<FunctionAnalysisManagerMachineFunctionProxy>(Func)
276 .getManager();
277 AA = FAM.getCachedResult<AAManager>(Func.getFunction());
278}
279
280TwoAddressInstructionImpl::TwoAddressInstructionImpl(MachineFunction &Func,
282 : MF(&Func), TII(Func.getSubtarget().getInstrInfo()),
283 TRI(Func.getSubtarget().getRegisterInfo()),
284 InstrItins(Func.getSubtarget().getInstrItineraryData()),
285 MRI(&Func.getRegInfo()), OptLevel(Func.getTarget().getOptLevel()) {
286 auto *LVWrapper = P->getAnalysisIfAvailable<LiveVariablesWrapperPass>();
287 LV = LVWrapper ? &LVWrapper->getLV() : nullptr;
288 auto *LISWrapper = P->getAnalysisIfAvailable<LiveIntervalsWrapperPass>();
289 LIS = LISWrapper ? &LISWrapper->getLIS() : nullptr;
290 if (auto *AAPass = P->getAnalysisIfAvailable<AAResultsWrapperPass>())
291 AA = &AAPass->getAAResults();
292 else
293 AA = nullptr;
294}
295
296/// Return the MachineInstr* if it is the single def of the Reg in current BB.
298TwoAddressInstructionImpl::getSingleDef(Register Reg,
299 MachineBasicBlock *BB) const {
300 MachineInstr *Ret = nullptr;
301 for (MachineInstr &DefMI : MRI->def_instructions(Reg)) {
302 if (DefMI.getParent() != BB || DefMI.isDebugValue())
303 continue;
304 if (!Ret)
305 Ret = &DefMI;
306 else if (Ret != &DefMI)
307 return nullptr;
308 }
309 return Ret;
310}
311
312/// Check if there is a reversed copy chain from FromReg to ToReg:
313/// %Tmp1 = copy %Tmp2;
314/// %FromReg = copy %Tmp1;
315/// %ToReg = add %FromReg ...
316/// %Tmp2 = copy %ToReg;
317/// MaxLen specifies the maximum length of the copy chain the func
318/// can walk through.
319bool TwoAddressInstructionImpl::isRevCopyChain(Register FromReg, Register ToReg,
320 int Maxlen) {
321 Register TmpReg = FromReg;
322 for (int i = 0; i < Maxlen; i++) {
323 MachineInstr *Def = getSingleDef(TmpReg, MBB);
324 if (!Def || !Def->isCopy())
325 return false;
326
327 TmpReg = Def->getOperand(1).getReg();
328
329 if (TmpReg == ToReg)
330 return true;
331 }
332 return false;
333}
334
335/// Return true if there are no intervening uses between the last instruction
336/// in the MBB that defines the specified register and the two-address
337/// instruction which is being processed. It also returns the last def location
338/// by reference.
339bool TwoAddressInstructionImpl::noUseAfterLastDef(Register Reg, unsigned Dist,
340 unsigned &LastDef) {
341 LastDef = 0;
342 unsigned LastUse = Dist;
343 for (MachineOperand &MO : MRI->reg_operands(Reg)) {
344 MachineInstr *MI = MO.getParent();
345 if (MI->getParent() != MBB || MI->isDebugValue())
346 continue;
347 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.find(MI);
348 if (DI == DistanceMap.end())
349 continue;
350 if (MO.isUse() && DI->second < LastUse)
351 LastUse = DI->second;
352 if (MO.isDef() && DI->second > LastDef)
353 LastDef = DI->second;
354 }
355
356 return !(LastUse > LastDef && LastUse < Dist);
357}
358
359/// Return true if the specified MI is a copy instruction or an extract_subreg
360/// instruction. It also returns the source and destination registers and
361/// whether they are physical registers by reference.
362bool TwoAddressInstructionImpl::isCopyToReg(MachineInstr &MI, Register &SrcReg,
363 Register &DstReg, bool &IsSrcPhys,
364 bool &IsDstPhys) const {
365 SrcReg = 0;
366 DstReg = 0;
367 if (MI.isCopy()) {
368 DstReg = MI.getOperand(0).getReg();
369 SrcReg = MI.getOperand(1).getReg();
370 } else if (MI.isInsertSubreg() || MI.isSubregToReg()) {
371 DstReg = MI.getOperand(0).getReg();
372 SrcReg = MI.getOperand(2).getReg();
373 } else {
374 return false;
375 }
376
377 IsSrcPhys = SrcReg.isPhysical();
378 IsDstPhys = DstReg.isPhysical();
379 return true;
380}
381
382bool TwoAddressInstructionImpl::isPlainlyKilled(const MachineInstr *MI,
383 LiveRange &LR) const {
384 // This is to match the kill flag version where undefs don't have kill flags.
385 if (!LR.hasAtLeastOneValue())
386 return false;
387
388 SlotIndex useIdx = LIS->getInstructionIndex(*MI);
389 LiveInterval::const_iterator I = LR.find(useIdx);
390 assert(I != LR.end() && "Reg must be live-in to use.");
391 return !I->end.isBlock() && SlotIndex::isSameInstr(I->end, useIdx);
392}
393
394/// Test if the given register value, which is used by the
395/// given instruction, is killed by the given instruction.
396bool TwoAddressInstructionImpl::isPlainlyKilled(const MachineInstr *MI,
397 Register Reg) const {
398 // FIXME: Sometimes tryInstructionTransform() will add instructions and
399 // test whether they can be folded before keeping them. In this case it
400 // sets a kill before recursively calling tryInstructionTransform() again.
401 // If there is no interval available, we assume that this instruction is
402 // one of those. A kill flag is manually inserted on the operand so the
403 // check below will handle it.
404 if (LIS && !LIS->isNotInMIMap(*MI)) {
405 if (Reg.isVirtual())
406 return isPlainlyKilled(MI, LIS->getInterval(Reg));
407 // Reserved registers are considered always live.
408 if (MRI->isReserved(Reg))
409 return false;
410 return all_of(TRI->regunits(Reg), [&](MCRegUnit U) {
411 return isPlainlyKilled(MI, LIS->getRegUnit(U));
412 });
413 }
414
415 return MI->killsRegister(Reg, /*TRI=*/nullptr);
416}
417
418/// Test if the register used by the given operand is killed by the operand's
419/// instruction.
420bool TwoAddressInstructionImpl::isPlainlyKilled(
421 const MachineOperand &MO) const {
422 return MO.isKill() || isPlainlyKilled(MO.getParent(), MO.getReg());
423}
424
425/// Test if the given register value, which is used by the given
426/// instruction, is killed by the given instruction. This looks through
427/// coalescable copies to see if the original value is potentially not killed.
428///
429/// For example, in this code:
430///
431/// %reg1034 = copy %reg1024
432/// %reg1035 = copy killed %reg1025
433/// %reg1036 = add killed %reg1034, killed %reg1035
434///
435/// %reg1034 is not considered to be killed, since it is copied from a
436/// register which is not killed. Treating it as not killed lets the
437/// normal heuristics commute the (two-address) add, which lets
438/// coalescing eliminate the extra copy.
439///
440/// If allowFalsePositives is true then likely kills are treated as kills even
441/// if it can't be proven that they are kills.
442bool TwoAddressInstructionImpl::isKilled(MachineInstr &MI, Register Reg,
443 bool allowFalsePositives) const {
444 MachineInstr *DefMI = &MI;
445 while (true) {
446 // All uses of physical registers are likely to be kills.
447 if (Reg.isPhysical() && (allowFalsePositives || MRI->hasOneUse(Reg)))
448 return true;
449 if (!isPlainlyKilled(DefMI, Reg))
450 return false;
451 if (Reg.isPhysical())
452 return true;
453 MachineRegisterInfo::def_iterator Begin = MRI->def_begin(Reg);
454 // If there are multiple defs, we can't do a simple analysis, so just
455 // go with what the kill flag says.
456 if (std::next(Begin) != MRI->def_end())
457 return true;
458 DefMI = Begin->getParent();
459 bool IsSrcPhys, IsDstPhys;
460 Register SrcReg, DstReg;
461 // If the def is something other than a copy, then it isn't going to
462 // be coalesced, so follow the kill flag.
463 if (!isCopyToReg(*DefMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
464 return true;
465 Reg = SrcReg;
466 }
467}
468
469/// Return true if the specified MI uses the specified register as a two-address
470/// use. If so, return the destination register by reference.
472 for (unsigned i = 0, NumOps = MI.getNumOperands(); i != NumOps; ++i) {
473 const MachineOperand &MO = MI.getOperand(i);
474 if (!MO.isReg() || !MO.isUse() || MO.getReg() != Reg)
475 continue;
476 unsigned ti;
477 if (MI.isRegTiedToDefOperand(i, &ti)) {
478 DstReg = MI.getOperand(ti).getReg();
479 return true;
480 }
481 }
482 return false;
483}
484
485/// Given a register, if all its uses are in the same basic block, return the
486/// last use instruction if it's a copy or a two-address use.
487MachineInstr *TwoAddressInstructionImpl::findOnlyInterestingUse(
488 Register Reg, MachineBasicBlock *MBB, bool &IsCopy, Register &DstReg,
489 bool &IsDstPhys) const {
490 MachineOperand *UseOp = nullptr;
491 for (MachineOperand &MO : MRI->use_nodbg_operands(Reg)) {
492 if (MO.isUndef())
493 continue;
494
495 MachineInstr *MI = MO.getParent();
496 if (MI->getParent() != MBB)
497 return nullptr;
498 if (isPlainlyKilled(MI, Reg))
499 UseOp = &MO;
500 }
501 if (!UseOp)
502 return nullptr;
503 MachineInstr &UseMI = *UseOp->getParent();
504
505 Register SrcReg;
506 bool IsSrcPhys;
507 if (isCopyToReg(UseMI, SrcReg, DstReg, IsSrcPhys, IsDstPhys)) {
508 IsCopy = true;
509 return &UseMI;
510 }
511 IsDstPhys = false;
512 if (isTwoAddrUse(UseMI, Reg, DstReg)) {
513 IsDstPhys = DstReg.isPhysical();
514 return &UseMI;
515 }
516 if (UseMI.isCommutable()) {
518 unsigned Src2 = UseOp->getOperandNo();
519 if (TII->findCommutedOpIndices(UseMI, Src1, Src2)) {
520 MachineOperand &MO = UseMI.getOperand(Src1);
521 if (MO.isReg() && MO.isUse() &&
522 isTwoAddrUse(UseMI, MO.getReg(), DstReg)) {
523 IsDstPhys = DstReg.isPhysical();
524 return &UseMI;
525 }
526 }
527 }
528 return nullptr;
529}
530
531/// Return the physical register the specified virtual register might be mapped
532/// to.
535 while (Reg.isVirtual()) {
537 if (SI == RegMap.end())
538 return 0;
539 Reg = SI->second;
540 }
541 if (Reg.isPhysical())
542 return Reg;
543 return 0;
544}
545
546/// Return true if the two registers are equal or aliased.
547bool TwoAddressInstructionImpl::regsAreCompatible(Register RegA,
548 Register RegB) const {
549 if (RegA == RegB)
550 return true;
551 if (!RegA || !RegB)
552 return false;
553 return TRI->regsOverlap(RegA, RegB);
554}
555
556/// From RegMap remove entries mapped to a physical register which overlaps MO.
557void TwoAddressInstructionImpl::removeMapRegEntry(
558 const MachineOperand &MO, DenseMap<Register, Register> &RegMap) const {
559 assert(
560 (MO.isReg() || MO.isRegMask()) &&
561 "removeMapRegEntry must be called with a register or regmask operand.");
562
564 for (auto SI : RegMap) {
565 Register ToReg = SI.second;
566 if (ToReg.isVirtual())
567 continue;
568
569 if (MO.isReg()) {
570 Register Reg = MO.getReg();
571 if (TRI->regsOverlap(ToReg, Reg))
572 Srcs.push_back(SI.first);
573 } else if (MO.clobbersPhysReg(ToReg))
574 Srcs.push_back(SI.first);
575 }
576
577 for (auto SrcReg : Srcs)
578 RegMap.erase(SrcReg);
579}
580
581/// If a physical register is clobbered, old entries mapped to it should be
582/// deleted. For example
583///
584/// %2:gr64 = COPY killed $rdx
585/// MUL64r %3:gr64, implicit-def $rax, implicit-def $rdx
586///
587/// After the MUL instruction, $rdx contains different value than in the COPY
588/// instruction. So %2 should not map to $rdx after MUL.
589void TwoAddressInstructionImpl::removeClobberedSrcRegMap(MachineInstr *MI) {
590 if (MI->isCopy()) {
591 // If a virtual register is copied to its mapped physical register, it
592 // doesn't change the potential coalescing between them, so we don't remove
593 // entries mapped to the physical register. For example
594 //
595 // %100 = COPY $r8
596 // ...
597 // $r8 = COPY %100
598 //
599 // The first copy constructs SrcRegMap[%100] = $r8, the second copy doesn't
600 // destroy the content of $r8, and should not impact SrcRegMap.
601 Register Dst = MI->getOperand(0).getReg();
602 if (!Dst || Dst.isVirtual())
603 return;
604
605 Register Src = MI->getOperand(1).getReg();
606 if (regsAreCompatible(Dst, getMappedReg(Src, SrcRegMap)))
607 return;
608 }
609
610 for (const MachineOperand &MO : MI->operands()) {
611 if (MO.isRegMask()) {
612 removeMapRegEntry(MO, SrcRegMap);
613 continue;
614 }
615 if (!MO.isReg() || !MO.isDef())
616 continue;
617 Register Reg = MO.getReg();
618 if (!Reg || Reg.isVirtual())
619 continue;
620 removeMapRegEntry(MO, SrcRegMap);
621 }
622}
623
624// Returns true if Reg is equal or aliased to at least one register in Set.
625bool TwoAddressInstructionImpl::regOverlapsSet(
626 const SmallVectorImpl<Register> &Set, Register Reg) const {
627 for (Register R : Set)
628 if (TRI->regsOverlap(R, Reg))
629 return true;
630
631 return false;
632}
633
634/// Return true if it's potentially profitable to commute the two-address
635/// instruction that's being processed.
636bool TwoAddressInstructionImpl::isProfitableToCommute(Register RegA,
637 Register RegB,
638 Register RegC,
639 MachineInstr *MI,
640 unsigned Dist) {
641 if (OptLevel == CodeGenOptLevel::None)
642 return false;
643
644 // Determine if it's profitable to commute this two address instruction. In
645 // general, we want no uses between this instruction and the definition of
646 // the two-address register.
647 // e.g.
648 // %reg1028 = EXTRACT_SUBREG killed %reg1027, 1
649 // %reg1029 = COPY %reg1028
650 // %reg1029 = SHR8ri %reg1029, 7, implicit dead %eflags
651 // insert => %reg1030 = COPY %reg1028
652 // %reg1030 = ADD8rr killed %reg1028, killed %reg1029, implicit dead %eflags
653 // In this case, it might not be possible to coalesce the second COPY
654 // instruction if the first one is coalesced. So it would be profitable to
655 // commute it:
656 // %reg1028 = EXTRACT_SUBREG killed %reg1027, 1
657 // %reg1029 = COPY %reg1028
658 // %reg1029 = SHR8ri %reg1029, 7, implicit dead %eflags
659 // insert => %reg1030 = COPY %reg1029
660 // %reg1030 = ADD8rr killed %reg1029, killed %reg1028, implicit dead %eflags
661
662 if (!isPlainlyKilled(MI, RegC))
663 return false;
664
665 // Ok, we have something like:
666 // %reg1030 = ADD8rr killed %reg1028, killed %reg1029, implicit dead %eflags
667 // let's see if it's worth commuting it.
668
669 // Look for situations like this:
670 // %reg1024 = MOV r1
671 // %reg1025 = MOV r0
672 // %reg1026 = ADD %reg1024, %reg1025
673 // r0 = MOV %reg1026
674 // Commute the ADD to hopefully eliminate an otherwise unavoidable copy.
675 MCRegister ToRegA = getMappedReg(RegA, DstRegMap);
676 if (ToRegA) {
677 MCRegister FromRegB = getMappedReg(RegB, SrcRegMap);
678 MCRegister FromRegC = getMappedReg(RegC, SrcRegMap);
679 bool CompB = FromRegB && regsAreCompatible(FromRegB, ToRegA);
680 bool CompC = FromRegC && regsAreCompatible(FromRegC, ToRegA);
681
682 // Compute if any of the following are true:
683 // -RegB is not tied to a register and RegC is compatible with RegA.
684 // -RegB is tied to the wrong physical register, but RegC is.
685 // -RegB is tied to the wrong physical register, and RegC isn't tied.
686 if ((!FromRegB && CompC) || (FromRegB && !CompB && (!FromRegC || CompC)))
687 return true;
688 // Don't compute if any of the following are true:
689 // -RegC is not tied to a register and RegB is compatible with RegA.
690 // -RegC is tied to the wrong physical register, but RegB is.
691 // -RegC is tied to the wrong physical register, and RegB isn't tied.
692 if ((!FromRegC && CompB) || (FromRegC && !CompC && (!FromRegB || CompB)))
693 return false;
694 }
695
696 // If there is a use of RegC between its last def (could be livein) and this
697 // instruction, then bail.
698 unsigned LastDefC = 0;
699 if (!noUseAfterLastDef(RegC, Dist, LastDefC))
700 return false;
701
702 // If there is a use of RegB between its last def (could be livein) and this
703 // instruction, then go ahead and make this transformation.
704 unsigned LastDefB = 0;
705 if (!noUseAfterLastDef(RegB, Dist, LastDefB))
706 return true;
707
708 // Look for situation like this:
709 // %reg101 = MOV %reg100
710 // %reg102 = ...
711 // %reg103 = ADD %reg102, %reg101
712 // ... = %reg103 ...
713 // %reg100 = MOV %reg103
714 // If there is a reversed copy chain from reg101 to reg103, commute the ADD
715 // to eliminate an otherwise unavoidable copy.
716 // FIXME:
717 // We can extend the logic further: If an pair of operands in an insn has
718 // been merged, the insn could be regarded as a virtual copy, and the virtual
719 // copy could also be used to construct a copy chain.
720 // To more generally minimize register copies, ideally the logic of two addr
721 // instruction pass should be integrated with register allocation pass where
722 // interference graph is available.
723 if (isRevCopyChain(RegC, RegA, MaxDataFlowEdge))
724 return true;
725
726 if (isRevCopyChain(RegB, RegA, MaxDataFlowEdge))
727 return false;
728
729 // Look for other target specific commute preference.
730 bool Commute;
731 if (TII->hasCommutePreference(*MI, Commute))
732 return Commute;
733
734 // Since there are no intervening uses for both registers, then commute
735 // if the def of RegC is closer. Its live interval is shorter.
736 return LastDefB && LastDefC && LastDefC > LastDefB;
737}
738
739/// Commute a two-address instruction and update the basic block, distance map,
740/// and live variables if needed. Return true if it is successful.
741bool TwoAddressInstructionImpl::commuteInstruction(MachineInstr *MI,
742 unsigned DstIdx,
743 unsigned RegBIdx,
744 unsigned RegCIdx,
745 unsigned Dist) {
746 Register RegC = MI->getOperand(RegCIdx).getReg();
747 LLVM_DEBUG(dbgs() << "2addr: COMMUTING : " << *MI);
748 MachineInstr *NewMI = TII->commuteInstruction(*MI, false, RegBIdx, RegCIdx);
749
750 if (NewMI == nullptr) {
751 LLVM_DEBUG(dbgs() << "2addr: COMMUTING FAILED!\n");
752 return false;
753 }
754
755 LLVM_DEBUG(dbgs() << "2addr: COMMUTED TO: " << *NewMI);
756 assert(NewMI == MI &&
757 "TargetInstrInfo::commuteInstruction() should not return a new "
758 "instruction unless it was requested.");
759
760 // Update source register map.
761 MCRegister FromRegC = getMappedReg(RegC, SrcRegMap);
762 if (FromRegC) {
763 Register RegA = MI->getOperand(DstIdx).getReg();
764 SrcRegMap[RegA] = FromRegC;
765 }
766
767 return true;
768}
769
770/// Return true if it is profitable to convert the given 2-address instruction
771/// to a 3-address one.
772bool TwoAddressInstructionImpl::isProfitableToConv3Addr(Register RegA,
773 Register RegB) {
774 // Look for situations like this:
775 // %reg1024 = MOV r1
776 // %reg1025 = MOV r0
777 // %reg1026 = ADD %reg1024, %reg1025
778 // r2 = MOV %reg1026
779 // Turn ADD into a 3-address instruction to avoid a copy.
780 MCRegister FromRegB = getMappedReg(RegB, SrcRegMap);
781 if (!FromRegB)
782 return false;
783 MCRegister ToRegA = getMappedReg(RegA, DstRegMap);
784 return (ToRegA && !regsAreCompatible(FromRegB, ToRegA));
785}
786
787/// Convert the specified two-address instruction into a three address one.
788/// Return true if this transformation was successful.
789bool TwoAddressInstructionImpl::convertInstTo3Addr(
791 Register RegA, Register RegB, unsigned &Dist) {
792 MachineInstrSpan MIS(mi, MBB);
793 MachineInstr *NewMI = TII->convertToThreeAddress(*mi, LV, LIS);
794 if (!NewMI)
795 return false;
796
797 for (MachineInstr &MI : MIS)
798 DistanceMap.insert(std::make_pair(&MI, Dist++));
799
800 if (&*mi == NewMI) {
801 LLVM_DEBUG(dbgs() << "2addr: CONVERTED IN-PLACE TO 3-ADDR: " << *mi);
802 } else {
803 LLVM_DEBUG({
804 dbgs() << "2addr: CONVERTING 2-ADDR: " << *mi;
805 dbgs() << "2addr: TO 3-ADDR: " << *NewMI;
806 });
807
808 // If the old instruction is debug value tracked, an update is required.
809 if (auto OldInstrNum = mi->peekDebugInstrNum()) {
810 assert(mi->getNumExplicitDefs() == 1);
811 assert(NewMI->getNumExplicitDefs() == 1);
812
813 // Find the old and new def location.
814 unsigned OldIdx = mi->defs().begin()->getOperandNo();
815 unsigned NewIdx = NewMI->defs().begin()->getOperandNo();
816
817 // Record that one def has been replaced by the other.
818 unsigned NewInstrNum = NewMI->getDebugInstrNum();
819 MF->makeDebugValueSubstitution(std::make_pair(OldInstrNum, OldIdx),
820 std::make_pair(NewInstrNum, NewIdx));
821 }
822
823 MBB->erase(mi); // Nuke the old inst.
824 Dist--;
825 }
826
827 mi = NewMI;
828 nmi = std::next(mi);
829
830 // Update source and destination register maps.
831 SrcRegMap.erase(RegA);
832 DstRegMap.erase(RegB);
833 return true;
834}
835
836/// Scan forward recursively for only uses, update maps if the use is a copy or
837/// a two-address instruction.
838void TwoAddressInstructionImpl::scanUses(Register DstReg) {
839 SmallVector<Register, 4> VirtRegPairs;
840 bool IsDstPhys;
841 bool IsCopy = false;
842 Register NewReg;
843 Register Reg = DstReg;
844 while (MachineInstr *UseMI =
845 findOnlyInterestingUse(Reg, MBB, IsCopy, NewReg, IsDstPhys)) {
846 if (IsCopy && !Processed.insert(UseMI).second)
847 break;
848
849 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.find(UseMI);
850 if (DI != DistanceMap.end())
851 // Earlier in the same MBB.Reached via a back edge.
852 break;
853
854 if (IsDstPhys) {
855 VirtRegPairs.push_back(NewReg);
856 break;
857 }
858 SrcRegMap[NewReg] = Reg;
859 VirtRegPairs.push_back(NewReg);
860 Reg = NewReg;
861 }
862
863 if (!VirtRegPairs.empty()) {
864 Register ToReg = VirtRegPairs.pop_back_val();
865 while (!VirtRegPairs.empty()) {
866 Register FromReg = VirtRegPairs.pop_back_val();
867 bool isNew = DstRegMap.insert(std::make_pair(FromReg, ToReg)).second;
868 if (!isNew)
869 assert(DstRegMap[FromReg] == ToReg &&"Can't map to two dst registers!");
870 ToReg = FromReg;
871 }
872 bool isNew = DstRegMap.insert(std::make_pair(DstReg, ToReg)).second;
873 if (!isNew)
874 assert(DstRegMap[DstReg] == ToReg && "Can't map to two dst registers!");
875 }
876}
877
878/// If the specified instruction is not yet processed, process it if it's a
879/// copy. For a copy instruction, we find the physical registers the
880/// source and destination registers might be mapped to. These are kept in
881/// point-to maps used to determine future optimizations. e.g.
882/// v1024 = mov r0
883/// v1025 = mov r1
884/// v1026 = add v1024, v1025
885/// r1 = mov r1026
886/// If 'add' is a two-address instruction, v1024, v1026 are both potentially
887/// coalesced to r0 (from the input side). v1025 is mapped to r1. v1026 is
888/// potentially joined with r1 on the output side. It's worthwhile to commute
889/// 'add' to eliminate a copy.
890void TwoAddressInstructionImpl::processCopy(MachineInstr *MI) {
891 if (Processed.count(MI))
892 return;
893
894 bool IsSrcPhys, IsDstPhys;
895 Register SrcReg, DstReg;
896 if (!isCopyToReg(*MI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
897 return;
898
899 if (IsDstPhys && !IsSrcPhys) {
900 DstRegMap.insert(std::make_pair(SrcReg, DstReg));
901 } else if (!IsDstPhys && IsSrcPhys) {
902 bool isNew = SrcRegMap.insert(std::make_pair(DstReg, SrcReg)).second;
903 if (!isNew)
904 assert(SrcRegMap[DstReg] == SrcReg &&
905 "Can't map to two src physical registers!");
906
907 scanUses(DstReg);
908 }
909
910 Processed.insert(MI);
911}
912
913/// If there is one more local instruction that reads 'Reg' and it kills 'Reg,
914/// consider moving the instruction below the kill instruction in order to
915/// eliminate the need for the copy.
916bool TwoAddressInstructionImpl::rescheduleMIBelowKill(
918 Register Reg) {
919 // Bail immediately if we don't have LV or LIS available. We use them to find
920 // kills efficiently.
921 if (!LV && !LIS)
922 return false;
923
924 MachineInstr *MI = &*mi;
925 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.find(MI);
926 if (DI == DistanceMap.end())
927 // Must be created from unfolded load. Don't waste time trying this.
928 return false;
929
930 MachineInstr *KillMI = nullptr;
931 if (LIS) {
932 LiveInterval &LI = LIS->getInterval(Reg);
933 assert(LI.end() != LI.begin() &&
934 "Reg should not have empty live interval.");
935
936 SlotIndex MBBEndIdx = LIS->getMBBEndIdx(MBB).getPrevSlot();
937 LiveInterval::const_iterator I = LI.find(MBBEndIdx);
938 if (I != LI.end() && I->start < MBBEndIdx)
939 return false;
940
941 --I;
942 KillMI = LIS->getInstructionFromIndex(I->end);
943 } else {
944 KillMI = LV->getVarInfo(Reg).findKill(MBB);
945 }
946 if (!KillMI || MI == KillMI || KillMI->isCopy() || KillMI->isCopyLike())
947 // Don't mess with copies, they may be coalesced later.
948 return false;
949
950 if (KillMI->hasUnmodeledSideEffects() || KillMI->isCall() ||
951 KillMI->isBranch() || KillMI->isTerminator())
952 // Don't move pass calls, etc.
953 return false;
954
955 Register DstReg;
956 if (isTwoAddrUse(*KillMI, Reg, DstReg))
957 return false;
958
959 bool SeenStore = true;
960 if (!MI->isSafeToMove(SeenStore))
961 return false;
962
963 if (TII->getInstrLatency(InstrItins, *MI) > 1)
964 // FIXME: Needs more sophisticated heuristics.
965 return false;
966
970 for (const MachineOperand &MO : MI->operands()) {
971 if (!MO.isReg())
972 continue;
973 Register MOReg = MO.getReg();
974 if (!MOReg)
975 continue;
976 if (MO.isDef())
977 Defs.push_back(MOReg);
978 else {
979 Uses.push_back(MOReg);
980 if (MOReg != Reg && isPlainlyKilled(MO))
981 Kills.push_back(MOReg);
982 }
983 }
984
985 // Move the copies connected to MI down as well.
987 MachineBasicBlock::iterator AfterMI = std::next(Begin);
988 MachineBasicBlock::iterator End = AfterMI;
989 while (End != MBB->end()) {
990 End = skipDebugInstructionsForward(End, MBB->end());
991 if (End->isCopy() && regOverlapsSet(Defs, End->getOperand(1).getReg()))
992 Defs.push_back(End->getOperand(0).getReg());
993 else
994 break;
995 ++End;
996 }
997
998 // Check if the reschedule will not break dependencies.
999 unsigned NumVisited = 0;
1000 MachineBasicBlock::iterator KillPos = KillMI;
1001 ++KillPos;
1002 for (MachineInstr &OtherMI : make_range(End, KillPos)) {
1003 // Debug or pseudo instructions cannot be counted against the limit.
1004 if (OtherMI.isDebugOrPseudoInstr())
1005 continue;
1006 if (NumVisited > 10) // FIXME: Arbitrary limit to reduce compile time cost.
1007 return false;
1008 ++NumVisited;
1009 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1010 OtherMI.isBranch() || OtherMI.isTerminator())
1011 // Don't move pass calls, etc.
1012 return false;
1013 for (const MachineOperand &MO : OtherMI.operands()) {
1014 if (!MO.isReg())
1015 continue;
1016 Register MOReg = MO.getReg();
1017 if (!MOReg)
1018 continue;
1019 if (MO.isDef()) {
1020 if (regOverlapsSet(Uses, MOReg))
1021 // Physical register use would be clobbered.
1022 return false;
1023 if (!MO.isDead() && regOverlapsSet(Defs, MOReg))
1024 // May clobber a physical register def.
1025 // FIXME: This may be too conservative. It's ok if the instruction
1026 // is sunken completely below the use.
1027 return false;
1028 } else {
1029 if (regOverlapsSet(Defs, MOReg))
1030 return false;
1031 bool isKill = isPlainlyKilled(MO);
1032 if (MOReg != Reg && ((isKill && regOverlapsSet(Uses, MOReg)) ||
1033 regOverlapsSet(Kills, MOReg)))
1034 // Don't want to extend other live ranges and update kills.
1035 return false;
1036 if (MOReg == Reg && !isKill)
1037 // We can't schedule across a use of the register in question.
1038 return false;
1039 // Ensure that if this is register in question, its the kill we expect.
1040 assert((MOReg != Reg || &OtherMI == KillMI) &&
1041 "Found multiple kills of a register in a basic block");
1042 }
1043 }
1044 }
1045
1046 // Move debug info as well.
1047 while (Begin != MBB->begin() && std::prev(Begin)->isDebugInstr())
1048 --Begin;
1049
1050 nmi = End;
1051 MachineBasicBlock::iterator InsertPos = KillPos;
1052 if (LIS) {
1053 // We have to move the copies (and any interleaved debug instructions)
1054 // first so that the MBB is still well-formed when calling handleMove().
1055 for (MachineBasicBlock::iterator MBBI = AfterMI; MBBI != End;) {
1056 auto CopyMI = MBBI++;
1057 MBB->splice(InsertPos, MBB, CopyMI);
1058 if (!CopyMI->isDebugOrPseudoInstr())
1059 LIS->handleMove(*CopyMI);
1060 InsertPos = CopyMI;
1061 }
1062 End = std::next(MachineBasicBlock::iterator(MI));
1063 }
1064
1065 // Copies following MI may have been moved as well.
1066 MBB->splice(InsertPos, MBB, Begin, End);
1067 DistanceMap.erase(DI);
1068
1069 // Update live variables
1070 if (LIS) {
1071 LIS->handleMove(*MI);
1072 } else {
1073 LV->removeVirtualRegisterKilled(Reg, *KillMI);
1075 }
1076
1077 LLVM_DEBUG(dbgs() << "\trescheduled below kill: " << *KillMI);
1078 return true;
1079}
1080
1081/// Return true if the re-scheduling will put the given instruction too close
1082/// to the defs of its register dependencies.
1083bool TwoAddressInstructionImpl::isDefTooClose(Register Reg, unsigned Dist,
1084 MachineInstr *MI) {
1085 for (MachineInstr &DefMI : MRI->def_instructions(Reg)) {
1086 if (DefMI.getParent() != MBB || DefMI.isCopy() || DefMI.isCopyLike())
1087 continue;
1088 if (&DefMI == MI)
1089 return true; // MI is defining something KillMI uses
1090 DenseMap<MachineInstr*, unsigned>::iterator DDI = DistanceMap.find(&DefMI);
1091 if (DDI == DistanceMap.end())
1092 return true; // Below MI
1093 unsigned DefDist = DDI->second;
1094 assert(Dist > DefDist && "Visited def already?");
1095 if (TII->getInstrLatency(InstrItins, DefMI) > (Dist - DefDist))
1096 return true;
1097 }
1098 return false;
1099}
1100
1101/// If there is one more local instruction that reads 'Reg' and it kills 'Reg,
1102/// consider moving the kill instruction above the current two-address
1103/// instruction in order to eliminate the need for the copy.
1104bool TwoAddressInstructionImpl::rescheduleKillAboveMI(
1106 Register Reg) {
1107 // Bail immediately if we don't have LV or LIS available. We use them to find
1108 // kills efficiently.
1109 if (!LV && !LIS)
1110 return false;
1111
1112 MachineInstr *MI = &*mi;
1113 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.find(MI);
1114 if (DI == DistanceMap.end())
1115 // Must be created from unfolded load. Don't waste time trying this.
1116 return false;
1117
1118 MachineInstr *KillMI = nullptr;
1119 if (LIS) {
1120 LiveInterval &LI = LIS->getInterval(Reg);
1121 assert(LI.end() != LI.begin() &&
1122 "Reg should not have empty live interval.");
1123
1124 SlotIndex MBBEndIdx = LIS->getMBBEndIdx(MBB).getPrevSlot();
1125 LiveInterval::const_iterator I = LI.find(MBBEndIdx);
1126 if (I != LI.end() && I->start < MBBEndIdx)
1127 return false;
1128
1129 --I;
1130 KillMI = LIS->getInstructionFromIndex(I->end);
1131 } else {
1132 KillMI = LV->getVarInfo(Reg).findKill(MBB);
1133 }
1134 if (!KillMI || MI == KillMI || KillMI->isCopy() || KillMI->isCopyLike())
1135 // Don't mess with copies, they may be coalesced later.
1136 return false;
1137
1138 Register DstReg;
1139 if (isTwoAddrUse(*KillMI, Reg, DstReg))
1140 return false;
1141
1142 bool SeenStore = true;
1143 if (!KillMI->isSafeToMove(SeenStore))
1144 return false;
1145
1149 SmallVector<Register, 2> LiveDefs;
1150 for (const MachineOperand &MO : KillMI->operands()) {
1151 if (!MO.isReg())
1152 continue;
1153 Register MOReg = MO.getReg();
1154 if (MO.isUse()) {
1155 if (!MOReg)
1156 continue;
1157 if (isDefTooClose(MOReg, DI->second, MI))
1158 return false;
1159 bool isKill = isPlainlyKilled(MO);
1160 if (MOReg == Reg && !isKill)
1161 return false;
1162 Uses.push_back(MOReg);
1163 if (isKill && MOReg != Reg)
1164 Kills.push_back(MOReg);
1165 } else if (MOReg.isPhysical()) {
1166 Defs.push_back(MOReg);
1167 if (!MO.isDead())
1168 LiveDefs.push_back(MOReg);
1169 }
1170 }
1171
1172 // Check if the reschedule will not break dependencies.
1173 unsigned NumVisited = 0;
1174 for (MachineInstr &OtherMI :
1176 // Debug or pseudo instructions cannot be counted against the limit.
1177 if (OtherMI.isDebugOrPseudoInstr())
1178 continue;
1179 if (NumVisited > 10) // FIXME: Arbitrary limit to reduce compile time cost.
1180 return false;
1181 ++NumVisited;
1182 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1183 OtherMI.isBranch() || OtherMI.isTerminator())
1184 // Don't move pass calls, etc.
1185 return false;
1186 SmallVector<Register, 2> OtherDefs;
1187 for (const MachineOperand &MO : OtherMI.operands()) {
1188 if (!MO.isReg())
1189 continue;
1190 Register MOReg = MO.getReg();
1191 if (!MOReg)
1192 continue;
1193 if (MO.isUse()) {
1194 if (regOverlapsSet(Defs, MOReg))
1195 // Moving KillMI can clobber the physical register if the def has
1196 // not been seen.
1197 return false;
1198 if (regOverlapsSet(Kills, MOReg))
1199 // Don't want to extend other live ranges and update kills.
1200 return false;
1201 if (&OtherMI != MI && MOReg == Reg && !isPlainlyKilled(MO))
1202 // We can't schedule across a use of the register in question.
1203 return false;
1204 } else {
1205 OtherDefs.push_back(MOReg);
1206 }
1207 }
1208
1209 for (Register MOReg : OtherDefs) {
1210 if (regOverlapsSet(Uses, MOReg))
1211 return false;
1212 if (MOReg.isPhysical() && regOverlapsSet(LiveDefs, MOReg))
1213 return false;
1214 // Physical register def is seen.
1215 llvm::erase(Defs, MOReg);
1216 }
1217 }
1218
1219 // Move the old kill above MI, don't forget to move debug info as well.
1220 MachineBasicBlock::iterator InsertPos = mi;
1221 while (InsertPos != MBB->begin() && std::prev(InsertPos)->isDebugInstr())
1222 --InsertPos;
1223 MachineBasicBlock::iterator From = KillMI;
1224 MachineBasicBlock::iterator To = std::next(From);
1225 while (std::prev(From)->isDebugInstr())
1226 --From;
1227 MBB->splice(InsertPos, MBB, From, To);
1228
1229 nmi = std::prev(InsertPos); // Backtrack so we process the moved instr.
1230 DistanceMap.erase(DI);
1231
1232 // Update live variables
1233 if (LIS) {
1234 LIS->handleMove(*KillMI);
1235 } else {
1236 LV->removeVirtualRegisterKilled(Reg, *KillMI);
1238 }
1239
1240 LLVM_DEBUG(dbgs() << "\trescheduled kill: " << *KillMI);
1241 return true;
1242}
1243
1244/// Tries to commute the operand 'BaseOpIdx' and some other operand in the
1245/// given machine instruction to improve opportunities for coalescing and
1246/// elimination of a register to register copy.
1247///
1248/// 'DstOpIdx' specifies the index of MI def operand.
1249/// 'BaseOpKilled' specifies if the register associated with 'BaseOpIdx'
1250/// operand is killed by the given instruction.
1251/// The 'Dist' arguments provides the distance of MI from the start of the
1252/// current basic block and it is used to determine if it is profitable
1253/// to commute operands in the instruction.
1254///
1255/// Returns true if the transformation happened. Otherwise, returns false.
1256bool TwoAddressInstructionImpl::tryInstructionCommute(MachineInstr *MI,
1257 unsigned DstOpIdx,
1258 unsigned BaseOpIdx,
1259 bool BaseOpKilled,
1260 unsigned Dist) {
1261 if (!MI->isCommutable())
1262 return false;
1263
1264 bool MadeChange = false;
1265 Register DstOpReg = MI->getOperand(DstOpIdx).getReg();
1266 Register BaseOpReg = MI->getOperand(BaseOpIdx).getReg();
1267 unsigned OpsNum = MI->getDesc().getNumOperands();
1268 unsigned OtherOpIdx = MI->getDesc().getNumDefs();
1269 for (; OtherOpIdx < OpsNum; OtherOpIdx++) {
1270 // The call of findCommutedOpIndices below only checks if BaseOpIdx
1271 // and OtherOpIdx are commutable, it does not really search for
1272 // other commutable operands and does not change the values of passed
1273 // variables.
1274 if (OtherOpIdx == BaseOpIdx || !MI->getOperand(OtherOpIdx).isReg() ||
1275 !TII->findCommutedOpIndices(*MI, BaseOpIdx, OtherOpIdx))
1276 continue;
1277
1278 Register OtherOpReg = MI->getOperand(OtherOpIdx).getReg();
1279 bool AggressiveCommute = false;
1280
1281 // If OtherOp dies but BaseOp does not, swap the OtherOp and BaseOp
1282 // operands. This makes the live ranges of DstOp and OtherOp joinable.
1283 bool OtherOpKilled = isKilled(*MI, OtherOpReg, false);
1284 bool DoCommute = !BaseOpKilled && OtherOpKilled;
1285
1286 if (!DoCommute &&
1287 isProfitableToCommute(DstOpReg, BaseOpReg, OtherOpReg, MI, Dist)) {
1288 DoCommute = true;
1289 AggressiveCommute = true;
1290 }
1291
1292 // If it's profitable to commute, try to do so.
1293 if (DoCommute && commuteInstruction(MI, DstOpIdx, BaseOpIdx, OtherOpIdx,
1294 Dist)) {
1295 MadeChange = true;
1296 ++NumCommuted;
1297 if (AggressiveCommute)
1298 ++NumAggrCommuted;
1299
1300 // There might be more than two commutable operands, update BaseOp and
1301 // continue scanning.
1302 // FIXME: This assumes that the new instruction's operands are in the
1303 // same positions and were simply swapped.
1304 BaseOpReg = OtherOpReg;
1305 BaseOpKilled = OtherOpKilled;
1306 // Resamples OpsNum in case the number of operands was reduced. This
1307 // happens with X86.
1308 OpsNum = MI->getDesc().getNumOperands();
1309 }
1310 }
1311 return MadeChange;
1312}
1313
1314/// For the case where an instruction has a single pair of tied register
1315/// operands, attempt some transformations that may either eliminate the tied
1316/// operands or improve the opportunities for coalescing away the register copy.
1317/// Returns true if no copy needs to be inserted to untie mi's operands
1318/// (either because they were untied, or because mi was rescheduled, and will
1319/// be visited again later). If the shouldOnlyCommute flag is true, only
1320/// instruction commutation is attempted.
1321bool TwoAddressInstructionImpl::tryInstructionTransform(
1323 unsigned SrcIdx, unsigned DstIdx, unsigned &Dist, bool shouldOnlyCommute) {
1324 if (OptLevel == CodeGenOptLevel::None)
1325 return false;
1326
1327 MachineInstr &MI = *mi;
1328 Register regA = MI.getOperand(DstIdx).getReg();
1329 Register regB = MI.getOperand(SrcIdx).getReg();
1330
1331 assert(regB.isVirtual() && "cannot make instruction into two-address form");
1332 bool regBKilled = isKilled(MI, regB, true);
1333
1334 if (regA.isVirtual())
1335 scanUses(regA);
1336
1337 bool Commuted = tryInstructionCommute(&MI, DstIdx, SrcIdx, regBKilled, Dist);
1338
1339 // Give targets a chance to convert bundled instructions.
1340 bool ConvertibleTo3Addr = MI.isConvertibleTo3Addr(MachineInstr::AnyInBundle);
1341
1342 // If the instruction is convertible to 3 Addr, instead
1343 // of returning try 3 Addr transformation aggressively and
1344 // use this variable to check later. Because it might be better.
1345 // For example, we can just use `leal (%rsi,%rdi), %eax` and `ret`
1346 // instead of the following code.
1347 // addl %esi, %edi
1348 // movl %edi, %eax
1349 // ret
1350 if (Commuted && !ConvertibleTo3Addr)
1351 return false;
1352
1353 if (shouldOnlyCommute)
1354 return false;
1355
1356 // If there is one more use of regB later in the same MBB, consider
1357 // re-schedule this MI below it.
1358 if (!Commuted && EnableRescheduling && rescheduleMIBelowKill(mi, nmi, regB)) {
1359 ++NumReSchedDowns;
1360 return true;
1361 }
1362
1363 // If we commuted, regB may have changed so we should re-sample it to avoid
1364 // confusing the three address conversion below.
1365 if (Commuted) {
1366 regB = MI.getOperand(SrcIdx).getReg();
1367 regBKilled = isKilled(MI, regB, true);
1368 }
1369
1370 if (ConvertibleTo3Addr) {
1371 // This instruction is potentially convertible to a true
1372 // three-address instruction. Check if it is profitable.
1373 if (!regBKilled || isProfitableToConv3Addr(regA, regB)) {
1374 // Try to convert it.
1375 if (convertInstTo3Addr(mi, nmi, regA, regB, Dist)) {
1376 ++NumConvertedTo3Addr;
1377 return true; // Done with this instruction.
1378 }
1379 }
1380 }
1381
1382 // Return if it is commuted but 3 addr conversion is failed.
1383 if (Commuted)
1384 return false;
1385
1386 // If there is one more use of regB later in the same MBB, consider
1387 // re-schedule it before this MI if it's legal.
1388 if (EnableRescheduling && rescheduleKillAboveMI(mi, nmi, regB)) {
1389 ++NumReSchedUps;
1390 return true;
1391 }
1392
1393 // If this is an instruction with a load folded into it, try unfolding
1394 // the load, e.g. avoid this:
1395 // movq %rdx, %rcx
1396 // addq (%rax), %rcx
1397 // in favor of this:
1398 // movq (%rax), %rcx
1399 // addq %rdx, %rcx
1400 // because it's preferable to schedule a load than a register copy.
1401 if (MI.mayLoad() && !regBKilled) {
1402 // Determine if a load can be unfolded.
1403 unsigned LoadRegIndex;
1404 unsigned NewOpc =
1405 TII->getOpcodeAfterMemoryUnfold(MI.getOpcode(),
1406 /*UnfoldLoad=*/true,
1407 /*UnfoldStore=*/false,
1408 &LoadRegIndex);
1409 if (NewOpc != 0) {
1410 const MCInstrDesc &UnfoldMCID = TII->get(NewOpc);
1411 if (UnfoldMCID.getNumDefs() == 1) {
1412 // Unfold the load.
1413 LLVM_DEBUG(dbgs() << "2addr: UNFOLDING: " << MI);
1414 const TargetRegisterClass *RC = TRI->getAllocatableClass(
1415 TII->getRegClass(UnfoldMCID, LoadRegIndex));
1416 Register Reg = MRI->createVirtualRegister(RC);
1417 SmallVector<MachineInstr *, 2> NewMIs;
1418 if (!TII->unfoldMemoryOperand(*MF, MI, Reg,
1419 /*UnfoldLoad=*/true,
1420 /*UnfoldStore=*/false, NewMIs)) {
1421 LLVM_DEBUG(dbgs() << "2addr: ABANDONING UNFOLD\n");
1422 return false;
1423 }
1424 assert(NewMIs.size() == 2 &&
1425 "Unfolded a load into multiple instructions!");
1426 // The load was previously folded, so this is the only use.
1427 NewMIs[1]->addRegisterKilled(Reg, TRI);
1428
1429 // Tentatively insert the instructions into the block so that they
1430 // look "normal" to the transformation logic.
1431 MBB->insert(mi, NewMIs[0]);
1432 MBB->insert(mi, NewMIs[1]);
1433 DistanceMap.insert(std::make_pair(NewMIs[0], Dist++));
1434 DistanceMap.insert(std::make_pair(NewMIs[1], Dist));
1435
1436 LLVM_DEBUG(dbgs() << "2addr: NEW LOAD: " << *NewMIs[0]
1437 << "2addr: NEW INST: " << *NewMIs[1]);
1438
1439 // Transform the instruction, now that it no longer has a load.
1440 unsigned NewDstIdx =
1441 NewMIs[1]->findRegisterDefOperandIdx(regA, /*TRI=*/nullptr);
1442 unsigned NewSrcIdx =
1443 NewMIs[1]->findRegisterUseOperandIdx(regB, /*TRI=*/nullptr);
1444 MachineBasicBlock::iterator NewMI = NewMIs[1];
1445 bool TransformResult =
1446 tryInstructionTransform(NewMI, mi, NewSrcIdx, NewDstIdx, Dist, true);
1447 (void)TransformResult;
1448 assert(!TransformResult &&
1449 "tryInstructionTransform() should return false.");
1450 if (NewMIs[1]->getOperand(NewSrcIdx).isKill()) {
1451 // Success, or at least we made an improvement. Keep the unfolded
1452 // instructions and discard the original.
1453 if (LV) {
1454 for (const MachineOperand &MO : MI.operands()) {
1455 if (MO.isReg() && MO.getReg().isVirtual()) {
1456 if (MO.isUse()) {
1457 if (MO.isKill()) {
1458 if (NewMIs[0]->killsRegister(MO.getReg(), /*TRI=*/nullptr))
1459 LV->replaceKillInstruction(MO.getReg(), MI, *NewMIs[0]);
1460 else {
1461 assert(NewMIs[1]->killsRegister(MO.getReg(),
1462 /*TRI=*/nullptr) &&
1463 "Kill missing after load unfold!");
1464 LV->replaceKillInstruction(MO.getReg(), MI, *NewMIs[1]);
1465 }
1466 }
1467 } else if (LV->removeVirtualRegisterDead(MO.getReg(), MI)) {
1468 if (NewMIs[1]->registerDefIsDead(MO.getReg(),
1469 /*TRI=*/nullptr))
1470 LV->addVirtualRegisterDead(MO.getReg(), *NewMIs[1]);
1471 else {
1472 assert(NewMIs[0]->registerDefIsDead(MO.getReg(),
1473 /*TRI=*/nullptr) &&
1474 "Dead flag missing after load unfold!");
1475 LV->addVirtualRegisterDead(MO.getReg(), *NewMIs[0]);
1476 }
1477 }
1478 }
1479 }
1480 LV->addVirtualRegisterKilled(Reg, *NewMIs[1]);
1481 }
1482
1483 SmallVector<Register, 4> OrigRegs;
1484 if (LIS) {
1485 for (const MachineOperand &MO : MI.operands()) {
1486 if (MO.isReg())
1487 OrigRegs.push_back(MO.getReg());
1488 }
1489
1491 }
1492
1493 MI.eraseFromParent();
1494 DistanceMap.erase(&MI);
1495
1496 // Update LiveIntervals.
1497 if (LIS) {
1498 MachineBasicBlock::iterator Begin(NewMIs[0]);
1499 MachineBasicBlock::iterator End(NewMIs[1]);
1500 LIS->repairIntervalsInRange(MBB, Begin, End, OrigRegs);
1501 }
1502
1503 mi = NewMIs[1];
1504 } else {
1505 // Transforming didn't eliminate the tie and didn't lead to an
1506 // improvement. Clean up the unfolded instructions and keep the
1507 // original.
1508 LLVM_DEBUG(dbgs() << "2addr: ABANDONING UNFOLD\n");
1509 NewMIs[0]->eraseFromParent();
1510 NewMIs[1]->eraseFromParent();
1511 DistanceMap.erase(NewMIs[0]);
1512 DistanceMap.erase(NewMIs[1]);
1513 Dist--;
1514 }
1515 }
1516 }
1517 }
1518
1519 return false;
1520}
1521
1522// Collect tied operands of MI that need to be handled.
1523// Rewrite trivial cases immediately.
1524// Return true if any tied operands where found, including the trivial ones.
1525bool TwoAddressInstructionImpl::collectTiedOperands(
1526 MachineInstr *MI, TiedOperandMap &TiedOperands) {
1527 bool AnyOps = false;
1528 unsigned NumOps = MI->getNumOperands();
1529
1530 for (unsigned SrcIdx = 0; SrcIdx < NumOps; ++SrcIdx) {
1531 unsigned DstIdx = 0;
1532 if (!MI->isRegTiedToDefOperand(SrcIdx, &DstIdx))
1533 continue;
1534 AnyOps = true;
1535 MachineOperand &SrcMO = MI->getOperand(SrcIdx);
1536 MachineOperand &DstMO = MI->getOperand(DstIdx);
1537 Register SrcReg = SrcMO.getReg();
1538 Register DstReg = DstMO.getReg();
1539 // Tied constraint already satisfied?
1540 if (SrcReg == DstReg)
1541 continue;
1542
1543 assert(SrcReg && SrcMO.isUse() && "two address instruction invalid");
1544
1545 // Deal with undef uses immediately - simply rewrite the src operand.
1546 if (SrcMO.isUndef() && !DstMO.getSubReg()) {
1547 // Constrain the DstReg register class if required.
1548 if (DstReg.isVirtual()) {
1549 const TargetRegisterClass *RC = MRI->getRegClass(SrcReg);
1550 MRI->constrainRegClass(DstReg, RC);
1551 }
1552 SrcMO.setReg(DstReg);
1553 SrcMO.setSubReg(0);
1554 LLVM_DEBUG(dbgs() << "\t\trewrite undef:\t" << *MI);
1555 continue;
1556 }
1557 TiedOperands[SrcReg].push_back(std::make_pair(SrcIdx, DstIdx));
1558 }
1559 return AnyOps;
1560}
1561
1562// Process a list of tied MI operands that all use the same source register.
1563// The tied pairs are of the form (SrcIdx, DstIdx).
1564void TwoAddressInstructionImpl::processTiedPairs(MachineInstr *MI,
1565 TiedPairList &TiedPairs,
1566 unsigned &Dist) {
1567 bool IsEarlyClobber = llvm::any_of(TiedPairs, [MI](auto const &TP) {
1568 return MI->getOperand(TP.second).isEarlyClobber();
1569 });
1570
1571 bool RemovedKillFlag = false;
1572 bool AllUsesCopied = true;
1573 Register LastCopiedReg;
1574 SlotIndex LastCopyIdx;
1575 Register RegB = 0;
1576 unsigned SubRegB = 0;
1577 for (auto &TP : TiedPairs) {
1578 unsigned SrcIdx = TP.first;
1579 unsigned DstIdx = TP.second;
1580
1581 const MachineOperand &DstMO = MI->getOperand(DstIdx);
1582 Register RegA = DstMO.getReg();
1583
1584 // Grab RegB from the instruction because it may have changed if the
1585 // instruction was commuted.
1586 RegB = MI->getOperand(SrcIdx).getReg();
1587 SubRegB = MI->getOperand(SrcIdx).getSubReg();
1588
1589 if (RegA == RegB) {
1590 // The register is tied to multiple destinations (or else we would
1591 // not have continued this far), but this use of the register
1592 // already matches the tied destination. Leave it.
1593 AllUsesCopied = false;
1594 continue;
1595 }
1596 LastCopiedReg = RegA;
1597
1598 assert(RegB.isVirtual() && "cannot make instruction into two-address form");
1599
1600#ifndef NDEBUG
1601 // First, verify that we don't have a use of "a" in the instruction
1602 // (a = b + a for example) because our transformation will not
1603 // work. This should never occur because we are in SSA form.
1604 for (unsigned i = 0; i != MI->getNumOperands(); ++i)
1605 assert(i == DstIdx ||
1606 !MI->getOperand(i).isReg() ||
1607 MI->getOperand(i).getReg() != RegA);
1608#endif
1609
1610 // Emit a copy.
1611 MachineInstrBuilder MIB = BuildMI(*MI->getParent(), MI, MI->getDebugLoc(),
1612 TII->get(TargetOpcode::COPY), RegA);
1613 // If this operand is folding a truncation, the truncation now moves to the
1614 // copy so that the register classes remain valid for the operands.
1615 MIB.addReg(RegB, 0, SubRegB);
1616 const TargetRegisterClass *RC = MRI->getRegClass(RegB);
1617 if (SubRegB) {
1618 if (RegA.isVirtual()) {
1619 assert(TRI->getMatchingSuperRegClass(RC, MRI->getRegClass(RegA),
1620 SubRegB) &&
1621 "tied subregister must be a truncation");
1622 // The superreg class will not be used to constrain the subreg class.
1623 RC = nullptr;
1624 } else {
1625 assert(TRI->getMatchingSuperReg(RegA, SubRegB, MRI->getRegClass(RegB))
1626 && "tied subregister must be a truncation");
1627 }
1628 }
1629
1630 // Update DistanceMap.
1632 --PrevMI;
1633 DistanceMap.insert(std::make_pair(&*PrevMI, Dist));
1634 DistanceMap[MI] = ++Dist;
1635
1636 if (LIS) {
1637 LastCopyIdx = LIS->InsertMachineInstrInMaps(*PrevMI).getRegSlot();
1638
1639 SlotIndex endIdx =
1640 LIS->getInstructionIndex(*MI).getRegSlot(IsEarlyClobber);
1641 if (RegA.isVirtual()) {
1642 LiveInterval &LI = LIS->getInterval(RegA);
1643 VNInfo *VNI = LI.getNextValue(LastCopyIdx, LIS->getVNInfoAllocator());
1644 LI.addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1645 for (auto &S : LI.subranges()) {
1646 VNI = S.getNextValue(LastCopyIdx, LIS->getVNInfoAllocator());
1647 S.addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1648 }
1649 } else {
1650 for (MCRegUnit Unit : TRI->regunits(RegA)) {
1651 if (LiveRange *LR = LIS->getCachedRegUnit(Unit)) {
1652 VNInfo *VNI =
1653 LR->getNextValue(LastCopyIdx, LIS->getVNInfoAllocator());
1654 LR->addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1655 }
1656 }
1657 }
1658 }
1659
1660 LLVM_DEBUG(dbgs() << "\t\tprepend:\t" << *MIB);
1661
1662 MachineOperand &MO = MI->getOperand(SrcIdx);
1663 assert(MO.isReg() && MO.getReg() == RegB && MO.isUse() &&
1664 "inconsistent operand info for 2-reg pass");
1665 if (isPlainlyKilled(MO)) {
1666 MO.setIsKill(false);
1667 RemovedKillFlag = true;
1668 }
1669
1670 // Make sure regA is a legal regclass for the SrcIdx operand.
1671 if (RegA.isVirtual() && RegB.isVirtual())
1672 MRI->constrainRegClass(RegA, RC);
1673 MO.setReg(RegA);
1674 // The getMatchingSuper asserts guarantee that the register class projected
1675 // by SubRegB is compatible with RegA with no subregister. So regardless of
1676 // whether the dest oper writes a subreg, the source oper should not.
1677 MO.setSubReg(0);
1678
1679 // Update uses of RegB to uses of RegA inside the bundle.
1680 if (MI->isBundle()) {
1681 for (MachineOperand &MO : mi_bundle_ops(*MI)) {
1682 if (MO.isReg() && MO.getReg() == RegB) {
1683 assert(MO.getSubReg() == 0 && SubRegB == 0 &&
1684 "tied subregister uses in bundled instructions not supported");
1685 MO.setReg(RegA);
1686 }
1687 }
1688 }
1689 }
1690
1691 if (AllUsesCopied) {
1692 LaneBitmask RemainingUses = LaneBitmask::getNone();
1693 // Replace other (un-tied) uses of regB with LastCopiedReg.
1694 for (MachineOperand &MO : MI->all_uses()) {
1695 if (MO.getReg() == RegB) {
1696 if (MO.getSubReg() == SubRegB && !IsEarlyClobber) {
1697 if (isPlainlyKilled(MO)) {
1698 MO.setIsKill(false);
1699 RemovedKillFlag = true;
1700 }
1701 MO.setReg(LastCopiedReg);
1702 MO.setSubReg(0);
1703 } else {
1704 RemainingUses |= TRI->getSubRegIndexLaneMask(MO.getSubReg());
1705 }
1706 }
1707 }
1708
1709 // Update live variables for regB.
1710 if (RemovedKillFlag && RemainingUses.none() && LV &&
1711 LV->getVarInfo(RegB).removeKill(*MI)) {
1713 --PrevMI;
1714 LV->addVirtualRegisterKilled(RegB, *PrevMI);
1715 }
1716
1717 if (RemovedKillFlag && RemainingUses.none())
1718 SrcRegMap[LastCopiedReg] = RegB;
1719
1720 // Update LiveIntervals.
1721 if (LIS) {
1722 SlotIndex UseIdx = LIS->getInstructionIndex(*MI);
1723 auto Shrink = [=](LiveRange &LR, LaneBitmask LaneMask) {
1724 LiveRange::Segment *S = LR.getSegmentContaining(LastCopyIdx);
1725 if (!S)
1726 return true;
1727 if ((LaneMask & RemainingUses).any())
1728 return false;
1729 if (S->end.getBaseIndex() != UseIdx)
1730 return false;
1731 S->end = LastCopyIdx;
1732 return true;
1733 };
1734
1735 LiveInterval &LI = LIS->getInterval(RegB);
1736 bool ShrinkLI = true;
1737 for (auto &S : LI.subranges())
1738 ShrinkLI &= Shrink(S, S.LaneMask);
1739 if (ShrinkLI)
1740 Shrink(LI, LaneBitmask::getAll());
1741 }
1742 } else if (RemovedKillFlag) {
1743 // Some tied uses of regB matched their destination registers, so
1744 // regB is still used in this instruction, but a kill flag was
1745 // removed from a different tied use of regB, so now we need to add
1746 // a kill flag to one of the remaining uses of regB.
1747 for (MachineOperand &MO : MI->all_uses()) {
1748 if (MO.getReg() == RegB) {
1749 MO.setIsKill(true);
1750 break;
1751 }
1752 }
1753 }
1754}
1755
1756// For every tied operand pair this function transforms statepoint from
1757// RegA = STATEPOINT ... RegB(tied-def N)
1758// to
1759// RegB = STATEPOINT ... RegB(tied-def N)
1760// and replaces all uses of RegA with RegB.
1761// No extra COPY instruction is necessary because tied use is killed at
1762// STATEPOINT.
1763bool TwoAddressInstructionImpl::processStatepoint(
1764 MachineInstr *MI, TiedOperandMap &TiedOperands) {
1765
1766 bool NeedCopy = false;
1767 for (auto &TO : TiedOperands) {
1768 Register RegB = TO.first;
1769 if (TO.second.size() != 1) {
1770 NeedCopy = true;
1771 continue;
1772 }
1773
1774 unsigned SrcIdx = TO.second[0].first;
1775 unsigned DstIdx = TO.second[0].second;
1776
1777 MachineOperand &DstMO = MI->getOperand(DstIdx);
1778 Register RegA = DstMO.getReg();
1779
1780 assert(RegB == MI->getOperand(SrcIdx).getReg());
1781
1782 if (RegA == RegB)
1783 continue;
1784
1785 // CodeGenPrepare can sink pointer compare past statepoint, which
1786 // breaks assumption that statepoint kills tied-use register when
1787 // in SSA form (see note in IR/SafepointIRVerifier.cpp). Fall back
1788 // to generic tied register handling to avoid assertion failures.
1789 // TODO: Recompute LIS/LV information for new range here.
1790 if (LIS) {
1791 const auto &UseLI = LIS->getInterval(RegB);
1792 const auto &DefLI = LIS->getInterval(RegA);
1793 if (DefLI.overlaps(UseLI)) {
1794 LLVM_DEBUG(dbgs() << "LIS: " << printReg(RegB, TRI, 0)
1795 << " UseLI overlaps with DefLI\n");
1796 NeedCopy = true;
1797 continue;
1798 }
1799 } else if (LV && LV->getVarInfo(RegB).findKill(MI->getParent()) != MI) {
1800 // Note that MachineOperand::isKill does not work here, because it
1801 // is set only on first register use in instruction and for statepoint
1802 // tied-use register will usually be found in preceeding deopt bundle.
1803 LLVM_DEBUG(dbgs() << "LV: " << printReg(RegB, TRI, 0)
1804 << " not killed by statepoint\n");
1805 NeedCopy = true;
1806 continue;
1807 }
1808
1809 if (!MRI->constrainRegClass(RegB, MRI->getRegClass(RegA))) {
1810 LLVM_DEBUG(dbgs() << "MRI: couldn't constrain" << printReg(RegB, TRI, 0)
1811 << " to register class of " << printReg(RegA, TRI, 0)
1812 << '\n');
1813 NeedCopy = true;
1814 continue;
1815 }
1816 MRI->replaceRegWith(RegA, RegB);
1817
1818 if (LIS) {
1820 LiveInterval &LI = LIS->getInterval(RegB);
1821 LiveInterval &Other = LIS->getInterval(RegA);
1822 SmallVector<VNInfo *> NewVNIs;
1823 for (const VNInfo *VNI : Other.valnos) {
1824 assert(VNI->id == NewVNIs.size() && "assumed");
1825 NewVNIs.push_back(LI.createValueCopy(VNI, A));
1826 }
1827 for (auto &S : Other) {
1828 VNInfo *VNI = NewVNIs[S.valno->id];
1829 LiveRange::Segment NewSeg(S.start, S.end, VNI);
1830 LI.addSegment(NewSeg);
1831 }
1832 LIS->removeInterval(RegA);
1833 }
1834
1835 if (LV) {
1836 if (MI->getOperand(SrcIdx).isKill())
1837 LV->removeVirtualRegisterKilled(RegB, *MI);
1838 LiveVariables::VarInfo &SrcInfo = LV->getVarInfo(RegB);
1839 LiveVariables::VarInfo &DstInfo = LV->getVarInfo(RegA);
1840 SrcInfo.AliveBlocks |= DstInfo.AliveBlocks;
1841 DstInfo.AliveBlocks.clear();
1842 for (auto *KillMI : DstInfo.Kills)
1843 LV->addVirtualRegisterKilled(RegB, *KillMI, false);
1844 }
1845 }
1846 return !NeedCopy;
1847}
1848
1849/// Reduce two-address instructions to two operands.
1850bool TwoAddressInstructionImpl::run() {
1851 bool MadeChange = false;
1852
1853 LLVM_DEBUG(dbgs() << "********** REWRITING TWO-ADDR INSTRS **********\n");
1854 LLVM_DEBUG(dbgs() << "********** Function: " << MF->getName() << '\n');
1855
1856 // This pass takes the function out of SSA form.
1857 MRI->leaveSSA();
1858
1859 // This pass will rewrite the tied-def to meet the RegConstraint.
1860 MF->getProperties().setTiedOpsRewritten();
1861
1862 TiedOperandMap TiedOperands;
1863 for (MachineBasicBlock &MBBI : *MF) {
1864 MBB = &MBBI;
1865 unsigned Dist = 0;
1866 DistanceMap.clear();
1867 SrcRegMap.clear();
1868 DstRegMap.clear();
1869 Processed.clear();
1870 for (MachineBasicBlock::iterator mi = MBB->begin(), me = MBB->end();
1871 mi != me; ) {
1872 MachineBasicBlock::iterator nmi = std::next(mi);
1873 // Skip debug instructions.
1874 if (mi->isDebugInstr()) {
1875 mi = nmi;
1876 continue;
1877 }
1878
1879 // Expand REG_SEQUENCE instructions. This will position mi at the first
1880 // expanded instruction.
1881 if (mi->isRegSequence())
1882 eliminateRegSequence(mi);
1883
1884 DistanceMap.insert(std::make_pair(&*mi, ++Dist));
1885
1886 processCopy(&*mi);
1887
1888 // First scan through all the tied register uses in this instruction
1889 // and record a list of pairs of tied operands for each register.
1890 if (!collectTiedOperands(&*mi, TiedOperands)) {
1891 removeClobberedSrcRegMap(&*mi);
1892 mi = nmi;
1893 continue;
1894 }
1895
1896 ++NumTwoAddressInstrs;
1897 MadeChange = true;
1898 LLVM_DEBUG(dbgs() << '\t' << *mi);
1899
1900 // If the instruction has a single pair of tied operands, try some
1901 // transformations that may either eliminate the tied operands or
1902 // improve the opportunities for coalescing away the register copy.
1903 if (TiedOperands.size() == 1) {
1904 SmallVectorImpl<std::pair<unsigned, unsigned>> &TiedPairs
1905 = TiedOperands.begin()->second;
1906 if (TiedPairs.size() == 1) {
1907 unsigned SrcIdx = TiedPairs[0].first;
1908 unsigned DstIdx = TiedPairs[0].second;
1909 Register SrcReg = mi->getOperand(SrcIdx).getReg();
1910 Register DstReg = mi->getOperand(DstIdx).getReg();
1911 if (SrcReg != DstReg &&
1912 tryInstructionTransform(mi, nmi, SrcIdx, DstIdx, Dist, false)) {
1913 // The tied operands have been eliminated or shifted further down
1914 // the block to ease elimination. Continue processing with 'nmi'.
1915 TiedOperands.clear();
1916 removeClobberedSrcRegMap(&*mi);
1917 mi = nmi;
1918 continue;
1919 }
1920 }
1921 }
1922
1923 if (mi->getOpcode() == TargetOpcode::STATEPOINT &&
1924 processStatepoint(&*mi, TiedOperands)) {
1925 TiedOperands.clear();
1926 LLVM_DEBUG(dbgs() << "\t\trewrite to:\t" << *mi);
1927 mi = nmi;
1928 continue;
1929 }
1930
1931 // Now iterate over the information collected above.
1932 for (auto &TO : TiedOperands) {
1933 processTiedPairs(&*mi, TO.second, Dist);
1934 LLVM_DEBUG(dbgs() << "\t\trewrite to:\t" << *mi);
1935 }
1936
1937 // Rewrite INSERT_SUBREG as COPY now that we no longer need SSA form.
1938 if (mi->isInsertSubreg()) {
1939 // From %reg = INSERT_SUBREG %reg, %subreg, subidx
1940 // To %reg:subidx = COPY %subreg
1941 unsigned SubIdx = mi->getOperand(3).getImm();
1942 mi->removeOperand(3);
1943 assert(mi->getOperand(0).getSubReg() == 0 && "Unexpected subreg idx");
1944 mi->getOperand(0).setSubReg(SubIdx);
1945 mi->getOperand(0).setIsUndef(mi->getOperand(1).isUndef());
1946 mi->removeOperand(1);
1947 mi->setDesc(TII->get(TargetOpcode::COPY));
1948 LLVM_DEBUG(dbgs() << "\t\tconvert to:\t" << *mi);
1949
1950 // Update LiveIntervals.
1951 if (LIS) {
1952 Register Reg = mi->getOperand(0).getReg();
1953 LiveInterval &LI = LIS->getInterval(Reg);
1954 if (LI.hasSubRanges()) {
1955 // The COPY no longer defines subregs of %reg except for
1956 // %reg.subidx.
1957 LaneBitmask LaneMask =
1958 TRI->getSubRegIndexLaneMask(mi->getOperand(0).getSubReg());
1959 SlotIndex Idx = LIS->getInstructionIndex(*mi).getRegSlot();
1960 for (auto &S : LI.subranges()) {
1961 if ((S.LaneMask & LaneMask).none()) {
1962 LiveRange::iterator DefSeg = S.FindSegmentContaining(Idx);
1963 if (mi->getOperand(0).isUndef()) {
1964 S.removeValNo(DefSeg->valno);
1965 } else {
1966 LiveRange::iterator UseSeg = std::prev(DefSeg);
1967 S.MergeValueNumberInto(DefSeg->valno, UseSeg->valno);
1968 }
1969 }
1970 }
1971
1972 // The COPY no longer has a use of %reg.
1973 LIS->shrinkToUses(&LI);
1974 } else {
1975 // The live interval for Reg did not have subranges but now it needs
1976 // them because we have introduced a subreg def. Recompute it.
1977 LIS->removeInterval(Reg);
1979 }
1980 }
1981 }
1982
1983 // Clear TiedOperands here instead of at the top of the loop
1984 // since most instructions do not have tied operands.
1985 TiedOperands.clear();
1986 removeClobberedSrcRegMap(&*mi);
1987 mi = nmi;
1988 }
1989 }
1990
1991 return MadeChange;
1992}
1993
1994/// Eliminate a REG_SEQUENCE instruction as part of the de-ssa process.
1995///
1996/// The instruction is turned into a sequence of sub-register copies:
1997///
1998/// %dst = REG_SEQUENCE %v1, ssub0, %v2, ssub1
1999///
2000/// Becomes:
2001///
2002/// undef %dst:ssub0 = COPY %v1
2003/// %dst:ssub1 = COPY %v2
2004void TwoAddressInstructionImpl::eliminateRegSequence(
2006 MachineInstr &MI = *MBBI;
2007 Register DstReg = MI.getOperand(0).getReg();
2008
2009 SmallVector<Register, 4> OrigRegs;
2010 VNInfo *DefVN = nullptr;
2011 if (LIS) {
2012 OrigRegs.push_back(MI.getOperand(0).getReg());
2013 for (unsigned i = 1, e = MI.getNumOperands(); i < e; i += 2)
2014 OrigRegs.push_back(MI.getOperand(i).getReg());
2015 if (LIS->hasInterval(DstReg)) {
2016 DefVN = LIS->getInterval(DstReg)
2018 .valueOut();
2019 }
2020 }
2021
2022 LaneBitmask UndefLanes = LaneBitmask::getNone();
2023 bool DefEmitted = false;
2024 for (unsigned i = 1, e = MI.getNumOperands(); i < e; i += 2) {
2025 MachineOperand &UseMO = MI.getOperand(i);
2026 Register SrcReg = UseMO.getReg();
2027 unsigned SubIdx = MI.getOperand(i+1).getImm();
2028 // Nothing needs to be inserted for undef operands.
2029 if (UseMO.isUndef()) {
2030 UndefLanes |= TRI->getSubRegIndexLaneMask(SubIdx);
2031 continue;
2032 }
2033
2034 // Defer any kill flag to the last operand using SrcReg. Otherwise, we
2035 // might insert a COPY that uses SrcReg after is was killed.
2036 bool isKill = UseMO.isKill();
2037 if (isKill)
2038 for (unsigned j = i + 2; j < e; j += 2)
2039 if (MI.getOperand(j).getReg() == SrcReg) {
2040 MI.getOperand(j).setIsKill();
2041 UseMO.setIsKill(false);
2042 isKill = false;
2043 break;
2044 }
2045
2046 // Insert the sub-register copy.
2047 MachineInstr *CopyMI = BuildMI(*MI.getParent(), MI, MI.getDebugLoc(),
2048 TII->get(TargetOpcode::COPY))
2049 .addReg(DstReg, RegState::Define, SubIdx)
2050 .add(UseMO);
2051
2052 // The first def needs an undef flag because there is no live register
2053 // before it.
2054 if (!DefEmitted) {
2055 CopyMI->getOperand(0).setIsUndef(true);
2056 // Return an iterator pointing to the first inserted instr.
2057 MBBI = CopyMI;
2058 }
2059 DefEmitted = true;
2060
2061 // Update LiveVariables' kill info.
2062 if (LV && isKill && !SrcReg.isPhysical())
2063 LV->replaceKillInstruction(SrcReg, MI, *CopyMI);
2064
2065 LLVM_DEBUG(dbgs() << "Inserted: " << *CopyMI);
2066 }
2067
2069 std::next(MachineBasicBlock::iterator(MI));
2070
2071 if (!DefEmitted) {
2072 LLVM_DEBUG(dbgs() << "Turned: " << MI << " into an IMPLICIT_DEF");
2073 MI.setDesc(TII->get(TargetOpcode::IMPLICIT_DEF));
2074 for (int j = MI.getNumOperands() - 1, ee = 0; j > ee; --j)
2075 MI.removeOperand(j);
2076 } else {
2077 if (LIS) {
2078 // Force live interval recomputation if we moved to a partial definition
2079 // of the register. Undef flags must be propagate to uses of undefined
2080 // subregister for accurate interval computation.
2081 if (UndefLanes.any() && DefVN && MRI->shouldTrackSubRegLiveness(DstReg)) {
2082 auto &LI = LIS->getInterval(DstReg);
2083 for (MachineOperand &UseOp : MRI->use_operands(DstReg)) {
2084 unsigned SubReg = UseOp.getSubReg();
2085 if (UseOp.isUndef() || !SubReg)
2086 continue;
2087 auto *VN =
2088 LI.getVNInfoAt(LIS->getInstructionIndex(*UseOp.getParent()));
2089 if (DefVN != VN)
2090 continue;
2091 LaneBitmask LaneMask = TRI->getSubRegIndexLaneMask(SubReg);
2092 if ((UndefLanes & LaneMask).any())
2093 UseOp.setIsUndef(true);
2094 }
2095 LIS->removeInterval(DstReg);
2096 }
2098 }
2099
2100 LLVM_DEBUG(dbgs() << "Eliminated: " << MI);
2101 MI.eraseFromParent();
2102 }
2103
2104 // Udpate LiveIntervals.
2105 if (LIS)
2106 LIS->repairIntervalsInRange(MBB, MBBI, EndMBBI, OrigRegs);
2107}
unsigned SubReg
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator MBBI
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file defines the DenseMap class.
#define DEBUG_TYPE
const HexagonInstrInfo * TII
#define _
IRTranslator LLVM IR MI
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
#define I(x, y, z)
Definition MD5.cpp:57
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
#define P(N)
FunctionAnalysisManager FAM
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
Remove Loads Into Fake Uses
SI Optimize VGPR LiveRange
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:114
static bool isTwoAddrUse(MachineInstr &MI, Register Reg, Register &DstReg)
Return true if the specified MI uses the specified register as a two-address use.
static MCRegister getMappedReg(Register Reg, DenseMap< Register, Register > &RegMap)
Return the physical register the specified virtual register might be mapped to.
static cl::opt< bool > EnableRescheduling("twoaddr-reschedule", cl::desc("Coalesce copies by rescheduling (default=true)"), cl::init(true), cl::Hidden)
static cl::opt< unsigned > MaxDataFlowEdge("dataflow-edge-limit", cl::Hidden, cl::init(3), cl::desc("Maximum number of dataflow edges to traverse when evaluating " "the benefit of commuting operands"))
A manager for alias analyses.
A wrapper pass to provide the legacy pass manager access to a suitably prepared AAResults object.
AnalysisUsage & addPreservedID(const void *ID)
AnalysisUsage & addUsedIfAvailable()
Add the specified Pass class to the set of analyses used by this pass.
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
Definition Pass.cpp:270
Represents analyses that only rely on functions' control flow.
Definition Analysis.h:73
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:178
bool erase(const KeyT &Val)
Definition DenseMap.h:322
iterator end()
Definition DenseMap.h:81
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:233
bool hasOptNone() const
Do not optimize this function (-O0).
Definition Function.h:700
unsigned getInstrLatency(const InstrItineraryData *ItinData, const MachineInstr &MI, unsigned *PredCost=nullptr) const override
Compute the instruction latency of a given instruction.
Itinerary data supplied by a subtarget to be used by a target.
bool hasSubRanges() const
Returns true if subregister liveness information is available.
iterator_range< subrange_iterator > subranges()
LLVM_ABI void repairIntervalsInRange(MachineBasicBlock *MBB, MachineBasicBlock::iterator Begin, MachineBasicBlock::iterator End, ArrayRef< Register > OrigRegs)
Update live intervals for instructions in a range of iterators.
bool hasInterval(Register Reg) const
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction associated with the given index.
SlotIndex InsertMachineInstrInMaps(MachineInstr &MI)
LLVM_ABI void handleMove(MachineInstr &MI, bool UpdateFlags=false)
Call this method to notify LiveIntervals that instruction MI has been moved within a basic block.
SlotIndex getInstructionIndex(const MachineInstr &Instr) const
Returns the base index of the given instruction.
void RemoveMachineInstrFromMaps(MachineInstr &MI)
VNInfo::Allocator & getVNInfoAllocator()
SlotIndex getMBBEndIdx(const MachineBasicBlock *mbb) const
Return the last index in the given basic block.
LiveInterval & getInterval(Register Reg)
void removeInterval(Register Reg)
Interval removal.
bool isNotInMIMap(const MachineInstr &Instr) const
Returns true if the specified machine instr has been removed or was never entered in the map.
LiveRange * getCachedRegUnit(MCRegUnit Unit)
Return the live range for register unit Unit if it has already been computed, or nullptr if it hasn't...
LLVM_ABI bool shrinkToUses(LiveInterval *li, SmallVectorImpl< MachineInstr * > *dead=nullptr)
After removing some uses of a register, shrink its live range to just the remaining uses.
LiveInterval & createAndComputeVirtRegInterval(Register Reg)
VNInfo * valueOut() const
Return the value leaving the instruction, if any.
This class represents the liveness of a register, stack slot, etc.
LLVM_ABI iterator addSegment(Segment S)
Add the specified Segment to this range, merging segments as appropriate.
const Segment * getSegmentContaining(SlotIndex Idx) const
Return the segment that contains the specified index, or null if there is none.
VNInfo * createValueCopy(const VNInfo *orig, VNInfo::Allocator &VNInfoAllocator)
Create a copy of the given value.
LiveQueryResult Query(SlotIndex Idx) const
Query Liveness at Idx.
iterator begin()
bool hasAtLeastOneValue() const
VNInfo * getNextValue(SlotIndex Def, VNInfo::Allocator &VNInfoAllocator)
getNextValue - Create a new value number and return it.
VNInfo * getVNInfoAt(SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
LLVM_ABI iterator find(SlotIndex Pos)
find - Return an iterator pointing to the first segment that ends after Pos, or end().
LLVM_ABI void replaceKillInstruction(Register Reg, MachineInstr &OldMI, MachineInstr &NewMI)
replaceKillInstruction - Update register kill info by replacing a kill instruction with a new one.
bool removeVirtualRegisterDead(Register Reg, MachineInstr &MI)
removeVirtualRegisterDead - Remove the specified kill of the virtual register from the live variable ...
bool removeVirtualRegisterKilled(Register Reg, MachineInstr &MI)
removeVirtualRegisterKilled - Remove the specified kill of the virtual register from the live variabl...
void addVirtualRegisterDead(Register IncomingReg, MachineInstr &MI, bool AddIfNotFound=false)
addVirtualRegisterDead - Add information about the fact that the specified register is dead after bei...
void addVirtualRegisterKilled(Register IncomingReg, MachineInstr &MI, bool AddIfNotFound=false)
addVirtualRegisterKilled - Add information about the fact that the specified register is killed after...
LLVM_ABI VarInfo & getVarInfo(Register Reg)
getVarInfo - Return the VarInfo structure for the specified VIRTUAL register.
unsigned getNumDefs() const
Return the number of MachineOperands that are register definitions.
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
An RAII based helper class to modify MachineFunctionProperties when running pass.
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
LLVM_ABI instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
Analysis pass which computes a MachineDominatorTree.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
void makeDebugValueSubstitution(DebugInstrOperandPair, DebugInstrOperandPair, unsigned SubReg=0)
Create a substitution between one <instr,operand> value to a different, new value.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineFunctionProperties & getProperties() const
Get the function properties.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
mop_range defs()
Returns all explicit operands that are register definitions.
bool isTerminator(QueryType Type=AnyInBundle) const
Returns true if this instruction part of the terminator for a basic block.
bool isCopy() const
bool isCopyLike() const
Return true if the instruction behaves like a copy.
bool isCall(QueryType Type=AnyInBundle) const
LLVM_ABI bool isSafeToMove(bool &SawStore) const
Return true if it is safe to move this instruction.
bool isBranch(QueryType Type=AnyInBundle) const
Returns true if this is a conditional, unconditional, or indirect branch.
mop_range operands()
LLVM_ABI bool hasUnmodeledSideEffects() const
Return true if this instruction has side effects that are not modeled by mayLoad / mayStore,...
LLVM_ABI unsigned getNumExplicitDefs() const
Returns the number of non-implicit definitions.
LLVM_ABI unsigned getDebugInstrNum()
Fetch the instruction number of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
Analysis pass that exposes the MachineLoopInfo for a machine function.
MachineOperand class - Representation of each machine instruction operand.
void setSubReg(unsigned subReg)
unsigned getSubReg() const
LLVM_ABI unsigned getOperandNo() const
Returns the index of this operand in the instruction that it belongs to.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isRegMask() const
isRegMask - Tests if this is a MO_RegisterMask operand.
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
void setIsKill(bool Val=true)
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
void setIsUndef(bool Val=true)
Register getReg() const
getReg - Returns the register number.
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
defusechain_iterator< false, true, false, true, false > def_iterator
def_iterator/def_begin/def_end - Walk all defs of the specified register.
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:83
static bool isSameInstr(SlotIndex A, SlotIndex B)
isSameInstr - Return true if A and B refer to the same instruction.
SlotIndex getBaseIndex() const
Returns the base index for associated with this index.
SlotIndex getPrevSlot() const
Returns the previous slot in the index list.
SlotIndex getRegSlot(bool EC=false) const
Returns the register use/def slot in the current instruction for a normal or early-clobber def.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetInstrInfo - Interface to description of machine instruction set.
static const unsigned CommuteAnyOperandIndex
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
BumpPtrAllocator Allocator
unsigned id
The ID number of this value.
IteratorT begin() const
Changed
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
Abstract Attribute helper functions.
Definition Attributor.h:165
constexpr bool any(E Val)
@ Define
Register definition.
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
constexpr double e
NodeAddr< DefNode * > Def
Definition RDFGraph.h:384
NodeAddr< FuncNode * > Func
Definition RDFGraph.h:393
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1725
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
LLVM_ABI char & MachineDominatorsID
MachineDominators - This pass is a machine dominators analysis pass.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
IterT skipDebugInstructionsForward(IterT It, IterT End, bool SkipPseudoOp=true)
Increment It until it points to a non-debug instruction or to End and return the resulting iterator.
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
Definition STLExtras.h:2128
LLVM_ABI char & MachineLoopInfoID
MachineLoopInfo - This pass is a loop analysis pass.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1732
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
@ Other
Any other memory.
Definition ModRef.h:68
iterator_range< MIBundleOperands > mi_bundle_ops(MachineInstr &MI)
LLVM_ABI void initializeTwoAddressInstructionLegacyPassPass(PassRegistry &)
LLVM_ABI char & TwoAddressInstructionPassID
TwoAddressInstruction - This pass reduces two-address instructions to use two operands.
AAResults AliasAnalysis
Temporary typedef for legacy code that uses a generic AliasAnalysis pointer or reference.
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
static constexpr LaneBitmask getAll()
Definition LaneBitmask.h:82
constexpr bool none() const
Definition LaneBitmask.h:52
constexpr bool any() const
Definition LaneBitmask.h:53
static constexpr LaneBitmask getNone()
Definition LaneBitmask.h:81
bool removeKill(MachineInstr &MI)
removeKill - Delete a kill corresponding to the specified machine instruction.
std::vector< MachineInstr * > Kills
Kills - List of MachineInstruction's which are the last use of this virtual register (kill it) in the...
SparseBitVector AliveBlocks
AliveBlocks - Set of blocks in which this value is alive completely through.
LLVM_ABI MachineInstr * findKill(const MachineBasicBlock *MBB) const
findKill - Find a kill instruction in MBB. Return NULL if none is found.