blob: e2b67e8365e44efb8d42cf69487f17cf573ac050 [file] [log] [blame]
Dan Gohman81db61a2009-05-12 02:17:14 +00001//===- IVUsers.cpp - Induction Variable Users -------------------*- 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// This file implements bookkeeping for "interesting" users of expressions
11// computed from induction variables.
12//
13//===----------------------------------------------------------------------===//
14
15#define DEBUG_TYPE "iv-users"
16#include "llvm/Analysis/IVUsers.h"
17#include "llvm/Constants.h"
18#include "llvm/Instructions.h"
19#include "llvm/Type.h"
20#include "llvm/DerivedTypes.h"
21#include "llvm/Analysis/Dominators.h"
Dan Gohman81db61a2009-05-12 02:17:14 +000022#include "llvm/Analysis/LoopPass.h"
23#include "llvm/Analysis/ScalarEvolutionExpressions.h"
Dan Gohman4207d6a2010-02-10 20:42:37 +000024#include "llvm/Assembly/AsmAnnotationWriter.h"
Dan Gohman81db61a2009-05-12 02:17:14 +000025#include "llvm/ADT/STLExtras.h"
26#include "llvm/Support/Debug.h"
27#include "llvm/Support/raw_ostream.h"
28#include <algorithm>
29using namespace llvm;
30
31char IVUsers::ID = 0;
Owen Andersond13db2c2010-07-21 22:09:45 +000032INITIALIZE_PASS(IVUsers, "iv-users", "Induction Variable Users", false, true);
Dan Gohman81db61a2009-05-12 02:17:14 +000033
34Pass *llvm::createIVUsersPass() {
35 return new IVUsers();
36}
37
Dan Gohman448db1c2010-04-07 22:27:08 +000038/// isInteresting - Test whether the given expression is "interesting" when
39/// used by the given expression, within the context of analyzing the
40/// given loop.
41static bool isInteresting(const SCEV *S, const Instruction *I, const Loop *L) {
42 // Anything loop-invariant is interesting.
43 if (!isa<SCEVUnknown>(S) && S->isLoopInvariant(L))
Dan Gohman81db61a2009-05-12 02:17:14 +000044 return true;
45
Dan Gohman448db1c2010-04-07 22:27:08 +000046 // An addrec is interesting if it's affine or if it has an interesting start.
47 if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S)) {
48 // Keep things simple. Don't touch loop-variant strides.
Dan Gohmanb3cdb0e2010-04-09 01:22:56 +000049 if (AR->getLoop() == L)
50 return AR->isAffine() || !L->contains(I);
Dan Gohman448db1c2010-04-07 22:27:08 +000051 // Otherwise recurse to see if the start value is interesting.
52 return isInteresting(AR->getStart(), I, L);
53 }
Dan Gohman81db61a2009-05-12 02:17:14 +000054
Dan Gohman448db1c2010-04-07 22:27:08 +000055 // An add is interesting if any of its operands is.
56 if (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(S)) {
57 for (SCEVAddExpr::op_iterator OI = Add->op_begin(), OE = Add->op_end();
58 OI != OE; ++OI)
59 if (isInteresting(*OI, I, L))
60 return true;
61 return false;
62 }
Dan Gohman81db61a2009-05-12 02:17:14 +000063
Dan Gohman448db1c2010-04-07 22:27:08 +000064 // Nothing else is interesting here.
65 return false;
Dan Gohman81db61a2009-05-12 02:17:14 +000066}
67
68/// AddUsersIfInteresting - Inspect the specified instruction. If it is a
69/// reducible SCEV, recursively add its users to the IVUsesByStride set and
70/// return true. Otherwise, return false.
71bool IVUsers::AddUsersIfInteresting(Instruction *I) {
72 if (!SE->isSCEVable(I->getType()))
73 return false; // Void and FP expressions cannot be reduced.
74
75 // LSR is not APInt clean, do not touch integers bigger than 64-bits.
76 if (SE->getTypeSizeInBits(I->getType()) > 64)
77 return false;
78
79 if (!Processed.insert(I))
80 return true; // Instruction already handled.
81
82 // Get the symbolic expression for this instruction.
Dan Gohman0bba49c2009-07-07 17:06:11 +000083 const SCEV *ISE = SE->getSCEV(I);
Dan Gohman81db61a2009-05-12 02:17:14 +000084
Dan Gohman448db1c2010-04-07 22:27:08 +000085 // If we've come to an uninteresting expression, stop the traversal and
86 // call this a user.
87 if (!isInteresting(ISE, I, L))
Jim Grosbach97200e42009-11-19 02:05:44 +000088 return false;
89
Dan Gohman81db61a2009-05-12 02:17:14 +000090 SmallPtrSet<Instruction *, 4> UniqueUsers;
91 for (Value::use_iterator UI = I->use_begin(), E = I->use_end();
92 UI != E; ++UI) {
93 Instruction *User = cast<Instruction>(*UI);
94 if (!UniqueUsers.insert(User))
95 continue;
96
97 // Do not infinitely recurse on PHI nodes.
98 if (isa<PHINode>(User) && Processed.count(User))
99 continue;
100
101 // Descend recursively, but not into PHI nodes outside the current loop.
102 // It's important to see the entire expression outside the loop to get
103 // choices that depend on addressing mode use right, although we won't
Dan Gohman3f46a3a2010-03-01 17:49:51 +0000104 // consider references outside the loop in all cases.
Dan Gohman81db61a2009-05-12 02:17:14 +0000105 // If User is already in Processed, we don't want to recurse into it again,
106 // but do want to record a second reference in the same instruction.
107 bool AddUserToIVUsers = false;
108 if (LI->getLoopFor(User->getParent()) != L) {
109 if (isa<PHINode>(User) || Processed.count(User) ||
110 !AddUsersIfInteresting(User)) {
David Greene63c45602009-12-23 20:20:46 +0000111 DEBUG(dbgs() << "FOUND USER in other loop: " << *User << '\n'
Chris Lattnerbdff5482009-08-23 04:37:46 +0000112 << " OF SCEV: " << *ISE << '\n');
Dan Gohman81db61a2009-05-12 02:17:14 +0000113 AddUserToIVUsers = true;
114 }
115 } else if (Processed.count(User) ||
116 !AddUsersIfInteresting(User)) {
David Greene63c45602009-12-23 20:20:46 +0000117 DEBUG(dbgs() << "FOUND USER: " << *User << '\n'
Chris Lattnerbdff5482009-08-23 04:37:46 +0000118 << " OF SCEV: " << *ISE << '\n');
Dan Gohman81db61a2009-05-12 02:17:14 +0000119 AddUserToIVUsers = true;
120 }
121
122 if (AddUserToIVUsers) {
Dan Gohman448db1c2010-04-07 22:27:08 +0000123 // Okay, we found a user that we cannot reduce.
Dan Gohmanc0564542010-04-19 21:48:58 +0000124 IVUses.push_back(new IVStrideUse(this, User, I));
Dan Gohman448db1c2010-04-07 22:27:08 +0000125 IVStrideUse &NewUse = IVUses.back();
126 // Transform the expression into a normalized form.
Dan Gohmanc0564542010-04-19 21:48:58 +0000127 ISE = TransformForPostIncUse(NormalizeAutodetect,
128 ISE, User, I,
129 NewUse.PostIncLoops,
130 *SE, *DT);
131 DEBUG(dbgs() << " NORMALIZED TO: " << *ISE << '\n');
Dan Gohman81db61a2009-05-12 02:17:14 +0000132 }
133 }
134 return true;
135}
136
Dan Gohmanc0564542010-04-19 21:48:58 +0000137IVStrideUse &IVUsers::AddUser(Instruction *User, Value *Operand) {
138 IVUses.push_back(new IVStrideUse(this, User, Operand));
Dan Gohman572645c2010-02-12 10:34:29 +0000139 return IVUses.back();
Evan Cheng586f69a2009-11-12 07:35:05 +0000140}
141
Dan Gohman81db61a2009-05-12 02:17:14 +0000142IVUsers::IVUsers()
Owen Anderson1f745902010-08-06 00:23:35 +0000143 : LoopPass(&ID) {
Dan Gohman81db61a2009-05-12 02:17:14 +0000144}
145
146void IVUsers::getAnalysisUsage(AnalysisUsage &AU) const {
147 AU.addRequired<LoopInfo>();
148 AU.addRequired<DominatorTree>();
149 AU.addRequired<ScalarEvolution>();
150 AU.setPreservesAll();
151}
152
153bool IVUsers::runOnLoop(Loop *l, LPPassManager &LPM) {
154
155 L = l;
156 LI = &getAnalysis<LoopInfo>();
157 DT = &getAnalysis<DominatorTree>();
158 SE = &getAnalysis<ScalarEvolution>();
159
160 // Find all uses of induction variables in this loop, and categorize
161 // them by stride. Start by finding all of the PHI nodes in the header for
162 // this loop. If they are induction variables, inspect their uses.
163 for (BasicBlock::iterator I = L->getHeader()->begin(); isa<PHINode>(I); ++I)
Dan Gohmane521ccb2010-04-11 19:30:19 +0000164 (void)AddUsersIfInteresting(I);
Dan Gohman81db61a2009-05-12 02:17:14 +0000165
166 return false;
167}
168
Dan Gohman81db61a2009-05-12 02:17:14 +0000169void IVUsers::print(raw_ostream &OS, const Module *M) const {
170 OS << "IV Users for loop ";
171 WriteAsOperand(OS, L->getHeader(), false);
172 if (SE->hasLoopInvariantBackedgeTakenCount(L)) {
173 OS << " with backedge-taken count "
174 << *SE->getBackedgeTakenCount(L);
175 }
176 OS << ":\n";
177
Dan Gohman3f46a3a2010-03-01 17:49:51 +0000178 // Use a default AssemblyAnnotationWriter to suppress the default info
Dan Gohman04025772010-02-14 02:48:58 +0000179 // comments, which aren't relevant here.
180 AssemblyAnnotationWriter Annotator;
Dan Gohman572645c2010-02-12 10:34:29 +0000181 for (ilist<IVStrideUse>::const_iterator UI = IVUses.begin(),
182 E = IVUses.end(); UI != E; ++UI) {
183 OS << " ";
184 WriteAsOperand(OS, UI->getOperandValToReplace(), false);
Dan Gohmanc0564542010-04-19 21:48:58 +0000185 OS << " = " << *getReplacementExpr(*UI);
Dan Gohman448db1c2010-04-07 22:27:08 +0000186 for (PostIncLoopSet::const_iterator
187 I = UI->PostIncLoops.begin(),
188 E = UI->PostIncLoops.end(); I != E; ++I) {
189 OS << " (post-inc with loop ";
190 WriteAsOperand(OS, (*I)->getHeader(), false);
191 OS << ")";
192 }
Dan Gohman572645c2010-02-12 10:34:29 +0000193 OS << " in ";
194 UI->getUser()->print(OS, &Annotator);
195 OS << '\n';
Dan Gohman81db61a2009-05-12 02:17:14 +0000196 }
197}
198
Dan Gohman81db61a2009-05-12 02:17:14 +0000199void IVUsers::dump() const {
David Greene63c45602009-12-23 20:20:46 +0000200 print(dbgs());
Dan Gohman81db61a2009-05-12 02:17:14 +0000201}
202
203void IVUsers::releaseMemory() {
Evan Cheng04149f72009-12-17 09:39:49 +0000204 Processed.clear();
Dan Gohman6bec5bb2009-12-18 00:06:20 +0000205 IVUses.clear();
Dan Gohman81db61a2009-05-12 02:17:14 +0000206}
207
Dan Gohmanc0564542010-04-19 21:48:58 +0000208/// getReplacementExpr - Return a SCEV expression which computes the
209/// value of the OperandValToReplace.
210const SCEV *IVUsers::getReplacementExpr(const IVStrideUse &IU) const {
211 return SE->getSCEV(IU.getOperandValToReplace());
212}
213
214/// getExpr - Return the expression for the use.
215const SCEV *IVUsers::getExpr(const IVStrideUse &IU) const {
216 return
217 TransformForPostIncUse(Normalize, getReplacementExpr(IU),
218 IU.getUser(), IU.getOperandValToReplace(),
219 const_cast<PostIncLoopSet &>(IU.getPostIncLoops()),
220 *SE, *DT);
221}
222
Dan Gohman448db1c2010-04-07 22:27:08 +0000223static const SCEVAddRecExpr *findAddRecForLoop(const SCEV *S, const Loop *L) {
224 if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S)) {
225 if (AR->getLoop() == L)
226 return AR;
227 return findAddRecForLoop(AR->getStart(), L);
228 }
229
230 if (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(S)) {
231 for (SCEVAddExpr::op_iterator I = Add->op_begin(), E = Add->op_end();
232 I != E; ++I)
233 if (const SCEVAddRecExpr *AR = findAddRecForLoop(*I, L))
234 return AR;
235 return 0;
236 }
237
238 return 0;
239}
240
Dan Gohmanc0564542010-04-19 21:48:58 +0000241const SCEV *IVUsers::getStride(const IVStrideUse &IU, const Loop *L) const {
242 if (const SCEVAddRecExpr *AR = findAddRecForLoop(getExpr(IU), L))
243 return AR->getStepRecurrence(*SE);
Dan Gohman448db1c2010-04-07 22:27:08 +0000244 return 0;
245}
246
247void IVStrideUse::transformToPostInc(const Loop *L) {
Dan Gohman448db1c2010-04-07 22:27:08 +0000248 PostIncLoops.insert(L);
249}
250
Dan Gohman81db61a2009-05-12 02:17:14 +0000251void IVStrideUse::deleted() {
252 // Remove this user from the list.
Dan Gohman572645c2010-02-12 10:34:29 +0000253 Parent->IVUses.erase(this);
Dan Gohman81db61a2009-05-12 02:17:14 +0000254 // this now dangles!
255}