blob: 471775f8706b8580638ed5a0aa52e84d972a5711 [file] [log] [blame]
Matthias Braunfa621d22017-12-13 02:51:04 +00001//===- LiveIntervals.cpp - Live Interval Analysis -------------------------===//
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +00007//
8//===----------------------------------------------------------------------===//
9//
Matthias Braun95a36002017-01-19 00:32:13 +000010/// \file This file implements the LiveInterval analysis pass which is used
11/// by the Linear Scan Register allocator. This pass linearizes the
12/// basic blocks of the function in DFS order and computes live intervals for
13/// each virtual and physical register.
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000014//
15//===----------------------------------------------------------------------===//
16
Matthias Braunfa621d22017-12-13 02:51:04 +000017#include "llvm/CodeGen/LiveIntervals.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000018#include "LiveRangeCalc.h"
Eugene Zelenko64632962017-05-24 23:10:29 +000019#include "llvm/ADT/ArrayRef.h"
20#include "llvm/ADT/DepthFirstIterator.h"
Eugene Zelenko64632962017-05-24 23:10:29 +000021#include "llvm/ADT/SmallPtrSet.h"
22#include "llvm/ADT/SmallVector.h"
Chandler Carruthe3e43d92017-06-06 11:49:48 +000023#include "llvm/ADT/iterator_range.h"
Dan Gohman6d69ba82008-07-25 00:02:30 +000024#include "llvm/Analysis/AliasAnalysis.h"
Eugene Zelenko64632962017-05-24 23:10:29 +000025#include "llvm/CodeGen/LiveInterval.h"
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000026#include "llvm/CodeGen/LiveVariables.h"
Eugene Zelenko64632962017-05-24 23:10:29 +000027#include "llvm/CodeGen/MachineBasicBlock.h"
Michael Gottesmanf392e882013-12-14 00:53:32 +000028#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +000029#include "llvm/CodeGen/MachineDominators.h"
Eugene Zelenko64632962017-05-24 23:10:29 +000030#include "llvm/CodeGen/MachineFunction.h"
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000031#include "llvm/CodeGen/MachineInstr.h"
Eugene Zelenko64632962017-05-24 23:10:29 +000032#include "llvm/CodeGen/MachineInstrBundle.h"
33#include "llvm/CodeGen/MachineOperand.h"
Chris Lattner84bc5422007-12-31 04:13:23 +000034#include "llvm/CodeGen/MachineRegisterInfo.h"
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000035#include "llvm/CodeGen/Passes.h"
Eugene Zelenko64632962017-05-24 23:10:29 +000036#include "llvm/CodeGen/SlotIndexes.h"
David Blaikiee3a9b4c2017-11-17 01:07:10 +000037#include "llvm/CodeGen/TargetRegisterInfo.h"
38#include "llvm/CodeGen/TargetSubtargetInfo.h"
Jakob Stoklund Olesen1ead68d2012-11-28 19:13:06 +000039#include "llvm/CodeGen/VirtRegMap.h"
Nico Weber0f38c602018-04-30 14:59:11 +000040#include "llvm/Config/llvm-config.h"
Eugene Zelenko64632962017-05-24 23:10:29 +000041#include "llvm/MC/LaneBitmask.h"
42#include "llvm/MC/MCRegisterInfo.h"
43#include "llvm/Pass.h"
Benjamin Kramer4eed7562013-06-17 19:00:36 +000044#include "llvm/Support/BlockFrequency.h"
Jakob Stoklund Olesen3dfa38a2012-07-27 20:58:46 +000045#include "llvm/Support/CommandLine.h"
Eugene Zelenko64632962017-05-24 23:10:29 +000046#include "llvm/Support/Compiler.h"
Reid Spencer551ccae2004-09-01 22:55:40 +000047#include "llvm/Support/Debug.h"
Eugene Zelenko64632962017-05-24 23:10:29 +000048#include "llvm/Support/MathExtras.h"
Torok Edwin7d696d82009-07-11 13:10:19 +000049#include "llvm/Support/raw_ostream.h"
Alkis Evlogimenos20aa4742004-09-03 18:19:51 +000050#include <algorithm>
Eugene Zelenko64632962017-05-24 23:10:29 +000051#include <cassert>
52#include <cstdint>
53#include <iterator>
54#include <tuple>
55#include <utility>
56
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000057using namespace llvm;
58
Chandler Carruth8677f2f2014-04-22 02:02:50 +000059#define DEBUG_TYPE "regalloc"
60
Devang Patel19974732007-05-03 01:11:54 +000061char LiveIntervals::ID = 0;
Jakob Stoklund Olesendcc44362012-08-03 22:12:54 +000062char &llvm::LiveIntervalsID = LiveIntervals::ID;
Owen Anderson2ab36d32010-10-12 19:48:12 +000063INITIALIZE_PASS_BEGIN(LiveIntervals, "liveintervals",
64 "Live Interval Analysis", false, false)
Chandler Carruth91468332015-09-09 17:55:00 +000065INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
Andrew Trick8dd26252012-02-10 04:10:36 +000066INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
Owen Anderson2ab36d32010-10-12 19:48:12 +000067INITIALIZE_PASS_DEPENDENCY(SlotIndexes)
Owen Anderson2ab36d32010-10-12 19:48:12 +000068INITIALIZE_PASS_END(LiveIntervals, "liveintervals",
Owen Andersonce665bd2010-10-07 22:25:06 +000069 "Live Interval Analysis", false, false)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000070
Andrew Trickc6bae792013-06-21 18:33:23 +000071#ifndef NDEBUG
72static cl::opt<bool> EnablePrecomputePhysRegs(
73 "precompute-phys-liveness", cl::Hidden,
74 cl::desc("Eagerly compute live intervals for all physreg units."));
75#else
76static bool EnablePrecomputePhysRegs = false;
77#endif // NDEBUG
78
Quentin Colombet4c2a2ac2015-02-06 18:42:41 +000079namespace llvm {
Eugene Zelenko64632962017-05-24 23:10:29 +000080
Quentin Colombet4c2a2ac2015-02-06 18:42:41 +000081cl::opt<bool> UseSegmentSetForPhysRegs(
82 "use-segment-set-for-physregs", cl::Hidden, cl::init(true),
83 cl::desc(
84 "Use segment set for the computation of the live ranges of physregs."));
Eugene Zelenko64632962017-05-24 23:10:29 +000085
86} // end namespace llvm
Quentin Colombet4c2a2ac2015-02-06 18:42:41 +000087
Chris Lattnerf7da2c72006-08-24 22:43:55 +000088void LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const {
Dan Gohman845012e2009-07-31 23:37:33 +000089 AU.setPreservesCFG();
Chandler Carruth91468332015-09-09 17:55:00 +000090 AU.addRequired<AAResultsWrapperPass>();
91 AU.addPreserved<AAResultsWrapperPass>();
Evan Cheng148341c2010-08-17 21:00:37 +000092 AU.addPreserved<LiveVariables>();
Andrew Trickd35576b2012-02-13 20:44:42 +000093 AU.addPreservedID(MachineLoopInfoID);
Jakob Stoklund Olesenc4118452012-06-20 23:31:34 +000094 AU.addRequiredTransitiveID(MachineDominatorsID);
Bill Wendling67d65bb2008-01-04 20:54:55 +000095 AU.addPreservedID(MachineDominatorsID);
Lang Hames233a60e2009-11-03 23:52:08 +000096 AU.addPreserved<SlotIndexes>();
97 AU.addRequiredTransitive<SlotIndexes>();
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +000098 MachineFunctionPass::getAnalysisUsage(AU);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000099}
100
Eugene Zelenko64632962017-05-24 23:10:29 +0000101LiveIntervals::LiveIntervals() : MachineFunctionPass(ID) {
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000102 initializeLiveIntervalsPass(*PassRegistry::getPassRegistry());
103}
104
105LiveIntervals::~LiveIntervals() {
106 delete LRCalc;
107}
108
Chris Lattnerf7da2c72006-08-24 22:43:55 +0000109void LiveIntervals::releaseMemory() {
Owen Anderson03857b22008-08-13 21:49:13 +0000110 // Free the live intervals themselves.
Jakob Stoklund Olesen7fa67842012-06-22 20:37:52 +0000111 for (unsigned i = 0, e = VirtRegIntervals.size(); i != e; ++i)
112 delete VirtRegIntervals[TargetRegisterInfo::index2VirtReg(i)];
113 VirtRegIntervals.clear();
Jakob Stoklund Olesen3fd3a842012-02-08 17:33:45 +0000114 RegMaskSlots.clear();
115 RegMaskBits.clear();
Jakob Stoklund Olesen34e85d02012-02-10 01:26:29 +0000116 RegMaskBlocks.clear();
Lang Hamesffd13262009-07-09 03:57:02 +0000117
Matthias Braun95a36002017-01-19 00:32:13 +0000118 for (LiveRange *LR : RegUnitRanges)
119 delete LR;
Matthias Braun4f3b5e82013-10-10 21:29:02 +0000120 RegUnitRanges.clear();
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000121
Benjamin Kramerce9a20b2010-06-26 11:30:59 +0000122 // Release VNInfo memory regions, VNInfo objects don't need to be dtor'd.
123 VNInfoAllocator.Reset();
Alkis Evlogimenos08cec002004-01-31 19:59:32 +0000124}
125
Owen Anderson80b3ce62008-05-28 20:54:50 +0000126bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
Jakob Stoklund Olesen15f1d8c2012-06-04 22:39:14 +0000127 MF = &fn;
128 MRI = &MF->getRegInfo();
Eric Christopher37886872014-10-14 06:26:53 +0000129 TRI = MF->getSubtarget().getRegisterInfo();
130 TII = MF->getSubtarget().getInstrInfo();
Chandler Carruth91468332015-09-09 17:55:00 +0000131 AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
Jakob Stoklund Olesen15f1d8c2012-06-04 22:39:14 +0000132 Indexes = &getAnalysis<SlotIndexes>();
Jakob Stoklund Olesenc4118452012-06-20 23:31:34 +0000133 DomTree = &getAnalysis<MachineDominatorTree>();
Matthias Braun7fbeb8d2014-12-10 01:12:30 +0000134
Jakob Stoklund Olesenc4118452012-06-20 23:31:34 +0000135 if (!LRCalc)
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000136 LRCalc = new LiveRangeCalc();
Owen Anderson80b3ce62008-05-28 20:54:50 +0000137
Jakob Stoklund Olesen3dfa38a2012-07-27 20:58:46 +0000138 // Allocate space for all virtual registers.
139 VirtRegIntervals.resize(MRI->getNumVirtRegs());
140
Jakob Stoklund Olesenec7b25d2013-02-09 00:04:07 +0000141 computeVirtRegs();
142 computeRegMasks();
Jakob Stoklund Olesenc4118452012-06-20 23:31:34 +0000143 computeLiveInRegUnits();
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000144
Andrew Trickc6bae792013-06-21 18:33:23 +0000145 if (EnablePrecomputePhysRegs) {
146 // For stress testing, precompute live ranges of all physical register
147 // units, including reserved registers.
148 for (unsigned i = 0, e = TRI->getNumRegUnits(); i != e; ++i)
149 getRegUnit(i);
150 }
Nicola Zaghen0818e782018-05-14 12:53:11 +0000151 LLVM_DEBUG(dump());
Alkis Evlogimenos1a8ea012004-08-04 09:46:26 +0000152 return true;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000153}
154
Chris Lattner45cfe542009-08-23 06:03:38 +0000155void LiveIntervals::print(raw_ostream &OS, const Module* ) const {
Chris Lattner705e07f2009-08-23 03:41:05 +0000156 OS << "********** INTERVALS **********\n";
Jakob Stoklund Olesenf658af52012-02-14 23:46:21 +0000157
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000158 // Dump the regunits.
Matthias Braun95a36002017-01-19 00:32:13 +0000159 for (unsigned Unit = 0, UnitE = RegUnitRanges.size(); Unit != UnitE; ++Unit)
160 if (LiveRange *LR = RegUnitRanges[Unit])
Francis Visoiu Mistrihaccb3372017-11-28 12:42:37 +0000161 OS << printRegUnit(Unit, TRI) << ' ' << *LR << '\n';
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000162
Jakob Stoklund Olesenf658af52012-02-14 23:46:21 +0000163 // Dump the virtregs.
Jakob Stoklund Olesen7fa67842012-06-22 20:37:52 +0000164 for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
165 unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
166 if (hasInterval(Reg))
Matthias Braun03d96092013-10-10 21:29:05 +0000167 OS << getInterval(Reg) << '\n';
Jakob Stoklund Olesen7fa67842012-06-22 20:37:52 +0000168 }
Chris Lattner70ca3582004-09-30 15:59:17 +0000169
Jakob Stoklund Olesen722c9a72012-11-09 19:18:49 +0000170 OS << "RegMasks:";
Matthias Braun95a36002017-01-19 00:32:13 +0000171 for (SlotIndex Idx : RegMaskSlots)
172 OS << ' ' << Idx;
Jakob Stoklund Olesen722c9a72012-11-09 19:18:49 +0000173 OS << '\n';
174
Evan Cheng752195e2009-09-14 21:33:42 +0000175 printInstrs(OS);
176}
177
178void LiveIntervals::printInstrs(raw_ostream &OS) const {
Chris Lattner705e07f2009-08-23 03:41:05 +0000179 OS << "********** MACHINEINSTRS **********\n";
Jakob Stoklund Olesen15f1d8c2012-06-04 22:39:14 +0000180 MF->print(OS, Indexes);
Chris Lattner70ca3582004-09-30 15:59:17 +0000181}
182
Aaron Ballman1d03d382017-10-15 14:32:27 +0000183#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
Matthias Braun88d20752017-01-28 02:02:38 +0000184LLVM_DUMP_METHOD void LiveIntervals::dumpInstrs() const {
David Greene8a342292010-01-04 22:49:02 +0000185 printInstrs(dbgs());
Evan Cheng752195e2009-09-14 21:33:42 +0000186}
Manman Ren77e300e2012-09-06 19:06:06 +0000187#endif
Evan Cheng752195e2009-09-14 21:33:42 +0000188
Owen Anderson03857b22008-08-13 21:49:13 +0000189LiveInterval* LiveIntervals::createInterval(unsigned reg) {
Eugene Zelenko64632962017-05-24 23:10:29 +0000190 float Weight = TargetRegisterInfo::isPhysicalRegister(reg) ? huge_valf : 0.0F;
Owen Anderson03857b22008-08-13 21:49:13 +0000191 return new LiveInterval(reg, Weight);
Alkis Evlogimenos9a8b4902004-04-09 18:07:57 +0000192}
Evan Chengf2fbca62007-11-12 06:35:08 +0000193
Matthias Braun95a36002017-01-19 00:32:13 +0000194/// Compute the live interval of a virtual register, based on defs and uses.
Matthias Braune25dde52013-10-10 21:28:57 +0000195void LiveIntervals::computeVirtRegInterval(LiveInterval &LI) {
Jakob Stoklund Olesen3dfa38a2012-07-27 20:58:46 +0000196 assert(LRCalc && "LRCalc not initialized.");
Matthias Braune25dde52013-10-10 21:28:57 +0000197 assert(LI.empty() && "Should only compute empty intervals.");
Jakob Stoklund Olesen3dfa38a2012-07-27 20:58:46 +0000198 LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
Matthias Braun277501a2016-04-28 20:35:26 +0000199 LRCalc->calculate(LI, MRI->shouldTrackSubRegLiveness(LI.reg));
200 computeDeadValues(LI, nullptr);
Jakob Stoklund Olesen3dfa38a2012-07-27 20:58:46 +0000201}
202
Jakob Stoklund Olesenc16bf792012-07-27 21:56:39 +0000203void LiveIntervals::computeVirtRegs() {
204 for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
205 unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
206 if (MRI->reg_nodbg_empty(Reg))
207 continue;
Mark Laceye742d682013-08-14 23:50:16 +0000208 createAndComputeVirtRegInterval(Reg);
Jakob Stoklund Olesenc16bf792012-07-27 21:56:39 +0000209 }
210}
211
212void LiveIntervals::computeRegMasks() {
213 RegMaskBlocks.resize(MF->getNumBlockIDs());
214
215 // Find all instructions with regmask operands.
Matthias Braun95a36002017-01-19 00:32:13 +0000216 for (const MachineBasicBlock &MBB : *MF) {
Reid Klecknerbaea4d92015-11-06 02:01:02 +0000217 std::pair<unsigned, unsigned> &RMB = RegMaskBlocks[MBB.getNumber()];
Jakob Stoklund Olesenc16bf792012-07-27 21:56:39 +0000218 RMB.first = RegMaskSlots.size();
Reid Klecknerf0a04c02015-11-06 17:06:38 +0000219
220 // Some block starts, such as EH funclets, create masks.
221 if (const uint32_t *Mask = MBB.getBeginClobberMask(TRI)) {
222 RegMaskSlots.push_back(Indexes->getMBBStartIdx(&MBB));
223 RegMaskBits.push_back(Mask);
224 }
225
Matthias Braun95a36002017-01-19 00:32:13 +0000226 for (const MachineInstr &MI : MBB) {
Reid Klecknerbaea4d92015-11-06 02:01:02 +0000227 for (const MachineOperand &MO : MI.operands()) {
Matthias Braune67bd6c2015-05-29 02:56:46 +0000228 if (!MO.isRegMask())
Jakob Stoklund Olesenc16bf792012-07-27 21:56:39 +0000229 continue;
Duncan P. N. Exon Smith42e18352016-02-27 06:40:41 +0000230 RegMaskSlots.push_back(Indexes->getInstructionIndex(MI).getRegSlot());
Reid Klecknerbaea4d92015-11-06 02:01:02 +0000231 RegMaskBits.push_back(MO.getRegMask());
Jakob Stoklund Olesenc16bf792012-07-27 21:56:39 +0000232 }
Reid Klecknerbaea4d92015-11-06 02:01:02 +0000233 }
Reid Klecknerf0a04c02015-11-06 17:06:38 +0000234
Reid Kleckner0e6b04c2016-02-26 16:53:19 +0000235 // Some block ends, such as funclet returns, create masks. Put the mask on
236 // the last instruction of the block, because MBB slot index intervals are
237 // half-open.
Reid Klecknerf0a04c02015-11-06 17:06:38 +0000238 if (const uint32_t *Mask = MBB.getEndClobberMask(TRI)) {
Reid Kleckner0e6b04c2016-02-26 16:53:19 +0000239 assert(!MBB.empty() && "empty return block?");
240 RegMaskSlots.push_back(
Duncan P. N. Exon Smith42e18352016-02-27 06:40:41 +0000241 Indexes->getInstructionIndex(MBB.back()).getRegSlot());
Reid Klecknerf0a04c02015-11-06 17:06:38 +0000242 RegMaskBits.push_back(Mask);
243 }
244
Jakob Stoklund Olesenc16bf792012-07-27 21:56:39 +0000245 // Compute the number of register mask instructions in this block.
Dmitri Gribenko2de05722012-09-10 21:26:47 +0000246 RMB.second = RegMaskSlots.size() - RMB.first;
Jakob Stoklund Olesenc16bf792012-07-27 21:56:39 +0000247 }
248}
Jakob Stoklund Olesen3dfa38a2012-07-27 20:58:46 +0000249
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000250//===----------------------------------------------------------------------===//
251// Register Unit Liveness
252//===----------------------------------------------------------------------===//
253//
254// Fixed interference typically comes from ABI boundaries: Function arguments
255// and return values are passed in fixed registers, and so are exception
256// pointers entering landing pads. Certain instructions require values to be
257// present in specific registers. That is also represented through fixed
258// interference.
259//
260
Matthias Braun95a36002017-01-19 00:32:13 +0000261/// Compute the live range of a register unit, based on the uses and defs of
262/// aliasing registers. The range should be empty, or contain only dead
263/// phi-defs from ABI blocks.
Matthias Braun4f3b5e82013-10-10 21:29:02 +0000264void LiveIntervals::computeRegUnitRange(LiveRange &LR, unsigned Unit) {
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000265 assert(LRCalc && "LRCalc not initialized.");
266 LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
267
268 // The physregs aliasing Unit are the roots and their super-registers.
269 // Create all values as dead defs before extending to uses. Note that roots
270 // may share super-registers. That's OK because createDeadDefs() is
271 // idempotent. It is very rare for a register unit to have multiple roots, so
272 // uniquing super-registers is probably not worthwhile.
Matthias Braun01b61282017-09-01 18:36:26 +0000273 bool IsReserved = false;
Matthias Braun95a36002017-01-19 00:32:13 +0000274 for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
Matthias Braun01b61282017-09-01 18:36:26 +0000275 bool IsRootReserved = true;
Matthias Braun95a36002017-01-19 00:32:13 +0000276 for (MCSuperRegIterator Super(*Root, TRI, /*IncludeSelf=*/true);
277 Super.isValid(); ++Super) {
278 unsigned Reg = *Super;
279 if (!MRI->reg_empty(Reg))
280 LRCalc->createDeadDefs(LR, Reg);
Matthias Braun5862c982017-01-24 01:12:58 +0000281 // A register unit is considered reserved if all its roots and all their
282 // super registers are reserved.
283 if (!MRI->isReserved(Reg))
Matthias Braun01b61282017-09-01 18:36:26 +0000284 IsRootReserved = false;
Matthias Braun4151e892014-12-15 21:36:35 +0000285 }
Matthias Braun01b61282017-09-01 18:36:26 +0000286 IsReserved |= IsRootReserved;
Matthias Braun4151e892014-12-15 21:36:35 +0000287 }
Matthias Braun01b61282017-09-01 18:36:26 +0000288 assert(IsReserved == MRI->isReservedRegUnit(Unit) &&
289 "reserved computation mismatch");
Matthias Braun4151e892014-12-15 21:36:35 +0000290
291 // Now extend LR to reach all uses.
292 // Ignore uses of reserved registers. We only track defs of those.
Matthias Braun5862c982017-01-24 01:12:58 +0000293 if (!IsReserved) {
294 for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
295 for (MCSuperRegIterator Super(*Root, TRI, /*IncludeSelf=*/true);
296 Super.isValid(); ++Super) {
297 unsigned Reg = *Super;
298 if (!MRI->reg_empty(Reg))
299 LRCalc->extendToUses(LR, Reg);
300 }
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000301 }
302 }
Quentin Colombet4c2a2ac2015-02-06 18:42:41 +0000303
304 // Flush the segment set to the segment vector.
305 if (UseSegmentSetForPhysRegs)
306 LR.flushSegmentSet();
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000307}
308
Matthias Braun95a36002017-01-19 00:32:13 +0000309/// Precompute the live ranges of any register units that are live-in to an ABI
310/// block somewhere. Register values can appear without a corresponding def when
311/// entering the entry block or a landing pad.
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000312void LiveIntervals::computeLiveInRegUnits() {
Matthias Braun4f3b5e82013-10-10 21:29:02 +0000313 RegUnitRanges.resize(TRI->getNumRegUnits());
Nicola Zaghen0818e782018-05-14 12:53:11 +0000314 LLVM_DEBUG(dbgs() << "Computing live-in reg-units in ABI blocks.\n");
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000315
Matthias Braun4f3b5e82013-10-10 21:29:02 +0000316 // Keep track of the live range sets allocated.
317 SmallVector<unsigned, 8> NewRanges;
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000318
319 // Check all basic blocks for live-ins.
Matthias Braun95a36002017-01-19 00:32:13 +0000320 for (const MachineBasicBlock &MBB : *MF) {
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000321 // We only care about ABI blocks: Entry + landing pads.
Matthias Braun95a36002017-01-19 00:32:13 +0000322 if ((&MBB != &MF->front() && !MBB.isEHPad()) || MBB.livein_empty())
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000323 continue;
324
325 // Create phi-defs at Begin for all live-in registers.
Matthias Braun95a36002017-01-19 00:32:13 +0000326 SlotIndex Begin = Indexes->getMBBStartIdx(&MBB);
Nicola Zaghen0818e782018-05-14 12:53:11 +0000327 LLVM_DEBUG(dbgs() << Begin << "\t" << printMBBReference(MBB));
Matthias Braun95a36002017-01-19 00:32:13 +0000328 for (const auto &LI : MBB.liveins()) {
Matthias Braunaf5ff602015-09-09 18:08:03 +0000329 for (MCRegUnitIterator Units(LI.PhysReg, TRI); Units.isValid(); ++Units) {
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000330 unsigned Unit = *Units;
Matthias Braun4f3b5e82013-10-10 21:29:02 +0000331 LiveRange *LR = RegUnitRanges[Unit];
332 if (!LR) {
Quentin Colombet4c2a2ac2015-02-06 18:42:41 +0000333 // Use segment set to speed-up initial computation of the live range.
334 LR = RegUnitRanges[Unit] = new LiveRange(UseSegmentSetForPhysRegs);
Matthias Braun4f3b5e82013-10-10 21:29:02 +0000335 NewRanges.push_back(Unit);
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000336 }
Matthias Braun4f3b5e82013-10-10 21:29:02 +0000337 VNInfo *VNI = LR->createDeadDef(Begin, getVNInfoAllocator());
Matt Beaumont-Gay05b46f02012-06-05 23:00:03 +0000338 (void)VNI;
Nicola Zaghen0818e782018-05-14 12:53:11 +0000339 LLVM_DEBUG(dbgs() << ' ' << printRegUnit(Unit, TRI) << '#' << VNI->id);
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000340 }
341 }
Nicola Zaghen0818e782018-05-14 12:53:11 +0000342 LLVM_DEBUG(dbgs() << '\n');
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000343 }
Nicola Zaghen0818e782018-05-14 12:53:11 +0000344 LLVM_DEBUG(dbgs() << "Created " << NewRanges.size() << " new intervals.\n");
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000345
Matthias Braun4f3b5e82013-10-10 21:29:02 +0000346 // Compute the 'normal' part of the ranges.
Matthias Braun95a36002017-01-19 00:32:13 +0000347 for (unsigned Unit : NewRanges)
Matthias Braun4f3b5e82013-10-10 21:29:02 +0000348 computeRegUnitRange(*RegUnitRanges[Unit], Unit);
Jakob Stoklund Olesen34c6f982012-06-05 22:02:15 +0000349}
350
Matthias Braune59399c2014-12-10 01:12:18 +0000351static void createSegmentsForValues(LiveRange &LR,
Matthias Braun95a36002017-01-19 00:32:13 +0000352 iterator_range<LiveInterval::vni_iterator> VNIs) {
353 for (VNInfo *VNI : VNIs) {
Matthias Braune59399c2014-12-10 01:12:18 +0000354 if (VNI->isUnused())
355 continue;
356 SlotIndex Def = VNI->def;
357 LR.addSegment(LiveRange::Segment(Def, Def.getDeadSlot(), VNI));
358 }
359}
360
Krzysztof Parzyszek2c45bcb2018-06-26 14:37:16 +0000361void LiveIntervals::extendSegmentsToUses(LiveRange &Segments,
362 ShrinkToUsesWorkList &WorkList,
363 unsigned Reg, LaneBitmask LaneMask) {
Matthias Braune59399c2014-12-10 01:12:18 +0000364 // Keep track of the PHIs that are in use.
365 SmallPtrSet<VNInfo*, 8> UsedPHIs;
366 // Blocks that have already been added to WorkList as live-out.
Matthias Braun95a36002017-01-19 00:32:13 +0000367 SmallPtrSet<const MachineBasicBlock*, 16> LiveOut;
Matthias Braune59399c2014-12-10 01:12:18 +0000368
Krzysztof Parzyszek2c45bcb2018-06-26 14:37:16 +0000369 auto getSubRange = [](const LiveInterval &I, LaneBitmask M)
370 -> const LiveRange& {
371 if (M.none())
372 return I;
373 for (const LiveInterval::SubRange &SR : I.subranges()) {
374 if ((SR.LaneMask & M).any()) {
375 assert(SR.LaneMask == M && "Expecting lane masks to match exactly");
376 return SR;
377 }
378 }
379 llvm_unreachable("Subrange for mask not found");
380 };
381
382 const LiveInterval &LI = getInterval(Reg);
383 const LiveRange &OldRange = getSubRange(LI, LaneMask);
384
Matthias Braune59399c2014-12-10 01:12:18 +0000385 // Extend intervals to reach all uses in WorkList.
386 while (!WorkList.empty()) {
387 SlotIndex Idx = WorkList.back().first;
388 VNInfo *VNI = WorkList.back().second;
389 WorkList.pop_back();
Krzysztof Parzyszek2c45bcb2018-06-26 14:37:16 +0000390 const MachineBasicBlock *MBB = Indexes->getMBBFromIndex(Idx.getPrevSlot());
391 SlotIndex BlockStart = Indexes->getMBBStartIdx(MBB);
Matthias Braune59399c2014-12-10 01:12:18 +0000392
393 // Extend the live range for VNI to be live at Idx.
Krzysztof Parzyszek2c45bcb2018-06-26 14:37:16 +0000394 if (VNInfo *ExtVNI = Segments.extendInBlock(BlockStart, Idx)) {
Matthias Braune59399c2014-12-10 01:12:18 +0000395 assert(ExtVNI == VNI && "Unexpected existing value number");
396 (void)ExtVNI;
397 // Is this a PHIDef we haven't seen before?
398 if (!VNI->isPHIDef() || VNI->def != BlockStart ||
399 !UsedPHIs.insert(VNI).second)
400 continue;
401 // The PHI is live, make sure the predecessors are live-out.
Matthias Braun95a36002017-01-19 00:32:13 +0000402 for (const MachineBasicBlock *Pred : MBB->predecessors()) {
Matthias Braune59399c2014-12-10 01:12:18 +0000403 if (!LiveOut.insert(Pred).second)
404 continue;
Krzysztof Parzyszek2c45bcb2018-06-26 14:37:16 +0000405 SlotIndex Stop = Indexes->getMBBEndIdx(Pred);
Matthias Braune59399c2014-12-10 01:12:18 +0000406 // A predecessor is not required to have a live-out value for a PHI.
407 if (VNInfo *PVNI = OldRange.getVNInfoBefore(Stop))
408 WorkList.push_back(std::make_pair(Stop, PVNI));
409 }
410 continue;
411 }
412
413 // VNI is live-in to MBB.
Nicola Zaghen0818e782018-05-14 12:53:11 +0000414 LLVM_DEBUG(dbgs() << " live-in at " << BlockStart << '\n');
Krzysztof Parzyszek2c45bcb2018-06-26 14:37:16 +0000415 Segments.addSegment(LiveRange::Segment(BlockStart, Idx, VNI));
Matthias Braune59399c2014-12-10 01:12:18 +0000416
417 // Make sure VNI is live-out from the predecessors.
Matthias Braun95a36002017-01-19 00:32:13 +0000418 for (const MachineBasicBlock *Pred : MBB->predecessors()) {
Matthias Braune59399c2014-12-10 01:12:18 +0000419 if (!LiveOut.insert(Pred).second)
420 continue;
Krzysztof Parzyszek2c45bcb2018-06-26 14:37:16 +0000421 SlotIndex Stop = Indexes->getMBBEndIdx(Pred);
422 if (VNInfo *OldVNI = OldRange.getVNInfoBefore(Stop)) {
423 assert(OldVNI == VNI && "Wrong value out of predecessor");
Krzysztof Parzyszeke8739392018-06-26 14:55:04 +0000424 (void)OldVNI;
Krzysztof Parzyszek2c45bcb2018-06-26 14:37:16 +0000425 WorkList.push_back(std::make_pair(Stop, VNI));
426 } else {
427#ifndef NDEBUG
428 // There was no old VNI. Verify that Stop is jointly dominated
429 // by <undef>s for this live range.
430 assert(LaneMask.any() &&
431 "Missing value out of predecessor for main range");
432 SmallVector<SlotIndex,8> Undefs;
433 LI.computeSubRangeUndefs(Undefs, LaneMask, *MRI, *Indexes);
434 assert(LiveRangeCalc::isJointlyDominated(Pred, Undefs, *Indexes) &&
435 "Missing value out of predecessor for subrange");
436#endif
437 }
Matthias Braune59399c2014-12-10 01:12:18 +0000438 }
439 }
440}
441
Jakob Stoklund Olesen6a3dbd32011-03-17 20:37:07 +0000442bool LiveIntervals::shrinkToUses(LiveInterval *li,
Jakob Stoklund Olesen0d8ccaa2011-03-07 23:29:10 +0000443 SmallVectorImpl<MachineInstr*> *dead) {
Nicola Zaghen0818e782018-05-14 12:53:11 +0000444 LLVM_DEBUG(dbgs() << "Shrink: " << *li << '\n');
Jakob Stoklund Olesen11513e52011-02-08 00:03:05 +0000445 assert(TargetRegisterInfo::isVirtualRegister(li->reg)
Lang Hames567cdba2012-01-03 20:05:57 +0000446 && "Can only shrink virtual registers");
Jakob Stoklund Olesen11513e52011-02-08 00:03:05 +0000447
Matthias Braune59399c2014-12-10 01:12:18 +0000448 // Shrink subregister live ranges.
Matthias Braun0219a272015-07-16 18:55:35 +0000449 bool NeedsCleanup = false;
Matthias Braun1bfcc2d2014-12-11 00:59:06 +0000450 for (LiveInterval::SubRange &S : li->subranges()) {
451 shrinkToUses(S, li->reg);
Matthias Braun0219a272015-07-16 18:55:35 +0000452 if (S.empty())
453 NeedsCleanup = true;
Matthias Braune59399c2014-12-10 01:12:18 +0000454 }
Matthias Braun0219a272015-07-16 18:55:35 +0000455 if (NeedsCleanup)
456 li->removeEmptySubRanges();
Matthias Braune59399c2014-12-10 01:12:18 +0000457
458 // Find all the values used, including PHI kills.
459 ShrinkToUsesWorkList WorkList;
Jakob Stoklund Olesen031432f2011-09-15 15:24:16 +0000460
Jakob Stoklund Olesen11513e52011-02-08 00:03:05 +0000461 // Visit all instructions reading li->reg.
Matthias Braun95a36002017-01-19 00:32:13 +0000462 unsigned Reg = li->reg;
463 for (MachineInstr &UseMI : MRI->reg_instructions(Reg)) {
464 if (UseMI.isDebugValue() || !UseMI.readsVirtualRegister(Reg))
Jakob Stoklund Olesen11513e52011-02-08 00:03:05 +0000465 continue;
Matthias Braun95a36002017-01-19 00:32:13 +0000466 SlotIndex Idx = getInstructionIndex(UseMI).getRegSlot();
Matthias Braun5649e252013-10-10 21:28:52 +0000467 LiveQueryResult LRQ = li->Query(Idx);
Jakob Stoklund Olesen97769fc2012-05-20 02:54:52 +0000468 VNInfo *VNI = LRQ.valueIn();
Jakob Stoklund Olesen9ef931e2011-03-18 03:06:04 +0000469 if (!VNI) {
470 // This shouldn't happen: readsVirtualRegister returns true, but there is
471 // no live value. It is likely caused by a target getting <undef> flags
472 // wrong.
Nicola Zaghen0818e782018-05-14 12:53:11 +0000473 LLVM_DEBUG(
474 dbgs() << Idx << '\t' << UseMI
475 << "Warning: Instr claims to read non-existent value in "
476 << *li << '\n');
Jakob Stoklund Olesen9ef931e2011-03-18 03:06:04 +0000477 continue;
478 }
Jakob Stoklund Olesenf054e192011-11-14 18:45:38 +0000479 // Special case: An early-clobber tied operand reads and writes the
Jakob Stoklund Olesen97769fc2012-05-20 02:54:52 +0000480 // register one slot early.
481 if (VNInfo *DefVNI = LRQ.valueDefined())
482 Idx = DefVNI->def;
483
Jakob Stoklund Olesen11513e52011-02-08 00:03:05 +0000484 WorkList.push_back(std::make_pair(Idx, VNI));
485 }
486
Matthias Braun87a86052013-10-10 21:28:47 +0000487 // Create new live ranges with only minimal live segments per def.
488 LiveRange NewLR;
Matthias Braune59399c2014-12-10 01:12:18 +0000489 createSegmentsForValues(NewLR, make_range(li->vni_begin(), li->vni_end()));
Krzysztof Parzyszek2c45bcb2018-06-26 14:37:16 +0000490 extendSegmentsToUses(NewLR, WorkList, Reg, LaneBitmask::getNone());
Jakob Stoklund Olesen11513e52011-02-08 00:03:05 +0000491
Pete Cooperdc6eaa42014-06-03 22:42:10 +0000492 // Move the trimmed segments back.
493 li->segments.swap(NewLR.segments);
Matthias Braunb82636b2014-12-18 19:58:52 +0000494
495 // Handle dead values.
496 bool CanSeparate = computeDeadValues(*li, dead);
Nicola Zaghen0818e782018-05-14 12:53:11 +0000497 LLVM_DEBUG(dbgs() << "Shrunk: " << *li << '\n');
Pete Cooperdc6eaa42014-06-03 22:42:10 +0000498 return CanSeparate;
499}
500
Matthias Braunb82636b2014-12-18 19:58:52 +0000501bool LiveIntervals::computeDeadValues(LiveInterval &LI,
Pete Cooperdc6eaa42014-06-03 22:42:10 +0000502 SmallVectorImpl<MachineInstr*> *dead) {
Matthias Braun64048502015-09-22 22:37:44 +0000503 bool MayHaveSplitComponents = false;
Matthias Braun95a36002017-01-19 00:32:13 +0000504 for (VNInfo *VNI : LI.valnos) {
Jakob Stoklund Olesen11513e52011-02-08 00:03:05 +0000505 if (VNI->isUnused())
506 continue;
Matthias Braun9a43e3d2015-01-21 22:55:13 +0000507 SlotIndex Def = VNI->def;
508 LiveRange::iterator I = LI.FindSegmentContaining(Def);
Matthias Braunb82636b2014-12-18 19:58:52 +0000509 assert(I != LI.end() && "Missing segment for VNI");
Matthias Braun9a43e3d2015-01-21 22:55:13 +0000510
511 // Is the register live before? Otherwise we may have to add a read-undef
512 // flag for subregister defs.
Matthias Braun64048502015-09-22 22:37:44 +0000513 unsigned VReg = LI.reg;
514 if (MRI->shouldTrackSubRegLiveness(VReg)) {
Matthias Braun9a43e3d2015-01-21 22:55:13 +0000515 if ((I == LI.begin() || std::prev(I)->end < Def) && !VNI->isPHIDef()) {
516 MachineInstr *MI = getInstructionFromIndex(Def);
Matthias Braunf98fd352015-11-11 00:41:58 +0000517 MI->setRegisterDefReadUndef(VReg);
Matthias Braun9a43e3d2015-01-21 22:55:13 +0000518 }
519 }
520
521 if (I->end != Def.getDeadSlot())
Jakob Stoklund Olesen11513e52011-02-08 00:03:05 +0000522 continue;
Jakob Stoklund Olesena4d34732011-03-02 00:33:01 +0000523 if (VNI->isPHIDef()) {
Jakob Stoklund Olesen11513e52011-02-08 00:03:05 +0000524 // This is a dead PHI. Remove it.
Jakob Stoklund Olesenb2beac22012-08-03 20:59:32 +0000525 VNI->markUnused();
Matthias Braunb82636b2014-12-18 19:58:52 +0000526 LI.removeSegment(I);
Nicola Zaghen0818e782018-05-14 12:53:11 +0000527 LLVM_DEBUG(dbgs() << "Dead PHI at " << Def << " may separate interval\n");
Matthias Braun64048502015-09-22 22:37:44 +0000528 MayHaveSplitComponents = true;
Matthias Braunb82636b2014-12-18 19:58:52 +0000529 } else {
Jakob Stoklund Olesen11513e52011-02-08 00:03:05 +0000530 // This is a dead def. Make sure the instruction knows.
Matthias Braun9a43e3d2015-01-21 22:55:13 +0000531 MachineInstr *MI = getInstructionFromIndex(Def);
Jakob Stoklund Olesen11513e52011-02-08 00:03:05 +0000532 assert(MI && "No instruction defining live value");
Matthias Braun277501a2016-04-28 20:35:26 +0000533 MI->addRegisterDead(LI.reg, TRI);
Jakob Stoklund Olesen0d8ccaa2011-03-07 23:29:10 +0000534 if (dead && MI->allDefsAreDead()) {
Nicola Zaghen0818e782018-05-14 12:53:11 +0000535 LLVM_DEBUG(dbgs() << "All defs dead: " << Def << '\t' << *MI);
Jakob Stoklund Olesen0d8ccaa2011-03-07 23:29:10 +0000536 dead->push_back(MI);
537 }
Jakob Stoklund Olesen11513e52011-02-08 00:03:05 +0000538 }
539 }
Matthias Braun64048502015-09-22 22:37:44 +0000540 return MayHaveSplitComponents;
Matthias Braune59399c2014-12-10 01:12:18 +0000541}
542
Krzysztof Parzyszek31a5f882016-08-24 13:37:55 +0000543void LiveIntervals::shrinkToUses(LiveInterval::SubRange &SR, unsigned Reg) {
Nicola Zaghen0818e782018-05-14 12:53:11 +0000544 LLVM_DEBUG(dbgs() << "Shrink: " << SR << '\n');
Matthias Braune59399c2014-12-10 01:12:18 +0000545 assert(TargetRegisterInfo::isVirtualRegister(Reg)
546 && "Can only shrink virtual registers");
547 // Find all the values used, including PHI kills.
548 ShrinkToUsesWorkList WorkList;
549
550 // Visit all instructions reading Reg.
551 SlotIndex LastIdx;
Krzysztof Parzyszek57c58d32016-09-02 19:48:55 +0000552 for (MachineOperand &MO : MRI->use_nodbg_operands(Reg)) {
553 // Skip "undef" uses.
554 if (!MO.readsReg())
Matthias Braune59399c2014-12-10 01:12:18 +0000555 continue;
556 // Maybe the operand is for a subregister we don't care about.
557 unsigned SubReg = MO.getSubReg();
558 if (SubReg != 0) {
Matthias Braundfc5b652015-09-25 21:51:14 +0000559 LaneBitmask LaneMask = TRI->getSubRegIndexLaneMask(SubReg);
Krzysztof Parzyszekd6ca3f02016-12-15 14:36:06 +0000560 if ((LaneMask & SR.LaneMask).none())
Matthias Braune59399c2014-12-10 01:12:18 +0000561 continue;
562 }
563 // We only need to visit each instruction once.
Krzysztof Parzyszek57c58d32016-09-02 19:48:55 +0000564 MachineInstr *UseMI = MO.getParent();
Duncan P. N. Exon Smith42e18352016-02-27 06:40:41 +0000565 SlotIndex Idx = getInstructionIndex(*UseMI).getRegSlot();
Matthias Braune59399c2014-12-10 01:12:18 +0000566 if (Idx == LastIdx)
567 continue;
568 LastIdx = Idx;
569
570 LiveQueryResult LRQ = SR.Query(Idx);
571 VNInfo *VNI = LRQ.valueIn();
572 // For Subranges it is possible that only undef values are left in that
573 // part of the subregister, so there is no real liverange at the use
574 if (!VNI)
575 continue;
576
577 // Special case: An early-clobber tied operand reads and writes the
578 // register one slot early.
579 if (VNInfo *DefVNI = LRQ.valueDefined())
580 Idx = DefVNI->def;
581
582 WorkList.push_back(std::make_pair(Idx, VNI));
583 }
584
585 // Create a new live ranges with only minimal live segments per def.
586 LiveRange NewLR;
587 createSegmentsForValues(NewLR, make_range(SR.vni_begin(), SR.vni_end()));
Krzysztof Parzyszek2c45bcb2018-06-26 14:37:16 +0000588 extendSegmentsToUses(NewLR, WorkList, Reg, SR.LaneMask);
Matthias Braune59399c2014-12-10 01:12:18 +0000589
Matthias Braune59399c2014-12-10 01:12:18 +0000590 // Move the trimmed ranges back.
591 SR.segments.swap(NewLR.segments);
Matthias Braunb82636b2014-12-18 19:58:52 +0000592
593 // Remove dead PHI value numbers
Matthias Braun95a36002017-01-19 00:32:13 +0000594 for (VNInfo *VNI : SR.valnos) {
Matthias Braunb82636b2014-12-18 19:58:52 +0000595 if (VNI->isUnused())
596 continue;
597 const LiveRange::Segment *Segment = SR.getSegmentContaining(VNI->def);
598 assert(Segment != nullptr && "Missing segment for VNI");
599 if (Segment->end != VNI->def.getDeadSlot())
600 continue;
601 if (VNI->isPHIDef()) {
602 // This is a dead PHI. Remove it.
Nicola Zaghen0818e782018-05-14 12:53:11 +0000603 LLVM_DEBUG(dbgs() << "Dead PHI at " << VNI->def
604 << " may separate interval\n");
Matthias Braunb82636b2014-12-18 19:58:52 +0000605 VNI->markUnused();
606 SR.removeSegment(*Segment);
Matthias Braunb82636b2014-12-18 19:58:52 +0000607 }
608 }
609
Nicola Zaghen0818e782018-05-14 12:53:11 +0000610 LLVM_DEBUG(dbgs() << "Shrunk: " << SR << '\n');
Jakob Stoklund Olesen11513e52011-02-08 00:03:05 +0000611}
612
Matthias Braune25dde52013-10-10 21:28:57 +0000613void LiveIntervals::extendToIndices(LiveRange &LR,
Krzysztof Parzyszeke0daa1e2016-09-01 12:10:36 +0000614 ArrayRef<SlotIndex> Indices,
615 ArrayRef<SlotIndex> Undefs) {
Jakob Stoklund Olesen87f78642012-09-17 23:03:25 +0000616 assert(LRCalc && "LRCalc not initialized.");
617 LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
Matthias Braun95a36002017-01-19 00:32:13 +0000618 for (SlotIndex Idx : Indices)
619 LRCalc->extend(LR, Idx, /*PhysReg=*/0, Undefs);
Jakob Stoklund Olesen87f78642012-09-17 23:03:25 +0000620}
621
Matthias Braun6e616d22014-12-10 01:12:36 +0000622void LiveIntervals::pruneValue(LiveRange &LR, SlotIndex Kill,
Jakob Stoklund Olesen87f78642012-09-17 23:03:25 +0000623 SmallVectorImpl<SlotIndex> *EndPoints) {
Matthias Braun6e616d22014-12-10 01:12:36 +0000624 LiveQueryResult LRQ = LR.Query(Kill);
625 VNInfo *VNI = LRQ.valueOutOrDead();
Jakob Stoklund Olesen87f78642012-09-17 23:03:25 +0000626 if (!VNI)
627 return;
628
629 MachineBasicBlock *KillMBB = Indexes->getMBBFromIndex(Kill);
Matthias Braun6e616d22014-12-10 01:12:36 +0000630 SlotIndex MBBEnd = Indexes->getMBBEndIdx(KillMBB);
Jakob Stoklund Olesen87f78642012-09-17 23:03:25 +0000631
632 // If VNI isn't live out from KillMBB, the value is trivially pruned.
633 if (LRQ.endPoint() < MBBEnd) {
Matthias Braun6e616d22014-12-10 01:12:36 +0000634 LR.removeSegment(Kill, LRQ.endPoint());
Jakob Stoklund Olesen87f78642012-09-17 23:03:25 +0000635 if (EndPoints) EndPoints->push_back(LRQ.endPoint());
636 return;
637 }
638
639 // VNI is live out of KillMBB.
Matthias Braun6e616d22014-12-10 01:12:36 +0000640 LR.removeSegment(Kill, MBBEnd);
Jakob Stoklund Olesen87f78642012-09-17 23:03:25 +0000641 if (EndPoints) EndPoints->push_back(MBBEnd);
642
Jakob Stoklund Olesenaf896902012-10-13 16:15:31 +0000643 // Find all blocks that are reachable from KillMBB without leaving VNI's live
644 // range. It is possible that KillMBB itself is reachable, so start a DFS
645 // from each successor.
Eugene Zelenko64632962017-05-24 23:10:29 +0000646 using VisitedTy = df_iterator_default_set<MachineBasicBlock*,9>;
Jakob Stoklund Olesenaf896902012-10-13 16:15:31 +0000647 VisitedTy Visited;
Matthias Braun95a36002017-01-19 00:32:13 +0000648 for (MachineBasicBlock *Succ : KillMBB->successors()) {
Jakob Stoklund Olesenaf896902012-10-13 16:15:31 +0000649 for (df_ext_iterator<MachineBasicBlock*, VisitedTy>
Matthias Braun95a36002017-01-19 00:32:13 +0000650 I = df_ext_begin(Succ, Visited), E = df_ext_end(Succ, Visited);
Jakob Stoklund Olesenaf896902012-10-13 16:15:31 +0000651 I != E;) {
652 MachineBasicBlock *MBB = *I;
653
654 // Check if VNI is live in to MBB.
Matthias Braun6e616d22014-12-10 01:12:36 +0000655 SlotIndex MBBStart, MBBEnd;
Benjamin Kramera4f0aad2014-03-02 13:30:33 +0000656 std::tie(MBBStart, MBBEnd) = Indexes->getMBBRange(MBB);
Matthias Braun6e616d22014-12-10 01:12:36 +0000657 LiveQueryResult LRQ = LR.Query(MBBStart);
Jakob Stoklund Olesenaf896902012-10-13 16:15:31 +0000658 if (LRQ.valueIn() != VNI) {
Matthias Braun331de112013-10-10 21:28:43 +0000659 // This block isn't part of the VNI segment. Prune the search.
Jakob Stoklund Olesenaf896902012-10-13 16:15:31 +0000660 I.skipChildren();
661 continue;
662 }
663
664 // Prune the search if VNI is killed in MBB.
665 if (LRQ.endPoint() < MBBEnd) {
Matthias Braun6e616d22014-12-10 01:12:36 +0000666 LR.removeSegment(MBBStart, LRQ.endPoint());
Jakob Stoklund Olesenaf896902012-10-13 16:15:31 +0000667 if (EndPoints) EndPoints->push_back(LRQ.endPoint());
668 I.skipChildren();
669 continue;
670 }
671
672 // VNI is live through MBB.
Matthias Braun6e616d22014-12-10 01:12:36 +0000673 LR.removeSegment(MBBStart, MBBEnd);
Jakob Stoklund Olesenaf896902012-10-13 16:15:31 +0000674 if (EndPoints) EndPoints->push_back(MBBEnd);
Jakob Stoklund Olesen87f78642012-09-17 23:03:25 +0000675 ++I;
Jakob Stoklund Olesen87f78642012-09-17 23:03:25 +0000676 }
Jakob Stoklund Olesen87f78642012-09-17 23:03:25 +0000677 }
678}
Jakob Stoklund Olesen11513e52011-02-08 00:03:05 +0000679
Evan Chengf2fbca62007-11-12 06:35:08 +0000680//===----------------------------------------------------------------------===//
681// Register allocator hooks.
682//
683
Jakob Stoklund Olesene617ccb2012-09-06 18:15:18 +0000684void LiveIntervals::addKillFlags(const VirtRegMap *VRM) {
685 // Keep track of regunit ranges.
Matthias Braun1f6bcf12014-12-20 01:54:48 +0000686 SmallVector<std::pair<const LiveRange*, LiveRange::const_iterator>, 8> RU;
Matthias Braun4acc5142014-12-20 01:54:50 +0000687 // Keep track of subregister ranges.
688 SmallVector<std::pair<const LiveInterval::SubRange*,
689 LiveRange::const_iterator>, 4> SRs;
Jakob Stoklund Olesene617ccb2012-09-06 18:15:18 +0000690
Jakob Stoklund Olesen12a7be92012-06-20 23:23:59 +0000691 for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
692 unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
Jakob Stoklund Olesen15f1d8c2012-06-04 22:39:14 +0000693 if (MRI->reg_nodbg_empty(Reg))
Jakob Stoklund Olesen8a61da82011-02-08 21:13:03 +0000694 continue;
Matthias Braun1f6bcf12014-12-20 01:54:48 +0000695 const LiveInterval &LI = getInterval(Reg);
696 if (LI.empty())
Jakob Stoklund Olesene617ccb2012-09-06 18:15:18 +0000697 continue;
698
699 // Find the regunit intervals for the assigned register. They may overlap
700 // the virtual register live range, cancelling any kills.
701 RU.clear();
Matthias Braun95a36002017-01-19 00:32:13 +0000702 for (MCRegUnitIterator Unit(VRM->getPhys(Reg), TRI); Unit.isValid();
703 ++Unit) {
704 const LiveRange &RURange = getRegUnit(*Unit);
Matthias Braun1f6bcf12014-12-20 01:54:48 +0000705 if (RURange.empty())
Jakob Stoklund Olesene617ccb2012-09-06 18:15:18 +0000706 continue;
Matthias Braun1f6bcf12014-12-20 01:54:48 +0000707 RU.push_back(std::make_pair(&RURange, RURange.find(LI.begin()->end)));
Jakob Stoklund Olesene617ccb2012-09-06 18:15:18 +0000708 }
Jakob Stoklund Olesen8a61da82011-02-08 21:13:03 +0000709
Matthias Braun5101c892015-03-19 00:21:58 +0000710 if (MRI->subRegLivenessEnabled()) {
Matthias Braun4acc5142014-12-20 01:54:50 +0000711 SRs.clear();
712 for (const LiveInterval::SubRange &SR : LI.subranges()) {
713 SRs.push_back(std::make_pair(&SR, SR.find(LI.begin()->end)));
714 }
715 }
716
Matthias Braun331de112013-10-10 21:28:43 +0000717 // Every instruction that kills Reg corresponds to a segment range end
718 // point.
Matthias Braun1f6bcf12014-12-20 01:54:48 +0000719 for (LiveInterval::const_iterator RI = LI.begin(), RE = LI.end(); RI != RE;
Jakob Stoklund Olesen8a61da82011-02-08 21:13:03 +0000720 ++RI) {
Jakob Stoklund Olesen2debd482011-11-13 20:45:27 +0000721 // A block index indicates an MBB edge.
722 if (RI->end.isBlock())
Jakob Stoklund Olesen8a61da82011-02-08 21:13:03 +0000723 continue;
724 MachineInstr *MI = getInstructionFromIndex(RI->end);
725 if (!MI)
726 continue;
Jakob Stoklund Olesene617ccb2012-09-06 18:15:18 +0000727
Matthias Braunb1aa5e42013-10-04 16:52:58 +0000728 // Check if any of the regunits are live beyond the end of RI. That could
Jakob Stoklund Olesene617ccb2012-09-06 18:15:18 +0000729 // happen when a physreg is defined as a copy of a virtreg:
730 //
Francis Visoiu Mistrih73846522017-11-30 12:12:19 +0000731 // %eax = COPY %5
732 // FOO %5 <--- MI, cancel kill because %eax is live.
Francis Visoiu Mistrihfd11bc02017-12-07 10:40:31 +0000733 // BAR killed %eax
Jakob Stoklund Olesene617ccb2012-09-06 18:15:18 +0000734 //
Francis Visoiu Mistrih73846522017-11-30 12:12:19 +0000735 // There should be no kill flag on FOO when %5 is rewritten as %eax.
Matthias Braun1f6bcf12014-12-20 01:54:48 +0000736 for (auto &RUP : RU) {
737 const LiveRange &RURange = *RUP.first;
Matthias Braun94daece2014-12-24 02:11:43 +0000738 LiveRange::const_iterator &I = RUP.second;
Matthias Braun1f6bcf12014-12-20 01:54:48 +0000739 if (I == RURange.end())
Jakob Stoklund Olesene617ccb2012-09-06 18:15:18 +0000740 continue;
Matthias Braun1f6bcf12014-12-20 01:54:48 +0000741 I = RURange.advanceTo(I, RI->end);
742 if (I == RURange.end() || I->start >= RI->end)
Jakob Stoklund Olesene617ccb2012-09-06 18:15:18 +0000743 continue;
744 // I is overlapping RI.
Matthias Braun4acc5142014-12-20 01:54:50 +0000745 goto CancelKill;
Jakob Stoklund Olesene617ccb2012-09-06 18:15:18 +0000746 }
Matthias Braun66813242014-12-10 01:13:04 +0000747
Matthias Braun5101c892015-03-19 00:21:58 +0000748 if (MRI->subRegLivenessEnabled()) {
Matthias Braun4acc5142014-12-20 01:54:50 +0000749 // When reading a partial undefined value we must not add a kill flag.
750 // The regalloc might have used the undef lane for something else.
751 // Example:
Francis Visoiu Mistrih73846522017-11-30 12:12:19 +0000752 // %1 = ... ; R32: %1
753 // %2:high16 = ... ; R64: %2
Francis Visoiu Mistrihfd11bc02017-12-07 10:40:31 +0000754 // = read killed %2 ; R64: %2
Francis Visoiu Mistrih73846522017-11-30 12:12:19 +0000755 // = read %1 ; R32: %1
756 // The <kill> flag is correct for %2, but the register allocator may
757 // assign R0L to %1, and R0 to %2 because the low 32bits of R0
758 // are actually never written by %2. After assignment the <kill>
Matthias Braun4acc5142014-12-20 01:54:50 +0000759 // flag at the read instruction is invalid.
Matthias Braundfc5b652015-09-25 21:51:14 +0000760 LaneBitmask DefinedLanesMask;
Matthias Braun4acc5142014-12-20 01:54:50 +0000761 if (!SRs.empty()) {
762 // Compute a mask of lanes that are defined.
Krzysztof Parzyszekd6ca3f02016-12-15 14:36:06 +0000763 DefinedLanesMask = LaneBitmask::getNone();
Matthias Braun4acc5142014-12-20 01:54:50 +0000764 for (auto &SRP : SRs) {
765 const LiveInterval::SubRange &SR = *SRP.first;
Matthias Braun94daece2014-12-24 02:11:43 +0000766 LiveRange::const_iterator &I = SRP.second;
Matthias Braun4acc5142014-12-20 01:54:50 +0000767 if (I == SR.end())
768 continue;
769 I = SR.advanceTo(I, RI->end);
770 if (I == SR.end() || I->start >= RI->end)
771 continue;
772 // I is overlapping RI
773 DefinedLanesMask |= SR.LaneMask;
Matthias Braun66813242014-12-10 01:13:04 +0000774 }
Matthias Braun4acc5142014-12-20 01:54:50 +0000775 } else
Krzysztof Parzyszekd6ca3f02016-12-15 14:36:06 +0000776 DefinedLanesMask = LaneBitmask::getAll();
Matthias Braun4acc5142014-12-20 01:54:50 +0000777
778 bool IsFullWrite = false;
779 for (const MachineOperand &MO : MI->operands()) {
780 if (!MO.isReg() || MO.getReg() != Reg)
781 continue;
782 if (MO.isUse()) {
783 // Reading any undefined lanes?
Matthias Braundfc5b652015-09-25 21:51:14 +0000784 LaneBitmask UseMask = TRI->getSubRegIndexLaneMask(MO.getSubReg());
Krzysztof Parzyszek308c60d2016-12-16 19:11:56 +0000785 if ((UseMask & ~DefinedLanesMask).any())
Matthias Braun4acc5142014-12-20 01:54:50 +0000786 goto CancelKill;
787 } else if (MO.getSubReg() == 0) {
788 // Writing to the full register?
789 assert(MO.isDef());
790 IsFullWrite = true;
791 }
792 }
793
794 // If an instruction writes to a subregister, a new segment starts in
795 // the LiveInterval. But as this is only overriding part of the register
796 // adding kill-flags is not correct here after registers have been
797 // assigned.
798 if (!IsFullWrite) {
799 // Next segment has to be adjacent in the subregister write case.
800 LiveRange::const_iterator N = std::next(RI);
801 if (N != LI.end() && N->start == RI->end)
802 goto CancelKill;
Matthias Braun66813242014-12-10 01:13:04 +0000803 }
804 }
805
Matthias Braun4acc5142014-12-20 01:54:50 +0000806 MI->addRegisterKilled(Reg, nullptr);
807 continue;
808CancelKill:
809 MI->clearRegisterKills(Reg, nullptr);
Jakob Stoklund Olesen8a61da82011-02-08 21:13:03 +0000810 }
811 }
812}
813
Jakob Stoklund Olesenebf27502012-02-10 01:23:55 +0000814MachineBasicBlock*
815LiveIntervals::intervalIsInOneMBB(const LiveInterval &LI) const {
816 // A local live range must be fully contained inside the block, meaning it is
817 // defined and killed at instructions, not at block boundaries. It is not
Hiroshi Inoueef1bc2d2018-04-12 05:53:20 +0000818 // live in or out of any block.
Jakob Stoklund Olesenebf27502012-02-10 01:23:55 +0000819 //
820 // It is technically possible to have a PHI-defined live range identical to a
821 // single block, but we are going to return false in that case.
Lang Hames233a60e2009-11-03 23:52:08 +0000822
Jakob Stoklund Olesenebf27502012-02-10 01:23:55 +0000823 SlotIndex Start = LI.beginIndex();
824 if (Start.isBlock())
Craig Topper4ba84432014-04-14 00:51:57 +0000825 return nullptr;
Lang Hames233a60e2009-11-03 23:52:08 +0000826
Jakob Stoklund Olesenebf27502012-02-10 01:23:55 +0000827 SlotIndex Stop = LI.endIndex();
828 if (Stop.isBlock())
Craig Topper4ba84432014-04-14 00:51:57 +0000829 return nullptr;
Lang Hames233a60e2009-11-03 23:52:08 +0000830
Jakob Stoklund Olesenebf27502012-02-10 01:23:55 +0000831 // getMBBFromIndex doesn't need to search the MBB table when both indexes
832 // belong to proper instructions.
Jakob Stoklund Olesen15f1d8c2012-06-04 22:39:14 +0000833 MachineBasicBlock *MBB1 = Indexes->getMBBFromIndex(Start);
834 MachineBasicBlock *MBB2 = Indexes->getMBBFromIndex(Stop);
Craig Topper4ba84432014-04-14 00:51:57 +0000835 return MBB1 == MBB2 ? MBB1 : nullptr;
Evan Cheng81a03822007-11-17 00:40:40 +0000836}
837
Jakob Stoklund Olesen0ab71032012-08-03 20:10:24 +0000838bool
839LiveIntervals::hasPHIKill(const LiveInterval &LI, const VNInfo *VNI) const {
Matthias Braun218d20a2014-12-10 23:07:54 +0000840 for (const VNInfo *PHI : LI.valnos) {
Jakob Stoklund Olesen0ab71032012-08-03 20:10:24 +0000841 if (PHI->isUnused() || !PHI->isPHIDef())
842 continue;
843 const MachineBasicBlock *PHIMBB = getMBBFromIndex(PHI->def);
844 // Conservatively return true instead of scanning huge predecessor lists.
845 if (PHIMBB->pred_size() > 100)
846 return true;
Matthias Braun95a36002017-01-19 00:32:13 +0000847 for (const MachineBasicBlock *Pred : PHIMBB->predecessors())
848 if (VNI == LI.getVNInfoBefore(Indexes->getMBBEndIdx(Pred)))
Jakob Stoklund Olesen0ab71032012-08-03 20:10:24 +0000849 return true;
850 }
851 return false;
852}
853
Duncan P. N. Exon Smith5144d352016-02-27 20:14:29 +0000854float LiveIntervals::getSpillWeight(bool isDef, bool isUse,
855 const MachineBlockFrequencyInfo *MBFI,
856 const MachineInstr &MI) {
Marina Yatsinab76f9892017-10-22 17:59:38 +0000857 return getSpillWeight(isDef, isUse, MBFI, MI.getParent());
858}
859
860float LiveIntervals::getSpillWeight(bool isDef, bool isUse,
861 const MachineBlockFrequencyInfo *MBFI,
862 const MachineBasicBlock *MBB) {
863 BlockFrequency Freq = MBFI->getBlockFreq(MBB);
Michael Gottesman523823b2013-12-14 02:37:38 +0000864 const float Scale = 1.0f / MBFI->getEntryFreq();
Michael Gottesmanf392e882013-12-14 00:53:32 +0000865 return (isDef + isUse) * (Freq.getFrequency() * Scale);
Jakob Stoklund Olesene5d90412010-03-01 20:59:38 +0000866}
867
Matthias Braun87a86052013-10-10 21:28:47 +0000868LiveRange::Segment
Duncan P. N. Exon Smith42e18352016-02-27 06:40:41 +0000869LiveIntervals::addSegmentToEndOfBlock(unsigned reg, MachineInstr &startInst) {
Mark Laceye742d682013-08-14 23:50:16 +0000870 LiveInterval& Interval = createEmptyInterval(reg);
Duncan P. N. Exon Smith42e18352016-02-27 06:40:41 +0000871 VNInfo *VN = Interval.getNextValue(
872 SlotIndex(getInstructionIndex(startInst).getRegSlot()),
873 getVNInfoAllocator());
874 LiveRange::Segment S(SlotIndex(getInstructionIndex(startInst).getRegSlot()),
875 getMBBEndIdx(startInst.getParent()), VN);
Matthias Braun331de112013-10-10 21:28:43 +0000876 Interval.addSegment(S);
Jakob Stoklund Olesen1b293202010-08-12 20:01:23 +0000877
Matthias Braun331de112013-10-10 21:28:43 +0000878 return S;
Owen Andersonc4dc1322008-06-05 17:15:43 +0000879}
Jakob Stoklund Olesen3fd3a842012-02-08 17:33:45 +0000880
Jakob Stoklund Olesen3fd3a842012-02-08 17:33:45 +0000881//===----------------------------------------------------------------------===//
882// Register mask functions
883//===----------------------------------------------------------------------===//
884
885bool LiveIntervals::checkRegMaskInterference(LiveInterval &LI,
886 BitVector &UsableRegs) {
887 if (LI.empty())
888 return false;
Jakob Stoklund Olesen9f10ac62012-02-10 01:31:31 +0000889 LiveInterval::iterator LiveI = LI.begin(), LiveE = LI.end();
890
891 // Use a smaller arrays for local live ranges.
892 ArrayRef<SlotIndex> Slots;
893 ArrayRef<const uint32_t*> Bits;
894 if (MachineBasicBlock *MBB = intervalIsInOneMBB(LI)) {
895 Slots = getRegMaskSlotsInBlock(MBB->getNumber());
896 Bits = getRegMaskBitsInBlock(MBB->getNumber());
897 } else {
898 Slots = getRegMaskSlots();
899 Bits = getRegMaskBits();
900 }
Jakob Stoklund Olesen3fd3a842012-02-08 17:33:45 +0000901
902 // We are going to enumerate all the register mask slots contained in LI.
903 // Start with a binary search of RegMaskSlots to find a starting point.
Jakob Stoklund Olesen3fd3a842012-02-08 17:33:45 +0000904 ArrayRef<SlotIndex>::iterator SlotI =
905 std::lower_bound(Slots.begin(), Slots.end(), LiveI->start);
906 ArrayRef<SlotIndex>::iterator SlotE = Slots.end();
907
908 // No slots in range, LI begins after the last call.
909 if (SlotI == SlotE)
910 return false;
911
912 bool Found = false;
Eugene Zelenko64632962017-05-24 23:10:29 +0000913 while (true) {
Jakob Stoklund Olesen3fd3a842012-02-08 17:33:45 +0000914 assert(*SlotI >= LiveI->start);
915 // Loop over all slots overlapping this segment.
916 while (*SlotI < LiveI->end) {
917 // *SlotI overlaps LI. Collect mask bits.
918 if (!Found) {
919 // This is the first overlap. Initialize UsableRegs to all ones.
920 UsableRegs.clear();
Jakob Stoklund Olesen15f1d8c2012-06-04 22:39:14 +0000921 UsableRegs.resize(TRI->getNumRegs(), true);
Jakob Stoklund Olesen3fd3a842012-02-08 17:33:45 +0000922 Found = true;
923 }
924 // Remove usable registers clobbered by this mask.
Jakob Stoklund Olesen9f10ac62012-02-10 01:31:31 +0000925 UsableRegs.clearBitsNotInMask(Bits[SlotI-Slots.begin()]);
Jakob Stoklund Olesen3fd3a842012-02-08 17:33:45 +0000926 if (++SlotI == SlotE)
927 return Found;
928 }
929 // *SlotI is beyond the current LI segment.
930 LiveI = LI.advanceTo(LiveI, *SlotI);
931 if (LiveI == LiveE)
932 return Found;
933 // Advance SlotI until it overlaps.
934 while (*SlotI < LiveI->start)
935 if (++SlotI == SlotE)
936 return Found;
937 }
938}
Lang Hames3dc7c512012-02-17 18:44:18 +0000939
940//===----------------------------------------------------------------------===//
941// IntervalUpdate class.
942//===----------------------------------------------------------------------===//
943
Matthias Braun95a36002017-01-19 00:32:13 +0000944/// Toolkit used by handleMove to trim or extend live intervals.
Lang Hames3dc7c512012-02-17 18:44:18 +0000945class LiveIntervals::HMEditor {
946private:
Lang Hamesecb50622012-02-17 23:43:40 +0000947 LiveIntervals& LIS;
948 const MachineRegisterInfo& MRI;
949 const TargetRegisterInfo& TRI;
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +0000950 SlotIndex OldIdx;
Lang Hamesecb50622012-02-17 23:43:40 +0000951 SlotIndex NewIdx;
Matthias Braun4f3b5e82013-10-10 21:29:02 +0000952 SmallPtrSet<LiveRange*, 8> Updated;
Andrew Trick27c28ce2012-10-16 00:22:51 +0000953 bool UpdateFlags;
Lang Hames6aceab12012-02-19 07:13:05 +0000954
Lang Hames3dc7c512012-02-17 18:44:18 +0000955public:
Lang Hamesecb50622012-02-17 23:43:40 +0000956 HMEditor(LiveIntervals& LIS, const MachineRegisterInfo& MRI,
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +0000957 const TargetRegisterInfo& TRI,
Andrew Trick27c28ce2012-10-16 00:22:51 +0000958 SlotIndex OldIdx, SlotIndex NewIdx, bool UpdateFlags)
959 : LIS(LIS), MRI(MRI), TRI(TRI), OldIdx(OldIdx), NewIdx(NewIdx),
960 UpdateFlags(UpdateFlags) {}
961
962 // FIXME: UpdateFlags is a workaround that creates live intervals for all
963 // physregs, even those that aren't needed for regalloc, in order to update
964 // kill flags. This is wasteful. Eventually, LiveVariables will strip all kill
965 // flags, and postRA passes will use a live register utility instead.
Matthias Braun4f3b5e82013-10-10 21:29:02 +0000966 LiveRange *getRegUnitLI(unsigned Unit) {
Matthias Braun01b61282017-09-01 18:36:26 +0000967 if (UpdateFlags && !MRI.isReservedRegUnit(Unit))
Andrew Trick27c28ce2012-10-16 00:22:51 +0000968 return &LIS.getRegUnit(Unit);
969 return LIS.getCachedRegUnit(Unit);
970 }
Lang Hames3dc7c512012-02-17 18:44:18 +0000971
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +0000972 /// Update all live ranges touched by MI, assuming a move from OldIdx to
973 /// NewIdx.
974 void updateAllRanges(MachineInstr *MI) {
Nicola Zaghen0818e782018-05-14 12:53:11 +0000975 LLVM_DEBUG(dbgs() << "handleMove " << OldIdx << " -> " << NewIdx << ": "
976 << *MI);
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +0000977 bool hasRegMask = false;
Matthias Braune67bd6c2015-05-29 02:56:46 +0000978 for (MachineOperand &MO : MI->operands()) {
979 if (MO.isRegMask())
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +0000980 hasRegMask = true;
Matthias Braune67bd6c2015-05-29 02:56:46 +0000981 if (!MO.isReg())
Lang Hames4586d252012-02-21 22:29:38 +0000982 continue;
Matthias Braun3783c292016-05-06 21:47:41 +0000983 if (MO.isUse()) {
984 if (!MO.readsReg())
985 continue;
986 // Aggressively clear all kill flags.
987 // They are reinserted by VirtRegRewriter.
Matthias Braune67bd6c2015-05-29 02:56:46 +0000988 MO.setIsKill(false);
Matthias Braun3783c292016-05-06 21:47:41 +0000989 }
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +0000990
Matthias Braune67bd6c2015-05-29 02:56:46 +0000991 unsigned Reg = MO.getReg();
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +0000992 if (!Reg)
993 continue;
994 if (TargetRegisterInfo::isVirtualRegister(Reg)) {
Matthias Braun4f3b5e82013-10-10 21:29:02 +0000995 LiveInterval &LI = LIS.getInterval(Reg);
Matthias Braundc087292014-12-10 01:12:20 +0000996 if (LI.hasSubRanges()) {
Matthias Braune67bd6c2015-05-29 02:56:46 +0000997 unsigned SubReg = MO.getSubReg();
Krzysztof Parzyszek31a5f882016-08-24 13:37:55 +0000998 LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg)
999 : MRI.getMaxLaneMaskForVReg(Reg);
Matthias Braun1bfcc2d2014-12-11 00:59:06 +00001000 for (LiveInterval::SubRange &S : LI.subranges()) {
Krzysztof Parzyszekd6ca3f02016-12-15 14:36:06 +00001001 if ((S.LaneMask & LaneMask).none())
Matthias Braundc087292014-12-10 01:12:20 +00001002 continue;
Matthias Braun1bfcc2d2014-12-11 00:59:06 +00001003 updateRange(S, Reg, S.LaneMask);
Matthias Braundc087292014-12-10 01:12:20 +00001004 }
1005 }
Krzysztof Parzyszekd6ca3f02016-12-15 14:36:06 +00001006 updateRange(LI, Reg, LaneBitmask::getNone());
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001007 continue;
1008 }
1009
1010 // For physregs, only update the regunits that actually have a
1011 // precomputed live range.
1012 for (MCRegUnitIterator Units(Reg, &TRI); Units.isValid(); ++Units)
Matthias Braun4f3b5e82013-10-10 21:29:02 +00001013 if (LiveRange *LR = getRegUnitLI(*Units))
Krzysztof Parzyszekd6ca3f02016-12-15 14:36:06 +00001014 updateRange(*LR, *Units, LaneBitmask::getNone());
Lang Hames4586d252012-02-21 22:29:38 +00001015 }
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001016 if (hasRegMask)
1017 updateRegMaskSlots();
Lang Hames6aceab12012-02-19 07:13:05 +00001018 }
1019
Lang Hames55fed622012-02-19 03:00:30 +00001020private:
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001021 /// Update a single live range, assuming an instruction has been moved from
1022 /// OldIdx to NewIdx.
Matthias Braundfc5b652015-09-25 21:51:14 +00001023 void updateRange(LiveRange &LR, unsigned Reg, LaneBitmask LaneMask) {
David Blaikie5401ba72014-11-19 07:49:26 +00001024 if (!Updated.insert(&LR).second)
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001025 return;
Nicola Zaghen0818e782018-05-14 12:53:11 +00001026 LLVM_DEBUG({
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001027 dbgs() << " ";
Matthias Braundc087292014-12-10 01:12:20 +00001028 if (TargetRegisterInfo::isVirtualRegister(Reg)) {
Francis Visoiu Mistrihaccb3372017-11-28 12:42:37 +00001029 dbgs() << printReg(Reg);
Krzysztof Parzyszek308c60d2016-12-16 19:11:56 +00001030 if (LaneMask.any())
Matthias Braun86ac1df2015-09-25 21:51:24 +00001031 dbgs() << " L" << PrintLaneMask(LaneMask);
Matthias Braundc087292014-12-10 01:12:20 +00001032 } else {
Francis Visoiu Mistrihaccb3372017-11-28 12:42:37 +00001033 dbgs() << printRegUnit(Reg, &TRI);
Matthias Braundc087292014-12-10 01:12:20 +00001034 }
Matthias Braun4f3b5e82013-10-10 21:29:02 +00001035 dbgs() << ":\t" << LR << '\n';
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001036 });
1037 if (SlotIndex::isEarlierInstr(OldIdx, NewIdx))
Matthias Braun4f3b5e82013-10-10 21:29:02 +00001038 handleMoveDown(LR);
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001039 else
Matthias Braundc087292014-12-10 01:12:20 +00001040 handleMoveUp(LR, Reg, LaneMask);
Nicola Zaghen0818e782018-05-14 12:53:11 +00001041 LLVM_DEBUG(dbgs() << " -->\t" << LR << '\n');
Matthias Braun4f3b5e82013-10-10 21:29:02 +00001042 LR.verify();
Lang Hames3dc7c512012-02-17 18:44:18 +00001043 }
1044
Matthias Braun4f3b5e82013-10-10 21:29:02 +00001045 /// Update LR to reflect an instruction has been moved downwards from OldIdx
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001046 /// to NewIdx (OldIdx < NewIdx).
Matthias Braun4f3b5e82013-10-10 21:29:02 +00001047 void handleMoveDown(LiveRange &LR) {
Matthias Braun4f3b5e82013-10-10 21:29:02 +00001048 LiveRange::iterator E = LR.end();
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001049 // Segment going into OldIdx.
1050 LiveRange::iterator OldIdxIn = LR.find(OldIdx.getBaseIndex());
1051
1052 // No value live before or after OldIdx? Nothing to do.
1053 if (OldIdxIn == E || SlotIndex::isEarlierInstr(OldIdx, OldIdxIn->start))
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001054 return;
Lang Hames6aceab12012-02-19 07:13:05 +00001055
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001056 LiveRange::iterator OldIdxOut;
1057 // Do we have a value live-in to OldIdx?
1058 if (SlotIndex::isEarlierInstr(OldIdxIn->start, OldIdx)) {
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001059 // If the live-in value already extends to NewIdx, there is nothing to do.
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001060 if (SlotIndex::isEarlierEqualInstr(NewIdx, OldIdxIn->end))
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001061 return;
1062 // Aggressively remove all kill flags from the old kill point.
1063 // Kill flags shouldn't be used while live intervals exist, they will be
1064 // reinserted by VirtRegRewriter.
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001065 if (MachineInstr *KillMI = LIS.getInstructionFromIndex(OldIdxIn->end))
Duncan P. N. Exon Smith63ec7f02016-02-27 17:05:33 +00001066 for (MIBundleOperands MO(*KillMI); MO.isValid(); ++MO)
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001067 if (MO->isReg() && MO->isUse())
1068 MO->setIsKill(false);
Matthias Braun372250b2016-02-15 19:25:36 +00001069
1070 // Is there a def before NewIdx which is not OldIdx?
1071 LiveRange::iterator Next = std::next(OldIdxIn);
1072 if (Next != E && !SlotIndex::isSameInstr(OldIdx, Next->start) &&
1073 SlotIndex::isEarlierInstr(Next->start, NewIdx)) {
1074 // If we are here then OldIdx was just a use but not a def. We only have
1075 // to ensure liveness extends to NewIdx.
1076 LiveRange::iterator NewIdxIn =
1077 LR.advanceTo(Next, NewIdx.getBaseIndex());
1078 // Extend the segment before NewIdx if necessary.
1079 if (NewIdxIn == E ||
1080 !SlotIndex::isEarlierInstr(NewIdxIn->start, NewIdx)) {
1081 LiveRange::iterator Prev = std::prev(NewIdxIn);
1082 Prev->end = NewIdx.getRegSlot();
1083 }
Matthias Braunbb936d22016-07-26 03:57:45 +00001084 // Extend OldIdxIn.
1085 OldIdxIn->end = Next->start;
Matthias Braun372250b2016-02-15 19:25:36 +00001086 return;
1087 }
1088
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001089 // Adjust OldIdxIn->end to reach NewIdx. This may temporarily make LR
Matthias Braun632580f2016-01-26 01:40:48 +00001090 // invalid by overlapping ranges.
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001091 bool isKill = SlotIndex::isSameInstr(OldIdx, OldIdxIn->end);
1092 OldIdxIn->end = NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber());
1093 // If this was not a kill, then there was no def and we're done.
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001094 if (!isKill)
1095 return;
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001096
1097 // Did we have a Def at OldIdx?
Matthias Braun372250b2016-02-15 19:25:36 +00001098 OldIdxOut = Next;
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001099 if (OldIdxOut == E || !SlotIndex::isSameInstr(OldIdx, OldIdxOut->start))
1100 return;
1101 } else {
1102 OldIdxOut = OldIdxIn;
Lang Hames6aceab12012-02-19 07:13:05 +00001103 }
1104
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001105 // If we are here then there is a Definition at OldIdx. OldIdxOut points
1106 // to the segment starting there.
1107 assert(OldIdxOut != E && SlotIndex::isSameInstr(OldIdx, OldIdxOut->start) &&
1108 "No def?");
1109 VNInfo *OldIdxVNI = OldIdxOut->valno;
1110 assert(OldIdxVNI->def == OldIdxOut->start && "Inconsistent def");
1111
1112 // If the defined value extends beyond NewIdx, just move the beginning
1113 // of the segment to NewIdx.
1114 SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber());
1115 if (SlotIndex::isEarlierInstr(NewIdxDef, OldIdxOut->end)) {
1116 OldIdxVNI->def = NewIdxDef;
1117 OldIdxOut->start = OldIdxVNI->def;
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001118 return;
1119 }
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001120
1121 // If we are here then we have a Definition at OldIdx which ends before
Matthias Braun372250b2016-02-15 19:25:36 +00001122 // NewIdx.
1123
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001124 // Is there an existing Def at NewIdx?
1125 LiveRange::iterator AfterNewIdx
1126 = LR.advanceTo(OldIdxOut, NewIdx.getRegSlot());
Matthias Braun372250b2016-02-15 19:25:36 +00001127 bool OldIdxDefIsDead = OldIdxOut->end.isDead();
1128 if (!OldIdxDefIsDead &&
1129 SlotIndex::isEarlierInstr(OldIdxOut->end, NewIdxDef)) {
1130 // OldIdx is not a dead def, and NewIdxDef is inside a new interval.
1131 VNInfo *DefVNI;
1132 if (OldIdxOut != LR.begin() &&
1133 !SlotIndex::isEarlierInstr(std::prev(OldIdxOut)->end,
1134 OldIdxOut->start)) {
1135 // There is no gap between OldIdxOut and its predecessor anymore,
1136 // merge them.
1137 LiveRange::iterator IPrev = std::prev(OldIdxOut);
1138 DefVNI = OldIdxVNI;
1139 IPrev->end = OldIdxOut->end;
1140 } else {
1141 // The value is live in to OldIdx
1142 LiveRange::iterator INext = std::next(OldIdxOut);
1143 assert(INext != E && "Must have following segment");
1144 // We merge OldIdxOut and its successor. As we're dealing with subreg
1145 // reordering, there is always a successor to OldIdxOut in the same BB
1146 // We don't need INext->valno anymore and will reuse for the new segment
1147 // we create later.
Matthias Braun289718f2016-04-28 02:11:49 +00001148 DefVNI = OldIdxVNI;
Matthias Braun372250b2016-02-15 19:25:36 +00001149 INext->start = OldIdxOut->end;
Matthias Braun372250b2016-02-15 19:25:36 +00001150 INext->valno->def = INext->start;
1151 }
1152 // If NewIdx is behind the last segment, extend that and append a new one.
1153 if (AfterNewIdx == E) {
1154 // OldIdxOut is undef at this point, Slide (OldIdxOut;AfterNewIdx] up
1155 // one position.
1156 // |- ?/OldIdxOut -| |- X0 -| ... |- Xn -| end
1157 // => |- X0/OldIdxOut -| ... |- Xn -| |- undef/NewS -| end
1158 std::copy(std::next(OldIdxOut), E, OldIdxOut);
1159 // The last segment is undefined now, reuse it for a dead def.
1160 LiveRange::iterator NewSegment = std::prev(E);
1161 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
1162 DefVNI);
1163 DefVNI->def = NewIdxDef;
1164
1165 LiveRange::iterator Prev = std::prev(NewSegment);
1166 Prev->end = NewIdxDef;
1167 } else {
1168 // OldIdxOut is undef at this point, Slide (OldIdxOut;AfterNewIdx] up
1169 // one position.
1170 // |- ?/OldIdxOut -| |- X0 -| ... |- Xn/AfterNewIdx -| |- Next -|
1171 // => |- X0/OldIdxOut -| ... |- Xn -| |- Xn/AfterNewIdx -| |- Next -|
1172 std::copy(std::next(OldIdxOut), std::next(AfterNewIdx), OldIdxOut);
1173 LiveRange::iterator Prev = std::prev(AfterNewIdx);
1174 // We have two cases:
1175 if (SlotIndex::isEarlierInstr(Prev->start, NewIdxDef)) {
1176 // Case 1: NewIdx is inside a liverange. Split this liverange at
1177 // NewIdxDef into the segment "Prev" followed by "NewSegment".
1178 LiveRange::iterator NewSegment = AfterNewIdx;
1179 *NewSegment = LiveRange::Segment(NewIdxDef, Prev->end, Prev->valno);
1180 Prev->valno->def = NewIdxDef;
1181
1182 *Prev = LiveRange::Segment(Prev->start, NewIdxDef, DefVNI);
1183 DefVNI->def = Prev->start;
1184 } else {
1185 // Case 2: NewIdx is in a lifetime hole. Keep AfterNewIdx as is and
1186 // turn Prev into a segment from NewIdx to AfterNewIdx->start.
1187 *Prev = LiveRange::Segment(NewIdxDef, AfterNewIdx->start, DefVNI);
1188 DefVNI->def = NewIdxDef;
1189 assert(DefVNI != AfterNewIdx->valno);
1190 }
1191 }
1192 return;
1193 }
1194
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001195 if (AfterNewIdx != E &&
1196 SlotIndex::isSameInstr(AfterNewIdx->start, NewIdxDef)) {
1197 // There is an existing def at NewIdx. The def at OldIdx is coalesced into
1198 // that value.
1199 assert(AfterNewIdx->valno != OldIdxVNI && "Multiple defs of value?");
1200 LR.removeValNo(OldIdxVNI);
1201 } else {
1202 // There was no existing def at NewIdx. We need to create a dead def
1203 // at NewIdx. Shift segments over the old OldIdxOut segment, this frees
1204 // a new segment at the place where we want to construct the dead def.
1205 // |- OldIdxOut -| |- X0 -| ... |- Xn -| |- AfterNewIdx -|
1206 // => |- X0/OldIdxOut -| ... |- Xn -| |- undef/NewS. -| |- AfterNewIdx -|
1207 assert(AfterNewIdx != OldIdxOut && "Inconsistent iterators");
1208 std::copy(std::next(OldIdxOut), AfterNewIdx, OldIdxOut);
1209 // We can reuse OldIdxVNI now.
1210 LiveRange::iterator NewSegment = std::prev(AfterNewIdx);
1211 VNInfo *NewSegmentVNI = OldIdxVNI;
1212 NewSegmentVNI->def = NewIdxDef;
1213 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
1214 NewSegmentVNI);
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001215 }
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001216 }
1217
Matthias Braun4f3b5e82013-10-10 21:29:02 +00001218 /// Update LR to reflect an instruction has been moved upwards from OldIdx
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001219 /// to NewIdx (NewIdx < OldIdx).
Matthias Braundfc5b652015-09-25 21:51:14 +00001220 void handleMoveUp(LiveRange &LR, unsigned Reg, LaneBitmask LaneMask) {
Matthias Braun4f3b5e82013-10-10 21:29:02 +00001221 LiveRange::iterator E = LR.end();
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001222 // Segment going into OldIdx.
1223 LiveRange::iterator OldIdxIn = LR.find(OldIdx.getBaseIndex());
1224
1225 // No value live before or after OldIdx? Nothing to do.
1226 if (OldIdxIn == E || SlotIndex::isEarlierInstr(OldIdx, OldIdxIn->start))
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001227 return;
1228
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001229 LiveRange::iterator OldIdxOut;
1230 // Do we have a value live-in to OldIdx?
1231 if (SlotIndex::isEarlierInstr(OldIdxIn->start, OldIdx)) {
1232 // If the live-in value isn't killed here, then we have no Def at
1233 // OldIdx, moreover the value must be live at NewIdx so there is nothing
1234 // to do.
1235 bool isKill = SlotIndex::isSameInstr(OldIdx, OldIdxIn->end);
1236 if (!isKill)
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001237 return;
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001238
1239 // At this point we have to move OldIdxIn->end back to the nearest
Matthias Braun372250b2016-02-15 19:25:36 +00001240 // previous use or (dead-)def but no further than NewIdx.
1241 SlotIndex DefBeforeOldIdx
1242 = std::max(OldIdxIn->start.getDeadSlot(),
1243 NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber()));
1244 OldIdxIn->end = findLastUseBefore(DefBeforeOldIdx, Reg, LaneMask);
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001245
Matthias Braun372250b2016-02-15 19:25:36 +00001246 // Did we have a Def at OldIdx? If not we are done now.
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001247 OldIdxOut = std::next(OldIdxIn);
Matthias Braun372250b2016-02-15 19:25:36 +00001248 if (OldIdxOut == E || !SlotIndex::isSameInstr(OldIdx, OldIdxOut->start))
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001249 return;
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001250 } else {
1251 OldIdxOut = OldIdxIn;
Matthias Braun372250b2016-02-15 19:25:36 +00001252 OldIdxIn = OldIdxOut != LR.begin() ? std::prev(OldIdxOut) : E;
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001253 }
1254
1255 // If we are here then there is a Definition at OldIdx. OldIdxOut points
1256 // to the segment starting there.
1257 assert(OldIdxOut != E && SlotIndex::isSameInstr(OldIdx, OldIdxOut->start) &&
1258 "No def?");
1259 VNInfo *OldIdxVNI = OldIdxOut->valno;
1260 assert(OldIdxVNI->def == OldIdxOut->start && "Inconsistent def");
1261 bool OldIdxDefIsDead = OldIdxOut->end.isDead();
1262
1263 // Is there an existing def at NewIdx?
1264 SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber());
1265 LiveRange::iterator NewIdxOut = LR.find(NewIdx.getRegSlot());
1266 if (SlotIndex::isSameInstr(NewIdxOut->start, NewIdx)) {
1267 assert(NewIdxOut->valno != OldIdxVNI &&
1268 "Same value defined more than once?");
1269 // If OldIdx was a dead def remove it.
1270 if (!OldIdxDefIsDead) {
Matthias Braun632580f2016-01-26 01:40:48 +00001271 // Remove segment starting at NewIdx and move begin of OldIdxOut to
1272 // NewIdx so it can take its place.
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001273 OldIdxVNI->def = NewIdxDef;
1274 OldIdxOut->start = NewIdxDef;
1275 LR.removeValNo(NewIdxOut->valno);
1276 } else {
Matthias Braun632580f2016-01-26 01:40:48 +00001277 // Simply remove the dead def at OldIdx.
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001278 LR.removeValNo(OldIdxVNI);
1279 }
1280 } else {
1281 // Previously nothing was live after NewIdx, so all we have to do now is
1282 // move the begin of OldIdxOut to NewIdx.
1283 if (!OldIdxDefIsDead) {
Matthias Braun372250b2016-02-15 19:25:36 +00001284 // Do we have any intermediate Defs between OldIdx and NewIdx?
1285 if (OldIdxIn != E &&
1286 SlotIndex::isEarlierInstr(NewIdxDef, OldIdxIn->start)) {
1287 // OldIdx is not a dead def and NewIdx is before predecessor start.
1288 LiveRange::iterator NewIdxIn = NewIdxOut;
1289 assert(NewIdxIn == LR.find(NewIdx.getBaseIndex()));
1290 const SlotIndex SplitPos = NewIdxDef;
Stanislav Mekhanoshinf99709a2017-03-11 00:14:52 +00001291 OldIdxVNI = OldIdxIn->valno;
Matthias Braun372250b2016-02-15 19:25:36 +00001292
1293 // Merge the OldIdxIn and OldIdxOut segments into OldIdxOut.
Stanislav Mekhanoshinf99709a2017-03-11 00:14:52 +00001294 OldIdxOut->valno->def = OldIdxIn->start;
Matthias Braun372250b2016-02-15 19:25:36 +00001295 *OldIdxOut = LiveRange::Segment(OldIdxIn->start, OldIdxOut->end,
Stanislav Mekhanoshinf99709a2017-03-11 00:14:52 +00001296 OldIdxOut->valno);
Matthias Braun372250b2016-02-15 19:25:36 +00001297 // OldIdxIn and OldIdxVNI are now undef and can be overridden.
1298 // We Slide [NewIdxIn, OldIdxIn) down one position.
1299 // |- X0/NewIdxIn -| ... |- Xn-1 -||- Xn/OldIdxIn -||- OldIdxOut -|
1300 // => |- undef/NexIdxIn -| |- X0 -| ... |- Xn-1 -| |- Xn/OldIdxOut -|
1301 std::copy_backward(NewIdxIn, OldIdxIn, OldIdxOut);
1302 // NewIdxIn is now considered undef so we can reuse it for the moved
1303 // value.
1304 LiveRange::iterator NewSegment = NewIdxIn;
1305 LiveRange::iterator Next = std::next(NewSegment);
Matthias Braun372250b2016-02-15 19:25:36 +00001306 if (SlotIndex::isEarlierInstr(Next->start, NewIdx)) {
1307 // There is no gap between NewSegment and its predecessor.
1308 *NewSegment = LiveRange::Segment(Next->start, SplitPos,
Matthias Braun6063d9d2016-05-24 21:54:01 +00001309 Next->valno);
1310 *Next = LiveRange::Segment(SplitPos, Next->end, OldIdxVNI);
Matthias Braun372250b2016-02-15 19:25:36 +00001311 Next->valno->def = SplitPos;
1312 } else {
1313 // There is a gap between NewSegment and its predecessor
1314 // Value becomes live in.
Matthias Braun6063d9d2016-05-24 21:54:01 +00001315 *NewSegment = LiveRange::Segment(SplitPos, Next->start, OldIdxVNI);
Matthias Braun372250b2016-02-15 19:25:36 +00001316 NewSegment->valno->def = SplitPos;
1317 }
1318 } else {
1319 // Leave the end point of a live def.
1320 OldIdxOut->start = NewIdxDef;
1321 OldIdxVNI->def = NewIdxDef;
1322 if (OldIdxIn != E && SlotIndex::isEarlierInstr(NewIdx, OldIdxIn->end))
1323 OldIdxIn->end = NewIdx.getRegSlot();
1324 }
Tim Renouf27467f82018-02-26 14:42:13 +00001325 } else if (OldIdxIn != E
1326 && SlotIndex::isEarlierInstr(NewIdxOut->start, NewIdx)
1327 && SlotIndex::isEarlierInstr(NewIdx, NewIdxOut->end)) {
1328 // OldIdxVNI is a dead def that has been moved into the middle of
1329 // another value in LR. That can happen when LR is a whole register,
1330 // but the dead def is a write to a subreg that is dead at NewIdx.
1331 // The dead def may have been moved across other values
1332 // in LR, so move OldIdxOut up to NewIdxOut. Slide [NewIdxOut;OldIdxOut)
1333 // down one position.
1334 // |- X0/NewIdxOut -| ... |- Xn-1 -| |- Xn/OldIdxOut -| |- next - |
1335 // => |- X0/NewIdxOut -| |- X0 -| ... |- Xn-1 -| |- next -|
1336 std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut));
1337 // Modify the segment at NewIdxOut and the following segment to meet at
1338 // the point of the dead def, with the following segment getting
1339 // OldIdxVNI as its value number.
1340 *NewIdxOut = LiveRange::Segment(
1341 NewIdxOut->start, NewIdxDef.getRegSlot(), NewIdxOut->valno);
1342 *(NewIdxOut + 1) = LiveRange::Segment(
1343 NewIdxDef.getRegSlot(), (NewIdxOut + 1)->end, OldIdxVNI);
1344 OldIdxVNI->def = NewIdxDef;
1345 // Modify subsequent segments to be defined by the moved def OldIdxVNI.
1346 for (auto Idx = NewIdxOut + 2; Idx <= OldIdxOut; ++Idx)
1347 Idx->valno = OldIdxVNI;
1348 // Aggressively remove all dead flags from the former dead definition.
1349 // Kill/dead flags shouldn't be used while live intervals exist; they
1350 // will be reinserted by VirtRegRewriter.
1351 if (MachineInstr *KillMI = LIS.getInstructionFromIndex(NewIdx))
1352 for (MIBundleOperands MO(*KillMI); MO.isValid(); ++MO)
1353 if (MO->isReg() && !MO->isUse())
1354 MO->setIsDead(false);
Matthias Braun1b9e9d82016-01-26 00:43:50 +00001355 } else {
1356 // OldIdxVNI is a dead def. It may have been moved across other values
1357 // in LR, so move OldIdxOut up to NewIdxOut. Slide [NewIdxOut;OldIdxOut)
1358 // down one position.
1359 // |- X0/NewIdxOut -| ... |- Xn-1 -| |- Xn/OldIdxOut -| |- next - |
1360 // => |- undef/NewIdxOut -| |- X0 -| ... |- Xn-1 -| |- next -|
1361 std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut));
1362 // OldIdxVNI can be reused now to build a new dead def segment.
1363 LiveRange::iterator NewSegment = NewIdxOut;
1364 VNInfo *NewSegmentVNI = OldIdxVNI;
1365 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
1366 NewSegmentVNI);
1367 NewSegmentVNI->def = NewIdxDef;
Lang Hames6aceab12012-02-19 07:13:05 +00001368 }
1369 }
Lang Hames6aceab12012-02-19 07:13:05 +00001370 }
1371
Jakob Stoklund Olesenad5e9692012-10-12 21:31:57 +00001372 void updateRegMaskSlots() {
Lang Hamesecb50622012-02-17 23:43:40 +00001373 SmallVectorImpl<SlotIndex>::iterator RI =
1374 std::lower_bound(LIS.RegMaskSlots.begin(), LIS.RegMaskSlots.end(),
1375 OldIdx);
Jakob Stoklund Olesen722c9a72012-11-09 19:18:49 +00001376 assert(RI != LIS.RegMaskSlots.end() && *RI == OldIdx.getRegSlot() &&
1377 "No RegMask at OldIdx.");
1378 *RI = NewIdx.getRegSlot();
1379 assert((RI == LIS.RegMaskSlots.begin() ||
Benjamin Kramerd628f192014-03-02 12:27:27 +00001380 SlotIndex::isEarlierInstr(*std::prev(RI), *RI)) &&
1381 "Cannot move regmask instruction above another call");
1382 assert((std::next(RI) == LIS.RegMaskSlots.end() ||
1383 SlotIndex::isEarlierInstr(*RI, *std::next(RI))) &&
1384 "Cannot move regmask instruction below another call");
Lang Hamesfbc8dd32012-02-17 21:29:41 +00001385 }
Lang Hames55fed622012-02-19 03:00:30 +00001386
1387 // Return the last use of reg between NewIdx and OldIdx.
Matthias Braun372250b2016-02-15 19:25:36 +00001388 SlotIndex findLastUseBefore(SlotIndex Before, unsigned Reg,
1389 LaneBitmask LaneMask) {
Lang Hames6d742cc2012-09-12 06:56:16 +00001390 if (TargetRegisterInfo::isVirtualRegister(Reg)) {
Matthias Braun372250b2016-02-15 19:25:36 +00001391 SlotIndex LastUse = Before;
Matthias Braundc087292014-12-10 01:12:20 +00001392 for (MachineOperand &MO : MRI.use_nodbg_operands(Reg)) {
Matthias Braunb788f1e2016-06-11 00:31:28 +00001393 if (MO.isUndef())
1394 continue;
Matthias Braundc087292014-12-10 01:12:20 +00001395 unsigned SubReg = MO.getSubReg();
Krzysztof Parzyszek308c60d2016-12-16 19:11:56 +00001396 if (SubReg != 0 && LaneMask.any()
Krzysztof Parzyszekd6ca3f02016-12-15 14:36:06 +00001397 && (TRI.getSubRegIndexLaneMask(SubReg) & LaneMask).none())
Matthias Braundc087292014-12-10 01:12:20 +00001398 continue;
1399
Duncan P. N. Exon Smith42e18352016-02-27 06:40:41 +00001400 const MachineInstr &MI = *MO.getParent();
Lang Hames6d742cc2012-09-12 06:56:16 +00001401 SlotIndex InstSlot = LIS.getSlotIndexes()->getInstructionIndex(MI);
1402 if (InstSlot > LastUse && InstSlot < OldIdx)
Matthias Braun372250b2016-02-15 19:25:36 +00001403 LastUse = InstSlot.getRegSlot();
Lang Hames6d742cc2012-09-12 06:56:16 +00001404 }
Jakob Stoklund Olesen778ef972013-03-08 18:08:57 +00001405 return LastUse;
Lang Hames55fed622012-02-19 03:00:30 +00001406 }
Jakob Stoklund Olesen778ef972013-03-08 18:08:57 +00001407
1408 // This is a regunit interval, so scanning the use list could be very
1409 // expensive. Scan upwards from OldIdx instead.
Matthias Braun372250b2016-02-15 19:25:36 +00001410 assert(Before < OldIdx && "Expected upwards move");
Jakob Stoklund Olesen778ef972013-03-08 18:08:57 +00001411 SlotIndexes *Indexes = LIS.getSlotIndexes();
Matthias Braun372250b2016-02-15 19:25:36 +00001412 MachineBasicBlock *MBB = Indexes->getMBBFromIndex(Before);
Jakob Stoklund Olesen778ef972013-03-08 18:08:57 +00001413
1414 // OldIdx may not correspond to an instruction any longer, so set MII to
1415 // point to the next instruction after OldIdx, or MBB->end().
1416 MachineBasicBlock::iterator MII = MBB->end();
1417 if (MachineInstr *MI = Indexes->getInstructionFromIndex(
1418 Indexes->getNextNonNullIndex(OldIdx)))
1419 if (MI->getParent() == MBB)
1420 MII = MI;
1421
1422 MachineBasicBlock::iterator Begin = MBB->begin();
1423 while (MII != Begin) {
Shiva Chen24abe712018-05-09 02:42:00 +00001424 if ((--MII)->isDebugInstr())
Jakob Stoklund Olesen778ef972013-03-08 18:08:57 +00001425 continue;
Duncan P. N. Exon Smith42e18352016-02-27 06:40:41 +00001426 SlotIndex Idx = Indexes->getInstructionIndex(*MII);
Jakob Stoklund Olesen778ef972013-03-08 18:08:57 +00001427
Matthias Braun372250b2016-02-15 19:25:36 +00001428 // Stop searching when Before is reached.
1429 if (!SlotIndex::isEarlierInstr(Before, Idx))
1430 return Before;
Jakob Stoklund Olesen778ef972013-03-08 18:08:57 +00001431
1432 // Check if MII uses Reg.
Duncan P. N. Exon Smith63ec7f02016-02-27 17:05:33 +00001433 for (MIBundleOperands MO(*MII); MO.isValid(); ++MO)
Matthias Braunb788f1e2016-06-11 00:31:28 +00001434 if (MO->isReg() && !MO->isUndef() &&
Jakob Stoklund Olesen778ef972013-03-08 18:08:57 +00001435 TargetRegisterInfo::isPhysicalRegister(MO->getReg()) &&
1436 TRI.hasRegUnit(MO->getReg(), Reg))
Matthias Braun372250b2016-02-15 19:25:36 +00001437 return Idx.getRegSlot();
Jakob Stoklund Olesen778ef972013-03-08 18:08:57 +00001438 }
Matthias Braun372250b2016-02-15 19:25:36 +00001439 // Didn't reach Before. It must be the first instruction in the block.
1440 return Before;
Lang Hames55fed622012-02-19 03:00:30 +00001441 }
Lang Hames3dc7c512012-02-17 18:44:18 +00001442};
1443
Duncan P. N. Exon Smith5144d352016-02-27 20:14:29 +00001444void LiveIntervals::handleMove(MachineInstr &MI, bool UpdateFlags) {
1445 assert(!MI.isBundled() && "Can't handle bundled instructions yet.");
1446 SlotIndex OldIndex = Indexes->getInstructionIndex(MI);
1447 Indexes->removeMachineInstrFromMaps(MI);
1448 SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(MI);
1449 assert(getMBBStartIdx(MI.getParent()) <= OldIndex &&
1450 OldIndex < getMBBEndIdx(MI.getParent()) &&
Lang Hames3dc7c512012-02-17 18:44:18 +00001451 "Cannot handle moves across basic block boundaries.");
Lang Hames3dc7c512012-02-17 18:44:18 +00001452
Andrew Trick27c28ce2012-10-16 00:22:51 +00001453 HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags);
Duncan P. N. Exon Smith5144d352016-02-27 20:14:29 +00001454 HME.updateAllRanges(&MI);
Lang Hames4586d252012-02-21 22:29:38 +00001455}
1456
Duncan P. N. Exon Smith5144d352016-02-27 20:14:29 +00001457void LiveIntervals::handleMoveIntoBundle(MachineInstr &MI,
1458 MachineInstr &BundleStart,
Andrew Trick27c28ce2012-10-16 00:22:51 +00001459 bool UpdateFlags) {
Duncan P. N. Exon Smith5144d352016-02-27 20:14:29 +00001460 SlotIndex OldIndex = Indexes->getInstructionIndex(MI);
1461 SlotIndex NewIndex = Indexes->getInstructionIndex(BundleStart);
Andrew Trick27c28ce2012-10-16 00:22:51 +00001462 HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags);
Duncan P. N. Exon Smith5144d352016-02-27 20:14:29 +00001463 HME.updateAllRanges(&MI);
Lang Hames3dc7c512012-02-17 18:44:18 +00001464}
Cameron Zwarichf0b25352013-02-17 00:10:44 +00001465
Matthias Braun44024472014-12-10 01:12:26 +00001466void LiveIntervals::repairOldRegInRange(const MachineBasicBlock::iterator Begin,
1467 const MachineBasicBlock::iterator End,
1468 const SlotIndex endIdx,
1469 LiveRange &LR, const unsigned Reg,
Matthias Braundfc5b652015-09-25 21:51:14 +00001470 LaneBitmask LaneMask) {
Matthias Braun44024472014-12-10 01:12:26 +00001471 LiveInterval::iterator LII = LR.find(endIdx);
1472 SlotIndex lastUseIdx;
Nicolai Haehnlebe7124c2016-08-10 18:51:14 +00001473 if (LII == LR.begin()) {
1474 // This happens when the function is called for a subregister that only
1475 // occurs _after_ the range that is to be repaired.
1476 return;
1477 }
Matthias Braun44024472014-12-10 01:12:26 +00001478 if (LII != LR.end() && LII->start < endIdx)
1479 lastUseIdx = LII->end;
1480 else
1481 --LII;
1482
1483 for (MachineBasicBlock::iterator I = End; I != Begin;) {
1484 --I;
Duncan P. N. Exon Smith5144d352016-02-27 20:14:29 +00001485 MachineInstr &MI = *I;
Shiva Chen24abe712018-05-09 02:42:00 +00001486 if (MI.isDebugInstr())
Matthias Braun44024472014-12-10 01:12:26 +00001487 continue;
1488
Duncan P. N. Exon Smith5144d352016-02-27 20:14:29 +00001489 SlotIndex instrIdx = getInstructionIndex(MI);
Matthias Braun44024472014-12-10 01:12:26 +00001490 bool isStartValid = getInstructionFromIndex(LII->start);
1491 bool isEndValid = getInstructionFromIndex(LII->end);
1492
1493 // FIXME: This doesn't currently handle early-clobber or multiple removed
1494 // defs inside of the region to repair.
Duncan P. N. Exon Smith5144d352016-02-27 20:14:29 +00001495 for (MachineInstr::mop_iterator OI = MI.operands_begin(),
1496 OE = MI.operands_end();
1497 OI != OE; ++OI) {
Matthias Braun44024472014-12-10 01:12:26 +00001498 const MachineOperand &MO = *OI;
1499 if (!MO.isReg() || MO.getReg() != Reg)
1500 continue;
1501
1502 unsigned SubReg = MO.getSubReg();
Matthias Braundfc5b652015-09-25 21:51:14 +00001503 LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg);
Krzysztof Parzyszekd6ca3f02016-12-15 14:36:06 +00001504 if ((Mask & LaneMask).none())
Matthias Braun44024472014-12-10 01:12:26 +00001505 continue;
1506
1507 if (MO.isDef()) {
1508 if (!isStartValid) {
1509 if (LII->end.isDead()) {
1510 SlotIndex prevStart;
1511 if (LII != LR.begin())
1512 prevStart = std::prev(LII)->start;
1513
1514 // FIXME: This could be more efficient if there was a
1515 // removeSegment method that returned an iterator.
1516 LR.removeSegment(*LII, true);
1517 if (prevStart.isValid())
1518 LII = LR.find(prevStart);
1519 else
1520 LII = LR.begin();
1521 } else {
1522 LII->start = instrIdx.getRegSlot();
1523 LII->valno->def = instrIdx.getRegSlot();
1524 if (MO.getSubReg() && !MO.isUndef())
1525 lastUseIdx = instrIdx.getRegSlot();
1526 else
1527 lastUseIdx = SlotIndex();
1528 continue;
1529 }
1530 }
1531
1532 if (!lastUseIdx.isValid()) {
1533 VNInfo *VNI = LR.getNextValue(instrIdx.getRegSlot(), VNInfoAllocator);
1534 LiveRange::Segment S(instrIdx.getRegSlot(),
1535 instrIdx.getDeadSlot(), VNI);
1536 LII = LR.addSegment(S);
1537 } else if (LII->start != instrIdx.getRegSlot()) {
1538 VNInfo *VNI = LR.getNextValue(instrIdx.getRegSlot(), VNInfoAllocator);
1539 LiveRange::Segment S(instrIdx.getRegSlot(), lastUseIdx, VNI);
1540 LII = LR.addSegment(S);
1541 }
1542
1543 if (MO.getSubReg() && !MO.isUndef())
1544 lastUseIdx = instrIdx.getRegSlot();
1545 else
1546 lastUseIdx = SlotIndex();
1547 } else if (MO.isUse()) {
1548 // FIXME: This should probably be handled outside of this branch,
1549 // either as part of the def case (for defs inside of the region) or
1550 // after the loop over the region.
1551 if (!isEndValid && !LII->end.isBlock())
1552 LII->end = instrIdx.getRegSlot();
1553 if (!lastUseIdx.isValid())
1554 lastUseIdx = instrIdx.getRegSlot();
1555 }
1556 }
1557 }
1558}
1559
Cameron Zwarichf0b25352013-02-17 00:10:44 +00001560void
1561LiveIntervals::repairIntervalsInRange(MachineBasicBlock *MBB,
Cameron Zwarich680c98f2013-02-17 11:09:00 +00001562 MachineBasicBlock::iterator Begin,
1563 MachineBasicBlock::iterator End,
Cameron Zwarich7324d4e2013-02-17 03:48:23 +00001564 ArrayRef<unsigned> OrigRegs) {
Cameron Zwarichc5b61352013-02-20 22:10:00 +00001565 // Find anchor points, which are at the beginning/end of blocks or at
1566 // instructions that already have indexes.
Duncan P. N. Exon Smith42e18352016-02-27 06:40:41 +00001567 while (Begin != MBB->begin() && !Indexes->hasIndex(*Begin))
Cameron Zwarichc5b61352013-02-20 22:10:00 +00001568 --Begin;
Duncan P. N. Exon Smith42e18352016-02-27 06:40:41 +00001569 while (End != MBB->end() && !Indexes->hasIndex(*End))
Cameron Zwarichc5b61352013-02-20 22:10:00 +00001570 ++End;
1571
Cameron Zwarich9030fc22013-02-20 06:46:48 +00001572 SlotIndex endIdx;
1573 if (End == MBB->end())
1574 endIdx = getMBBEndIdx(MBB).getPrevSlot();
Cameron Zwarich680c98f2013-02-17 11:09:00 +00001575 else
Duncan P. N. Exon Smith42e18352016-02-27 06:40:41 +00001576 endIdx = getInstructionIndex(*End);
Cameron Zwarich680c98f2013-02-17 11:09:00 +00001577
Hal Finkel8fdeacc2016-05-21 16:03:50 +00001578 Indexes->repairIndexesInRange(MBB, Begin, End);
Cameron Zwarich349cf342013-02-20 06:46:41 +00001579
Cameron Zwarich9030fc22013-02-20 06:46:48 +00001580 for (MachineBasicBlock::iterator I = End; I != Begin;) {
1581 --I;
Duncan P. N. Exon Smith5144d352016-02-27 20:14:29 +00001582 MachineInstr &MI = *I;
Shiva Chen24abe712018-05-09 02:42:00 +00001583 if (MI.isDebugInstr())
Cameron Zwarich79f5ab12013-02-23 10:25:25 +00001584 continue;
Duncan P. N. Exon Smith5144d352016-02-27 20:14:29 +00001585 for (MachineInstr::const_mop_iterator MOI = MI.operands_begin(),
1586 MOE = MI.operands_end();
1587 MOI != MOE; ++MOI) {
Cameron Zwarich9030fc22013-02-20 06:46:48 +00001588 if (MOI->isReg() &&
1589 TargetRegisterInfo::isVirtualRegister(MOI->getReg()) &&
1590 !hasInterval(MOI->getReg())) {
Mark Laceye742d682013-08-14 23:50:16 +00001591 createAndComputeVirtRegInterval(MOI->getReg());
Cameron Zwarich9030fc22013-02-20 06:46:48 +00001592 }
1593 }
1594 }
1595
Matthias Braun95a36002017-01-19 00:32:13 +00001596 for (unsigned Reg : OrigRegs) {
Cameron Zwarichf0b25352013-02-17 00:10:44 +00001597 if (!TargetRegisterInfo::isVirtualRegister(Reg))
1598 continue;
1599
1600 LiveInterval &LI = getInterval(Reg);
Cameron Zwarich0e827eb2013-02-20 22:09:57 +00001601 // FIXME: Should we support undefs that gain defs?
1602 if (!LI.hasAtLeastOneValue())
1603 continue;
1604
Matthias Braun95a36002017-01-19 00:32:13 +00001605 for (LiveInterval::SubRange &S : LI.subranges())
Matthias Braun1bfcc2d2014-12-11 00:59:06 +00001606 repairOldRegInRange(Begin, End, endIdx, S, Reg, S.LaneMask);
Matthias Braun95a36002017-01-19 00:32:13 +00001607
Matthias Braun44024472014-12-10 01:12:26 +00001608 repairOldRegInRange(Begin, End, endIdx, LI, Reg);
Cameron Zwarichf0b25352013-02-17 00:10:44 +00001609 }
1610}
Matthias Braun1458e052015-01-21 18:50:21 +00001611
1612void LiveIntervals::removePhysRegDefAt(unsigned Reg, SlotIndex Pos) {
Matthias Braun95a36002017-01-19 00:32:13 +00001613 for (MCRegUnitIterator Unit(Reg, TRI); Unit.isValid(); ++Unit) {
1614 if (LiveRange *LR = getCachedRegUnit(*Unit))
Matthias Braun1458e052015-01-21 18:50:21 +00001615 if (VNInfo *VNI = LR->getVNInfoAt(Pos))
1616 LR->removeValNo(VNI);
1617 }
1618}
Matthias Braun7d3ec5a2015-01-21 19:02:30 +00001619
1620void LiveIntervals::removeVRegDefAt(LiveInterval &LI, SlotIndex Pos) {
Krzysztof Parzyszek31a5f882016-08-24 13:37:55 +00001621 // LI may not have the main range computed yet, but its subranges may
1622 // be present.
Matthias Braun7d3ec5a2015-01-21 19:02:30 +00001623 VNInfo *VNI = LI.getVNInfoAt(Pos);
Krzysztof Parzyszek31a5f882016-08-24 13:37:55 +00001624 if (VNI != nullptr) {
1625 assert(VNI->def.getBaseIndex() == Pos.getBaseIndex());
1626 LI.removeValNo(VNI);
1627 }
Matthias Braun7d3ec5a2015-01-21 19:02:30 +00001628
Krzysztof Parzyszek31a5f882016-08-24 13:37:55 +00001629 // Also remove the value defined in subranges.
Matthias Braun7d3ec5a2015-01-21 19:02:30 +00001630 for (LiveInterval::SubRange &S : LI.subranges()) {
1631 if (VNInfo *SVNI = S.getVNInfoAt(Pos))
Krzysztof Parzyszek31a5f882016-08-24 13:37:55 +00001632 if (SVNI->def.getBaseIndex() == Pos.getBaseIndex())
1633 S.removeValNo(SVNI);
Matthias Braun7d3ec5a2015-01-21 19:02:30 +00001634 }
1635 LI.removeEmptySubRanges();
1636}
Matthias Braun95e05dd2015-09-22 03:44:41 +00001637
1638void LiveIntervals::splitSeparateComponents(LiveInterval &LI,
1639 SmallVectorImpl<LiveInterval*> &SplitLIs) {
1640 ConnectedVNInfoEqClasses ConEQ(*this);
Matthias Braundcaeedf2016-01-08 01:16:35 +00001641 unsigned NumComp = ConEQ.Classify(LI);
Matthias Braun95e05dd2015-09-22 03:44:41 +00001642 if (NumComp <= 1)
1643 return;
Nicola Zaghen0818e782018-05-14 12:53:11 +00001644 LLVM_DEBUG(dbgs() << " Split " << NumComp << " components: " << LI << '\n');
Matthias Braun95e05dd2015-09-22 03:44:41 +00001645 unsigned Reg = LI.reg;
1646 const TargetRegisterClass *RegClass = MRI->getRegClass(Reg);
1647 for (unsigned I = 1; I < NumComp; ++I) {
1648 unsigned NewVReg = MRI->createVirtualRegister(RegClass);
1649 LiveInterval &NewLI = createEmptyInterval(NewVReg);
1650 SplitLIs.push_back(&NewLI);
1651 }
1652 ConEQ.Distribute(LI, SplitLIs.data(), *MRI);
1653}
Matthias Braun1c6737e2016-01-20 00:23:21 +00001654
Matthias Braun6054e842016-05-20 23:14:56 +00001655void LiveIntervals::constructMainRangeFromSubranges(LiveInterval &LI) {
1656 assert(LRCalc && "LRCalc not initialized.");
1657 LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
1658 LRCalc->constructMainRangeFromSubranges(LI);
1659}