blob: ce99e5535c2553bd22aef5fb34ce1533fc03b1ae [file] [log] [blame]
Eugene Zelenko5db84df2017-02-17 21:43:25 +00001//===- LiveRegMatrix.cpp - Track register interference --------------------===//
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the LiveRegMatrix analysis pass.
10//
11//===----------------------------------------------------------------------===//
12
Chandler Carruth6bda14b2017-06-06 11:49:48 +000013#include "llvm/CodeGen/LiveRegMatrix.h"
Jakob Stoklund Olesen866908c2012-09-06 18:15:23 +000014#include "RegisterCoalescer.h"
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +000015#include "llvm/ADT/Statistic.h"
Eugene Zelenko5db84df2017-02-17 21:43:25 +000016#include "llvm/CodeGen/LiveInterval.h"
Eugene Zelenko5db84df2017-02-17 21:43:25 +000017#include "llvm/CodeGen/LiveIntervalUnion.h"
Matthias Braunf8422972017-12-13 02:51:04 +000018#include "llvm/CodeGen/LiveIntervals.h"
Eugene Zelenko5db84df2017-02-17 21:43:25 +000019#include "llvm/CodeGen/MachineFunction.h"
David Blaikieb3bde2e2017-11-17 01:07:10 +000020#include "llvm/CodeGen/TargetRegisterInfo.h"
21#include "llvm/CodeGen/TargetSubtargetInfo.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000022#include "llvm/CodeGen/VirtRegMap.h"
Eugene Zelenko5db84df2017-02-17 21:43:25 +000023#include "llvm/MC/LaneBitmask.h"
24#include "llvm/MC/MCRegisterInfo.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000025#include "llvm/Pass.h"
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +000026#include "llvm/Support/Debug.h"
Chandler Carruthd9903882015-01-14 11:23:27 +000027#include "llvm/Support/raw_ostream.h"
Eugene Zelenko5db84df2017-02-17 21:43:25 +000028#include <cassert>
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +000029
30using namespace llvm;
31
Chandler Carruth1b9dde02014-04-22 02:02:50 +000032#define DEBUG_TYPE "regalloc"
33
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +000034STATISTIC(NumAssigned , "Number of registers assigned");
35STATISTIC(NumUnassigned , "Number of registers unassigned");
36
37char LiveRegMatrix::ID = 0;
38INITIALIZE_PASS_BEGIN(LiveRegMatrix, "liveregmatrix",
39 "Live Register Matrix", false, false)
40INITIALIZE_PASS_DEPENDENCY(LiveIntervals)
41INITIALIZE_PASS_DEPENDENCY(VirtRegMap)
42INITIALIZE_PASS_END(LiveRegMatrix, "liveregmatrix",
43 "Live Register Matrix", false, false)
44
Eugene Zelenko5db84df2017-02-17 21:43:25 +000045LiveRegMatrix::LiveRegMatrix() : MachineFunctionPass(ID) {}
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +000046
47void LiveRegMatrix::getAnalysisUsage(AnalysisUsage &AU) const {
48 AU.setPreservesAll();
49 AU.addRequiredTransitive<LiveIntervals>();
50 AU.addRequiredTransitive<VirtRegMap>();
51 MachineFunctionPass::getAnalysisUsage(AU);
52}
53
54bool LiveRegMatrix::runOnMachineFunction(MachineFunction &MF) {
Eric Christopherfc6de422014-08-05 02:39:49 +000055 TRI = MF.getSubtarget().getRegisterInfo();
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +000056 LIS = &getAnalysis<LiveIntervals>();
57 VRM = &getAnalysis<VirtRegMap>();
58
59 unsigned NumRegUnits = TRI->getNumRegUnits();
60 if (NumRegUnits != Matrix.size())
61 Queries.reset(new LiveIntervalUnion::Query[NumRegUnits]);
62 Matrix.init(LIUAlloc, NumRegUnits);
63
64 // Make sure no stale queries get reused.
65 invalidateVirtRegs();
66 return false;
67}
68
69void LiveRegMatrix::releaseMemory() {
70 for (unsigned i = 0, e = Matrix.size(); i != e; ++i) {
71 Matrix[i].clear();
Puyan Lotfi12ae04b2014-02-06 08:42:01 +000072 // No need to clear Queries here, since LiveIntervalUnion::Query doesn't
73 // have anything important to clear and LiveRegMatrix's runOnFunction()
Ahmed Charles56440fd2014-03-06 05:51:42 +000074 // does a std::unique_ptr::reset anyways.
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +000075 }
76}
77
Benjamin Kramerb7d33112016-08-06 11:13:10 +000078template <typename Callable>
79static bool foreachUnit(const TargetRegisterInfo *TRI,
80 LiveInterval &VRegInterval, unsigned PhysReg,
81 Callable Func) {
Matthias Braun587e2742014-12-10 01:13:01 +000082 if (VRegInterval.hasSubRanges()) {
83 for (MCRegUnitMaskIterator Units(PhysReg, TRI); Units.isValid(); ++Units) {
84 unsigned Unit = (*Units).first;
Matthias Braune6a24852015-09-25 21:51:14 +000085 LaneBitmask Mask = (*Units).second;
Matthias Braun09afa1e2014-12-11 00:59:06 +000086 for (LiveInterval::SubRange &S : VRegInterval.subranges()) {
Krzysztof Parzyszekea9f8ce2016-12-16 19:11:56 +000087 if ((S.LaneMask & Mask).any()) {
Matthias Braun09afa1e2014-12-11 00:59:06 +000088 if (Func(Unit, S))
Matthias Braun587e2742014-12-10 01:13:01 +000089 return true;
90 break;
91 }
92 }
93 }
94 } else {
95 for (MCRegUnitIterator Units(PhysReg, TRI); Units.isValid(); ++Units) {
96 if (Func(*Units, VRegInterval))
97 return true;
98 }
99 }
100 return false;
101}
102
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +0000103void LiveRegMatrix::assign(LiveInterval &VirtReg, unsigned PhysReg) {
Nicola Zaghend34e60c2018-05-14 12:53:11 +0000104 LLVM_DEBUG(dbgs() << "assigning " << printReg(VirtReg.reg, TRI) << " to "
105 << printReg(PhysReg, TRI) << ':');
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +0000106 assert(!VRM->hasPhys(VirtReg.reg) && "Duplicate VirtReg assignment");
107 VRM->assignVirt2Phys(VirtReg.reg, PhysReg);
Matthias Braun587e2742014-12-10 01:13:01 +0000108
Nicola Zaghend34e60c2018-05-14 12:53:11 +0000109 foreachUnit(
110 TRI, VirtReg, PhysReg, [&](unsigned Unit, const LiveRange &Range) {
111 LLVM_DEBUG(dbgs() << ' ' << printRegUnit(Unit, TRI) << ' ' << Range);
112 Matrix[Unit].unify(VirtReg, Range);
113 return false;
114 });
Matthias Braun587e2742014-12-10 01:13:01 +0000115
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +0000116 ++NumAssigned;
Nicola Zaghend34e60c2018-05-14 12:53:11 +0000117 LLVM_DEBUG(dbgs() << '\n');
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +0000118}
119
120void LiveRegMatrix::unassign(LiveInterval &VirtReg) {
121 unsigned PhysReg = VRM->getPhys(VirtReg.reg);
Nicola Zaghend34e60c2018-05-14 12:53:11 +0000122 LLVM_DEBUG(dbgs() << "unassigning " << printReg(VirtReg.reg, TRI) << " from "
123 << printReg(PhysReg, TRI) << ':');
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +0000124 VRM->clearVirt(VirtReg.reg);
Matthias Braun587e2742014-12-10 01:13:01 +0000125
Nicola Zaghend34e60c2018-05-14 12:53:11 +0000126 foreachUnit(TRI, VirtReg, PhysReg,
127 [&](unsigned Unit, const LiveRange &Range) {
128 LLVM_DEBUG(dbgs() << ' ' << printRegUnit(Unit, TRI));
129 Matrix[Unit].extract(VirtReg, Range);
130 return false;
131 });
Matthias Braun587e2742014-12-10 01:13:01 +0000132
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +0000133 ++NumUnassigned;
Nicola Zaghend34e60c2018-05-14 12:53:11 +0000134 LLVM_DEBUG(dbgs() << '\n');
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +0000135}
136
Matthias Braun953393a2015-07-14 17:38:17 +0000137bool LiveRegMatrix::isPhysRegUsed(unsigned PhysReg) const {
138 for (MCRegUnitIterator Unit(PhysReg, TRI); Unit.isValid(); ++Unit) {
139 if (!Matrix[*Unit].empty())
140 return true;
141 }
142 return false;
143}
144
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +0000145bool LiveRegMatrix::checkRegMaskInterference(LiveInterval &VirtReg,
146 unsigned PhysReg) {
147 // Check if the cached information is valid.
148 // The same BitVector can be reused for all PhysRegs.
149 // We could cache multiple VirtRegs if it becomes necessary.
150 if (RegMaskVirtReg != VirtReg.reg || RegMaskTag != UserTag) {
151 RegMaskVirtReg = VirtReg.reg;
152 RegMaskTag = UserTag;
153 RegMaskUsable.clear();
154 LIS->checkRegMaskInterference(VirtReg, RegMaskUsable);
155 }
156
157 // The BitVector is indexed by PhysReg, not register unit.
158 // Regmask interference is more fine grained than regunits.
159 // For example, a Win64 call can clobber %ymm8 yet preserve %xmm8.
Jakob Stoklund Olesen13dffcb2012-06-15 22:24:22 +0000160 return !RegMaskUsable.empty() && (!PhysReg || !RegMaskUsable.test(PhysReg));
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +0000161}
162
163bool LiveRegMatrix::checkRegUnitInterference(LiveInterval &VirtReg,
164 unsigned PhysReg) {
165 if (VirtReg.empty())
166 return false;
Jakob Stoklund Olesen866908c2012-09-06 18:15:23 +0000167 CoalescerPair CP(VirtReg.reg, PhysReg, *TRI);
Matthias Braun587e2742014-12-10 01:13:01 +0000168
169 bool Result = foreachUnit(TRI, VirtReg, PhysReg, [&](unsigned Unit,
170 const LiveRange &Range) {
171 const LiveRange &UnitRange = LIS->getRegUnit(Unit);
172 return Range.overlaps(UnitRange, CP, *LIS->getSlotIndexes());
173 });
174 return Result;
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +0000175}
176
Matthias Braundbcf9e22017-03-02 00:35:08 +0000177LiveIntervalUnion::Query &LiveRegMatrix::query(const LiveRange &LR,
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +0000178 unsigned RegUnit) {
179 LiveIntervalUnion::Query &Q = Queries[RegUnit];
Matthias Braundbcf9e22017-03-02 00:35:08 +0000180 Q.init(UserTag, LR, Matrix[RegUnit]);
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +0000181 return Q;
182}
183
184LiveRegMatrix::InterferenceKind
185LiveRegMatrix::checkInterference(LiveInterval &VirtReg, unsigned PhysReg) {
186 if (VirtReg.empty())
187 return IK_Free;
188
189 // Regmask interference is the fastest check.
190 if (checkRegMaskInterference(VirtReg, PhysReg))
191 return IK_RegMask;
192
193 // Check for fixed interference.
194 if (checkRegUnitInterference(VirtReg, PhysReg))
195 return IK_RegUnit;
196
197 // Check the matrix for virtual register interference.
Matthias Braundbcf9e22017-03-02 00:35:08 +0000198 bool Interference = foreachUnit(TRI, VirtReg, PhysReg,
199 [&](unsigned Unit, const LiveRange &LR) {
200 return query(LR, Unit).checkInterference();
201 });
202 if (Interference)
203 return IK_VirtReg;
Jakob Stoklund Olesenc26fbbf2012-06-09 02:13:10 +0000204
205 return IK_Free;
206}
Marina Yatsinacd5bc4a2018-01-31 13:31:08 +0000207
208bool LiveRegMatrix::checkInterference(SlotIndex Start, SlotIndex End,
209 unsigned PhysReg) {
210 // Construct artificial live range containing only one segment [Start, End).
211 VNInfo valno(0, Start);
212 LiveRange::Segment Seg(Start, End, &valno);
213 LiveRange LR;
214 LR.addSegment(Seg);
215
216 // Check for interference with that segment
217 for (MCRegUnitIterator Units(PhysReg, TRI); Units.isValid(); ++Units) {
218 if (query(LR, *Units).checkInterference())
219 return true;
220 }
221 return false;
222}