xref: /freebsd-src/contrib/llvm-project/llvm/lib/CodeGen/LiveIntervalCalc.cpp (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
1*5ffd83dbSDimitry Andric //===- LiveIntervalCalc.cpp - Calculate live interval --------------------===//
2*5ffd83dbSDimitry Andric //
3*5ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*5ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*5ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*5ffd83dbSDimitry Andric //
7*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
8*5ffd83dbSDimitry Andric //
9*5ffd83dbSDimitry Andric // Implementation of the LiveIntervalCalc class.
10*5ffd83dbSDimitry Andric //
11*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
12*5ffd83dbSDimitry Andric 
13*5ffd83dbSDimitry Andric #include "llvm/CodeGen/LiveIntervalCalc.h"
14*5ffd83dbSDimitry Andric #include "llvm/ADT/STLExtras.h"
15*5ffd83dbSDimitry Andric #include "llvm/ADT/SetVector.h"
16*5ffd83dbSDimitry Andric #include "llvm/ADT/SmallVector.h"
17*5ffd83dbSDimitry Andric #include "llvm/CodeGen/LiveInterval.h"
18*5ffd83dbSDimitry Andric #include "llvm/CodeGen/MachineBasicBlock.h"
19*5ffd83dbSDimitry Andric #include "llvm/CodeGen/MachineDominators.h"
20*5ffd83dbSDimitry Andric #include "llvm/CodeGen/MachineFunction.h"
21*5ffd83dbSDimitry Andric #include "llvm/CodeGen/MachineInstr.h"
22*5ffd83dbSDimitry Andric #include "llvm/CodeGen/MachineOperand.h"
23*5ffd83dbSDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h"
24*5ffd83dbSDimitry Andric #include "llvm/CodeGen/SlotIndexes.h"
25*5ffd83dbSDimitry Andric #include "llvm/CodeGen/TargetRegisterInfo.h"
26*5ffd83dbSDimitry Andric #include "llvm/MC/LaneBitmask.h"
27*5ffd83dbSDimitry Andric #include "llvm/Support/ErrorHandling.h"
28*5ffd83dbSDimitry Andric #include "llvm/Support/raw_ostream.h"
29*5ffd83dbSDimitry Andric #include <algorithm>
30*5ffd83dbSDimitry Andric #include <cassert>
31*5ffd83dbSDimitry Andric #include <iterator>
32*5ffd83dbSDimitry Andric #include <tuple>
33*5ffd83dbSDimitry Andric #include <utility>
34*5ffd83dbSDimitry Andric 
35*5ffd83dbSDimitry Andric using namespace llvm;
36*5ffd83dbSDimitry Andric 
37*5ffd83dbSDimitry Andric #define DEBUG_TYPE "regalloc"
38*5ffd83dbSDimitry Andric 
39*5ffd83dbSDimitry Andric // Reserve an address that indicates a value that is known to be "undef".
40*5ffd83dbSDimitry Andric static VNInfo UndefVNI(0xbad, SlotIndex());
41*5ffd83dbSDimitry Andric 
42*5ffd83dbSDimitry Andric static void createDeadDef(SlotIndexes &Indexes, VNInfo::Allocator &Alloc,
43*5ffd83dbSDimitry Andric                           LiveRange &LR, const MachineOperand &MO) {
44*5ffd83dbSDimitry Andric   const MachineInstr &MI = *MO.getParent();
45*5ffd83dbSDimitry Andric   SlotIndex DefIdx =
46*5ffd83dbSDimitry Andric       Indexes.getInstructionIndex(MI).getRegSlot(MO.isEarlyClobber());
47*5ffd83dbSDimitry Andric 
48*5ffd83dbSDimitry Andric   // Create the def in LR. This may find an existing def.
49*5ffd83dbSDimitry Andric   LR.createDeadDef(DefIdx, Alloc);
50*5ffd83dbSDimitry Andric }
51*5ffd83dbSDimitry Andric 
52*5ffd83dbSDimitry Andric void LiveIntervalCalc::calculate(LiveInterval &LI, bool TrackSubRegs) {
53*5ffd83dbSDimitry Andric   const MachineRegisterInfo *MRI = getRegInfo();
54*5ffd83dbSDimitry Andric   SlotIndexes *Indexes = getIndexes();
55*5ffd83dbSDimitry Andric   VNInfo::Allocator *Alloc = getVNAlloc();
56*5ffd83dbSDimitry Andric 
57*5ffd83dbSDimitry Andric   assert(MRI && Indexes && "call reset() first");
58*5ffd83dbSDimitry Andric 
59*5ffd83dbSDimitry Andric   // Step 1: Create minimal live segments for every definition of Reg.
60*5ffd83dbSDimitry Andric   // Visit all def operands. If the same instruction has multiple defs of Reg,
61*5ffd83dbSDimitry Andric   // createDeadDef() will deduplicate.
62*5ffd83dbSDimitry Andric   const TargetRegisterInfo &TRI = *MRI->getTargetRegisterInfo();
63*5ffd83dbSDimitry Andric   unsigned Reg = LI.reg;
64*5ffd83dbSDimitry Andric   for (const MachineOperand &MO : MRI->reg_nodbg_operands(Reg)) {
65*5ffd83dbSDimitry Andric     if (!MO.isDef() && !MO.readsReg())
66*5ffd83dbSDimitry Andric       continue;
67*5ffd83dbSDimitry Andric 
68*5ffd83dbSDimitry Andric     unsigned SubReg = MO.getSubReg();
69*5ffd83dbSDimitry Andric     if (LI.hasSubRanges() || (SubReg != 0 && TrackSubRegs)) {
70*5ffd83dbSDimitry Andric       LaneBitmask SubMask = SubReg != 0 ? TRI.getSubRegIndexLaneMask(SubReg)
71*5ffd83dbSDimitry Andric                                         : MRI->getMaxLaneMaskForVReg(Reg);
72*5ffd83dbSDimitry Andric       // If this is the first time we see a subregister def, initialize
73*5ffd83dbSDimitry Andric       // subranges by creating a copy of the main range.
74*5ffd83dbSDimitry Andric       if (!LI.hasSubRanges() && !LI.empty()) {
75*5ffd83dbSDimitry Andric         LaneBitmask ClassMask = MRI->getMaxLaneMaskForVReg(Reg);
76*5ffd83dbSDimitry Andric         LI.createSubRangeFrom(*Alloc, ClassMask, LI);
77*5ffd83dbSDimitry Andric       }
78*5ffd83dbSDimitry Andric 
79*5ffd83dbSDimitry Andric       LI.refineSubRanges(
80*5ffd83dbSDimitry Andric           *Alloc, SubMask,
81*5ffd83dbSDimitry Andric           [&MO, Indexes, Alloc](LiveInterval::SubRange &SR) {
82*5ffd83dbSDimitry Andric             if (MO.isDef())
83*5ffd83dbSDimitry Andric               createDeadDef(*Indexes, *Alloc, SR, MO);
84*5ffd83dbSDimitry Andric           },
85*5ffd83dbSDimitry Andric           *Indexes, TRI);
86*5ffd83dbSDimitry Andric     }
87*5ffd83dbSDimitry Andric 
88*5ffd83dbSDimitry Andric     // Create the def in the main liverange. We do not have to do this if
89*5ffd83dbSDimitry Andric     // subranges are tracked as we recreate the main range later in this case.
90*5ffd83dbSDimitry Andric     if (MO.isDef() && !LI.hasSubRanges())
91*5ffd83dbSDimitry Andric       createDeadDef(*Indexes, *Alloc, LI, MO);
92*5ffd83dbSDimitry Andric   }
93*5ffd83dbSDimitry Andric 
94*5ffd83dbSDimitry Andric   // We may have created empty live ranges for partially undefined uses, we
95*5ffd83dbSDimitry Andric   // can't keep them because we won't find defs in them later.
96*5ffd83dbSDimitry Andric   LI.removeEmptySubRanges();
97*5ffd83dbSDimitry Andric 
98*5ffd83dbSDimitry Andric   const MachineFunction *MF = getMachineFunction();
99*5ffd83dbSDimitry Andric   MachineDominatorTree *DomTree = getDomTree();
100*5ffd83dbSDimitry Andric   // Step 2: Extend live segments to all uses, constructing SSA form as
101*5ffd83dbSDimitry Andric   // necessary.
102*5ffd83dbSDimitry Andric   if (LI.hasSubRanges()) {
103*5ffd83dbSDimitry Andric     for (LiveInterval::SubRange &S : LI.subranges()) {
104*5ffd83dbSDimitry Andric       LiveIntervalCalc SubLIC;
105*5ffd83dbSDimitry Andric       SubLIC.reset(MF, Indexes, DomTree, Alloc);
106*5ffd83dbSDimitry Andric       SubLIC.extendToUses(S, Reg, S.LaneMask, &LI);
107*5ffd83dbSDimitry Andric     }
108*5ffd83dbSDimitry Andric     LI.clear();
109*5ffd83dbSDimitry Andric     constructMainRangeFromSubranges(LI);
110*5ffd83dbSDimitry Andric   } else {
111*5ffd83dbSDimitry Andric     resetLiveOutMap();
112*5ffd83dbSDimitry Andric     extendToUses(LI, Reg, LaneBitmask::getAll());
113*5ffd83dbSDimitry Andric   }
114*5ffd83dbSDimitry Andric }
115*5ffd83dbSDimitry Andric 
116*5ffd83dbSDimitry Andric void LiveIntervalCalc::constructMainRangeFromSubranges(LiveInterval &LI) {
117*5ffd83dbSDimitry Andric   // First create dead defs at all defs found in subranges.
118*5ffd83dbSDimitry Andric   LiveRange &MainRange = LI;
119*5ffd83dbSDimitry Andric   assert(MainRange.segments.empty() && MainRange.valnos.empty() &&
120*5ffd83dbSDimitry Andric          "Expect empty main liverange");
121*5ffd83dbSDimitry Andric 
122*5ffd83dbSDimitry Andric   VNInfo::Allocator *Alloc = getVNAlloc();
123*5ffd83dbSDimitry Andric   for (const LiveInterval::SubRange &SR : LI.subranges()) {
124*5ffd83dbSDimitry Andric     for (const VNInfo *VNI : SR.valnos) {
125*5ffd83dbSDimitry Andric       if (!VNI->isUnused() && !VNI->isPHIDef())
126*5ffd83dbSDimitry Andric         MainRange.createDeadDef(VNI->def, *Alloc);
127*5ffd83dbSDimitry Andric     }
128*5ffd83dbSDimitry Andric   }
129*5ffd83dbSDimitry Andric   resetLiveOutMap();
130*5ffd83dbSDimitry Andric   extendToUses(MainRange, LI.reg, LaneBitmask::getAll(), &LI);
131*5ffd83dbSDimitry Andric }
132*5ffd83dbSDimitry Andric 
133*5ffd83dbSDimitry Andric void LiveIntervalCalc::createDeadDefs(LiveRange &LR, Register Reg) {
134*5ffd83dbSDimitry Andric   const MachineRegisterInfo *MRI = getRegInfo();
135*5ffd83dbSDimitry Andric   SlotIndexes *Indexes = getIndexes();
136*5ffd83dbSDimitry Andric   VNInfo::Allocator *Alloc = getVNAlloc();
137*5ffd83dbSDimitry Andric   assert(MRI && Indexes && "call reset() first");
138*5ffd83dbSDimitry Andric 
139*5ffd83dbSDimitry Andric   // Visit all def operands. If the same instruction has multiple defs of Reg,
140*5ffd83dbSDimitry Andric   // LR.createDeadDef() will deduplicate.
141*5ffd83dbSDimitry Andric   for (MachineOperand &MO : MRI->def_operands(Reg))
142*5ffd83dbSDimitry Andric     createDeadDef(*Indexes, *Alloc, LR, MO);
143*5ffd83dbSDimitry Andric }
144*5ffd83dbSDimitry Andric 
145*5ffd83dbSDimitry Andric void LiveIntervalCalc::extendToUses(LiveRange &LR, Register Reg,
146*5ffd83dbSDimitry Andric                                     LaneBitmask Mask, LiveInterval *LI) {
147*5ffd83dbSDimitry Andric   const MachineRegisterInfo *MRI = getRegInfo();
148*5ffd83dbSDimitry Andric   SlotIndexes *Indexes = getIndexes();
149*5ffd83dbSDimitry Andric   SmallVector<SlotIndex, 4> Undefs;
150*5ffd83dbSDimitry Andric   if (LI != nullptr)
151*5ffd83dbSDimitry Andric     LI->computeSubRangeUndefs(Undefs, Mask, *MRI, *Indexes);
152*5ffd83dbSDimitry Andric 
153*5ffd83dbSDimitry Andric   // Visit all operands that read Reg. This may include partial defs.
154*5ffd83dbSDimitry Andric   bool IsSubRange = !Mask.all();
155*5ffd83dbSDimitry Andric   const TargetRegisterInfo &TRI = *MRI->getTargetRegisterInfo();
156*5ffd83dbSDimitry Andric   for (MachineOperand &MO : MRI->reg_nodbg_operands(Reg)) {
157*5ffd83dbSDimitry Andric     // Clear all kill flags. They will be reinserted after register allocation
158*5ffd83dbSDimitry Andric     // by LiveIntervals::addKillFlags().
159*5ffd83dbSDimitry Andric     if (MO.isUse())
160*5ffd83dbSDimitry Andric       MO.setIsKill(false);
161*5ffd83dbSDimitry Andric     // MO::readsReg returns "true" for subregister defs. This is for keeping
162*5ffd83dbSDimitry Andric     // liveness of the entire register (i.e. for the main range of the live
163*5ffd83dbSDimitry Andric     // interval). For subranges, definitions of non-overlapping subregisters
164*5ffd83dbSDimitry Andric     // do not count as uses.
165*5ffd83dbSDimitry Andric     if (!MO.readsReg() || (IsSubRange && MO.isDef()))
166*5ffd83dbSDimitry Andric       continue;
167*5ffd83dbSDimitry Andric 
168*5ffd83dbSDimitry Andric     unsigned SubReg = MO.getSubReg();
169*5ffd83dbSDimitry Andric     if (SubReg != 0) {
170*5ffd83dbSDimitry Andric       LaneBitmask SLM = TRI.getSubRegIndexLaneMask(SubReg);
171*5ffd83dbSDimitry Andric       if (MO.isDef())
172*5ffd83dbSDimitry Andric         SLM = ~SLM;
173*5ffd83dbSDimitry Andric       // Ignore uses not reading the current (sub)range.
174*5ffd83dbSDimitry Andric       if ((SLM & Mask).none())
175*5ffd83dbSDimitry Andric         continue;
176*5ffd83dbSDimitry Andric     }
177*5ffd83dbSDimitry Andric 
178*5ffd83dbSDimitry Andric     // Determine the actual place of the use.
179*5ffd83dbSDimitry Andric     const MachineInstr *MI = MO.getParent();
180*5ffd83dbSDimitry Andric     unsigned OpNo = (&MO - &MI->getOperand(0));
181*5ffd83dbSDimitry Andric     SlotIndex UseIdx;
182*5ffd83dbSDimitry Andric     if (MI->isPHI()) {
183*5ffd83dbSDimitry Andric       assert(!MO.isDef() && "Cannot handle PHI def of partial register.");
184*5ffd83dbSDimitry Andric       // The actual place where a phi operand is used is the end of the pred
185*5ffd83dbSDimitry Andric       // MBB. PHI operands are paired: (Reg, PredMBB).
186*5ffd83dbSDimitry Andric       UseIdx = Indexes->getMBBEndIdx(MI->getOperand(OpNo + 1).getMBB());
187*5ffd83dbSDimitry Andric     } else {
188*5ffd83dbSDimitry Andric       // Check for early-clobber redefs.
189*5ffd83dbSDimitry Andric       bool isEarlyClobber = false;
190*5ffd83dbSDimitry Andric       unsigned DefIdx;
191*5ffd83dbSDimitry Andric       if (MO.isDef())
192*5ffd83dbSDimitry Andric         isEarlyClobber = MO.isEarlyClobber();
193*5ffd83dbSDimitry Andric       else if (MI->isRegTiedToDefOperand(OpNo, &DefIdx)) {
194*5ffd83dbSDimitry Andric         // FIXME: This would be a lot easier if tied early-clobber uses also
195*5ffd83dbSDimitry Andric         // had an early-clobber flag.
196*5ffd83dbSDimitry Andric         isEarlyClobber = MI->getOperand(DefIdx).isEarlyClobber();
197*5ffd83dbSDimitry Andric       }
198*5ffd83dbSDimitry Andric       UseIdx = Indexes->getInstructionIndex(*MI).getRegSlot(isEarlyClobber);
199*5ffd83dbSDimitry Andric     }
200*5ffd83dbSDimitry Andric 
201*5ffd83dbSDimitry Andric     // MI is reading Reg. We may have visited MI before if it happens to be
202*5ffd83dbSDimitry Andric     // reading Reg multiple times. That is OK, extend() is idempotent.
203*5ffd83dbSDimitry Andric     extend(LR, UseIdx, Reg, Undefs);
204*5ffd83dbSDimitry Andric   }
205*5ffd83dbSDimitry Andric }