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 LLVM_DEBUG(dbgs() << "2addr: CONVERTING 2-ADDR: " << *mi);
798 LLVM_DEBUG(dbgs() << "2addr: TO 3-ADDR: " << *NewMI);
799
800 // If the old instruction is debug value tracked, an update is required.
801 if (auto OldInstrNum = mi->peekDebugInstrNum()) {
802 assert(mi->getNumExplicitDefs() == 1);
803 assert(NewMI->getNumExplicitDefs() == 1);
804
805 // Find the old and new def location.
806 unsigned OldIdx = mi->defs().begin()->getOperandNo();
807 unsigned NewIdx = NewMI->defs().begin()->getOperandNo();
808
809 // Record that one def has been replaced by the other.
810 unsigned NewInstrNum = NewMI->getDebugInstrNum();
811 MF->makeDebugValueSubstitution(std::make_pair(OldInstrNum, OldIdx),
812 std::make_pair(NewInstrNum, NewIdx));
813 }
814
815 MBB->erase(mi); // Nuke the old inst.
816
817 for (MachineInstr &MI : MIS)
818 DistanceMap.insert(std::make_pair(&MI, Dist++));
819 Dist--;
820 mi = NewMI;
821 nmi = std::next(mi);
822
823 // Update source and destination register maps.
824 SrcRegMap.erase(RegA);
825 DstRegMap.erase(RegB);
826 return true;
827}
828
829/// Scan forward recursively for only uses, update maps if the use is a copy or
830/// a two-address instruction.
831void TwoAddressInstructionImpl::scanUses(Register DstReg) {
832 SmallVector<Register, 4> VirtRegPairs;
833 bool IsDstPhys;
834 bool IsCopy = false;
835 Register NewReg;
836 Register Reg = DstReg;
837 while (MachineInstr *UseMI =
838 findOnlyInterestingUse(Reg, MBB, IsCopy, NewReg, IsDstPhys)) {
839 if (IsCopy && !Processed.insert(UseMI).second)
840 break;
841
842 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.find(UseMI);
843 if (DI != DistanceMap.end())
844 // Earlier in the same MBB.Reached via a back edge.
845 break;
846
847 if (IsDstPhys) {
848 VirtRegPairs.push_back(NewReg);
849 break;
850 }
851 SrcRegMap[NewReg] = Reg;
852 VirtRegPairs.push_back(NewReg);
853 Reg = NewReg;
854 }
855
856 if (!VirtRegPairs.empty()) {
857 Register ToReg = VirtRegPairs.pop_back_val();
858 while (!VirtRegPairs.empty()) {
859 Register FromReg = VirtRegPairs.pop_back_val();
860 bool isNew = DstRegMap.insert(std::make_pair(FromReg, ToReg)).second;
861 if (!isNew)
862 assert(DstRegMap[FromReg] == ToReg &&"Can't map to two dst registers!");
863 ToReg = FromReg;
864 }
865 bool isNew = DstRegMap.insert(std::make_pair(DstReg, ToReg)).second;
866 if (!isNew)
867 assert(DstRegMap[DstReg] == ToReg && "Can't map to two dst registers!");
868 }
869}
870
871/// If the specified instruction is not yet processed, process it if it's a
872/// copy. For a copy instruction, we find the physical registers the
873/// source and destination registers might be mapped to. These are kept in
874/// point-to maps used to determine future optimizations. e.g.
875/// v1024 = mov r0
876/// v1025 = mov r1
877/// v1026 = add v1024, v1025
878/// r1 = mov r1026
879/// If 'add' is a two-address instruction, v1024, v1026 are both potentially
880/// coalesced to r0 (from the input side). v1025 is mapped to r1. v1026 is
881/// potentially joined with r1 on the output side. It's worthwhile to commute
882/// 'add' to eliminate a copy.
883void TwoAddressInstructionImpl::processCopy(MachineInstr *MI) {
884 if (Processed.count(MI))
885 return;
886
887 bool IsSrcPhys, IsDstPhys;
888 Register SrcReg, DstReg;
889 if (!isCopyToReg(*MI, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
890 return;
891
892 if (IsDstPhys && !IsSrcPhys) {
893 DstRegMap.insert(std::make_pair(SrcReg, DstReg));
894 } else if (!IsDstPhys && IsSrcPhys) {
895 bool isNew = SrcRegMap.insert(std::make_pair(DstReg, SrcReg)).second;
896 if (!isNew)
897 assert(SrcRegMap[DstReg] == SrcReg &&
898 "Can't map to two src physical registers!");
899
900 scanUses(DstReg);
901 }
902
903 Processed.insert(MI);
904}
905
906/// If there is one more local instruction that reads 'Reg' and it kills 'Reg,
907/// consider moving the instruction below the kill instruction in order to
908/// eliminate the need for the copy.
909bool TwoAddressInstructionImpl::rescheduleMIBelowKill(
911 Register Reg) {
912 // Bail immediately if we don't have LV or LIS available. We use them to find
913 // kills efficiently.
914 if (!LV && !LIS)
915 return false;
916
917 MachineInstr *MI = &*mi;
918 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.find(MI);
919 if (DI == DistanceMap.end())
920 // Must be created from unfolded load. Don't waste time trying this.
921 return false;
922
923 MachineInstr *KillMI = nullptr;
924 if (LIS) {
925 LiveInterval &LI = LIS->getInterval(Reg);
926 assert(LI.end() != LI.begin() &&
927 "Reg should not have empty live interval.");
928
929 SlotIndex MBBEndIdx = LIS->getMBBEndIdx(MBB).getPrevSlot();
930 LiveInterval::const_iterator I = LI.find(MBBEndIdx);
931 if (I != LI.end() && I->start < MBBEndIdx)
932 return false;
933
934 --I;
935 KillMI = LIS->getInstructionFromIndex(I->end);
936 } else {
937 KillMI = LV->getVarInfo(Reg).findKill(MBB);
938 }
939 if (!KillMI || MI == KillMI || KillMI->isCopy() || KillMI->isCopyLike())
940 // Don't mess with copies, they may be coalesced later.
941 return false;
942
943 if (KillMI->hasUnmodeledSideEffects() || KillMI->isCall() ||
944 KillMI->isBranch() || KillMI->isTerminator())
945 // Don't move pass calls, etc.
946 return false;
947
948 Register DstReg;
949 if (isTwoAddrUse(*KillMI, Reg, DstReg))
950 return false;
951
952 bool SeenStore = true;
953 if (!MI->isSafeToMove(SeenStore))
954 return false;
955
956 if (TII->getInstrLatency(InstrItins, *MI) > 1)
957 // FIXME: Needs more sophisticated heuristics.
958 return false;
959
963 for (const MachineOperand &MO : MI->operands()) {
964 if (!MO.isReg())
965 continue;
966 Register MOReg = MO.getReg();
967 if (!MOReg)
968 continue;
969 if (MO.isDef())
970 Defs.push_back(MOReg);
971 else {
972 Uses.push_back(MOReg);
973 if (MOReg != Reg && isPlainlyKilled(MO))
974 Kills.push_back(MOReg);
975 }
976 }
977
978 // Move the copies connected to MI down as well.
980 MachineBasicBlock::iterator AfterMI = std::next(Begin);
981 MachineBasicBlock::iterator End = AfterMI;
982 while (End != MBB->end()) {
983 End = skipDebugInstructionsForward(End, MBB->end());
984 if (End->isCopy() && regOverlapsSet(Defs, End->getOperand(1).getReg()))
985 Defs.push_back(End->getOperand(0).getReg());
986 else
987 break;
988 ++End;
989 }
990
991 // Check if the reschedule will not break dependencies.
992 unsigned NumVisited = 0;
993 MachineBasicBlock::iterator KillPos = KillMI;
994 ++KillPos;
995 for (MachineInstr &OtherMI : make_range(End, KillPos)) {
996 // Debug or pseudo instructions cannot be counted against the limit.
997 if (OtherMI.isDebugOrPseudoInstr())
998 continue;
999 if (NumVisited > 10) // FIXME: Arbitrary limit to reduce compile time cost.
1000 return false;
1001 ++NumVisited;
1002 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1003 OtherMI.isBranch() || OtherMI.isTerminator())
1004 // Don't move pass calls, etc.
1005 return false;
1006 for (const MachineOperand &MO : OtherMI.operands()) {
1007 if (!MO.isReg())
1008 continue;
1009 Register MOReg = MO.getReg();
1010 if (!MOReg)
1011 continue;
1012 if (MO.isDef()) {
1013 if (regOverlapsSet(Uses, MOReg))
1014 // Physical register use would be clobbered.
1015 return false;
1016 if (!MO.isDead() && regOverlapsSet(Defs, MOReg))
1017 // May clobber a physical register def.
1018 // FIXME: This may be too conservative. It's ok if the instruction
1019 // is sunken completely below the use.
1020 return false;
1021 } else {
1022 if (regOverlapsSet(Defs, MOReg))
1023 return false;
1024 bool isKill = isPlainlyKilled(MO);
1025 if (MOReg != Reg && ((isKill && regOverlapsSet(Uses, MOReg)) ||
1026 regOverlapsSet(Kills, MOReg)))
1027 // Don't want to extend other live ranges and update kills.
1028 return false;
1029 if (MOReg == Reg && !isKill)
1030 // We can't schedule across a use of the register in question.
1031 return false;
1032 // Ensure that if this is register in question, its the kill we expect.
1033 assert((MOReg != Reg || &OtherMI == KillMI) &&
1034 "Found multiple kills of a register in a basic block");
1035 }
1036 }
1037 }
1038
1039 // Move debug info as well.
1040 while (Begin != MBB->begin() && std::prev(Begin)->isDebugInstr())
1041 --Begin;
1042
1043 nmi = End;
1044 MachineBasicBlock::iterator InsertPos = KillPos;
1045 if (LIS) {
1046 // We have to move the copies (and any interleaved debug instructions)
1047 // first so that the MBB is still well-formed when calling handleMove().
1048 for (MachineBasicBlock::iterator MBBI = AfterMI; MBBI != End;) {
1049 auto CopyMI = MBBI++;
1050 MBB->splice(InsertPos, MBB, CopyMI);
1051 if (!CopyMI->isDebugOrPseudoInstr())
1052 LIS->handleMove(*CopyMI);
1053 InsertPos = CopyMI;
1054 }
1055 End = std::next(MachineBasicBlock::iterator(MI));
1056 }
1057
1058 // Copies following MI may have been moved as well.
1059 MBB->splice(InsertPos, MBB, Begin, End);
1060 DistanceMap.erase(DI);
1061
1062 // Update live variables
1063 if (LIS) {
1064 LIS->handleMove(*MI);
1065 } else {
1066 LV->removeVirtualRegisterKilled(Reg, *KillMI);
1068 }
1069
1070 LLVM_DEBUG(dbgs() << "\trescheduled below kill: " << *KillMI);
1071 return true;
1072}
1073
1074/// Return true if the re-scheduling will put the given instruction too close
1075/// to the defs of its register dependencies.
1076bool TwoAddressInstructionImpl::isDefTooClose(Register Reg, unsigned Dist,
1077 MachineInstr *MI) {
1078 for (MachineInstr &DefMI : MRI->def_instructions(Reg)) {
1079 if (DefMI.getParent() != MBB || DefMI.isCopy() || DefMI.isCopyLike())
1080 continue;
1081 if (&DefMI == MI)
1082 return true; // MI is defining something KillMI uses
1083 DenseMap<MachineInstr*, unsigned>::iterator DDI = DistanceMap.find(&DefMI);
1084 if (DDI == DistanceMap.end())
1085 return true; // Below MI
1086 unsigned DefDist = DDI->second;
1087 assert(Dist > DefDist && "Visited def already?");
1088 if (TII->getInstrLatency(InstrItins, DefMI) > (Dist - DefDist))
1089 return true;
1090 }
1091 return false;
1092}
1093
1094/// If there is one more local instruction that reads 'Reg' and it kills 'Reg,
1095/// consider moving the kill instruction above the current two-address
1096/// instruction in order to eliminate the need for the copy.
1097bool TwoAddressInstructionImpl::rescheduleKillAboveMI(
1099 Register Reg) {
1100 // Bail immediately if we don't have LV or LIS available. We use them to find
1101 // kills efficiently.
1102 if (!LV && !LIS)
1103 return false;
1104
1105 MachineInstr *MI = &*mi;
1106 DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.find(MI);
1107 if (DI == DistanceMap.end())
1108 // Must be created from unfolded load. Don't waste time trying this.
1109 return false;
1110
1111 MachineInstr *KillMI = nullptr;
1112 if (LIS) {
1113 LiveInterval &LI = LIS->getInterval(Reg);
1114 assert(LI.end() != LI.begin() &&
1115 "Reg should not have empty live interval.");
1116
1117 SlotIndex MBBEndIdx = LIS->getMBBEndIdx(MBB).getPrevSlot();
1118 LiveInterval::const_iterator I = LI.find(MBBEndIdx);
1119 if (I != LI.end() && I->start < MBBEndIdx)
1120 return false;
1121
1122 --I;
1123 KillMI = LIS->getInstructionFromIndex(I->end);
1124 } else {
1125 KillMI = LV->getVarInfo(Reg).findKill(MBB);
1126 }
1127 if (!KillMI || MI == KillMI || KillMI->isCopy() || KillMI->isCopyLike())
1128 // Don't mess with copies, they may be coalesced later.
1129 return false;
1130
1131 Register DstReg;
1132 if (isTwoAddrUse(*KillMI, Reg, DstReg))
1133 return false;
1134
1135 bool SeenStore = true;
1136 if (!KillMI->isSafeToMove(SeenStore))
1137 return false;
1138
1142 SmallVector<Register, 2> LiveDefs;
1143 for (const MachineOperand &MO : KillMI->operands()) {
1144 if (!MO.isReg())
1145 continue;
1146 Register MOReg = MO.getReg();
1147 if (MO.isUse()) {
1148 if (!MOReg)
1149 continue;
1150 if (isDefTooClose(MOReg, DI->second, MI))
1151 return false;
1152 bool isKill = isPlainlyKilled(MO);
1153 if (MOReg == Reg && !isKill)
1154 return false;
1155 Uses.push_back(MOReg);
1156 if (isKill && MOReg != Reg)
1157 Kills.push_back(MOReg);
1158 } else if (MOReg.isPhysical()) {
1159 Defs.push_back(MOReg);
1160 if (!MO.isDead())
1161 LiveDefs.push_back(MOReg);
1162 }
1163 }
1164
1165 // Check if the reschedule will not break dependencies.
1166 unsigned NumVisited = 0;
1167 for (MachineInstr &OtherMI :
1169 // Debug or pseudo instructions cannot be counted against the limit.
1170 if (OtherMI.isDebugOrPseudoInstr())
1171 continue;
1172 if (NumVisited > 10) // FIXME: Arbitrary limit to reduce compile time cost.
1173 return false;
1174 ++NumVisited;
1175 if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
1176 OtherMI.isBranch() || OtherMI.isTerminator())
1177 // Don't move pass calls, etc.
1178 return false;
1179 SmallVector<Register, 2> OtherDefs;
1180 for (const MachineOperand &MO : OtherMI.operands()) {
1181 if (!MO.isReg())
1182 continue;
1183 Register MOReg = MO.getReg();
1184 if (!MOReg)
1185 continue;
1186 if (MO.isUse()) {
1187 if (regOverlapsSet(Defs, MOReg))
1188 // Moving KillMI can clobber the physical register if the def has
1189 // not been seen.
1190 return false;
1191 if (regOverlapsSet(Kills, MOReg))
1192 // Don't want to extend other live ranges and update kills.
1193 return false;
1194 if (&OtherMI != MI && MOReg == Reg && !isPlainlyKilled(MO))
1195 // We can't schedule across a use of the register in question.
1196 return false;
1197 } else {
1198 OtherDefs.push_back(MOReg);
1199 }
1200 }
1201
1202 for (Register MOReg : OtherDefs) {
1203 if (regOverlapsSet(Uses, MOReg))
1204 return false;
1205 if (MOReg.isPhysical() && regOverlapsSet(LiveDefs, MOReg))
1206 return false;
1207 // Physical register def is seen.
1208 llvm::erase(Defs, MOReg);
1209 }
1210 }
1211
1212 // Move the old kill above MI, don't forget to move debug info as well.
1213 MachineBasicBlock::iterator InsertPos = mi;
1214 while (InsertPos != MBB->begin() && std::prev(InsertPos)->isDebugInstr())
1215 --InsertPos;
1216 MachineBasicBlock::iterator From = KillMI;
1217 MachineBasicBlock::iterator To = std::next(From);
1218 while (std::prev(From)->isDebugInstr())
1219 --From;
1220 MBB->splice(InsertPos, MBB, From, To);
1221
1222 nmi = std::prev(InsertPos); // Backtrack so we process the moved instr.
1223 DistanceMap.erase(DI);
1224
1225 // Update live variables
1226 if (LIS) {
1227 LIS->handleMove(*KillMI);
1228 } else {
1229 LV->removeVirtualRegisterKilled(Reg, *KillMI);
1231 }
1232
1233 LLVM_DEBUG(dbgs() << "\trescheduled kill: " << *KillMI);
1234 return true;
1235}
1236
1237/// Tries to commute the operand 'BaseOpIdx' and some other operand in the
1238/// given machine instruction to improve opportunities for coalescing and
1239/// elimination of a register to register copy.
1240///
1241/// 'DstOpIdx' specifies the index of MI def operand.
1242/// 'BaseOpKilled' specifies if the register associated with 'BaseOpIdx'
1243/// operand is killed by the given instruction.
1244/// The 'Dist' arguments provides the distance of MI from the start of the
1245/// current basic block and it is used to determine if it is profitable
1246/// to commute operands in the instruction.
1247///
1248/// Returns true if the transformation happened. Otherwise, returns false.
1249bool TwoAddressInstructionImpl::tryInstructionCommute(MachineInstr *MI,
1250 unsigned DstOpIdx,
1251 unsigned BaseOpIdx,
1252 bool BaseOpKilled,
1253 unsigned Dist) {
1254 if (!MI->isCommutable())
1255 return false;
1256
1257 bool MadeChange = false;
1258 Register DstOpReg = MI->getOperand(DstOpIdx).getReg();
1259 Register BaseOpReg = MI->getOperand(BaseOpIdx).getReg();
1260 unsigned OpsNum = MI->getDesc().getNumOperands();
1261 unsigned OtherOpIdx = MI->getDesc().getNumDefs();
1262 for (; OtherOpIdx < OpsNum; OtherOpIdx++) {
1263 // The call of findCommutedOpIndices below only checks if BaseOpIdx
1264 // and OtherOpIdx are commutable, it does not really search for
1265 // other commutable operands and does not change the values of passed
1266 // variables.
1267 if (OtherOpIdx == BaseOpIdx || !MI->getOperand(OtherOpIdx).isReg() ||
1268 !TII->findCommutedOpIndices(*MI, BaseOpIdx, OtherOpIdx))
1269 continue;
1270
1271 Register OtherOpReg = MI->getOperand(OtherOpIdx).getReg();
1272 bool AggressiveCommute = false;
1273
1274 // If OtherOp dies but BaseOp does not, swap the OtherOp and BaseOp
1275 // operands. This makes the live ranges of DstOp and OtherOp joinable.
1276 bool OtherOpKilled = isKilled(*MI, OtherOpReg, false);
1277 bool DoCommute = !BaseOpKilled && OtherOpKilled;
1278
1279 if (!DoCommute &&
1280 isProfitableToCommute(DstOpReg, BaseOpReg, OtherOpReg, MI, Dist)) {
1281 DoCommute = true;
1282 AggressiveCommute = true;
1283 }
1284
1285 // If it's profitable to commute, try to do so.
1286 if (DoCommute && commuteInstruction(MI, DstOpIdx, BaseOpIdx, OtherOpIdx,
1287 Dist)) {
1288 MadeChange = true;
1289 ++NumCommuted;
1290 if (AggressiveCommute)
1291 ++NumAggrCommuted;
1292
1293 // There might be more than two commutable operands, update BaseOp and
1294 // continue scanning.
1295 // FIXME: This assumes that the new instruction's operands are in the
1296 // same positions and were simply swapped.
1297 BaseOpReg = OtherOpReg;
1298 BaseOpKilled = OtherOpKilled;
1299 // Resamples OpsNum in case the number of operands was reduced. This
1300 // happens with X86.
1301 OpsNum = MI->getDesc().getNumOperands();
1302 }
1303 }
1304 return MadeChange;
1305}
1306
1307/// For the case where an instruction has a single pair of tied register
1308/// operands, attempt some transformations that may either eliminate the tied
1309/// operands or improve the opportunities for coalescing away the register copy.
1310/// Returns true if no copy needs to be inserted to untie mi's operands
1311/// (either because they were untied, or because mi was rescheduled, and will
1312/// be visited again later). If the shouldOnlyCommute flag is true, only
1313/// instruction commutation is attempted.
1314bool TwoAddressInstructionImpl::tryInstructionTransform(
1316 unsigned SrcIdx, unsigned DstIdx, unsigned &Dist, bool shouldOnlyCommute) {
1317 if (OptLevel == CodeGenOptLevel::None)
1318 return false;
1319
1320 MachineInstr &MI = *mi;
1321 Register regA = MI.getOperand(DstIdx).getReg();
1322 Register regB = MI.getOperand(SrcIdx).getReg();
1323
1324 assert(regB.isVirtual() && "cannot make instruction into two-address form");
1325 bool regBKilled = isKilled(MI, regB, true);
1326
1327 if (regA.isVirtual())
1328 scanUses(regA);
1329
1330 bool Commuted = tryInstructionCommute(&MI, DstIdx, SrcIdx, regBKilled, Dist);
1331
1332 // If the instruction is convertible to 3 Addr, instead
1333 // of returning try 3 Addr transformation aggressively and
1334 // use this variable to check later. Because it might be better.
1335 // For example, we can just use `leal (%rsi,%rdi), %eax` and `ret`
1336 // instead of the following code.
1337 // addl %esi, %edi
1338 // movl %edi, %eax
1339 // ret
1340 if (Commuted && !MI.isConvertibleTo3Addr())
1341 return false;
1342
1343 if (shouldOnlyCommute)
1344 return false;
1345
1346 // If there is one more use of regB later in the same MBB, consider
1347 // re-schedule this MI below it.
1348 if (!Commuted && EnableRescheduling && rescheduleMIBelowKill(mi, nmi, regB)) {
1349 ++NumReSchedDowns;
1350 return true;
1351 }
1352
1353 // If we commuted, regB may have changed so we should re-sample it to avoid
1354 // confusing the three address conversion below.
1355 if (Commuted) {
1356 regB = MI.getOperand(SrcIdx).getReg();
1357 regBKilled = isKilled(MI, regB, true);
1358 }
1359
1360 if (MI.isConvertibleTo3Addr()) {
1361 // This instruction is potentially convertible to a true
1362 // three-address instruction. Check if it is profitable.
1363 if (!regBKilled || isProfitableToConv3Addr(regA, regB)) {
1364 // Try to convert it.
1365 if (convertInstTo3Addr(mi, nmi, regA, regB, Dist)) {
1366 ++NumConvertedTo3Addr;
1367 return true; // Done with this instruction.
1368 }
1369 }
1370 }
1371
1372 // Return if it is commuted but 3 addr conversion is failed.
1373 if (Commuted)
1374 return false;
1375
1376 // If there is one more use of regB later in the same MBB, consider
1377 // re-schedule it before this MI if it's legal.
1378 if (EnableRescheduling && rescheduleKillAboveMI(mi, nmi, regB)) {
1379 ++NumReSchedUps;
1380 return true;
1381 }
1382
1383 // If this is an instruction with a load folded into it, try unfolding
1384 // the load, e.g. avoid this:
1385 // movq %rdx, %rcx
1386 // addq (%rax), %rcx
1387 // in favor of this:
1388 // movq (%rax), %rcx
1389 // addq %rdx, %rcx
1390 // because it's preferable to schedule a load than a register copy.
1391 if (MI.mayLoad() && !regBKilled) {
1392 // Determine if a load can be unfolded.
1393 unsigned LoadRegIndex;
1394 unsigned NewOpc =
1395 TII->getOpcodeAfterMemoryUnfold(MI.getOpcode(),
1396 /*UnfoldLoad=*/true,
1397 /*UnfoldStore=*/false,
1398 &LoadRegIndex);
1399 if (NewOpc != 0) {
1400 const MCInstrDesc &UnfoldMCID = TII->get(NewOpc);
1401 if (UnfoldMCID.getNumDefs() == 1) {
1402 // Unfold the load.
1403 LLVM_DEBUG(dbgs() << "2addr: UNFOLDING: " << MI);
1404 const TargetRegisterClass *RC = TRI->getAllocatableClass(
1405 TII->getRegClass(UnfoldMCID, LoadRegIndex, TRI));
1406 Register Reg = MRI->createVirtualRegister(RC);
1407 SmallVector<MachineInstr *, 2> NewMIs;
1408 if (!TII->unfoldMemoryOperand(*MF, MI, Reg,
1409 /*UnfoldLoad=*/true,
1410 /*UnfoldStore=*/false, NewMIs)) {
1411 LLVM_DEBUG(dbgs() << "2addr: ABANDONING UNFOLD\n");
1412 return false;
1413 }
1414 assert(NewMIs.size() == 2 &&
1415 "Unfolded a load into multiple instructions!");
1416 // The load was previously folded, so this is the only use.
1417 NewMIs[1]->addRegisterKilled(Reg, TRI);
1418
1419 // Tentatively insert the instructions into the block so that they
1420 // look "normal" to the transformation logic.
1421 MBB->insert(mi, NewMIs[0]);
1422 MBB->insert(mi, NewMIs[1]);
1423 DistanceMap.insert(std::make_pair(NewMIs[0], Dist++));
1424 DistanceMap.insert(std::make_pair(NewMIs[1], Dist));
1425
1426 LLVM_DEBUG(dbgs() << "2addr: NEW LOAD: " << *NewMIs[0]
1427 << "2addr: NEW INST: " << *NewMIs[1]);
1428
1429 // Transform the instruction, now that it no longer has a load.
1430 unsigned NewDstIdx =
1431 NewMIs[1]->findRegisterDefOperandIdx(regA, /*TRI=*/nullptr);
1432 unsigned NewSrcIdx =
1433 NewMIs[1]->findRegisterUseOperandIdx(regB, /*TRI=*/nullptr);
1434 MachineBasicBlock::iterator NewMI = NewMIs[1];
1435 bool TransformResult =
1436 tryInstructionTransform(NewMI, mi, NewSrcIdx, NewDstIdx, Dist, true);
1437 (void)TransformResult;
1438 assert(!TransformResult &&
1439 "tryInstructionTransform() should return false.");
1440 if (NewMIs[1]->getOperand(NewSrcIdx).isKill()) {
1441 // Success, or at least we made an improvement. Keep the unfolded
1442 // instructions and discard the original.
1443 if (LV) {
1444 for (const MachineOperand &MO : MI.operands()) {
1445 if (MO.isReg() && MO.getReg().isVirtual()) {
1446 if (MO.isUse()) {
1447 if (MO.isKill()) {
1448 if (NewMIs[0]->killsRegister(MO.getReg(), /*TRI=*/nullptr))
1449 LV->replaceKillInstruction(MO.getReg(), MI, *NewMIs[0]);
1450 else {
1451 assert(NewMIs[1]->killsRegister(MO.getReg(),
1452 /*TRI=*/nullptr) &&
1453 "Kill missing after load unfold!");
1454 LV->replaceKillInstruction(MO.getReg(), MI, *NewMIs[1]);
1455 }
1456 }
1457 } else if (LV->removeVirtualRegisterDead(MO.getReg(), MI)) {
1458 if (NewMIs[1]->registerDefIsDead(MO.getReg(),
1459 /*TRI=*/nullptr))
1460 LV->addVirtualRegisterDead(MO.getReg(), *NewMIs[1]);
1461 else {
1462 assert(NewMIs[0]->registerDefIsDead(MO.getReg(),
1463 /*TRI=*/nullptr) &&
1464 "Dead flag missing after load unfold!");
1465 LV->addVirtualRegisterDead(MO.getReg(), *NewMIs[0]);
1466 }
1467 }
1468 }
1469 }
1470 LV->addVirtualRegisterKilled(Reg, *NewMIs[1]);
1471 }
1472
1473 SmallVector<Register, 4> OrigRegs;
1474 if (LIS) {
1475 for (const MachineOperand &MO : MI.operands()) {
1476 if (MO.isReg())
1477 OrigRegs.push_back(MO.getReg());
1478 }
1479
1481 }
1482
1483 MI.eraseFromParent();
1484 DistanceMap.erase(&MI);
1485
1486 // Update LiveIntervals.
1487 if (LIS) {
1488 MachineBasicBlock::iterator Begin(NewMIs[0]);
1489 MachineBasicBlock::iterator End(NewMIs[1]);
1490 LIS->repairIntervalsInRange(MBB, Begin, End, OrigRegs);
1491 }
1492
1493 mi = NewMIs[1];
1494 } else {
1495 // Transforming didn't eliminate the tie and didn't lead to an
1496 // improvement. Clean up the unfolded instructions and keep the
1497 // original.
1498 LLVM_DEBUG(dbgs() << "2addr: ABANDONING UNFOLD\n");
1499 NewMIs[0]->eraseFromParent();
1500 NewMIs[1]->eraseFromParent();
1501 DistanceMap.erase(NewMIs[0]);
1502 DistanceMap.erase(NewMIs[1]);
1503 Dist--;
1504 }
1505 }
1506 }
1507 }
1508
1509 return false;
1510}
1511
1512// Collect tied operands of MI that need to be handled.
1513// Rewrite trivial cases immediately.
1514// Return true if any tied operands where found, including the trivial ones.
1515bool TwoAddressInstructionImpl::collectTiedOperands(
1516 MachineInstr *MI, TiedOperandMap &TiedOperands) {
1517 bool AnyOps = false;
1518 unsigned NumOps = MI->getNumOperands();
1519
1520 for (unsigned SrcIdx = 0; SrcIdx < NumOps; ++SrcIdx) {
1521 unsigned DstIdx = 0;
1522 if (!MI->isRegTiedToDefOperand(SrcIdx, &DstIdx))
1523 continue;
1524 AnyOps = true;
1525 MachineOperand &SrcMO = MI->getOperand(SrcIdx);
1526 MachineOperand &DstMO = MI->getOperand(DstIdx);
1527 Register SrcReg = SrcMO.getReg();
1528 Register DstReg = DstMO.getReg();
1529 // Tied constraint already satisfied?
1530 if (SrcReg == DstReg)
1531 continue;
1532
1533 assert(SrcReg && SrcMO.isUse() && "two address instruction invalid");
1534
1535 // Deal with undef uses immediately - simply rewrite the src operand.
1536 if (SrcMO.isUndef() && !DstMO.getSubReg()) {
1537 // Constrain the DstReg register class if required.
1538 if (DstReg.isVirtual()) {
1539 const TargetRegisterClass *RC = MRI->getRegClass(SrcReg);
1540 MRI->constrainRegClass(DstReg, RC);
1541 }
1542 SrcMO.setReg(DstReg);
1543 SrcMO.setSubReg(0);
1544 LLVM_DEBUG(dbgs() << "\t\trewrite undef:\t" << *MI);
1545 continue;
1546 }
1547 TiedOperands[SrcReg].push_back(std::make_pair(SrcIdx, DstIdx));
1548 }
1549 return AnyOps;
1550}
1551
1552// Process a list of tied MI operands that all use the same source register.
1553// The tied pairs are of the form (SrcIdx, DstIdx).
1554void TwoAddressInstructionImpl::processTiedPairs(MachineInstr *MI,
1555 TiedPairList &TiedPairs,
1556 unsigned &Dist) {
1557 bool IsEarlyClobber = llvm::any_of(TiedPairs, [MI](auto const &TP) {
1558 return MI->getOperand(TP.second).isEarlyClobber();
1559 });
1560
1561 bool RemovedKillFlag = false;
1562 bool AllUsesCopied = true;
1563 Register LastCopiedReg;
1564 SlotIndex LastCopyIdx;
1565 Register RegB = 0;
1566 unsigned SubRegB = 0;
1567 for (auto &TP : TiedPairs) {
1568 unsigned SrcIdx = TP.first;
1569 unsigned DstIdx = TP.second;
1570
1571 const MachineOperand &DstMO = MI->getOperand(DstIdx);
1572 Register RegA = DstMO.getReg();
1573
1574 // Grab RegB from the instruction because it may have changed if the
1575 // instruction was commuted.
1576 RegB = MI->getOperand(SrcIdx).getReg();
1577 SubRegB = MI->getOperand(SrcIdx).getSubReg();
1578
1579 if (RegA == RegB) {
1580 // The register is tied to multiple destinations (or else we would
1581 // not have continued this far), but this use of the register
1582 // already matches the tied destination. Leave it.
1583 AllUsesCopied = false;
1584 continue;
1585 }
1586 LastCopiedReg = RegA;
1587
1588 assert(RegB.isVirtual() && "cannot make instruction into two-address form");
1589
1590#ifndef NDEBUG
1591 // First, verify that we don't have a use of "a" in the instruction
1592 // (a = b + a for example) because our transformation will not
1593 // work. This should never occur because we are in SSA form.
1594 for (unsigned i = 0; i != MI->getNumOperands(); ++i)
1595 assert(i == DstIdx ||
1596 !MI->getOperand(i).isReg() ||
1597 MI->getOperand(i).getReg() != RegA);
1598#endif
1599
1600 // Emit a copy.
1601 MachineInstrBuilder MIB = BuildMI(*MI->getParent(), MI, MI->getDebugLoc(),
1602 TII->get(TargetOpcode::COPY), RegA);
1603 // If this operand is folding a truncation, the truncation now moves to the
1604 // copy so that the register classes remain valid for the operands.
1605 MIB.addReg(RegB, 0, SubRegB);
1606 const TargetRegisterClass *RC = MRI->getRegClass(RegB);
1607 if (SubRegB) {
1608 if (RegA.isVirtual()) {
1609 assert(TRI->getMatchingSuperRegClass(RC, MRI->getRegClass(RegA),
1610 SubRegB) &&
1611 "tied subregister must be a truncation");
1612 // The superreg class will not be used to constrain the subreg class.
1613 RC = nullptr;
1614 } else {
1615 assert(TRI->getMatchingSuperReg(RegA, SubRegB, MRI->getRegClass(RegB))
1616 && "tied subregister must be a truncation");
1617 }
1618 }
1619
1620 // Update DistanceMap.
1622 --PrevMI;
1623 DistanceMap.insert(std::make_pair(&*PrevMI, Dist));
1624 DistanceMap[MI] = ++Dist;
1625
1626 if (LIS) {
1627 LastCopyIdx = LIS->InsertMachineInstrInMaps(*PrevMI).getRegSlot();
1628
1629 SlotIndex endIdx =
1630 LIS->getInstructionIndex(*MI).getRegSlot(IsEarlyClobber);
1631 if (RegA.isVirtual()) {
1632 LiveInterval &LI = LIS->getInterval(RegA);
1633 VNInfo *VNI = LI.getNextValue(LastCopyIdx, LIS->getVNInfoAllocator());
1634 LI.addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1635 for (auto &S : LI.subranges()) {
1636 VNI = S.getNextValue(LastCopyIdx, LIS->getVNInfoAllocator());
1637 S.addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1638 }
1639 } else {
1640 for (MCRegUnit Unit : TRI->regunits(RegA)) {
1641 if (LiveRange *LR = LIS->getCachedRegUnit(Unit)) {
1642 VNInfo *VNI =
1643 LR->getNextValue(LastCopyIdx, LIS->getVNInfoAllocator());
1644 LR->addSegment(LiveRange::Segment(LastCopyIdx, endIdx, VNI));
1645 }
1646 }
1647 }
1648 }
1649
1650 LLVM_DEBUG(dbgs() << "\t\tprepend:\t" << *MIB);
1651
1652 MachineOperand &MO = MI->getOperand(SrcIdx);
1653 assert(MO.isReg() && MO.getReg() == RegB && MO.isUse() &&
1654 "inconsistent operand info for 2-reg pass");
1655 if (isPlainlyKilled(MO)) {
1656 MO.setIsKill(false);
1657 RemovedKillFlag = true;
1658 }
1659
1660 // Make sure regA is a legal regclass for the SrcIdx operand.
1661 if (RegA.isVirtual() && RegB.isVirtual())
1662 MRI->constrainRegClass(RegA, RC);
1663 MO.setReg(RegA);
1664 // The getMatchingSuper asserts guarantee that the register class projected
1665 // by SubRegB is compatible with RegA with no subregister. So regardless of
1666 // whether the dest oper writes a subreg, the source oper should not.
1667 MO.setSubReg(0);
1668 }
1669
1670 if (AllUsesCopied) {
1671 LaneBitmask RemainingUses = LaneBitmask::getNone();
1672 // Replace other (un-tied) uses of regB with LastCopiedReg.
1673 for (MachineOperand &MO : MI->all_uses()) {
1674 if (MO.getReg() == RegB) {
1675 if (MO.getSubReg() == SubRegB && !IsEarlyClobber) {
1676 if (isPlainlyKilled(MO)) {
1677 MO.setIsKill(false);
1678 RemovedKillFlag = true;
1679 }
1680 MO.setReg(LastCopiedReg);
1681 MO.setSubReg(0);
1682 } else {
1683 RemainingUses |= TRI->getSubRegIndexLaneMask(MO.getSubReg());
1684 }
1685 }
1686 }
1687
1688 // Update live variables for regB.
1689 if (RemovedKillFlag && RemainingUses.none() && LV &&
1690 LV->getVarInfo(RegB).removeKill(*MI)) {
1692 --PrevMI;
1693 LV->addVirtualRegisterKilled(RegB, *PrevMI);
1694 }
1695
1696 if (RemovedKillFlag && RemainingUses.none())
1697 SrcRegMap[LastCopiedReg] = RegB;
1698
1699 // Update LiveIntervals.
1700 if (LIS) {
1701 SlotIndex UseIdx = LIS->getInstructionIndex(*MI);
1702 auto Shrink = [=](LiveRange &LR, LaneBitmask LaneMask) {
1703 LiveRange::Segment *S = LR.getSegmentContaining(LastCopyIdx);
1704 if (!S)
1705 return true;
1706 if ((LaneMask & RemainingUses).any())
1707 return false;
1708 if (S->end.getBaseIndex() != UseIdx)
1709 return false;
1710 S->end = LastCopyIdx;
1711 return true;
1712 };
1713
1714 LiveInterval &LI = LIS->getInterval(RegB);
1715 bool ShrinkLI = true;
1716 for (auto &S : LI.subranges())
1717 ShrinkLI &= Shrink(S, S.LaneMask);
1718 if (ShrinkLI)
1719 Shrink(LI, LaneBitmask::getAll());
1720 }
1721 } else if (RemovedKillFlag) {
1722 // Some tied uses of regB matched their destination registers, so
1723 // regB is still used in this instruction, but a kill flag was
1724 // removed from a different tied use of regB, so now we need to add
1725 // a kill flag to one of the remaining uses of regB.
1726 for (MachineOperand &MO : MI->all_uses()) {
1727 if (MO.getReg() == RegB) {
1728 MO.setIsKill(true);
1729 break;
1730 }
1731 }
1732 }
1733}
1734
1735// For every tied operand pair this function transforms statepoint from
1736// RegA = STATEPOINT ... RegB(tied-def N)
1737// to
1738// RegB = STATEPOINT ... RegB(tied-def N)
1739// and replaces all uses of RegA with RegB.
1740// No extra COPY instruction is necessary because tied use is killed at
1741// STATEPOINT.
1742bool TwoAddressInstructionImpl::processStatepoint(
1743 MachineInstr *MI, TiedOperandMap &TiedOperands) {
1744
1745 bool NeedCopy = false;
1746 for (auto &TO : TiedOperands) {
1747 Register RegB = TO.first;
1748 if (TO.second.size() != 1) {
1749 NeedCopy = true;
1750 continue;
1751 }
1752
1753 unsigned SrcIdx = TO.second[0].first;
1754 unsigned DstIdx = TO.second[0].second;
1755
1756 MachineOperand &DstMO = MI->getOperand(DstIdx);
1757 Register RegA = DstMO.getReg();
1758
1759 assert(RegB == MI->getOperand(SrcIdx).getReg());
1760
1761 if (RegA == RegB)
1762 continue;
1763
1764 // CodeGenPrepare can sink pointer compare past statepoint, which
1765 // breaks assumption that statepoint kills tied-use register when
1766 // in SSA form (see note in IR/SafepointIRVerifier.cpp). Fall back
1767 // to generic tied register handling to avoid assertion failures.
1768 // TODO: Recompute LIS/LV information for new range here.
1769 if (LIS) {
1770 const auto &UseLI = LIS->getInterval(RegB);
1771 const auto &DefLI = LIS->getInterval(RegA);
1772 if (DefLI.overlaps(UseLI)) {
1773 LLVM_DEBUG(dbgs() << "LIS: " << printReg(RegB, TRI, 0)
1774 << " UseLI overlaps with DefLI\n");
1775 NeedCopy = true;
1776 continue;
1777 }
1778 } else if (LV && LV->getVarInfo(RegB).findKill(MI->getParent()) != MI) {
1779 // Note that MachineOperand::isKill does not work here, because it
1780 // is set only on first register use in instruction and for statepoint
1781 // tied-use register will usually be found in preceeding deopt bundle.
1782 LLVM_DEBUG(dbgs() << "LV: " << printReg(RegB, TRI, 0)
1783 << " not killed by statepoint\n");
1784 NeedCopy = true;
1785 continue;
1786 }
1787
1788 if (!MRI->constrainRegClass(RegB, MRI->getRegClass(RegA))) {
1789 LLVM_DEBUG(dbgs() << "MRI: couldn't constrain" << printReg(RegB, TRI, 0)
1790 << " to register class of " << printReg(RegA, TRI, 0)
1791 << '\n');
1792 NeedCopy = true;
1793 continue;
1794 }
1795 MRI->replaceRegWith(RegA, RegB);
1796
1797 if (LIS) {
1799 LiveInterval &LI = LIS->getInterval(RegB);
1800 LiveInterval &Other = LIS->getInterval(RegA);
1801 SmallVector<VNInfo *> NewVNIs;
1802 for (const VNInfo *VNI : Other.valnos) {
1803 assert(VNI->id == NewVNIs.size() && "assumed");
1804 NewVNIs.push_back(LI.createValueCopy(VNI, A));
1805 }
1806 for (auto &S : Other) {
1807 VNInfo *VNI = NewVNIs[S.valno->id];
1808 LiveRange::Segment NewSeg(S.start, S.end, VNI);
1809 LI.addSegment(NewSeg);
1810 }
1811 LIS->removeInterval(RegA);
1812 }
1813
1814 if (LV) {
1815 if (MI->getOperand(SrcIdx).isKill())
1816 LV->removeVirtualRegisterKilled(RegB, *MI);
1817 LiveVariables::VarInfo &SrcInfo = LV->getVarInfo(RegB);
1818 LiveVariables::VarInfo &DstInfo = LV->getVarInfo(RegA);
1819 SrcInfo.AliveBlocks |= DstInfo.AliveBlocks;
1820 DstInfo.AliveBlocks.clear();
1821 for (auto *KillMI : DstInfo.Kills)
1822 LV->addVirtualRegisterKilled(RegB, *KillMI, false);
1823 }
1824 }
1825 return !NeedCopy;
1826}
1827
1828/// Reduce two-address instructions to two operands.
1829bool TwoAddressInstructionImpl::run() {
1830 bool MadeChange = false;
1831
1832 LLVM_DEBUG(dbgs() << "********** REWRITING TWO-ADDR INSTRS **********\n");
1833 LLVM_DEBUG(dbgs() << "********** Function: " << MF->getName() << '\n');
1834
1835 // This pass takes the function out of SSA form.
1836 MRI->leaveSSA();
1837
1838 // This pass will rewrite the tied-def to meet the RegConstraint.
1839 MF->getProperties().setTiedOpsRewritten();
1840
1841 TiedOperandMap TiedOperands;
1842 for (MachineBasicBlock &MBBI : *MF) {
1843 MBB = &MBBI;
1844 unsigned Dist = 0;
1845 DistanceMap.clear();
1846 SrcRegMap.clear();
1847 DstRegMap.clear();
1848 Processed.clear();
1849 for (MachineBasicBlock::iterator mi = MBB->begin(), me = MBB->end();
1850 mi != me; ) {
1851 MachineBasicBlock::iterator nmi = std::next(mi);
1852 // Skip debug instructions.
1853 if (mi->isDebugInstr()) {
1854 mi = nmi;
1855 continue;
1856 }
1857
1858 // Expand REG_SEQUENCE instructions. This will position mi at the first
1859 // expanded instruction.
1860 if (mi->isRegSequence())
1861 eliminateRegSequence(mi);
1862
1863 DistanceMap.insert(std::make_pair(&*mi, ++Dist));
1864
1865 processCopy(&*mi);
1866
1867 // First scan through all the tied register uses in this instruction
1868 // and record a list of pairs of tied operands for each register.
1869 if (!collectTiedOperands(&*mi, TiedOperands)) {
1870 removeClobberedSrcRegMap(&*mi);
1871 mi = nmi;
1872 continue;
1873 }
1874
1875 ++NumTwoAddressInstrs;
1876 MadeChange = true;
1877 LLVM_DEBUG(dbgs() << '\t' << *mi);
1878
1879 // If the instruction has a single pair of tied operands, try some
1880 // transformations that may either eliminate the tied operands or
1881 // improve the opportunities for coalescing away the register copy.
1882 if (TiedOperands.size() == 1) {
1883 SmallVectorImpl<std::pair<unsigned, unsigned>> &TiedPairs
1884 = TiedOperands.begin()->second;
1885 if (TiedPairs.size() == 1) {
1886 unsigned SrcIdx = TiedPairs[0].first;
1887 unsigned DstIdx = TiedPairs[0].second;
1888 Register SrcReg = mi->getOperand(SrcIdx).getReg();
1889 Register DstReg = mi->getOperand(DstIdx).getReg();
1890 if (SrcReg != DstReg &&
1891 tryInstructionTransform(mi, nmi, SrcIdx, DstIdx, Dist, false)) {
1892 // The tied operands have been eliminated or shifted further down
1893 // the block to ease elimination. Continue processing with 'nmi'.
1894 TiedOperands.clear();
1895 removeClobberedSrcRegMap(&*mi);
1896 mi = nmi;
1897 continue;
1898 }
1899 }
1900 }
1901
1902 if (mi->getOpcode() == TargetOpcode::STATEPOINT &&
1903 processStatepoint(&*mi, TiedOperands)) {
1904 TiedOperands.clear();
1905 LLVM_DEBUG(dbgs() << "\t\trewrite to:\t" << *mi);
1906 mi = nmi;
1907 continue;
1908 }
1909
1910 // Now iterate over the information collected above.
1911 for (auto &TO : TiedOperands) {
1912 processTiedPairs(&*mi, TO.second, Dist);
1913 LLVM_DEBUG(dbgs() << "\t\trewrite to:\t" << *mi);
1914 }
1915
1916 // Rewrite INSERT_SUBREG as COPY now that we no longer need SSA form.
1917 if (mi->isInsertSubreg()) {
1918 // From %reg = INSERT_SUBREG %reg, %subreg, subidx
1919 // To %reg:subidx = COPY %subreg
1920 unsigned SubIdx = mi->getOperand(3).getImm();
1921 mi->removeOperand(3);
1922 assert(mi->getOperand(0).getSubReg() == 0 && "Unexpected subreg idx");
1923 mi->getOperand(0).setSubReg(SubIdx);
1924 mi->getOperand(0).setIsUndef(mi->getOperand(1).isUndef());
1925 mi->removeOperand(1);
1926 mi->setDesc(TII->get(TargetOpcode::COPY));
1927 LLVM_DEBUG(dbgs() << "\t\tconvert to:\t" << *mi);
1928
1929 // Update LiveIntervals.
1930 if (LIS) {
1931 Register Reg = mi->getOperand(0).getReg();
1932 LiveInterval &LI = LIS->getInterval(Reg);
1933 if (LI.hasSubRanges()) {
1934 // The COPY no longer defines subregs of %reg except for
1935 // %reg.subidx.
1936 LaneBitmask LaneMask =
1937 TRI->getSubRegIndexLaneMask(mi->getOperand(0).getSubReg());
1938 SlotIndex Idx = LIS->getInstructionIndex(*mi).getRegSlot();
1939 for (auto &S : LI.subranges()) {
1940 if ((S.LaneMask & LaneMask).none()) {
1941 LiveRange::iterator DefSeg = S.FindSegmentContaining(Idx);
1942 if (mi->getOperand(0).isUndef()) {
1943 S.removeValNo(DefSeg->valno);
1944 } else {
1945 LiveRange::iterator UseSeg = std::prev(DefSeg);
1946 S.MergeValueNumberInto(DefSeg->valno, UseSeg->valno);
1947 }
1948 }
1949 }
1950
1951 // The COPY no longer has a use of %reg.
1952 LIS->shrinkToUses(&LI);
1953 } else {
1954 // The live interval for Reg did not have subranges but now it needs
1955 // them because we have introduced a subreg def. Recompute it.
1956 LIS->removeInterval(Reg);
1958 }
1959 }
1960 }
1961
1962 // Clear TiedOperands here instead of at the top of the loop
1963 // since most instructions do not have tied operands.
1964 TiedOperands.clear();
1965 removeClobberedSrcRegMap(&*mi);
1966 mi = nmi;
1967 }
1968 }
1969
1970 return MadeChange;
1971}
1972
1973/// Eliminate a REG_SEQUENCE instruction as part of the de-ssa process.
1974///
1975/// The instruction is turned into a sequence of sub-register copies:
1976///
1977/// %dst = REG_SEQUENCE %v1, ssub0, %v2, ssub1
1978///
1979/// Becomes:
1980///
1981/// undef %dst:ssub0 = COPY %v1
1982/// %dst:ssub1 = COPY %v2
1983void TwoAddressInstructionImpl::eliminateRegSequence(
1985 MachineInstr &MI = *MBBI;
1986 Register DstReg = MI.getOperand(0).getReg();
1987
1988 SmallVector<Register, 4> OrigRegs;
1989 VNInfo *DefVN = nullptr;
1990 if (LIS) {
1991 OrigRegs.push_back(MI.getOperand(0).getReg());
1992 for (unsigned i = 1, e = MI.getNumOperands(); i < e; i += 2)
1993 OrigRegs.push_back(MI.getOperand(i).getReg());
1994 if (LIS->hasInterval(DstReg)) {
1995 DefVN = LIS->getInterval(DstReg)
1997 .valueOut();
1998 }
1999 }
2000
2001 LaneBitmask UndefLanes = LaneBitmask::getNone();
2002 bool DefEmitted = false;
2003 for (unsigned i = 1, e = MI.getNumOperands(); i < e; i += 2) {
2004 MachineOperand &UseMO = MI.getOperand(i);
2005 Register SrcReg = UseMO.getReg();
2006 unsigned SubIdx = MI.getOperand(i+1).getImm();
2007 // Nothing needs to be inserted for undef operands.
2008 if (UseMO.isUndef()) {
2009 UndefLanes |= TRI->getSubRegIndexLaneMask(SubIdx);
2010 continue;
2011 }
2012
2013 // Defer any kill flag to the last operand using SrcReg. Otherwise, we
2014 // might insert a COPY that uses SrcReg after is was killed.
2015 bool isKill = UseMO.isKill();
2016 if (isKill)
2017 for (unsigned j = i + 2; j < e; j += 2)
2018 if (MI.getOperand(j).getReg() == SrcReg) {
2019 MI.getOperand(j).setIsKill();
2020 UseMO.setIsKill(false);
2021 isKill = false;
2022 break;
2023 }
2024
2025 // Insert the sub-register copy.
2026 MachineInstr *CopyMI = BuildMI(*MI.getParent(), MI, MI.getDebugLoc(),
2027 TII->get(TargetOpcode::COPY))
2028 .addReg(DstReg, RegState::Define, SubIdx)
2029 .add(UseMO);
2030
2031 // The first def needs an undef flag because there is no live register
2032 // before it.
2033 if (!DefEmitted) {
2034 CopyMI->getOperand(0).setIsUndef(true);
2035 // Return an iterator pointing to the first inserted instr.
2036 MBBI = CopyMI;
2037 }
2038 DefEmitted = true;
2039
2040 // Update LiveVariables' kill info.
2041 if (LV && isKill && !SrcReg.isPhysical())
2042 LV->replaceKillInstruction(SrcReg, MI, *CopyMI);
2043
2044 LLVM_DEBUG(dbgs() << "Inserted: " << *CopyMI);
2045 }
2046
2048 std::next(MachineBasicBlock::iterator(MI));
2049
2050 if (!DefEmitted) {
2051 LLVM_DEBUG(dbgs() << "Turned: " << MI << " into an IMPLICIT_DEF");
2052 MI.setDesc(TII->get(TargetOpcode::IMPLICIT_DEF));
2053 for (int j = MI.getNumOperands() - 1, ee = 0; j > ee; --j)
2054 MI.removeOperand(j);
2055 } else {
2056 if (LIS) {
2057 // Force live interval recomputation if we moved to a partial definition
2058 // of the register. Undef flags must be propagate to uses of undefined
2059 // subregister for accurate interval computation.
2060 if (UndefLanes.any() && DefVN && MRI->shouldTrackSubRegLiveness(DstReg)) {
2061 auto &LI = LIS->getInterval(DstReg);
2062 for (MachineOperand &UseOp : MRI->use_operands(DstReg)) {
2063 unsigned SubReg = UseOp.getSubReg();
2064 if (UseOp.isUndef() || !SubReg)
2065 continue;
2066 auto *VN =
2067 LI.getVNInfoAt(LIS->getInstructionIndex(*UseOp.getParent()));
2068 if (DefVN != VN)
2069 continue;
2070 LaneBitmask LaneMask = TRI->getSubRegIndexLaneMask(SubReg);
2071 if ((UndefLanes & LaneMask).any())
2072 UseOp.setIsUndef(true);
2073 }
2074 LIS->removeInterval(DstReg);
2075 }
2077 }
2078
2079 LLVM_DEBUG(dbgs() << "Eliminated: " << MI);
2080 MI.eraseFromParent();
2081 }
2082
2083 // Udpate LiveIntervals.
2084 if (LIS)
2085 LIS->repairIntervalsInRange(MBB, MBBI, EndMBBI, OrigRegs);
2086}
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:58
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:165
bool erase(const KeyT &Val)
Definition DenseMap.h:303
iterator end()
Definition DenseMap.h:81
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:214
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.
LiveRange * getCachedRegUnit(unsigned Unit)
Return the live range for register unit Unit if it has already been computed, or nullptr if it hasn't...
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.
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:33
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:19
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:74
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:78
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
Definition MathExtras.h:47
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:1705
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:2108
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:1712
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
unsigned MCRegUnit
Register units are used to compute register aliasing.
Definition MCRegister.h:30
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
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.