[Simplify] Mark (and sweep) based on latest access relation.
[polly-mirror.git] / lib / Support / VirtualInstruction.cpp
blob0e4718864896d585a3b0f2a66df07a47a1f620b5
1 //===------ VirtualInstruction.cpp ------------------------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Tools for determining which instructions are within a statement and the
11 // nature of their operands.
13 //===----------------------------------------------------------------------===//
15 #include "polly/Support/VirtualInstruction.h"
16 #include "polly/Support/SCEVValidator.h"
18 using namespace polly;
19 using namespace llvm;
21 VirtualUse VirtualUse ::create(Scop *S, const Use &U, LoopInfo *LI,
22 bool Virtual) {
23 auto *UserBB = getUseBlock(U);
24 Instruction *UI = dyn_cast<Instruction>(U.getUser());
25 ScopStmt *UserStmt = nullptr;
26 if (PHINode *PHI = dyn_cast<PHINode>(UI))
27 UserStmt = S->getLastStmtFor(PHI->getIncomingBlock(U));
28 else
29 UserStmt = S->getStmtFor(UI);
30 auto *UserScope = LI->getLoopFor(UserBB);
31 return create(S, UserStmt, UserScope, U.get(), Virtual);
34 VirtualUse VirtualUse::create(Scop *S, ScopStmt *UserStmt, Loop *UserScope,
35 Value *Val, bool Virtual) {
36 assert(!isa<StoreInst>(Val) && "a StoreInst cannot be used");
38 if (isa<BasicBlock>(Val))
39 return VirtualUse(UserStmt, Val, Block, nullptr, nullptr);
41 if (isa<llvm::Constant>(Val) || isa<MetadataAsValue>(Val))
42 return VirtualUse(UserStmt, Val, Constant, nullptr, nullptr);
44 // Is the value synthesizable? If the user has been pruned
45 // (UserStmt == nullptr), it is either not used anywhere or is synthesizable.
46 // We assume synthesizable which practically should have the same effect.
47 auto *SE = S->getSE();
48 if (SE->isSCEVable(Val->getType())) {
49 auto *ScevExpr = SE->getSCEVAtScope(Val, UserScope);
50 if (!UserStmt || canSynthesize(Val, *UserStmt->getParent(), SE, UserScope))
51 return VirtualUse(UserStmt, Val, Synthesizable, ScevExpr, nullptr);
54 // FIXME: Inconsistency between lookupInvariantEquivClass and
55 // getRequiredInvariantLoads. Querying one of them should be enough.
56 auto &RIL = S->getRequiredInvariantLoads();
57 if (S->lookupInvariantEquivClass(Val) || RIL.count(dyn_cast<LoadInst>(Val)))
58 return VirtualUse(UserStmt, Val, Hoisted, nullptr, nullptr);
60 // ReadOnly uses may have MemoryAccesses that we want to associate with the
61 // use. This is why we look for a MemoryAccess here already.
62 MemoryAccess *InputMA = nullptr;
63 if (UserStmt && Virtual)
64 InputMA = UserStmt->lookupValueReadOf(Val);
66 // Uses are read-only if they have been defined before the SCoP, i.e., they
67 // cannot be written to inside the SCoP. Arguments are defined before any
68 // instructions, hence also before the SCoP. If the user has been pruned
69 // (UserStmt == nullptr) and is not SCEVable, assume it is read-only as it is
70 // neither an intra- nor an inter-use.
71 if (!UserStmt || isa<Argument>(Val))
72 return VirtualUse(UserStmt, Val, ReadOnly, nullptr, InputMA);
74 auto Inst = cast<Instruction>(Val);
75 if (!S->contains(Inst))
76 return VirtualUse(UserStmt, Val, ReadOnly, nullptr, InputMA);
78 // A use is inter-statement if either it is defined in another statement, or
79 // there is a MemoryAccess that reads its value that has been written by
80 // another statement.
81 if (InputMA || (!Virtual && UserStmt != S->getStmtFor(Inst)))
82 return VirtualUse(UserStmt, Val, Inter, nullptr, InputMA);
84 return VirtualUse(UserStmt, Val, Intra, nullptr, nullptr);
87 void VirtualUse::print(raw_ostream &OS, bool Reproducible) const {
88 OS << "User: [" << User->getBaseName() << "] ";
89 switch (Kind) {
90 case VirtualUse::Constant:
91 OS << "Constant Op:";
92 break;
93 case VirtualUse::Block:
94 OS << "BasicBlock Op:";
95 break;
96 case VirtualUse::Synthesizable:
97 OS << "Synthesizable Op:";
98 break;
99 case VirtualUse::Hoisted:
100 OS << "Hoisted load Op:";
101 break;
102 case VirtualUse::ReadOnly:
103 OS << "Read-Only Op:";
104 break;
105 case VirtualUse::Intra:
106 OS << "Intra Op:";
107 break;
108 case VirtualUse::Inter:
109 OS << "Inter Op:";
110 break;
113 if (Val) {
114 OS << ' ';
115 if (Reproducible)
116 OS << '"' << Val->getName() << '"';
117 else
118 Val->print(OS, true);
120 if (ScevExpr) {
121 OS << ' ';
122 ScevExpr->print(OS);
124 if (InputMA && !Reproducible)
125 OS << ' ' << InputMA;
128 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
129 LLVM_DUMP_METHOD void VirtualUse::dump() const {
130 print(errs(), false);
131 errs() << '\n';
133 #endif
135 void VirtualInstruction::print(raw_ostream &OS, bool Reproducible) const {
136 if (!Stmt || !Inst) {
137 OS << "[null VirtualInstruction]";
138 return;
141 OS << "[" << Stmt->getBaseName() << "]";
142 Inst->print(OS, !Reproducible);
145 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
146 LLVM_DUMP_METHOD void VirtualInstruction::dump() const {
147 print(errs(), false);
148 errs() << '\n';
150 #endif
152 /// Return true if @p Inst cannot be removed, even if it is nowhere referenced.
153 static bool isRoot(const Instruction *Inst) {
154 // The store is handled by its MemoryAccess. The load must be reached from the
155 // roots in order to be marked as used.
156 if (isa<LoadInst>(Inst) || isa<StoreInst>(Inst))
157 return false;
159 // Terminator instructions (in region statements) are required for control
160 // flow.
161 if (isa<TerminatorInst>(Inst))
162 return true;
164 // Writes to memory must be honored.
165 if (Inst->mayWriteToMemory())
166 return true;
168 return false;
171 /// Return true for MemoryAccesses that cannot be removed because it represents
172 /// an llvm::Value that is used after the SCoP.
173 static bool isEscaping(MemoryAccess *MA) {
174 assert(MA->isOriginalValueKind());
175 Scop *S = MA->getStatement()->getParent();
176 return S->isEscaping(cast<Instruction>(MA->getAccessValue()));
179 /// Add non-removable virtual instructions in @p Stmt to @p RootInsts.
180 static void
181 addInstructionRoots(ScopStmt *Stmt,
182 SmallVectorImpl<VirtualInstruction> &RootInsts) {
183 if (!Stmt->isBlockStmt()) {
184 // In region statements the terminator statement and all statements that
185 // are not in the entry block cannot be eliminated and consequently must
186 // be roots.
187 RootInsts.emplace_back(Stmt,
188 Stmt->getRegion()->getEntry()->getTerminator());
189 for (BasicBlock *BB : Stmt->getRegion()->blocks())
190 if (Stmt->getRegion()->getEntry() != BB)
191 for (Instruction &Inst : *BB)
192 RootInsts.emplace_back(Stmt, &Inst);
193 return;
196 for (Instruction *Inst : Stmt->getInstructions())
197 if (isRoot(Inst))
198 RootInsts.emplace_back(Stmt, Inst);
201 /// Add non-removable memory accesses in @p Stmt to @p RootInsts.
203 /// @param Local If true, all writes are assumed to escape. markAndSweep
204 /// algorithms can use this to be applicable to a single ScopStmt only without
205 /// the risk of removing definitions required by other statements.
206 /// If false, only writes for SCoP-escaping values are roots. This
207 /// is global mode, where such writes must be marked by theirs uses
208 /// in order to be reachable.
209 static void addAccessRoots(ScopStmt *Stmt,
210 SmallVectorImpl<MemoryAccess *> &RootAccs,
211 bool Local) {
212 for (auto *MA : *Stmt) {
213 if (!MA->isWrite())
214 continue;
216 // Writes to arrays are always used.
217 if (MA->isLatestArrayKind())
218 RootAccs.push_back(MA);
220 // Values are roots if they are escaping.
221 else if (MA->isLatestValueKind()) {
222 if (Local || isEscaping(MA))
223 RootAccs.push_back(MA);
226 // Exit phis are, by definition, escaping.
227 else if (MA->isLatestExitPHIKind())
228 RootAccs.push_back(MA);
230 // phi writes are only roots if we are not visiting the statement
231 // containing the PHINode.
232 else if (Local && MA->isLatestPHIKind())
233 RootAccs.push_back(MA);
237 /// Determine all instruction and access roots.
238 static void addRoots(ScopStmt *Stmt,
239 SmallVectorImpl<VirtualInstruction> &RootInsts,
240 SmallVectorImpl<MemoryAccess *> &RootAccs, bool Local) {
241 addInstructionRoots(Stmt, RootInsts);
242 addAccessRoots(Stmt, RootAccs, Local);
245 /// Mark accesses and instructions as used if they are reachable from a root,
246 /// walking the operand trees.
248 /// @param S The SCoP to walk.
249 /// @param LI The LoopInfo Analysis.
250 /// @param RootInsts List of root instructions.
251 /// @param RootAccs List of root accesses.
252 /// @param UsesInsts[out] Receives all reachable instructions, including the
253 /// roots.
254 /// @param UsedAccs[out] Receives all reachable accesses, including the roots.
255 /// @param OnlyLocal If non-nullptr, restricts walking to a single
256 /// statement.
257 static void walkReachable(Scop *S, LoopInfo *LI,
258 ArrayRef<VirtualInstruction> RootInsts,
259 ArrayRef<MemoryAccess *> RootAccs,
260 DenseSet<VirtualInstruction> &UsedInsts,
261 DenseSet<MemoryAccess *> &UsedAccs,
262 ScopStmt *OnlyLocal = nullptr) {
263 UsedInsts.clear();
264 UsedAccs.clear();
266 SmallVector<VirtualInstruction, 32> WorklistInsts;
267 SmallVector<MemoryAccess *, 32> WorklistAccs;
269 WorklistInsts.append(RootInsts.begin(), RootInsts.end());
270 WorklistAccs.append(RootAccs.begin(), RootAccs.end());
272 auto AddToWorklist = [&](VirtualUse VUse) {
273 switch (VUse.getKind()) {
274 case VirtualUse::Block:
275 case VirtualUse::Constant:
276 case VirtualUse::Synthesizable:
277 case VirtualUse::Hoisted:
278 break;
279 case VirtualUse::ReadOnly:
280 // Read-only scalars only have MemoryAccesses if ModelReadOnlyScalars is
281 // enabled.
282 if (!VUse.getMemoryAccess())
283 break;
284 LLVM_FALLTHROUGH;
285 case VirtualUse::Inter:
286 assert(VUse.getMemoryAccess());
287 WorklistAccs.push_back(VUse.getMemoryAccess());
288 break;
289 case VirtualUse::Intra:
290 WorklistInsts.emplace_back(VUse.getUser(),
291 cast<Instruction>(VUse.getValue()));
292 break;
296 while (true) {
297 // We have two worklists to process: Only when the MemoryAccess worklist is
298 // empty, we process the instruction worklist.
300 while (!WorklistAccs.empty()) {
301 auto *Acc = WorklistAccs.pop_back_val();
303 ScopStmt *Stmt = Acc->getStatement();
304 if (OnlyLocal && Stmt != OnlyLocal)
305 continue;
307 auto Inserted = UsedAccs.insert(Acc);
308 if (!Inserted.second)
309 continue;
311 if (Acc->isRead()) {
312 const ScopArrayInfo *SAI = Acc->getScopArrayInfo();
314 if (Acc->isLatestValueKind()) {
315 MemoryAccess *DefAcc = S->getValueDef(SAI);
317 // Accesses to read-only values do not have a definition.
318 if (DefAcc)
319 WorklistAccs.push_back(S->getValueDef(SAI));
322 if (Acc->isLatestAnyPHIKind()) {
323 auto IncomingMAs = S->getPHIIncomings(SAI);
324 WorklistAccs.append(IncomingMAs.begin(), IncomingMAs.end());
328 if (Acc->isWrite()) {
329 if (Acc->isOriginalValueKind() ||
330 (Acc->isOriginalArrayKind() && Acc->getAccessValue())) {
331 Loop *Scope = Stmt->getSurroundingLoop();
332 VirtualUse VUse =
333 VirtualUse::create(S, Stmt, Scope, Acc->getAccessValue(), true);
334 AddToWorklist(VUse);
337 if (Acc->isOriginalAnyPHIKind()) {
338 for (auto Incoming : Acc->getIncoming()) {
339 VirtualUse VUse = VirtualUse::create(
340 S, Stmt, LI->getLoopFor(Incoming.first), Incoming.second, true);
341 AddToWorklist(VUse);
345 if (Acc->isOriginalArrayKind())
346 WorklistInsts.emplace_back(Stmt, Acc->getAccessInstruction());
350 // If both worklists are empty, stop walking.
351 if (WorklistInsts.empty())
352 break;
354 VirtualInstruction VInst = WorklistInsts.pop_back_val();
355 ScopStmt *Stmt = VInst.getStmt();
356 Instruction *Inst = VInst.getInstruction();
358 // Do not process statements other than the local.
359 if (OnlyLocal && Stmt != OnlyLocal)
360 continue;
362 auto InsertResult = UsedInsts.insert(VInst);
363 if (!InsertResult.second)
364 continue;
366 // Add all operands to the worklists.
367 PHINode *PHI = dyn_cast<PHINode>(Inst);
368 if (PHI && PHI->getParent() == Stmt->getEntryBlock()) {
369 if (MemoryAccess *PHIRead = Stmt->lookupPHIReadOf(PHI))
370 WorklistAccs.push_back(PHIRead);
371 } else {
372 for (VirtualUse VUse : VInst.operands())
373 AddToWorklist(VUse);
376 // If there is an array access, also add its MemoryAccesses to the worklist.
377 const MemoryAccessList *Accs = Stmt->lookupArrayAccessesFor(Inst);
378 if (!Accs)
379 continue;
381 for (MemoryAccess *Acc : *Accs)
382 WorklistAccs.push_back(Acc);
386 void polly::markReachable(Scop *S, LoopInfo *LI,
387 DenseSet<VirtualInstruction> &UsedInsts,
388 DenseSet<MemoryAccess *> &UsedAccs,
389 ScopStmt *OnlyLocal) {
390 SmallVector<VirtualInstruction, 32> RootInsts;
391 SmallVector<MemoryAccess *, 32> RootAccs;
393 if (OnlyLocal) {
394 addRoots(OnlyLocal, RootInsts, RootAccs, true);
395 } else {
396 for (auto &Stmt : *S)
397 addRoots(&Stmt, RootInsts, RootAccs, false);
400 walkReachable(S, LI, RootInsts, RootAccs, UsedInsts, UsedAccs, OnlyLocal);