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