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