1 //===- SCCP.cpp - Sparse Conditional Constant Propagation -----------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements sparse conditional constant propagation and merging: 10 // 11 // Specifically, this: 12 // * Assumes values are constant unless proven otherwise 13 // * Assumes BasicBlocks are dead unless proven otherwise 14 // * Proves values to be constant, and replaces them with constants 15 // * Proves conditional branches to be unconditional 16 // 17 //===----------------------------------------------------------------------===// 18 19 #include "llvm/Transforms/Scalar/SCCP.h" 20 #include "llvm/ADT/ArrayRef.h" 21 #include "llvm/ADT/DenseMap.h" 22 #include "llvm/ADT/DenseSet.h" 23 #include "llvm/ADT/MapVector.h" 24 #include "llvm/ADT/PointerIntPair.h" 25 #include "llvm/ADT/STLExtras.h" 26 #include "llvm/ADT/SetVector.h" 27 #include "llvm/ADT/SmallPtrSet.h" 28 #include "llvm/ADT/SmallVector.h" 29 #include "llvm/ADT/Statistic.h" 30 #include "llvm/Analysis/ConstantFolding.h" 31 #include "llvm/Analysis/DomTreeUpdater.h" 32 #include "llvm/Analysis/GlobalsModRef.h" 33 #include "llvm/Analysis/InstructionSimplify.h" 34 #include "llvm/Analysis/TargetLibraryInfo.h" 35 #include "llvm/Analysis/ValueLattice.h" 36 #include "llvm/Analysis/ValueLatticeUtils.h" 37 #include "llvm/Analysis/ValueTracking.h" 38 #include "llvm/IR/BasicBlock.h" 39 #include "llvm/IR/Constant.h" 40 #include "llvm/IR/Constants.h" 41 #include "llvm/IR/DataLayout.h" 42 #include "llvm/IR/DerivedTypes.h" 43 #include "llvm/IR/Function.h" 44 #include "llvm/IR/GlobalVariable.h" 45 #include "llvm/IR/InstVisitor.h" 46 #include "llvm/IR/InstrTypes.h" 47 #include "llvm/IR/Instruction.h" 48 #include "llvm/IR/Instructions.h" 49 #include "llvm/IR/Module.h" 50 #include "llvm/IR/PassManager.h" 51 #include "llvm/IR/Type.h" 52 #include "llvm/IR/User.h" 53 #include "llvm/IR/Value.h" 54 #include "llvm/InitializePasses.h" 55 #include "llvm/Pass.h" 56 #include "llvm/Support/Casting.h" 57 #include "llvm/Support/Debug.h" 58 #include "llvm/Support/ErrorHandling.h" 59 #include "llvm/Support/raw_ostream.h" 60 #include "llvm/Transforms/Scalar.h" 61 #include "llvm/Transforms/Utils/Local.h" 62 #include "llvm/Transforms/Utils/PredicateInfo.h" 63 #include <cassert> 64 #include <utility> 65 #include <vector> 66 67 using namespace llvm; 68 69 #define DEBUG_TYPE "sccp" 70 71 STATISTIC(NumInstRemoved, "Number of instructions removed"); 72 STATISTIC(NumDeadBlocks , "Number of basic blocks unreachable"); 73 STATISTIC(NumInstReplaced, 74 "Number of instructions replaced with (simpler) instruction"); 75 76 STATISTIC(IPNumInstRemoved, "Number of instructions removed by IPSCCP"); 77 STATISTIC(IPNumArgsElimed ,"Number of arguments constant propagated by IPSCCP"); 78 STATISTIC(IPNumGlobalConst, "Number of globals found to be constant by IPSCCP"); 79 STATISTIC( 80 IPNumInstReplaced, 81 "Number of instructions replaced with (simpler) instruction by IPSCCP"); 82 83 // Helper to check if \p LV is either a constant or a constant 84 // range with a single element. This should cover exactly the same cases as the 85 // old ValueLatticeElement::isConstant() and is intended to be used in the 86 // transition to ValueLatticeElement. 87 static bool isConstant(const ValueLatticeElement &LV) { 88 return LV.isConstant() || 89 (LV.isConstantRange() && LV.getConstantRange().isSingleElement()); 90 } 91 92 // Helper to check if \p LV is either overdefined or a constant range with more 93 // than a single element. This should cover exactly the same cases as the old 94 // ValueLatticeElement::isOverdefined() and is intended to be used in the 95 // transition to ValueLatticeElement. 96 static bool isOverdefined(const ValueLatticeElement &LV) { 97 return !LV.isUnknownOrUndef() && !isConstant(LV); 98 } 99 100 101 102 103 static bool tryToReplaceWithConstant(SCCPSolver &Solver, Value *V) { 104 Constant *Const = nullptr; 105 if (V->getType()->isStructTy()) { 106 std::vector<ValueLatticeElement> IVs = Solver.getStructLatticeValueFor(V); 107 if (any_of(IVs, 108 [](const ValueLatticeElement &LV) { return isOverdefined(LV); })) 109 return false; 110 std::vector<Constant *> ConstVals; 111 auto *ST = cast<StructType>(V->getType()); 112 for (unsigned i = 0, e = ST->getNumElements(); i != e; ++i) { 113 ValueLatticeElement V = IVs[i]; 114 ConstVals.push_back(isConstant(V) 115 ? Solver.getConstant(V) 116 : UndefValue::get(ST->getElementType(i))); 117 } 118 Const = ConstantStruct::get(ST, ConstVals); 119 } else { 120 const ValueLatticeElement &IV = Solver.getLatticeValueFor(V); 121 if (isOverdefined(IV)) 122 return false; 123 124 Const = 125 isConstant(IV) ? Solver.getConstant(IV) : UndefValue::get(V->getType()); 126 } 127 assert(Const && "Constant is nullptr here!"); 128 129 // Replacing `musttail` instructions with constant breaks `musttail` invariant 130 // unless the call itself can be removed. 131 // Calls with "clang.arc.attachedcall" implicitly use the return value and 132 // those uses cannot be updated with a constant. 133 CallBase *CB = dyn_cast<CallBase>(V); 134 if (CB && ((CB->isMustTailCall() && !CB->isSafeToRemove()) || 135 CB->getOperandBundle(LLVMContext::OB_clang_arc_attachedcall))) { 136 Function *F = CB->getCalledFunction(); 137 138 // Don't zap returns of the callee 139 if (F) 140 Solver.addToMustPreserveReturnsInFunctions(F); 141 142 LLVM_DEBUG(dbgs() << " Can\'t treat the result of call " << *CB 143 << " as a constant\n"); 144 return false; 145 } 146 147 LLVM_DEBUG(dbgs() << " Constant: " << *Const << " = " << *V << '\n'); 148 149 // Replaces all of the uses of a variable with uses of the constant. 150 V->replaceAllUsesWith(Const); 151 return true; 152 } 153 154 static bool simplifyInstsInBlock(SCCPSolver &Solver, BasicBlock &BB, 155 SmallPtrSetImpl<Value *> &InsertedValues, 156 Statistic &InstRemovedStat, 157 Statistic &InstReplacedStat) { 158 bool MadeChanges = false; 159 for (Instruction &Inst : make_early_inc_range(BB)) { 160 if (Inst.getType()->isVoidTy()) 161 continue; 162 if (tryToReplaceWithConstant(Solver, &Inst)) { 163 if (Inst.isSafeToRemove()) 164 Inst.eraseFromParent(); 165 // Hey, we just changed something! 166 MadeChanges = true; 167 ++InstRemovedStat; 168 } else if (isa<SExtInst>(&Inst)) { 169 Value *ExtOp = Inst.getOperand(0); 170 if (isa<Constant>(ExtOp) || InsertedValues.count(ExtOp)) 171 continue; 172 const ValueLatticeElement &IV = Solver.getLatticeValueFor(ExtOp); 173 if (!IV.isConstantRange(/*UndefAllowed=*/false)) 174 continue; 175 if (IV.getConstantRange().isAllNonNegative()) { 176 auto *ZExt = new ZExtInst(ExtOp, Inst.getType(), "", &Inst); 177 InsertedValues.insert(ZExt); 178 Inst.replaceAllUsesWith(ZExt); 179 Solver.removeLatticeValueFor(&Inst); 180 Inst.eraseFromParent(); 181 InstReplacedStat++; 182 MadeChanges = true; 183 } 184 } 185 } 186 return MadeChanges; 187 } 188 189 // runSCCP() - Run the Sparse Conditional Constant Propagation algorithm, 190 // and return true if the function was modified. 191 static bool runSCCP(Function &F, const DataLayout &DL, 192 const TargetLibraryInfo *TLI) { 193 LLVM_DEBUG(dbgs() << "SCCP on function '" << F.getName() << "'\n"); 194 SCCPSolver Solver( 195 DL, [TLI](Function &F) -> const TargetLibraryInfo & { return *TLI; }, 196 F.getContext()); 197 198 // Mark the first block of the function as being executable. 199 Solver.markBlockExecutable(&F.front()); 200 201 // Mark all arguments to the function as being overdefined. 202 for (Argument &AI : F.args()) 203 Solver.markOverdefined(&AI); 204 205 // Solve for constants. 206 bool ResolvedUndefs = true; 207 while (ResolvedUndefs) { 208 Solver.solve(); 209 LLVM_DEBUG(dbgs() << "RESOLVING UNDEFs\n"); 210 ResolvedUndefs = Solver.resolvedUndefsIn(F); 211 } 212 213 bool MadeChanges = false; 214 215 // If we decided that there are basic blocks that are dead in this function, 216 // delete their contents now. Note that we cannot actually delete the blocks, 217 // as we cannot modify the CFG of the function. 218 219 SmallPtrSet<Value *, 32> InsertedValues; 220 for (BasicBlock &BB : F) { 221 if (!Solver.isBlockExecutable(&BB)) { 222 LLVM_DEBUG(dbgs() << " BasicBlock Dead:" << BB); 223 224 ++NumDeadBlocks; 225 NumInstRemoved += removeAllNonTerminatorAndEHPadInstructions(&BB).first; 226 227 MadeChanges = true; 228 continue; 229 } 230 231 MadeChanges |= simplifyInstsInBlock(Solver, BB, InsertedValues, 232 NumInstRemoved, NumInstReplaced); 233 } 234 235 return MadeChanges; 236 } 237 238 PreservedAnalyses SCCPPass::run(Function &F, FunctionAnalysisManager &AM) { 239 const DataLayout &DL = F.getParent()->getDataLayout(); 240 auto &TLI = AM.getResult<TargetLibraryAnalysis>(F); 241 if (!runSCCP(F, DL, &TLI)) 242 return PreservedAnalyses::all(); 243 244 auto PA = PreservedAnalyses(); 245 PA.preserve<GlobalsAA>(); 246 PA.preserveSet<CFGAnalyses>(); 247 return PA; 248 } 249 250 namespace { 251 252 //===--------------------------------------------------------------------===// 253 // 254 /// SCCP Class - This class uses the SCCPSolver to implement a per-function 255 /// Sparse Conditional Constant Propagator. 256 /// 257 class SCCPLegacyPass : public FunctionPass { 258 public: 259 // Pass identification, replacement for typeid 260 static char ID; 261 262 SCCPLegacyPass() : FunctionPass(ID) { 263 initializeSCCPLegacyPassPass(*PassRegistry::getPassRegistry()); 264 } 265 266 void getAnalysisUsage(AnalysisUsage &AU) const override { 267 AU.addRequired<TargetLibraryInfoWrapperPass>(); 268 AU.addPreserved<GlobalsAAWrapperPass>(); 269 AU.setPreservesCFG(); 270 } 271 272 // runOnFunction - Run the Sparse Conditional Constant Propagation 273 // algorithm, and return true if the function was modified. 274 bool runOnFunction(Function &F) override { 275 if (skipFunction(F)) 276 return false; 277 const DataLayout &DL = F.getParent()->getDataLayout(); 278 const TargetLibraryInfo *TLI = 279 &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F); 280 return runSCCP(F, DL, TLI); 281 } 282 }; 283 284 } // end anonymous namespace 285 286 char SCCPLegacyPass::ID = 0; 287 288 INITIALIZE_PASS_BEGIN(SCCPLegacyPass, "sccp", 289 "Sparse Conditional Constant Propagation", false, false) 290 INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) 291 INITIALIZE_PASS_END(SCCPLegacyPass, "sccp", 292 "Sparse Conditional Constant Propagation", false, false) 293 294 // createSCCPPass - This is the public interface to this file. 295 FunctionPass *llvm::createSCCPPass() { return new SCCPLegacyPass(); } 296 297 static void findReturnsToZap(Function &F, 298 SmallVector<ReturnInst *, 8> &ReturnsToZap, 299 SCCPSolver &Solver) { 300 // We can only do this if we know that nothing else can call the function. 301 if (!Solver.isArgumentTrackedFunction(&F)) 302 return; 303 304 if (Solver.mustPreserveReturn(&F)) { 305 LLVM_DEBUG( 306 dbgs() 307 << "Can't zap returns of the function : " << F.getName() 308 << " due to present musttail or \"clang.arc.attachedcall\" call of " 309 "it\n"); 310 return; 311 } 312 313 assert( 314 all_of(F.users(), 315 [&Solver](User *U) { 316 if (isa<Instruction>(U) && 317 !Solver.isBlockExecutable(cast<Instruction>(U)->getParent())) 318 return true; 319 // Non-callsite uses are not impacted by zapping. Also, constant 320 // uses (like blockaddresses) could stuck around, without being 321 // used in the underlying IR, meaning we do not have lattice 322 // values for them. 323 if (!isa<CallBase>(U)) 324 return true; 325 if (U->getType()->isStructTy()) { 326 return all_of(Solver.getStructLatticeValueFor(U), 327 [](const ValueLatticeElement &LV) { 328 return !isOverdefined(LV); 329 }); 330 } 331 return !isOverdefined(Solver.getLatticeValueFor(U)); 332 }) && 333 "We can only zap functions where all live users have a concrete value"); 334 335 for (BasicBlock &BB : F) { 336 if (CallInst *CI = BB.getTerminatingMustTailCall()) { 337 LLVM_DEBUG(dbgs() << "Can't zap return of the block due to present " 338 << "musttail call : " << *CI << "\n"); 339 (void)CI; 340 return; 341 } 342 343 if (auto *RI = dyn_cast<ReturnInst>(BB.getTerminator())) 344 if (!isa<UndefValue>(RI->getOperand(0))) 345 ReturnsToZap.push_back(RI); 346 } 347 } 348 349 static bool removeNonFeasibleEdges(const SCCPSolver &Solver, BasicBlock *BB, 350 DomTreeUpdater &DTU) { 351 SmallPtrSet<BasicBlock *, 8> FeasibleSuccessors; 352 bool HasNonFeasibleEdges = false; 353 for (BasicBlock *Succ : successors(BB)) { 354 if (Solver.isEdgeFeasible(BB, Succ)) 355 FeasibleSuccessors.insert(Succ); 356 else 357 HasNonFeasibleEdges = true; 358 } 359 360 // All edges feasible, nothing to do. 361 if (!HasNonFeasibleEdges) 362 return false; 363 364 // SCCP can only determine non-feasible edges for br, switch and indirectbr. 365 Instruction *TI = BB->getTerminator(); 366 assert((isa<BranchInst>(TI) || isa<SwitchInst>(TI) || 367 isa<IndirectBrInst>(TI)) && 368 "Terminator must be a br, switch or indirectbr"); 369 370 if (FeasibleSuccessors.size() == 1) { 371 // Replace with an unconditional branch to the only feasible successor. 372 BasicBlock *OnlyFeasibleSuccessor = *FeasibleSuccessors.begin(); 373 SmallVector<DominatorTree::UpdateType, 8> Updates; 374 bool HaveSeenOnlyFeasibleSuccessor = false; 375 for (BasicBlock *Succ : successors(BB)) { 376 if (Succ == OnlyFeasibleSuccessor && !HaveSeenOnlyFeasibleSuccessor) { 377 // Don't remove the edge to the only feasible successor the first time 378 // we see it. We still do need to remove any multi-edges to it though. 379 HaveSeenOnlyFeasibleSuccessor = true; 380 continue; 381 } 382 383 Succ->removePredecessor(BB); 384 Updates.push_back({DominatorTree::Delete, BB, Succ}); 385 } 386 387 BranchInst::Create(OnlyFeasibleSuccessor, BB); 388 TI->eraseFromParent(); 389 DTU.applyUpdatesPermissive(Updates); 390 } else if (FeasibleSuccessors.size() > 1) { 391 SwitchInstProfUpdateWrapper SI(*cast<SwitchInst>(TI)); 392 SmallVector<DominatorTree::UpdateType, 8> Updates; 393 for (auto CI = SI->case_begin(); CI != SI->case_end();) { 394 if (FeasibleSuccessors.contains(CI->getCaseSuccessor())) { 395 ++CI; 396 continue; 397 } 398 399 BasicBlock *Succ = CI->getCaseSuccessor(); 400 Succ->removePredecessor(BB); 401 Updates.push_back({DominatorTree::Delete, BB, Succ}); 402 SI.removeCase(CI); 403 // Don't increment CI, as we removed a case. 404 } 405 406 DTU.applyUpdatesPermissive(Updates); 407 } else { 408 llvm_unreachable("Must have at least one feasible successor"); 409 } 410 return true; 411 } 412 413 bool llvm::runIPSCCP( 414 Module &M, const DataLayout &DL, 415 std::function<const TargetLibraryInfo &(Function &)> GetTLI, 416 function_ref<AnalysisResultsForFn(Function &)> getAnalysis) { 417 SCCPSolver Solver(DL, GetTLI, M.getContext()); 418 419 // Loop over all functions, marking arguments to those with their addresses 420 // taken or that are external as overdefined. 421 for (Function &F : M) { 422 if (F.isDeclaration()) 423 continue; 424 425 Solver.addAnalysis(F, getAnalysis(F)); 426 427 // Determine if we can track the function's return values. If so, add the 428 // function to the solver's set of return-tracked functions. 429 if (canTrackReturnsInterprocedurally(&F)) 430 Solver.addTrackedFunction(&F); 431 432 // Determine if we can track the function's arguments. If so, add the 433 // function to the solver's set of argument-tracked functions. 434 if (canTrackArgumentsInterprocedurally(&F)) { 435 Solver.addArgumentTrackedFunction(&F); 436 continue; 437 } 438 439 // Assume the function is called. 440 Solver.markBlockExecutable(&F.front()); 441 442 // Assume nothing about the incoming arguments. 443 for (Argument &AI : F.args()) 444 Solver.markOverdefined(&AI); 445 } 446 447 // Determine if we can track any of the module's global variables. If so, add 448 // the global variables we can track to the solver's set of tracked global 449 // variables. 450 for (GlobalVariable &G : M.globals()) { 451 G.removeDeadConstantUsers(); 452 if (canTrackGlobalVariableInterprocedurally(&G)) 453 Solver.trackValueOfGlobalVariable(&G); 454 } 455 456 // Solve for constants. 457 bool ResolvedUndefs = true; 458 Solver.solve(); 459 while (ResolvedUndefs) { 460 LLVM_DEBUG(dbgs() << "RESOLVING UNDEFS\n"); 461 ResolvedUndefs = false; 462 for (Function &F : M) { 463 if (Solver.resolvedUndefsIn(F)) 464 ResolvedUndefs = true; 465 } 466 if (ResolvedUndefs) 467 Solver.solve(); 468 } 469 470 bool MadeChanges = false; 471 472 // Iterate over all of the instructions in the module, replacing them with 473 // constants if we have found them to be of constant values. 474 475 for (Function &F : M) { 476 if (F.isDeclaration()) 477 continue; 478 479 SmallVector<BasicBlock *, 512> BlocksToErase; 480 481 if (Solver.isBlockExecutable(&F.front())) { 482 bool ReplacedPointerArg = false; 483 for (Argument &Arg : F.args()) { 484 if (!Arg.use_empty() && tryToReplaceWithConstant(Solver, &Arg)) { 485 ReplacedPointerArg |= Arg.getType()->isPointerTy(); 486 ++IPNumArgsElimed; 487 } 488 } 489 490 // If we replaced an argument, the argmemonly and 491 // inaccessiblemem_or_argmemonly attributes do not hold any longer. Remove 492 // them from both the function and callsites. 493 if (ReplacedPointerArg) { 494 AttrBuilder AttributesToRemove; 495 AttributesToRemove.addAttribute(Attribute::ArgMemOnly); 496 AttributesToRemove.addAttribute(Attribute::InaccessibleMemOrArgMemOnly); 497 F.removeAttributes(AttributeList::FunctionIndex, AttributesToRemove); 498 499 for (User *U : F.users()) { 500 auto *CB = dyn_cast<CallBase>(U); 501 if (!CB || CB->getCalledFunction() != &F) 502 continue; 503 504 CB->removeAttributes(AttributeList::FunctionIndex, 505 AttributesToRemove); 506 } 507 } 508 } 509 510 SmallPtrSet<Value *, 32> InsertedValues; 511 for (BasicBlock &BB : F) { 512 if (!Solver.isBlockExecutable(&BB)) { 513 LLVM_DEBUG(dbgs() << " BasicBlock Dead:" << BB); 514 ++NumDeadBlocks; 515 516 MadeChanges = true; 517 518 if (&BB != &F.front()) 519 BlocksToErase.push_back(&BB); 520 continue; 521 } 522 523 MadeChanges |= simplifyInstsInBlock(Solver, BB, InsertedValues, 524 IPNumInstRemoved, IPNumInstReplaced); 525 } 526 527 DomTreeUpdater DTU = Solver.getDTU(F); 528 // Change dead blocks to unreachable. We do it after replacing constants 529 // in all executable blocks, because changeToUnreachable may remove PHI 530 // nodes in executable blocks we found values for. The function's entry 531 // block is not part of BlocksToErase, so we have to handle it separately. 532 for (BasicBlock *BB : BlocksToErase) { 533 NumInstRemoved += 534 changeToUnreachable(BB->getFirstNonPHI(), /*UseLLVMTrap=*/false, 535 /*PreserveLCSSA=*/false, &DTU); 536 } 537 if (!Solver.isBlockExecutable(&F.front())) 538 NumInstRemoved += changeToUnreachable(F.front().getFirstNonPHI(), 539 /*UseLLVMTrap=*/false, 540 /*PreserveLCSSA=*/false, &DTU); 541 542 for (BasicBlock &BB : F) 543 MadeChanges |= removeNonFeasibleEdges(Solver, &BB, DTU); 544 545 for (BasicBlock *DeadBB : BlocksToErase) 546 DTU.deleteBB(DeadBB); 547 548 for (BasicBlock &BB : F) { 549 for (BasicBlock::iterator BI = BB.begin(), E = BB.end(); BI != E;) { 550 Instruction *Inst = &*BI++; 551 if (Solver.getPredicateInfoFor(Inst)) { 552 if (auto *II = dyn_cast<IntrinsicInst>(Inst)) { 553 if (II->getIntrinsicID() == Intrinsic::ssa_copy) { 554 Value *Op = II->getOperand(0); 555 Inst->replaceAllUsesWith(Op); 556 Inst->eraseFromParent(); 557 } 558 } 559 } 560 } 561 } 562 } 563 564 // If we inferred constant or undef return values for a function, we replaced 565 // all call uses with the inferred value. This means we don't need to bother 566 // actually returning anything from the function. Replace all return 567 // instructions with return undef. 568 // 569 // Do this in two stages: first identify the functions we should process, then 570 // actually zap their returns. This is important because we can only do this 571 // if the address of the function isn't taken. In cases where a return is the 572 // last use of a function, the order of processing functions would affect 573 // whether other functions are optimizable. 574 SmallVector<ReturnInst*, 8> ReturnsToZap; 575 576 for (const auto &I : Solver.getTrackedRetVals()) { 577 Function *F = I.first; 578 const ValueLatticeElement &ReturnValue = I.second; 579 580 // If there is a known constant range for the return value, add !range 581 // metadata to the function's call sites. 582 if (ReturnValue.isConstantRange() && 583 !ReturnValue.getConstantRange().isSingleElement()) { 584 // Do not add range metadata if the return value may include undef. 585 if (ReturnValue.isConstantRangeIncludingUndef()) 586 continue; 587 588 auto &CR = ReturnValue.getConstantRange(); 589 for (User *User : F->users()) { 590 auto *CB = dyn_cast<CallBase>(User); 591 if (!CB || CB->getCalledFunction() != F) 592 continue; 593 594 // Limit to cases where the return value is guaranteed to be neither 595 // poison nor undef. Poison will be outside any range and currently 596 // values outside of the specified range cause immediate undefined 597 // behavior. 598 if (!isGuaranteedNotToBeUndefOrPoison(CB, nullptr, CB)) 599 continue; 600 601 // Do not touch existing metadata for now. 602 // TODO: We should be able to take the intersection of the existing 603 // metadata and the inferred range. 604 if (CB->getMetadata(LLVMContext::MD_range)) 605 continue; 606 607 LLVMContext &Context = CB->getParent()->getContext(); 608 Metadata *RangeMD[] = { 609 ConstantAsMetadata::get(ConstantInt::get(Context, CR.getLower())), 610 ConstantAsMetadata::get(ConstantInt::get(Context, CR.getUpper()))}; 611 CB->setMetadata(LLVMContext::MD_range, MDNode::get(Context, RangeMD)); 612 } 613 continue; 614 } 615 if (F->getReturnType()->isVoidTy()) 616 continue; 617 if (isConstant(ReturnValue) || ReturnValue.isUnknownOrUndef()) 618 findReturnsToZap(*F, ReturnsToZap, Solver); 619 } 620 621 for (auto F : Solver.getMRVFunctionsTracked()) { 622 assert(F->getReturnType()->isStructTy() && 623 "The return type should be a struct"); 624 StructType *STy = cast<StructType>(F->getReturnType()); 625 if (Solver.isStructLatticeConstant(F, STy)) 626 findReturnsToZap(*F, ReturnsToZap, Solver); 627 } 628 629 // Zap all returns which we've identified as zap to change. 630 SmallSetVector<Function *, 8> FuncZappedReturn; 631 for (unsigned i = 0, e = ReturnsToZap.size(); i != e; ++i) { 632 Function *F = ReturnsToZap[i]->getParent()->getParent(); 633 ReturnsToZap[i]->setOperand(0, UndefValue::get(F->getReturnType())); 634 // Record all functions that are zapped. 635 FuncZappedReturn.insert(F); 636 } 637 638 // Remove the returned attribute for zapped functions and the 639 // corresponding call sites. 640 for (Function *F : FuncZappedReturn) { 641 for (Argument &A : F->args()) 642 F->removeParamAttr(A.getArgNo(), Attribute::Returned); 643 for (Use &U : F->uses()) { 644 // Skip over blockaddr users. 645 if (isa<BlockAddress>(U.getUser())) 646 continue; 647 CallBase *CB = cast<CallBase>(U.getUser()); 648 for (Use &Arg : CB->args()) 649 CB->removeParamAttr(CB->getArgOperandNo(&Arg), Attribute::Returned); 650 } 651 } 652 653 // If we inferred constant or undef values for globals variables, we can 654 // delete the global and any stores that remain to it. 655 for (auto &I : make_early_inc_range(Solver.getTrackedGlobals())) { 656 GlobalVariable *GV = I.first; 657 if (isOverdefined(I.second)) 658 continue; 659 LLVM_DEBUG(dbgs() << "Found that GV '" << GV->getName() 660 << "' is constant!\n"); 661 while (!GV->use_empty()) { 662 StoreInst *SI = cast<StoreInst>(GV->user_back()); 663 SI->eraseFromParent(); 664 MadeChanges = true; 665 } 666 M.getGlobalList().erase(GV); 667 ++IPNumGlobalConst; 668 } 669 670 return MadeChanges; 671 } 672