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