1 //===- 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 15 #include "llvm/Analysis/LazyValueInfo.h" 16 #include "llvm/ADT/DenseSet.h" 17 #include "llvm/ADT/STLExtras.h" 18 #include "llvm/Analysis/AssumptionTracker.h" 19 #include "llvm/Analysis/ConstantFolding.h" 20 #include "llvm/Analysis/ValueTracking.h" 21 #include "llvm/IR/CFG.h" 22 #include "llvm/IR/ConstantRange.h" 23 #include "llvm/IR/Constants.h" 24 #include "llvm/IR/DataLayout.h" 25 #include "llvm/IR/Dominators.h" 26 #include "llvm/IR/Instructions.h" 27 #include "llvm/IR/IntrinsicInst.h" 28 #include "llvm/IR/PatternMatch.h" 29 #include "llvm/IR/ValueHandle.h" 30 #include "llvm/Support/CommandLine.h" 31 #include "llvm/Support/Debug.h" 32 #include "llvm/Support/raw_ostream.h" 33 #include "llvm/Target/TargetLibraryInfo.h" 34 #include <map> 35 #include <stack> 36 using namespace llvm; 37 using namespace PatternMatch; 38 39 #define DEBUG_TYPE "lazy-value-info" 40 41 // Experimentally derived threshold for the number of basic blocks lowered for 42 // lattice value overdefined. 43 static cl::opt<unsigned> 44 OverdefinedBBThreshold("lvi-overdefined-BB-threshold", 45 cl::init(1500), cl::Hidden, 46 cl::desc("Threshold of the number of basic blocks lowered for lattice value" 47 "'overdefined'.")); 48 49 // Experimentally derived threshold for additional lowering lattice values 50 // overdefined per block. 51 static cl::opt<unsigned> 52 OverdefinedThreshold("lvi-overdefined-threshold", cl::init(10), cl::Hidden, 53 cl::desc("Threshold of lowering lattice value 'overdefined'.")); 54 55 char LazyValueInfo::ID = 0; 56 INITIALIZE_PASS_BEGIN(LazyValueInfo, "lazy-value-info", 57 "Lazy Value Information Analysis", false, true) 58 INITIALIZE_PASS_DEPENDENCY(AssumptionTracker) 59 INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo) 60 INITIALIZE_PASS_END(LazyValueInfo, "lazy-value-info", 61 "Lazy Value Information Analysis", false, true) 62 63 namespace llvm { 64 FunctionPass *createLazyValueInfoPass() { return new LazyValueInfo(); } 65 } 66 67 68 //===----------------------------------------------------------------------===// 69 // LVILatticeVal 70 //===----------------------------------------------------------------------===// 71 72 /// LVILatticeVal - This is the information tracked by LazyValueInfo for each 73 /// value. 74 /// 75 /// FIXME: This is basically just for bringup, this can be made a lot more rich 76 /// in the future. 77 /// 78 namespace { 79 class LVILatticeVal { 80 enum LatticeValueTy { 81 /// undefined - This Value has no known value yet. 82 undefined, 83 84 /// constant - This Value has a specific constant value. 85 constant, 86 /// notconstant - This Value is known to not have the specified value. 87 notconstant, 88 89 /// constantrange - The Value falls within this range. 90 constantrange, 91 92 /// overdefined - This value is not known to be constant, and we know that 93 /// it has a value. 94 overdefined 95 }; 96 97 /// Val: This stores the current lattice value along with the Constant* for 98 /// the constant if this is a 'constant' or 'notconstant' value. 99 LatticeValueTy Tag; 100 Constant *Val; 101 ConstantRange Range; 102 103 public: 104 LVILatticeVal() : Tag(undefined), Val(nullptr), Range(1, true) {} 105 106 static LVILatticeVal get(Constant *C) { 107 LVILatticeVal Res; 108 if (!isa<UndefValue>(C)) 109 Res.markConstant(C); 110 return Res; 111 } 112 static LVILatticeVal getNot(Constant *C) { 113 LVILatticeVal Res; 114 if (!isa<UndefValue>(C)) 115 Res.markNotConstant(C); 116 return Res; 117 } 118 static LVILatticeVal getRange(ConstantRange CR) { 119 LVILatticeVal Res; 120 Res.markConstantRange(CR); 121 return Res; 122 } 123 124 bool isUndefined() const { return Tag == undefined; } 125 bool isConstant() const { return Tag == constant; } 126 bool isNotConstant() const { return Tag == notconstant; } 127 bool isConstantRange() const { return Tag == constantrange; } 128 bool isOverdefined() const { return Tag == overdefined; } 129 130 Constant *getConstant() const { 131 assert(isConstant() && "Cannot get the constant of a non-constant!"); 132 return Val; 133 } 134 135 Constant *getNotConstant() const { 136 assert(isNotConstant() && "Cannot get the constant of a non-notconstant!"); 137 return Val; 138 } 139 140 ConstantRange getConstantRange() const { 141 assert(isConstantRange() && 142 "Cannot get the constant-range of a non-constant-range!"); 143 return Range; 144 } 145 146 /// markOverdefined - Return true if this is a change in status. 147 bool markOverdefined() { 148 if (isOverdefined()) 149 return false; 150 Tag = overdefined; 151 return true; 152 } 153 154 /// markConstant - Return true if this is a change in status. 155 bool markConstant(Constant *V) { 156 assert(V && "Marking constant with NULL"); 157 if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) 158 return markConstantRange(ConstantRange(CI->getValue())); 159 if (isa<UndefValue>(V)) 160 return false; 161 162 assert((!isConstant() || getConstant() == V) && 163 "Marking constant with different value"); 164 assert(isUndefined()); 165 Tag = constant; 166 Val = V; 167 return true; 168 } 169 170 /// markNotConstant - Return true if this is a change in status. 171 bool markNotConstant(Constant *V) { 172 assert(V && "Marking constant with NULL"); 173 if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) 174 return markConstantRange(ConstantRange(CI->getValue()+1, CI->getValue())); 175 if (isa<UndefValue>(V)) 176 return false; 177 178 assert((!isConstant() || getConstant() != V) && 179 "Marking constant !constant with same value"); 180 assert((!isNotConstant() || getNotConstant() == V) && 181 "Marking !constant with different value"); 182 assert(isUndefined() || isConstant()); 183 Tag = notconstant; 184 Val = V; 185 return true; 186 } 187 188 /// markConstantRange - Return true if this is a change in status. 189 bool markConstantRange(const ConstantRange NewR) { 190 if (isConstantRange()) { 191 if (NewR.isEmptySet()) 192 return markOverdefined(); 193 194 bool changed = Range != NewR; 195 Range = NewR; 196 return changed; 197 } 198 199 assert(isUndefined()); 200 if (NewR.isEmptySet()) 201 return markOverdefined(); 202 203 Tag = constantrange; 204 Range = NewR; 205 return true; 206 } 207 208 /// mergeIn - Merge the specified lattice value into this one, updating this 209 /// one and returning true if anything changed. 210 bool mergeIn(const LVILatticeVal &RHS) { 211 if (RHS.isUndefined() || isOverdefined()) return false; 212 if (RHS.isOverdefined()) return markOverdefined(); 213 214 if (isUndefined()) { 215 Tag = RHS.Tag; 216 Val = RHS.Val; 217 Range = RHS.Range; 218 return true; 219 } 220 221 if (isConstant()) { 222 if (RHS.isConstant()) { 223 if (Val == RHS.Val) 224 return false; 225 return markOverdefined(); 226 } 227 228 if (RHS.isNotConstant()) { 229 if (Val == RHS.Val) 230 return markOverdefined(); 231 232 // Unless we can prove that the two Constants are different, we must 233 // move to overdefined. 234 // FIXME: use DataLayout/TargetLibraryInfo for smarter constant folding. 235 if (ConstantInt *Res = dyn_cast<ConstantInt>( 236 ConstantFoldCompareInstOperands(CmpInst::ICMP_NE, 237 getConstant(), 238 RHS.getNotConstant()))) 239 if (Res->isOne()) 240 return markNotConstant(RHS.getNotConstant()); 241 242 return markOverdefined(); 243 } 244 245 // RHS is a ConstantRange, LHS is a non-integer Constant. 246 247 // FIXME: consider the case where RHS is a range [1, 0) and LHS is 248 // a function. The correct result is to pick up RHS. 249 250 return markOverdefined(); 251 } 252 253 if (isNotConstant()) { 254 if (RHS.isConstant()) { 255 if (Val == RHS.Val) 256 return markOverdefined(); 257 258 // Unless we can prove that the two Constants are different, we must 259 // move to overdefined. 260 // FIXME: use DataLayout/TargetLibraryInfo for smarter constant folding. 261 if (ConstantInt *Res = dyn_cast<ConstantInt>( 262 ConstantFoldCompareInstOperands(CmpInst::ICMP_NE, 263 getNotConstant(), 264 RHS.getConstant()))) 265 if (Res->isOne()) 266 return false; 267 268 return markOverdefined(); 269 } 270 271 if (RHS.isNotConstant()) { 272 if (Val == RHS.Val) 273 return false; 274 return markOverdefined(); 275 } 276 277 return markOverdefined(); 278 } 279 280 assert(isConstantRange() && "New LVILattice type?"); 281 if (!RHS.isConstantRange()) 282 return markOverdefined(); 283 284 ConstantRange NewR = Range.unionWith(RHS.getConstantRange()); 285 if (NewR.isFullSet()) 286 return markOverdefined(); 287 return markConstantRange(NewR); 288 } 289 }; 290 291 } // end anonymous namespace. 292 293 namespace llvm { 294 raw_ostream &operator<<(raw_ostream &OS, const LVILatticeVal &Val) 295 LLVM_ATTRIBUTE_USED; 296 raw_ostream &operator<<(raw_ostream &OS, const LVILatticeVal &Val) { 297 if (Val.isUndefined()) 298 return OS << "undefined"; 299 if (Val.isOverdefined()) 300 return OS << "overdefined"; 301 302 if (Val.isNotConstant()) 303 return OS << "notconstant<" << *Val.getNotConstant() << '>'; 304 else if (Val.isConstantRange()) 305 return OS << "constantrange<" << Val.getConstantRange().getLower() << ", " 306 << Val.getConstantRange().getUpper() << '>'; 307 return OS << "constant<" << *Val.getConstant() << '>'; 308 } 309 } 310 311 //===----------------------------------------------------------------------===// 312 // LazyValueInfoCache Decl 313 //===----------------------------------------------------------------------===// 314 315 namespace { 316 /// LVIValueHandle - A callback value handle updates the cache when 317 /// values are erased. 318 class LazyValueInfoCache; 319 struct LVIValueHandle : public CallbackVH { 320 LazyValueInfoCache *Parent; 321 322 LVIValueHandle(Value *V, LazyValueInfoCache *P) 323 : CallbackVH(V), Parent(P) { } 324 325 void deleted() override; 326 void allUsesReplacedWith(Value *V) override { 327 deleted(); 328 } 329 }; 330 } 331 332 namespace { 333 /// LazyValueInfoCache - This is the cache kept by LazyValueInfo which 334 /// maintains information about queries across the clients' queries. 335 class LazyValueInfoCache { 336 /// ValueCacheEntryTy - This is all of the cached block information for 337 /// exactly one Value*. The entries are sorted by the BasicBlock* of the 338 /// entries, allowing us to do a lookup with a binary search. 339 typedef std::map<AssertingVH<BasicBlock>, LVILatticeVal> ValueCacheEntryTy; 340 341 /// ValueCache - This is all of the cached information for all values, 342 /// mapped from Value* to key information. 343 std::map<LVIValueHandle, ValueCacheEntryTy> ValueCache; 344 345 /// OverDefinedCache - This tracks, on a per-block basis, the set of 346 /// values that are over-defined at the end of that block. This is required 347 /// for cache updating. 348 typedef std::pair<AssertingVH<BasicBlock>, Value*> OverDefinedPairTy; 349 DenseSet<OverDefinedPairTy> OverDefinedCache; 350 351 /// SeenBlocks - Keep track of all blocks that we have ever seen, so we 352 /// don't spend time removing unused blocks from our caches. 353 DenseSet<AssertingVH<BasicBlock> > SeenBlocks; 354 355 /// BlockValueStack - This stack holds the state of the value solver 356 /// during a query. It basically emulates the callstack of the naive 357 /// recursive value lookup process. 358 std::stack<std::pair<BasicBlock*, Value*> > BlockValueStack; 359 360 /// A pointer to the cache of @llvm.assume calls. 361 AssumptionTracker *AT; 362 /// An optional DL pointer. 363 const DataLayout *DL; 364 /// An optional DT pointer. 365 DominatorTree *DT; 366 /// A counter to record how many times Overdefined has been tried to be 367 /// lowered. 368 DenseMap<BasicBlock *, unsigned> LoweringOverdefinedTimes; 369 370 friend struct LVIValueHandle; 371 372 /// OverDefinedCacheUpdater - A helper object that ensures that the 373 /// OverDefinedCache is updated whenever solveBlockValue returns. 374 struct OverDefinedCacheUpdater { 375 LazyValueInfoCache *Parent; 376 Value *Val; 377 BasicBlock *BB; 378 LVILatticeVal &BBLV; 379 380 OverDefinedCacheUpdater(Value *V, BasicBlock *B, LVILatticeVal &LV, 381 LazyValueInfoCache *P) 382 : Parent(P), Val(V), BB(B), BBLV(LV) { } 383 384 bool markResult(bool changed) { 385 if (changed && BBLV.isOverdefined()) 386 Parent->OverDefinedCache.insert(std::make_pair(BB, Val)); 387 return changed; 388 } 389 }; 390 391 392 393 LVILatticeVal getBlockValue(Value *Val, BasicBlock *BB); 394 bool getEdgeValue(Value *V, BasicBlock *F, BasicBlock *T, 395 LVILatticeVal &Result, 396 Instruction *CxtI = nullptr); 397 bool hasBlockValue(Value *Val, BasicBlock *BB); 398 399 // These methods process one work item and may add more. A false value 400 // returned means that the work item was not completely processed and must 401 // be revisited after going through the new items. 402 bool solveBlockValue(Value *Val, BasicBlock *BB); 403 bool solveBlockValueNonLocal(LVILatticeVal &BBLV, 404 Value *Val, BasicBlock *BB); 405 bool solveBlockValuePHINode(LVILatticeVal &BBLV, 406 PHINode *PN, BasicBlock *BB); 407 bool solveBlockValueConstantRange(LVILatticeVal &BBLV, 408 Instruction *BBI, BasicBlock *BB); 409 void mergeAssumeBlockValueConstantRange(Value *Val, LVILatticeVal &BBLV, 410 Instruction *BBI); 411 412 void solve(); 413 414 ValueCacheEntryTy &lookup(Value *V) { 415 return ValueCache[LVIValueHandle(V, this)]; 416 } 417 418 public: 419 /// getValueInBlock - This is the query interface to determine the lattice 420 /// value for the specified Value* at the end of the specified block. 421 LVILatticeVal getValueInBlock(Value *V, BasicBlock *BB, 422 Instruction *CxtI = nullptr); 423 424 /// getValueAt - This is the query interface to determine the lattice 425 /// value for the specified Value* at the specified instruction (generally 426 /// from an assume intrinsic). 427 LVILatticeVal getValueAt(Value *V, Instruction *CxtI); 428 429 /// getValueOnEdge - This is the query interface to determine the lattice 430 /// value for the specified Value* that is true on the specified edge. 431 LVILatticeVal getValueOnEdge(Value *V, BasicBlock *FromBB,BasicBlock *ToBB, 432 Instruction *CxtI = nullptr); 433 434 /// threadEdge - This is the update interface to inform the cache that an 435 /// edge from PredBB to OldSucc has been threaded to be from PredBB to 436 /// NewSucc. 437 void threadEdge(BasicBlock *PredBB,BasicBlock *OldSucc,BasicBlock *NewSucc); 438 439 /// eraseBlock - This is part of the update interface to inform the cache 440 /// that a block has been deleted. 441 void eraseBlock(BasicBlock *BB); 442 443 /// clear - Empty the cache. 444 void clear() { 445 SeenBlocks.clear(); 446 ValueCache.clear(); 447 OverDefinedCache.clear(); 448 } 449 450 LazyValueInfoCache(AssumptionTracker *AT, 451 const DataLayout *DL = nullptr, 452 DominatorTree *DT = nullptr) : AT(AT), DL(DL), DT(DT) {} 453 }; 454 } // end anonymous namespace 455 456 void LVIValueHandle::deleted() { 457 typedef std::pair<AssertingVH<BasicBlock>, Value*> OverDefinedPairTy; 458 459 SmallVector<OverDefinedPairTy, 4> ToErase; 460 for (DenseSet<OverDefinedPairTy>::iterator 461 I = Parent->OverDefinedCache.begin(), 462 E = Parent->OverDefinedCache.end(); 463 I != E; ++I) { 464 if (I->second == getValPtr()) 465 ToErase.push_back(*I); 466 } 467 468 for (SmallVectorImpl<OverDefinedPairTy>::iterator I = ToErase.begin(), 469 E = ToErase.end(); I != E; ++I) 470 Parent->OverDefinedCache.erase(*I); 471 472 // This erasure deallocates *this, so it MUST happen after we're done 473 // using any and all members of *this. 474 Parent->ValueCache.erase(*this); 475 } 476 477 void LazyValueInfoCache::eraseBlock(BasicBlock *BB) { 478 // Shortcut if we have never seen this block. 479 DenseSet<AssertingVH<BasicBlock> >::iterator I = SeenBlocks.find(BB); 480 if (I == SeenBlocks.end()) 481 return; 482 SeenBlocks.erase(I); 483 484 SmallVector<OverDefinedPairTy, 4> ToErase; 485 for (DenseSet<OverDefinedPairTy>::iterator I = OverDefinedCache.begin(), 486 E = OverDefinedCache.end(); I != E; ++I) { 487 if (I->first == BB) 488 ToErase.push_back(*I); 489 } 490 491 for (SmallVectorImpl<OverDefinedPairTy>::iterator I = ToErase.begin(), 492 E = ToErase.end(); I != E; ++I) 493 OverDefinedCache.erase(*I); 494 495 for (std::map<LVIValueHandle, ValueCacheEntryTy>::iterator 496 I = ValueCache.begin(), E = ValueCache.end(); I != E; ++I) 497 I->second.erase(BB); 498 } 499 500 void LazyValueInfoCache::solve() { 501 // Reset the counter of lowering overdefined value. 502 LoweringOverdefinedTimes.clear(); 503 504 while (!BlockValueStack.empty()) { 505 std::pair<BasicBlock*, Value*> &e = BlockValueStack.top(); 506 if (solveBlockValue(e.second, e.first)) { 507 assert(BlockValueStack.top() == e); 508 BlockValueStack.pop(); 509 } 510 } 511 } 512 513 bool LazyValueInfoCache::hasBlockValue(Value *Val, BasicBlock *BB) { 514 // If already a constant, there is nothing to compute. 515 if (isa<Constant>(Val)) 516 return true; 517 518 LVIValueHandle ValHandle(Val, this); 519 std::map<LVIValueHandle, ValueCacheEntryTy>::iterator I = 520 ValueCache.find(ValHandle); 521 if (I == ValueCache.end()) return false; 522 return I->second.count(BB); 523 } 524 525 LVILatticeVal LazyValueInfoCache::getBlockValue(Value *Val, BasicBlock *BB) { 526 // If already a constant, there is nothing to compute. 527 if (Constant *VC = dyn_cast<Constant>(Val)) 528 return LVILatticeVal::get(VC); 529 530 SeenBlocks.insert(BB); 531 return lookup(Val)[BB]; 532 } 533 534 bool LazyValueInfoCache::solveBlockValue(Value *Val, BasicBlock *BB) { 535 if (isa<Constant>(Val)) 536 return true; 537 538 ValueCacheEntryTy &Cache = lookup(Val); 539 SeenBlocks.insert(BB); 540 LVILatticeVal &BBLV = Cache[BB]; 541 542 // OverDefinedCacheUpdater is a helper object that will update 543 // the OverDefinedCache for us when this method exits. Make sure to 544 // call markResult on it as we exist, passing a bool to indicate if the 545 // cache needs updating, i.e. if we have solve a new value or not. 546 OverDefinedCacheUpdater ODCacheUpdater(Val, BB, BBLV, this); 547 548 if (!BBLV.isUndefined()) { 549 DEBUG(dbgs() << " reuse BB '" << BB->getName() << "' val=" << BBLV <<'\n'); 550 551 // Since we're reusing a cached value here, we don't need to update the 552 // OverDefinedCahce. The cache will have been properly updated 553 // whenever the cached value was inserted. 554 ODCacheUpdater.markResult(false); 555 return true; 556 } 557 558 // Otherwise, this is the first time we're seeing this block. Reset the 559 // lattice value to overdefined, so that cycles will terminate and be 560 // conservatively correct. 561 BBLV.markOverdefined(); 562 ++LoweringOverdefinedTimes[BB]; 563 564 Instruction *BBI = dyn_cast<Instruction>(Val); 565 if (!BBI || BBI->getParent() != BB) { 566 return ODCacheUpdater.markResult(solveBlockValueNonLocal(BBLV, Val, BB)); 567 } 568 569 if (PHINode *PN = dyn_cast<PHINode>(BBI)) { 570 return ODCacheUpdater.markResult(solveBlockValuePHINode(BBLV, PN, BB)); 571 } 572 573 if (AllocaInst *AI = dyn_cast<AllocaInst>(BBI)) { 574 BBLV = LVILatticeVal::getNot(ConstantPointerNull::get(AI->getType())); 575 return ODCacheUpdater.markResult(true); 576 } 577 578 // We can only analyze the definitions of certain classes of instructions 579 // (integral binops and casts at the moment), so bail if this isn't one. 580 LVILatticeVal Result; 581 if ((!isa<BinaryOperator>(BBI) && !isa<CastInst>(BBI)) || 582 !BBI->getType()->isIntegerTy()) { 583 DEBUG(dbgs() << " compute BB '" << BB->getName() 584 << "' - overdefined because inst def found.\n"); 585 BBLV.markOverdefined(); 586 return ODCacheUpdater.markResult(true); 587 } 588 589 // FIXME: We're currently limited to binops with a constant RHS. This should 590 // be improved. 591 BinaryOperator *BO = dyn_cast<BinaryOperator>(BBI); 592 if (BO && !isa<ConstantInt>(BO->getOperand(1))) { 593 DEBUG(dbgs() << " compute BB '" << BB->getName() 594 << "' - overdefined because inst def found.\n"); 595 596 BBLV.markOverdefined(); 597 return ODCacheUpdater.markResult(true); 598 } 599 600 return ODCacheUpdater.markResult(solveBlockValueConstantRange(BBLV, BBI, BB)); 601 } 602 603 static bool InstructionDereferencesPointer(Instruction *I, Value *Ptr) { 604 if (LoadInst *L = dyn_cast<LoadInst>(I)) { 605 return L->getPointerAddressSpace() == 0 && 606 GetUnderlyingObject(L->getPointerOperand()) == Ptr; 607 } 608 if (StoreInst *S = dyn_cast<StoreInst>(I)) { 609 return S->getPointerAddressSpace() == 0 && 610 GetUnderlyingObject(S->getPointerOperand()) == Ptr; 611 } 612 if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(I)) { 613 if (MI->isVolatile()) return false; 614 615 // FIXME: check whether it has a valuerange that excludes zero? 616 ConstantInt *Len = dyn_cast<ConstantInt>(MI->getLength()); 617 if (!Len || Len->isZero()) return false; 618 619 if (MI->getDestAddressSpace() == 0) 620 if (GetUnderlyingObject(MI->getRawDest()) == Ptr) 621 return true; 622 if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(MI)) 623 if (MTI->getSourceAddressSpace() == 0) 624 if (GetUnderlyingObject(MTI->getRawSource()) == Ptr) 625 return true; 626 } 627 return false; 628 } 629 630 bool LazyValueInfoCache::solveBlockValueNonLocal(LVILatticeVal &BBLV, 631 Value *Val, BasicBlock *BB) { 632 LVILatticeVal Result; // Start Undefined. 633 634 // If this is a pointer, and there's a load from that pointer in this BB, 635 // then we know that the pointer can't be NULL. 636 bool NotNull = false; 637 if (Val->getType()->isPointerTy()) { 638 if (isKnownNonNull(Val)) { 639 NotNull = true; 640 } else { 641 Value *UnderlyingVal = GetUnderlyingObject(Val); 642 // If 'GetUnderlyingObject' didn't converge, skip it. It won't converge 643 // inside InstructionDereferencesPointer either. 644 if (UnderlyingVal == GetUnderlyingObject(UnderlyingVal, nullptr, 1)) { 645 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); 646 BI != BE; ++BI) { 647 if (InstructionDereferencesPointer(BI, UnderlyingVal)) { 648 NotNull = true; 649 break; 650 } 651 } 652 } 653 } 654 } 655 656 // If this is the entry block, we must be asking about an argument. The 657 // value is overdefined. 658 if (BB == &BB->getParent()->getEntryBlock()) { 659 assert(isa<Argument>(Val) && "Unknown live-in to the entry block"); 660 if (NotNull) { 661 PointerType *PTy = cast<PointerType>(Val->getType()); 662 Result = LVILatticeVal::getNot(ConstantPointerNull::get(PTy)); 663 } else { 664 Result.markOverdefined(); 665 } 666 BBLV = Result; 667 return true; 668 } 669 670 // Loop over all of our predecessors, merging what we know from them into 671 // result. 672 bool EdgesMissing = false; 673 for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) { 674 LVILatticeVal EdgeResult; 675 EdgesMissing |= !getEdgeValue(Val, *PI, BB, EdgeResult); 676 if (EdgesMissing) 677 continue; 678 679 Result.mergeIn(EdgeResult); 680 681 // If we hit overdefined, exit early. The BlockVals entry is already set 682 // to overdefined. 683 if (Result.isOverdefined()) { 684 DEBUG(dbgs() << " compute BB '" << BB->getName() 685 << "' - overdefined because of pred.\n"); 686 // If we previously determined that this is a pointer that can't be null 687 // then return that rather than giving up entirely. 688 if (NotNull) { 689 PointerType *PTy = cast<PointerType>(Val->getType()); 690 Result = LVILatticeVal::getNot(ConstantPointerNull::get(PTy)); 691 } 692 693 BBLV = Result; 694 return true; 695 } 696 } 697 if (EdgesMissing) 698 return false; 699 700 // Return the merged value, which is more precise than 'overdefined'. 701 assert(!Result.isOverdefined()); 702 BBLV = Result; 703 return true; 704 } 705 706 bool LazyValueInfoCache::solveBlockValuePHINode(LVILatticeVal &BBLV, 707 PHINode *PN, BasicBlock *BB) { 708 LVILatticeVal Result; // Start Undefined. 709 710 // Loop over all of our predecessors, merging what we know from them into 711 // result. 712 bool EdgesMissing = false; 713 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) { 714 BasicBlock *PhiBB = PN->getIncomingBlock(i); 715 Value *PhiVal = PN->getIncomingValue(i); 716 LVILatticeVal EdgeResult; 717 EdgesMissing |= !getEdgeValue(PhiVal, PhiBB, BB, EdgeResult, PN); 718 if (EdgesMissing) 719 continue; 720 721 Result.mergeIn(EdgeResult); 722 723 // If we hit overdefined, exit early. The BlockVals entry is already set 724 // to overdefined. 725 if (Result.isOverdefined()) { 726 DEBUG(dbgs() << " compute BB '" << BB->getName() 727 << "' - overdefined because of pred.\n"); 728 729 BBLV = Result; 730 return true; 731 } 732 } 733 if (EdgesMissing) 734 return false; 735 736 // Return the merged value, which is more precise than 'overdefined'. 737 assert(!Result.isOverdefined() && "Possible PHI in entry block?"); 738 BBLV = Result; 739 return true; 740 } 741 742 static bool getValueFromFromCondition(Value *Val, ICmpInst *ICI, 743 LVILatticeVal &Result, 744 bool isTrueDest = true); 745 746 // If we can determine a constant range for the value Val at the context 747 // provided by the instruction BBI, then merge it into BBLV. If we did find a 748 // constant range, return true. 749 void LazyValueInfoCache::mergeAssumeBlockValueConstantRange( 750 Value *Val, LVILatticeVal &BBLV, Instruction *BBI) { 751 BBI = BBI ? BBI : dyn_cast<Instruction>(Val); 752 if (!BBI) 753 return; 754 755 for (auto &I : AT->assumptions(BBI->getParent()->getParent())) { 756 if (!isValidAssumeForContext(I, BBI, DL, DT)) 757 continue; 758 759 Value *C = I->getArgOperand(0); 760 if (ICmpInst *ICI = dyn_cast<ICmpInst>(C)) { 761 LVILatticeVal Result; 762 if (getValueFromFromCondition(Val, ICI, Result)) { 763 if (BBLV.isOverdefined()) 764 BBLV = Result; 765 else 766 BBLV.mergeIn(Result); 767 } 768 } 769 } 770 } 771 772 bool LazyValueInfoCache::solveBlockValueConstantRange(LVILatticeVal &BBLV, 773 Instruction *BBI, 774 BasicBlock *BB) { 775 // Figure out the range of the LHS. If that fails, bail. 776 if (!hasBlockValue(BBI->getOperand(0), BB)) { 777 BlockValueStack.push(std::make_pair(BB, BBI->getOperand(0))); 778 return false; 779 } 780 781 LVILatticeVal LHSVal = getBlockValue(BBI->getOperand(0), BB); 782 mergeAssumeBlockValueConstantRange(BBI->getOperand(0), LHSVal, BBI); 783 if (!LHSVal.isConstantRange()) { 784 BBLV.markOverdefined(); 785 return true; 786 } 787 788 ConstantRange LHSRange = LHSVal.getConstantRange(); 789 ConstantRange RHSRange(1); 790 IntegerType *ResultTy = cast<IntegerType>(BBI->getType()); 791 if (isa<BinaryOperator>(BBI)) { 792 if (ConstantInt *RHS = dyn_cast<ConstantInt>(BBI->getOperand(1))) { 793 RHSRange = ConstantRange(RHS->getValue()); 794 } else { 795 BBLV.markOverdefined(); 796 return true; 797 } 798 } 799 800 // NOTE: We're currently limited by the set of operations that ConstantRange 801 // can evaluate symbolically. Enhancing that set will allows us to analyze 802 // more definitions. 803 LVILatticeVal Result; 804 switch (BBI->getOpcode()) { 805 case Instruction::Add: 806 Result.markConstantRange(LHSRange.add(RHSRange)); 807 break; 808 case Instruction::Sub: 809 Result.markConstantRange(LHSRange.sub(RHSRange)); 810 break; 811 case Instruction::Mul: 812 Result.markConstantRange(LHSRange.multiply(RHSRange)); 813 break; 814 case Instruction::UDiv: 815 Result.markConstantRange(LHSRange.udiv(RHSRange)); 816 break; 817 case Instruction::Shl: 818 Result.markConstantRange(LHSRange.shl(RHSRange)); 819 break; 820 case Instruction::LShr: 821 Result.markConstantRange(LHSRange.lshr(RHSRange)); 822 break; 823 case Instruction::Trunc: 824 Result.markConstantRange(LHSRange.truncate(ResultTy->getBitWidth())); 825 break; 826 case Instruction::SExt: 827 Result.markConstantRange(LHSRange.signExtend(ResultTy->getBitWidth())); 828 break; 829 case Instruction::ZExt: 830 Result.markConstantRange(LHSRange.zeroExtend(ResultTy->getBitWidth())); 831 break; 832 case Instruction::BitCast: 833 Result.markConstantRange(LHSRange); 834 break; 835 case Instruction::And: 836 Result.markConstantRange(LHSRange.binaryAnd(RHSRange)); 837 break; 838 case Instruction::Or: 839 Result.markConstantRange(LHSRange.binaryOr(RHSRange)); 840 break; 841 842 // Unhandled instructions are overdefined. 843 default: 844 DEBUG(dbgs() << " compute BB '" << BB->getName() 845 << "' - overdefined because inst def found.\n"); 846 Result.markOverdefined(); 847 break; 848 } 849 850 BBLV = Result; 851 return true; 852 } 853 854 bool getValueFromFromCondition(Value *Val, ICmpInst *ICI, 855 LVILatticeVal &Result, bool isTrueDest) { 856 if (ICI && isa<Constant>(ICI->getOperand(1))) { 857 if (ICI->isEquality() && ICI->getOperand(0) == Val) { 858 // We know that V has the RHS constant if this is a true SETEQ or 859 // false SETNE. 860 if (isTrueDest == (ICI->getPredicate() == ICmpInst::ICMP_EQ)) 861 Result = LVILatticeVal::get(cast<Constant>(ICI->getOperand(1))); 862 else 863 Result = LVILatticeVal::getNot(cast<Constant>(ICI->getOperand(1))); 864 return true; 865 } 866 867 // Recognize the range checking idiom that InstCombine produces. 868 // (X-C1) u< C2 --> [C1, C1+C2) 869 ConstantInt *NegOffset = nullptr; 870 if (ICI->getPredicate() == ICmpInst::ICMP_ULT) 871 match(ICI->getOperand(0), m_Add(m_Specific(Val), 872 m_ConstantInt(NegOffset))); 873 874 ConstantInt *CI = dyn_cast<ConstantInt>(ICI->getOperand(1)); 875 if (CI && (ICI->getOperand(0) == Val || NegOffset)) { 876 // Calculate the range of values that would satisfy the comparison. 877 ConstantRange CmpRange(CI->getValue()); 878 ConstantRange TrueValues = 879 ConstantRange::makeICmpRegion(ICI->getPredicate(), CmpRange); 880 881 if (NegOffset) // Apply the offset from above. 882 TrueValues = TrueValues.subtract(NegOffset->getValue()); 883 884 // If we're interested in the false dest, invert the condition. 885 if (!isTrueDest) TrueValues = TrueValues.inverse(); 886 887 Result = LVILatticeVal::getRange(TrueValues); 888 return true; 889 } 890 } 891 892 return false; 893 } 894 895 /// \brief Compute the value of Val on the edge BBFrom -> BBTo. Returns false if 896 /// Val is not constrained on the edge. 897 static bool getEdgeValueLocal(Value *Val, BasicBlock *BBFrom, 898 BasicBlock *BBTo, LVILatticeVal &Result) { 899 // TODO: Handle more complex conditionals. If (v == 0 || v2 < 1) is false, we 900 // know that v != 0. 901 if (BranchInst *BI = dyn_cast<BranchInst>(BBFrom->getTerminator())) { 902 // If this is a conditional branch and only one successor goes to BBTo, then 903 // we maybe able to infer something from the condition. 904 if (BI->isConditional() && 905 BI->getSuccessor(0) != BI->getSuccessor(1)) { 906 bool isTrueDest = BI->getSuccessor(0) == BBTo; 907 assert(BI->getSuccessor(!isTrueDest) == BBTo && 908 "BBTo isn't a successor of BBFrom"); 909 910 // If V is the condition of the branch itself, then we know exactly what 911 // it is. 912 if (BI->getCondition() == Val) { 913 Result = LVILatticeVal::get(ConstantInt::get( 914 Type::getInt1Ty(Val->getContext()), isTrueDest)); 915 return true; 916 } 917 918 // If the condition of the branch is an equality comparison, we may be 919 // able to infer the value. 920 ICmpInst *ICI = dyn_cast<ICmpInst>(BI->getCondition()); 921 if (getValueFromFromCondition(Val, ICI, Result, isTrueDest)) 922 return true; 923 } 924 } 925 926 // If the edge was formed by a switch on the value, then we may know exactly 927 // what it is. 928 if (SwitchInst *SI = dyn_cast<SwitchInst>(BBFrom->getTerminator())) { 929 if (SI->getCondition() != Val) 930 return false; 931 932 bool DefaultCase = SI->getDefaultDest() == BBTo; 933 unsigned BitWidth = Val->getType()->getIntegerBitWidth(); 934 ConstantRange EdgesVals(BitWidth, DefaultCase/*isFullSet*/); 935 936 for (SwitchInst::CaseIt i = SI->case_begin(), e = SI->case_end(); 937 i != e; ++i) { 938 ConstantRange EdgeVal(i.getCaseValue()->getValue()); 939 if (DefaultCase) { 940 // It is possible that the default destination is the destination of 941 // some cases. There is no need to perform difference for those cases. 942 if (i.getCaseSuccessor() != BBTo) 943 EdgesVals = EdgesVals.difference(EdgeVal); 944 } else if (i.getCaseSuccessor() == BBTo) 945 EdgesVals = EdgesVals.unionWith(EdgeVal); 946 } 947 Result = LVILatticeVal::getRange(EdgesVals); 948 return true; 949 } 950 return false; 951 } 952 953 /// \brief Compute the value of Val on the edge BBFrom -> BBTo, or the value at 954 /// the basic block if the edge does not constraint Val. 955 bool LazyValueInfoCache::getEdgeValue(Value *Val, BasicBlock *BBFrom, 956 BasicBlock *BBTo, LVILatticeVal &Result, 957 Instruction *CxtI) { 958 // If already a constant, there is nothing to compute. 959 if (Constant *VC = dyn_cast<Constant>(Val)) { 960 Result = LVILatticeVal::get(VC); 961 return true; 962 } 963 964 if (getEdgeValueLocal(Val, BBFrom, BBTo, Result)) { 965 if (!Result.isConstantRange() || 966 Result.getConstantRange().getSingleElement()) 967 return true; 968 969 // FIXME: this check should be moved to the beginning of the function when 970 // LVI better supports recursive values. Even for the single value case, we 971 // can intersect to detect dead code (an empty range). 972 if (!hasBlockValue(Val, BBFrom)) { 973 BlockValueStack.push(std::make_pair(BBFrom, Val)); 974 return false; 975 } 976 977 // Try to intersect ranges of the BB and the constraint on the edge. 978 LVILatticeVal InBlock = getBlockValue(Val, BBFrom); 979 mergeAssumeBlockValueConstantRange(Val, InBlock, CxtI); 980 if (!InBlock.isConstantRange()) 981 return true; 982 983 ConstantRange Range = 984 Result.getConstantRange().intersectWith(InBlock.getConstantRange()); 985 Result = LVILatticeVal::getRange(Range); 986 return true; 987 } 988 989 if (!hasBlockValue(Val, BBFrom)) { 990 BlockValueStack.push(std::make_pair(BBFrom, Val)); 991 return false; 992 } 993 994 // if we couldn't compute the value on the edge, use the value from the BB 995 Result = getBlockValue(Val, BBFrom); 996 mergeAssumeBlockValueConstantRange(Val, Result, CxtI); 997 return true; 998 } 999 1000 LVILatticeVal LazyValueInfoCache::getValueInBlock(Value *V, BasicBlock *BB, 1001 Instruction *CxtI) { 1002 DEBUG(dbgs() << "LVI Getting block end value " << *V << " at '" 1003 << BB->getName() << "'\n"); 1004 1005 BlockValueStack.push(std::make_pair(BB, V)); 1006 solve(); 1007 LVILatticeVal Result = getBlockValue(V, BB); 1008 mergeAssumeBlockValueConstantRange(V, Result, CxtI); 1009 1010 DEBUG(dbgs() << " Result = " << Result << "\n"); 1011 return Result; 1012 } 1013 1014 LVILatticeVal LazyValueInfoCache::getValueAt(Value *V, Instruction *CxtI) { 1015 DEBUG(dbgs() << "LVI Getting value " << *V << " at '" 1016 << CxtI->getName() << "'\n"); 1017 1018 LVILatticeVal Result; 1019 mergeAssumeBlockValueConstantRange(V, Result, CxtI); 1020 1021 DEBUG(dbgs() << " Result = " << Result << "\n"); 1022 return Result; 1023 } 1024 1025 LVILatticeVal LazyValueInfoCache:: 1026 getValueOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, 1027 Instruction *CxtI) { 1028 DEBUG(dbgs() << "LVI Getting edge value " << *V << " from '" 1029 << FromBB->getName() << "' to '" << ToBB->getName() << "'\n"); 1030 1031 LVILatticeVal Result; 1032 if (!getEdgeValue(V, FromBB, ToBB, Result, CxtI)) { 1033 solve(); 1034 bool WasFastQuery = getEdgeValue(V, FromBB, ToBB, Result, CxtI); 1035 (void)WasFastQuery; 1036 assert(WasFastQuery && "More work to do after problem solved?"); 1037 } 1038 1039 DEBUG(dbgs() << " Result = " << Result << "\n"); 1040 return Result; 1041 } 1042 1043 void LazyValueInfoCache::threadEdge(BasicBlock *PredBB, BasicBlock *OldSucc, 1044 BasicBlock *NewSucc) { 1045 // When an edge in the graph has been threaded, values that we could not 1046 // determine a value for before (i.e. were marked overdefined) may be possible 1047 // to solve now. We do NOT try to proactively update these values. Instead, 1048 // we clear their entries from the cache, and allow lazy updating to recompute 1049 // them when needed. 1050 1051 // The updating process is fairly simple: we need to dropped cached info 1052 // for all values that were marked overdefined in OldSucc, and for those same 1053 // values in any successor of OldSucc (except NewSucc) in which they were 1054 // also marked overdefined. 1055 std::vector<BasicBlock*> worklist; 1056 worklist.push_back(OldSucc); 1057 1058 DenseSet<Value*> ClearSet; 1059 for (DenseSet<OverDefinedPairTy>::iterator I = OverDefinedCache.begin(), 1060 E = OverDefinedCache.end(); I != E; ++I) { 1061 if (I->first == OldSucc) 1062 ClearSet.insert(I->second); 1063 } 1064 1065 // Use a worklist to perform a depth-first search of OldSucc's successors. 1066 // NOTE: We do not need a visited list since any blocks we have already 1067 // visited will have had their overdefined markers cleared already, and we 1068 // thus won't loop to their successors. 1069 while (!worklist.empty()) { 1070 BasicBlock *ToUpdate = worklist.back(); 1071 worklist.pop_back(); 1072 1073 // Skip blocks only accessible through NewSucc. 1074 if (ToUpdate == NewSucc) continue; 1075 1076 bool changed = false; 1077 for (DenseSet<Value*>::iterator I = ClearSet.begin(), E = ClearSet.end(); 1078 I != E; ++I) { 1079 // If a value was marked overdefined in OldSucc, and is here too... 1080 DenseSet<OverDefinedPairTy>::iterator OI = 1081 OverDefinedCache.find(std::make_pair(ToUpdate, *I)); 1082 if (OI == OverDefinedCache.end()) continue; 1083 1084 // Remove it from the caches. 1085 ValueCacheEntryTy &Entry = ValueCache[LVIValueHandle(*I, this)]; 1086 ValueCacheEntryTy::iterator CI = Entry.find(ToUpdate); 1087 1088 assert(CI != Entry.end() && "Couldn't find entry to update?"); 1089 Entry.erase(CI); 1090 OverDefinedCache.erase(OI); 1091 1092 // If we removed anything, then we potentially need to update 1093 // blocks successors too. 1094 changed = true; 1095 } 1096 1097 if (!changed) continue; 1098 1099 worklist.insert(worklist.end(), succ_begin(ToUpdate), succ_end(ToUpdate)); 1100 } 1101 } 1102 1103 //===----------------------------------------------------------------------===// 1104 // LazyValueInfo Impl 1105 //===----------------------------------------------------------------------===// 1106 1107 /// getCache - This lazily constructs the LazyValueInfoCache. 1108 static LazyValueInfoCache &getCache(void *&PImpl, 1109 AssumptionTracker *AT, 1110 const DataLayout *DL = nullptr, 1111 DominatorTree *DT = nullptr) { 1112 if (!PImpl) 1113 PImpl = new LazyValueInfoCache(AT, DL, DT); 1114 return *static_cast<LazyValueInfoCache*>(PImpl); 1115 } 1116 1117 bool LazyValueInfo::runOnFunction(Function &F) { 1118 AT = &getAnalysis<AssumptionTracker>(); 1119 1120 DominatorTreeWrapperPass *DTWP = 1121 getAnalysisIfAvailable<DominatorTreeWrapperPass>(); 1122 DT = DTWP ? &DTWP->getDomTree() : nullptr; 1123 1124 DataLayoutPass *DLP = getAnalysisIfAvailable<DataLayoutPass>(); 1125 DL = DLP ? &DLP->getDataLayout() : nullptr; 1126 TLI = &getAnalysis<TargetLibraryInfo>(); 1127 1128 if (PImpl) 1129 getCache(PImpl, AT, DL, DT).clear(); 1130 1131 // Fully lazy. 1132 return false; 1133 } 1134 1135 void LazyValueInfo::getAnalysisUsage(AnalysisUsage &AU) const { 1136 AU.setPreservesAll(); 1137 AU.addRequired<AssumptionTracker>(); 1138 AU.addRequired<TargetLibraryInfo>(); 1139 } 1140 1141 void LazyValueInfo::releaseMemory() { 1142 // If the cache was allocated, free it. 1143 if (PImpl) { 1144 delete &getCache(PImpl, AT); 1145 PImpl = nullptr; 1146 } 1147 } 1148 1149 Constant *LazyValueInfo::getConstant(Value *V, BasicBlock *BB, 1150 Instruction *CxtI) { 1151 LVILatticeVal Result = 1152 getCache(PImpl, AT, DL, DT).getValueInBlock(V, BB, CxtI); 1153 1154 if (Result.isConstant()) 1155 return Result.getConstant(); 1156 if (Result.isConstantRange()) { 1157 ConstantRange CR = Result.getConstantRange(); 1158 if (const APInt *SingleVal = CR.getSingleElement()) 1159 return ConstantInt::get(V->getContext(), *SingleVal); 1160 } 1161 return nullptr; 1162 } 1163 1164 /// getConstantOnEdge - Determine whether the specified value is known to be a 1165 /// constant on the specified edge. Return null if not. 1166 Constant *LazyValueInfo::getConstantOnEdge(Value *V, BasicBlock *FromBB, 1167 BasicBlock *ToBB, 1168 Instruction *CxtI) { 1169 LVILatticeVal Result = 1170 getCache(PImpl, AT, DL, DT).getValueOnEdge(V, FromBB, ToBB, CxtI); 1171 1172 if (Result.isConstant()) 1173 return Result.getConstant(); 1174 if (Result.isConstantRange()) { 1175 ConstantRange CR = Result.getConstantRange(); 1176 if (const APInt *SingleVal = CR.getSingleElement()) 1177 return ConstantInt::get(V->getContext(), *SingleVal); 1178 } 1179 return nullptr; 1180 } 1181 1182 static LazyValueInfo::Tristate 1183 getPredicateResult(unsigned Pred, Constant *C, LVILatticeVal &Result, 1184 const DataLayout *DL, TargetLibraryInfo *TLI) { 1185 1186 // If we know the value is a constant, evaluate the conditional. 1187 Constant *Res = nullptr; 1188 if (Result.isConstant()) { 1189 Res = ConstantFoldCompareInstOperands(Pred, Result.getConstant(), C, DL, 1190 TLI); 1191 if (ConstantInt *ResCI = dyn_cast<ConstantInt>(Res)) 1192 return ResCI->isZero() ? LazyValueInfo::False : LazyValueInfo::True; 1193 return LazyValueInfo::Unknown; 1194 } 1195 1196 if (Result.isConstantRange()) { 1197 ConstantInt *CI = dyn_cast<ConstantInt>(C); 1198 if (!CI) return LazyValueInfo::Unknown; 1199 1200 ConstantRange CR = Result.getConstantRange(); 1201 if (Pred == ICmpInst::ICMP_EQ) { 1202 if (!CR.contains(CI->getValue())) 1203 return LazyValueInfo::False; 1204 1205 if (CR.isSingleElement() && CR.contains(CI->getValue())) 1206 return LazyValueInfo::True; 1207 } else if (Pred == ICmpInst::ICMP_NE) { 1208 if (!CR.contains(CI->getValue())) 1209 return LazyValueInfo::True; 1210 1211 if (CR.isSingleElement() && CR.contains(CI->getValue())) 1212 return LazyValueInfo::False; 1213 } 1214 1215 // Handle more complex predicates. 1216 ConstantRange TrueValues = 1217 ICmpInst::makeConstantRange((ICmpInst::Predicate)Pred, CI->getValue()); 1218 if (TrueValues.contains(CR)) 1219 return LazyValueInfo::True; 1220 if (TrueValues.inverse().contains(CR)) 1221 return LazyValueInfo::False; 1222 return LazyValueInfo::Unknown; 1223 } 1224 1225 if (Result.isNotConstant()) { 1226 // If this is an equality comparison, we can try to fold it knowing that 1227 // "V != C1". 1228 if (Pred == ICmpInst::ICMP_EQ) { 1229 // !C1 == C -> false iff C1 == C. 1230 Res = ConstantFoldCompareInstOperands(ICmpInst::ICMP_NE, 1231 Result.getNotConstant(), C, DL, 1232 TLI); 1233 if (Res->isNullValue()) 1234 return LazyValueInfo::False; 1235 } else if (Pred == ICmpInst::ICMP_NE) { 1236 // !C1 != C -> true iff C1 == C. 1237 Res = ConstantFoldCompareInstOperands(ICmpInst::ICMP_NE, 1238 Result.getNotConstant(), C, DL, 1239 TLI); 1240 if (Res->isNullValue()) 1241 return LazyValueInfo::True; 1242 } 1243 return LazyValueInfo::Unknown; 1244 } 1245 1246 return LazyValueInfo::Unknown; 1247 } 1248 1249 /// getPredicateOnEdge - Determine whether the specified value comparison 1250 /// with a constant is known to be true or false on the specified CFG edge. 1251 /// Pred is a CmpInst predicate. 1252 LazyValueInfo::Tristate 1253 LazyValueInfo::getPredicateOnEdge(unsigned Pred, Value *V, Constant *C, 1254 BasicBlock *FromBB, BasicBlock *ToBB, 1255 Instruction *CxtI) { 1256 LVILatticeVal Result = 1257 getCache(PImpl, AT, DL, DT).getValueOnEdge(V, FromBB, ToBB, CxtI); 1258 1259 return getPredicateResult(Pred, C, Result, DL, TLI); 1260 } 1261 1262 LazyValueInfo::Tristate 1263 LazyValueInfo::getPredicateAt(unsigned Pred, Value *V, Constant *C, 1264 Instruction *CxtI) { 1265 LVILatticeVal Result = 1266 getCache(PImpl, AT, DL, DT).getValueAt(V, CxtI); 1267 1268 return getPredicateResult(Pred, C, Result, DL, TLI); 1269 } 1270 1271 void LazyValueInfo::threadEdge(BasicBlock *PredBB, BasicBlock *OldSucc, 1272 BasicBlock *NewSucc) { 1273 if (PImpl) getCache(PImpl, AT, DL, DT).threadEdge(PredBB, OldSucc, NewSucc); 1274 } 1275 1276 void LazyValueInfo::eraseBlock(BasicBlock *BB) { 1277 if (PImpl) getCache(PImpl, AT, DL, DT).eraseBlock(BB); 1278 } 1279