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