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