LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
IVUsers.cpp
Go to the documentation of this file.
1 //===- 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/ADT/STLExtras.h"
19 #include "llvm/Analysis/LoopPass.h"
22 #include "llvm/Assembly/Writer.h"
23 #include "llvm/IR/Constants.h"
24 #include "llvm/IR/DataLayout.h"
25 #include "llvm/IR/DerivedTypes.h"
26 #include "llvm/IR/Instructions.h"
27 #include "llvm/IR/Type.h"
28 #include "llvm/Support/Debug.h"
30 #include <algorithm>
31 using namespace llvm;
32 
33 char IVUsers::ID = 0;
34 INITIALIZE_PASS_BEGIN(IVUsers, "iv-users",
35  "Induction Variable Users", false, true)
40  "Induction Variable Users", false, true)
41 
43  return new IVUsers();
44 }
45 
46 /// isInteresting - Test whether the given expression is "interesting" when
47 /// used by the given expression, within the context of analyzing the
48 /// given loop.
49 static bool isInteresting(const SCEV *S, const Instruction *I, const Loop *L,
50  ScalarEvolution *SE, LoopInfo *LI) {
51  // An addrec is interesting if it's affine or if it has an interesting start.
52  if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S)) {
53  // Keep things simple. Don't touch loop-variant strides unless they're
54  // only used outside the loop and we can simplify them.
55  if (AR->getLoop() == L)
56  return AR->isAffine() ||
57  (!L->contains(I) &&
58  SE->getSCEVAtScope(AR, LI->getLoopFor(I->getParent())) != AR);
59  // Otherwise recurse to see if the start value is interesting, and that
60  // the step value is not interesting, since we don't yet know how to
61  // do effective SCEV expansions for addrecs with interesting steps.
62  return isInteresting(AR->getStart(), I, L, SE, LI) &&
63  !isInteresting(AR->getStepRecurrence(*SE), I, L, SE, LI);
64  }
65 
66  // An add is interesting if exactly one of its operands is interesting.
67  if (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(S)) {
68  bool AnyInterestingYet = false;
69  for (SCEVAddExpr::op_iterator OI = Add->op_begin(), OE = Add->op_end();
70  OI != OE; ++OI)
71  if (isInteresting(*OI, I, L, SE, LI)) {
72  if (AnyInterestingYet)
73  return false;
74  AnyInterestingYet = true;
75  }
76  return AnyInterestingYet;
77  }
78 
79  // Nothing else is interesting here.
80  return false;
81 }
82 
83 /// Return true if all loop headers that dominate this block are in simplified
84 /// form.
85 static bool isSimplifiedLoopNest(BasicBlock *BB, const DominatorTree *DT,
86  const LoopInfo *LI,
87  SmallPtrSet<Loop*,16> &SimpleLoopNests) {
88  Loop *NearestLoop = 0;
89  for (DomTreeNode *Rung = DT->getNode(BB);
90  Rung; Rung = Rung->getIDom()) {
91  BasicBlock *DomBB = Rung->getBlock();
92  Loop *DomLoop = LI->getLoopFor(DomBB);
93  if (DomLoop && DomLoop->getHeader() == DomBB) {
94  // If the domtree walk reaches a loop with no preheader, return false.
95  if (!DomLoop->isLoopSimplifyForm())
96  return false;
97  // If we have already checked this loop nest, stop checking.
98  if (SimpleLoopNests.count(DomLoop))
99  break;
100  // If we have not already checked this loop nest, remember the loop
101  // header nearest to BB. The nearest loop may not contain BB.
102  if (!NearestLoop)
103  NearestLoop = DomLoop;
104  }
105  }
106  if (NearestLoop)
107  SimpleLoopNests.insert(NearestLoop);
108  return true;
109 }
110 
111 /// AddUsersImpl - Inspect the specified instruction. If it is a
112 /// reducible SCEV, recursively add its users to the IVUsesByStride set and
113 /// return true. Otherwise, return false.
115  SmallPtrSet<Loop*,16> &SimpleLoopNests) {
116  // Add this IV user to the Processed set before returning false to ensure that
117  // all IV users are members of the set. See IVUsers::isIVUserOrOperand.
118  if (!Processed.insert(I))
119  return true; // Instruction already handled.
120 
121  if (!SE->isSCEVable(I->getType()))
122  return false; // Void and FP expressions cannot be reduced.
123 
124  // IVUsers is used by LSR which assumes that all SCEV expressions are safe to
125  // pass to SCEVExpander. Expressions are not safe to expand if they represent
126  // operations that are not safe to speculate, namely integer division.
127  if (!isa<PHINode>(I) && !isSafeToSpeculativelyExecute(I, TD))
128  return false;
129 
130  // LSR is not APInt clean, do not touch integers bigger than 64-bits.
131  // Also avoid creating IVs of non-native types. For example, we don't want a
132  // 64-bit IV in 32-bit code just because the loop has one 64-bit cast.
133  uint64_t Width = SE->getTypeSizeInBits(I->getType());
134  if (Width > 64 || (TD && !TD->isLegalInteger(Width)))
135  return false;
136 
137  // Get the symbolic expression for this instruction.
138  const SCEV *ISE = SE->getSCEV(I);
139 
140  // If we've come to an uninteresting expression, stop the traversal and
141  // call this a user.
142  if (!isInteresting(ISE, I, L, SE, LI))
143  return false;
144 
145  SmallPtrSet<Instruction *, 4> UniqueUsers;
146  for (Value::use_iterator UI = I->use_begin(), E = I->use_end();
147  UI != E; ++UI) {
148  Instruction *User = cast<Instruction>(*UI);
149  if (!UniqueUsers.insert(User))
150  continue;
151 
152  // Do not infinitely recurse on PHI nodes.
153  if (isa<PHINode>(User) && Processed.count(User))
154  continue;
155 
156  // Only consider IVUsers that are dominated by simplified loop
157  // headers. Otherwise, SCEVExpander will crash.
158  BasicBlock *UseBB = User->getParent();
159  // A phi's use is live out of its predecessor block.
160  if (PHINode *PHI = dyn_cast<PHINode>(User)) {
161  unsigned OperandNo = UI.getOperandNo();
162  unsigned ValNo = PHINode::getIncomingValueNumForOperand(OperandNo);
163  UseBB = PHI->getIncomingBlock(ValNo);
164  }
165  if (!isSimplifiedLoopNest(UseBB, DT, LI, SimpleLoopNests))
166  return false;
167 
168  // Descend recursively, but not into PHI nodes outside the current loop.
169  // It's important to see the entire expression outside the loop to get
170  // choices that depend on addressing mode use right, although we won't
171  // consider references outside the loop in all cases.
172  // If User is already in Processed, we don't want to recurse into it again,
173  // but do want to record a second reference in the same instruction.
174  bool AddUserToIVUsers = false;
175  if (LI->getLoopFor(User->getParent()) != L) {
176  if (isa<PHINode>(User) || Processed.count(User) ||
177  !AddUsersImpl(User, SimpleLoopNests)) {
178  DEBUG(dbgs() << "FOUND USER in other loop: " << *User << '\n'
179  << " OF SCEV: " << *ISE << '\n');
180  AddUserToIVUsers = true;
181  }
182  } else if (Processed.count(User) || !AddUsersImpl(User, SimpleLoopNests)) {
183  DEBUG(dbgs() << "FOUND USER: " << *User << '\n'
184  << " OF SCEV: " << *ISE << '\n');
185  AddUserToIVUsers = true;
186  }
187 
188  if (AddUserToIVUsers) {
189  // Okay, we found a user that we cannot reduce.
190  IVUses.push_back(new IVStrideUse(this, User, I));
191  IVStrideUse &NewUse = IVUses.back();
192  // Autodetect the post-inc loop set, populating NewUse.PostIncLoops.
193  // The regular return value here is discarded; instead of recording
194  // it, we just recompute it when we need it.
196  ISE, User, I,
197  NewUse.PostIncLoops,
198  *SE, *DT);
199  DEBUG(if (SE->getSCEV(I) != ISE)
200  dbgs() << " NORMALIZED TO: " << *ISE << '\n');
201  }
202  }
203  return true;
204 }
205 
207  // SCEVExpander can only handle users that are dominated by simplified loop
208  // entries. Keep track of all loops that are only dominated by other simple
209  // loops so we don't traverse the domtree for each user.
210  SmallPtrSet<Loop*,16> SimpleLoopNests;
211 
212  return AddUsersImpl(I, SimpleLoopNests);
213 }
214 
216  IVUses.push_back(new IVStrideUse(this, User, Operand));
217  return IVUses.back();
218 }
219 
221  : LoopPass(ID) {
223 }
224 
225 void IVUsers::getAnalysisUsage(AnalysisUsage &AU) const {
226  AU.addRequired<LoopInfo>();
229  AU.setPreservesAll();
230 }
231 
232 bool IVUsers::runOnLoop(Loop *l, LPPassManager &LPM) {
233 
234  L = l;
235  LI = &getAnalysis<LoopInfo>();
236  DT = &getAnalysis<DominatorTree>();
237  SE = &getAnalysis<ScalarEvolution>();
238  TD = getAnalysisIfAvailable<DataLayout>();
239 
240  // Find all uses of induction variables in this loop, and categorize
241  // them by stride. Start by finding all of the PHI nodes in the header for
242  // this loop. If they are induction variables, inspect their uses.
243  for (BasicBlock::iterator I = L->getHeader()->begin(); isa<PHINode>(I); ++I)
244  (void)AddUsersIfInteresting(I);
245 
246  return false;
247 }
248 
249 void IVUsers::print(raw_ostream &OS, const Module *M) const {
250  OS << "IV Users for loop ";
251  WriteAsOperand(OS, L->getHeader(), false);
252  if (SE->hasLoopInvariantBackedgeTakenCount(L)) {
253  OS << " with backedge-taken count "
254  << *SE->getBackedgeTakenCount(L);
255  }
256  OS << ":\n";
257 
258  for (ilist<IVStrideUse>::const_iterator UI = IVUses.begin(),
259  E = IVUses.end(); UI != E; ++UI) {
260  OS << " ";
261  WriteAsOperand(OS, UI->getOperandValToReplace(), false);
262  OS << " = " << *getReplacementExpr(*UI);
264  I = UI->PostIncLoops.begin(),
265  E = UI->PostIncLoops.end(); I != E; ++I) {
266  OS << " (post-inc with loop ";
267  WriteAsOperand(OS, (*I)->getHeader(), false);
268  OS << ")";
269  }
270  OS << " in ";
271  UI->getUser()->print(OS);
272  OS << '\n';
273  }
274 }
275 
276 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
277 void IVUsers::dump() const {
278  print(dbgs());
279 }
280 #endif
281 
282 void IVUsers::releaseMemory() {
283  Processed.clear();
284  IVUses.clear();
285 }
286 
287 /// getReplacementExpr - Return a SCEV expression which computes the
288 /// value of the OperandValToReplace.
290  return SE->getSCEV(IU.getOperandValToReplace());
291 }
292 
293 /// getExpr - Return the expression for the use.
294 const SCEV *IVUsers::getExpr(const IVStrideUse &IU) const {
295  return
297  IU.getUser(), IU.getOperandValToReplace(),
298  const_cast<PostIncLoopSet &>(IU.getPostIncLoops()),
299  *SE, *DT);
300 }
301 
302 static const SCEVAddRecExpr *findAddRecForLoop(const SCEV *S, const Loop *L) {
303  if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S)) {
304  if (AR->getLoop() == L)
305  return AR;
306  return findAddRecForLoop(AR->getStart(), L);
307  }
308 
309  if (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(S)) {
310  for (SCEVAddExpr::op_iterator I = Add->op_begin(), E = Add->op_end();
311  I != E; ++I)
312  if (const SCEVAddRecExpr *AR = findAddRecForLoop(*I, L))
313  return AR;
314  return 0;
315  }
316 
317  return 0;
318 }
319 
320 const SCEV *IVUsers::getStride(const IVStrideUse &IU, const Loop *L) const {
321  if (const SCEVAddRecExpr *AR = findAddRecForLoop(getExpr(IU), L))
322  return AR->getStepRecurrence(*SE);
323  return 0;
324 }
325 
327  PostIncLoops.insert(L);
328 }
329 
330 void IVStrideUse::deleted() {
331  // Remove this user from the list.
332  Parent->Processed.erase(this->getUser());
333  Parent->IVUses.erase(this);
334  // this now dangles!
335 }
use_iterator use_end()
Definition: Value.h:152
DomTreeNode * getNode(BasicBlock *BB) const
Definition: Dominators.h:844
const SCEV * getExpr(const IVStrideUse &IU) const
getExpr - Return the expression for the use.
Definition: IVUsers.cpp:294
friend class IVStrideUse
Definition: IVUsers.h:120
static PassRegistry * getPassRegistry()
const PostIncLoopSet & getPostIncLoops() const
Definition: IVUsers.h:67
const SCEV * TransformForPostIncUse(TransformKind Kind, const SCEV *S, Instruction *User, Value *OperandValToReplace, PostIncLoopSet &Loops, ScalarEvolution &SE, DominatorTree &DT)
The main container class for the LLVM Intermediate Representation.
Definition: Module.h:112
Pass * createIVUsersPass()
Definition: IVUsers.cpp:42
bool insert(PtrType Ptr)
Definition: SmallPtrSet.h:253
bool AddUsersImpl(Instruction *I, SmallPtrSet< Loop *, 16 > &SimpleLoopNests)
Definition: IVUsers.cpp:114
iv Induction Variable Users
Definition: IVUsers.cpp:39
BlockT * getHeader() const
Definition: LoopInfo.h:95
LoopInfoBase< BlockT, LoopT > * LI
Definition: LoopInfoImpl.h:411
bool AddUsersIfInteresting(Instruction *I)
Definition: IVUsers.cpp:206
DomTreeNodeBase< NodeT > * getIDom() const
Definition: Dominators.h:83
void WriteAsOperand(raw_ostream &, const Value *, bool PrintTy=true, const Module *Context=0)
Definition: AsmWriter.cpp:1179
void initializeIVUsersPass(PassRegistry &)
AnalysisUsage & addRequired()
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:167
const SCEV * getStride(const IVStrideUse &IU, const Loop *L) const
Definition: IVUsers.cpp:320
const SCEV *const * op_iterator
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:172
static bool isSimplifiedLoopNest(BasicBlock *BB, const DominatorTree *DT, const LoopInfo *LI, SmallPtrSet< Loop *, 16 > &SimpleLoopNests)
Definition: IVUsers.cpp:85
uint64_t getTypeSizeInBits(Type *Ty) const
ID
LLVM Calling Convention Representation.
Definition: CallingConv.h:26
bool isLoopSimplifyForm() const
Definition: LoopInfo.cpp:207
bool count(PtrType Ptr) const
count - Return true if the specified pointer is in the set.
Definition: SmallPtrSet.h:264
Instruction * getUser() const
getUser - Return the user instruction for this use.
Definition: IVUsers.h:44
Loop * getLoopFor(const BasicBlock *BB) const
Definition: LoopInfo.h:618
#define true
Definition: ConvertUTF.c:65
bool isSCEVable(Type *Ty) const
LLVM Basic Block Representation.
Definition: BasicBlock.h:72
Normalize - Normalize according to the given loops.
const SCEV * getReplacementExpr(const IVStrideUse &IU) const
Definition: IVUsers.cpp:289
const SCEV * getSCEVAtScope(const SCEV *S, const Loop *L)
bool contains(const LoopT *L) const
Definition: LoopInfo.h:104
static unsigned getIncomingValueNumForOperand(unsigned i)
static bool isInteresting(const SCEV *S, const Instruction *I, const Loop *L, ScalarEvolution *SE, LoopInfo *LI)
Definition: IVUsers.cpp:49
iv Induction Variable false
Definition: IVUsers.cpp:39
bool isSafeToSpeculativelyExecute(const Value *V, const DataLayout *TD=0)
SmallPtrSetIterator - This implements a const_iterator for SmallPtrSet.
Definition: SmallPtrSet.h:174
Value * getOperandValToReplace() const
Definition: IVUsers.h:55
Type * getType() const
Definition: Value.h:111
static char ID
Definition: IVUsers.h:139
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
Definition: Debug.cpp:101
void dump() const
dump - This method is used for debugging.
Definition: IVUsers.cpp:277
use_iterator use_begin()
Definition: Value.h:150
iv users
Definition: IVUsers.cpp:39
bool isLegalInteger(unsigned Width) const
Definition: DataLayout.h:210
#define I(x, y, z)
Definition: MD5.cpp:54
void transformToPostInc(const Loop *L)
Definition: IVUsers.cpp:326
INITIALIZE_PASS_BEGIN(IVUsers,"iv-users","Induction Variable Users", false, true) INITIALIZE_PASS_END(IVUsers
static const SCEVAddRecExpr * findAddRecForLoop(const SCEV *S, const Loop *L)
Definition: IVUsers.cpp:302
LLVM Value Representation.
Definition: Value.h:66
const SCEV * getSCEV(Value *V)
void print(raw_ostream &OS, const Module *=0) const
Definition: IVUsers.cpp:249
#define DEBUG(X)
Definition: Debug.h:97
IVStrideUse & AddUser(Instruction *User, Value *Operand)
Definition: IVUsers.cpp:215
const BasicBlock * getParent() const
Definition: Instruction.h:52