blob: 3148acaac4e67e85f71213cb637698a614d2c804 [file] [log] [blame]
Chris Lattner10f2d132009-11-11 00:22:30 +00001//===- LazyValueInfo.cpp - Value constraint analysis ----------------------===//
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 defines the interface for lazy computation of value constraint
11// information.
12//
13//===----------------------------------------------------------------------===//
14
Chris Lattnerb8c124c2009-11-12 01:22:16 +000015#define DEBUG_TYPE "lazy-value-info"
Chris Lattner10f2d132009-11-11 00:22:30 +000016#include "llvm/Analysis/LazyValueInfo.h"
Chris Lattnercc4d3b22009-11-11 02:08:33 +000017#include "llvm/Constants.h"
18#include "llvm/Instructions.h"
19#include "llvm/Analysis/ConstantFolding.h"
20#include "llvm/Target/TargetData.h"
Chris Lattner16976522009-11-11 22:48:44 +000021#include "llvm/Support/CFG.h"
Chris Lattnerb8c124c2009-11-12 01:22:16 +000022#include "llvm/Support/Debug.h"
Chris Lattner16976522009-11-11 22:48:44 +000023#include "llvm/Support/raw_ostream.h"
24#include "llvm/ADT/DenseMap.h"
Chris Lattnercc4d3b22009-11-11 02:08:33 +000025#include "llvm/ADT/PointerIntPair.h"
Chris Lattnere5642812009-11-15 20:00:52 +000026#include "llvm/ADT/STLExtras.h"
Chris Lattner10f2d132009-11-11 00:22:30 +000027using namespace llvm;
28
29char LazyValueInfo::ID = 0;
30static RegisterPass<LazyValueInfo>
31X("lazy-value-info", "Lazy Value Information Analysis", false, true);
32
33namespace llvm {
34 FunctionPass *createLazyValueInfoPass() { return new LazyValueInfo(); }
35}
36
Chris Lattnercc4d3b22009-11-11 02:08:33 +000037
38//===----------------------------------------------------------------------===//
39// LVILatticeVal
40//===----------------------------------------------------------------------===//
41
42/// LVILatticeVal - This is the information tracked by LazyValueInfo for each
43/// value.
44///
45/// FIXME: This is basically just for bringup, this can be made a lot more rich
46/// in the future.
47///
48namespace {
49class LVILatticeVal {
50 enum LatticeValueTy {
51 /// undefined - This LLVM Value has no known value yet.
52 undefined,
53 /// constant - This LLVM Value has a specific constant value.
54 constant,
Chris Lattnerb52675b2009-11-12 04:36:58 +000055
56 /// notconstant - This LLVM value is known to not have the specified value.
57 notconstant,
58
Chris Lattnercc4d3b22009-11-11 02:08:33 +000059 /// overdefined - This instruction is not known to be constant, and we know
60 /// it has a value.
61 overdefined
62 };
63
64 /// Val: This stores the current lattice value along with the Constant* for
Chris Lattnerb52675b2009-11-12 04:36:58 +000065 /// the constant if this is a 'constant' or 'notconstant' value.
Chris Lattnercc4d3b22009-11-11 02:08:33 +000066 PointerIntPair<Constant *, 2, LatticeValueTy> Val;
67
68public:
69 LVILatticeVal() : Val(0, undefined) {}
70
Chris Lattner16976522009-11-11 22:48:44 +000071 static LVILatticeVal get(Constant *C) {
72 LVILatticeVal Res;
73 Res.markConstant(C);
74 return Res;
75 }
Chris Lattnerb52675b2009-11-12 04:36:58 +000076 static LVILatticeVal getNot(Constant *C) {
77 LVILatticeVal Res;
78 Res.markNotConstant(C);
79 return Res;
80 }
Chris Lattner16976522009-11-11 22:48:44 +000081
Chris Lattnercc4d3b22009-11-11 02:08:33 +000082 bool isUndefined() const { return Val.getInt() == undefined; }
83 bool isConstant() const { return Val.getInt() == constant; }
Chris Lattnerb52675b2009-11-12 04:36:58 +000084 bool isNotConstant() const { return Val.getInt() == notconstant; }
Chris Lattnercc4d3b22009-11-11 02:08:33 +000085 bool isOverdefined() const { return Val.getInt() == overdefined; }
86
87 Constant *getConstant() const {
88 assert(isConstant() && "Cannot get the constant of a non-constant!");
89 return Val.getPointer();
90 }
91
Chris Lattnerb52675b2009-11-12 04:36:58 +000092 Constant *getNotConstant() const {
93 assert(isNotConstant() && "Cannot get the constant of a non-notconstant!");
94 return Val.getPointer();
Chris Lattnercc4d3b22009-11-11 02:08:33 +000095 }
96
97 /// markOverdefined - Return true if this is a change in status.
98 bool markOverdefined() {
99 if (isOverdefined())
100 return false;
101 Val.setInt(overdefined);
102 return true;
103 }
104
105 /// markConstant - Return true if this is a change in status.
106 bool markConstant(Constant *V) {
107 if (isConstant()) {
108 assert(getConstant() == V && "Marking constant with different value");
109 return false;
110 }
111
112 assert(isUndefined());
113 Val.setInt(constant);
114 assert(V && "Marking constant with NULL");
115 Val.setPointer(V);
Chris Lattner16976522009-11-11 22:48:44 +0000116 return true;
117 }
118
Chris Lattnerb52675b2009-11-12 04:36:58 +0000119 /// markNotConstant - Return true if this is a change in status.
120 bool markNotConstant(Constant *V) {
121 if (isNotConstant()) {
122 assert(getNotConstant() == V && "Marking !constant with different value");
123 return false;
124 }
125
126 if (isConstant())
127 assert(getConstant() != V && "Marking not constant with different value");
128 else
129 assert(isUndefined());
130
131 Val.setInt(notconstant);
132 assert(V && "Marking constant with NULL");
133 Val.setPointer(V);
134 return true;
135 }
136
Chris Lattner16976522009-11-11 22:48:44 +0000137 /// mergeIn - Merge the specified lattice value into this one, updating this
138 /// one and returning true if anything changed.
139 bool mergeIn(const LVILatticeVal &RHS) {
140 if (RHS.isUndefined() || isOverdefined()) return false;
141 if (RHS.isOverdefined()) return markOverdefined();
142
Chris Lattnerb52675b2009-11-12 04:36:58 +0000143 if (RHS.isNotConstant()) {
144 if (isNotConstant()) {
Chris Lattnerf496e792009-11-12 04:57:13 +0000145 if (getNotConstant() != RHS.getNotConstant() ||
146 isa<ConstantExpr>(getNotConstant()) ||
147 isa<ConstantExpr>(RHS.getNotConstant()))
Chris Lattnerb52675b2009-11-12 04:36:58 +0000148 return markOverdefined();
149 return false;
150 }
Chris Lattnerf496e792009-11-12 04:57:13 +0000151 if (isConstant()) {
152 if (getConstant() == RHS.getNotConstant() ||
153 isa<ConstantExpr>(RHS.getNotConstant()) ||
154 isa<ConstantExpr>(getConstant()))
155 return markOverdefined();
156 return markNotConstant(RHS.getNotConstant());
157 }
158
159 assert(isUndefined() && "Unexpected lattice");
Chris Lattnerb52675b2009-11-12 04:36:58 +0000160 return markNotConstant(RHS.getNotConstant());
161 }
162
Chris Lattnerf496e792009-11-12 04:57:13 +0000163 // RHS must be a constant, we must be undef, constant, or notconstant.
164 if (isUndefined())
165 return markConstant(RHS.getConstant());
166
167 if (isConstant()) {
168 if (getConstant() != RHS.getConstant())
169 return markOverdefined();
170 return false;
171 }
172
173 // If we are known "!=4" and RHS is "==5", stay at "!=4".
174 if (getNotConstant() == RHS.getConstant() ||
175 isa<ConstantExpr>(getNotConstant()) ||
176 isa<ConstantExpr>(RHS.getConstant()))
Chris Lattner16976522009-11-11 22:48:44 +0000177 return markOverdefined();
Chris Lattnerf496e792009-11-12 04:57:13 +0000178 return false;
Chris Lattnercc4d3b22009-11-11 02:08:33 +0000179 }
180
181};
182
183} // end anonymous namespace.
184
Chris Lattner16976522009-11-11 22:48:44 +0000185namespace llvm {
186raw_ostream &operator<<(raw_ostream &OS, const LVILatticeVal &Val) {
187 if (Val.isUndefined())
188 return OS << "undefined";
189 if (Val.isOverdefined())
190 return OS << "overdefined";
Chris Lattnerb52675b2009-11-12 04:36:58 +0000191
192 if (Val.isNotConstant())
193 return OS << "notconstant<" << *Val.getNotConstant() << '>';
Chris Lattner16976522009-11-11 22:48:44 +0000194 return OS << "constant<" << *Val.getConstant() << '>';
195}
196}
Chris Lattnercc4d3b22009-11-11 02:08:33 +0000197
198//===----------------------------------------------------------------------===//
Chris Lattner2c5adf82009-11-15 19:59:49 +0000199// LazyValueInfoCache Decl
Chris Lattnercc4d3b22009-11-11 02:08:33 +0000200//===----------------------------------------------------------------------===//
201
Chris Lattner2c5adf82009-11-15 19:59:49 +0000202namespace {
203 /// LazyValueInfoCache - This is the cache kept by LazyValueInfo which
204 /// maintains information about queries across the clients' queries.
205 class LazyValueInfoCache {
206 public:
207 /// BlockCacheEntryTy - This is a computed lattice value at the end of the
208 /// specified basic block for a Value* that depends on context.
209 typedef std::pair<BasicBlock*, LVILatticeVal> BlockCacheEntryTy;
210
211 /// ValueCacheEntryTy - This is all of the cached block information for
212 /// exactly one Value*. The entries are sorted by the BasicBlock* of the
213 /// entries, allowing us to do a lookup with a binary search.
214 typedef std::vector<BlockCacheEntryTy> ValueCacheEntryTy;
215
216 private:
217 /// ValueCache - This is all of the cached information for all values,
218 /// mapped from Value* to key information.
219 DenseMap<Value*, ValueCacheEntryTy> ValueCache;
220 public:
221
222 /// getValueInBlock - This is the query interface to determine the lattice
223 /// value for the specified Value* at the end of the specified block.
224 LVILatticeVal getValueInBlock(Value *V, BasicBlock *BB);
225
226 /// getValueOnEdge - This is the query interface to determine the lattice
227 /// value for the specified Value* that is true on the specified edge.
228 LVILatticeVal getValueOnEdge(Value *V, BasicBlock *FromBB,BasicBlock *ToBB);
229 };
230} // end anonymous namespace
231
Chris Lattnere5642812009-11-15 20:00:52 +0000232namespace {
233 struct BlockCacheEntryComparator {
234 static int Compare(const void *LHSv, const void *RHSv) {
235 const LazyValueInfoCache::BlockCacheEntryTy *LHS =
236 static_cast<const LazyValueInfoCache::BlockCacheEntryTy *>(LHSv);
237 const LazyValueInfoCache::BlockCacheEntryTy *RHS =
238 static_cast<const LazyValueInfoCache::BlockCacheEntryTy *>(RHSv);
239 if (LHS->first < RHS->first)
240 return -1;
241 if (LHS->first > RHS->first)
242 return 1;
243 return 0;
244 }
245
246 bool operator()(const LazyValueInfoCache::BlockCacheEntryTy &LHS,
247 const LazyValueInfoCache::BlockCacheEntryTy &RHS) const {
248 return LHS.first < RHS.first;
249 }
250 };
251}
252
Chris Lattner2c5adf82009-11-15 19:59:49 +0000253//===----------------------------------------------------------------------===//
254// LVIQuery Impl
255//===----------------------------------------------------------------------===//
256
257namespace {
258 /// LVIQuery - This is a transient object that exists while a query is
259 /// being performed.
Chris Lattnere5642812009-11-15 20:00:52 +0000260 ///
261 /// TODO: Reuse LVIQuery instead of recreating it for every query, this avoids
262 /// reallocation of the densemap on every query.
Chris Lattner2c5adf82009-11-15 19:59:49 +0000263 class LVIQuery {
264 typedef LazyValueInfoCache::BlockCacheEntryTy BlockCacheEntryTy;
265 typedef LazyValueInfoCache::ValueCacheEntryTy ValueCacheEntryTy;
266
Chris Lattnere5642812009-11-15 20:00:52 +0000267 /// This is the current value being queried for.
Chris Lattner2c5adf82009-11-15 19:59:49 +0000268 Value *Val;
269
270 /// This is all of the cached information about this value.
271 ValueCacheEntryTy &Cache;
272
Chris Lattnere5642812009-11-15 20:00:52 +0000273 /// NewBlocks - This is a mpping of the new BasicBlocks which have been
274 /// added to cache but that are not in sorted order.
275 DenseMap<BasicBlock*, LVILatticeVal> NewBlockInfo;
Chris Lattner2c5adf82009-11-15 19:59:49 +0000276 public:
277
278 LVIQuery(Value *V, ValueCacheEntryTy &VC) : Val(V), Cache(VC) {
279 }
280
Chris Lattnere5642812009-11-15 20:00:52 +0000281 ~LVIQuery() {
282 // When the query is done, insert the newly discovered facts into the
283 // cache in sorted order.
284 if (NewBlockInfo.empty()) return;
285
286 // Grow the cache to exactly fit the new data.
287 Cache.reserve(Cache.size() + NewBlockInfo.size());
288
289 // If we only have one new entry, insert it instead of doing a full-on
290 // sort.
291 if (NewBlockInfo.size() == 1) {
292 BlockCacheEntryTy Entry = *NewBlockInfo.begin();
293 ValueCacheEntryTy::iterator I =
294 std::lower_bound(Cache.begin(), Cache.end(), Entry,
295 BlockCacheEntryComparator());
296 assert((I == Cache.end() || I->first != Entry.first) &&
297 "Entry already in map!");
298
299 Cache.insert(I, Entry);
300 return;
301 }
302
303 // TODO: If we only have two new elements, INSERT them both.
304
305 Cache.insert(Cache.end(), NewBlockInfo.begin(), NewBlockInfo.end());
306 array_pod_sort(Cache.begin(), Cache.end(),
307 BlockCacheEntryComparator::Compare);
308
309 }
310
Chris Lattner2c5adf82009-11-15 19:59:49 +0000311 LVILatticeVal getBlockValue(BasicBlock *BB);
Chris Lattner2c5adf82009-11-15 19:59:49 +0000312 LVILatticeVal getEdgeValue(BasicBlock *FromBB, BasicBlock *ToBB);
Chris Lattnere5642812009-11-15 20:00:52 +0000313
314 private:
315 LVILatticeVal &getCachedEntryForBlock(BasicBlock *BB);
Chris Lattner2c5adf82009-11-15 19:59:49 +0000316 };
317} // end anonymous namespace
318
Chris Lattnere5642812009-11-15 20:00:52 +0000319/// getCachedEntryForBlock - See if we already have a value for this block. If
320/// so, return it, otherwise create a new entry in the NewBlockInfo map to use.
321LVILatticeVal &LVIQuery::getCachedEntryForBlock(BasicBlock *BB) {
322
323 // Do a binary search to see if we already have an entry for this block in
324 // the cache set. If so, find it.
325 if (!Cache.empty()) {
326 ValueCacheEntryTy::iterator Entry =
327 std::lower_bound(Cache.begin(), Cache.end(),
328 BlockCacheEntryTy(BB, LVILatticeVal()),
329 BlockCacheEntryComparator());
330 if (Entry != Cache.end() && Entry->first == BB)
331 return Entry->second;
332 }
333
334 // Otherwise, check to see if it's in NewBlockInfo or create a new entry if
335 // not.
336 return NewBlockInfo[BB];
337}
Chris Lattner2c5adf82009-11-15 19:59:49 +0000338
339LVILatticeVal LVIQuery::getBlockValue(BasicBlock *BB) {
340 // See if we already have a value for this block.
Chris Lattnere5642812009-11-15 20:00:52 +0000341 LVILatticeVal &BBLV = getCachedEntryForBlock(BB);
Chris Lattner2c5adf82009-11-15 19:59:49 +0000342
343 // If we've already computed this block's value, return it.
Chris Lattnere5642812009-11-15 20:00:52 +0000344 if (!BBLV.isUndefined()) {
345 DEBUG(errs() << " reuse BB '" << BB->getName() << "' val=" << BBLV <<'\n');
Chris Lattner2c5adf82009-11-15 19:59:49 +0000346 return BBLV;
Chris Lattnere5642812009-11-15 20:00:52 +0000347 }
348
Chris Lattner2c5adf82009-11-15 19:59:49 +0000349 // Otherwise, this is the first time we're seeing this block. Reset the
350 // lattice value to overdefined, so that cycles will terminate and be
351 // conservatively correct.
352 BBLV.markOverdefined();
353
354 // If V is live into BB, see if our predecessors know anything about it.
355 Instruction *BBI = dyn_cast<Instruction>(Val);
356 if (BBI == 0 || BBI->getParent() != BB) {
357 LVILatticeVal Result; // Start Undefined.
358 unsigned NumPreds = 0;
359
360 // Loop over all of our predecessors, merging what we know from them into
361 // result.
362 for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
363 Result.mergeIn(getEdgeValue(*PI, BB));
364
365 // If we hit overdefined, exit early. The BlockVals entry is already set
366 // to overdefined.
Chris Lattnere5642812009-11-15 20:00:52 +0000367 if (Result.isOverdefined()) {
368 DEBUG(errs() << " compute BB '" << BB->getName()
369 << "' - overdefined because of pred.\n");
Chris Lattner2c5adf82009-11-15 19:59:49 +0000370 return Result;
Chris Lattnere5642812009-11-15 20:00:52 +0000371 }
Chris Lattner2c5adf82009-11-15 19:59:49 +0000372 ++NumPreds;
373 }
374
375 // If this is the entry block, we must be asking about an argument. The
376 // value is overdefined.
377 if (NumPreds == 0 && BB == &BB->getParent()->front()) {
378 assert(isa<Argument>(Val) && "Unknown live-in to the entry block");
379 Result.markOverdefined();
380 return Result;
381 }
382
383 // Return the merged value, which is more precise than 'overdefined'.
384 assert(!Result.isOverdefined());
Chris Lattnere5642812009-11-15 20:00:52 +0000385 return getCachedEntryForBlock(BB) = Result;
Chris Lattner2c5adf82009-11-15 19:59:49 +0000386 }
387
388 // If this value is defined by an instruction in this block, we have to
389 // process it here somehow or return overdefined.
390 if (PHINode *PN = dyn_cast<PHINode>(BBI)) {
391 (void)PN;
392 // TODO: PHI Translation in preds.
393 } else {
394
395 }
396
Chris Lattnere5642812009-11-15 20:00:52 +0000397 DEBUG(errs() << " compute BB '" << BB->getName()
398 << "' - overdefined because inst def found.\n");
399
Chris Lattner2c5adf82009-11-15 19:59:49 +0000400 LVILatticeVal Result;
401 Result.markOverdefined();
Chris Lattnere5642812009-11-15 20:00:52 +0000402 return getCachedEntryForBlock(BB) = Result;
Chris Lattner10f2d132009-11-11 00:22:30 +0000403}
404
Chris Lattnercc4d3b22009-11-11 02:08:33 +0000405
Chris Lattner2c5adf82009-11-15 19:59:49 +0000406/// getEdgeValue - This method
407LVILatticeVal LVIQuery::getEdgeValue(BasicBlock *BBFrom, BasicBlock *BBTo) {
Chris Lattner16976522009-11-11 22:48:44 +0000408 if (BranchInst *BI = dyn_cast<BranchInst>(BBFrom->getTerminator())) {
409 // If this is a conditional branch and only one successor goes to BBTo, then
410 // we maybe able to infer something from the condition.
411 if (BI->isConditional() &&
412 BI->getSuccessor(0) != BI->getSuccessor(1)) {
413 bool isTrueDest = BI->getSuccessor(0) == BBTo;
414 assert(BI->getSuccessor(!isTrueDest) == BBTo &&
415 "BBTo isn't a successor of BBFrom");
416
417 // If V is the condition of the branch itself, then we know exactly what
418 // it is.
Chris Lattner2c5adf82009-11-15 19:59:49 +0000419 if (BI->getCondition() == Val)
Chris Lattner16976522009-11-11 22:48:44 +0000420 return LVILatticeVal::get(ConstantInt::get(
Chris Lattner2c5adf82009-11-15 19:59:49 +0000421 Type::getInt1Ty(Val->getContext()), isTrueDest));
Chris Lattner16976522009-11-11 22:48:44 +0000422
423 // If the condition of the branch is an equality comparison, we may be
424 // able to infer the value.
425 if (ICmpInst *ICI = dyn_cast<ICmpInst>(BI->getCondition()))
Chris Lattner2c5adf82009-11-15 19:59:49 +0000426 if (ICI->isEquality() && ICI->getOperand(0) == Val &&
Chris Lattner16976522009-11-11 22:48:44 +0000427 isa<Constant>(ICI->getOperand(1))) {
428 // We know that V has the RHS constant if this is a true SETEQ or
429 // false SETNE.
430 if (isTrueDest == (ICI->getPredicate() == ICmpInst::ICMP_EQ))
431 return LVILatticeVal::get(cast<Constant>(ICI->getOperand(1)));
Chris Lattnerb52675b2009-11-12 04:36:58 +0000432 return LVILatticeVal::getNot(cast<Constant>(ICI->getOperand(1)));
Chris Lattner16976522009-11-11 22:48:44 +0000433 }
434 }
435 }
436
437 // TODO: Info from switch.
438
Chris Lattner2c5adf82009-11-15 19:59:49 +0000439 // TODO: Handle more complex conditionals. If (v == 0 || v2 < 1) is false, we
440 // know that v != 0.
Chris Lattner16976522009-11-11 22:48:44 +0000441
442 // Otherwise see if the value is known in the block.
Chris Lattner2c5adf82009-11-15 19:59:49 +0000443 return getBlockValue(BBFrom);
Chris Lattner16976522009-11-11 22:48:44 +0000444}
445
446
Chris Lattner2c5adf82009-11-15 19:59:49 +0000447//===----------------------------------------------------------------------===//
448// LazyValueInfoCache Impl
449//===----------------------------------------------------------------------===//
450
451LVILatticeVal LazyValueInfoCache::getValueInBlock(Value *V, BasicBlock *BB) {
452 // If already a constant, there is nothing to compute.
Chris Lattner16976522009-11-11 22:48:44 +0000453 if (Constant *VC = dyn_cast<Constant>(V))
Chris Lattner2c5adf82009-11-15 19:59:49 +0000454 return LVILatticeVal::get(VC);
Chris Lattner16976522009-11-11 22:48:44 +0000455
Chris Lattnere5642812009-11-15 20:00:52 +0000456 DEBUG(errs() << "LVI Getting block end value " << *V << " at '"
Chris Lattner2c5adf82009-11-15 19:59:49 +0000457 << BB->getName() << "'\n");
458
459 LVILatticeVal Result = LVIQuery(V, ValueCache[V]).getBlockValue(BB);
Chris Lattner16976522009-11-11 22:48:44 +0000460
Chris Lattnerb8c124c2009-11-12 01:22:16 +0000461 DEBUG(errs() << " Result = " << Result << "\n");
Chris Lattner2c5adf82009-11-15 19:59:49 +0000462 return Result;
463}
Chris Lattner16976522009-11-11 22:48:44 +0000464
Chris Lattner2c5adf82009-11-15 19:59:49 +0000465LVILatticeVal LazyValueInfoCache::
466getValueOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB) {
467 // If already a constant, there is nothing to compute.
468 if (Constant *VC = dyn_cast<Constant>(V))
469 return LVILatticeVal::get(VC);
470
Chris Lattnere5642812009-11-15 20:00:52 +0000471 DEBUG(errs() << "LVI Getting edge value " << *V << " from '"
Chris Lattner2c5adf82009-11-15 19:59:49 +0000472 << FromBB->getName() << "' to '" << ToBB->getName() << "'\n");
473 LVILatticeVal Result =
474 LVIQuery(V, ValueCache[V]).getEdgeValue(FromBB, ToBB);
475
476 DEBUG(errs() << " Result = " << Result << "\n");
477
478 return Result;
479}
480
481//===----------------------------------------------------------------------===//
482// LazyValueInfo Impl
483//===----------------------------------------------------------------------===//
484
485bool LazyValueInfo::runOnFunction(Function &F) {
486 TD = getAnalysisIfAvailable<TargetData>();
487 // Fully lazy.
488 return false;
489}
490
491/// getCache - This lazily constructs the LazyValueInfoCache.
492static LazyValueInfoCache &getCache(void *&PImpl) {
493 if (!PImpl)
494 PImpl = new LazyValueInfoCache();
495 return *static_cast<LazyValueInfoCache*>(PImpl);
496}
497
498void LazyValueInfo::releaseMemory() {
499 // If the cache was allocated, free it.
500 if (PImpl) {
501 delete &getCache(PImpl);
502 PImpl = 0;
503 }
504}
505
506Constant *LazyValueInfo::getConstant(Value *V, BasicBlock *BB) {
507 LVILatticeVal Result = getCache(PImpl).getValueInBlock(V, BB);
508
Chris Lattner16976522009-11-11 22:48:44 +0000509 if (Result.isConstant())
510 return Result.getConstant();
511 return 0;
512}
Chris Lattnercc4d3b22009-11-11 02:08:33 +0000513
Chris Lattner38392bb2009-11-12 01:29:10 +0000514/// getConstantOnEdge - Determine whether the specified value is known to be a
515/// constant on the specified edge. Return null if not.
516Constant *LazyValueInfo::getConstantOnEdge(Value *V, BasicBlock *FromBB,
517 BasicBlock *ToBB) {
Chris Lattner2c5adf82009-11-15 19:59:49 +0000518 LVILatticeVal Result = getCache(PImpl).getValueOnEdge(V, FromBB, ToBB);
Chris Lattner38392bb2009-11-12 01:29:10 +0000519
520 if (Result.isConstant())
521 return Result.getConstant();
522 return 0;
523}
524
Chris Lattnerb52675b2009-11-12 04:36:58 +0000525/// getPredicateOnEdge - Determine whether the specified value comparison
526/// with a constant is known to be true or false on the specified CFG edge.
527/// Pred is a CmpInst predicate.
Chris Lattnercc4d3b22009-11-11 02:08:33 +0000528LazyValueInfo::Tristate
Chris Lattnerb52675b2009-11-12 04:36:58 +0000529LazyValueInfo::getPredicateOnEdge(unsigned Pred, Value *V, Constant *C,
530 BasicBlock *FromBB, BasicBlock *ToBB) {
Chris Lattner2c5adf82009-11-15 19:59:49 +0000531 LVILatticeVal Result = getCache(PImpl).getValueOnEdge(V, FromBB, ToBB);
Chris Lattnercc4d3b22009-11-11 02:08:33 +0000532
Chris Lattnerb52675b2009-11-12 04:36:58 +0000533 // If we know the value is a constant, evaluate the conditional.
534 Constant *Res = 0;
535 if (Result.isConstant()) {
536 Res = ConstantFoldCompareInstOperands(Pred, Result.getConstant(), C, TD);
537 if (ConstantInt *ResCI = dyn_cast_or_null<ConstantInt>(Res))
538 return ResCI->isZero() ? False : True;
Chris Lattner2c5adf82009-11-15 19:59:49 +0000539 return Unknown;
540 }
541
542 if (Result.isNotConstant()) {
Chris Lattnerb52675b2009-11-12 04:36:58 +0000543 // If this is an equality comparison, we can try to fold it knowing that
544 // "V != C1".
545 if (Pred == ICmpInst::ICMP_EQ) {
546 // !C1 == C -> false iff C1 == C.
547 Res = ConstantFoldCompareInstOperands(ICmpInst::ICMP_NE,
548 Result.getNotConstant(), C, TD);
549 if (Res->isNullValue())
550 return False;
551 } else if (Pred == ICmpInst::ICMP_NE) {
552 // !C1 != C -> true iff C1 == C.
Chris Lattner5553a3a2009-11-15 20:01:24 +0000553 Res = ConstantFoldCompareInstOperands(ICmpInst::ICMP_NE,
Chris Lattnerb52675b2009-11-12 04:36:58 +0000554 Result.getNotConstant(), C, TD);
555 if (Res->isNullValue())
556 return True;
557 }
Chris Lattner2c5adf82009-11-15 19:59:49 +0000558 return Unknown;
Chris Lattnerb52675b2009-11-12 04:36:58 +0000559 }
560
Chris Lattnercc4d3b22009-11-11 02:08:33 +0000561 return Unknown;
562}
563
Chris Lattnercc4d3b22009-11-11 02:08:33 +0000564