1 //===- AttributorAttributes.cpp - Attributes for Attributor deduction -----===//
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 // See the Attributor.h file comment and the class descriptions in that file for
10 // more information.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "llvm/Transforms/IPO/Attributor.h"
15 
16 #include "llvm/ADT/APInt.h"
17 #include "llvm/ADT/MapVector.h"
18 #include "llvm/ADT/SCCIterator.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/ADT/SetOperations.h"
21 #include "llvm/ADT/SetVector.h"
22 #include "llvm/ADT/SmallPtrSet.h"
23 #include "llvm/ADT/Statistic.h"
24 #include "llvm/Analysis/AliasAnalysis.h"
25 #include "llvm/Analysis/AssumeBundleQueries.h"
26 #include "llvm/Analysis/AssumptionCache.h"
27 #include "llvm/Analysis/CaptureTracking.h"
28 #include "llvm/Analysis/InstructionSimplify.h"
29 #include "llvm/Analysis/LazyValueInfo.h"
30 #include "llvm/Analysis/MemoryBuiltins.h"
31 #include "llvm/Analysis/OptimizationRemarkEmitter.h"
32 #include "llvm/Analysis/ScalarEvolution.h"
33 #include "llvm/Analysis/TargetTransformInfo.h"
34 #include "llvm/Analysis/ValueTracking.h"
35 #include "llvm/IR/Argument.h"
36 #include "llvm/IR/Assumptions.h"
37 #include "llvm/IR/Constants.h"
38 #include "llvm/IR/DataLayout.h"
39 #include "llvm/IR/GlobalValue.h"
40 #include "llvm/IR/IRBuilder.h"
41 #include "llvm/IR/Instruction.h"
42 #include "llvm/IR/Instructions.h"
43 #include "llvm/IR/IntrinsicInst.h"
44 #include "llvm/IR/NoFolder.h"
45 #include "llvm/IR/Value.h"
46 #include "llvm/IR/ValueHandle.h"
47 #include "llvm/Support/Alignment.h"
48 #include "llvm/Support/Casting.h"
49 #include "llvm/Support/CommandLine.h"
50 #include "llvm/Support/ErrorHandling.h"
51 #include "llvm/Support/GraphWriter.h"
52 #include "llvm/Support/MathExtras.h"
53 #include "llvm/Support/raw_ostream.h"
54 #include "llvm/Transforms/IPO/ArgumentPromotion.h"
55 #include "llvm/Transforms/Utils/Local.h"
56 #include "llvm/Transforms/Utils/ValueMapper.h"
57 #include <cassert>
58 
59 using namespace llvm;
60 
61 #define DEBUG_TYPE "attributor"
62 
63 static cl::opt<bool> ManifestInternal(
64     "attributor-manifest-internal", cl::Hidden,
65     cl::desc("Manifest Attributor internal string attributes."),
66     cl::init(false));
67 
68 static cl::opt<int> MaxHeapToStackSize("max-heap-to-stack-size", cl::init(128),
69                                        cl::Hidden);
70 
71 template <>
72 unsigned llvm::PotentialConstantIntValuesState::MaxPotentialValues = 0;
73 
74 static cl::opt<unsigned, true> MaxPotentialValues(
75     "attributor-max-potential-values", cl::Hidden,
76     cl::desc("Maximum number of potential values to be "
77              "tracked for each position."),
78     cl::location(llvm::PotentialConstantIntValuesState::MaxPotentialValues),
79     cl::init(7));
80 
81 static cl::opt<unsigned> MaxInterferingAccesses(
82     "attributor-max-interfering-accesses", cl::Hidden,
83     cl::desc("Maximum number of interfering accesses to "
84              "check before assuming all might interfere."),
85     cl::init(6));
86 
87 STATISTIC(NumAAs, "Number of abstract attributes created");
88 
89 // Some helper macros to deal with statistics tracking.
90 //
91 // Usage:
92 // For simple IR attribute tracking overload trackStatistics in the abstract
93 // attribute and choose the right STATS_DECLTRACK_********* macro,
94 // e.g.,:
95 //  void trackStatistics() const override {
96 //    STATS_DECLTRACK_ARG_ATTR(returned)
97 //  }
98 // If there is a single "increment" side one can use the macro
99 // STATS_DECLTRACK with a custom message. If there are multiple increment
100 // sides, STATS_DECL and STATS_TRACK can also be used separately.
101 //
102 #define BUILD_STAT_MSG_IR_ATTR(TYPE, NAME)                                     \
103   ("Number of " #TYPE " marked '" #NAME "'")
104 #define BUILD_STAT_NAME(NAME, TYPE) NumIR##TYPE##_##NAME
105 #define STATS_DECL_(NAME, MSG) STATISTIC(NAME, MSG);
106 #define STATS_DECL(NAME, TYPE, MSG)                                            \
107   STATS_DECL_(BUILD_STAT_NAME(NAME, TYPE), MSG);
108 #define STATS_TRACK(NAME, TYPE) ++(BUILD_STAT_NAME(NAME, TYPE));
109 #define STATS_DECLTRACK(NAME, TYPE, MSG)                                       \
110   {                                                                            \
111     STATS_DECL(NAME, TYPE, MSG)                                                \
112     STATS_TRACK(NAME, TYPE)                                                    \
113   }
114 #define STATS_DECLTRACK_ARG_ATTR(NAME)                                         \
115   STATS_DECLTRACK(NAME, Arguments, BUILD_STAT_MSG_IR_ATTR(arguments, NAME))
116 #define STATS_DECLTRACK_CSARG_ATTR(NAME)                                       \
117   STATS_DECLTRACK(NAME, CSArguments,                                           \
118                   BUILD_STAT_MSG_IR_ATTR(call site arguments, NAME))
119 #define STATS_DECLTRACK_FN_ATTR(NAME)                                          \
120   STATS_DECLTRACK(NAME, Function, BUILD_STAT_MSG_IR_ATTR(functions, NAME))
121 #define STATS_DECLTRACK_CS_ATTR(NAME)                                          \
122   STATS_DECLTRACK(NAME, CS, BUILD_STAT_MSG_IR_ATTR(call site, NAME))
123 #define STATS_DECLTRACK_FNRET_ATTR(NAME)                                       \
124   STATS_DECLTRACK(NAME, FunctionReturn,                                        \
125                   BUILD_STAT_MSG_IR_ATTR(function returns, NAME))
126 #define STATS_DECLTRACK_CSRET_ATTR(NAME)                                       \
127   STATS_DECLTRACK(NAME, CSReturn,                                              \
128                   BUILD_STAT_MSG_IR_ATTR(call site returns, NAME))
129 #define STATS_DECLTRACK_FLOATING_ATTR(NAME)                                    \
130   STATS_DECLTRACK(NAME, Floating,                                              \
131                   ("Number of floating values known to be '" #NAME "'"))
132 
133 // Specialization of the operator<< for abstract attributes subclasses. This
134 // disambiguates situations where multiple operators are applicable.
135 namespace llvm {
136 #define PIPE_OPERATOR(CLASS)                                                   \
137   raw_ostream &operator<<(raw_ostream &OS, const CLASS &AA) {                  \
138     return OS << static_cast<const AbstractAttribute &>(AA);                   \
139   }
140 
141 PIPE_OPERATOR(AAIsDead)
142 PIPE_OPERATOR(AANoUnwind)
143 PIPE_OPERATOR(AANoSync)
144 PIPE_OPERATOR(AANoRecurse)
145 PIPE_OPERATOR(AAWillReturn)
146 PIPE_OPERATOR(AANoReturn)
147 PIPE_OPERATOR(AAReturnedValues)
148 PIPE_OPERATOR(AANonNull)
149 PIPE_OPERATOR(AANoAlias)
150 PIPE_OPERATOR(AADereferenceable)
151 PIPE_OPERATOR(AAAlign)
152 PIPE_OPERATOR(AAInstanceInfo)
153 PIPE_OPERATOR(AANoCapture)
154 PIPE_OPERATOR(AAValueSimplify)
155 PIPE_OPERATOR(AANoFree)
156 PIPE_OPERATOR(AAHeapToStack)
157 PIPE_OPERATOR(AAReachability)
158 PIPE_OPERATOR(AAMemoryBehavior)
159 PIPE_OPERATOR(AAMemoryLocation)
160 PIPE_OPERATOR(AAValueConstantRange)
161 PIPE_OPERATOR(AAPrivatizablePtr)
162 PIPE_OPERATOR(AAUndefinedBehavior)
163 PIPE_OPERATOR(AAPotentialConstantValues)
164 PIPE_OPERATOR(AANoUndef)
165 PIPE_OPERATOR(AACallEdges)
166 PIPE_OPERATOR(AAFunctionReachability)
167 PIPE_OPERATOR(AAPointerInfo)
168 PIPE_OPERATOR(AAAssumptionInfo)
169 
170 #undef PIPE_OPERATOR
171 
172 template <>
173 ChangeStatus clampStateAndIndicateChange<DerefState>(DerefState &S,
174                                                      const DerefState &R) {
175   ChangeStatus CS0 =
176       clampStateAndIndicateChange(S.DerefBytesState, R.DerefBytesState);
177   ChangeStatus CS1 = clampStateAndIndicateChange(S.GlobalState, R.GlobalState);
178   return CS0 | CS1;
179 }
180 
181 } // namespace llvm
182 
183 /// Get pointer operand of memory accessing instruction. If \p I is
184 /// not a memory accessing instruction, return nullptr. If \p AllowVolatile,
185 /// is set to false and the instruction is volatile, return nullptr.
186 static const Value *getPointerOperand(const Instruction *I,
187                                       bool AllowVolatile) {
188   if (!AllowVolatile && I->isVolatile())
189     return nullptr;
190 
191   if (auto *LI = dyn_cast<LoadInst>(I)) {
192     return LI->getPointerOperand();
193   }
194 
195   if (auto *SI = dyn_cast<StoreInst>(I)) {
196     return SI->getPointerOperand();
197   }
198 
199   if (auto *CXI = dyn_cast<AtomicCmpXchgInst>(I)) {
200     return CXI->getPointerOperand();
201   }
202 
203   if (auto *RMWI = dyn_cast<AtomicRMWInst>(I)) {
204     return RMWI->getPointerOperand();
205   }
206 
207   return nullptr;
208 }
209 
210 /// Helper function to create a pointer of type \p ResTy, based on \p Ptr, and
211 /// advanced by \p Offset bytes. To aid later analysis the method tries to build
212 /// getelement pointer instructions that traverse the natural type of \p Ptr if
213 /// possible. If that fails, the remaining offset is adjusted byte-wise, hence
214 /// through a cast to i8*.
215 ///
216 /// TODO: This could probably live somewhere more prominantly if it doesn't
217 ///       already exist.
218 static Value *constructPointer(Type *ResTy, Type *PtrElemTy, Value *Ptr,
219                                int64_t Offset, IRBuilder<NoFolder> &IRB,
220                                const DataLayout &DL) {
221   assert(Offset >= 0 && "Negative offset not supported yet!");
222   LLVM_DEBUG(dbgs() << "Construct pointer: " << *Ptr << " + " << Offset
223                     << "-bytes as " << *ResTy << "\n");
224 
225   if (Offset) {
226     Type *Ty = PtrElemTy;
227     APInt IntOffset(DL.getIndexTypeSizeInBits(Ptr->getType()), Offset);
228     SmallVector<APInt> IntIndices = DL.getGEPIndicesForOffset(Ty, IntOffset);
229 
230     SmallVector<Value *, 4> ValIndices;
231     std::string GEPName = Ptr->getName().str();
232     for (const APInt &Index : IntIndices) {
233       ValIndices.push_back(IRB.getInt(Index));
234       GEPName += "." + std::to_string(Index.getZExtValue());
235     }
236 
237     // Create a GEP for the indices collected above.
238     Ptr = IRB.CreateGEP(PtrElemTy, Ptr, ValIndices, GEPName);
239 
240     // If an offset is left we use byte-wise adjustment.
241     if (IntOffset != 0) {
242       Ptr = IRB.CreateBitCast(Ptr, IRB.getInt8PtrTy());
243       Ptr = IRB.CreateGEP(IRB.getInt8Ty(), Ptr, IRB.getInt(IntOffset),
244                           GEPName + ".b" + Twine(IntOffset.getZExtValue()));
245     }
246   }
247 
248   // Ensure the result has the requested type.
249   Ptr = IRB.CreatePointerBitCastOrAddrSpaceCast(Ptr, ResTy,
250                                                 Ptr->getName() + ".cast");
251 
252   LLVM_DEBUG(dbgs() << "Constructed pointer: " << *Ptr << "\n");
253   return Ptr;
254 }
255 
256 /// Recursively visit all values that might become \p IRP at some point. This
257 /// will be done by looking through cast instructions, selects, phis, and calls
258 /// with the "returned" attribute. Once we cannot look through the value any
259 /// further, the callback \p VisitValueCB is invoked and passed the current
260 /// value, the \p State, and a flag to indicate if we stripped anything.
261 /// Stripped means that we unpacked the value associated with \p IRP at least
262 /// once. Note that the value used for the callback may still be the value
263 /// associated with \p IRP (due to PHIs). To limit how much effort is invested,
264 /// we will never visit more values than specified by \p MaxValues.
265 /// If \p VS does not contain the Interprocedural bit, only values valid in the
266 /// scope of \p CtxI will be visited and simplification into other scopes is
267 /// prevented.
268 template <typename StateTy>
269 static bool genericValueTraversal(
270     Attributor &A, IRPosition IRP, const AbstractAttribute &QueryingAA,
271     StateTy &State,
272     function_ref<bool(Value &, const Instruction *, StateTy &, bool)>
273         VisitValueCB,
274     const Instruction *CtxI, bool &UsedAssumedInformation,
275     bool UseValueSimplify = true, int MaxValues = 16,
276     function_ref<Value *(Value *)> StripCB = nullptr,
277     AA::ValueScope VS = AA::Interprocedural) {
278 
279   struct LivenessInfo {
280     const AAIsDead *LivenessAA = nullptr;
281     bool AnyDead = false;
282   };
283   SmallMapVector<const Function *, LivenessInfo, 4> LivenessAAs;
284   auto GetLivenessInfo = [&](const Function &F) -> LivenessInfo & {
285     LivenessInfo &LI = LivenessAAs[&F];
286     if (!LI.LivenessAA)
287       LI.LivenessAA = &A.getAAFor<AAIsDead>(QueryingAA, IRPosition::function(F),
288                                             DepClassTy::NONE);
289     return LI;
290   };
291 
292   Value *InitialV = &IRP.getAssociatedValue();
293   using Item = std::pair<Value *, const Instruction *>;
294   SmallSet<Item, 16> Visited;
295   SmallVector<Item, 16> Worklist;
296   Worklist.push_back({InitialV, CtxI});
297 
298   int Iteration = 0;
299   do {
300     Item I = Worklist.pop_back_val();
301     Value *V = I.first;
302     CtxI = I.second;
303     if (StripCB)
304       V = StripCB(V);
305 
306     // Check if we should process the current value. To prevent endless
307     // recursion keep a record of the values we followed!
308     if (!Visited.insert(I).second)
309       continue;
310 
311     // Make sure we limit the compile time for complex expressions.
312     if (Iteration++ >= MaxValues) {
313       LLVM_DEBUG(dbgs() << "Generic value traversal reached iteration limit: "
314                         << Iteration << "!\n");
315       return false;
316     }
317 
318     // Explicitly look through calls with a "returned" attribute if we do
319     // not have a pointer as stripPointerCasts only works on them.
320     Value *NewV = nullptr;
321     if (V->getType()->isPointerTy()) {
322       NewV = V->stripPointerCasts();
323     } else {
324       auto *CB = dyn_cast<CallBase>(V);
325       if (CB && CB->getCalledFunction()) {
326         for (Argument &Arg : CB->getCalledFunction()->args())
327           if (Arg.hasReturnedAttr()) {
328             NewV = CB->getArgOperand(Arg.getArgNo());
329             break;
330           }
331       }
332     }
333     if (NewV && NewV != V) {
334       Worklist.push_back({NewV, CtxI});
335       continue;
336     }
337 
338     // Look through select instructions, visit assumed potential values.
339     if (auto *SI = dyn_cast<SelectInst>(V)) {
340       Optional<Constant *> C = A.getAssumedConstant(
341           *SI->getCondition(), QueryingAA, UsedAssumedInformation);
342       bool NoValueYet = !C.hasValue();
343       if (NoValueYet || isa_and_nonnull<UndefValue>(*C))
344         continue;
345       if (auto *CI = dyn_cast_or_null<ConstantInt>(*C)) {
346         if (CI->isZero())
347           Worklist.push_back({SI->getFalseValue(), CtxI});
348         else
349           Worklist.push_back({SI->getTrueValue(), CtxI});
350         continue;
351       }
352       // We could not simplify the condition, assume both values.(
353       Worklist.push_back({SI->getTrueValue(), CtxI});
354       Worklist.push_back({SI->getFalseValue(), CtxI});
355       continue;
356     }
357 
358     // Look through phi nodes, visit all live operands.
359     if (auto *PHI = dyn_cast<PHINode>(V)) {
360       LivenessInfo &LI = GetLivenessInfo(*PHI->getFunction());
361       for (unsigned u = 0, e = PHI->getNumIncomingValues(); u < e; u++) {
362         BasicBlock *IncomingBB = PHI->getIncomingBlock(u);
363         if (LI.LivenessAA->isEdgeDead(IncomingBB, PHI->getParent())) {
364           LI.AnyDead = true;
365           UsedAssumedInformation |= !LI.LivenessAA->isAtFixpoint();
366           continue;
367         }
368         Worklist.push_back(
369             {PHI->getIncomingValue(u), IncomingBB->getTerminator()});
370       }
371       continue;
372     }
373 
374     if (auto *Arg = dyn_cast<Argument>(V)) {
375       if ((VS & AA::Interprocedural) && !Arg->hasPassPointeeByValueCopyAttr()) {
376         SmallVector<Item> CallSiteValues;
377         bool UsedAssumedInformation = false;
378         if (A.checkForAllCallSites(
379                 [&](AbstractCallSite ACS) {
380                   // Callbacks might not have a corresponding call site operand,
381                   // stick with the argument in that case.
382                   Value *CSOp = ACS.getCallArgOperand(*Arg);
383                   if (!CSOp)
384                     return false;
385                   CallSiteValues.push_back({CSOp, ACS.getInstruction()});
386                   return true;
387                 },
388                 *Arg->getParent(), true, &QueryingAA, UsedAssumedInformation)) {
389           Worklist.append(CallSiteValues);
390           continue;
391         }
392       }
393     }
394 
395     if (UseValueSimplify && !isa<Constant>(V)) {
396       Optional<Value *> SimpleV =
397           A.getAssumedSimplified(*V, QueryingAA, UsedAssumedInformation);
398       if (!SimpleV.hasValue())
399         continue;
400       Value *NewV = SimpleV.getValue();
401       if (NewV && NewV != V) {
402         if ((VS & AA::Interprocedural) || !CtxI ||
403             AA::isValidInScope(*NewV, CtxI->getFunction())) {
404           Worklist.push_back({NewV, CtxI});
405           continue;
406         }
407       }
408     }
409 
410     if (auto *LI = dyn_cast<LoadInst>(V)) {
411       bool UsedAssumedInformation = false;
412       // If we ask for the potentially loaded values from the initial pointer we
413       // will simply end up here again. The load is as far as we can make it.
414       if (LI->getPointerOperand() != InitialV) {
415         SmallSetVector<Value *, 4> PotentialCopies;
416         SmallSetVector<Instruction *, 4> PotentialValueOrigins;
417         if (AA::getPotentiallyLoadedValues(A, *LI, PotentialCopies,
418                                            PotentialValueOrigins, QueryingAA,
419                                            UsedAssumedInformation,
420                                            /* OnlyExact */ true)) {
421           // Values have to be dynamically unique or we loose the fact that a
422           // single llvm::Value might represent two runtime values (e.g., stack
423           // locations in different recursive calls).
424           bool DynamicallyUnique =
425               llvm::all_of(PotentialCopies, [&A, &QueryingAA](Value *PC) {
426                 return AA::isDynamicallyUnique(A, QueryingAA, *PC);
427               });
428           if (DynamicallyUnique &&
429               ((VS & AA::Interprocedural) || !CtxI ||
430                llvm::all_of(PotentialCopies, [CtxI](Value *PC) {
431                  return AA::isValidInScope(*PC, CtxI->getFunction());
432                }))) {
433             for (auto *PotentialCopy : PotentialCopies)
434               Worklist.push_back({PotentialCopy, CtxI});
435             continue;
436           }
437         }
438       }
439     }
440 
441     // Once a leaf is reached we inform the user through the callback.
442     if (!VisitValueCB(*V, CtxI, State, Iteration > 1)) {
443       LLVM_DEBUG(dbgs() << "Generic value traversal visit callback failed for: "
444                         << *V << "!\n");
445       return false;
446     }
447   } while (!Worklist.empty());
448 
449   // If we actually used liveness information so we have to record a dependence.
450   for (auto &It : LivenessAAs)
451     if (It.second.AnyDead)
452       A.recordDependence(*It.second.LivenessAA, QueryingAA,
453                          DepClassTy::OPTIONAL);
454 
455   // All values have been visited.
456   return true;
457 }
458 
459 bool AA::getAssumedUnderlyingObjects(Attributor &A, const Value &Ptr,
460                                      SmallVectorImpl<Value *> &Objects,
461                                      const AbstractAttribute &QueryingAA,
462                                      const Instruction *CtxI,
463                                      bool &UsedAssumedInformation,
464                                      AA::ValueScope VS) {
465   auto StripCB = [&](Value *V) { return getUnderlyingObject(V); };
466   SmallPtrSet<Value *, 8> SeenObjects;
467   auto VisitValueCB = [&SeenObjects](Value &Val, const Instruction *,
468                                      SmallVectorImpl<Value *> &Objects,
469                                      bool) -> bool {
470     if (SeenObjects.insert(&Val).second)
471       Objects.push_back(&Val);
472     return true;
473   };
474   if (!genericValueTraversal<decltype(Objects)>(
475           A, IRPosition::value(Ptr), QueryingAA, Objects, VisitValueCB, CtxI,
476           UsedAssumedInformation, true, 32, StripCB, VS))
477     return false;
478   return true;
479 }
480 
481 static const Value *
482 stripAndAccumulateOffsets(Attributor &A, const AbstractAttribute &QueryingAA,
483                           const Value *Val, const DataLayout &DL, APInt &Offset,
484                           bool GetMinOffset, bool AllowNonInbounds,
485                           bool UseAssumed = false) {
486 
487   auto AttributorAnalysis = [&](Value &V, APInt &ROffset) -> bool {
488     const IRPosition &Pos = IRPosition::value(V);
489     // Only track dependence if we are going to use the assumed info.
490     const AAValueConstantRange &ValueConstantRangeAA =
491         A.getAAFor<AAValueConstantRange>(QueryingAA, Pos,
492                                          UseAssumed ? DepClassTy::OPTIONAL
493                                                     : DepClassTy::NONE);
494     ConstantRange Range = UseAssumed ? ValueConstantRangeAA.getAssumed()
495                                      : ValueConstantRangeAA.getKnown();
496     if (Range.isFullSet())
497       return false;
498 
499     // We can only use the lower part of the range because the upper part can
500     // be higher than what the value can really be.
501     if (GetMinOffset)
502       ROffset = Range.getSignedMin();
503     else
504       ROffset = Range.getSignedMax();
505     return true;
506   };
507 
508   return Val->stripAndAccumulateConstantOffsets(DL, Offset, AllowNonInbounds,
509                                                 /* AllowInvariant */ true,
510                                                 AttributorAnalysis);
511 }
512 
513 static const Value *
514 getMinimalBaseOfPointer(Attributor &A, const AbstractAttribute &QueryingAA,
515                         const Value *Ptr, int64_t &BytesOffset,
516                         const DataLayout &DL, bool AllowNonInbounds = false) {
517   APInt OffsetAPInt(DL.getIndexTypeSizeInBits(Ptr->getType()), 0);
518   const Value *Base =
519       stripAndAccumulateOffsets(A, QueryingAA, Ptr, DL, OffsetAPInt,
520                                 /* GetMinOffset */ true, AllowNonInbounds);
521 
522   BytesOffset = OffsetAPInt.getSExtValue();
523   return Base;
524 }
525 
526 /// Clamp the information known for all returned values of a function
527 /// (identified by \p QueryingAA) into \p S.
528 template <typename AAType, typename StateType = typename AAType::StateType>
529 static void clampReturnedValueStates(
530     Attributor &A, const AAType &QueryingAA, StateType &S,
531     const IRPosition::CallBaseContext *CBContext = nullptr) {
532   LLVM_DEBUG(dbgs() << "[Attributor] Clamp return value states for "
533                     << QueryingAA << " into " << S << "\n");
534 
535   assert((QueryingAA.getIRPosition().getPositionKind() ==
536               IRPosition::IRP_RETURNED ||
537           QueryingAA.getIRPosition().getPositionKind() ==
538               IRPosition::IRP_CALL_SITE_RETURNED) &&
539          "Can only clamp returned value states for a function returned or call "
540          "site returned position!");
541 
542   // Use an optional state as there might not be any return values and we want
543   // to join (IntegerState::operator&) the state of all there are.
544   Optional<StateType> T;
545 
546   // Callback for each possibly returned value.
547   auto CheckReturnValue = [&](Value &RV) -> bool {
548     const IRPosition &RVPos = IRPosition::value(RV, CBContext);
549     const AAType &AA =
550         A.getAAFor<AAType>(QueryingAA, RVPos, DepClassTy::REQUIRED);
551     LLVM_DEBUG(dbgs() << "[Attributor] RV: " << RV << " AA: " << AA.getAsStr()
552                       << " @ " << RVPos << "\n");
553     const StateType &AAS = AA.getState();
554     if (T.hasValue())
555       *T &= AAS;
556     else
557       T = AAS;
558     LLVM_DEBUG(dbgs() << "[Attributor] AA State: " << AAS << " RV State: " << T
559                       << "\n");
560     return T->isValidState();
561   };
562 
563   if (!A.checkForAllReturnedValues(CheckReturnValue, QueryingAA))
564     S.indicatePessimisticFixpoint();
565   else if (T.hasValue())
566     S ^= *T;
567 }
568 
569 namespace {
570 /// Helper class for generic deduction: return value -> returned position.
571 template <typename AAType, typename BaseType,
572           typename StateType = typename BaseType::StateType,
573           bool PropagateCallBaseContext = false>
574 struct AAReturnedFromReturnedValues : public BaseType {
575   AAReturnedFromReturnedValues(const IRPosition &IRP, Attributor &A)
576       : BaseType(IRP, A) {}
577 
578   /// See AbstractAttribute::updateImpl(...).
579   ChangeStatus updateImpl(Attributor &A) override {
580     StateType S(StateType::getBestState(this->getState()));
581     clampReturnedValueStates<AAType, StateType>(
582         A, *this, S,
583         PropagateCallBaseContext ? this->getCallBaseContext() : nullptr);
584     // TODO: If we know we visited all returned values, thus no are assumed
585     // dead, we can take the known information from the state T.
586     return clampStateAndIndicateChange<StateType>(this->getState(), S);
587   }
588 };
589 
590 /// Clamp the information known at all call sites for a given argument
591 /// (identified by \p QueryingAA) into \p S.
592 template <typename AAType, typename StateType = typename AAType::StateType>
593 static void clampCallSiteArgumentStates(Attributor &A, const AAType &QueryingAA,
594                                         StateType &S) {
595   LLVM_DEBUG(dbgs() << "[Attributor] Clamp call site argument states for "
596                     << QueryingAA << " into " << S << "\n");
597 
598   assert(QueryingAA.getIRPosition().getPositionKind() ==
599              IRPosition::IRP_ARGUMENT &&
600          "Can only clamp call site argument states for an argument position!");
601 
602   // Use an optional state as there might not be any return values and we want
603   // to join (IntegerState::operator&) the state of all there are.
604   Optional<StateType> T;
605 
606   // The argument number which is also the call site argument number.
607   unsigned ArgNo = QueryingAA.getIRPosition().getCallSiteArgNo();
608 
609   auto CallSiteCheck = [&](AbstractCallSite ACS) {
610     const IRPosition &ACSArgPos = IRPosition::callsite_argument(ACS, ArgNo);
611     // Check if a coresponding argument was found or if it is on not associated
612     // (which can happen for callback calls).
613     if (ACSArgPos.getPositionKind() == IRPosition::IRP_INVALID)
614       return false;
615 
616     const AAType &AA =
617         A.getAAFor<AAType>(QueryingAA, ACSArgPos, DepClassTy::REQUIRED);
618     LLVM_DEBUG(dbgs() << "[Attributor] ACS: " << *ACS.getInstruction()
619                       << " AA: " << AA.getAsStr() << " @" << ACSArgPos << "\n");
620     const StateType &AAS = AA.getState();
621     if (T.hasValue())
622       *T &= AAS;
623     else
624       T = AAS;
625     LLVM_DEBUG(dbgs() << "[Attributor] AA State: " << AAS << " CSA State: " << T
626                       << "\n");
627     return T->isValidState();
628   };
629 
630   bool UsedAssumedInformation = false;
631   if (!A.checkForAllCallSites(CallSiteCheck, QueryingAA, true,
632                               UsedAssumedInformation))
633     S.indicatePessimisticFixpoint();
634   else if (T.hasValue())
635     S ^= *T;
636 }
637 
638 /// This function is the bridge between argument position and the call base
639 /// context.
640 template <typename AAType, typename BaseType,
641           typename StateType = typename AAType::StateType>
642 bool getArgumentStateFromCallBaseContext(Attributor &A,
643                                          BaseType &QueryingAttribute,
644                                          IRPosition &Pos, StateType &State) {
645   assert((Pos.getPositionKind() == IRPosition::IRP_ARGUMENT) &&
646          "Expected an 'argument' position !");
647   const CallBase *CBContext = Pos.getCallBaseContext();
648   if (!CBContext)
649     return false;
650 
651   int ArgNo = Pos.getCallSiteArgNo();
652   assert(ArgNo >= 0 && "Invalid Arg No!");
653 
654   const auto &AA = A.getAAFor<AAType>(
655       QueryingAttribute, IRPosition::callsite_argument(*CBContext, ArgNo),
656       DepClassTy::REQUIRED);
657   const StateType &CBArgumentState =
658       static_cast<const StateType &>(AA.getState());
659 
660   LLVM_DEBUG(dbgs() << "[Attributor] Briding Call site context to argument"
661                     << "Position:" << Pos << "CB Arg state:" << CBArgumentState
662                     << "\n");
663 
664   // NOTE: If we want to do call site grouping it should happen here.
665   State ^= CBArgumentState;
666   return true;
667 }
668 
669 /// Helper class for generic deduction: call site argument -> argument position.
670 template <typename AAType, typename BaseType,
671           typename StateType = typename AAType::StateType,
672           bool BridgeCallBaseContext = false>
673 struct AAArgumentFromCallSiteArguments : public BaseType {
674   AAArgumentFromCallSiteArguments(const IRPosition &IRP, Attributor &A)
675       : BaseType(IRP, A) {}
676 
677   /// See AbstractAttribute::updateImpl(...).
678   ChangeStatus updateImpl(Attributor &A) override {
679     StateType S = StateType::getBestState(this->getState());
680 
681     if (BridgeCallBaseContext) {
682       bool Success =
683           getArgumentStateFromCallBaseContext<AAType, BaseType, StateType>(
684               A, *this, this->getIRPosition(), S);
685       if (Success)
686         return clampStateAndIndicateChange<StateType>(this->getState(), S);
687     }
688     clampCallSiteArgumentStates<AAType, StateType>(A, *this, S);
689 
690     // TODO: If we know we visited all incoming values, thus no are assumed
691     // dead, we can take the known information from the state T.
692     return clampStateAndIndicateChange<StateType>(this->getState(), S);
693   }
694 };
695 
696 /// Helper class for generic replication: function returned -> cs returned.
697 template <typename AAType, typename BaseType,
698           typename StateType = typename BaseType::StateType,
699           bool IntroduceCallBaseContext = false>
700 struct AACallSiteReturnedFromReturned : public BaseType {
701   AACallSiteReturnedFromReturned(const IRPosition &IRP, Attributor &A)
702       : BaseType(IRP, A) {}
703 
704   /// See AbstractAttribute::updateImpl(...).
705   ChangeStatus updateImpl(Attributor &A) override {
706     assert(this->getIRPosition().getPositionKind() ==
707                IRPosition::IRP_CALL_SITE_RETURNED &&
708            "Can only wrap function returned positions for call site returned "
709            "positions!");
710     auto &S = this->getState();
711 
712     const Function *AssociatedFunction =
713         this->getIRPosition().getAssociatedFunction();
714     if (!AssociatedFunction)
715       return S.indicatePessimisticFixpoint();
716 
717     CallBase &CBContext = cast<CallBase>(this->getAnchorValue());
718     if (IntroduceCallBaseContext)
719       LLVM_DEBUG(dbgs() << "[Attributor] Introducing call base context:"
720                         << CBContext << "\n");
721 
722     IRPosition FnPos = IRPosition::returned(
723         *AssociatedFunction, IntroduceCallBaseContext ? &CBContext : nullptr);
724     const AAType &AA = A.getAAFor<AAType>(*this, FnPos, DepClassTy::REQUIRED);
725     return clampStateAndIndicateChange(S, AA.getState());
726   }
727 };
728 
729 /// Helper function to accumulate uses.
730 template <class AAType, typename StateType = typename AAType::StateType>
731 static void followUsesInContext(AAType &AA, Attributor &A,
732                                 MustBeExecutedContextExplorer &Explorer,
733                                 const Instruction *CtxI,
734                                 SetVector<const Use *> &Uses,
735                                 StateType &State) {
736   auto EIt = Explorer.begin(CtxI), EEnd = Explorer.end(CtxI);
737   for (unsigned u = 0; u < Uses.size(); ++u) {
738     const Use *U = Uses[u];
739     if (const Instruction *UserI = dyn_cast<Instruction>(U->getUser())) {
740       bool Found = Explorer.findInContextOf(UserI, EIt, EEnd);
741       if (Found && AA.followUseInMBEC(A, U, UserI, State))
742         for (const Use &Us : UserI->uses())
743           Uses.insert(&Us);
744     }
745   }
746 }
747 
748 /// Use the must-be-executed-context around \p I to add information into \p S.
749 /// The AAType class is required to have `followUseInMBEC` method with the
750 /// following signature and behaviour:
751 ///
752 /// bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I)
753 /// U - Underlying use.
754 /// I - The user of the \p U.
755 /// Returns true if the value should be tracked transitively.
756 ///
757 template <class AAType, typename StateType = typename AAType::StateType>
758 static void followUsesInMBEC(AAType &AA, Attributor &A, StateType &S,
759                              Instruction &CtxI) {
760 
761   // Container for (transitive) uses of the associated value.
762   SetVector<const Use *> Uses;
763   for (const Use &U : AA.getIRPosition().getAssociatedValue().uses())
764     Uses.insert(&U);
765 
766   MustBeExecutedContextExplorer &Explorer =
767       A.getInfoCache().getMustBeExecutedContextExplorer();
768 
769   followUsesInContext<AAType>(AA, A, Explorer, &CtxI, Uses, S);
770 
771   if (S.isAtFixpoint())
772     return;
773 
774   SmallVector<const BranchInst *, 4> BrInsts;
775   auto Pred = [&](const Instruction *I) {
776     if (const BranchInst *Br = dyn_cast<BranchInst>(I))
777       if (Br->isConditional())
778         BrInsts.push_back(Br);
779     return true;
780   };
781 
782   // Here, accumulate conditional branch instructions in the context. We
783   // explore the child paths and collect the known states. The disjunction of
784   // those states can be merged to its own state. Let ParentState_i be a state
785   // to indicate the known information for an i-th branch instruction in the
786   // context. ChildStates are created for its successors respectively.
787   //
788   // ParentS_1 = ChildS_{1, 1} /\ ChildS_{1, 2} /\ ... /\ ChildS_{1, n_1}
789   // ParentS_2 = ChildS_{2, 1} /\ ChildS_{2, 2} /\ ... /\ ChildS_{2, n_2}
790   //      ...
791   // ParentS_m = ChildS_{m, 1} /\ ChildS_{m, 2} /\ ... /\ ChildS_{m, n_m}
792   //
793   // Known State |= ParentS_1 \/ ParentS_2 \/... \/ ParentS_m
794   //
795   // FIXME: Currently, recursive branches are not handled. For example, we
796   // can't deduce that ptr must be dereferenced in below function.
797   //
798   // void f(int a, int c, int *ptr) {
799   //    if(a)
800   //      if (b) {
801   //        *ptr = 0;
802   //      } else {
803   //        *ptr = 1;
804   //      }
805   //    else {
806   //      if (b) {
807   //        *ptr = 0;
808   //      } else {
809   //        *ptr = 1;
810   //      }
811   //    }
812   // }
813 
814   Explorer.checkForAllContext(&CtxI, Pred);
815   for (const BranchInst *Br : BrInsts) {
816     StateType ParentState;
817 
818     // The known state of the parent state is a conjunction of children's
819     // known states so it is initialized with a best state.
820     ParentState.indicateOptimisticFixpoint();
821 
822     for (const BasicBlock *BB : Br->successors()) {
823       StateType ChildState;
824 
825       size_t BeforeSize = Uses.size();
826       followUsesInContext(AA, A, Explorer, &BB->front(), Uses, ChildState);
827 
828       // Erase uses which only appear in the child.
829       for (auto It = Uses.begin() + BeforeSize; It != Uses.end();)
830         It = Uses.erase(It);
831 
832       ParentState &= ChildState;
833     }
834 
835     // Use only known state.
836     S += ParentState;
837   }
838 }
839 } // namespace
840 
841 /// ------------------------ PointerInfo ---------------------------------------
842 
843 namespace llvm {
844 namespace AA {
845 namespace PointerInfo {
846 
847 struct State;
848 
849 } // namespace PointerInfo
850 } // namespace AA
851 
852 /// Helper for AA::PointerInfo::Acccess DenseMap/Set usage.
853 template <>
854 struct DenseMapInfo<AAPointerInfo::Access> : DenseMapInfo<Instruction *> {
855   using Access = AAPointerInfo::Access;
856   static inline Access getEmptyKey();
857   static inline Access getTombstoneKey();
858   static unsigned getHashValue(const Access &A);
859   static bool isEqual(const Access &LHS, const Access &RHS);
860 };
861 
862 /// Helper that allows OffsetAndSize as a key in a DenseMap.
863 template <>
864 struct DenseMapInfo<AAPointerInfo ::OffsetAndSize>
865     : DenseMapInfo<std::pair<int64_t, int64_t>> {};
866 
867 /// Helper for AA::PointerInfo::Acccess DenseMap/Set usage ignoring everythign
868 /// but the instruction
869 struct AccessAsInstructionInfo : DenseMapInfo<Instruction *> {
870   using Base = DenseMapInfo<Instruction *>;
871   using Access = AAPointerInfo::Access;
872   static inline Access getEmptyKey();
873   static inline Access getTombstoneKey();
874   static unsigned getHashValue(const Access &A);
875   static bool isEqual(const Access &LHS, const Access &RHS);
876 };
877 
878 } // namespace llvm
879 
880 /// A type to track pointer/struct usage and accesses for AAPointerInfo.
881 struct AA::PointerInfo::State : public AbstractState {
882 
883   ~State() {
884     // We do not delete the Accesses objects but need to destroy them still.
885     for (auto &It : AccessBins)
886       It.second->~Accesses();
887   }
888 
889   /// Return the best possible representable state.
890   static State getBestState(const State &SIS) { return State(); }
891 
892   /// Return the worst possible representable state.
893   static State getWorstState(const State &SIS) {
894     State R;
895     R.indicatePessimisticFixpoint();
896     return R;
897   }
898 
899   State() = default;
900   State(State &&SIS) : AccessBins(std::move(SIS.AccessBins)) {
901     SIS.AccessBins.clear();
902   }
903 
904   const State &getAssumed() const { return *this; }
905 
906   /// See AbstractState::isValidState().
907   bool isValidState() const override { return BS.isValidState(); }
908 
909   /// See AbstractState::isAtFixpoint().
910   bool isAtFixpoint() const override { return BS.isAtFixpoint(); }
911 
912   /// See AbstractState::indicateOptimisticFixpoint().
913   ChangeStatus indicateOptimisticFixpoint() override {
914     BS.indicateOptimisticFixpoint();
915     return ChangeStatus::UNCHANGED;
916   }
917 
918   /// See AbstractState::indicatePessimisticFixpoint().
919   ChangeStatus indicatePessimisticFixpoint() override {
920     BS.indicatePessimisticFixpoint();
921     return ChangeStatus::CHANGED;
922   }
923 
924   State &operator=(const State &R) {
925     if (this == &R)
926       return *this;
927     BS = R.BS;
928     AccessBins = R.AccessBins;
929     return *this;
930   }
931 
932   State &operator=(State &&R) {
933     if (this == &R)
934       return *this;
935     std::swap(BS, R.BS);
936     std::swap(AccessBins, R.AccessBins);
937     return *this;
938   }
939 
940   bool operator==(const State &R) const {
941     if (BS != R.BS)
942       return false;
943     if (AccessBins.size() != R.AccessBins.size())
944       return false;
945     auto It = begin(), RIt = R.begin(), E = end();
946     while (It != E) {
947       if (It->getFirst() != RIt->getFirst())
948         return false;
949       auto &Accs = It->getSecond();
950       auto &RAccs = RIt->getSecond();
951       if (Accs->size() != RAccs->size())
952         return false;
953       for (const auto &ZipIt : llvm::zip(*Accs, *RAccs))
954         if (std::get<0>(ZipIt) != std::get<1>(ZipIt))
955           return false;
956       ++It;
957       ++RIt;
958     }
959     return true;
960   }
961   bool operator!=(const State &R) const { return !(*this == R); }
962 
963   /// We store accesses in a set with the instruction as key.
964   struct Accesses {
965     SmallVector<AAPointerInfo::Access, 4> Accesses;
966     DenseMap<const Instruction *, unsigned> Map;
967 
968     unsigned size() const { return Accesses.size(); }
969 
970     using vec_iterator = decltype(Accesses)::iterator;
971     vec_iterator begin() { return Accesses.begin(); }
972     vec_iterator end() { return Accesses.end(); }
973 
974     using iterator = decltype(Map)::const_iterator;
975     iterator find(AAPointerInfo::Access &Acc) {
976       return Map.find(Acc.getRemoteInst());
977     }
978     iterator find_end() { return Map.end(); }
979 
980     AAPointerInfo::Access &get(iterator &It) {
981       return Accesses[It->getSecond()];
982     }
983 
984     void insert(AAPointerInfo::Access &Acc) {
985       Map[Acc.getRemoteInst()] = Accesses.size();
986       Accesses.push_back(Acc);
987     }
988   };
989 
990   /// We store all accesses in bins denoted by their offset and size.
991   using AccessBinsTy = DenseMap<AAPointerInfo::OffsetAndSize, Accesses *>;
992 
993   AccessBinsTy::const_iterator begin() const { return AccessBins.begin(); }
994   AccessBinsTy::const_iterator end() const { return AccessBins.end(); }
995 
996 protected:
997   /// The bins with all the accesses for the associated pointer.
998   AccessBinsTy AccessBins;
999 
1000   /// Add a new access to the state at offset \p Offset and with size \p Size.
1001   /// The access is associated with \p I, writes \p Content (if anything), and
1002   /// is of kind \p Kind.
1003   /// \Returns CHANGED, if the state changed, UNCHANGED otherwise.
1004   ChangeStatus addAccess(Attributor &A, int64_t Offset, int64_t Size,
1005                          Instruction &I, Optional<Value *> Content,
1006                          AAPointerInfo::AccessKind Kind, Type *Ty,
1007                          Instruction *RemoteI = nullptr,
1008                          Accesses *BinPtr = nullptr) {
1009     AAPointerInfo::OffsetAndSize Key{Offset, Size};
1010     Accesses *&Bin = BinPtr ? BinPtr : AccessBins[Key];
1011     if (!Bin)
1012       Bin = new (A.Allocator) Accesses;
1013     AAPointerInfo::Access Acc(&I, RemoteI ? RemoteI : &I, Content, Kind, Ty);
1014     // Check if we have an access for this instruction in this bin, if not,
1015     // simply add it.
1016     auto It = Bin->find(Acc);
1017     if (It == Bin->find_end()) {
1018       Bin->insert(Acc);
1019       return ChangeStatus::CHANGED;
1020     }
1021     // If the existing access is the same as then new one, nothing changed.
1022     AAPointerInfo::Access &Current = Bin->get(It);
1023     AAPointerInfo::Access Before = Current;
1024     // The new one will be combined with the existing one.
1025     Current &= Acc;
1026     return Current == Before ? ChangeStatus::UNCHANGED : ChangeStatus::CHANGED;
1027   }
1028 
1029   /// See AAPointerInfo::forallInterferingAccesses.
1030   bool forallInterferingAccesses(
1031       AAPointerInfo::OffsetAndSize OAS,
1032       function_ref<bool(const AAPointerInfo::Access &, bool)> CB) const {
1033     if (!isValidState())
1034       return false;
1035 
1036     for (auto &It : AccessBins) {
1037       AAPointerInfo::OffsetAndSize ItOAS = It.getFirst();
1038       if (!OAS.mayOverlap(ItOAS))
1039         continue;
1040       bool IsExact = OAS == ItOAS && !OAS.offsetOrSizeAreUnknown();
1041       for (auto &Access : *It.getSecond())
1042         if (!CB(Access, IsExact))
1043           return false;
1044     }
1045     return true;
1046   }
1047 
1048   /// See AAPointerInfo::forallInterferingAccesses.
1049   bool forallInterferingAccesses(
1050       Instruction &I,
1051       function_ref<bool(const AAPointerInfo::Access &, bool)> CB) const {
1052     if (!isValidState())
1053       return false;
1054 
1055     // First find the offset and size of I.
1056     AAPointerInfo::OffsetAndSize OAS(-1, -1);
1057     for (auto &It : AccessBins) {
1058       for (auto &Access : *It.getSecond()) {
1059         if (Access.getRemoteInst() == &I) {
1060           OAS = It.getFirst();
1061           break;
1062         }
1063       }
1064       if (OAS.getSize() != -1)
1065         break;
1066     }
1067     // No access for I was found, we are done.
1068     if (OAS.getSize() == -1)
1069       return true;
1070 
1071     // Now that we have an offset and size, find all overlapping ones and use
1072     // the callback on the accesses.
1073     return forallInterferingAccesses(OAS, CB);
1074   }
1075 
1076 private:
1077   /// State to track fixpoint and validity.
1078   BooleanState BS;
1079 };
1080 
1081 namespace {
1082 struct AAPointerInfoImpl
1083     : public StateWrapper<AA::PointerInfo::State, AAPointerInfo> {
1084   using BaseTy = StateWrapper<AA::PointerInfo::State, AAPointerInfo>;
1085   AAPointerInfoImpl(const IRPosition &IRP, Attributor &A) : BaseTy(IRP) {}
1086 
1087   /// See AbstractAttribute::initialize(...).
1088   void initialize(Attributor &A) override { AAPointerInfo::initialize(A); }
1089 
1090   /// See AbstractAttribute::getAsStr().
1091   const std::string getAsStr() const override {
1092     return std::string("PointerInfo ") +
1093            (isValidState() ? (std::string("#") +
1094                               std::to_string(AccessBins.size()) + " bins")
1095                            : "<invalid>");
1096   }
1097 
1098   /// See AbstractAttribute::manifest(...).
1099   ChangeStatus manifest(Attributor &A) override {
1100     return AAPointerInfo::manifest(A);
1101   }
1102 
1103   bool forallInterferingAccesses(
1104       OffsetAndSize OAS,
1105       function_ref<bool(const AAPointerInfo::Access &, bool)> CB)
1106       const override {
1107     return State::forallInterferingAccesses(OAS, CB);
1108   }
1109   bool forallInterferingAccesses(
1110       Attributor &A, const AbstractAttribute &QueryingAA, Instruction &I,
1111       function_ref<bool(const Access &, bool)> UserCB) const override {
1112     SmallPtrSet<const Access *, 8> DominatingWrites;
1113     SmallVector<std::pair<const Access *, bool>, 8> InterferingAccesses;
1114 
1115     Function &Scope = *I.getFunction();
1116     const auto &NoSyncAA = A.getAAFor<AANoSync>(
1117         QueryingAA, IRPosition::function(Scope), DepClassTy::OPTIONAL);
1118     const auto *ExecDomainAA = A.lookupAAFor<AAExecutionDomain>(
1119         IRPosition::function(Scope), &QueryingAA, DepClassTy::OPTIONAL);
1120     const bool NoSync = NoSyncAA.isAssumedNoSync();
1121 
1122     // Helper to determine if we need to consider threading, which we cannot
1123     // right now. However, if the function is (assumed) nosync or the thread
1124     // executing all instructions is the main thread only we can ignore
1125     // threading.
1126     auto CanIgnoreThreading = [&](const Instruction &I) -> bool {
1127       if (NoSync)
1128         return true;
1129       if (ExecDomainAA && ExecDomainAA->isExecutedByInitialThreadOnly(I))
1130         return true;
1131       return false;
1132     };
1133 
1134     // Helper to determine if the access is executed by the same thread as the
1135     // load, for now it is sufficient to avoid any potential threading effects
1136     // as we cannot deal with them anyway.
1137     auto IsSameThreadAsLoad = [&](const Access &Acc) -> bool {
1138       return CanIgnoreThreading(*Acc.getLocalInst());
1139     };
1140 
1141     // TODO: Use inter-procedural reachability and dominance.
1142     const auto &NoRecurseAA = A.getAAFor<AANoRecurse>(
1143         QueryingAA, IRPosition::function(Scope), DepClassTy::OPTIONAL);
1144 
1145     const bool FindInterferingWrites = I.mayReadFromMemory();
1146     const bool FindInterferingReads = I.mayWriteToMemory();
1147     const bool UseDominanceReasoning = FindInterferingWrites;
1148     const bool CanUseCFGResoning = CanIgnoreThreading(I);
1149     InformationCache &InfoCache = A.getInfoCache();
1150     const DominatorTree *DT =
1151         NoRecurseAA.isKnownNoRecurse() && UseDominanceReasoning
1152             ? InfoCache.getAnalysisResultForFunction<DominatorTreeAnalysis>(
1153                   Scope)
1154             : nullptr;
1155 
1156     enum GPUAddressSpace : unsigned {
1157       Generic = 0,
1158       Global = 1,
1159       Shared = 3,
1160       Constant = 4,
1161       Local = 5,
1162     };
1163 
1164     // Helper to check if a value has "kernel lifetime", that is it will not
1165     // outlive a GPU kernel. This is true for shared, constant, and local
1166     // globals on AMD and NVIDIA GPUs.
1167     auto HasKernelLifetime = [&](Value *V, Module &M) {
1168       Triple T(M.getTargetTriple());
1169       if (!(T.isAMDGPU() || T.isNVPTX()))
1170         return false;
1171       switch (V->getType()->getPointerAddressSpace()) {
1172       case GPUAddressSpace::Shared:
1173       case GPUAddressSpace::Constant:
1174       case GPUAddressSpace::Local:
1175         return true;
1176       default:
1177         return false;
1178       };
1179     };
1180 
1181     // The IsLiveInCalleeCB will be used by the AA::isPotentiallyReachable query
1182     // to determine if we should look at reachability from the callee. For
1183     // certain pointers we know the lifetime and we do not have to step into the
1184     // callee to determine reachability as the pointer would be dead in the
1185     // callee. See the conditional initialization below.
1186     std::function<bool(const Function &)> IsLiveInCalleeCB;
1187 
1188     if (auto *AI = dyn_cast<AllocaInst>(&getAssociatedValue())) {
1189       // If the alloca containing function is not recursive the alloca
1190       // must be dead in the callee.
1191       const Function *AIFn = AI->getFunction();
1192       const auto &NoRecurseAA = A.getAAFor<AANoRecurse>(
1193           *this, IRPosition::function(*AIFn), DepClassTy::OPTIONAL);
1194       if (NoRecurseAA.isAssumedNoRecurse()) {
1195         IsLiveInCalleeCB = [AIFn](const Function &Fn) { return AIFn != &Fn; };
1196       }
1197     } else if (auto *GV = dyn_cast<GlobalValue>(&getAssociatedValue())) {
1198       // If the global has kernel lifetime we can stop if we reach a kernel
1199       // as it is "dead" in the (unknown) callees.
1200       if (HasKernelLifetime(GV, *GV->getParent()))
1201         IsLiveInCalleeCB = [](const Function &Fn) {
1202           return !Fn.hasFnAttribute("kernel");
1203         };
1204     }
1205 
1206     auto AccessCB = [&](const Access &Acc, bool Exact) {
1207       if ((!FindInterferingWrites || !Acc.isWrite()) &&
1208           (!FindInterferingReads || !Acc.isRead()))
1209         return true;
1210 
1211       // For now we only filter accesses based on CFG reasoning which does not
1212       // work yet if we have threading effects, or the access is complicated.
1213       if (CanUseCFGResoning) {
1214         if ((!Acc.isWrite() ||
1215              !AA::isPotentiallyReachable(A, *Acc.getLocalInst(), I, QueryingAA,
1216                                          IsLiveInCalleeCB)) &&
1217             (!Acc.isRead() ||
1218              !AA::isPotentiallyReachable(A, I, *Acc.getLocalInst(), QueryingAA,
1219                                          IsLiveInCalleeCB)))
1220           return true;
1221         if (DT && Exact && (Acc.getLocalInst()->getFunction() == &Scope) &&
1222             IsSameThreadAsLoad(Acc)) {
1223           if (DT->dominates(Acc.getLocalInst(), &I))
1224             DominatingWrites.insert(&Acc);
1225         }
1226       }
1227 
1228       InterferingAccesses.push_back({&Acc, Exact});
1229       return true;
1230     };
1231     if (!State::forallInterferingAccesses(I, AccessCB))
1232       return false;
1233 
1234     // If we cannot use CFG reasoning we only filter the non-write accesses
1235     // and are done here.
1236     if (!CanUseCFGResoning) {
1237       for (auto &It : InterferingAccesses)
1238         if (!UserCB(*It.first, It.second))
1239           return false;
1240       return true;
1241     }
1242 
1243     // Helper to determine if we can skip a specific write access. This is in
1244     // the worst case quadratic as we are looking for another write that will
1245     // hide the effect of this one.
1246     auto CanSkipAccess = [&](const Access &Acc, bool Exact) {
1247       if (!IsSameThreadAsLoad(Acc))
1248         return false;
1249       if (!DominatingWrites.count(&Acc))
1250         return false;
1251       for (const Access *DomAcc : DominatingWrites) {
1252         assert(Acc.getLocalInst()->getFunction() ==
1253                    DomAcc->getLocalInst()->getFunction() &&
1254                "Expected dominating writes to be in the same function!");
1255 
1256         if (DomAcc != &Acc &&
1257             DT->dominates(Acc.getLocalInst(), DomAcc->getLocalInst())) {
1258           return true;
1259         }
1260       }
1261       return false;
1262     };
1263 
1264     // Run the user callback on all accesses we cannot skip and return if that
1265     // succeeded for all or not.
1266     unsigned NumInterferingAccesses = InterferingAccesses.size();
1267     for (auto &It : InterferingAccesses) {
1268       if (!DT || NumInterferingAccesses > MaxInterferingAccesses ||
1269           !CanSkipAccess(*It.first, It.second)) {
1270         if (!UserCB(*It.first, It.second))
1271           return false;
1272       }
1273     }
1274     return true;
1275   }
1276 
1277   ChangeStatus translateAndAddCalleeState(Attributor &A,
1278                                           const AAPointerInfo &CalleeAA,
1279                                           int64_t CallArgOffset, CallBase &CB) {
1280     using namespace AA::PointerInfo;
1281     if (!CalleeAA.getState().isValidState() || !isValidState())
1282       return indicatePessimisticFixpoint();
1283 
1284     const auto &CalleeImplAA = static_cast<const AAPointerInfoImpl &>(CalleeAA);
1285     bool IsByval = CalleeImplAA.getAssociatedArgument()->hasByValAttr();
1286 
1287     // Combine the accesses bin by bin.
1288     ChangeStatus Changed = ChangeStatus::UNCHANGED;
1289     for (auto &It : CalleeImplAA.getState()) {
1290       OffsetAndSize OAS = OffsetAndSize::getUnknown();
1291       if (CallArgOffset != OffsetAndSize::Unknown)
1292         OAS = OffsetAndSize(It.first.getOffset() + CallArgOffset,
1293                             It.first.getSize());
1294       Accesses *Bin = AccessBins[OAS];
1295       for (const AAPointerInfo::Access &RAcc : *It.second) {
1296         if (IsByval && !RAcc.isRead())
1297           continue;
1298         bool UsedAssumedInformation = false;
1299         Optional<Value *> Content = A.translateArgumentToCallSiteContent(
1300             RAcc.getContent(), CB, *this, UsedAssumedInformation);
1301         AccessKind AK =
1302             AccessKind(RAcc.getKind() & (IsByval ? AccessKind::AK_READ
1303                                                  : AccessKind::AK_READ_WRITE));
1304         Changed =
1305             Changed | addAccess(A, OAS.getOffset(), OAS.getSize(), CB, Content,
1306                                 AK, RAcc.getType(), RAcc.getRemoteInst(), Bin);
1307       }
1308     }
1309     return Changed;
1310   }
1311 
1312   /// Statistic tracking for all AAPointerInfo implementations.
1313   /// See AbstractAttribute::trackStatistics().
1314   void trackPointerInfoStatistics(const IRPosition &IRP) const {}
1315 };
1316 
1317 struct AAPointerInfoFloating : public AAPointerInfoImpl {
1318   using AccessKind = AAPointerInfo::AccessKind;
1319   AAPointerInfoFloating(const IRPosition &IRP, Attributor &A)
1320       : AAPointerInfoImpl(IRP, A) {}
1321 
1322   /// See AbstractAttribute::initialize(...).
1323   void initialize(Attributor &A) override { AAPointerInfoImpl::initialize(A); }
1324 
1325   /// Deal with an access and signal if it was handled successfully.
1326   bool handleAccess(Attributor &A, Instruction &I, Value &Ptr,
1327                     Optional<Value *> Content, AccessKind Kind, int64_t Offset,
1328                     ChangeStatus &Changed, Type *Ty,
1329                     int64_t Size = OffsetAndSize::Unknown) {
1330     using namespace AA::PointerInfo;
1331     // No need to find a size if one is given or the offset is unknown.
1332     if (Offset != OffsetAndSize::Unknown && Size == OffsetAndSize::Unknown &&
1333         Ty) {
1334       const DataLayout &DL = A.getDataLayout();
1335       TypeSize AccessSize = DL.getTypeStoreSize(Ty);
1336       if (!AccessSize.isScalable())
1337         Size = AccessSize.getFixedSize();
1338     }
1339     Changed = Changed | addAccess(A, Offset, Size, I, Content, Kind, Ty);
1340     return true;
1341   };
1342 
1343   /// Helper struct, will support ranges eventually.
1344   struct OffsetInfo {
1345     int64_t Offset = OffsetAndSize::Unknown;
1346 
1347     bool operator==(const OffsetInfo &OI) const { return Offset == OI.Offset; }
1348   };
1349 
1350   /// See AbstractAttribute::updateImpl(...).
1351   ChangeStatus updateImpl(Attributor &A) override {
1352     using namespace AA::PointerInfo;
1353     ChangeStatus Changed = ChangeStatus::UNCHANGED;
1354     Value &AssociatedValue = getAssociatedValue();
1355 
1356     const DataLayout &DL = A.getDataLayout();
1357     DenseMap<Value *, OffsetInfo> OffsetInfoMap;
1358     OffsetInfoMap[&AssociatedValue] = OffsetInfo{0};
1359 
1360     auto HandlePassthroughUser = [&](Value *Usr, OffsetInfo PtrOI,
1361                                      bool &Follow) {
1362       OffsetInfo &UsrOI = OffsetInfoMap[Usr];
1363       UsrOI = PtrOI;
1364       Follow = true;
1365       return true;
1366     };
1367 
1368     const auto *TLI = getAnchorScope()
1369                           ? A.getInfoCache().getTargetLibraryInfoForFunction(
1370                                 *getAnchorScope())
1371                           : nullptr;
1372     auto UsePred = [&](const Use &U, bool &Follow) -> bool {
1373       Value *CurPtr = U.get();
1374       User *Usr = U.getUser();
1375       LLVM_DEBUG(dbgs() << "[AAPointerInfo] Analyze " << *CurPtr << " in "
1376                         << *Usr << "\n");
1377       assert(OffsetInfoMap.count(CurPtr) &&
1378              "The current pointer offset should have been seeded!");
1379 
1380       if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Usr)) {
1381         if (CE->isCast())
1382           return HandlePassthroughUser(Usr, OffsetInfoMap[CurPtr], Follow);
1383         if (CE->isCompare())
1384           return true;
1385         if (!isa<GEPOperator>(CE)) {
1386           LLVM_DEBUG(dbgs() << "[AAPointerInfo] Unhandled constant user " << *CE
1387                             << "\n");
1388           return false;
1389         }
1390       }
1391       if (auto *GEP = dyn_cast<GEPOperator>(Usr)) {
1392         // Note the order here, the Usr access might change the map, CurPtr is
1393         // already in it though.
1394         OffsetInfo &UsrOI = OffsetInfoMap[Usr];
1395         OffsetInfo &PtrOI = OffsetInfoMap[CurPtr];
1396         UsrOI = PtrOI;
1397 
1398         // TODO: Use range information.
1399         if (PtrOI.Offset == OffsetAndSize::Unknown ||
1400             !GEP->hasAllConstantIndices()) {
1401           UsrOI.Offset = OffsetAndSize::Unknown;
1402           Follow = true;
1403           return true;
1404         }
1405 
1406         SmallVector<Value *, 8> Indices;
1407         for (Use &Idx : GEP->indices()) {
1408           if (auto *CIdx = dyn_cast<ConstantInt>(Idx)) {
1409             Indices.push_back(CIdx);
1410             continue;
1411           }
1412 
1413           LLVM_DEBUG(dbgs() << "[AAPointerInfo] Non constant GEP index " << *GEP
1414                             << " : " << *Idx << "\n");
1415           return false;
1416         }
1417         UsrOI.Offset = PtrOI.Offset + DL.getIndexedOffsetInType(
1418                                           GEP->getSourceElementType(), Indices);
1419         Follow = true;
1420         return true;
1421       }
1422       if (isa<CastInst>(Usr) || isa<SelectInst>(Usr))
1423         return HandlePassthroughUser(Usr, OffsetInfoMap[CurPtr], Follow);
1424 
1425       // For PHIs we need to take care of the recurrence explicitly as the value
1426       // might change while we iterate through a loop. For now, we give up if
1427       // the PHI is not invariant.
1428       if (isa<PHINode>(Usr)) {
1429         // Note the order here, the Usr access might change the map, CurPtr is
1430         // already in it though.
1431         OffsetInfo &UsrOI = OffsetInfoMap[Usr];
1432         OffsetInfo &PtrOI = OffsetInfoMap[CurPtr];
1433         // Check if the PHI is invariant (so far).
1434         if (UsrOI == PtrOI)
1435           return true;
1436 
1437         // Check if the PHI operand has already an unknown offset as we can't
1438         // improve on that anymore.
1439         if (PtrOI.Offset == OffsetAndSize::Unknown) {
1440           UsrOI = PtrOI;
1441           Follow = true;
1442           return true;
1443         }
1444 
1445         // Check if the PHI operand is not dependent on the PHI itself.
1446         // TODO: This is not great as we look at the pointer type. However, it
1447         // is unclear where the Offset size comes from with typeless pointers.
1448         APInt Offset(
1449             DL.getIndexSizeInBits(CurPtr->getType()->getPointerAddressSpace()),
1450             0);
1451         if (&AssociatedValue == CurPtr->stripAndAccumulateConstantOffsets(
1452                                     DL, Offset, /* AllowNonInbounds */ true)) {
1453           if (Offset != PtrOI.Offset) {
1454             LLVM_DEBUG(dbgs()
1455                        << "[AAPointerInfo] PHI operand pointer offset mismatch "
1456                        << *CurPtr << " in " << *Usr << "\n");
1457             return false;
1458           }
1459           return HandlePassthroughUser(Usr, PtrOI, Follow);
1460         }
1461 
1462         // TODO: Approximate in case we know the direction of the recurrence.
1463         LLVM_DEBUG(dbgs() << "[AAPointerInfo] PHI operand is too complex "
1464                           << *CurPtr << " in " << *Usr << "\n");
1465         UsrOI = PtrOI;
1466         UsrOI.Offset = OffsetAndSize::Unknown;
1467         Follow = true;
1468         return true;
1469       }
1470 
1471       if (auto *LoadI = dyn_cast<LoadInst>(Usr))
1472         return handleAccess(A, *LoadI, *CurPtr, /* Content */ nullptr,
1473                             AccessKind::AK_READ, OffsetInfoMap[CurPtr].Offset,
1474                             Changed, LoadI->getType());
1475       if (auto *StoreI = dyn_cast<StoreInst>(Usr)) {
1476         if (StoreI->getValueOperand() == CurPtr) {
1477           LLVM_DEBUG(dbgs() << "[AAPointerInfo] Escaping use in store "
1478                             << *StoreI << "\n");
1479           return false;
1480         }
1481         bool UsedAssumedInformation = false;
1482         Optional<Value *> Content = A.getAssumedSimplified(
1483             *StoreI->getValueOperand(), *this, UsedAssumedInformation);
1484         return handleAccess(A, *StoreI, *CurPtr, Content, AccessKind::AK_WRITE,
1485                             OffsetInfoMap[CurPtr].Offset, Changed,
1486                             StoreI->getValueOperand()->getType());
1487       }
1488       if (auto *CB = dyn_cast<CallBase>(Usr)) {
1489         if (CB->isLifetimeStartOrEnd())
1490           return true;
1491         if (TLI && isFreeCall(CB, TLI))
1492           return true;
1493         if (CB->isArgOperand(&U)) {
1494           unsigned ArgNo = CB->getArgOperandNo(&U);
1495           const auto &CSArgPI = A.getAAFor<AAPointerInfo>(
1496               *this, IRPosition::callsite_argument(*CB, ArgNo),
1497               DepClassTy::REQUIRED);
1498           Changed = translateAndAddCalleeState(
1499                         A, CSArgPI, OffsetInfoMap[CurPtr].Offset, *CB) |
1500                     Changed;
1501           return true;
1502         }
1503         LLVM_DEBUG(dbgs() << "[AAPointerInfo] Call user not handled " << *CB
1504                           << "\n");
1505         // TODO: Allow some call uses
1506         return false;
1507       }
1508 
1509       LLVM_DEBUG(dbgs() << "[AAPointerInfo] User not handled " << *Usr << "\n");
1510       return false;
1511     };
1512     auto EquivalentUseCB = [&](const Use &OldU, const Use &NewU) {
1513       if (OffsetInfoMap.count(NewU))
1514         return OffsetInfoMap[NewU] == OffsetInfoMap[OldU];
1515       OffsetInfoMap[NewU] = OffsetInfoMap[OldU];
1516       return true;
1517     };
1518     if (!A.checkForAllUses(UsePred, *this, AssociatedValue,
1519                            /* CheckBBLivenessOnly */ true, DepClassTy::OPTIONAL,
1520                            /* IgnoreDroppableUses */ true, EquivalentUseCB))
1521       return indicatePessimisticFixpoint();
1522 
1523     LLVM_DEBUG({
1524       dbgs() << "Accesses by bin after update:\n";
1525       for (auto &It : AccessBins) {
1526         dbgs() << "[" << It.first.getOffset() << "-"
1527                << It.first.getOffset() + It.first.getSize()
1528                << "] : " << It.getSecond()->size() << "\n";
1529         for (auto &Acc : *It.getSecond()) {
1530           dbgs() << "     - " << Acc.getKind() << " - " << *Acc.getLocalInst()
1531                  << "\n";
1532           if (Acc.getLocalInst() != Acc.getRemoteInst())
1533             dbgs() << "     -->                         "
1534                    << *Acc.getRemoteInst() << "\n";
1535           if (!Acc.isWrittenValueYetUndetermined()) {
1536             if (Acc.getWrittenValue())
1537               dbgs() << "       - c: " << *Acc.getWrittenValue() << "\n";
1538             else
1539               dbgs() << "       - c: <unknown>\n";
1540           }
1541         }
1542       }
1543     });
1544 
1545     return Changed;
1546   }
1547 
1548   /// See AbstractAttribute::trackStatistics()
1549   void trackStatistics() const override {
1550     AAPointerInfoImpl::trackPointerInfoStatistics(getIRPosition());
1551   }
1552 };
1553 
1554 struct AAPointerInfoReturned final : AAPointerInfoImpl {
1555   AAPointerInfoReturned(const IRPosition &IRP, Attributor &A)
1556       : AAPointerInfoImpl(IRP, A) {}
1557 
1558   /// See AbstractAttribute::updateImpl(...).
1559   ChangeStatus updateImpl(Attributor &A) override {
1560     return indicatePessimisticFixpoint();
1561   }
1562 
1563   /// See AbstractAttribute::trackStatistics()
1564   void trackStatistics() const override {
1565     AAPointerInfoImpl::trackPointerInfoStatistics(getIRPosition());
1566   }
1567 };
1568 
1569 struct AAPointerInfoArgument final : AAPointerInfoFloating {
1570   AAPointerInfoArgument(const IRPosition &IRP, Attributor &A)
1571       : AAPointerInfoFloating(IRP, A) {}
1572 
1573   /// See AbstractAttribute::initialize(...).
1574   void initialize(Attributor &A) override {
1575     AAPointerInfoFloating::initialize(A);
1576     if (getAnchorScope()->isDeclaration())
1577       indicatePessimisticFixpoint();
1578   }
1579 
1580   /// See AbstractAttribute::trackStatistics()
1581   void trackStatistics() const override {
1582     AAPointerInfoImpl::trackPointerInfoStatistics(getIRPosition());
1583   }
1584 };
1585 
1586 struct AAPointerInfoCallSiteArgument final : AAPointerInfoFloating {
1587   AAPointerInfoCallSiteArgument(const IRPosition &IRP, Attributor &A)
1588       : AAPointerInfoFloating(IRP, A) {}
1589 
1590   /// See AbstractAttribute::updateImpl(...).
1591   ChangeStatus updateImpl(Attributor &A) override {
1592     using namespace AA::PointerInfo;
1593     // We handle memory intrinsics explicitly, at least the first (=
1594     // destination) and second (=source) arguments as we know how they are
1595     // accessed.
1596     if (auto *MI = dyn_cast_or_null<MemIntrinsic>(getCtxI())) {
1597       ConstantInt *Length = dyn_cast<ConstantInt>(MI->getLength());
1598       int64_t LengthVal = OffsetAndSize::Unknown;
1599       if (Length)
1600         LengthVal = Length->getSExtValue();
1601       Value &Ptr = getAssociatedValue();
1602       unsigned ArgNo = getIRPosition().getCallSiteArgNo();
1603       ChangeStatus Changed = ChangeStatus::UNCHANGED;
1604       if (ArgNo == 0) {
1605         handleAccess(A, *MI, Ptr, nullptr, AccessKind::AK_WRITE, 0, Changed,
1606                      nullptr, LengthVal);
1607       } else if (ArgNo == 1) {
1608         handleAccess(A, *MI, Ptr, nullptr, AccessKind::AK_READ, 0, Changed,
1609                      nullptr, LengthVal);
1610       } else {
1611         LLVM_DEBUG(dbgs() << "[AAPointerInfo] Unhandled memory intrinsic "
1612                           << *MI << "\n");
1613         return indicatePessimisticFixpoint();
1614       }
1615       return Changed;
1616     }
1617 
1618     // TODO: Once we have call site specific value information we can provide
1619     //       call site specific liveness information and then it makes
1620     //       sense to specialize attributes for call sites arguments instead of
1621     //       redirecting requests to the callee argument.
1622     Argument *Arg = getAssociatedArgument();
1623     if (!Arg)
1624       return indicatePessimisticFixpoint();
1625     const IRPosition &ArgPos = IRPosition::argument(*Arg);
1626     auto &ArgAA =
1627         A.getAAFor<AAPointerInfo>(*this, ArgPos, DepClassTy::REQUIRED);
1628     return translateAndAddCalleeState(A, ArgAA, 0, *cast<CallBase>(getCtxI()));
1629   }
1630 
1631   /// See AbstractAttribute::trackStatistics()
1632   void trackStatistics() const override {
1633     AAPointerInfoImpl::trackPointerInfoStatistics(getIRPosition());
1634   }
1635 };
1636 
1637 struct AAPointerInfoCallSiteReturned final : AAPointerInfoFloating {
1638   AAPointerInfoCallSiteReturned(const IRPosition &IRP, Attributor &A)
1639       : AAPointerInfoFloating(IRP, A) {}
1640 
1641   /// See AbstractAttribute::trackStatistics()
1642   void trackStatistics() const override {
1643     AAPointerInfoImpl::trackPointerInfoStatistics(getIRPosition());
1644   }
1645 };
1646 } // namespace
1647 
1648 /// -----------------------NoUnwind Function Attribute--------------------------
1649 
1650 namespace {
1651 struct AANoUnwindImpl : AANoUnwind {
1652   AANoUnwindImpl(const IRPosition &IRP, Attributor &A) : AANoUnwind(IRP, A) {}
1653 
1654   const std::string getAsStr() const override {
1655     return getAssumed() ? "nounwind" : "may-unwind";
1656   }
1657 
1658   /// See AbstractAttribute::updateImpl(...).
1659   ChangeStatus updateImpl(Attributor &A) override {
1660     auto Opcodes = {
1661         (unsigned)Instruction::Invoke,      (unsigned)Instruction::CallBr,
1662         (unsigned)Instruction::Call,        (unsigned)Instruction::CleanupRet,
1663         (unsigned)Instruction::CatchSwitch, (unsigned)Instruction::Resume};
1664 
1665     auto CheckForNoUnwind = [&](Instruction &I) {
1666       if (!I.mayThrow())
1667         return true;
1668 
1669       if (const auto *CB = dyn_cast<CallBase>(&I)) {
1670         const auto &NoUnwindAA = A.getAAFor<AANoUnwind>(
1671             *this, IRPosition::callsite_function(*CB), DepClassTy::REQUIRED);
1672         return NoUnwindAA.isAssumedNoUnwind();
1673       }
1674       return false;
1675     };
1676 
1677     bool UsedAssumedInformation = false;
1678     if (!A.checkForAllInstructions(CheckForNoUnwind, *this, Opcodes,
1679                                    UsedAssumedInformation))
1680       return indicatePessimisticFixpoint();
1681 
1682     return ChangeStatus::UNCHANGED;
1683   }
1684 };
1685 
1686 struct AANoUnwindFunction final : public AANoUnwindImpl {
1687   AANoUnwindFunction(const IRPosition &IRP, Attributor &A)
1688       : AANoUnwindImpl(IRP, A) {}
1689 
1690   /// See AbstractAttribute::trackStatistics()
1691   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nounwind) }
1692 };
1693 
1694 /// NoUnwind attribute deduction for a call sites.
1695 struct AANoUnwindCallSite final : AANoUnwindImpl {
1696   AANoUnwindCallSite(const IRPosition &IRP, Attributor &A)
1697       : AANoUnwindImpl(IRP, A) {}
1698 
1699   /// See AbstractAttribute::initialize(...).
1700   void initialize(Attributor &A) override {
1701     AANoUnwindImpl::initialize(A);
1702     Function *F = getAssociatedFunction();
1703     if (!F || F->isDeclaration())
1704       indicatePessimisticFixpoint();
1705   }
1706 
1707   /// See AbstractAttribute::updateImpl(...).
1708   ChangeStatus updateImpl(Attributor &A) override {
1709     // TODO: Once we have call site specific value information we can provide
1710     //       call site specific liveness information and then it makes
1711     //       sense to specialize attributes for call sites arguments instead of
1712     //       redirecting requests to the callee argument.
1713     Function *F = getAssociatedFunction();
1714     const IRPosition &FnPos = IRPosition::function(*F);
1715     auto &FnAA = A.getAAFor<AANoUnwind>(*this, FnPos, DepClassTy::REQUIRED);
1716     return clampStateAndIndicateChange(getState(), FnAA.getState());
1717   }
1718 
1719   /// See AbstractAttribute::trackStatistics()
1720   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nounwind); }
1721 };
1722 } // namespace
1723 
1724 /// --------------------- Function Return Values -------------------------------
1725 
1726 namespace {
1727 /// "Attribute" that collects all potential returned values and the return
1728 /// instructions that they arise from.
1729 ///
1730 /// If there is a unique returned value R, the manifest method will:
1731 ///   - mark R with the "returned" attribute, if R is an argument.
1732 class AAReturnedValuesImpl : public AAReturnedValues, public AbstractState {
1733 
1734   /// Mapping of values potentially returned by the associated function to the
1735   /// return instructions that might return them.
1736   MapVector<Value *, SmallSetVector<ReturnInst *, 4>> ReturnedValues;
1737 
1738   /// State flags
1739   ///
1740   ///{
1741   bool IsFixed = false;
1742   bool IsValidState = true;
1743   ///}
1744 
1745 public:
1746   AAReturnedValuesImpl(const IRPosition &IRP, Attributor &A)
1747       : AAReturnedValues(IRP, A) {}
1748 
1749   /// See AbstractAttribute::initialize(...).
1750   void initialize(Attributor &A) override {
1751     // Reset the state.
1752     IsFixed = false;
1753     IsValidState = true;
1754     ReturnedValues.clear();
1755 
1756     Function *F = getAssociatedFunction();
1757     if (!F || F->isDeclaration()) {
1758       indicatePessimisticFixpoint();
1759       return;
1760     }
1761     assert(!F->getReturnType()->isVoidTy() &&
1762            "Did not expect a void return type!");
1763 
1764     // The map from instruction opcodes to those instructions in the function.
1765     auto &OpcodeInstMap = A.getInfoCache().getOpcodeInstMapForFunction(*F);
1766 
1767     // Look through all arguments, if one is marked as returned we are done.
1768     for (Argument &Arg : F->args()) {
1769       if (Arg.hasReturnedAttr()) {
1770         auto &ReturnInstSet = ReturnedValues[&Arg];
1771         if (auto *Insts = OpcodeInstMap.lookup(Instruction::Ret))
1772           for (Instruction *RI : *Insts)
1773             ReturnInstSet.insert(cast<ReturnInst>(RI));
1774 
1775         indicateOptimisticFixpoint();
1776         return;
1777       }
1778     }
1779 
1780     if (!A.isFunctionIPOAmendable(*F))
1781       indicatePessimisticFixpoint();
1782   }
1783 
1784   /// See AbstractAttribute::manifest(...).
1785   ChangeStatus manifest(Attributor &A) override;
1786 
1787   /// See AbstractAttribute::getState(...).
1788   AbstractState &getState() override { return *this; }
1789 
1790   /// See AbstractAttribute::getState(...).
1791   const AbstractState &getState() const override { return *this; }
1792 
1793   /// See AbstractAttribute::updateImpl(Attributor &A).
1794   ChangeStatus updateImpl(Attributor &A) override;
1795 
1796   llvm::iterator_range<iterator> returned_values() override {
1797     return llvm::make_range(ReturnedValues.begin(), ReturnedValues.end());
1798   }
1799 
1800   llvm::iterator_range<const_iterator> returned_values() const override {
1801     return llvm::make_range(ReturnedValues.begin(), ReturnedValues.end());
1802   }
1803 
1804   /// Return the number of potential return values, -1 if unknown.
1805   size_t getNumReturnValues() const override {
1806     return isValidState() ? ReturnedValues.size() : -1;
1807   }
1808 
1809   /// Return an assumed unique return value if a single candidate is found. If
1810   /// there cannot be one, return a nullptr. If it is not clear yet, return the
1811   /// Optional::NoneType.
1812   Optional<Value *> getAssumedUniqueReturnValue(Attributor &A) const;
1813 
1814   /// See AbstractState::checkForAllReturnedValues(...).
1815   bool checkForAllReturnedValuesAndReturnInsts(
1816       function_ref<bool(Value &, const SmallSetVector<ReturnInst *, 4> &)> Pred)
1817       const override;
1818 
1819   /// Pretty print the attribute similar to the IR representation.
1820   const std::string getAsStr() const override;
1821 
1822   /// See AbstractState::isAtFixpoint().
1823   bool isAtFixpoint() const override { return IsFixed; }
1824 
1825   /// See AbstractState::isValidState().
1826   bool isValidState() const override { return IsValidState; }
1827 
1828   /// See AbstractState::indicateOptimisticFixpoint(...).
1829   ChangeStatus indicateOptimisticFixpoint() override {
1830     IsFixed = true;
1831     return ChangeStatus::UNCHANGED;
1832   }
1833 
1834   ChangeStatus indicatePessimisticFixpoint() override {
1835     IsFixed = true;
1836     IsValidState = false;
1837     return ChangeStatus::CHANGED;
1838   }
1839 };
1840 
1841 ChangeStatus AAReturnedValuesImpl::manifest(Attributor &A) {
1842   ChangeStatus Changed = ChangeStatus::UNCHANGED;
1843 
1844   // Bookkeeping.
1845   assert(isValidState());
1846   STATS_DECLTRACK(KnownReturnValues, FunctionReturn,
1847                   "Number of function with known return values");
1848 
1849   // Check if we have an assumed unique return value that we could manifest.
1850   Optional<Value *> UniqueRV = getAssumedUniqueReturnValue(A);
1851 
1852   if (!UniqueRV.hasValue() || !UniqueRV.getValue())
1853     return Changed;
1854 
1855   // Bookkeeping.
1856   STATS_DECLTRACK(UniqueReturnValue, FunctionReturn,
1857                   "Number of function with unique return");
1858   // If the assumed unique return value is an argument, annotate it.
1859   if (auto *UniqueRVArg = dyn_cast<Argument>(UniqueRV.getValue())) {
1860     if (UniqueRVArg->getType()->canLosslesslyBitCastTo(
1861             getAssociatedFunction()->getReturnType())) {
1862       getIRPosition() = IRPosition::argument(*UniqueRVArg);
1863       Changed = IRAttribute::manifest(A);
1864     }
1865   }
1866   return Changed;
1867 }
1868 
1869 const std::string AAReturnedValuesImpl::getAsStr() const {
1870   return (isAtFixpoint() ? "returns(#" : "may-return(#") +
1871          (isValidState() ? std::to_string(getNumReturnValues()) : "?") + ")";
1872 }
1873 
1874 Optional<Value *>
1875 AAReturnedValuesImpl::getAssumedUniqueReturnValue(Attributor &A) const {
1876   // If checkForAllReturnedValues provides a unique value, ignoring potential
1877   // undef values that can also be present, it is assumed to be the actual
1878   // return value and forwarded to the caller of this method. If there are
1879   // multiple, a nullptr is returned indicating there cannot be a unique
1880   // returned value.
1881   Optional<Value *> UniqueRV;
1882   Type *Ty = getAssociatedFunction()->getReturnType();
1883 
1884   auto Pred = [&](Value &RV) -> bool {
1885     UniqueRV = AA::combineOptionalValuesInAAValueLatice(UniqueRV, &RV, Ty);
1886     return UniqueRV != Optional<Value *>(nullptr);
1887   };
1888 
1889   if (!A.checkForAllReturnedValues(Pred, *this))
1890     UniqueRV = nullptr;
1891 
1892   return UniqueRV;
1893 }
1894 
1895 bool AAReturnedValuesImpl::checkForAllReturnedValuesAndReturnInsts(
1896     function_ref<bool(Value &, const SmallSetVector<ReturnInst *, 4> &)> Pred)
1897     const {
1898   if (!isValidState())
1899     return false;
1900 
1901   // Check all returned values but ignore call sites as long as we have not
1902   // encountered an overdefined one during an update.
1903   for (auto &It : ReturnedValues) {
1904     Value *RV = It.first;
1905     if (!Pred(*RV, It.second))
1906       return false;
1907   }
1908 
1909   return true;
1910 }
1911 
1912 ChangeStatus AAReturnedValuesImpl::updateImpl(Attributor &A) {
1913   ChangeStatus Changed = ChangeStatus::UNCHANGED;
1914 
1915   auto ReturnValueCB = [&](Value &V, const Instruction *CtxI, ReturnInst &Ret,
1916                            bool) -> bool {
1917     assert(AA::isValidInScope(V, Ret.getFunction()) &&
1918            "Assumed returned value should be valid in function scope!");
1919     if (ReturnedValues[&V].insert(&Ret))
1920       Changed = ChangeStatus::CHANGED;
1921     return true;
1922   };
1923 
1924   bool UsedAssumedInformation = false;
1925   auto ReturnInstCB = [&](Instruction &I) {
1926     ReturnInst &Ret = cast<ReturnInst>(I);
1927     return genericValueTraversal<ReturnInst>(
1928         A, IRPosition::value(*Ret.getReturnValue()), *this, Ret, ReturnValueCB,
1929         &I, UsedAssumedInformation, /* UseValueSimplify */ true,
1930         /* MaxValues */ 16,
1931         /* StripCB */ nullptr, AA::Intraprocedural);
1932   };
1933 
1934   // Discover returned values from all live returned instructions in the
1935   // associated function.
1936   if (!A.checkForAllInstructions(ReturnInstCB, *this, {Instruction::Ret},
1937                                  UsedAssumedInformation))
1938     return indicatePessimisticFixpoint();
1939   return Changed;
1940 }
1941 
1942 struct AAReturnedValuesFunction final : public AAReturnedValuesImpl {
1943   AAReturnedValuesFunction(const IRPosition &IRP, Attributor &A)
1944       : AAReturnedValuesImpl(IRP, A) {}
1945 
1946   /// See AbstractAttribute::trackStatistics()
1947   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(returned) }
1948 };
1949 
1950 /// Returned values information for a call sites.
1951 struct AAReturnedValuesCallSite final : AAReturnedValuesImpl {
1952   AAReturnedValuesCallSite(const IRPosition &IRP, Attributor &A)
1953       : AAReturnedValuesImpl(IRP, A) {}
1954 
1955   /// See AbstractAttribute::initialize(...).
1956   void initialize(Attributor &A) override {
1957     // TODO: Once we have call site specific value information we can provide
1958     //       call site specific liveness information and then it makes
1959     //       sense to specialize attributes for call sites instead of
1960     //       redirecting requests to the callee.
1961     llvm_unreachable("Abstract attributes for returned values are not "
1962                      "supported for call sites yet!");
1963   }
1964 
1965   /// See AbstractAttribute::updateImpl(...).
1966   ChangeStatus updateImpl(Attributor &A) override {
1967     return indicatePessimisticFixpoint();
1968   }
1969 
1970   /// See AbstractAttribute::trackStatistics()
1971   void trackStatistics() const override {}
1972 };
1973 } // namespace
1974 
1975 /// ------------------------ NoSync Function Attribute -------------------------
1976 
1977 bool AANoSync::isNonRelaxedAtomic(const Instruction *I) {
1978   if (!I->isAtomic())
1979     return false;
1980 
1981   if (auto *FI = dyn_cast<FenceInst>(I))
1982     // All legal orderings for fence are stronger than monotonic.
1983     return FI->getSyncScopeID() != SyncScope::SingleThread;
1984   if (auto *AI = dyn_cast<AtomicCmpXchgInst>(I)) {
1985     // Unordered is not a legal ordering for cmpxchg.
1986     return (AI->getSuccessOrdering() != AtomicOrdering::Monotonic ||
1987             AI->getFailureOrdering() != AtomicOrdering::Monotonic);
1988   }
1989 
1990   AtomicOrdering Ordering;
1991   switch (I->getOpcode()) {
1992   case Instruction::AtomicRMW:
1993     Ordering = cast<AtomicRMWInst>(I)->getOrdering();
1994     break;
1995   case Instruction::Store:
1996     Ordering = cast<StoreInst>(I)->getOrdering();
1997     break;
1998   case Instruction::Load:
1999     Ordering = cast<LoadInst>(I)->getOrdering();
2000     break;
2001   default:
2002     llvm_unreachable(
2003         "New atomic operations need to be known in the attributor.");
2004   }
2005 
2006   return (Ordering != AtomicOrdering::Unordered &&
2007           Ordering != AtomicOrdering::Monotonic);
2008 }
2009 
2010 /// Return true if this intrinsic is nosync.  This is only used for intrinsics
2011 /// which would be nosync except that they have a volatile flag.  All other
2012 /// intrinsics are simply annotated with the nosync attribute in Intrinsics.td.
2013 bool AANoSync::isNoSyncIntrinsic(const Instruction *I) {
2014   if (auto *MI = dyn_cast<MemIntrinsic>(I))
2015     return !MI->isVolatile();
2016   return false;
2017 }
2018 
2019 namespace {
2020 struct AANoSyncImpl : AANoSync {
2021   AANoSyncImpl(const IRPosition &IRP, Attributor &A) : AANoSync(IRP, A) {}
2022 
2023   const std::string getAsStr() const override {
2024     return getAssumed() ? "nosync" : "may-sync";
2025   }
2026 
2027   /// See AbstractAttribute::updateImpl(...).
2028   ChangeStatus updateImpl(Attributor &A) override;
2029 };
2030 
2031 ChangeStatus AANoSyncImpl::updateImpl(Attributor &A) {
2032 
2033   auto CheckRWInstForNoSync = [&](Instruction &I) {
2034     return AA::isNoSyncInst(A, I, *this);
2035   };
2036 
2037   auto CheckForNoSync = [&](Instruction &I) {
2038     // At this point we handled all read/write effects and they are all
2039     // nosync, so they can be skipped.
2040     if (I.mayReadOrWriteMemory())
2041       return true;
2042 
2043     // non-convergent and readnone imply nosync.
2044     return !cast<CallBase>(I).isConvergent();
2045   };
2046 
2047   bool UsedAssumedInformation = false;
2048   if (!A.checkForAllReadWriteInstructions(CheckRWInstForNoSync, *this,
2049                                           UsedAssumedInformation) ||
2050       !A.checkForAllCallLikeInstructions(CheckForNoSync, *this,
2051                                          UsedAssumedInformation))
2052     return indicatePessimisticFixpoint();
2053 
2054   return ChangeStatus::UNCHANGED;
2055 }
2056 
2057 struct AANoSyncFunction final : public AANoSyncImpl {
2058   AANoSyncFunction(const IRPosition &IRP, Attributor &A)
2059       : AANoSyncImpl(IRP, A) {}
2060 
2061   /// See AbstractAttribute::trackStatistics()
2062   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nosync) }
2063 };
2064 
2065 /// NoSync attribute deduction for a call sites.
2066 struct AANoSyncCallSite final : AANoSyncImpl {
2067   AANoSyncCallSite(const IRPosition &IRP, Attributor &A)
2068       : AANoSyncImpl(IRP, A) {}
2069 
2070   /// See AbstractAttribute::initialize(...).
2071   void initialize(Attributor &A) override {
2072     AANoSyncImpl::initialize(A);
2073     Function *F = getAssociatedFunction();
2074     if (!F || F->isDeclaration())
2075       indicatePessimisticFixpoint();
2076   }
2077 
2078   /// See AbstractAttribute::updateImpl(...).
2079   ChangeStatus updateImpl(Attributor &A) override {
2080     // TODO: Once we have call site specific value information we can provide
2081     //       call site specific liveness information and then it makes
2082     //       sense to specialize attributes for call sites arguments instead of
2083     //       redirecting requests to the callee argument.
2084     Function *F = getAssociatedFunction();
2085     const IRPosition &FnPos = IRPosition::function(*F);
2086     auto &FnAA = A.getAAFor<AANoSync>(*this, FnPos, DepClassTy::REQUIRED);
2087     return clampStateAndIndicateChange(getState(), FnAA.getState());
2088   }
2089 
2090   /// See AbstractAttribute::trackStatistics()
2091   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nosync); }
2092 };
2093 } // namespace
2094 
2095 /// ------------------------ No-Free Attributes ----------------------------
2096 
2097 namespace {
2098 struct AANoFreeImpl : public AANoFree {
2099   AANoFreeImpl(const IRPosition &IRP, Attributor &A) : AANoFree(IRP, A) {}
2100 
2101   /// See AbstractAttribute::updateImpl(...).
2102   ChangeStatus updateImpl(Attributor &A) override {
2103     auto CheckForNoFree = [&](Instruction &I) {
2104       const auto &CB = cast<CallBase>(I);
2105       if (CB.hasFnAttr(Attribute::NoFree))
2106         return true;
2107 
2108       const auto &NoFreeAA = A.getAAFor<AANoFree>(
2109           *this, IRPosition::callsite_function(CB), DepClassTy::REQUIRED);
2110       return NoFreeAA.isAssumedNoFree();
2111     };
2112 
2113     bool UsedAssumedInformation = false;
2114     if (!A.checkForAllCallLikeInstructions(CheckForNoFree, *this,
2115                                            UsedAssumedInformation))
2116       return indicatePessimisticFixpoint();
2117     return ChangeStatus::UNCHANGED;
2118   }
2119 
2120   /// See AbstractAttribute::getAsStr().
2121   const std::string getAsStr() const override {
2122     return getAssumed() ? "nofree" : "may-free";
2123   }
2124 };
2125 
2126 struct AANoFreeFunction final : public AANoFreeImpl {
2127   AANoFreeFunction(const IRPosition &IRP, Attributor &A)
2128       : AANoFreeImpl(IRP, A) {}
2129 
2130   /// See AbstractAttribute::trackStatistics()
2131   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nofree) }
2132 };
2133 
2134 /// NoFree attribute deduction for a call sites.
2135 struct AANoFreeCallSite final : AANoFreeImpl {
2136   AANoFreeCallSite(const IRPosition &IRP, Attributor &A)
2137       : AANoFreeImpl(IRP, A) {}
2138 
2139   /// See AbstractAttribute::initialize(...).
2140   void initialize(Attributor &A) override {
2141     AANoFreeImpl::initialize(A);
2142     Function *F = getAssociatedFunction();
2143     if (!F || F->isDeclaration())
2144       indicatePessimisticFixpoint();
2145   }
2146 
2147   /// See AbstractAttribute::updateImpl(...).
2148   ChangeStatus updateImpl(Attributor &A) override {
2149     // TODO: Once we have call site specific value information we can provide
2150     //       call site specific liveness information and then it makes
2151     //       sense to specialize attributes for call sites arguments instead of
2152     //       redirecting requests to the callee argument.
2153     Function *F = getAssociatedFunction();
2154     const IRPosition &FnPos = IRPosition::function(*F);
2155     auto &FnAA = A.getAAFor<AANoFree>(*this, FnPos, DepClassTy::REQUIRED);
2156     return clampStateAndIndicateChange(getState(), FnAA.getState());
2157   }
2158 
2159   /// See AbstractAttribute::trackStatistics()
2160   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nofree); }
2161 };
2162 
2163 /// NoFree attribute for floating values.
2164 struct AANoFreeFloating : AANoFreeImpl {
2165   AANoFreeFloating(const IRPosition &IRP, Attributor &A)
2166       : AANoFreeImpl(IRP, A) {}
2167 
2168   /// See AbstractAttribute::trackStatistics()
2169   void trackStatistics() const override{STATS_DECLTRACK_FLOATING_ATTR(nofree)}
2170 
2171   /// See Abstract Attribute::updateImpl(...).
2172   ChangeStatus updateImpl(Attributor &A) override {
2173     const IRPosition &IRP = getIRPosition();
2174 
2175     const auto &NoFreeAA = A.getAAFor<AANoFree>(
2176         *this, IRPosition::function_scope(IRP), DepClassTy::OPTIONAL);
2177     if (NoFreeAA.isAssumedNoFree())
2178       return ChangeStatus::UNCHANGED;
2179 
2180     Value &AssociatedValue = getIRPosition().getAssociatedValue();
2181     auto Pred = [&](const Use &U, bool &Follow) -> bool {
2182       Instruction *UserI = cast<Instruction>(U.getUser());
2183       if (auto *CB = dyn_cast<CallBase>(UserI)) {
2184         if (CB->isBundleOperand(&U))
2185           return false;
2186         if (!CB->isArgOperand(&U))
2187           return true;
2188         unsigned ArgNo = CB->getArgOperandNo(&U);
2189 
2190         const auto &NoFreeArg = A.getAAFor<AANoFree>(
2191             *this, IRPosition::callsite_argument(*CB, ArgNo),
2192             DepClassTy::REQUIRED);
2193         return NoFreeArg.isAssumedNoFree();
2194       }
2195 
2196       if (isa<GetElementPtrInst>(UserI) || isa<BitCastInst>(UserI) ||
2197           isa<PHINode>(UserI) || isa<SelectInst>(UserI)) {
2198         Follow = true;
2199         return true;
2200       }
2201       if (isa<StoreInst>(UserI) || isa<LoadInst>(UserI) ||
2202           isa<ReturnInst>(UserI))
2203         return true;
2204 
2205       // Unknown user.
2206       return false;
2207     };
2208     if (!A.checkForAllUses(Pred, *this, AssociatedValue))
2209       return indicatePessimisticFixpoint();
2210 
2211     return ChangeStatus::UNCHANGED;
2212   }
2213 };
2214 
2215 /// NoFree attribute for a call site argument.
2216 struct AANoFreeArgument final : AANoFreeFloating {
2217   AANoFreeArgument(const IRPosition &IRP, Attributor &A)
2218       : AANoFreeFloating(IRP, A) {}
2219 
2220   /// See AbstractAttribute::trackStatistics()
2221   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(nofree) }
2222 };
2223 
2224 /// NoFree attribute for call site arguments.
2225 struct AANoFreeCallSiteArgument final : AANoFreeFloating {
2226   AANoFreeCallSiteArgument(const IRPosition &IRP, Attributor &A)
2227       : AANoFreeFloating(IRP, A) {}
2228 
2229   /// See AbstractAttribute::updateImpl(...).
2230   ChangeStatus updateImpl(Attributor &A) override {
2231     // TODO: Once we have call site specific value information we can provide
2232     //       call site specific liveness information and then it makes
2233     //       sense to specialize attributes for call sites arguments instead of
2234     //       redirecting requests to the callee argument.
2235     Argument *Arg = getAssociatedArgument();
2236     if (!Arg)
2237       return indicatePessimisticFixpoint();
2238     const IRPosition &ArgPos = IRPosition::argument(*Arg);
2239     auto &ArgAA = A.getAAFor<AANoFree>(*this, ArgPos, DepClassTy::REQUIRED);
2240     return clampStateAndIndicateChange(getState(), ArgAA.getState());
2241   }
2242 
2243   /// See AbstractAttribute::trackStatistics()
2244   void trackStatistics() const override{STATS_DECLTRACK_CSARG_ATTR(nofree)};
2245 };
2246 
2247 /// NoFree attribute for function return value.
2248 struct AANoFreeReturned final : AANoFreeFloating {
2249   AANoFreeReturned(const IRPosition &IRP, Attributor &A)
2250       : AANoFreeFloating(IRP, A) {
2251     llvm_unreachable("NoFree is not applicable to function returns!");
2252   }
2253 
2254   /// See AbstractAttribute::initialize(...).
2255   void initialize(Attributor &A) override {
2256     llvm_unreachable("NoFree is not applicable to function returns!");
2257   }
2258 
2259   /// See AbstractAttribute::updateImpl(...).
2260   ChangeStatus updateImpl(Attributor &A) override {
2261     llvm_unreachable("NoFree is not applicable to function returns!");
2262   }
2263 
2264   /// See AbstractAttribute::trackStatistics()
2265   void trackStatistics() const override {}
2266 };
2267 
2268 /// NoFree attribute deduction for a call site return value.
2269 struct AANoFreeCallSiteReturned final : AANoFreeFloating {
2270   AANoFreeCallSiteReturned(const IRPosition &IRP, Attributor &A)
2271       : AANoFreeFloating(IRP, A) {}
2272 
2273   ChangeStatus manifest(Attributor &A) override {
2274     return ChangeStatus::UNCHANGED;
2275   }
2276   /// See AbstractAttribute::trackStatistics()
2277   void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(nofree) }
2278 };
2279 } // namespace
2280 
2281 /// ------------------------ NonNull Argument Attribute ------------------------
2282 namespace {
2283 static int64_t getKnownNonNullAndDerefBytesForUse(
2284     Attributor &A, const AbstractAttribute &QueryingAA, Value &AssociatedValue,
2285     const Use *U, const Instruction *I, bool &IsNonNull, bool &TrackUse) {
2286   TrackUse = false;
2287 
2288   const Value *UseV = U->get();
2289   if (!UseV->getType()->isPointerTy())
2290     return 0;
2291 
2292   // We need to follow common pointer manipulation uses to the accesses they
2293   // feed into. We can try to be smart to avoid looking through things we do not
2294   // like for now, e.g., non-inbounds GEPs.
2295   if (isa<CastInst>(I)) {
2296     TrackUse = true;
2297     return 0;
2298   }
2299 
2300   if (isa<GetElementPtrInst>(I)) {
2301     TrackUse = true;
2302     return 0;
2303   }
2304 
2305   Type *PtrTy = UseV->getType();
2306   const Function *F = I->getFunction();
2307   bool NullPointerIsDefined =
2308       F ? llvm::NullPointerIsDefined(F, PtrTy->getPointerAddressSpace()) : true;
2309   const DataLayout &DL = A.getInfoCache().getDL();
2310   if (const auto *CB = dyn_cast<CallBase>(I)) {
2311     if (CB->isBundleOperand(U)) {
2312       if (RetainedKnowledge RK = getKnowledgeFromUse(
2313               U, {Attribute::NonNull, Attribute::Dereferenceable})) {
2314         IsNonNull |=
2315             (RK.AttrKind == Attribute::NonNull || !NullPointerIsDefined);
2316         return RK.ArgValue;
2317       }
2318       return 0;
2319     }
2320 
2321     if (CB->isCallee(U)) {
2322       IsNonNull |= !NullPointerIsDefined;
2323       return 0;
2324     }
2325 
2326     unsigned ArgNo = CB->getArgOperandNo(U);
2327     IRPosition IRP = IRPosition::callsite_argument(*CB, ArgNo);
2328     // As long as we only use known information there is no need to track
2329     // dependences here.
2330     auto &DerefAA =
2331         A.getAAFor<AADereferenceable>(QueryingAA, IRP, DepClassTy::NONE);
2332     IsNonNull |= DerefAA.isKnownNonNull();
2333     return DerefAA.getKnownDereferenceableBytes();
2334   }
2335 
2336   Optional<MemoryLocation> Loc = MemoryLocation::getOrNone(I);
2337   if (!Loc || Loc->Ptr != UseV || !Loc->Size.isPrecise() || I->isVolatile())
2338     return 0;
2339 
2340   int64_t Offset;
2341   const Value *Base =
2342       getMinimalBaseOfPointer(A, QueryingAA, Loc->Ptr, Offset, DL);
2343   if (Base && Base == &AssociatedValue) {
2344     int64_t DerefBytes = Loc->Size.getValue() + Offset;
2345     IsNonNull |= !NullPointerIsDefined;
2346     return std::max(int64_t(0), DerefBytes);
2347   }
2348 
2349   /// Corner case when an offset is 0.
2350   Base = GetPointerBaseWithConstantOffset(Loc->Ptr, Offset, DL,
2351                                           /*AllowNonInbounds*/ true);
2352   if (Base && Base == &AssociatedValue && Offset == 0) {
2353     int64_t DerefBytes = Loc->Size.getValue();
2354     IsNonNull |= !NullPointerIsDefined;
2355     return std::max(int64_t(0), DerefBytes);
2356   }
2357 
2358   return 0;
2359 }
2360 
2361 struct AANonNullImpl : AANonNull {
2362   AANonNullImpl(const IRPosition &IRP, Attributor &A)
2363       : AANonNull(IRP, A),
2364         NullIsDefined(NullPointerIsDefined(
2365             getAnchorScope(),
2366             getAssociatedValue().getType()->getPointerAddressSpace())) {}
2367 
2368   /// See AbstractAttribute::initialize(...).
2369   void initialize(Attributor &A) override {
2370     Value &V = getAssociatedValue();
2371     if (!NullIsDefined &&
2372         hasAttr({Attribute::NonNull, Attribute::Dereferenceable},
2373                 /* IgnoreSubsumingPositions */ false, &A)) {
2374       indicateOptimisticFixpoint();
2375       return;
2376     }
2377 
2378     if (isa<ConstantPointerNull>(V)) {
2379       indicatePessimisticFixpoint();
2380       return;
2381     }
2382 
2383     AANonNull::initialize(A);
2384 
2385     bool CanBeNull, CanBeFreed;
2386     if (V.getPointerDereferenceableBytes(A.getDataLayout(), CanBeNull,
2387                                          CanBeFreed)) {
2388       if (!CanBeNull) {
2389         indicateOptimisticFixpoint();
2390         return;
2391       }
2392     }
2393 
2394     if (isa<GlobalValue>(&getAssociatedValue())) {
2395       indicatePessimisticFixpoint();
2396       return;
2397     }
2398 
2399     if (Instruction *CtxI = getCtxI())
2400       followUsesInMBEC(*this, A, getState(), *CtxI);
2401   }
2402 
2403   /// See followUsesInMBEC
2404   bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I,
2405                        AANonNull::StateType &State) {
2406     bool IsNonNull = false;
2407     bool TrackUse = false;
2408     getKnownNonNullAndDerefBytesForUse(A, *this, getAssociatedValue(), U, I,
2409                                        IsNonNull, TrackUse);
2410     State.setKnown(IsNonNull);
2411     return TrackUse;
2412   }
2413 
2414   /// See AbstractAttribute::getAsStr().
2415   const std::string getAsStr() const override {
2416     return getAssumed() ? "nonnull" : "may-null";
2417   }
2418 
2419   /// Flag to determine if the underlying value can be null and still allow
2420   /// valid accesses.
2421   const bool NullIsDefined;
2422 };
2423 
2424 /// NonNull attribute for a floating value.
2425 struct AANonNullFloating : public AANonNullImpl {
2426   AANonNullFloating(const IRPosition &IRP, Attributor &A)
2427       : AANonNullImpl(IRP, A) {}
2428 
2429   /// See AbstractAttribute::updateImpl(...).
2430   ChangeStatus updateImpl(Attributor &A) override {
2431     const DataLayout &DL = A.getDataLayout();
2432 
2433     DominatorTree *DT = nullptr;
2434     AssumptionCache *AC = nullptr;
2435     InformationCache &InfoCache = A.getInfoCache();
2436     if (const Function *Fn = getAnchorScope()) {
2437       DT = InfoCache.getAnalysisResultForFunction<DominatorTreeAnalysis>(*Fn);
2438       AC = InfoCache.getAnalysisResultForFunction<AssumptionAnalysis>(*Fn);
2439     }
2440 
2441     auto VisitValueCB = [&](Value &V, const Instruction *CtxI,
2442                             AANonNull::StateType &T, bool Stripped) -> bool {
2443       const auto &AA = A.getAAFor<AANonNull>(*this, IRPosition::value(V),
2444                                              DepClassTy::REQUIRED);
2445       if (!Stripped && this == &AA) {
2446         if (!isKnownNonZero(&V, DL, 0, AC, CtxI, DT))
2447           T.indicatePessimisticFixpoint();
2448       } else {
2449         // Use abstract attribute information.
2450         const AANonNull::StateType &NS = AA.getState();
2451         T ^= NS;
2452       }
2453       return T.isValidState();
2454     };
2455 
2456     StateType T;
2457     bool UsedAssumedInformation = false;
2458     if (!genericValueTraversal<StateType>(A, getIRPosition(), *this, T,
2459                                           VisitValueCB, getCtxI(),
2460                                           UsedAssumedInformation))
2461       return indicatePessimisticFixpoint();
2462 
2463     return clampStateAndIndicateChange(getState(), T);
2464   }
2465 
2466   /// See AbstractAttribute::trackStatistics()
2467   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(nonnull) }
2468 };
2469 
2470 /// NonNull attribute for function return value.
2471 struct AANonNullReturned final
2472     : AAReturnedFromReturnedValues<AANonNull, AANonNull> {
2473   AANonNullReturned(const IRPosition &IRP, Attributor &A)
2474       : AAReturnedFromReturnedValues<AANonNull, AANonNull>(IRP, A) {}
2475 
2476   /// See AbstractAttribute::getAsStr().
2477   const std::string getAsStr() const override {
2478     return getAssumed() ? "nonnull" : "may-null";
2479   }
2480 
2481   /// See AbstractAttribute::trackStatistics()
2482   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(nonnull) }
2483 };
2484 
2485 /// NonNull attribute for function argument.
2486 struct AANonNullArgument final
2487     : AAArgumentFromCallSiteArguments<AANonNull, AANonNullImpl> {
2488   AANonNullArgument(const IRPosition &IRP, Attributor &A)
2489       : AAArgumentFromCallSiteArguments<AANonNull, AANonNullImpl>(IRP, A) {}
2490 
2491   /// See AbstractAttribute::trackStatistics()
2492   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(nonnull) }
2493 };
2494 
2495 struct AANonNullCallSiteArgument final : AANonNullFloating {
2496   AANonNullCallSiteArgument(const IRPosition &IRP, Attributor &A)
2497       : AANonNullFloating(IRP, A) {}
2498 
2499   /// See AbstractAttribute::trackStatistics()
2500   void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(nonnull) }
2501 };
2502 
2503 /// NonNull attribute for a call site return position.
2504 struct AANonNullCallSiteReturned final
2505     : AACallSiteReturnedFromReturned<AANonNull, AANonNullImpl> {
2506   AANonNullCallSiteReturned(const IRPosition &IRP, Attributor &A)
2507       : AACallSiteReturnedFromReturned<AANonNull, AANonNullImpl>(IRP, A) {}
2508 
2509   /// See AbstractAttribute::trackStatistics()
2510   void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(nonnull) }
2511 };
2512 } // namespace
2513 
2514 /// ------------------------ No-Recurse Attributes ----------------------------
2515 
2516 namespace {
2517 struct AANoRecurseImpl : public AANoRecurse {
2518   AANoRecurseImpl(const IRPosition &IRP, Attributor &A) : AANoRecurse(IRP, A) {}
2519 
2520   /// See AbstractAttribute::getAsStr()
2521   const std::string getAsStr() const override {
2522     return getAssumed() ? "norecurse" : "may-recurse";
2523   }
2524 };
2525 
2526 struct AANoRecurseFunction final : AANoRecurseImpl {
2527   AANoRecurseFunction(const IRPosition &IRP, Attributor &A)
2528       : AANoRecurseImpl(IRP, A) {}
2529 
2530   /// See AbstractAttribute::updateImpl(...).
2531   ChangeStatus updateImpl(Attributor &A) override {
2532 
2533     // If all live call sites are known to be no-recurse, we are as well.
2534     auto CallSitePred = [&](AbstractCallSite ACS) {
2535       const auto &NoRecurseAA = A.getAAFor<AANoRecurse>(
2536           *this, IRPosition::function(*ACS.getInstruction()->getFunction()),
2537           DepClassTy::NONE);
2538       return NoRecurseAA.isKnownNoRecurse();
2539     };
2540     bool UsedAssumedInformation = false;
2541     if (A.checkForAllCallSites(CallSitePred, *this, true,
2542                                UsedAssumedInformation)) {
2543       // If we know all call sites and all are known no-recurse, we are done.
2544       // If all known call sites, which might not be all that exist, are known
2545       // to be no-recurse, we are not done but we can continue to assume
2546       // no-recurse. If one of the call sites we have not visited will become
2547       // live, another update is triggered.
2548       if (!UsedAssumedInformation)
2549         indicateOptimisticFixpoint();
2550       return ChangeStatus::UNCHANGED;
2551     }
2552 
2553     const AAFunctionReachability &EdgeReachability =
2554         A.getAAFor<AAFunctionReachability>(*this, getIRPosition(),
2555                                            DepClassTy::REQUIRED);
2556     if (EdgeReachability.canReach(A, *getAnchorScope()))
2557       return indicatePessimisticFixpoint();
2558     return ChangeStatus::UNCHANGED;
2559   }
2560 
2561   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(norecurse) }
2562 };
2563 
2564 /// NoRecurse attribute deduction for a call sites.
2565 struct AANoRecurseCallSite final : AANoRecurseImpl {
2566   AANoRecurseCallSite(const IRPosition &IRP, Attributor &A)
2567       : AANoRecurseImpl(IRP, A) {}
2568 
2569   /// See AbstractAttribute::initialize(...).
2570   void initialize(Attributor &A) override {
2571     AANoRecurseImpl::initialize(A);
2572     Function *F = getAssociatedFunction();
2573     if (!F || F->isDeclaration())
2574       indicatePessimisticFixpoint();
2575   }
2576 
2577   /// See AbstractAttribute::updateImpl(...).
2578   ChangeStatus updateImpl(Attributor &A) override {
2579     // TODO: Once we have call site specific value information we can provide
2580     //       call site specific liveness information and then it makes
2581     //       sense to specialize attributes for call sites arguments instead of
2582     //       redirecting requests to the callee argument.
2583     Function *F = getAssociatedFunction();
2584     const IRPosition &FnPos = IRPosition::function(*F);
2585     auto &FnAA = A.getAAFor<AANoRecurse>(*this, FnPos, DepClassTy::REQUIRED);
2586     return clampStateAndIndicateChange(getState(), FnAA.getState());
2587   }
2588 
2589   /// See AbstractAttribute::trackStatistics()
2590   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(norecurse); }
2591 };
2592 } // namespace
2593 
2594 /// -------------------- Undefined-Behavior Attributes ------------------------
2595 
2596 namespace {
2597 struct AAUndefinedBehaviorImpl : public AAUndefinedBehavior {
2598   AAUndefinedBehaviorImpl(const IRPosition &IRP, Attributor &A)
2599       : AAUndefinedBehavior(IRP, A) {}
2600 
2601   /// See AbstractAttribute::updateImpl(...).
2602   // through a pointer (i.e. also branches etc.)
2603   ChangeStatus updateImpl(Attributor &A) override {
2604     const size_t UBPrevSize = KnownUBInsts.size();
2605     const size_t NoUBPrevSize = AssumedNoUBInsts.size();
2606 
2607     auto InspectMemAccessInstForUB = [&](Instruction &I) {
2608       // Lang ref now states volatile store is not UB, let's skip them.
2609       if (I.isVolatile() && I.mayWriteToMemory())
2610         return true;
2611 
2612       // Skip instructions that are already saved.
2613       if (AssumedNoUBInsts.count(&I) || KnownUBInsts.count(&I))
2614         return true;
2615 
2616       // If we reach here, we know we have an instruction
2617       // that accesses memory through a pointer operand,
2618       // for which getPointerOperand() should give it to us.
2619       Value *PtrOp =
2620           const_cast<Value *>(getPointerOperand(&I, /* AllowVolatile */ true));
2621       assert(PtrOp &&
2622              "Expected pointer operand of memory accessing instruction");
2623 
2624       // Either we stopped and the appropriate action was taken,
2625       // or we got back a simplified value to continue.
2626       Optional<Value *> SimplifiedPtrOp = stopOnUndefOrAssumed(A, PtrOp, &I);
2627       if (!SimplifiedPtrOp.hasValue() || !SimplifiedPtrOp.getValue())
2628         return true;
2629       const Value *PtrOpVal = SimplifiedPtrOp.getValue();
2630 
2631       // A memory access through a pointer is considered UB
2632       // only if the pointer has constant null value.
2633       // TODO: Expand it to not only check constant values.
2634       if (!isa<ConstantPointerNull>(PtrOpVal)) {
2635         AssumedNoUBInsts.insert(&I);
2636         return true;
2637       }
2638       const Type *PtrTy = PtrOpVal->getType();
2639 
2640       // Because we only consider instructions inside functions,
2641       // assume that a parent function exists.
2642       const Function *F = I.getFunction();
2643 
2644       // A memory access using constant null pointer is only considered UB
2645       // if null pointer is _not_ defined for the target platform.
2646       if (llvm::NullPointerIsDefined(F, PtrTy->getPointerAddressSpace()))
2647         AssumedNoUBInsts.insert(&I);
2648       else
2649         KnownUBInsts.insert(&I);
2650       return true;
2651     };
2652 
2653     auto InspectBrInstForUB = [&](Instruction &I) {
2654       // A conditional branch instruction is considered UB if it has `undef`
2655       // condition.
2656 
2657       // Skip instructions that are already saved.
2658       if (AssumedNoUBInsts.count(&I) || KnownUBInsts.count(&I))
2659         return true;
2660 
2661       // We know we have a branch instruction.
2662       auto *BrInst = cast<BranchInst>(&I);
2663 
2664       // Unconditional branches are never considered UB.
2665       if (BrInst->isUnconditional())
2666         return true;
2667 
2668       // Either we stopped and the appropriate action was taken,
2669       // or we got back a simplified value to continue.
2670       Optional<Value *> SimplifiedCond =
2671           stopOnUndefOrAssumed(A, BrInst->getCondition(), BrInst);
2672       if (!SimplifiedCond.hasValue() || !SimplifiedCond.getValue())
2673         return true;
2674       AssumedNoUBInsts.insert(&I);
2675       return true;
2676     };
2677 
2678     auto InspectCallSiteForUB = [&](Instruction &I) {
2679       // Check whether a callsite always cause UB or not
2680 
2681       // Skip instructions that are already saved.
2682       if (AssumedNoUBInsts.count(&I) || KnownUBInsts.count(&I))
2683         return true;
2684 
2685       // Check nonnull and noundef argument attribute violation for each
2686       // callsite.
2687       CallBase &CB = cast<CallBase>(I);
2688       Function *Callee = CB.getCalledFunction();
2689       if (!Callee)
2690         return true;
2691       for (unsigned idx = 0; idx < CB.arg_size(); idx++) {
2692         // If current argument is known to be simplified to null pointer and the
2693         // corresponding argument position is known to have nonnull attribute,
2694         // the argument is poison. Furthermore, if the argument is poison and
2695         // the position is known to have noundef attriubte, this callsite is
2696         // considered UB.
2697         if (idx >= Callee->arg_size())
2698           break;
2699         Value *ArgVal = CB.getArgOperand(idx);
2700         if (!ArgVal)
2701           continue;
2702         // Here, we handle three cases.
2703         //   (1) Not having a value means it is dead. (we can replace the value
2704         //       with undef)
2705         //   (2) Simplified to undef. The argument violate noundef attriubte.
2706         //   (3) Simplified to null pointer where known to be nonnull.
2707         //       The argument is a poison value and violate noundef attribute.
2708         IRPosition CalleeArgumentIRP = IRPosition::callsite_argument(CB, idx);
2709         auto &NoUndefAA =
2710             A.getAAFor<AANoUndef>(*this, CalleeArgumentIRP, DepClassTy::NONE);
2711         if (!NoUndefAA.isKnownNoUndef())
2712           continue;
2713         bool UsedAssumedInformation = false;
2714         Optional<Value *> SimplifiedVal = A.getAssumedSimplified(
2715             IRPosition::value(*ArgVal), *this, UsedAssumedInformation);
2716         if (UsedAssumedInformation)
2717           continue;
2718         if (SimplifiedVal.hasValue() && !SimplifiedVal.getValue())
2719           return true;
2720         if (!SimplifiedVal.hasValue() ||
2721             isa<UndefValue>(*SimplifiedVal.getValue())) {
2722           KnownUBInsts.insert(&I);
2723           continue;
2724         }
2725         if (!ArgVal->getType()->isPointerTy() ||
2726             !isa<ConstantPointerNull>(*SimplifiedVal.getValue()))
2727           continue;
2728         auto &NonNullAA =
2729             A.getAAFor<AANonNull>(*this, CalleeArgumentIRP, DepClassTy::NONE);
2730         if (NonNullAA.isKnownNonNull())
2731           KnownUBInsts.insert(&I);
2732       }
2733       return true;
2734     };
2735 
2736     auto InspectReturnInstForUB = [&](Instruction &I) {
2737       auto &RI = cast<ReturnInst>(I);
2738       // Either we stopped and the appropriate action was taken,
2739       // or we got back a simplified return value to continue.
2740       Optional<Value *> SimplifiedRetValue =
2741           stopOnUndefOrAssumed(A, RI.getReturnValue(), &I);
2742       if (!SimplifiedRetValue.hasValue() || !SimplifiedRetValue.getValue())
2743         return true;
2744 
2745       // Check if a return instruction always cause UB or not
2746       // Note: It is guaranteed that the returned position of the anchor
2747       //       scope has noundef attribute when this is called.
2748       //       We also ensure the return position is not "assumed dead"
2749       //       because the returned value was then potentially simplified to
2750       //       `undef` in AAReturnedValues without removing the `noundef`
2751       //       attribute yet.
2752 
2753       // When the returned position has noundef attriubte, UB occurs in the
2754       // following cases.
2755       //   (1) Returned value is known to be undef.
2756       //   (2) The value is known to be a null pointer and the returned
2757       //       position has nonnull attribute (because the returned value is
2758       //       poison).
2759       if (isa<ConstantPointerNull>(*SimplifiedRetValue)) {
2760         auto &NonNullAA = A.getAAFor<AANonNull>(
2761             *this, IRPosition::returned(*getAnchorScope()), DepClassTy::NONE);
2762         if (NonNullAA.isKnownNonNull())
2763           KnownUBInsts.insert(&I);
2764       }
2765 
2766       return true;
2767     };
2768 
2769     bool UsedAssumedInformation = false;
2770     A.checkForAllInstructions(InspectMemAccessInstForUB, *this,
2771                               {Instruction::Load, Instruction::Store,
2772                                Instruction::AtomicCmpXchg,
2773                                Instruction::AtomicRMW},
2774                               UsedAssumedInformation,
2775                               /* CheckBBLivenessOnly */ true);
2776     A.checkForAllInstructions(InspectBrInstForUB, *this, {Instruction::Br},
2777                               UsedAssumedInformation,
2778                               /* CheckBBLivenessOnly */ true);
2779     A.checkForAllCallLikeInstructions(InspectCallSiteForUB, *this,
2780                                       UsedAssumedInformation);
2781 
2782     // If the returned position of the anchor scope has noundef attriubte, check
2783     // all returned instructions.
2784     if (!getAnchorScope()->getReturnType()->isVoidTy()) {
2785       const IRPosition &ReturnIRP = IRPosition::returned(*getAnchorScope());
2786       if (!A.isAssumedDead(ReturnIRP, this, nullptr, UsedAssumedInformation)) {
2787         auto &RetPosNoUndefAA =
2788             A.getAAFor<AANoUndef>(*this, ReturnIRP, DepClassTy::NONE);
2789         if (RetPosNoUndefAA.isKnownNoUndef())
2790           A.checkForAllInstructions(InspectReturnInstForUB, *this,
2791                                     {Instruction::Ret}, UsedAssumedInformation,
2792                                     /* CheckBBLivenessOnly */ true);
2793       }
2794     }
2795 
2796     if (NoUBPrevSize != AssumedNoUBInsts.size() ||
2797         UBPrevSize != KnownUBInsts.size())
2798       return ChangeStatus::CHANGED;
2799     return ChangeStatus::UNCHANGED;
2800   }
2801 
2802   bool isKnownToCauseUB(Instruction *I) const override {
2803     return KnownUBInsts.count(I);
2804   }
2805 
2806   bool isAssumedToCauseUB(Instruction *I) const override {
2807     // In simple words, if an instruction is not in the assumed to _not_
2808     // cause UB, then it is assumed UB (that includes those
2809     // in the KnownUBInsts set). The rest is boilerplate
2810     // is to ensure that it is one of the instructions we test
2811     // for UB.
2812 
2813     switch (I->getOpcode()) {
2814     case Instruction::Load:
2815     case Instruction::Store:
2816     case Instruction::AtomicCmpXchg:
2817     case Instruction::AtomicRMW:
2818       return !AssumedNoUBInsts.count(I);
2819     case Instruction::Br: {
2820       auto *BrInst = cast<BranchInst>(I);
2821       if (BrInst->isUnconditional())
2822         return false;
2823       return !AssumedNoUBInsts.count(I);
2824     } break;
2825     default:
2826       return false;
2827     }
2828     return false;
2829   }
2830 
2831   ChangeStatus manifest(Attributor &A) override {
2832     if (KnownUBInsts.empty())
2833       return ChangeStatus::UNCHANGED;
2834     for (Instruction *I : KnownUBInsts)
2835       A.changeToUnreachableAfterManifest(I);
2836     return ChangeStatus::CHANGED;
2837   }
2838 
2839   /// See AbstractAttribute::getAsStr()
2840   const std::string getAsStr() const override {
2841     return getAssumed() ? "undefined-behavior" : "no-ub";
2842   }
2843 
2844   /// Note: The correctness of this analysis depends on the fact that the
2845   /// following 2 sets will stop changing after some point.
2846   /// "Change" here means that their size changes.
2847   /// The size of each set is monotonically increasing
2848   /// (we only add items to them) and it is upper bounded by the number of
2849   /// instructions in the processed function (we can never save more
2850   /// elements in either set than this number). Hence, at some point,
2851   /// they will stop increasing.
2852   /// Consequently, at some point, both sets will have stopped
2853   /// changing, effectively making the analysis reach a fixpoint.
2854 
2855   /// Note: These 2 sets are disjoint and an instruction can be considered
2856   /// one of 3 things:
2857   /// 1) Known to cause UB (AAUndefinedBehavior could prove it) and put it in
2858   ///    the KnownUBInsts set.
2859   /// 2) Assumed to cause UB (in every updateImpl, AAUndefinedBehavior
2860   ///    has a reason to assume it).
2861   /// 3) Assumed to not cause UB. very other instruction - AAUndefinedBehavior
2862   ///    could not find a reason to assume or prove that it can cause UB,
2863   ///    hence it assumes it doesn't. We have a set for these instructions
2864   ///    so that we don't reprocess them in every update.
2865   ///    Note however that instructions in this set may cause UB.
2866 
2867 protected:
2868   /// A set of all live instructions _known_ to cause UB.
2869   SmallPtrSet<Instruction *, 8> KnownUBInsts;
2870 
2871 private:
2872   /// A set of all the (live) instructions that are assumed to _not_ cause UB.
2873   SmallPtrSet<Instruction *, 8> AssumedNoUBInsts;
2874 
2875   // Should be called on updates in which if we're processing an instruction
2876   // \p I that depends on a value \p V, one of the following has to happen:
2877   // - If the value is assumed, then stop.
2878   // - If the value is known but undef, then consider it UB.
2879   // - Otherwise, do specific processing with the simplified value.
2880   // We return None in the first 2 cases to signify that an appropriate
2881   // action was taken and the caller should stop.
2882   // Otherwise, we return the simplified value that the caller should
2883   // use for specific processing.
2884   Optional<Value *> stopOnUndefOrAssumed(Attributor &A, Value *V,
2885                                          Instruction *I) {
2886     bool UsedAssumedInformation = false;
2887     Optional<Value *> SimplifiedV = A.getAssumedSimplified(
2888         IRPosition::value(*V), *this, UsedAssumedInformation);
2889     if (!UsedAssumedInformation) {
2890       // Don't depend on assumed values.
2891       if (!SimplifiedV.hasValue()) {
2892         // If it is known (which we tested above) but it doesn't have a value,
2893         // then we can assume `undef` and hence the instruction is UB.
2894         KnownUBInsts.insert(I);
2895         return llvm::None;
2896       }
2897       if (!SimplifiedV.getValue())
2898         return nullptr;
2899       V = *SimplifiedV;
2900     }
2901     if (isa<UndefValue>(V)) {
2902       KnownUBInsts.insert(I);
2903       return llvm::None;
2904     }
2905     return V;
2906   }
2907 };
2908 
2909 struct AAUndefinedBehaviorFunction final : AAUndefinedBehaviorImpl {
2910   AAUndefinedBehaviorFunction(const IRPosition &IRP, Attributor &A)
2911       : AAUndefinedBehaviorImpl(IRP, A) {}
2912 
2913   /// See AbstractAttribute::trackStatistics()
2914   void trackStatistics() const override {
2915     STATS_DECL(UndefinedBehaviorInstruction, Instruction,
2916                "Number of instructions known to have UB");
2917     BUILD_STAT_NAME(UndefinedBehaviorInstruction, Instruction) +=
2918         KnownUBInsts.size();
2919   }
2920 };
2921 } // namespace
2922 
2923 /// ------------------------ Will-Return Attributes ----------------------------
2924 
2925 namespace {
2926 // Helper function that checks whether a function has any cycle which we don't
2927 // know if it is bounded or not.
2928 // Loops with maximum trip count are considered bounded, any other cycle not.
2929 static bool mayContainUnboundedCycle(Function &F, Attributor &A) {
2930   ScalarEvolution *SE =
2931       A.getInfoCache().getAnalysisResultForFunction<ScalarEvolutionAnalysis>(F);
2932   LoopInfo *LI = A.getInfoCache().getAnalysisResultForFunction<LoopAnalysis>(F);
2933   // If either SCEV or LoopInfo is not available for the function then we assume
2934   // any cycle to be unbounded cycle.
2935   // We use scc_iterator which uses Tarjan algorithm to find all the maximal
2936   // SCCs.To detect if there's a cycle, we only need to find the maximal ones.
2937   if (!SE || !LI) {
2938     for (scc_iterator<Function *> SCCI = scc_begin(&F); !SCCI.isAtEnd(); ++SCCI)
2939       if (SCCI.hasCycle())
2940         return true;
2941     return false;
2942   }
2943 
2944   // If there's irreducible control, the function may contain non-loop cycles.
2945   if (mayContainIrreducibleControl(F, LI))
2946     return true;
2947 
2948   // Any loop that does not have a max trip count is considered unbounded cycle.
2949   for (auto *L : LI->getLoopsInPreorder()) {
2950     if (!SE->getSmallConstantMaxTripCount(L))
2951       return true;
2952   }
2953   return false;
2954 }
2955 
2956 struct AAWillReturnImpl : public AAWillReturn {
2957   AAWillReturnImpl(const IRPosition &IRP, Attributor &A)
2958       : AAWillReturn(IRP, A) {}
2959 
2960   /// See AbstractAttribute::initialize(...).
2961   void initialize(Attributor &A) override {
2962     AAWillReturn::initialize(A);
2963 
2964     if (isImpliedByMustprogressAndReadonly(A, /* KnownOnly */ true)) {
2965       indicateOptimisticFixpoint();
2966       return;
2967     }
2968   }
2969 
2970   /// Check for `mustprogress` and `readonly` as they imply `willreturn`.
2971   bool isImpliedByMustprogressAndReadonly(Attributor &A, bool KnownOnly) {
2972     // Check for `mustprogress` in the scope and the associated function which
2973     // might be different if this is a call site.
2974     if ((!getAnchorScope() || !getAnchorScope()->mustProgress()) &&
2975         (!getAssociatedFunction() || !getAssociatedFunction()->mustProgress()))
2976       return false;
2977 
2978     bool IsKnown;
2979     if (AA::isAssumedReadOnly(A, getIRPosition(), *this, IsKnown))
2980       return IsKnown || !KnownOnly;
2981     return false;
2982   }
2983 
2984   /// See AbstractAttribute::updateImpl(...).
2985   ChangeStatus updateImpl(Attributor &A) override {
2986     if (isImpliedByMustprogressAndReadonly(A, /* KnownOnly */ false))
2987       return ChangeStatus::UNCHANGED;
2988 
2989     auto CheckForWillReturn = [&](Instruction &I) {
2990       IRPosition IPos = IRPosition::callsite_function(cast<CallBase>(I));
2991       const auto &WillReturnAA =
2992           A.getAAFor<AAWillReturn>(*this, IPos, DepClassTy::REQUIRED);
2993       if (WillReturnAA.isKnownWillReturn())
2994         return true;
2995       if (!WillReturnAA.isAssumedWillReturn())
2996         return false;
2997       const auto &NoRecurseAA =
2998           A.getAAFor<AANoRecurse>(*this, IPos, DepClassTy::REQUIRED);
2999       return NoRecurseAA.isAssumedNoRecurse();
3000     };
3001 
3002     bool UsedAssumedInformation = false;
3003     if (!A.checkForAllCallLikeInstructions(CheckForWillReturn, *this,
3004                                            UsedAssumedInformation))
3005       return indicatePessimisticFixpoint();
3006 
3007     return ChangeStatus::UNCHANGED;
3008   }
3009 
3010   /// See AbstractAttribute::getAsStr()
3011   const std::string getAsStr() const override {
3012     return getAssumed() ? "willreturn" : "may-noreturn";
3013   }
3014 };
3015 
3016 struct AAWillReturnFunction final : AAWillReturnImpl {
3017   AAWillReturnFunction(const IRPosition &IRP, Attributor &A)
3018       : AAWillReturnImpl(IRP, A) {}
3019 
3020   /// See AbstractAttribute::initialize(...).
3021   void initialize(Attributor &A) override {
3022     AAWillReturnImpl::initialize(A);
3023 
3024     Function *F = getAnchorScope();
3025     if (!F || F->isDeclaration() || mayContainUnboundedCycle(*F, A))
3026       indicatePessimisticFixpoint();
3027   }
3028 
3029   /// See AbstractAttribute::trackStatistics()
3030   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(willreturn) }
3031 };
3032 
3033 /// WillReturn attribute deduction for a call sites.
3034 struct AAWillReturnCallSite final : AAWillReturnImpl {
3035   AAWillReturnCallSite(const IRPosition &IRP, Attributor &A)
3036       : AAWillReturnImpl(IRP, A) {}
3037 
3038   /// See AbstractAttribute::initialize(...).
3039   void initialize(Attributor &A) override {
3040     AAWillReturnImpl::initialize(A);
3041     Function *F = getAssociatedFunction();
3042     if (!F || !A.isFunctionIPOAmendable(*F))
3043       indicatePessimisticFixpoint();
3044   }
3045 
3046   /// See AbstractAttribute::updateImpl(...).
3047   ChangeStatus updateImpl(Attributor &A) override {
3048     if (isImpliedByMustprogressAndReadonly(A, /* KnownOnly */ false))
3049       return ChangeStatus::UNCHANGED;
3050 
3051     // TODO: Once we have call site specific value information we can provide
3052     //       call site specific liveness information and then it makes
3053     //       sense to specialize attributes for call sites arguments instead of
3054     //       redirecting requests to the callee argument.
3055     Function *F = getAssociatedFunction();
3056     const IRPosition &FnPos = IRPosition::function(*F);
3057     auto &FnAA = A.getAAFor<AAWillReturn>(*this, FnPos, DepClassTy::REQUIRED);
3058     return clampStateAndIndicateChange(getState(), FnAA.getState());
3059   }
3060 
3061   /// See AbstractAttribute::trackStatistics()
3062   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(willreturn); }
3063 };
3064 } // namespace
3065 
3066 /// -------------------AAReachability Attribute--------------------------
3067 
3068 namespace {
3069 struct AAReachabilityImpl : AAReachability {
3070   AAReachabilityImpl(const IRPosition &IRP, Attributor &A)
3071       : AAReachability(IRP, A) {}
3072 
3073   const std::string getAsStr() const override {
3074     // TODO: Return the number of reachable queries.
3075     return "reachable";
3076   }
3077 
3078   /// See AbstractAttribute::updateImpl(...).
3079   ChangeStatus updateImpl(Attributor &A) override {
3080     return ChangeStatus::UNCHANGED;
3081   }
3082 };
3083 
3084 struct AAReachabilityFunction final : public AAReachabilityImpl {
3085   AAReachabilityFunction(const IRPosition &IRP, Attributor &A)
3086       : AAReachabilityImpl(IRP, A) {}
3087 
3088   /// See AbstractAttribute::trackStatistics()
3089   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(reachable); }
3090 };
3091 } // namespace
3092 
3093 /// ------------------------ NoAlias Argument Attribute ------------------------
3094 
3095 namespace {
3096 struct AANoAliasImpl : AANoAlias {
3097   AANoAliasImpl(const IRPosition &IRP, Attributor &A) : AANoAlias(IRP, A) {
3098     assert(getAssociatedType()->isPointerTy() &&
3099            "Noalias is a pointer attribute");
3100   }
3101 
3102   const std::string getAsStr() const override {
3103     return getAssumed() ? "noalias" : "may-alias";
3104   }
3105 };
3106 
3107 /// NoAlias attribute for a floating value.
3108 struct AANoAliasFloating final : AANoAliasImpl {
3109   AANoAliasFloating(const IRPosition &IRP, Attributor &A)
3110       : AANoAliasImpl(IRP, A) {}
3111 
3112   /// See AbstractAttribute::initialize(...).
3113   void initialize(Attributor &A) override {
3114     AANoAliasImpl::initialize(A);
3115     Value *Val = &getAssociatedValue();
3116     do {
3117       CastInst *CI = dyn_cast<CastInst>(Val);
3118       if (!CI)
3119         break;
3120       Value *Base = CI->getOperand(0);
3121       if (!Base->hasOneUse())
3122         break;
3123       Val = Base;
3124     } while (true);
3125 
3126     if (!Val->getType()->isPointerTy()) {
3127       indicatePessimisticFixpoint();
3128       return;
3129     }
3130 
3131     if (isa<AllocaInst>(Val))
3132       indicateOptimisticFixpoint();
3133     else if (isa<ConstantPointerNull>(Val) &&
3134              !NullPointerIsDefined(getAnchorScope(),
3135                                    Val->getType()->getPointerAddressSpace()))
3136       indicateOptimisticFixpoint();
3137     else if (Val != &getAssociatedValue()) {
3138       const auto &ValNoAliasAA = A.getAAFor<AANoAlias>(
3139           *this, IRPosition::value(*Val), DepClassTy::OPTIONAL);
3140       if (ValNoAliasAA.isKnownNoAlias())
3141         indicateOptimisticFixpoint();
3142     }
3143   }
3144 
3145   /// See AbstractAttribute::updateImpl(...).
3146   ChangeStatus updateImpl(Attributor &A) override {
3147     // TODO: Implement this.
3148     return indicatePessimisticFixpoint();
3149   }
3150 
3151   /// See AbstractAttribute::trackStatistics()
3152   void trackStatistics() const override {
3153     STATS_DECLTRACK_FLOATING_ATTR(noalias)
3154   }
3155 };
3156 
3157 /// NoAlias attribute for an argument.
3158 struct AANoAliasArgument final
3159     : AAArgumentFromCallSiteArguments<AANoAlias, AANoAliasImpl> {
3160   using Base = AAArgumentFromCallSiteArguments<AANoAlias, AANoAliasImpl>;
3161   AANoAliasArgument(const IRPosition &IRP, Attributor &A) : Base(IRP, A) {}
3162 
3163   /// See AbstractAttribute::initialize(...).
3164   void initialize(Attributor &A) override {
3165     Base::initialize(A);
3166     // See callsite argument attribute and callee argument attribute.
3167     if (hasAttr({Attribute::ByVal}))
3168       indicateOptimisticFixpoint();
3169   }
3170 
3171   /// See AbstractAttribute::update(...).
3172   ChangeStatus updateImpl(Attributor &A) override {
3173     // We have to make sure no-alias on the argument does not break
3174     // synchronization when this is a callback argument, see also [1] below.
3175     // If synchronization cannot be affected, we delegate to the base updateImpl
3176     // function, otherwise we give up for now.
3177 
3178     // If the function is no-sync, no-alias cannot break synchronization.
3179     const auto &NoSyncAA =
3180         A.getAAFor<AANoSync>(*this, IRPosition::function_scope(getIRPosition()),
3181                              DepClassTy::OPTIONAL);
3182     if (NoSyncAA.isAssumedNoSync())
3183       return Base::updateImpl(A);
3184 
3185     // If the argument is read-only, no-alias cannot break synchronization.
3186     bool IsKnown;
3187     if (AA::isAssumedReadOnly(A, getIRPosition(), *this, IsKnown))
3188       return Base::updateImpl(A);
3189 
3190     // If the argument is never passed through callbacks, no-alias cannot break
3191     // synchronization.
3192     bool UsedAssumedInformation = false;
3193     if (A.checkForAllCallSites(
3194             [](AbstractCallSite ACS) { return !ACS.isCallbackCall(); }, *this,
3195             true, UsedAssumedInformation))
3196       return Base::updateImpl(A);
3197 
3198     // TODO: add no-alias but make sure it doesn't break synchronization by
3199     // introducing fake uses. See:
3200     // [1] Compiler Optimizations for OpenMP, J. Doerfert and H. Finkel,
3201     //     International Workshop on OpenMP 2018,
3202     //     http://compilers.cs.uni-saarland.de/people/doerfert/par_opt18.pdf
3203 
3204     return indicatePessimisticFixpoint();
3205   }
3206 
3207   /// See AbstractAttribute::trackStatistics()
3208   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(noalias) }
3209 };
3210 
3211 struct AANoAliasCallSiteArgument final : AANoAliasImpl {
3212   AANoAliasCallSiteArgument(const IRPosition &IRP, Attributor &A)
3213       : AANoAliasImpl(IRP, A) {}
3214 
3215   /// See AbstractAttribute::initialize(...).
3216   void initialize(Attributor &A) override {
3217     // See callsite argument attribute and callee argument attribute.
3218     const auto &CB = cast<CallBase>(getAnchorValue());
3219     if (CB.paramHasAttr(getCallSiteArgNo(), Attribute::NoAlias))
3220       indicateOptimisticFixpoint();
3221     Value &Val = getAssociatedValue();
3222     if (isa<ConstantPointerNull>(Val) &&
3223         !NullPointerIsDefined(getAnchorScope(),
3224                               Val.getType()->getPointerAddressSpace()))
3225       indicateOptimisticFixpoint();
3226   }
3227 
3228   /// Determine if the underlying value may alias with the call site argument
3229   /// \p OtherArgNo of \p ICS (= the underlying call site).
3230   bool mayAliasWithArgument(Attributor &A, AAResults *&AAR,
3231                             const AAMemoryBehavior &MemBehaviorAA,
3232                             const CallBase &CB, unsigned OtherArgNo) {
3233     // We do not need to worry about aliasing with the underlying IRP.
3234     if (this->getCalleeArgNo() == (int)OtherArgNo)
3235       return false;
3236 
3237     // If it is not a pointer or pointer vector we do not alias.
3238     const Value *ArgOp = CB.getArgOperand(OtherArgNo);
3239     if (!ArgOp->getType()->isPtrOrPtrVectorTy())
3240       return false;
3241 
3242     auto &CBArgMemBehaviorAA = A.getAAFor<AAMemoryBehavior>(
3243         *this, IRPosition::callsite_argument(CB, OtherArgNo), DepClassTy::NONE);
3244 
3245     // If the argument is readnone, there is no read-write aliasing.
3246     if (CBArgMemBehaviorAA.isAssumedReadNone()) {
3247       A.recordDependence(CBArgMemBehaviorAA, *this, DepClassTy::OPTIONAL);
3248       return false;
3249     }
3250 
3251     // If the argument is readonly and the underlying value is readonly, there
3252     // is no read-write aliasing.
3253     bool IsReadOnly = MemBehaviorAA.isAssumedReadOnly();
3254     if (CBArgMemBehaviorAA.isAssumedReadOnly() && IsReadOnly) {
3255       A.recordDependence(MemBehaviorAA, *this, DepClassTy::OPTIONAL);
3256       A.recordDependence(CBArgMemBehaviorAA, *this, DepClassTy::OPTIONAL);
3257       return false;
3258     }
3259 
3260     // We have to utilize actual alias analysis queries so we need the object.
3261     if (!AAR)
3262       AAR = A.getInfoCache().getAAResultsForFunction(*getAnchorScope());
3263 
3264     // Try to rule it out at the call site.
3265     bool IsAliasing = !AAR || !AAR->isNoAlias(&getAssociatedValue(), ArgOp);
3266     LLVM_DEBUG(dbgs() << "[NoAliasCSArg] Check alias between "
3267                          "callsite arguments: "
3268                       << getAssociatedValue() << " " << *ArgOp << " => "
3269                       << (IsAliasing ? "" : "no-") << "alias \n");
3270 
3271     return IsAliasing;
3272   }
3273 
3274   bool
3275   isKnownNoAliasDueToNoAliasPreservation(Attributor &A, AAResults *&AAR,
3276                                          const AAMemoryBehavior &MemBehaviorAA,
3277                                          const AANoAlias &NoAliasAA) {
3278     // We can deduce "noalias" if the following conditions hold.
3279     // (i)   Associated value is assumed to be noalias in the definition.
3280     // (ii)  Associated value is assumed to be no-capture in all the uses
3281     //       possibly executed before this callsite.
3282     // (iii) There is no other pointer argument which could alias with the
3283     //       value.
3284 
3285     bool AssociatedValueIsNoAliasAtDef = NoAliasAA.isAssumedNoAlias();
3286     if (!AssociatedValueIsNoAliasAtDef) {
3287       LLVM_DEBUG(dbgs() << "[AANoAlias] " << getAssociatedValue()
3288                         << " is not no-alias at the definition\n");
3289       return false;
3290     }
3291 
3292     auto IsDereferenceableOrNull = [&](Value *O, const DataLayout &DL) {
3293       const auto &DerefAA = A.getAAFor<AADereferenceable>(
3294           *this, IRPosition::value(*O), DepClassTy::OPTIONAL);
3295       return DerefAA.getAssumedDereferenceableBytes();
3296     };
3297 
3298     A.recordDependence(NoAliasAA, *this, DepClassTy::OPTIONAL);
3299 
3300     const IRPosition &VIRP = IRPosition::value(getAssociatedValue());
3301     const Function *ScopeFn = VIRP.getAnchorScope();
3302     auto &NoCaptureAA = A.getAAFor<AANoCapture>(*this, VIRP, DepClassTy::NONE);
3303     // Check whether the value is captured in the scope using AANoCapture.
3304     // Look at CFG and check only uses possibly executed before this
3305     // callsite.
3306     auto UsePred = [&](const Use &U, bool &Follow) -> bool {
3307       Instruction *UserI = cast<Instruction>(U.getUser());
3308 
3309       // If UserI is the curr instruction and there is a single potential use of
3310       // the value in UserI we allow the use.
3311       // TODO: We should inspect the operands and allow those that cannot alias
3312       //       with the value.
3313       if (UserI == getCtxI() && UserI->getNumOperands() == 1)
3314         return true;
3315 
3316       if (ScopeFn) {
3317         if (auto *CB = dyn_cast<CallBase>(UserI)) {
3318           if (CB->isArgOperand(&U)) {
3319 
3320             unsigned ArgNo = CB->getArgOperandNo(&U);
3321 
3322             const auto &NoCaptureAA = A.getAAFor<AANoCapture>(
3323                 *this, IRPosition::callsite_argument(*CB, ArgNo),
3324                 DepClassTy::OPTIONAL);
3325 
3326             if (NoCaptureAA.isAssumedNoCapture())
3327               return true;
3328           }
3329         }
3330 
3331         if (!AA::isPotentiallyReachable(A, *UserI, *getCtxI(), *this))
3332           return true;
3333       }
3334 
3335       // TODO: We should track the capturing uses in AANoCapture but the problem
3336       //       is CGSCC runs. For those we would need to "allow" AANoCapture for
3337       //       a value in the module slice.
3338       switch (DetermineUseCaptureKind(U, IsDereferenceableOrNull)) {
3339       case UseCaptureKind::NO_CAPTURE:
3340         return true;
3341       case UseCaptureKind::MAY_CAPTURE:
3342         LLVM_DEBUG(dbgs() << "[AANoAliasCSArg] Unknown user: " << *UserI
3343                           << "\n");
3344         return false;
3345       case UseCaptureKind::PASSTHROUGH:
3346         Follow = true;
3347         return true;
3348       }
3349       llvm_unreachable("unknown UseCaptureKind");
3350     };
3351 
3352     if (!NoCaptureAA.isAssumedNoCaptureMaybeReturned()) {
3353       if (!A.checkForAllUses(UsePred, *this, getAssociatedValue())) {
3354         LLVM_DEBUG(
3355             dbgs() << "[AANoAliasCSArg] " << getAssociatedValue()
3356                    << " cannot be noalias as it is potentially captured\n");
3357         return false;
3358       }
3359     }
3360     A.recordDependence(NoCaptureAA, *this, DepClassTy::OPTIONAL);
3361 
3362     // Check there is no other pointer argument which could alias with the
3363     // value passed at this call site.
3364     // TODO: AbstractCallSite
3365     const auto &CB = cast<CallBase>(getAnchorValue());
3366     for (unsigned OtherArgNo = 0; OtherArgNo < CB.arg_size(); OtherArgNo++)
3367       if (mayAliasWithArgument(A, AAR, MemBehaviorAA, CB, OtherArgNo))
3368         return false;
3369 
3370     return true;
3371   }
3372 
3373   /// See AbstractAttribute::updateImpl(...).
3374   ChangeStatus updateImpl(Attributor &A) override {
3375     // If the argument is readnone we are done as there are no accesses via the
3376     // argument.
3377     auto &MemBehaviorAA =
3378         A.getAAFor<AAMemoryBehavior>(*this, getIRPosition(), DepClassTy::NONE);
3379     if (MemBehaviorAA.isAssumedReadNone()) {
3380       A.recordDependence(MemBehaviorAA, *this, DepClassTy::OPTIONAL);
3381       return ChangeStatus::UNCHANGED;
3382     }
3383 
3384     const IRPosition &VIRP = IRPosition::value(getAssociatedValue());
3385     const auto &NoAliasAA =
3386         A.getAAFor<AANoAlias>(*this, VIRP, DepClassTy::NONE);
3387 
3388     AAResults *AAR = nullptr;
3389     if (isKnownNoAliasDueToNoAliasPreservation(A, AAR, MemBehaviorAA,
3390                                                NoAliasAA)) {
3391       LLVM_DEBUG(
3392           dbgs() << "[AANoAlias] No-Alias deduced via no-alias preservation\n");
3393       return ChangeStatus::UNCHANGED;
3394     }
3395 
3396     return indicatePessimisticFixpoint();
3397   }
3398 
3399   /// See AbstractAttribute::trackStatistics()
3400   void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(noalias) }
3401 };
3402 
3403 /// NoAlias attribute for function return value.
3404 struct AANoAliasReturned final : AANoAliasImpl {
3405   AANoAliasReturned(const IRPosition &IRP, Attributor &A)
3406       : AANoAliasImpl(IRP, A) {}
3407 
3408   /// See AbstractAttribute::initialize(...).
3409   void initialize(Attributor &A) override {
3410     AANoAliasImpl::initialize(A);
3411     Function *F = getAssociatedFunction();
3412     if (!F || F->isDeclaration())
3413       indicatePessimisticFixpoint();
3414   }
3415 
3416   /// See AbstractAttribute::updateImpl(...).
3417   virtual ChangeStatus updateImpl(Attributor &A) override {
3418 
3419     auto CheckReturnValue = [&](Value &RV) -> bool {
3420       if (Constant *C = dyn_cast<Constant>(&RV))
3421         if (C->isNullValue() || isa<UndefValue>(C))
3422           return true;
3423 
3424       /// For now, we can only deduce noalias if we have call sites.
3425       /// FIXME: add more support.
3426       if (!isa<CallBase>(&RV))
3427         return false;
3428 
3429       const IRPosition &RVPos = IRPosition::value(RV);
3430       const auto &NoAliasAA =
3431           A.getAAFor<AANoAlias>(*this, RVPos, DepClassTy::REQUIRED);
3432       if (!NoAliasAA.isAssumedNoAlias())
3433         return false;
3434 
3435       const auto &NoCaptureAA =
3436           A.getAAFor<AANoCapture>(*this, RVPos, DepClassTy::REQUIRED);
3437       return NoCaptureAA.isAssumedNoCaptureMaybeReturned();
3438     };
3439 
3440     if (!A.checkForAllReturnedValues(CheckReturnValue, *this))
3441       return indicatePessimisticFixpoint();
3442 
3443     return ChangeStatus::UNCHANGED;
3444   }
3445 
3446   /// See AbstractAttribute::trackStatistics()
3447   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(noalias) }
3448 };
3449 
3450 /// NoAlias attribute deduction for a call site return value.
3451 struct AANoAliasCallSiteReturned final : AANoAliasImpl {
3452   AANoAliasCallSiteReturned(const IRPosition &IRP, Attributor &A)
3453       : AANoAliasImpl(IRP, A) {}
3454 
3455   /// See AbstractAttribute::initialize(...).
3456   void initialize(Attributor &A) override {
3457     AANoAliasImpl::initialize(A);
3458     Function *F = getAssociatedFunction();
3459     if (!F || F->isDeclaration())
3460       indicatePessimisticFixpoint();
3461   }
3462 
3463   /// See AbstractAttribute::updateImpl(...).
3464   ChangeStatus updateImpl(Attributor &A) override {
3465     // TODO: Once we have call site specific value information we can provide
3466     //       call site specific liveness information and then it makes
3467     //       sense to specialize attributes for call sites arguments instead of
3468     //       redirecting requests to the callee argument.
3469     Function *F = getAssociatedFunction();
3470     const IRPosition &FnPos = IRPosition::returned(*F);
3471     auto &FnAA = A.getAAFor<AANoAlias>(*this, FnPos, DepClassTy::REQUIRED);
3472     return clampStateAndIndicateChange(getState(), FnAA.getState());
3473   }
3474 
3475   /// See AbstractAttribute::trackStatistics()
3476   void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(noalias); }
3477 };
3478 } // namespace
3479 
3480 /// -------------------AAIsDead Function Attribute-----------------------
3481 
3482 namespace {
3483 struct AAIsDeadValueImpl : public AAIsDead {
3484   AAIsDeadValueImpl(const IRPosition &IRP, Attributor &A) : AAIsDead(IRP, A) {}
3485 
3486   /// See AbstractAttribute::initialize(...).
3487   void initialize(Attributor &A) override {
3488     if (auto *Scope = getAnchorScope())
3489       if (!A.isRunOn(*Scope))
3490         indicatePessimisticFixpoint();
3491   }
3492 
3493   /// See AAIsDead::isAssumedDead().
3494   bool isAssumedDead() const override { return isAssumed(IS_DEAD); }
3495 
3496   /// See AAIsDead::isKnownDead().
3497   bool isKnownDead() const override { return isKnown(IS_DEAD); }
3498 
3499   /// See AAIsDead::isAssumedDead(BasicBlock *).
3500   bool isAssumedDead(const BasicBlock *BB) const override { return false; }
3501 
3502   /// See AAIsDead::isKnownDead(BasicBlock *).
3503   bool isKnownDead(const BasicBlock *BB) const override { return false; }
3504 
3505   /// See AAIsDead::isAssumedDead(Instruction *I).
3506   bool isAssumedDead(const Instruction *I) const override {
3507     return I == getCtxI() && isAssumedDead();
3508   }
3509 
3510   /// See AAIsDead::isKnownDead(Instruction *I).
3511   bool isKnownDead(const Instruction *I) const override {
3512     return isAssumedDead(I) && isKnownDead();
3513   }
3514 
3515   /// See AbstractAttribute::getAsStr().
3516   virtual const std::string getAsStr() const override {
3517     return isAssumedDead() ? "assumed-dead" : "assumed-live";
3518   }
3519 
3520   /// Check if all uses are assumed dead.
3521   bool areAllUsesAssumedDead(Attributor &A, Value &V) {
3522     // Callers might not check the type, void has no uses.
3523     if (V.getType()->isVoidTy() || V.use_empty())
3524       return true;
3525 
3526     // If we replace a value with a constant there are no uses left afterwards.
3527     if (!isa<Constant>(V)) {
3528       if (auto *I = dyn_cast<Instruction>(&V))
3529         if (!A.isRunOn(*I->getFunction()))
3530           return false;
3531       bool UsedAssumedInformation = false;
3532       Optional<Constant *> C =
3533           A.getAssumedConstant(V, *this, UsedAssumedInformation);
3534       if (!C.hasValue() || *C)
3535         return true;
3536     }
3537 
3538     auto UsePred = [&](const Use &U, bool &Follow) { return false; };
3539     // Explicitly set the dependence class to required because we want a long
3540     // chain of N dependent instructions to be considered live as soon as one is
3541     // without going through N update cycles. This is not required for
3542     // correctness.
3543     return A.checkForAllUses(UsePred, *this, V, /* CheckBBLivenessOnly */ false,
3544                              DepClassTy::REQUIRED,
3545                              /* IgnoreDroppableUses */ false);
3546   }
3547 
3548   /// Determine if \p I is assumed to be side-effect free.
3549   bool isAssumedSideEffectFree(Attributor &A, Instruction *I) {
3550     if (!I || wouldInstructionBeTriviallyDead(I))
3551       return true;
3552 
3553     auto *CB = dyn_cast<CallBase>(I);
3554     if (!CB || isa<IntrinsicInst>(CB))
3555       return false;
3556 
3557     const IRPosition &CallIRP = IRPosition::callsite_function(*CB);
3558     const auto &NoUnwindAA =
3559         A.getAndUpdateAAFor<AANoUnwind>(*this, CallIRP, DepClassTy::NONE);
3560     if (!NoUnwindAA.isAssumedNoUnwind())
3561       return false;
3562     if (!NoUnwindAA.isKnownNoUnwind())
3563       A.recordDependence(NoUnwindAA, *this, DepClassTy::OPTIONAL);
3564 
3565     bool IsKnown;
3566     return AA::isAssumedReadOnly(A, CallIRP, *this, IsKnown);
3567   }
3568 };
3569 
3570 struct AAIsDeadFloating : public AAIsDeadValueImpl {
3571   AAIsDeadFloating(const IRPosition &IRP, Attributor &A)
3572       : AAIsDeadValueImpl(IRP, A) {}
3573 
3574   /// See AbstractAttribute::initialize(...).
3575   void initialize(Attributor &A) override {
3576     AAIsDeadValueImpl::initialize(A);
3577 
3578     if (isa<UndefValue>(getAssociatedValue())) {
3579       indicatePessimisticFixpoint();
3580       return;
3581     }
3582 
3583     Instruction *I = dyn_cast<Instruction>(&getAssociatedValue());
3584     if (!isAssumedSideEffectFree(A, I)) {
3585       if (!isa_and_nonnull<StoreInst>(I))
3586         indicatePessimisticFixpoint();
3587       else
3588         removeAssumedBits(HAS_NO_EFFECT);
3589     }
3590   }
3591 
3592   bool isDeadStore(Attributor &A, StoreInst &SI) {
3593     // Lang ref now states volatile store is not UB/dead, let's skip them.
3594     if (SI.isVolatile())
3595       return false;
3596 
3597     bool UsedAssumedInformation = false;
3598     SmallSetVector<Value *, 4> PotentialCopies;
3599     if (!AA::getPotentialCopiesOfStoredValue(A, SI, PotentialCopies, *this,
3600                                              UsedAssumedInformation))
3601       return false;
3602     return llvm::all_of(PotentialCopies, [&](Value *V) {
3603       return A.isAssumedDead(IRPosition::value(*V), this, nullptr,
3604                              UsedAssumedInformation);
3605     });
3606   }
3607 
3608   /// See AbstractAttribute::getAsStr().
3609   const std::string getAsStr() const override {
3610     Instruction *I = dyn_cast<Instruction>(&getAssociatedValue());
3611     if (isa_and_nonnull<StoreInst>(I))
3612       if (isValidState())
3613         return "assumed-dead-store";
3614     return AAIsDeadValueImpl::getAsStr();
3615   }
3616 
3617   /// See AbstractAttribute::updateImpl(...).
3618   ChangeStatus updateImpl(Attributor &A) override {
3619     Instruction *I = dyn_cast<Instruction>(&getAssociatedValue());
3620     if (auto *SI = dyn_cast_or_null<StoreInst>(I)) {
3621       if (!isDeadStore(A, *SI))
3622         return indicatePessimisticFixpoint();
3623     } else {
3624       if (!isAssumedSideEffectFree(A, I))
3625         return indicatePessimisticFixpoint();
3626       if (!areAllUsesAssumedDead(A, getAssociatedValue()))
3627         return indicatePessimisticFixpoint();
3628     }
3629     return ChangeStatus::UNCHANGED;
3630   }
3631 
3632   bool isRemovableStore() const override {
3633     return isAssumed(IS_REMOVABLE) && isa<StoreInst>(&getAssociatedValue());
3634   }
3635 
3636   /// See AbstractAttribute::manifest(...).
3637   ChangeStatus manifest(Attributor &A) override {
3638     Value &V = getAssociatedValue();
3639     if (auto *I = dyn_cast<Instruction>(&V)) {
3640       // If we get here we basically know the users are all dead. We check if
3641       // isAssumedSideEffectFree returns true here again because it might not be
3642       // the case and only the users are dead but the instruction (=call) is
3643       // still needed.
3644       if (isa<StoreInst>(I) ||
3645           (isAssumedSideEffectFree(A, I) && !isa<InvokeInst>(I))) {
3646         A.deleteAfterManifest(*I);
3647         return ChangeStatus::CHANGED;
3648       }
3649     }
3650     return ChangeStatus::UNCHANGED;
3651   }
3652 
3653   /// See AbstractAttribute::trackStatistics()
3654   void trackStatistics() const override {
3655     STATS_DECLTRACK_FLOATING_ATTR(IsDead)
3656   }
3657 };
3658 
3659 struct AAIsDeadArgument : public AAIsDeadFloating {
3660   AAIsDeadArgument(const IRPosition &IRP, Attributor &A)
3661       : AAIsDeadFloating(IRP, A) {}
3662 
3663   /// See AbstractAttribute::initialize(...).
3664   void initialize(Attributor &A) override {
3665     AAIsDeadFloating::initialize(A);
3666     if (!A.isFunctionIPOAmendable(*getAnchorScope()))
3667       indicatePessimisticFixpoint();
3668   }
3669 
3670   /// See AbstractAttribute::manifest(...).
3671   ChangeStatus manifest(Attributor &A) override {
3672     Argument &Arg = *getAssociatedArgument();
3673     if (A.isValidFunctionSignatureRewrite(Arg, /* ReplacementTypes */ {}))
3674       if (A.registerFunctionSignatureRewrite(
3675               Arg, /* ReplacementTypes */ {},
3676               Attributor::ArgumentReplacementInfo::CalleeRepairCBTy{},
3677               Attributor::ArgumentReplacementInfo::ACSRepairCBTy{})) {
3678         return ChangeStatus::CHANGED;
3679       }
3680     return ChangeStatus::UNCHANGED;
3681   }
3682 
3683   /// See AbstractAttribute::trackStatistics()
3684   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(IsDead) }
3685 };
3686 
3687 struct AAIsDeadCallSiteArgument : public AAIsDeadValueImpl {
3688   AAIsDeadCallSiteArgument(const IRPosition &IRP, Attributor &A)
3689       : AAIsDeadValueImpl(IRP, A) {}
3690 
3691   /// See AbstractAttribute::initialize(...).
3692   void initialize(Attributor &A) override {
3693     AAIsDeadValueImpl::initialize(A);
3694     if (isa<UndefValue>(getAssociatedValue()))
3695       indicatePessimisticFixpoint();
3696   }
3697 
3698   /// See AbstractAttribute::updateImpl(...).
3699   ChangeStatus updateImpl(Attributor &A) override {
3700     // TODO: Once we have call site specific value information we can provide
3701     //       call site specific liveness information and then it makes
3702     //       sense to specialize attributes for call sites arguments instead of
3703     //       redirecting requests to the callee argument.
3704     Argument *Arg = getAssociatedArgument();
3705     if (!Arg)
3706       return indicatePessimisticFixpoint();
3707     const IRPosition &ArgPos = IRPosition::argument(*Arg);
3708     auto &ArgAA = A.getAAFor<AAIsDead>(*this, ArgPos, DepClassTy::REQUIRED);
3709     return clampStateAndIndicateChange(getState(), ArgAA.getState());
3710   }
3711 
3712   /// See AbstractAttribute::manifest(...).
3713   ChangeStatus manifest(Attributor &A) override {
3714     CallBase &CB = cast<CallBase>(getAnchorValue());
3715     Use &U = CB.getArgOperandUse(getCallSiteArgNo());
3716     assert(!isa<UndefValue>(U.get()) &&
3717            "Expected undef values to be filtered out!");
3718     UndefValue &UV = *UndefValue::get(U->getType());
3719     if (A.changeUseAfterManifest(U, UV))
3720       return ChangeStatus::CHANGED;
3721     return ChangeStatus::UNCHANGED;
3722   }
3723 
3724   /// See AbstractAttribute::trackStatistics()
3725   void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(IsDead) }
3726 };
3727 
3728 struct AAIsDeadCallSiteReturned : public AAIsDeadFloating {
3729   AAIsDeadCallSiteReturned(const IRPosition &IRP, Attributor &A)
3730       : AAIsDeadFloating(IRP, A) {}
3731 
3732   /// See AAIsDead::isAssumedDead().
3733   bool isAssumedDead() const override {
3734     return AAIsDeadFloating::isAssumedDead() && IsAssumedSideEffectFree;
3735   }
3736 
3737   /// See AbstractAttribute::initialize(...).
3738   void initialize(Attributor &A) override {
3739     AAIsDeadFloating::initialize(A);
3740     if (isa<UndefValue>(getAssociatedValue())) {
3741       indicatePessimisticFixpoint();
3742       return;
3743     }
3744 
3745     // We track this separately as a secondary state.
3746     IsAssumedSideEffectFree = isAssumedSideEffectFree(A, getCtxI());
3747   }
3748 
3749   /// See AbstractAttribute::updateImpl(...).
3750   ChangeStatus updateImpl(Attributor &A) override {
3751     ChangeStatus Changed = ChangeStatus::UNCHANGED;
3752     if (IsAssumedSideEffectFree && !isAssumedSideEffectFree(A, getCtxI())) {
3753       IsAssumedSideEffectFree = false;
3754       Changed = ChangeStatus::CHANGED;
3755     }
3756     if (!areAllUsesAssumedDead(A, getAssociatedValue()))
3757       return indicatePessimisticFixpoint();
3758     return Changed;
3759   }
3760 
3761   /// See AbstractAttribute::trackStatistics()
3762   void trackStatistics() const override {
3763     if (IsAssumedSideEffectFree)
3764       STATS_DECLTRACK_CSRET_ATTR(IsDead)
3765     else
3766       STATS_DECLTRACK_CSRET_ATTR(UnusedResult)
3767   }
3768 
3769   /// See AbstractAttribute::getAsStr().
3770   const std::string getAsStr() const override {
3771     return isAssumedDead()
3772                ? "assumed-dead"
3773                : (getAssumed() ? "assumed-dead-users" : "assumed-live");
3774   }
3775 
3776 private:
3777   bool IsAssumedSideEffectFree = true;
3778 };
3779 
3780 struct AAIsDeadReturned : public AAIsDeadValueImpl {
3781   AAIsDeadReturned(const IRPosition &IRP, Attributor &A)
3782       : AAIsDeadValueImpl(IRP, A) {}
3783 
3784   /// See AbstractAttribute::updateImpl(...).
3785   ChangeStatus updateImpl(Attributor &A) override {
3786 
3787     bool UsedAssumedInformation = false;
3788     A.checkForAllInstructions([](Instruction &) { return true; }, *this,
3789                               {Instruction::Ret}, UsedAssumedInformation);
3790 
3791     auto PredForCallSite = [&](AbstractCallSite ACS) {
3792       if (ACS.isCallbackCall() || !ACS.getInstruction())
3793         return false;
3794       return areAllUsesAssumedDead(A, *ACS.getInstruction());
3795     };
3796 
3797     if (!A.checkForAllCallSites(PredForCallSite, *this, true,
3798                                 UsedAssumedInformation))
3799       return indicatePessimisticFixpoint();
3800 
3801     return ChangeStatus::UNCHANGED;
3802   }
3803 
3804   /// See AbstractAttribute::manifest(...).
3805   ChangeStatus manifest(Attributor &A) override {
3806     // TODO: Rewrite the signature to return void?
3807     bool AnyChange = false;
3808     UndefValue &UV = *UndefValue::get(getAssociatedFunction()->getReturnType());
3809     auto RetInstPred = [&](Instruction &I) {
3810       ReturnInst &RI = cast<ReturnInst>(I);
3811       if (!isa<UndefValue>(RI.getReturnValue()))
3812         AnyChange |= A.changeUseAfterManifest(RI.getOperandUse(0), UV);
3813       return true;
3814     };
3815     bool UsedAssumedInformation = false;
3816     A.checkForAllInstructions(RetInstPred, *this, {Instruction::Ret},
3817                               UsedAssumedInformation);
3818     return AnyChange ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED;
3819   }
3820 
3821   /// See AbstractAttribute::trackStatistics()
3822   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(IsDead) }
3823 };
3824 
3825 struct AAIsDeadFunction : public AAIsDead {
3826   AAIsDeadFunction(const IRPosition &IRP, Attributor &A) : AAIsDead(IRP, A) {}
3827 
3828   /// See AbstractAttribute::initialize(...).
3829   void initialize(Attributor &A) override {
3830     Function *F = getAnchorScope();
3831     if (!F || F->isDeclaration() || !A.isRunOn(*F)) {
3832       indicatePessimisticFixpoint();
3833       return;
3834     }
3835     ToBeExploredFrom.insert(&F->getEntryBlock().front());
3836     assumeLive(A, F->getEntryBlock());
3837   }
3838 
3839   /// See AbstractAttribute::getAsStr().
3840   const std::string getAsStr() const override {
3841     return "Live[#BB " + std::to_string(AssumedLiveBlocks.size()) + "/" +
3842            std::to_string(getAnchorScope()->size()) + "][#TBEP " +
3843            std::to_string(ToBeExploredFrom.size()) + "][#KDE " +
3844            std::to_string(KnownDeadEnds.size()) + "]";
3845   }
3846 
3847   /// See AbstractAttribute::manifest(...).
3848   ChangeStatus manifest(Attributor &A) override {
3849     assert(getState().isValidState() &&
3850            "Attempted to manifest an invalid state!");
3851 
3852     ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
3853     Function &F = *getAnchorScope();
3854 
3855     if (AssumedLiveBlocks.empty()) {
3856       A.deleteAfterManifest(F);
3857       return ChangeStatus::CHANGED;
3858     }
3859 
3860     // Flag to determine if we can change an invoke to a call assuming the
3861     // callee is nounwind. This is not possible if the personality of the
3862     // function allows to catch asynchronous exceptions.
3863     bool Invoke2CallAllowed = !mayCatchAsynchronousExceptions(F);
3864 
3865     KnownDeadEnds.set_union(ToBeExploredFrom);
3866     for (const Instruction *DeadEndI : KnownDeadEnds) {
3867       auto *CB = dyn_cast<CallBase>(DeadEndI);
3868       if (!CB)
3869         continue;
3870       const auto &NoReturnAA = A.getAndUpdateAAFor<AANoReturn>(
3871           *this, IRPosition::callsite_function(*CB), DepClassTy::OPTIONAL);
3872       bool MayReturn = !NoReturnAA.isAssumedNoReturn();
3873       if (MayReturn && (!Invoke2CallAllowed || !isa<InvokeInst>(CB)))
3874         continue;
3875 
3876       if (auto *II = dyn_cast<InvokeInst>(DeadEndI))
3877         A.registerInvokeWithDeadSuccessor(const_cast<InvokeInst &>(*II));
3878       else
3879         A.changeToUnreachableAfterManifest(
3880             const_cast<Instruction *>(DeadEndI->getNextNode()));
3881       HasChanged = ChangeStatus::CHANGED;
3882     }
3883 
3884     STATS_DECL(AAIsDead, BasicBlock, "Number of dead basic blocks deleted.");
3885     for (BasicBlock &BB : F)
3886       if (!AssumedLiveBlocks.count(&BB)) {
3887         A.deleteAfterManifest(BB);
3888         ++BUILD_STAT_NAME(AAIsDead, BasicBlock);
3889         HasChanged = ChangeStatus::CHANGED;
3890       }
3891 
3892     return HasChanged;
3893   }
3894 
3895   /// See AbstractAttribute::updateImpl(...).
3896   ChangeStatus updateImpl(Attributor &A) override;
3897 
3898   bool isEdgeDead(const BasicBlock *From, const BasicBlock *To) const override {
3899     assert(From->getParent() == getAnchorScope() &&
3900            To->getParent() == getAnchorScope() &&
3901            "Used AAIsDead of the wrong function");
3902     return isValidState() && !AssumedLiveEdges.count(std::make_pair(From, To));
3903   }
3904 
3905   /// See AbstractAttribute::trackStatistics()
3906   void trackStatistics() const override {}
3907 
3908   /// Returns true if the function is assumed dead.
3909   bool isAssumedDead() const override { return false; }
3910 
3911   /// See AAIsDead::isKnownDead().
3912   bool isKnownDead() const override { return false; }
3913 
3914   /// See AAIsDead::isAssumedDead(BasicBlock *).
3915   bool isAssumedDead(const BasicBlock *BB) const override {
3916     assert(BB->getParent() == getAnchorScope() &&
3917            "BB must be in the same anchor scope function.");
3918 
3919     if (!getAssumed())
3920       return false;
3921     return !AssumedLiveBlocks.count(BB);
3922   }
3923 
3924   /// See AAIsDead::isKnownDead(BasicBlock *).
3925   bool isKnownDead(const BasicBlock *BB) const override {
3926     return getKnown() && isAssumedDead(BB);
3927   }
3928 
3929   /// See AAIsDead::isAssumed(Instruction *I).
3930   bool isAssumedDead(const Instruction *I) const override {
3931     assert(I->getParent()->getParent() == getAnchorScope() &&
3932            "Instruction must be in the same anchor scope function.");
3933 
3934     if (!getAssumed())
3935       return false;
3936 
3937     // If it is not in AssumedLiveBlocks then it for sure dead.
3938     // Otherwise, it can still be after noreturn call in a live block.
3939     if (!AssumedLiveBlocks.count(I->getParent()))
3940       return true;
3941 
3942     // If it is not after a liveness barrier it is live.
3943     const Instruction *PrevI = I->getPrevNode();
3944     while (PrevI) {
3945       if (KnownDeadEnds.count(PrevI) || ToBeExploredFrom.count(PrevI))
3946         return true;
3947       PrevI = PrevI->getPrevNode();
3948     }
3949     return false;
3950   }
3951 
3952   /// See AAIsDead::isKnownDead(Instruction *I).
3953   bool isKnownDead(const Instruction *I) const override {
3954     return getKnown() && isAssumedDead(I);
3955   }
3956 
3957   /// Assume \p BB is (partially) live now and indicate to the Attributor \p A
3958   /// that internal function called from \p BB should now be looked at.
3959   bool assumeLive(Attributor &A, const BasicBlock &BB) {
3960     if (!AssumedLiveBlocks.insert(&BB).second)
3961       return false;
3962 
3963     // We assume that all of BB is (probably) live now and if there are calls to
3964     // internal functions we will assume that those are now live as well. This
3965     // is a performance optimization for blocks with calls to a lot of internal
3966     // functions. It can however cause dead functions to be treated as live.
3967     for (const Instruction &I : BB)
3968       if (const auto *CB = dyn_cast<CallBase>(&I))
3969         if (const Function *F = CB->getCalledFunction())
3970           if (F->hasLocalLinkage())
3971             A.markLiveInternalFunction(*F);
3972     return true;
3973   }
3974 
3975   /// Collection of instructions that need to be explored again, e.g., we
3976   /// did assume they do not transfer control to (one of their) successors.
3977   SmallSetVector<const Instruction *, 8> ToBeExploredFrom;
3978 
3979   /// Collection of instructions that are known to not transfer control.
3980   SmallSetVector<const Instruction *, 8> KnownDeadEnds;
3981 
3982   /// Collection of all assumed live edges
3983   DenseSet<std::pair<const BasicBlock *, const BasicBlock *>> AssumedLiveEdges;
3984 
3985   /// Collection of all assumed live BasicBlocks.
3986   DenseSet<const BasicBlock *> AssumedLiveBlocks;
3987 };
3988 
3989 static bool
3990 identifyAliveSuccessors(Attributor &A, const CallBase &CB,
3991                         AbstractAttribute &AA,
3992                         SmallVectorImpl<const Instruction *> &AliveSuccessors) {
3993   const IRPosition &IPos = IRPosition::callsite_function(CB);
3994 
3995   const auto &NoReturnAA =
3996       A.getAndUpdateAAFor<AANoReturn>(AA, IPos, DepClassTy::OPTIONAL);
3997   if (NoReturnAA.isAssumedNoReturn())
3998     return !NoReturnAA.isKnownNoReturn();
3999   if (CB.isTerminator())
4000     AliveSuccessors.push_back(&CB.getSuccessor(0)->front());
4001   else
4002     AliveSuccessors.push_back(CB.getNextNode());
4003   return false;
4004 }
4005 
4006 static bool
4007 identifyAliveSuccessors(Attributor &A, const InvokeInst &II,
4008                         AbstractAttribute &AA,
4009                         SmallVectorImpl<const Instruction *> &AliveSuccessors) {
4010   bool UsedAssumedInformation =
4011       identifyAliveSuccessors(A, cast<CallBase>(II), AA, AliveSuccessors);
4012 
4013   // First, determine if we can change an invoke to a call assuming the
4014   // callee is nounwind. This is not possible if the personality of the
4015   // function allows to catch asynchronous exceptions.
4016   if (AAIsDeadFunction::mayCatchAsynchronousExceptions(*II.getFunction())) {
4017     AliveSuccessors.push_back(&II.getUnwindDest()->front());
4018   } else {
4019     const IRPosition &IPos = IRPosition::callsite_function(II);
4020     const auto &AANoUnw =
4021         A.getAndUpdateAAFor<AANoUnwind>(AA, IPos, DepClassTy::OPTIONAL);
4022     if (AANoUnw.isAssumedNoUnwind()) {
4023       UsedAssumedInformation |= !AANoUnw.isKnownNoUnwind();
4024     } else {
4025       AliveSuccessors.push_back(&II.getUnwindDest()->front());
4026     }
4027   }
4028   return UsedAssumedInformation;
4029 }
4030 
4031 static bool
4032 identifyAliveSuccessors(Attributor &A, const BranchInst &BI,
4033                         AbstractAttribute &AA,
4034                         SmallVectorImpl<const Instruction *> &AliveSuccessors) {
4035   bool UsedAssumedInformation = false;
4036   if (BI.getNumSuccessors() == 1) {
4037     AliveSuccessors.push_back(&BI.getSuccessor(0)->front());
4038   } else {
4039     Optional<Constant *> C =
4040         A.getAssumedConstant(*BI.getCondition(), AA, UsedAssumedInformation);
4041     if (!C.hasValue() || isa_and_nonnull<UndefValue>(C.getValue())) {
4042       // No value yet, assume both edges are dead.
4043     } else if (isa_and_nonnull<ConstantInt>(*C)) {
4044       const BasicBlock *SuccBB =
4045           BI.getSuccessor(1 - cast<ConstantInt>(*C)->getValue().getZExtValue());
4046       AliveSuccessors.push_back(&SuccBB->front());
4047     } else {
4048       AliveSuccessors.push_back(&BI.getSuccessor(0)->front());
4049       AliveSuccessors.push_back(&BI.getSuccessor(1)->front());
4050       UsedAssumedInformation = false;
4051     }
4052   }
4053   return UsedAssumedInformation;
4054 }
4055 
4056 static bool
4057 identifyAliveSuccessors(Attributor &A, const SwitchInst &SI,
4058                         AbstractAttribute &AA,
4059                         SmallVectorImpl<const Instruction *> &AliveSuccessors) {
4060   bool UsedAssumedInformation = false;
4061   Optional<Constant *> C =
4062       A.getAssumedConstant(*SI.getCondition(), AA, UsedAssumedInformation);
4063   if (!C.hasValue() || isa_and_nonnull<UndefValue>(C.getValue())) {
4064     // No value yet, assume all edges are dead.
4065   } else if (isa_and_nonnull<ConstantInt>(C.getValue())) {
4066     for (auto &CaseIt : SI.cases()) {
4067       if (CaseIt.getCaseValue() == C.getValue()) {
4068         AliveSuccessors.push_back(&CaseIt.getCaseSuccessor()->front());
4069         return UsedAssumedInformation;
4070       }
4071     }
4072     AliveSuccessors.push_back(&SI.getDefaultDest()->front());
4073     return UsedAssumedInformation;
4074   } else {
4075     for (const BasicBlock *SuccBB : successors(SI.getParent()))
4076       AliveSuccessors.push_back(&SuccBB->front());
4077   }
4078   return UsedAssumedInformation;
4079 }
4080 
4081 ChangeStatus AAIsDeadFunction::updateImpl(Attributor &A) {
4082   ChangeStatus Change = ChangeStatus::UNCHANGED;
4083 
4084   LLVM_DEBUG(dbgs() << "[AAIsDead] Live [" << AssumedLiveBlocks.size() << "/"
4085                     << getAnchorScope()->size() << "] BBs and "
4086                     << ToBeExploredFrom.size() << " exploration points and "
4087                     << KnownDeadEnds.size() << " known dead ends\n");
4088 
4089   // Copy and clear the list of instructions we need to explore from. It is
4090   // refilled with instructions the next update has to look at.
4091   SmallVector<const Instruction *, 8> Worklist(ToBeExploredFrom.begin(),
4092                                                ToBeExploredFrom.end());
4093   decltype(ToBeExploredFrom) NewToBeExploredFrom;
4094 
4095   SmallVector<const Instruction *, 8> AliveSuccessors;
4096   while (!Worklist.empty()) {
4097     const Instruction *I = Worklist.pop_back_val();
4098     LLVM_DEBUG(dbgs() << "[AAIsDead] Exploration inst: " << *I << "\n");
4099 
4100     // Fast forward for uninteresting instructions. We could look for UB here
4101     // though.
4102     while (!I->isTerminator() && !isa<CallBase>(I))
4103       I = I->getNextNode();
4104 
4105     AliveSuccessors.clear();
4106 
4107     bool UsedAssumedInformation = false;
4108     switch (I->getOpcode()) {
4109     // TODO: look for (assumed) UB to backwards propagate "deadness".
4110     default:
4111       assert(I->isTerminator() &&
4112              "Expected non-terminators to be handled already!");
4113       for (const BasicBlock *SuccBB : successors(I->getParent()))
4114         AliveSuccessors.push_back(&SuccBB->front());
4115       break;
4116     case Instruction::Call:
4117       UsedAssumedInformation = identifyAliveSuccessors(A, cast<CallInst>(*I),
4118                                                        *this, AliveSuccessors);
4119       break;
4120     case Instruction::Invoke:
4121       UsedAssumedInformation = identifyAliveSuccessors(A, cast<InvokeInst>(*I),
4122                                                        *this, AliveSuccessors);
4123       break;
4124     case Instruction::Br:
4125       UsedAssumedInformation = identifyAliveSuccessors(A, cast<BranchInst>(*I),
4126                                                        *this, AliveSuccessors);
4127       break;
4128     case Instruction::Switch:
4129       UsedAssumedInformation = identifyAliveSuccessors(A, cast<SwitchInst>(*I),
4130                                                        *this, AliveSuccessors);
4131       break;
4132     }
4133 
4134     if (UsedAssumedInformation) {
4135       NewToBeExploredFrom.insert(I);
4136     } else if (AliveSuccessors.empty() ||
4137                (I->isTerminator() &&
4138                 AliveSuccessors.size() < I->getNumSuccessors())) {
4139       if (KnownDeadEnds.insert(I))
4140         Change = ChangeStatus::CHANGED;
4141     }
4142 
4143     LLVM_DEBUG(dbgs() << "[AAIsDead] #AliveSuccessors: "
4144                       << AliveSuccessors.size() << " UsedAssumedInformation: "
4145                       << UsedAssumedInformation << "\n");
4146 
4147     for (const Instruction *AliveSuccessor : AliveSuccessors) {
4148       if (!I->isTerminator()) {
4149         assert(AliveSuccessors.size() == 1 &&
4150                "Non-terminator expected to have a single successor!");
4151         Worklist.push_back(AliveSuccessor);
4152       } else {
4153         // record the assumed live edge
4154         auto Edge = std::make_pair(I->getParent(), AliveSuccessor->getParent());
4155         if (AssumedLiveEdges.insert(Edge).second)
4156           Change = ChangeStatus::CHANGED;
4157         if (assumeLive(A, *AliveSuccessor->getParent()))
4158           Worklist.push_back(AliveSuccessor);
4159       }
4160     }
4161   }
4162 
4163   // Check if the content of ToBeExploredFrom changed, ignore the order.
4164   if (NewToBeExploredFrom.size() != ToBeExploredFrom.size() ||
4165       llvm::any_of(NewToBeExploredFrom, [&](const Instruction *I) {
4166         return !ToBeExploredFrom.count(I);
4167       })) {
4168     Change = ChangeStatus::CHANGED;
4169     ToBeExploredFrom = std::move(NewToBeExploredFrom);
4170   }
4171 
4172   // If we know everything is live there is no need to query for liveness.
4173   // Instead, indicating a pessimistic fixpoint will cause the state to be
4174   // "invalid" and all queries to be answered conservatively without lookups.
4175   // To be in this state we have to (1) finished the exploration and (3) not
4176   // discovered any non-trivial dead end and (2) not ruled unreachable code
4177   // dead.
4178   if (ToBeExploredFrom.empty() &&
4179       getAnchorScope()->size() == AssumedLiveBlocks.size() &&
4180       llvm::all_of(KnownDeadEnds, [](const Instruction *DeadEndI) {
4181         return DeadEndI->isTerminator() && DeadEndI->getNumSuccessors() == 0;
4182       }))
4183     return indicatePessimisticFixpoint();
4184   return Change;
4185 }
4186 
4187 /// Liveness information for a call sites.
4188 struct AAIsDeadCallSite final : AAIsDeadFunction {
4189   AAIsDeadCallSite(const IRPosition &IRP, Attributor &A)
4190       : AAIsDeadFunction(IRP, A) {}
4191 
4192   /// See AbstractAttribute::initialize(...).
4193   void initialize(Attributor &A) override {
4194     // TODO: Once we have call site specific value information we can provide
4195     //       call site specific liveness information and then it makes
4196     //       sense to specialize attributes for call sites instead of
4197     //       redirecting requests to the callee.
4198     llvm_unreachable("Abstract attributes for liveness are not "
4199                      "supported for call sites yet!");
4200   }
4201 
4202   /// See AbstractAttribute::updateImpl(...).
4203   ChangeStatus updateImpl(Attributor &A) override {
4204     return indicatePessimisticFixpoint();
4205   }
4206 
4207   /// See AbstractAttribute::trackStatistics()
4208   void trackStatistics() const override {}
4209 };
4210 } // namespace
4211 
4212 /// -------------------- Dereferenceable Argument Attribute --------------------
4213 
4214 namespace {
4215 struct AADereferenceableImpl : AADereferenceable {
4216   AADereferenceableImpl(const IRPosition &IRP, Attributor &A)
4217       : AADereferenceable(IRP, A) {}
4218   using StateType = DerefState;
4219 
4220   /// See AbstractAttribute::initialize(...).
4221   void initialize(Attributor &A) override {
4222     SmallVector<Attribute, 4> Attrs;
4223     getAttrs({Attribute::Dereferenceable, Attribute::DereferenceableOrNull},
4224              Attrs, /* IgnoreSubsumingPositions */ false, &A);
4225     for (const Attribute &Attr : Attrs)
4226       takeKnownDerefBytesMaximum(Attr.getValueAsInt());
4227 
4228     const IRPosition &IRP = this->getIRPosition();
4229     NonNullAA = &A.getAAFor<AANonNull>(*this, IRP, DepClassTy::NONE);
4230 
4231     bool CanBeNull, CanBeFreed;
4232     takeKnownDerefBytesMaximum(
4233         IRP.getAssociatedValue().getPointerDereferenceableBytes(
4234             A.getDataLayout(), CanBeNull, CanBeFreed));
4235 
4236     bool IsFnInterface = IRP.isFnInterfaceKind();
4237     Function *FnScope = IRP.getAnchorScope();
4238     if (IsFnInterface && (!FnScope || !A.isFunctionIPOAmendable(*FnScope))) {
4239       indicatePessimisticFixpoint();
4240       return;
4241     }
4242 
4243     if (Instruction *CtxI = getCtxI())
4244       followUsesInMBEC(*this, A, getState(), *CtxI);
4245   }
4246 
4247   /// See AbstractAttribute::getState()
4248   /// {
4249   StateType &getState() override { return *this; }
4250   const StateType &getState() const override { return *this; }
4251   /// }
4252 
4253   /// Helper function for collecting accessed bytes in must-be-executed-context
4254   void addAccessedBytesForUse(Attributor &A, const Use *U, const Instruction *I,
4255                               DerefState &State) {
4256     const Value *UseV = U->get();
4257     if (!UseV->getType()->isPointerTy())
4258       return;
4259 
4260     Optional<MemoryLocation> Loc = MemoryLocation::getOrNone(I);
4261     if (!Loc || Loc->Ptr != UseV || !Loc->Size.isPrecise() || I->isVolatile())
4262       return;
4263 
4264     int64_t Offset;
4265     const Value *Base = GetPointerBaseWithConstantOffset(
4266         Loc->Ptr, Offset, A.getDataLayout(), /*AllowNonInbounds*/ true);
4267     if (Base && Base == &getAssociatedValue())
4268       State.addAccessedBytes(Offset, Loc->Size.getValue());
4269   }
4270 
4271   /// See followUsesInMBEC
4272   bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I,
4273                        AADereferenceable::StateType &State) {
4274     bool IsNonNull = false;
4275     bool TrackUse = false;
4276     int64_t DerefBytes = getKnownNonNullAndDerefBytesForUse(
4277         A, *this, getAssociatedValue(), U, I, IsNonNull, TrackUse);
4278     LLVM_DEBUG(dbgs() << "[AADereferenceable] Deref bytes: " << DerefBytes
4279                       << " for instruction " << *I << "\n");
4280 
4281     addAccessedBytesForUse(A, U, I, State);
4282     State.takeKnownDerefBytesMaximum(DerefBytes);
4283     return TrackUse;
4284   }
4285 
4286   /// See AbstractAttribute::manifest(...).
4287   ChangeStatus manifest(Attributor &A) override {
4288     ChangeStatus Change = AADereferenceable::manifest(A);
4289     if (isAssumedNonNull() && hasAttr(Attribute::DereferenceableOrNull)) {
4290       removeAttrs({Attribute::DereferenceableOrNull});
4291       return ChangeStatus::CHANGED;
4292     }
4293     return Change;
4294   }
4295 
4296   void getDeducedAttributes(LLVMContext &Ctx,
4297                             SmallVectorImpl<Attribute> &Attrs) const override {
4298     // TODO: Add *_globally support
4299     if (isAssumedNonNull())
4300       Attrs.emplace_back(Attribute::getWithDereferenceableBytes(
4301           Ctx, getAssumedDereferenceableBytes()));
4302     else
4303       Attrs.emplace_back(Attribute::getWithDereferenceableOrNullBytes(
4304           Ctx, getAssumedDereferenceableBytes()));
4305   }
4306 
4307   /// See AbstractAttribute::getAsStr().
4308   const std::string getAsStr() const override {
4309     if (!getAssumedDereferenceableBytes())
4310       return "unknown-dereferenceable";
4311     return std::string("dereferenceable") +
4312            (isAssumedNonNull() ? "" : "_or_null") +
4313            (isAssumedGlobal() ? "_globally" : "") + "<" +
4314            std::to_string(getKnownDereferenceableBytes()) + "-" +
4315            std::to_string(getAssumedDereferenceableBytes()) + ">";
4316   }
4317 };
4318 
4319 /// Dereferenceable attribute for a floating value.
4320 struct AADereferenceableFloating : AADereferenceableImpl {
4321   AADereferenceableFloating(const IRPosition &IRP, Attributor &A)
4322       : AADereferenceableImpl(IRP, A) {}
4323 
4324   /// See AbstractAttribute::updateImpl(...).
4325   ChangeStatus updateImpl(Attributor &A) override {
4326     const DataLayout &DL = A.getDataLayout();
4327 
4328     auto VisitValueCB = [&](const Value &V, const Instruction *, DerefState &T,
4329                             bool Stripped) -> bool {
4330       unsigned IdxWidth =
4331           DL.getIndexSizeInBits(V.getType()->getPointerAddressSpace());
4332       APInt Offset(IdxWidth, 0);
4333       const Value *Base = stripAndAccumulateOffsets(
4334           A, *this, &V, DL, Offset, /* GetMinOffset */ false,
4335           /* AllowNonInbounds */ true);
4336 
4337       const auto &AA = A.getAAFor<AADereferenceable>(
4338           *this, IRPosition::value(*Base), DepClassTy::REQUIRED);
4339       int64_t DerefBytes = 0;
4340       if (!Stripped && this == &AA) {
4341         // Use IR information if we did not strip anything.
4342         // TODO: track globally.
4343         bool CanBeNull, CanBeFreed;
4344         DerefBytes =
4345             Base->getPointerDereferenceableBytes(DL, CanBeNull, CanBeFreed);
4346         T.GlobalState.indicatePessimisticFixpoint();
4347       } else {
4348         const DerefState &DS = AA.getState();
4349         DerefBytes = DS.DerefBytesState.getAssumed();
4350         T.GlobalState &= DS.GlobalState;
4351       }
4352 
4353       // For now we do not try to "increase" dereferenceability due to negative
4354       // indices as we first have to come up with code to deal with loops and
4355       // for overflows of the dereferenceable bytes.
4356       int64_t OffsetSExt = Offset.getSExtValue();
4357       if (OffsetSExt < 0)
4358         OffsetSExt = 0;
4359 
4360       T.takeAssumedDerefBytesMinimum(
4361           std::max(int64_t(0), DerefBytes - OffsetSExt));
4362 
4363       if (this == &AA) {
4364         if (!Stripped) {
4365           // If nothing was stripped IR information is all we got.
4366           T.takeKnownDerefBytesMaximum(
4367               std::max(int64_t(0), DerefBytes - OffsetSExt));
4368           T.indicatePessimisticFixpoint();
4369         } else if (OffsetSExt > 0) {
4370           // If something was stripped but there is circular reasoning we look
4371           // for the offset. If it is positive we basically decrease the
4372           // dereferenceable bytes in a circluar loop now, which will simply
4373           // drive them down to the known value in a very slow way which we
4374           // can accelerate.
4375           T.indicatePessimisticFixpoint();
4376         }
4377       }
4378 
4379       return T.isValidState();
4380     };
4381 
4382     DerefState T;
4383     bool UsedAssumedInformation = false;
4384     if (!genericValueTraversal<DerefState>(A, getIRPosition(), *this, T,
4385                                            VisitValueCB, getCtxI(),
4386                                            UsedAssumedInformation))
4387       return indicatePessimisticFixpoint();
4388 
4389     return clampStateAndIndicateChange(getState(), T);
4390   }
4391 
4392   /// See AbstractAttribute::trackStatistics()
4393   void trackStatistics() const override {
4394     STATS_DECLTRACK_FLOATING_ATTR(dereferenceable)
4395   }
4396 };
4397 
4398 /// Dereferenceable attribute for a return value.
4399 struct AADereferenceableReturned final
4400     : AAReturnedFromReturnedValues<AADereferenceable, AADereferenceableImpl> {
4401   AADereferenceableReturned(const IRPosition &IRP, Attributor &A)
4402       : AAReturnedFromReturnedValues<AADereferenceable, AADereferenceableImpl>(
4403             IRP, A) {}
4404 
4405   /// See AbstractAttribute::trackStatistics()
4406   void trackStatistics() const override {
4407     STATS_DECLTRACK_FNRET_ATTR(dereferenceable)
4408   }
4409 };
4410 
4411 /// Dereferenceable attribute for an argument
4412 struct AADereferenceableArgument final
4413     : AAArgumentFromCallSiteArguments<AADereferenceable,
4414                                       AADereferenceableImpl> {
4415   using Base =
4416       AAArgumentFromCallSiteArguments<AADereferenceable, AADereferenceableImpl>;
4417   AADereferenceableArgument(const IRPosition &IRP, Attributor &A)
4418       : Base(IRP, A) {}
4419 
4420   /// See AbstractAttribute::trackStatistics()
4421   void trackStatistics() const override {
4422     STATS_DECLTRACK_ARG_ATTR(dereferenceable)
4423   }
4424 };
4425 
4426 /// Dereferenceable attribute for a call site argument.
4427 struct AADereferenceableCallSiteArgument final : AADereferenceableFloating {
4428   AADereferenceableCallSiteArgument(const IRPosition &IRP, Attributor &A)
4429       : AADereferenceableFloating(IRP, A) {}
4430 
4431   /// See AbstractAttribute::trackStatistics()
4432   void trackStatistics() const override {
4433     STATS_DECLTRACK_CSARG_ATTR(dereferenceable)
4434   }
4435 };
4436 
4437 /// Dereferenceable attribute deduction for a call site return value.
4438 struct AADereferenceableCallSiteReturned final
4439     : AACallSiteReturnedFromReturned<AADereferenceable, AADereferenceableImpl> {
4440   using Base =
4441       AACallSiteReturnedFromReturned<AADereferenceable, AADereferenceableImpl>;
4442   AADereferenceableCallSiteReturned(const IRPosition &IRP, Attributor &A)
4443       : Base(IRP, A) {}
4444 
4445   /// See AbstractAttribute::trackStatistics()
4446   void trackStatistics() const override {
4447     STATS_DECLTRACK_CS_ATTR(dereferenceable);
4448   }
4449 };
4450 } // namespace
4451 
4452 // ------------------------ Align Argument Attribute ------------------------
4453 
4454 namespace {
4455 static unsigned getKnownAlignForUse(Attributor &A, AAAlign &QueryingAA,
4456                                     Value &AssociatedValue, const Use *U,
4457                                     const Instruction *I, bool &TrackUse) {
4458   // We need to follow common pointer manipulation uses to the accesses they
4459   // feed into.
4460   if (isa<CastInst>(I)) {
4461     // Follow all but ptr2int casts.
4462     TrackUse = !isa<PtrToIntInst>(I);
4463     return 0;
4464   }
4465   if (auto *GEP = dyn_cast<GetElementPtrInst>(I)) {
4466     if (GEP->hasAllConstantIndices())
4467       TrackUse = true;
4468     return 0;
4469   }
4470 
4471   MaybeAlign MA;
4472   if (const auto *CB = dyn_cast<CallBase>(I)) {
4473     if (CB->isBundleOperand(U) || CB->isCallee(U))
4474       return 0;
4475 
4476     unsigned ArgNo = CB->getArgOperandNo(U);
4477     IRPosition IRP = IRPosition::callsite_argument(*CB, ArgNo);
4478     // As long as we only use known information there is no need to track
4479     // dependences here.
4480     auto &AlignAA = A.getAAFor<AAAlign>(QueryingAA, IRP, DepClassTy::NONE);
4481     MA = MaybeAlign(AlignAA.getKnownAlign());
4482   }
4483 
4484   const DataLayout &DL = A.getDataLayout();
4485   const Value *UseV = U->get();
4486   if (auto *SI = dyn_cast<StoreInst>(I)) {
4487     if (SI->getPointerOperand() == UseV)
4488       MA = SI->getAlign();
4489   } else if (auto *LI = dyn_cast<LoadInst>(I)) {
4490     if (LI->getPointerOperand() == UseV)
4491       MA = LI->getAlign();
4492   }
4493 
4494   if (!MA || *MA <= QueryingAA.getKnownAlign())
4495     return 0;
4496 
4497   unsigned Alignment = MA->value();
4498   int64_t Offset;
4499 
4500   if (const Value *Base = GetPointerBaseWithConstantOffset(UseV, Offset, DL)) {
4501     if (Base == &AssociatedValue) {
4502       // BasePointerAddr + Offset = Alignment * Q for some integer Q.
4503       // So we can say that the maximum power of two which is a divisor of
4504       // gcd(Offset, Alignment) is an alignment.
4505 
4506       uint32_t gcd =
4507           greatestCommonDivisor(uint32_t(abs((int32_t)Offset)), Alignment);
4508       Alignment = llvm::PowerOf2Floor(gcd);
4509     }
4510   }
4511 
4512   return Alignment;
4513 }
4514 
4515 struct AAAlignImpl : AAAlign {
4516   AAAlignImpl(const IRPosition &IRP, Attributor &A) : AAAlign(IRP, A) {}
4517 
4518   /// See AbstractAttribute::initialize(...).
4519   void initialize(Attributor &A) override {
4520     SmallVector<Attribute, 4> Attrs;
4521     getAttrs({Attribute::Alignment}, Attrs);
4522     for (const Attribute &Attr : Attrs)
4523       takeKnownMaximum(Attr.getValueAsInt());
4524 
4525     Value &V = getAssociatedValue();
4526     takeKnownMaximum(V.getPointerAlignment(A.getDataLayout()).value());
4527 
4528     if (getIRPosition().isFnInterfaceKind() &&
4529         (!getAnchorScope() ||
4530          !A.isFunctionIPOAmendable(*getAssociatedFunction()))) {
4531       indicatePessimisticFixpoint();
4532       return;
4533     }
4534 
4535     if (Instruction *CtxI = getCtxI())
4536       followUsesInMBEC(*this, A, getState(), *CtxI);
4537   }
4538 
4539   /// See AbstractAttribute::manifest(...).
4540   ChangeStatus manifest(Attributor &A) override {
4541     ChangeStatus LoadStoreChanged = ChangeStatus::UNCHANGED;
4542 
4543     // Check for users that allow alignment annotations.
4544     Value &AssociatedValue = getAssociatedValue();
4545     for (const Use &U : AssociatedValue.uses()) {
4546       if (auto *SI = dyn_cast<StoreInst>(U.getUser())) {
4547         if (SI->getPointerOperand() == &AssociatedValue)
4548           if (SI->getAlignment() < getAssumedAlign()) {
4549             STATS_DECLTRACK(AAAlign, Store,
4550                             "Number of times alignment added to a store");
4551             SI->setAlignment(Align(getAssumedAlign()));
4552             LoadStoreChanged = ChangeStatus::CHANGED;
4553           }
4554       } else if (auto *LI = dyn_cast<LoadInst>(U.getUser())) {
4555         if (LI->getPointerOperand() == &AssociatedValue)
4556           if (LI->getAlignment() < getAssumedAlign()) {
4557             LI->setAlignment(Align(getAssumedAlign()));
4558             STATS_DECLTRACK(AAAlign, Load,
4559                             "Number of times alignment added to a load");
4560             LoadStoreChanged = ChangeStatus::CHANGED;
4561           }
4562       }
4563     }
4564 
4565     ChangeStatus Changed = AAAlign::manifest(A);
4566 
4567     Align InheritAlign =
4568         getAssociatedValue().getPointerAlignment(A.getDataLayout());
4569     if (InheritAlign >= getAssumedAlign())
4570       return LoadStoreChanged;
4571     return Changed | LoadStoreChanged;
4572   }
4573 
4574   // TODO: Provide a helper to determine the implied ABI alignment and check in
4575   //       the existing manifest method and a new one for AAAlignImpl that value
4576   //       to avoid making the alignment explicit if it did not improve.
4577 
4578   /// See AbstractAttribute::getDeducedAttributes
4579   virtual void
4580   getDeducedAttributes(LLVMContext &Ctx,
4581                        SmallVectorImpl<Attribute> &Attrs) const override {
4582     if (getAssumedAlign() > 1)
4583       Attrs.emplace_back(
4584           Attribute::getWithAlignment(Ctx, Align(getAssumedAlign())));
4585   }
4586 
4587   /// See followUsesInMBEC
4588   bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I,
4589                        AAAlign::StateType &State) {
4590     bool TrackUse = false;
4591 
4592     unsigned int KnownAlign =
4593         getKnownAlignForUse(A, *this, getAssociatedValue(), U, I, TrackUse);
4594     State.takeKnownMaximum(KnownAlign);
4595 
4596     return TrackUse;
4597   }
4598 
4599   /// See AbstractAttribute::getAsStr().
4600   const std::string getAsStr() const override {
4601     return getAssumedAlign() ? ("align<" + std::to_string(getKnownAlign()) +
4602                                 "-" + std::to_string(getAssumedAlign()) + ">")
4603                              : "unknown-align";
4604   }
4605 };
4606 
4607 /// Align attribute for a floating value.
4608 struct AAAlignFloating : AAAlignImpl {
4609   AAAlignFloating(const IRPosition &IRP, Attributor &A) : AAAlignImpl(IRP, A) {}
4610 
4611   /// See AbstractAttribute::updateImpl(...).
4612   ChangeStatus updateImpl(Attributor &A) override {
4613     const DataLayout &DL = A.getDataLayout();
4614 
4615     auto VisitValueCB = [&](Value &V, const Instruction *,
4616                             AAAlign::StateType &T, bool Stripped) -> bool {
4617       if (isa<UndefValue>(V) || isa<ConstantPointerNull>(V))
4618         return true;
4619       const auto &AA = A.getAAFor<AAAlign>(*this, IRPosition::value(V),
4620                                            DepClassTy::REQUIRED);
4621       if (!Stripped && this == &AA) {
4622         int64_t Offset;
4623         unsigned Alignment = 1;
4624         if (const Value *Base =
4625                 GetPointerBaseWithConstantOffset(&V, Offset, DL)) {
4626           // TODO: Use AAAlign for the base too.
4627           Align PA = Base->getPointerAlignment(DL);
4628           // BasePointerAddr + Offset = Alignment * Q for some integer Q.
4629           // So we can say that the maximum power of two which is a divisor of
4630           // gcd(Offset, Alignment) is an alignment.
4631 
4632           uint32_t gcd = greatestCommonDivisor(uint32_t(abs((int32_t)Offset)),
4633                                                uint32_t(PA.value()));
4634           Alignment = llvm::PowerOf2Floor(gcd);
4635         } else {
4636           Alignment = V.getPointerAlignment(DL).value();
4637         }
4638         // Use only IR information if we did not strip anything.
4639         T.takeKnownMaximum(Alignment);
4640         T.indicatePessimisticFixpoint();
4641       } else {
4642         // Use abstract attribute information.
4643         const AAAlign::StateType &DS = AA.getState();
4644         T ^= DS;
4645       }
4646       return T.isValidState();
4647     };
4648 
4649     StateType T;
4650     bool UsedAssumedInformation = false;
4651     if (!genericValueTraversal<StateType>(A, getIRPosition(), *this, T,
4652                                           VisitValueCB, getCtxI(),
4653                                           UsedAssumedInformation))
4654       return indicatePessimisticFixpoint();
4655 
4656     // TODO: If we know we visited all incoming values, thus no are assumed
4657     // dead, we can take the known information from the state T.
4658     return clampStateAndIndicateChange(getState(), T);
4659   }
4660 
4661   /// See AbstractAttribute::trackStatistics()
4662   void trackStatistics() const override { STATS_DECLTRACK_FLOATING_ATTR(align) }
4663 };
4664 
4665 /// Align attribute for function return value.
4666 struct AAAlignReturned final
4667     : AAReturnedFromReturnedValues<AAAlign, AAAlignImpl> {
4668   using Base = AAReturnedFromReturnedValues<AAAlign, AAAlignImpl>;
4669   AAAlignReturned(const IRPosition &IRP, Attributor &A) : Base(IRP, A) {}
4670 
4671   /// See AbstractAttribute::initialize(...).
4672   void initialize(Attributor &A) override {
4673     Base::initialize(A);
4674     Function *F = getAssociatedFunction();
4675     if (!F || F->isDeclaration())
4676       indicatePessimisticFixpoint();
4677   }
4678 
4679   /// See AbstractAttribute::trackStatistics()
4680   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(aligned) }
4681 };
4682 
4683 /// Align attribute for function argument.
4684 struct AAAlignArgument final
4685     : AAArgumentFromCallSiteArguments<AAAlign, AAAlignImpl> {
4686   using Base = AAArgumentFromCallSiteArguments<AAAlign, AAAlignImpl>;
4687   AAAlignArgument(const IRPosition &IRP, Attributor &A) : Base(IRP, A) {}
4688 
4689   /// See AbstractAttribute::manifest(...).
4690   ChangeStatus manifest(Attributor &A) override {
4691     // If the associated argument is involved in a must-tail call we give up
4692     // because we would need to keep the argument alignments of caller and
4693     // callee in-sync. Just does not seem worth the trouble right now.
4694     if (A.getInfoCache().isInvolvedInMustTailCall(*getAssociatedArgument()))
4695       return ChangeStatus::UNCHANGED;
4696     return Base::manifest(A);
4697   }
4698 
4699   /// See AbstractAttribute::trackStatistics()
4700   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(aligned) }
4701 };
4702 
4703 struct AAAlignCallSiteArgument final : AAAlignFloating {
4704   AAAlignCallSiteArgument(const IRPosition &IRP, Attributor &A)
4705       : AAAlignFloating(IRP, A) {}
4706 
4707   /// See AbstractAttribute::manifest(...).
4708   ChangeStatus manifest(Attributor &A) override {
4709     // If the associated argument is involved in a must-tail call we give up
4710     // because we would need to keep the argument alignments of caller and
4711     // callee in-sync. Just does not seem worth the trouble right now.
4712     if (Argument *Arg = getAssociatedArgument())
4713       if (A.getInfoCache().isInvolvedInMustTailCall(*Arg))
4714         return ChangeStatus::UNCHANGED;
4715     ChangeStatus Changed = AAAlignImpl::manifest(A);
4716     Align InheritAlign =
4717         getAssociatedValue().getPointerAlignment(A.getDataLayout());
4718     if (InheritAlign >= getAssumedAlign())
4719       Changed = ChangeStatus::UNCHANGED;
4720     return Changed;
4721   }
4722 
4723   /// See AbstractAttribute::updateImpl(Attributor &A).
4724   ChangeStatus updateImpl(Attributor &A) override {
4725     ChangeStatus Changed = AAAlignFloating::updateImpl(A);
4726     if (Argument *Arg = getAssociatedArgument()) {
4727       // We only take known information from the argument
4728       // so we do not need to track a dependence.
4729       const auto &ArgAlignAA = A.getAAFor<AAAlign>(
4730           *this, IRPosition::argument(*Arg), DepClassTy::NONE);
4731       takeKnownMaximum(ArgAlignAA.getKnownAlign());
4732     }
4733     return Changed;
4734   }
4735 
4736   /// See AbstractAttribute::trackStatistics()
4737   void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(aligned) }
4738 };
4739 
4740 /// Align attribute deduction for a call site return value.
4741 struct AAAlignCallSiteReturned final
4742     : AACallSiteReturnedFromReturned<AAAlign, AAAlignImpl> {
4743   using Base = AACallSiteReturnedFromReturned<AAAlign, AAAlignImpl>;
4744   AAAlignCallSiteReturned(const IRPosition &IRP, Attributor &A)
4745       : Base(IRP, A) {}
4746 
4747   /// See AbstractAttribute::initialize(...).
4748   void initialize(Attributor &A) override {
4749     Base::initialize(A);
4750     Function *F = getAssociatedFunction();
4751     if (!F || F->isDeclaration())
4752       indicatePessimisticFixpoint();
4753   }
4754 
4755   /// See AbstractAttribute::trackStatistics()
4756   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(align); }
4757 };
4758 } // namespace
4759 
4760 /// ------------------ Function No-Return Attribute ----------------------------
4761 namespace {
4762 struct AANoReturnImpl : public AANoReturn {
4763   AANoReturnImpl(const IRPosition &IRP, Attributor &A) : AANoReturn(IRP, A) {}
4764 
4765   /// See AbstractAttribute::initialize(...).
4766   void initialize(Attributor &A) override {
4767     AANoReturn::initialize(A);
4768     Function *F = getAssociatedFunction();
4769     if (!F || F->isDeclaration())
4770       indicatePessimisticFixpoint();
4771   }
4772 
4773   /// See AbstractAttribute::getAsStr().
4774   const std::string getAsStr() const override {
4775     return getAssumed() ? "noreturn" : "may-return";
4776   }
4777 
4778   /// See AbstractAttribute::updateImpl(Attributor &A).
4779   virtual ChangeStatus updateImpl(Attributor &A) override {
4780     auto CheckForNoReturn = [](Instruction &) { return false; };
4781     bool UsedAssumedInformation = false;
4782     if (!A.checkForAllInstructions(CheckForNoReturn, *this,
4783                                    {(unsigned)Instruction::Ret},
4784                                    UsedAssumedInformation))
4785       return indicatePessimisticFixpoint();
4786     return ChangeStatus::UNCHANGED;
4787   }
4788 };
4789 
4790 struct AANoReturnFunction final : AANoReturnImpl {
4791   AANoReturnFunction(const IRPosition &IRP, Attributor &A)
4792       : AANoReturnImpl(IRP, A) {}
4793 
4794   /// See AbstractAttribute::trackStatistics()
4795   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(noreturn) }
4796 };
4797 
4798 /// NoReturn attribute deduction for a call sites.
4799 struct AANoReturnCallSite final : AANoReturnImpl {
4800   AANoReturnCallSite(const IRPosition &IRP, Attributor &A)
4801       : AANoReturnImpl(IRP, A) {}
4802 
4803   /// See AbstractAttribute::initialize(...).
4804   void initialize(Attributor &A) override {
4805     AANoReturnImpl::initialize(A);
4806     if (Function *F = getAssociatedFunction()) {
4807       const IRPosition &FnPos = IRPosition::function(*F);
4808       auto &FnAA = A.getAAFor<AANoReturn>(*this, FnPos, DepClassTy::REQUIRED);
4809       if (!FnAA.isAssumedNoReturn())
4810         indicatePessimisticFixpoint();
4811     }
4812   }
4813 
4814   /// See AbstractAttribute::updateImpl(...).
4815   ChangeStatus updateImpl(Attributor &A) override {
4816     // TODO: Once we have call site specific value information we can provide
4817     //       call site specific liveness information and then it makes
4818     //       sense to specialize attributes for call sites arguments instead of
4819     //       redirecting requests to the callee argument.
4820     Function *F = getAssociatedFunction();
4821     const IRPosition &FnPos = IRPosition::function(*F);
4822     auto &FnAA = A.getAAFor<AANoReturn>(*this, FnPos, DepClassTy::REQUIRED);
4823     return clampStateAndIndicateChange(getState(), FnAA.getState());
4824   }
4825 
4826   /// See AbstractAttribute::trackStatistics()
4827   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(noreturn); }
4828 };
4829 } // namespace
4830 
4831 /// ----------------------- Instance Info ---------------------------------
4832 
4833 namespace {
4834 /// A class to hold the state of for no-capture attributes.
4835 struct AAInstanceInfoImpl : public AAInstanceInfo {
4836   AAInstanceInfoImpl(const IRPosition &IRP, Attributor &A)
4837       : AAInstanceInfo(IRP, A) {}
4838 
4839   /// See AbstractAttribute::initialize(...).
4840   void initialize(Attributor &A) override {
4841     Value &V = getAssociatedValue();
4842     if (auto *C = dyn_cast<Constant>(&V)) {
4843       if (C->isThreadDependent())
4844         indicatePessimisticFixpoint();
4845       else
4846         indicateOptimisticFixpoint();
4847       return;
4848     }
4849     if (auto *CB = dyn_cast<CallBase>(&V))
4850       if (CB->arg_size() == 0 && !CB->mayHaveSideEffects() &&
4851           !CB->mayReadFromMemory()) {
4852         indicateOptimisticFixpoint();
4853         return;
4854       }
4855   }
4856 
4857   /// See AbstractAttribute::updateImpl(...).
4858   ChangeStatus updateImpl(Attributor &A) override {
4859     ChangeStatus Changed = ChangeStatus::UNCHANGED;
4860 
4861     Value &V = getAssociatedValue();
4862     const Function *Scope = nullptr;
4863     if (auto *I = dyn_cast<Instruction>(&V))
4864       Scope = I->getFunction();
4865     if (auto *A = dyn_cast<Argument>(&V)) {
4866       Scope = A->getParent();
4867       if (!Scope->hasLocalLinkage())
4868         return Changed;
4869     }
4870     if (!Scope)
4871       return indicateOptimisticFixpoint();
4872 
4873     auto &NoRecurseAA = A.getAAFor<AANoRecurse>(
4874         *this, IRPosition::function(*Scope), DepClassTy::OPTIONAL);
4875     if (NoRecurseAA.isAssumedNoRecurse())
4876       return Changed;
4877 
4878     auto UsePred = [&](const Use &U, bool &Follow) {
4879       const Instruction *UserI = dyn_cast<Instruction>(U.getUser());
4880       if (!UserI || isa<GetElementPtrInst>(UserI) || isa<CastInst>(UserI) ||
4881           isa<PHINode>(UserI) || isa<SelectInst>(UserI)) {
4882         Follow = true;
4883         return true;
4884       }
4885       if (isa<LoadInst>(UserI) || isa<CmpInst>(UserI) ||
4886           (isa<StoreInst>(UserI) &&
4887            cast<StoreInst>(UserI)->getValueOperand() != U.get()))
4888         return true;
4889       if (auto *CB = dyn_cast<CallBase>(UserI)) {
4890         // This check is not guaranteeing uniqueness but for now that we cannot
4891         // end up with two versions of \p U thinking it was one.
4892         if (!CB->getCalledFunction() ||
4893             !CB->getCalledFunction()->hasLocalLinkage())
4894           return true;
4895         if (!CB->isArgOperand(&U))
4896           return false;
4897         const auto &ArgInstanceInfoAA = A.getAAFor<AAInstanceInfo>(
4898             *this, IRPosition::callsite_argument(*CB, CB->getArgOperandNo(&U)),
4899             DepClassTy::OPTIONAL);
4900         if (ArgInstanceInfoAA.isAssumedUniqueForAnalysis())
4901           return true;
4902       }
4903       return false;
4904     };
4905 
4906     auto EquivalentUseCB = [&](const Use &OldU, const Use &NewU) {
4907       if (auto *SI = dyn_cast<StoreInst>(OldU.getUser())) {
4908         auto *Ptr = SI->getPointerOperand()->stripPointerCasts();
4909         if (isa<AllocaInst>(Ptr) && AA::isDynamicallyUnique(A, *this, *Ptr))
4910           return true;
4911         auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(
4912             *SI->getFunction());
4913         if (isAllocationFn(Ptr, TLI) && AA::isDynamicallyUnique(A, *this, *Ptr))
4914           return true;
4915       }
4916       return false;
4917     };
4918 
4919     if (!A.checkForAllUses(UsePred, *this, V, /* CheckBBLivenessOnly */ true,
4920                            DepClassTy::OPTIONAL,
4921                            /* IgnoreDroppableUses */ true, EquivalentUseCB))
4922       return indicatePessimisticFixpoint();
4923 
4924     return Changed;
4925   }
4926 
4927   /// See AbstractState::getAsStr().
4928   const std::string getAsStr() const override {
4929     return isAssumedUniqueForAnalysis() ? "<unique [fAa]>" : "<unknown>";
4930   }
4931 
4932   /// See AbstractAttribute::trackStatistics()
4933   void trackStatistics() const override {}
4934 };
4935 
4936 /// InstanceInfo attribute for floating values.
4937 struct AAInstanceInfoFloating : AAInstanceInfoImpl {
4938   AAInstanceInfoFloating(const IRPosition &IRP, Attributor &A)
4939       : AAInstanceInfoImpl(IRP, A) {}
4940 };
4941 
4942 /// NoCapture attribute for function arguments.
4943 struct AAInstanceInfoArgument final : AAInstanceInfoFloating {
4944   AAInstanceInfoArgument(const IRPosition &IRP, Attributor &A)
4945       : AAInstanceInfoFloating(IRP, A) {}
4946 };
4947 
4948 /// InstanceInfo attribute for call site arguments.
4949 struct AAInstanceInfoCallSiteArgument final : AAInstanceInfoImpl {
4950   AAInstanceInfoCallSiteArgument(const IRPosition &IRP, Attributor &A)
4951       : AAInstanceInfoImpl(IRP, A) {}
4952 
4953   /// See AbstractAttribute::updateImpl(...).
4954   ChangeStatus updateImpl(Attributor &A) override {
4955     // TODO: Once we have call site specific value information we can provide
4956     //       call site specific liveness information and then it makes
4957     //       sense to specialize attributes for call sites arguments instead of
4958     //       redirecting requests to the callee argument.
4959     Argument *Arg = getAssociatedArgument();
4960     if (!Arg)
4961       return indicatePessimisticFixpoint();
4962     const IRPosition &ArgPos = IRPosition::argument(*Arg);
4963     auto &ArgAA =
4964         A.getAAFor<AAInstanceInfo>(*this, ArgPos, DepClassTy::REQUIRED);
4965     return clampStateAndIndicateChange(getState(), ArgAA.getState());
4966   }
4967 };
4968 
4969 /// InstanceInfo attribute for function return value.
4970 struct AAInstanceInfoReturned final : AAInstanceInfoImpl {
4971   AAInstanceInfoReturned(const IRPosition &IRP, Attributor &A)
4972       : AAInstanceInfoImpl(IRP, A) {
4973     llvm_unreachable("InstanceInfo is not applicable to function returns!");
4974   }
4975 
4976   /// See AbstractAttribute::initialize(...).
4977   void initialize(Attributor &A) override {
4978     llvm_unreachable("InstanceInfo is not applicable to function returns!");
4979   }
4980 
4981   /// See AbstractAttribute::updateImpl(...).
4982   ChangeStatus updateImpl(Attributor &A) override {
4983     llvm_unreachable("InstanceInfo is not applicable to function returns!");
4984   }
4985 };
4986 
4987 /// InstanceInfo attribute deduction for a call site return value.
4988 struct AAInstanceInfoCallSiteReturned final : AAInstanceInfoFloating {
4989   AAInstanceInfoCallSiteReturned(const IRPosition &IRP, Attributor &A)
4990       : AAInstanceInfoFloating(IRP, A) {}
4991 };
4992 } // namespace
4993 
4994 /// ----------------------- Variable Capturing ---------------------------------
4995 
4996 namespace {
4997 /// A class to hold the state of for no-capture attributes.
4998 struct AANoCaptureImpl : public AANoCapture {
4999   AANoCaptureImpl(const IRPosition &IRP, Attributor &A) : AANoCapture(IRP, A) {}
5000 
5001   /// See AbstractAttribute::initialize(...).
5002   void initialize(Attributor &A) override {
5003     if (hasAttr(getAttrKind(), /* IgnoreSubsumingPositions */ true)) {
5004       indicateOptimisticFixpoint();
5005       return;
5006     }
5007     Function *AnchorScope = getAnchorScope();
5008     if (isFnInterfaceKind() &&
5009         (!AnchorScope || !A.isFunctionIPOAmendable(*AnchorScope))) {
5010       indicatePessimisticFixpoint();
5011       return;
5012     }
5013 
5014     // You cannot "capture" null in the default address space.
5015     if (isa<ConstantPointerNull>(getAssociatedValue()) &&
5016         getAssociatedValue().getType()->getPointerAddressSpace() == 0) {
5017       indicateOptimisticFixpoint();
5018       return;
5019     }
5020 
5021     const Function *F =
5022         isArgumentPosition() ? getAssociatedFunction() : AnchorScope;
5023 
5024     // Check what state the associated function can actually capture.
5025     if (F)
5026       determineFunctionCaptureCapabilities(getIRPosition(), *F, *this);
5027     else
5028       indicatePessimisticFixpoint();
5029   }
5030 
5031   /// See AbstractAttribute::updateImpl(...).
5032   ChangeStatus updateImpl(Attributor &A) override;
5033 
5034   /// see AbstractAttribute::isAssumedNoCaptureMaybeReturned(...).
5035   virtual void
5036   getDeducedAttributes(LLVMContext &Ctx,
5037                        SmallVectorImpl<Attribute> &Attrs) const override {
5038     if (!isAssumedNoCaptureMaybeReturned())
5039       return;
5040 
5041     if (isArgumentPosition()) {
5042       if (isAssumedNoCapture())
5043         Attrs.emplace_back(Attribute::get(Ctx, Attribute::NoCapture));
5044       else if (ManifestInternal)
5045         Attrs.emplace_back(Attribute::get(Ctx, "no-capture-maybe-returned"));
5046     }
5047   }
5048 
5049   /// Set the NOT_CAPTURED_IN_MEM and NOT_CAPTURED_IN_RET bits in \p Known
5050   /// depending on the ability of the function associated with \p IRP to capture
5051   /// state in memory and through "returning/throwing", respectively.
5052   static void determineFunctionCaptureCapabilities(const IRPosition &IRP,
5053                                                    const Function &F,
5054                                                    BitIntegerState &State) {
5055     // TODO: Once we have memory behavior attributes we should use them here.
5056 
5057     // If we know we cannot communicate or write to memory, we do not care about
5058     // ptr2int anymore.
5059     if (F.onlyReadsMemory() && F.doesNotThrow() &&
5060         F.getReturnType()->isVoidTy()) {
5061       State.addKnownBits(NO_CAPTURE);
5062       return;
5063     }
5064 
5065     // A function cannot capture state in memory if it only reads memory, it can
5066     // however return/throw state and the state might be influenced by the
5067     // pointer value, e.g., loading from a returned pointer might reveal a bit.
5068     if (F.onlyReadsMemory())
5069       State.addKnownBits(NOT_CAPTURED_IN_MEM);
5070 
5071     // A function cannot communicate state back if it does not through
5072     // exceptions and doesn not return values.
5073     if (F.doesNotThrow() && F.getReturnType()->isVoidTy())
5074       State.addKnownBits(NOT_CAPTURED_IN_RET);
5075 
5076     // Check existing "returned" attributes.
5077     int ArgNo = IRP.getCalleeArgNo();
5078     if (F.doesNotThrow() && ArgNo >= 0) {
5079       for (unsigned u = 0, e = F.arg_size(); u < e; ++u)
5080         if (F.hasParamAttribute(u, Attribute::Returned)) {
5081           if (u == unsigned(ArgNo))
5082             State.removeAssumedBits(NOT_CAPTURED_IN_RET);
5083           else if (F.onlyReadsMemory())
5084             State.addKnownBits(NO_CAPTURE);
5085           else
5086             State.addKnownBits(NOT_CAPTURED_IN_RET);
5087           break;
5088         }
5089     }
5090   }
5091 
5092   /// See AbstractState::getAsStr().
5093   const std::string getAsStr() const override {
5094     if (isKnownNoCapture())
5095       return "known not-captured";
5096     if (isAssumedNoCapture())
5097       return "assumed not-captured";
5098     if (isKnownNoCaptureMaybeReturned())
5099       return "known not-captured-maybe-returned";
5100     if (isAssumedNoCaptureMaybeReturned())
5101       return "assumed not-captured-maybe-returned";
5102     return "assumed-captured";
5103   }
5104 
5105   /// Check the use \p U and update \p State accordingly. Return true if we
5106   /// should continue to update the state.
5107   bool checkUse(Attributor &A, AANoCapture::StateType &State, const Use &U,
5108                 bool &Follow) {
5109     Instruction *UInst = cast<Instruction>(U.getUser());
5110     LLVM_DEBUG(dbgs() << "[AANoCapture] Check use: " << *U.get() << " in "
5111                       << *UInst << "\n");
5112 
5113     // Deal with ptr2int by following uses.
5114     if (isa<PtrToIntInst>(UInst)) {
5115       LLVM_DEBUG(dbgs() << " - ptr2int assume the worst!\n");
5116       return isCapturedIn(State, /* Memory */ true, /* Integer */ true,
5117                           /* Return */ true);
5118     }
5119 
5120     // For stores we already checked if we can follow them, if they make it
5121     // here we give up.
5122     if (isa<StoreInst>(UInst))
5123       return isCapturedIn(State, /* Memory */ true, /* Integer */ false,
5124                           /* Return */ false);
5125 
5126     // Explicitly catch return instructions.
5127     if (isa<ReturnInst>(UInst)) {
5128       if (UInst->getFunction() == getAnchorScope())
5129         return isCapturedIn(State, /* Memory */ false, /* Integer */ false,
5130                             /* Return */ true);
5131       return isCapturedIn(State, /* Memory */ true, /* Integer */ true,
5132                           /* Return */ true);
5133     }
5134 
5135     // For now we only use special logic for call sites. However, the tracker
5136     // itself knows about a lot of other non-capturing cases already.
5137     auto *CB = dyn_cast<CallBase>(UInst);
5138     if (!CB || !CB->isArgOperand(&U))
5139       return isCapturedIn(State, /* Memory */ true, /* Integer */ true,
5140                           /* Return */ true);
5141 
5142     unsigned ArgNo = CB->getArgOperandNo(&U);
5143     const IRPosition &CSArgPos = IRPosition::callsite_argument(*CB, ArgNo);
5144     // If we have a abstract no-capture attribute for the argument we can use
5145     // it to justify a non-capture attribute here. This allows recursion!
5146     auto &ArgNoCaptureAA =
5147         A.getAAFor<AANoCapture>(*this, CSArgPos, DepClassTy::REQUIRED);
5148     if (ArgNoCaptureAA.isAssumedNoCapture())
5149       return isCapturedIn(State, /* Memory */ false, /* Integer */ false,
5150                           /* Return */ false);
5151     if (ArgNoCaptureAA.isAssumedNoCaptureMaybeReturned()) {
5152       Follow = true;
5153       return isCapturedIn(State, /* Memory */ false, /* Integer */ false,
5154                           /* Return */ false);
5155     }
5156 
5157     // Lastly, we could not find a reason no-capture can be assumed so we don't.
5158     return isCapturedIn(State, /* Memory */ true, /* Integer */ true,
5159                         /* Return */ true);
5160   }
5161 
5162   /// Update \p State according to \p CapturedInMem, \p CapturedInInt, and
5163   /// \p CapturedInRet, then return true if we should continue updating the
5164   /// state.
5165   static bool isCapturedIn(AANoCapture::StateType &State, bool CapturedInMem,
5166                            bool CapturedInInt, bool CapturedInRet) {
5167     LLVM_DEBUG(dbgs() << " - captures [Mem " << CapturedInMem << "|Int "
5168                       << CapturedInInt << "|Ret " << CapturedInRet << "]\n");
5169     if (CapturedInMem)
5170       State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_MEM);
5171     if (CapturedInInt)
5172       State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_INT);
5173     if (CapturedInRet)
5174       State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_RET);
5175     return State.isAssumed(AANoCapture::NO_CAPTURE_MAYBE_RETURNED);
5176   }
5177 };
5178 
5179 ChangeStatus AANoCaptureImpl::updateImpl(Attributor &A) {
5180   const IRPosition &IRP = getIRPosition();
5181   Value *V = isArgumentPosition() ? IRP.getAssociatedArgument()
5182                                   : &IRP.getAssociatedValue();
5183   if (!V)
5184     return indicatePessimisticFixpoint();
5185 
5186   const Function *F =
5187       isArgumentPosition() ? IRP.getAssociatedFunction() : IRP.getAnchorScope();
5188   assert(F && "Expected a function!");
5189   const IRPosition &FnPos = IRPosition::function(*F);
5190 
5191   AANoCapture::StateType T;
5192 
5193   // Readonly means we cannot capture through memory.
5194   bool IsKnown;
5195   if (AA::isAssumedReadOnly(A, FnPos, *this, IsKnown)) {
5196     T.addKnownBits(NOT_CAPTURED_IN_MEM);
5197     if (IsKnown)
5198       addKnownBits(NOT_CAPTURED_IN_MEM);
5199   }
5200 
5201   // Make sure all returned values are different than the underlying value.
5202   // TODO: we could do this in a more sophisticated way inside
5203   //       AAReturnedValues, e.g., track all values that escape through returns
5204   //       directly somehow.
5205   auto CheckReturnedArgs = [&](const AAReturnedValues &RVAA) {
5206     bool SeenConstant = false;
5207     for (auto &It : RVAA.returned_values()) {
5208       if (isa<Constant>(It.first)) {
5209         if (SeenConstant)
5210           return false;
5211         SeenConstant = true;
5212       } else if (!isa<Argument>(It.first) ||
5213                  It.first == getAssociatedArgument())
5214         return false;
5215     }
5216     return true;
5217   };
5218 
5219   const auto &NoUnwindAA =
5220       A.getAAFor<AANoUnwind>(*this, FnPos, DepClassTy::OPTIONAL);
5221   if (NoUnwindAA.isAssumedNoUnwind()) {
5222     bool IsVoidTy = F->getReturnType()->isVoidTy();
5223     const AAReturnedValues *RVAA =
5224         IsVoidTy ? nullptr
5225                  : &A.getAAFor<AAReturnedValues>(*this, FnPos,
5226 
5227                                                  DepClassTy::OPTIONAL);
5228     if (IsVoidTy || CheckReturnedArgs(*RVAA)) {
5229       T.addKnownBits(NOT_CAPTURED_IN_RET);
5230       if (T.isKnown(NOT_CAPTURED_IN_MEM))
5231         return ChangeStatus::UNCHANGED;
5232       if (NoUnwindAA.isKnownNoUnwind() &&
5233           (IsVoidTy || RVAA->getState().isAtFixpoint())) {
5234         addKnownBits(NOT_CAPTURED_IN_RET);
5235         if (isKnown(NOT_CAPTURED_IN_MEM))
5236           return indicateOptimisticFixpoint();
5237       }
5238     }
5239   }
5240 
5241   auto IsDereferenceableOrNull = [&](Value *O, const DataLayout &DL) {
5242     const auto &DerefAA = A.getAAFor<AADereferenceable>(
5243         *this, IRPosition::value(*O), DepClassTy::OPTIONAL);
5244     return DerefAA.getAssumedDereferenceableBytes();
5245   };
5246 
5247   auto UseCheck = [&](const Use &U, bool &Follow) -> bool {
5248     switch (DetermineUseCaptureKind(U, IsDereferenceableOrNull)) {
5249     case UseCaptureKind::NO_CAPTURE:
5250       return true;
5251     case UseCaptureKind::MAY_CAPTURE:
5252       return checkUse(A, T, U, Follow);
5253     case UseCaptureKind::PASSTHROUGH:
5254       Follow = true;
5255       return true;
5256     }
5257     llvm_unreachable("Unexpected use capture kind!");
5258   };
5259 
5260   if (!A.checkForAllUses(UseCheck, *this, *V))
5261     return indicatePessimisticFixpoint();
5262 
5263   AANoCapture::StateType &S = getState();
5264   auto Assumed = S.getAssumed();
5265   S.intersectAssumedBits(T.getAssumed());
5266   if (!isAssumedNoCaptureMaybeReturned())
5267     return indicatePessimisticFixpoint();
5268   return Assumed == S.getAssumed() ? ChangeStatus::UNCHANGED
5269                                    : ChangeStatus::CHANGED;
5270 }
5271 
5272 /// NoCapture attribute for function arguments.
5273 struct AANoCaptureArgument final : AANoCaptureImpl {
5274   AANoCaptureArgument(const IRPosition &IRP, Attributor &A)
5275       : AANoCaptureImpl(IRP, A) {}
5276 
5277   /// See AbstractAttribute::trackStatistics()
5278   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(nocapture) }
5279 };
5280 
5281 /// NoCapture attribute for call site arguments.
5282 struct AANoCaptureCallSiteArgument final : AANoCaptureImpl {
5283   AANoCaptureCallSiteArgument(const IRPosition &IRP, Attributor &A)
5284       : AANoCaptureImpl(IRP, A) {}
5285 
5286   /// See AbstractAttribute::initialize(...).
5287   void initialize(Attributor &A) override {
5288     if (Argument *Arg = getAssociatedArgument())
5289       if (Arg->hasByValAttr())
5290         indicateOptimisticFixpoint();
5291     AANoCaptureImpl::initialize(A);
5292   }
5293 
5294   /// See AbstractAttribute::updateImpl(...).
5295   ChangeStatus updateImpl(Attributor &A) override {
5296     // TODO: Once we have call site specific value information we can provide
5297     //       call site specific liveness information and then it makes
5298     //       sense to specialize attributes for call sites arguments instead of
5299     //       redirecting requests to the callee argument.
5300     Argument *Arg = getAssociatedArgument();
5301     if (!Arg)
5302       return indicatePessimisticFixpoint();
5303     const IRPosition &ArgPos = IRPosition::argument(*Arg);
5304     auto &ArgAA = A.getAAFor<AANoCapture>(*this, ArgPos, DepClassTy::REQUIRED);
5305     return clampStateAndIndicateChange(getState(), ArgAA.getState());
5306   }
5307 
5308   /// See AbstractAttribute::trackStatistics()
5309   void trackStatistics() const override{STATS_DECLTRACK_CSARG_ATTR(nocapture)};
5310 };
5311 
5312 /// NoCapture attribute for floating values.
5313 struct AANoCaptureFloating final : AANoCaptureImpl {
5314   AANoCaptureFloating(const IRPosition &IRP, Attributor &A)
5315       : AANoCaptureImpl(IRP, A) {}
5316 
5317   /// See AbstractAttribute::trackStatistics()
5318   void trackStatistics() const override {
5319     STATS_DECLTRACK_FLOATING_ATTR(nocapture)
5320   }
5321 };
5322 
5323 /// NoCapture attribute for function return value.
5324 struct AANoCaptureReturned final : AANoCaptureImpl {
5325   AANoCaptureReturned(const IRPosition &IRP, Attributor &A)
5326       : AANoCaptureImpl(IRP, A) {
5327     llvm_unreachable("NoCapture is not applicable to function returns!");
5328   }
5329 
5330   /// See AbstractAttribute::initialize(...).
5331   void initialize(Attributor &A) override {
5332     llvm_unreachable("NoCapture is not applicable to function returns!");
5333   }
5334 
5335   /// See AbstractAttribute::updateImpl(...).
5336   ChangeStatus updateImpl(Attributor &A) override {
5337     llvm_unreachable("NoCapture is not applicable to function returns!");
5338   }
5339 
5340   /// See AbstractAttribute::trackStatistics()
5341   void trackStatistics() const override {}
5342 };
5343 
5344 /// NoCapture attribute deduction for a call site return value.
5345 struct AANoCaptureCallSiteReturned final : AANoCaptureImpl {
5346   AANoCaptureCallSiteReturned(const IRPosition &IRP, Attributor &A)
5347       : AANoCaptureImpl(IRP, A) {}
5348 
5349   /// See AbstractAttribute::initialize(...).
5350   void initialize(Attributor &A) override {
5351     const Function *F = getAnchorScope();
5352     // Check what state the associated function can actually capture.
5353     determineFunctionCaptureCapabilities(getIRPosition(), *F, *this);
5354   }
5355 
5356   /// See AbstractAttribute::trackStatistics()
5357   void trackStatistics() const override {
5358     STATS_DECLTRACK_CSRET_ATTR(nocapture)
5359   }
5360 };
5361 } // namespace
5362 
5363 /// ------------------ Value Simplify Attribute ----------------------------
5364 
5365 bool ValueSimplifyStateType::unionAssumed(Optional<Value *> Other) {
5366   // FIXME: Add a typecast support.
5367   SimplifiedAssociatedValue = AA::combineOptionalValuesInAAValueLatice(
5368       SimplifiedAssociatedValue, Other, Ty);
5369   if (SimplifiedAssociatedValue == Optional<Value *>(nullptr))
5370     return false;
5371 
5372   LLVM_DEBUG({
5373     if (SimplifiedAssociatedValue.hasValue())
5374       dbgs() << "[ValueSimplify] is assumed to be "
5375              << **SimplifiedAssociatedValue << "\n";
5376     else
5377       dbgs() << "[ValueSimplify] is assumed to be <none>\n";
5378   });
5379   return true;
5380 }
5381 
5382 namespace {
5383 struct AAValueSimplifyImpl : AAValueSimplify {
5384   AAValueSimplifyImpl(const IRPosition &IRP, Attributor &A)
5385       : AAValueSimplify(IRP, A) {}
5386 
5387   /// See AbstractAttribute::initialize(...).
5388   void initialize(Attributor &A) override {
5389     if (getAssociatedValue().getType()->isVoidTy())
5390       indicatePessimisticFixpoint();
5391     if (A.hasSimplificationCallback(getIRPosition()))
5392       indicatePessimisticFixpoint();
5393   }
5394 
5395   /// See AbstractAttribute::getAsStr().
5396   const std::string getAsStr() const override {
5397     LLVM_DEBUG({
5398       errs() << "SAV: " << (bool)SimplifiedAssociatedValue << " ";
5399       if (SimplifiedAssociatedValue && *SimplifiedAssociatedValue)
5400         errs() << "SAV: " << **SimplifiedAssociatedValue << " ";
5401     });
5402     return isValidState() ? (isAtFixpoint() ? "simplified" : "maybe-simple")
5403                           : "not-simple";
5404   }
5405 
5406   /// See AbstractAttribute::trackStatistics()
5407   void trackStatistics() const override {}
5408 
5409   /// See AAValueSimplify::getAssumedSimplifiedValue()
5410   Optional<Value *> getAssumedSimplifiedValue(Attributor &A) const override {
5411     return SimplifiedAssociatedValue;
5412   }
5413 
5414   /// Ensure the return value is \p V with type \p Ty, if not possible return
5415   /// nullptr. If \p Check is true we will only verify such an operation would
5416   /// suceed and return a non-nullptr value if that is the case. No IR is
5417   /// generated or modified.
5418   static Value *ensureType(Attributor &A, Value &V, Type &Ty, Instruction *CtxI,
5419                            bool Check) {
5420     if (auto *TypedV = AA::getWithType(V, Ty))
5421       return TypedV;
5422     if (CtxI && V.getType()->canLosslesslyBitCastTo(&Ty))
5423       return Check ? &V
5424                    : BitCastInst::CreatePointerBitCastOrAddrSpaceCast(&V, &Ty,
5425                                                                       "", CtxI);
5426     return nullptr;
5427   }
5428 
5429   /// Reproduce \p I with type \p Ty or return nullptr if that is not posisble.
5430   /// If \p Check is true we will only verify such an operation would suceed and
5431   /// return a non-nullptr value if that is the case. No IR is generated or
5432   /// modified.
5433   static Value *reproduceInst(Attributor &A,
5434                               const AbstractAttribute &QueryingAA,
5435                               Instruction &I, Type &Ty, Instruction *CtxI,
5436                               bool Check, ValueToValueMapTy &VMap) {
5437     assert(CtxI && "Cannot reproduce an instruction without context!");
5438     if (Check && (I.mayReadFromMemory() ||
5439                   !isSafeToSpeculativelyExecute(&I, CtxI, /* DT */ nullptr,
5440                                                 /* TLI */ nullptr)))
5441       return nullptr;
5442     for (Value *Op : I.operands()) {
5443       Value *NewOp = reproduceValue(A, QueryingAA, *Op, Ty, CtxI, Check, VMap);
5444       if (!NewOp) {
5445         assert(Check && "Manifest of new value unexpectedly failed!");
5446         return nullptr;
5447       }
5448       if (!Check)
5449         VMap[Op] = NewOp;
5450     }
5451     if (Check)
5452       return &I;
5453 
5454     Instruction *CloneI = I.clone();
5455     VMap[&I] = CloneI;
5456     CloneI->insertBefore(CtxI);
5457     RemapInstruction(CloneI, VMap);
5458     return CloneI;
5459   }
5460 
5461   /// Reproduce \p V with type \p Ty or return nullptr if that is not posisble.
5462   /// If \p Check is true we will only verify such an operation would suceed and
5463   /// return a non-nullptr value if that is the case. No IR is generated or
5464   /// modified.
5465   static Value *reproduceValue(Attributor &A,
5466                                const AbstractAttribute &QueryingAA, Value &V,
5467                                Type &Ty, Instruction *CtxI, bool Check,
5468                                ValueToValueMapTy &VMap) {
5469     if (const auto &NewV = VMap.lookup(&V))
5470       return NewV;
5471     bool UsedAssumedInformation = false;
5472     Optional<Value *> SimpleV =
5473         A.getAssumedSimplified(V, QueryingAA, UsedAssumedInformation);
5474     if (!SimpleV.hasValue())
5475       return PoisonValue::get(&Ty);
5476     Value *EffectiveV = &V;
5477     if (SimpleV.getValue())
5478       EffectiveV = SimpleV.getValue();
5479     if (auto *C = dyn_cast<Constant>(EffectiveV))
5480       if (!C->canTrap())
5481         return C;
5482     if (CtxI && AA::isValidAtPosition(*EffectiveV, *CtxI, A.getInfoCache()))
5483       return ensureType(A, *EffectiveV, Ty, CtxI, Check);
5484     if (auto *I = dyn_cast<Instruction>(EffectiveV))
5485       if (Value *NewV = reproduceInst(A, QueryingAA, *I, Ty, CtxI, Check, VMap))
5486         return ensureType(A, *NewV, Ty, CtxI, Check);
5487     return nullptr;
5488   }
5489 
5490   /// Return a value we can use as replacement for the associated one, or
5491   /// nullptr if we don't have one that makes sense.
5492   Value *manifestReplacementValue(Attributor &A, Instruction *CtxI) const {
5493     Value *NewV = SimplifiedAssociatedValue.hasValue()
5494                       ? SimplifiedAssociatedValue.getValue()
5495                       : UndefValue::get(getAssociatedType());
5496     if (NewV && NewV != &getAssociatedValue()) {
5497       ValueToValueMapTy VMap;
5498       // First verify we can reprduce the value with the required type at the
5499       // context location before we actually start modifying the IR.
5500       if (reproduceValue(A, *this, *NewV, *getAssociatedType(), CtxI,
5501                          /* CheckOnly */ true, VMap))
5502         return reproduceValue(A, *this, *NewV, *getAssociatedType(), CtxI,
5503                               /* CheckOnly */ false, VMap);
5504     }
5505     return nullptr;
5506   }
5507 
5508   /// Helper function for querying AAValueSimplify and updating candicate.
5509   /// \param IRP The value position we are trying to unify with SimplifiedValue
5510   bool checkAndUpdate(Attributor &A, const AbstractAttribute &QueryingAA,
5511                       const IRPosition &IRP, bool Simplify = true) {
5512     bool UsedAssumedInformation = false;
5513     Optional<Value *> QueryingValueSimplified = &IRP.getAssociatedValue();
5514     if (Simplify)
5515       QueryingValueSimplified =
5516           A.getAssumedSimplified(IRP, QueryingAA, UsedAssumedInformation);
5517     return unionAssumed(QueryingValueSimplified);
5518   }
5519 
5520   /// Returns a candidate is found or not
5521   template <typename AAType> bool askSimplifiedValueFor(Attributor &A) {
5522     if (!getAssociatedValue().getType()->isIntegerTy())
5523       return false;
5524 
5525     // This will also pass the call base context.
5526     const auto &AA =
5527         A.getAAFor<AAType>(*this, getIRPosition(), DepClassTy::NONE);
5528 
5529     Optional<ConstantInt *> COpt = AA.getAssumedConstantInt(A);
5530 
5531     if (!COpt.hasValue()) {
5532       SimplifiedAssociatedValue = llvm::None;
5533       A.recordDependence(AA, *this, DepClassTy::OPTIONAL);
5534       return true;
5535     }
5536     if (auto *C = COpt.getValue()) {
5537       SimplifiedAssociatedValue = C;
5538       A.recordDependence(AA, *this, DepClassTy::OPTIONAL);
5539       return true;
5540     }
5541     return false;
5542   }
5543 
5544   bool askSimplifiedValueForOtherAAs(Attributor &A) {
5545     if (askSimplifiedValueFor<AAValueConstantRange>(A))
5546       return true;
5547     if (askSimplifiedValueFor<AAPotentialConstantValues>(A))
5548       return true;
5549     return false;
5550   }
5551 
5552   /// See AbstractAttribute::manifest(...).
5553   ChangeStatus manifest(Attributor &A) override {
5554     ChangeStatus Changed = ChangeStatus::UNCHANGED;
5555     for (auto &U : getAssociatedValue().uses()) {
5556       // Check if we need to adjust the insertion point to make sure the IR is
5557       // valid.
5558       Instruction *IP = dyn_cast<Instruction>(U.getUser());
5559       if (auto *PHI = dyn_cast_or_null<PHINode>(IP))
5560         IP = PHI->getIncomingBlock(U)->getTerminator();
5561       if (auto *NewV = manifestReplacementValue(A, IP)) {
5562         LLVM_DEBUG(dbgs() << "[ValueSimplify] " << getAssociatedValue()
5563                           << " -> " << *NewV << " :: " << *this << "\n");
5564         if (A.changeUseAfterManifest(U, *NewV))
5565           Changed = ChangeStatus::CHANGED;
5566       }
5567     }
5568 
5569     return Changed | AAValueSimplify::manifest(A);
5570   }
5571 
5572   /// See AbstractState::indicatePessimisticFixpoint(...).
5573   ChangeStatus indicatePessimisticFixpoint() override {
5574     SimplifiedAssociatedValue = &getAssociatedValue();
5575     return AAValueSimplify::indicatePessimisticFixpoint();
5576   }
5577 };
5578 
5579 struct AAValueSimplifyArgument final : AAValueSimplifyImpl {
5580   AAValueSimplifyArgument(const IRPosition &IRP, Attributor &A)
5581       : AAValueSimplifyImpl(IRP, A) {}
5582 
5583   void initialize(Attributor &A) override {
5584     AAValueSimplifyImpl::initialize(A);
5585     if (!getAnchorScope() || getAnchorScope()->isDeclaration())
5586       indicatePessimisticFixpoint();
5587     if (hasAttr({Attribute::InAlloca, Attribute::Preallocated,
5588                  Attribute::StructRet, Attribute::Nest, Attribute::ByVal},
5589                 /* IgnoreSubsumingPositions */ true))
5590       indicatePessimisticFixpoint();
5591   }
5592 
5593   /// See AbstractAttribute::updateImpl(...).
5594   ChangeStatus updateImpl(Attributor &A) override {
5595     // Byval is only replacable if it is readonly otherwise we would write into
5596     // the replaced value and not the copy that byval creates implicitly.
5597     Argument *Arg = getAssociatedArgument();
5598     if (Arg->hasByValAttr()) {
5599       // TODO: We probably need to verify synchronization is not an issue, e.g.,
5600       //       there is no race by not copying a constant byval.
5601       bool IsKnown;
5602       if (!AA::isAssumedReadOnly(A, getIRPosition(), *this, IsKnown))
5603         return indicatePessimisticFixpoint();
5604     }
5605 
5606     auto Before = SimplifiedAssociatedValue;
5607 
5608     auto PredForCallSite = [&](AbstractCallSite ACS) {
5609       const IRPosition &ACSArgPos =
5610           IRPosition::callsite_argument(ACS, getCallSiteArgNo());
5611       // Check if a coresponding argument was found or if it is on not
5612       // associated (which can happen for callback calls).
5613       if (ACSArgPos.getPositionKind() == IRPosition::IRP_INVALID)
5614         return false;
5615 
5616       // Simplify the argument operand explicitly and check if the result is
5617       // valid in the current scope. This avoids refering to simplified values
5618       // in other functions, e.g., we don't want to say a an argument in a
5619       // static function is actually an argument in a different function.
5620       bool UsedAssumedInformation = false;
5621       Optional<Constant *> SimpleArgOp =
5622           A.getAssumedConstant(ACSArgPos, *this, UsedAssumedInformation);
5623       if (!SimpleArgOp.hasValue())
5624         return true;
5625       if (!SimpleArgOp.getValue())
5626         return false;
5627       if (!AA::isDynamicallyUnique(A, *this, **SimpleArgOp))
5628         return false;
5629       return unionAssumed(*SimpleArgOp);
5630     };
5631 
5632     // Generate a answer specific to a call site context.
5633     bool Success;
5634     bool UsedAssumedInformation = false;
5635     if (hasCallBaseContext() &&
5636         getCallBaseContext()->getCalledFunction() == Arg->getParent())
5637       Success = PredForCallSite(
5638           AbstractCallSite(&getCallBaseContext()->getCalledOperandUse()));
5639     else
5640       Success = A.checkForAllCallSites(PredForCallSite, *this, true,
5641                                        UsedAssumedInformation);
5642 
5643     if (!Success)
5644       if (!askSimplifiedValueForOtherAAs(A))
5645         return indicatePessimisticFixpoint();
5646 
5647     // If a candicate was found in this update, return CHANGED.
5648     return Before == SimplifiedAssociatedValue ? ChangeStatus::UNCHANGED
5649                                                : ChangeStatus ::CHANGED;
5650   }
5651 
5652   /// See AbstractAttribute::trackStatistics()
5653   void trackStatistics() const override {
5654     STATS_DECLTRACK_ARG_ATTR(value_simplify)
5655   }
5656 };
5657 
5658 struct AAValueSimplifyReturned : AAValueSimplifyImpl {
5659   AAValueSimplifyReturned(const IRPosition &IRP, Attributor &A)
5660       : AAValueSimplifyImpl(IRP, A) {}
5661 
5662   /// See AAValueSimplify::getAssumedSimplifiedValue()
5663   Optional<Value *> getAssumedSimplifiedValue(Attributor &A) const override {
5664     if (!isValidState())
5665       return nullptr;
5666     return SimplifiedAssociatedValue;
5667   }
5668 
5669   /// See AbstractAttribute::updateImpl(...).
5670   ChangeStatus updateImpl(Attributor &A) override {
5671     auto Before = SimplifiedAssociatedValue;
5672 
5673     auto ReturnInstCB = [&](Instruction &I) {
5674       auto &RI = cast<ReturnInst>(I);
5675       return checkAndUpdate(
5676           A, *this,
5677           IRPosition::value(*RI.getReturnValue(), getCallBaseContext()));
5678     };
5679 
5680     bool UsedAssumedInformation = false;
5681     if (!A.checkForAllInstructions(ReturnInstCB, *this, {Instruction::Ret},
5682                                    UsedAssumedInformation))
5683       if (!askSimplifiedValueForOtherAAs(A))
5684         return indicatePessimisticFixpoint();
5685 
5686     // If a candicate was found in this update, return CHANGED.
5687     return Before == SimplifiedAssociatedValue ? ChangeStatus::UNCHANGED
5688                                                : ChangeStatus ::CHANGED;
5689   }
5690 
5691   ChangeStatus manifest(Attributor &A) override {
5692     // We queried AAValueSimplify for the returned values so they will be
5693     // replaced if a simplified form was found. Nothing to do here.
5694     return ChangeStatus::UNCHANGED;
5695   }
5696 
5697   /// See AbstractAttribute::trackStatistics()
5698   void trackStatistics() const override {
5699     STATS_DECLTRACK_FNRET_ATTR(value_simplify)
5700   }
5701 };
5702 
5703 struct AAValueSimplifyFloating : AAValueSimplifyImpl {
5704   AAValueSimplifyFloating(const IRPosition &IRP, Attributor &A)
5705       : AAValueSimplifyImpl(IRP, A) {}
5706 
5707   /// See AbstractAttribute::initialize(...).
5708   void initialize(Attributor &A) override {
5709     AAValueSimplifyImpl::initialize(A);
5710     Value &V = getAnchorValue();
5711 
5712     // TODO: add other stuffs
5713     if (isa<Constant>(V))
5714       indicatePessimisticFixpoint();
5715   }
5716 
5717   /// Check if \p Cmp is a comparison we can simplify.
5718   ///
5719   /// We handle multiple cases, one in which at least one operand is an
5720   /// (assumed) nullptr. If so, try to simplify it using AANonNull on the other
5721   /// operand. Return true if successful, in that case SimplifiedAssociatedValue
5722   /// will be updated.
5723   bool handleCmp(Attributor &A, CmpInst &Cmp) {
5724     auto Union = [&](Value &V) {
5725       SimplifiedAssociatedValue = AA::combineOptionalValuesInAAValueLatice(
5726           SimplifiedAssociatedValue, &V, V.getType());
5727       return SimplifiedAssociatedValue != Optional<Value *>(nullptr);
5728     };
5729 
5730     Value *LHS = Cmp.getOperand(0);
5731     Value *RHS = Cmp.getOperand(1);
5732 
5733     // Simplify the operands first.
5734     bool UsedAssumedInformation = false;
5735     const auto &SimplifiedLHS =
5736         A.getAssumedSimplified(IRPosition::value(*LHS, getCallBaseContext()),
5737                                *this, UsedAssumedInformation);
5738     if (!SimplifiedLHS.hasValue())
5739       return true;
5740     if (!SimplifiedLHS.getValue())
5741       return false;
5742     LHS = *SimplifiedLHS;
5743 
5744     const auto &SimplifiedRHS =
5745         A.getAssumedSimplified(IRPosition::value(*RHS, getCallBaseContext()),
5746                                *this, UsedAssumedInformation);
5747     if (!SimplifiedRHS.hasValue())
5748       return true;
5749     if (!SimplifiedRHS.getValue())
5750       return false;
5751     RHS = *SimplifiedRHS;
5752 
5753     LLVMContext &Ctx = Cmp.getContext();
5754     // Handle the trivial case first in which we don't even need to think about
5755     // null or non-null.
5756     if (LHS == RHS && (Cmp.isTrueWhenEqual() || Cmp.isFalseWhenEqual())) {
5757       Constant *NewVal =
5758           ConstantInt::get(Type::getInt1Ty(Ctx), Cmp.isTrueWhenEqual());
5759       if (!Union(*NewVal))
5760         return false;
5761       if (!UsedAssumedInformation)
5762         indicateOptimisticFixpoint();
5763       return true;
5764     }
5765 
5766     // From now on we only handle equalities (==, !=).
5767     ICmpInst *ICmp = dyn_cast<ICmpInst>(&Cmp);
5768     if (!ICmp || !ICmp->isEquality())
5769       return false;
5770 
5771     bool LHSIsNull = isa<ConstantPointerNull>(LHS);
5772     bool RHSIsNull = isa<ConstantPointerNull>(RHS);
5773     if (!LHSIsNull && !RHSIsNull)
5774       return false;
5775 
5776     // Left is the nullptr ==/!= non-nullptr case. We'll use AANonNull on the
5777     // non-nullptr operand and if we assume it's non-null we can conclude the
5778     // result of the comparison.
5779     assert((LHSIsNull || RHSIsNull) &&
5780            "Expected nullptr versus non-nullptr comparison at this point");
5781 
5782     // The index is the operand that we assume is not null.
5783     unsigned PtrIdx = LHSIsNull;
5784     auto &PtrNonNullAA = A.getAAFor<AANonNull>(
5785         *this, IRPosition::value(*ICmp->getOperand(PtrIdx)),
5786         DepClassTy::REQUIRED);
5787     if (!PtrNonNullAA.isAssumedNonNull())
5788       return false;
5789     UsedAssumedInformation |= !PtrNonNullAA.isKnownNonNull();
5790 
5791     // The new value depends on the predicate, true for != and false for ==.
5792     Constant *NewVal = ConstantInt::get(
5793         Type::getInt1Ty(Ctx), ICmp->getPredicate() == CmpInst::ICMP_NE);
5794     if (!Union(*NewVal))
5795       return false;
5796 
5797     if (!UsedAssumedInformation)
5798       indicateOptimisticFixpoint();
5799 
5800     return true;
5801   }
5802 
5803   /// Use the generic, non-optimistic InstSimplfy functionality if we managed to
5804   /// simplify any operand of the instruction \p I. Return true if successful,
5805   /// in that case SimplifiedAssociatedValue will be updated.
5806   bool handleGenericInst(Attributor &A, Instruction &I) {
5807     bool SomeSimplified = false;
5808     bool UsedAssumedInformation = false;
5809 
5810     SmallVector<Value *, 8> NewOps(I.getNumOperands());
5811     int Idx = 0;
5812     for (Value *Op : I.operands()) {
5813       const auto &SimplifiedOp =
5814           A.getAssumedSimplified(IRPosition::value(*Op, getCallBaseContext()),
5815                                  *this, UsedAssumedInformation);
5816       // If we are not sure about any operand we are not sure about the entire
5817       // instruction, we'll wait.
5818       if (!SimplifiedOp.hasValue())
5819         return true;
5820 
5821       if (SimplifiedOp.getValue())
5822         NewOps[Idx] = SimplifiedOp.getValue();
5823       else
5824         NewOps[Idx] = Op;
5825 
5826       SomeSimplified |= (NewOps[Idx] != Op);
5827       ++Idx;
5828     }
5829 
5830     // We won't bother with the InstSimplify interface if we didn't simplify any
5831     // operand ourselves.
5832     if (!SomeSimplified)
5833       return false;
5834 
5835     InformationCache &InfoCache = A.getInfoCache();
5836     Function *F = I.getFunction();
5837     const auto *DT =
5838         InfoCache.getAnalysisResultForFunction<DominatorTreeAnalysis>(*F);
5839     const auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(*F);
5840     auto *AC = InfoCache.getAnalysisResultForFunction<AssumptionAnalysis>(*F);
5841     OptimizationRemarkEmitter *ORE = nullptr;
5842 
5843     const DataLayout &DL = I.getModule()->getDataLayout();
5844     SimplifyQuery Q(DL, TLI, DT, AC, &I);
5845     if (Value *SimplifiedI =
5846             SimplifyInstructionWithOperands(&I, NewOps, Q, ORE)) {
5847       SimplifiedAssociatedValue = AA::combineOptionalValuesInAAValueLatice(
5848           SimplifiedAssociatedValue, SimplifiedI, I.getType());
5849       return SimplifiedAssociatedValue != Optional<Value *>(nullptr);
5850     }
5851     return false;
5852   }
5853 
5854   /// See AbstractAttribute::updateImpl(...).
5855   ChangeStatus updateImpl(Attributor &A) override {
5856     auto Before = SimplifiedAssociatedValue;
5857 
5858     // Do not simplify loads that are only used in llvm.assume if we cannot also
5859     // remove all stores that may feed into the load. The reason is that the
5860     // assume is probably worth something as long as the stores are around.
5861     if (auto *LI = dyn_cast<LoadInst>(&getAssociatedValue())) {
5862       InformationCache &InfoCache = A.getInfoCache();
5863       if (InfoCache.isOnlyUsedByAssume(*LI)) {
5864         SmallSetVector<Value *, 4> PotentialCopies;
5865         SmallSetVector<Instruction *, 4> PotentialValueOrigins;
5866         bool UsedAssumedInformation = false;
5867         if (AA::getPotentiallyLoadedValues(A, *LI, PotentialCopies,
5868                                            PotentialValueOrigins, *this,
5869                                            UsedAssumedInformation,
5870                                            /* OnlyExact */ true)) {
5871           if (!llvm::all_of(PotentialValueOrigins, [&](Instruction *I) {
5872                 if (!I)
5873                   return true;
5874                 if (auto *SI = dyn_cast<StoreInst>(I))
5875                   return A.isAssumedDead(SI->getOperandUse(0), this,
5876                                          /* LivenessAA */ nullptr,
5877                                          UsedAssumedInformation,
5878                                          /* CheckBBLivenessOnly */ false);
5879                 return A.isAssumedDead(*I, this, /* LivenessAA */ nullptr,
5880                                        UsedAssumedInformation,
5881                                        /* CheckBBLivenessOnly */ false);
5882               }))
5883             return indicatePessimisticFixpoint();
5884         }
5885       }
5886     }
5887 
5888     auto VisitValueCB = [&](Value &V, const Instruction *CtxI, bool &,
5889                             bool Stripped) -> bool {
5890       auto &AA = A.getAAFor<AAValueSimplify>(
5891           *this, IRPosition::value(V, getCallBaseContext()),
5892           DepClassTy::REQUIRED);
5893       if (!Stripped && this == &AA) {
5894 
5895         if (auto *I = dyn_cast<Instruction>(&V)) {
5896           if (auto *Cmp = dyn_cast<CmpInst>(&V))
5897             if (handleCmp(A, *Cmp))
5898               return true;
5899           if (handleGenericInst(A, *I))
5900             return true;
5901         }
5902         // TODO: Look the instruction and check recursively.
5903 
5904         LLVM_DEBUG(dbgs() << "[ValueSimplify] Can't be stripped more : " << V
5905                           << "\n");
5906         return false;
5907       }
5908       return checkAndUpdate(A, *this,
5909                             IRPosition::value(V, getCallBaseContext()));
5910     };
5911 
5912     bool Dummy = false;
5913     bool UsedAssumedInformation = false;
5914     if (!genericValueTraversal<bool>(A, getIRPosition(), *this, Dummy,
5915                                      VisitValueCB, getCtxI(),
5916                                      UsedAssumedInformation,
5917                                      /* UseValueSimplify */ false))
5918       if (!askSimplifiedValueForOtherAAs(A))
5919         return indicatePessimisticFixpoint();
5920 
5921     // If a candicate was found in this update, return CHANGED.
5922     return Before == SimplifiedAssociatedValue ? ChangeStatus::UNCHANGED
5923                                                : ChangeStatus ::CHANGED;
5924   }
5925 
5926   /// See AbstractAttribute::trackStatistics()
5927   void trackStatistics() const override {
5928     STATS_DECLTRACK_FLOATING_ATTR(value_simplify)
5929   }
5930 };
5931 
5932 struct AAValueSimplifyFunction : AAValueSimplifyImpl {
5933   AAValueSimplifyFunction(const IRPosition &IRP, Attributor &A)
5934       : AAValueSimplifyImpl(IRP, A) {}
5935 
5936   /// See AbstractAttribute::initialize(...).
5937   void initialize(Attributor &A) override {
5938     SimplifiedAssociatedValue = nullptr;
5939     indicateOptimisticFixpoint();
5940   }
5941   /// See AbstractAttribute::initialize(...).
5942   ChangeStatus updateImpl(Attributor &A) override {
5943     llvm_unreachable(
5944         "AAValueSimplify(Function|CallSite)::updateImpl will not be called");
5945   }
5946   /// See AbstractAttribute::trackStatistics()
5947   void trackStatistics() const override {
5948     STATS_DECLTRACK_FN_ATTR(value_simplify)
5949   }
5950 };
5951 
5952 struct AAValueSimplifyCallSite : AAValueSimplifyFunction {
5953   AAValueSimplifyCallSite(const IRPosition &IRP, Attributor &A)
5954       : AAValueSimplifyFunction(IRP, A) {}
5955   /// See AbstractAttribute::trackStatistics()
5956   void trackStatistics() const override {
5957     STATS_DECLTRACK_CS_ATTR(value_simplify)
5958   }
5959 };
5960 
5961 struct AAValueSimplifyCallSiteReturned : AAValueSimplifyImpl {
5962   AAValueSimplifyCallSiteReturned(const IRPosition &IRP, Attributor &A)
5963       : AAValueSimplifyImpl(IRP, A) {}
5964 
5965   void initialize(Attributor &A) override {
5966     AAValueSimplifyImpl::initialize(A);
5967     Function *Fn = getAssociatedFunction();
5968     if (!Fn) {
5969       indicatePessimisticFixpoint();
5970       return;
5971     }
5972     for (Argument &Arg : Fn->args()) {
5973       if (Arg.hasReturnedAttr()) {
5974         auto IRP = IRPosition::callsite_argument(*cast<CallBase>(getCtxI()),
5975                                                  Arg.getArgNo());
5976         if (IRP.getPositionKind() == IRPosition::IRP_CALL_SITE_ARGUMENT &&
5977             checkAndUpdate(A, *this, IRP))
5978           indicateOptimisticFixpoint();
5979         else
5980           indicatePessimisticFixpoint();
5981         return;
5982       }
5983     }
5984   }
5985 
5986   /// See AbstractAttribute::updateImpl(...).
5987   ChangeStatus updateImpl(Attributor &A) override {
5988     auto Before = SimplifiedAssociatedValue;
5989     auto &RetAA = A.getAAFor<AAReturnedValues>(
5990         *this, IRPosition::function(*getAssociatedFunction()),
5991         DepClassTy::REQUIRED);
5992     auto PredForReturned =
5993         [&](Value &RetVal, const SmallSetVector<ReturnInst *, 4> &RetInsts) {
5994           bool UsedAssumedInformation = false;
5995           Optional<Value *> CSRetVal = A.translateArgumentToCallSiteContent(
5996               &RetVal, *cast<CallBase>(getCtxI()), *this,
5997               UsedAssumedInformation);
5998           SimplifiedAssociatedValue = AA::combineOptionalValuesInAAValueLatice(
5999               SimplifiedAssociatedValue, CSRetVal, getAssociatedType());
6000           return SimplifiedAssociatedValue != Optional<Value *>(nullptr);
6001         };
6002     if (!RetAA.checkForAllReturnedValuesAndReturnInsts(PredForReturned))
6003       if (!askSimplifiedValueForOtherAAs(A))
6004         return indicatePessimisticFixpoint();
6005     return Before == SimplifiedAssociatedValue ? ChangeStatus::UNCHANGED
6006                                                : ChangeStatus ::CHANGED;
6007   }
6008 
6009   void trackStatistics() const override {
6010     STATS_DECLTRACK_CSRET_ATTR(value_simplify)
6011   }
6012 };
6013 
6014 struct AAValueSimplifyCallSiteArgument : AAValueSimplifyFloating {
6015   AAValueSimplifyCallSiteArgument(const IRPosition &IRP, Attributor &A)
6016       : AAValueSimplifyFloating(IRP, A) {}
6017 
6018   /// See AbstractAttribute::manifest(...).
6019   ChangeStatus manifest(Attributor &A) override {
6020     ChangeStatus Changed = ChangeStatus::UNCHANGED;
6021 
6022     if (auto *NewV = manifestReplacementValue(A, getCtxI())) {
6023       Use &U = cast<CallBase>(&getAnchorValue())
6024                    ->getArgOperandUse(getCallSiteArgNo());
6025       if (A.changeUseAfterManifest(U, *NewV))
6026         Changed = ChangeStatus::CHANGED;
6027     }
6028 
6029     return Changed | AAValueSimplify::manifest(A);
6030   }
6031 
6032   void trackStatistics() const override {
6033     STATS_DECLTRACK_CSARG_ATTR(value_simplify)
6034   }
6035 };
6036 } // namespace
6037 
6038 /// ----------------------- Heap-To-Stack Conversion ---------------------------
6039 namespace {
6040 struct AAHeapToStackFunction final : public AAHeapToStack {
6041 
6042   struct AllocationInfo {
6043     /// The call that allocates the memory.
6044     CallBase *const CB;
6045 
6046     /// The library function id for the allocation.
6047     LibFunc LibraryFunctionId = NotLibFunc;
6048 
6049     /// The status wrt. a rewrite.
6050     enum {
6051       STACK_DUE_TO_USE,
6052       STACK_DUE_TO_FREE,
6053       INVALID,
6054     } Status = STACK_DUE_TO_USE;
6055 
6056     /// Flag to indicate if we encountered a use that might free this allocation
6057     /// but which is not in the deallocation infos.
6058     bool HasPotentiallyFreeingUnknownUses = false;
6059 
6060     /// The set of free calls that use this allocation.
6061     SmallSetVector<CallBase *, 1> PotentialFreeCalls{};
6062   };
6063 
6064   struct DeallocationInfo {
6065     /// The call that deallocates the memory.
6066     CallBase *const CB;
6067 
6068     /// Flag to indicate if we don't know all objects this deallocation might
6069     /// free.
6070     bool MightFreeUnknownObjects = false;
6071 
6072     /// The set of allocation calls that are potentially freed.
6073     SmallSetVector<CallBase *, 1> PotentialAllocationCalls{};
6074   };
6075 
6076   AAHeapToStackFunction(const IRPosition &IRP, Attributor &A)
6077       : AAHeapToStack(IRP, A) {}
6078 
6079   ~AAHeapToStackFunction() {
6080     // Ensure we call the destructor so we release any memory allocated in the
6081     // sets.
6082     for (auto &It : AllocationInfos)
6083       It.second->~AllocationInfo();
6084     for (auto &It : DeallocationInfos)
6085       It.second->~DeallocationInfo();
6086   }
6087 
6088   void initialize(Attributor &A) override {
6089     AAHeapToStack::initialize(A);
6090 
6091     const Function *F = getAnchorScope();
6092     const auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(*F);
6093 
6094     auto AllocationIdentifierCB = [&](Instruction &I) {
6095       CallBase *CB = dyn_cast<CallBase>(&I);
6096       if (!CB)
6097         return true;
6098       if (isFreeCall(CB, TLI)) {
6099         DeallocationInfos[CB] = new (A.Allocator) DeallocationInfo{CB};
6100         return true;
6101       }
6102       // To do heap to stack, we need to know that the allocation itself is
6103       // removable once uses are rewritten, and that we can initialize the
6104       // alloca to the same pattern as the original allocation result.
6105       if (isAllocationFn(CB, TLI) && isAllocRemovable(CB, TLI)) {
6106         auto *I8Ty = Type::getInt8Ty(CB->getParent()->getContext());
6107         if (nullptr != getInitialValueOfAllocation(CB, TLI, I8Ty)) {
6108           AllocationInfo *AI = new (A.Allocator) AllocationInfo{CB};
6109           AllocationInfos[CB] = AI;
6110           if (TLI)
6111             TLI->getLibFunc(*CB, AI->LibraryFunctionId);
6112         }
6113       }
6114       return true;
6115     };
6116 
6117     bool UsedAssumedInformation = false;
6118     bool Success = A.checkForAllCallLikeInstructions(
6119         AllocationIdentifierCB, *this, UsedAssumedInformation,
6120         /* CheckBBLivenessOnly */ false,
6121         /* CheckPotentiallyDead */ true);
6122     (void)Success;
6123     assert(Success && "Did not expect the call base visit callback to fail!");
6124 
6125     Attributor::SimplifictionCallbackTy SCB =
6126         [](const IRPosition &, const AbstractAttribute *,
6127            bool &) -> Optional<Value *> { return nullptr; };
6128     for (const auto &It : AllocationInfos)
6129       A.registerSimplificationCallback(IRPosition::callsite_returned(*It.first),
6130                                        SCB);
6131     for (const auto &It : DeallocationInfos)
6132       A.registerSimplificationCallback(IRPosition::callsite_returned(*It.first),
6133                                        SCB);
6134   }
6135 
6136   const std::string getAsStr() const override {
6137     unsigned NumH2SMallocs = 0, NumInvalidMallocs = 0;
6138     for (const auto &It : AllocationInfos) {
6139       if (It.second->Status == AllocationInfo::INVALID)
6140         ++NumInvalidMallocs;
6141       else
6142         ++NumH2SMallocs;
6143     }
6144     return "[H2S] Mallocs Good/Bad: " + std::to_string(NumH2SMallocs) + "/" +
6145            std::to_string(NumInvalidMallocs);
6146   }
6147 
6148   /// See AbstractAttribute::trackStatistics().
6149   void trackStatistics() const override {
6150     STATS_DECL(
6151         MallocCalls, Function,
6152         "Number of malloc/calloc/aligned_alloc calls converted to allocas");
6153     for (auto &It : AllocationInfos)
6154       if (It.second->Status != AllocationInfo::INVALID)
6155         ++BUILD_STAT_NAME(MallocCalls, Function);
6156   }
6157 
6158   bool isAssumedHeapToStack(const CallBase &CB) const override {
6159     if (isValidState())
6160       if (AllocationInfo *AI =
6161               AllocationInfos.lookup(const_cast<CallBase *>(&CB)))
6162         return AI->Status != AllocationInfo::INVALID;
6163     return false;
6164   }
6165 
6166   bool isAssumedHeapToStackRemovedFree(CallBase &CB) const override {
6167     if (!isValidState())
6168       return false;
6169 
6170     for (auto &It : AllocationInfos) {
6171       AllocationInfo &AI = *It.second;
6172       if (AI.Status == AllocationInfo::INVALID)
6173         continue;
6174 
6175       if (AI.PotentialFreeCalls.count(&CB))
6176         return true;
6177     }
6178 
6179     return false;
6180   }
6181 
6182   ChangeStatus manifest(Attributor &A) override {
6183     assert(getState().isValidState() &&
6184            "Attempted to manifest an invalid state!");
6185 
6186     ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
6187     Function *F = getAnchorScope();
6188     const auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(*F);
6189 
6190     for (auto &It : AllocationInfos) {
6191       AllocationInfo &AI = *It.second;
6192       if (AI.Status == AllocationInfo::INVALID)
6193         continue;
6194 
6195       for (CallBase *FreeCall : AI.PotentialFreeCalls) {
6196         LLVM_DEBUG(dbgs() << "H2S: Removing free call: " << *FreeCall << "\n");
6197         A.deleteAfterManifest(*FreeCall);
6198         HasChanged = ChangeStatus::CHANGED;
6199       }
6200 
6201       LLVM_DEBUG(dbgs() << "H2S: Removing malloc-like call: " << *AI.CB
6202                         << "\n");
6203 
6204       auto Remark = [&](OptimizationRemark OR) {
6205         LibFunc IsAllocShared;
6206         if (TLI->getLibFunc(*AI.CB, IsAllocShared))
6207           if (IsAllocShared == LibFunc___kmpc_alloc_shared)
6208             return OR << "Moving globalized variable to the stack.";
6209         return OR << "Moving memory allocation from the heap to the stack.";
6210       };
6211       if (AI.LibraryFunctionId == LibFunc___kmpc_alloc_shared)
6212         A.emitRemark<OptimizationRemark>(AI.CB, "OMP110", Remark);
6213       else
6214         A.emitRemark<OptimizationRemark>(AI.CB, "HeapToStack", Remark);
6215 
6216       const DataLayout &DL = A.getInfoCache().getDL();
6217       Value *Size;
6218       Optional<APInt> SizeAPI = getSize(A, *this, AI);
6219       if (SizeAPI.hasValue()) {
6220         Size = ConstantInt::get(AI.CB->getContext(), *SizeAPI);
6221       } else {
6222         LLVMContext &Ctx = AI.CB->getContext();
6223         ObjectSizeOpts Opts;
6224         ObjectSizeOffsetEvaluator Eval(DL, TLI, Ctx, Opts);
6225         SizeOffsetEvalType SizeOffsetPair = Eval.compute(AI.CB);
6226         assert(SizeOffsetPair != ObjectSizeOffsetEvaluator::unknown() &&
6227                cast<ConstantInt>(SizeOffsetPair.second)->isZero());
6228         Size = SizeOffsetPair.first;
6229       }
6230 
6231       Align Alignment(1);
6232       if (MaybeAlign RetAlign = AI.CB->getRetAlign())
6233         Alignment = max(Alignment, RetAlign);
6234       if (Value *Align = getAllocAlignment(AI.CB, TLI)) {
6235         Optional<APInt> AlignmentAPI = getAPInt(A, *this, *Align);
6236         assert(AlignmentAPI.hasValue() &&
6237                "Expected an alignment during manifest!");
6238         Alignment =
6239             max(Alignment, MaybeAlign(AlignmentAPI.getValue().getZExtValue()));
6240       }
6241 
6242       // TODO: Hoist the alloca towards the function entry.
6243       unsigned AS = DL.getAllocaAddrSpace();
6244       Instruction *Alloca = new AllocaInst(Type::getInt8Ty(F->getContext()), AS,
6245                                            Size, Alignment, "", AI.CB);
6246 
6247       if (Alloca->getType() != AI.CB->getType())
6248         Alloca = BitCastInst::CreatePointerBitCastOrAddrSpaceCast(
6249             Alloca, AI.CB->getType(), "malloc_cast", AI.CB);
6250 
6251       auto *I8Ty = Type::getInt8Ty(F->getContext());
6252       auto *InitVal = getInitialValueOfAllocation(AI.CB, TLI, I8Ty);
6253       assert(InitVal &&
6254              "Must be able to materialize initial memory state of allocation");
6255 
6256       A.changeValueAfterManifest(*AI.CB, *Alloca);
6257 
6258       if (auto *II = dyn_cast<InvokeInst>(AI.CB)) {
6259         auto *NBB = II->getNormalDest();
6260         BranchInst::Create(NBB, AI.CB->getParent());
6261         A.deleteAfterManifest(*AI.CB);
6262       } else {
6263         A.deleteAfterManifest(*AI.CB);
6264       }
6265 
6266       // Initialize the alloca with the same value as used by the allocation
6267       // function.  We can skip undef as the initial value of an alloc is
6268       // undef, and the memset would simply end up being DSEd.
6269       if (!isa<UndefValue>(InitVal)) {
6270         IRBuilder<> Builder(Alloca->getNextNode());
6271         // TODO: Use alignment above if align!=1
6272         Builder.CreateMemSet(Alloca, InitVal, Size, None);
6273       }
6274       HasChanged = ChangeStatus::CHANGED;
6275     }
6276 
6277     return HasChanged;
6278   }
6279 
6280   Optional<APInt> getAPInt(Attributor &A, const AbstractAttribute &AA,
6281                            Value &V) {
6282     bool UsedAssumedInformation = false;
6283     Optional<Constant *> SimpleV =
6284         A.getAssumedConstant(V, AA, UsedAssumedInformation);
6285     if (!SimpleV.hasValue())
6286       return APInt(64, 0);
6287     if (auto *CI = dyn_cast_or_null<ConstantInt>(SimpleV.getValue()))
6288       return CI->getValue();
6289     return llvm::None;
6290   }
6291 
6292   Optional<APInt> getSize(Attributor &A, const AbstractAttribute &AA,
6293                           AllocationInfo &AI) {
6294     auto Mapper = [&](const Value *V) -> const Value * {
6295       bool UsedAssumedInformation = false;
6296       if (Optional<Constant *> SimpleV =
6297               A.getAssumedConstant(*V, AA, UsedAssumedInformation))
6298         if (*SimpleV)
6299           return *SimpleV;
6300       return V;
6301     };
6302 
6303     const Function *F = getAnchorScope();
6304     const auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(*F);
6305     return getAllocSize(AI.CB, TLI, Mapper);
6306   }
6307 
6308   /// Collection of all malloc-like calls in a function with associated
6309   /// information.
6310   MapVector<CallBase *, AllocationInfo *> AllocationInfos;
6311 
6312   /// Collection of all free-like calls in a function with associated
6313   /// information.
6314   MapVector<CallBase *, DeallocationInfo *> DeallocationInfos;
6315 
6316   ChangeStatus updateImpl(Attributor &A) override;
6317 };
6318 
6319 ChangeStatus AAHeapToStackFunction::updateImpl(Attributor &A) {
6320   ChangeStatus Changed = ChangeStatus::UNCHANGED;
6321   const Function *F = getAnchorScope();
6322   const auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(*F);
6323 
6324   const auto &LivenessAA =
6325       A.getAAFor<AAIsDead>(*this, IRPosition::function(*F), DepClassTy::NONE);
6326 
6327   MustBeExecutedContextExplorer &Explorer =
6328       A.getInfoCache().getMustBeExecutedContextExplorer();
6329 
6330   bool StackIsAccessibleByOtherThreads =
6331       A.getInfoCache().stackIsAccessibleByOtherThreads();
6332 
6333   // Flag to ensure we update our deallocation information at most once per
6334   // updateImpl call and only if we use the free check reasoning.
6335   bool HasUpdatedFrees = false;
6336 
6337   auto UpdateFrees = [&]() {
6338     HasUpdatedFrees = true;
6339 
6340     for (auto &It : DeallocationInfos) {
6341       DeallocationInfo &DI = *It.second;
6342       // For now we cannot use deallocations that have unknown inputs, skip
6343       // them.
6344       if (DI.MightFreeUnknownObjects)
6345         continue;
6346 
6347       // No need to analyze dead calls, ignore them instead.
6348       bool UsedAssumedInformation = false;
6349       if (A.isAssumedDead(*DI.CB, this, &LivenessAA, UsedAssumedInformation,
6350                           /* CheckBBLivenessOnly */ true))
6351         continue;
6352 
6353       // Use the optimistic version to get the freed objects, ignoring dead
6354       // branches etc.
6355       SmallVector<Value *, 8> Objects;
6356       if (!AA::getAssumedUnderlyingObjects(A, *DI.CB->getArgOperand(0), Objects,
6357                                            *this, DI.CB,
6358                                            UsedAssumedInformation)) {
6359         LLVM_DEBUG(
6360             dbgs()
6361             << "[H2S] Unexpected failure in getAssumedUnderlyingObjects!\n");
6362         DI.MightFreeUnknownObjects = true;
6363         continue;
6364       }
6365 
6366       // Check each object explicitly.
6367       for (auto *Obj : Objects) {
6368         // Free of null and undef can be ignored as no-ops (or UB in the latter
6369         // case).
6370         if (isa<ConstantPointerNull>(Obj) || isa<UndefValue>(Obj))
6371           continue;
6372 
6373         CallBase *ObjCB = dyn_cast<CallBase>(Obj);
6374         if (!ObjCB) {
6375           LLVM_DEBUG(dbgs()
6376                      << "[H2S] Free of a non-call object: " << *Obj << "\n");
6377           DI.MightFreeUnknownObjects = true;
6378           continue;
6379         }
6380 
6381         AllocationInfo *AI = AllocationInfos.lookup(ObjCB);
6382         if (!AI) {
6383           LLVM_DEBUG(dbgs() << "[H2S] Free of a non-allocation object: " << *Obj
6384                             << "\n");
6385           DI.MightFreeUnknownObjects = true;
6386           continue;
6387         }
6388 
6389         DI.PotentialAllocationCalls.insert(ObjCB);
6390       }
6391     }
6392   };
6393 
6394   auto FreeCheck = [&](AllocationInfo &AI) {
6395     // If the stack is not accessible by other threads, the "must-free" logic
6396     // doesn't apply as the pointer could be shared and needs to be places in
6397     // "shareable" memory.
6398     if (!StackIsAccessibleByOtherThreads) {
6399       auto &NoSyncAA =
6400           A.getAAFor<AANoSync>(*this, getIRPosition(), DepClassTy::OPTIONAL);
6401       if (!NoSyncAA.isAssumedNoSync()) {
6402         LLVM_DEBUG(
6403             dbgs() << "[H2S] found an escaping use, stack is not accessible by "
6404                       "other threads and function is not nosync:\n");
6405         return false;
6406       }
6407     }
6408     if (!HasUpdatedFrees)
6409       UpdateFrees();
6410 
6411     // TODO: Allow multi exit functions that have different free calls.
6412     if (AI.PotentialFreeCalls.size() != 1) {
6413       LLVM_DEBUG(dbgs() << "[H2S] did not find one free call but "
6414                         << AI.PotentialFreeCalls.size() << "\n");
6415       return false;
6416     }
6417     CallBase *UniqueFree = *AI.PotentialFreeCalls.begin();
6418     DeallocationInfo *DI = DeallocationInfos.lookup(UniqueFree);
6419     if (!DI) {
6420       LLVM_DEBUG(
6421           dbgs() << "[H2S] unique free call was not known as deallocation call "
6422                  << *UniqueFree << "\n");
6423       return false;
6424     }
6425     if (DI->MightFreeUnknownObjects) {
6426       LLVM_DEBUG(
6427           dbgs() << "[H2S] unique free call might free unknown allocations\n");
6428       return false;
6429     }
6430     if (DI->PotentialAllocationCalls.size() > 1) {
6431       LLVM_DEBUG(dbgs() << "[H2S] unique free call might free "
6432                         << DI->PotentialAllocationCalls.size()
6433                         << " different allocations\n");
6434       return false;
6435     }
6436     if (*DI->PotentialAllocationCalls.begin() != AI.CB) {
6437       LLVM_DEBUG(
6438           dbgs()
6439           << "[H2S] unique free call not known to free this allocation but "
6440           << **DI->PotentialAllocationCalls.begin() << "\n");
6441       return false;
6442     }
6443     Instruction *CtxI = isa<InvokeInst>(AI.CB) ? AI.CB : AI.CB->getNextNode();
6444     if (!Explorer.findInContextOf(UniqueFree, CtxI)) {
6445       LLVM_DEBUG(
6446           dbgs()
6447           << "[H2S] unique free call might not be executed with the allocation "
6448           << *UniqueFree << "\n");
6449       return false;
6450     }
6451     return true;
6452   };
6453 
6454   auto UsesCheck = [&](AllocationInfo &AI) {
6455     bool ValidUsesOnly = true;
6456 
6457     auto Pred = [&](const Use &U, bool &Follow) -> bool {
6458       Instruction *UserI = cast<Instruction>(U.getUser());
6459       if (isa<LoadInst>(UserI))
6460         return true;
6461       if (auto *SI = dyn_cast<StoreInst>(UserI)) {
6462         if (SI->getValueOperand() == U.get()) {
6463           LLVM_DEBUG(dbgs()
6464                      << "[H2S] escaping store to memory: " << *UserI << "\n");
6465           ValidUsesOnly = false;
6466         } else {
6467           // A store into the malloc'ed memory is fine.
6468         }
6469         return true;
6470       }
6471       if (auto *CB = dyn_cast<CallBase>(UserI)) {
6472         if (!CB->isArgOperand(&U) || CB->isLifetimeStartOrEnd())
6473           return true;
6474         if (DeallocationInfos.count(CB)) {
6475           AI.PotentialFreeCalls.insert(CB);
6476           return true;
6477         }
6478 
6479         unsigned ArgNo = CB->getArgOperandNo(&U);
6480 
6481         const auto &NoCaptureAA = A.getAAFor<AANoCapture>(
6482             *this, IRPosition::callsite_argument(*CB, ArgNo),
6483             DepClassTy::OPTIONAL);
6484 
6485         // If a call site argument use is nofree, we are fine.
6486         const auto &ArgNoFreeAA = A.getAAFor<AANoFree>(
6487             *this, IRPosition::callsite_argument(*CB, ArgNo),
6488             DepClassTy::OPTIONAL);
6489 
6490         bool MaybeCaptured = !NoCaptureAA.isAssumedNoCapture();
6491         bool MaybeFreed = !ArgNoFreeAA.isAssumedNoFree();
6492         if (MaybeCaptured ||
6493             (AI.LibraryFunctionId != LibFunc___kmpc_alloc_shared &&
6494              MaybeFreed)) {
6495           AI.HasPotentiallyFreeingUnknownUses |= MaybeFreed;
6496 
6497           // Emit a missed remark if this is missed OpenMP globalization.
6498           auto Remark = [&](OptimizationRemarkMissed ORM) {
6499             return ORM
6500                    << "Could not move globalized variable to the stack. "
6501                       "Variable is potentially captured in call. Mark "
6502                       "parameter as `__attribute__((noescape))` to override.";
6503           };
6504 
6505           if (ValidUsesOnly &&
6506               AI.LibraryFunctionId == LibFunc___kmpc_alloc_shared)
6507             A.emitRemark<OptimizationRemarkMissed>(CB, "OMP113", Remark);
6508 
6509           LLVM_DEBUG(dbgs() << "[H2S] Bad user: " << *UserI << "\n");
6510           ValidUsesOnly = false;
6511         }
6512         return true;
6513       }
6514 
6515       if (isa<GetElementPtrInst>(UserI) || isa<BitCastInst>(UserI) ||
6516           isa<PHINode>(UserI) || isa<SelectInst>(UserI)) {
6517         Follow = true;
6518         return true;
6519       }
6520       // Unknown user for which we can not track uses further (in a way that
6521       // makes sense).
6522       LLVM_DEBUG(dbgs() << "[H2S] Unknown user: " << *UserI << "\n");
6523       ValidUsesOnly = false;
6524       return true;
6525     };
6526     if (!A.checkForAllUses(Pred, *this, *AI.CB))
6527       return false;
6528     return ValidUsesOnly;
6529   };
6530 
6531   // The actual update starts here. We look at all allocations and depending on
6532   // their status perform the appropriate check(s).
6533   for (auto &It : AllocationInfos) {
6534     AllocationInfo &AI = *It.second;
6535     if (AI.Status == AllocationInfo::INVALID)
6536       continue;
6537 
6538     if (Value *Align = getAllocAlignment(AI.CB, TLI)) {
6539       Optional<APInt> APAlign = getAPInt(A, *this, *Align);
6540       if (!APAlign) {
6541         // Can't generate an alloca which respects the required alignment
6542         // on the allocation.
6543         LLVM_DEBUG(dbgs() << "[H2S] Unknown allocation alignment: " << *AI.CB
6544                           << "\n");
6545         AI.Status = AllocationInfo::INVALID;
6546         Changed = ChangeStatus::CHANGED;
6547         continue;
6548       } else {
6549         if (APAlign->ugt(llvm::Value::MaximumAlignment) ||
6550             !APAlign->isPowerOf2()) {
6551           LLVM_DEBUG(dbgs() << "[H2S] Invalid allocation alignment: " << APAlign
6552                             << "\n");
6553           AI.Status = AllocationInfo::INVALID;
6554           Changed = ChangeStatus::CHANGED;
6555           continue;
6556         }
6557       }
6558     }
6559 
6560     if (MaxHeapToStackSize != -1) {
6561       Optional<APInt> Size = getSize(A, *this, AI);
6562       if (!Size.hasValue() || Size.getValue().ugt(MaxHeapToStackSize)) {
6563         LLVM_DEBUG({
6564           if (!Size.hasValue())
6565             dbgs() << "[H2S] Unknown allocation size: " << *AI.CB << "\n";
6566           else
6567             dbgs() << "[H2S] Allocation size too large: " << *AI.CB << " vs. "
6568                    << MaxHeapToStackSize << "\n";
6569         });
6570 
6571         AI.Status = AllocationInfo::INVALID;
6572         Changed = ChangeStatus::CHANGED;
6573         continue;
6574       }
6575     }
6576 
6577     switch (AI.Status) {
6578     case AllocationInfo::STACK_DUE_TO_USE:
6579       if (UsesCheck(AI))
6580         continue;
6581       AI.Status = AllocationInfo::STACK_DUE_TO_FREE;
6582       LLVM_FALLTHROUGH;
6583     case AllocationInfo::STACK_DUE_TO_FREE:
6584       if (FreeCheck(AI))
6585         continue;
6586       AI.Status = AllocationInfo::INVALID;
6587       Changed = ChangeStatus::CHANGED;
6588       continue;
6589     case AllocationInfo::INVALID:
6590       llvm_unreachable("Invalid allocations should never reach this point!");
6591     };
6592   }
6593 
6594   return Changed;
6595 }
6596 } // namespace
6597 
6598 /// ----------------------- Privatizable Pointers ------------------------------
6599 namespace {
6600 struct AAPrivatizablePtrImpl : public AAPrivatizablePtr {
6601   AAPrivatizablePtrImpl(const IRPosition &IRP, Attributor &A)
6602       : AAPrivatizablePtr(IRP, A), PrivatizableType(llvm::None) {}
6603 
6604   ChangeStatus indicatePessimisticFixpoint() override {
6605     AAPrivatizablePtr::indicatePessimisticFixpoint();
6606     PrivatizableType = nullptr;
6607     return ChangeStatus::CHANGED;
6608   }
6609 
6610   /// Identify the type we can chose for a private copy of the underlying
6611   /// argument. None means it is not clear yet, nullptr means there is none.
6612   virtual Optional<Type *> identifyPrivatizableType(Attributor &A) = 0;
6613 
6614   /// Return a privatizable type that encloses both T0 and T1.
6615   /// TODO: This is merely a stub for now as we should manage a mapping as well.
6616   Optional<Type *> combineTypes(Optional<Type *> T0, Optional<Type *> T1) {
6617     if (!T0.hasValue())
6618       return T1;
6619     if (!T1.hasValue())
6620       return T0;
6621     if (T0 == T1)
6622       return T0;
6623     return nullptr;
6624   }
6625 
6626   Optional<Type *> getPrivatizableType() const override {
6627     return PrivatizableType;
6628   }
6629 
6630   const std::string getAsStr() const override {
6631     return isAssumedPrivatizablePtr() ? "[priv]" : "[no-priv]";
6632   }
6633 
6634 protected:
6635   Optional<Type *> PrivatizableType;
6636 };
6637 
6638 // TODO: Do this for call site arguments (probably also other values) as well.
6639 
6640 struct AAPrivatizablePtrArgument final : public AAPrivatizablePtrImpl {
6641   AAPrivatizablePtrArgument(const IRPosition &IRP, Attributor &A)
6642       : AAPrivatizablePtrImpl(IRP, A) {}
6643 
6644   /// See AAPrivatizablePtrImpl::identifyPrivatizableType(...)
6645   Optional<Type *> identifyPrivatizableType(Attributor &A) override {
6646     // If this is a byval argument and we know all the call sites (so we can
6647     // rewrite them), there is no need to check them explicitly.
6648     bool UsedAssumedInformation = false;
6649     SmallVector<Attribute, 1> Attrs;
6650     getAttrs({Attribute::ByVal}, Attrs, /* IgnoreSubsumingPositions */ true);
6651     if (!Attrs.empty() &&
6652         A.checkForAllCallSites([](AbstractCallSite ACS) { return true; }, *this,
6653                                true, UsedAssumedInformation))
6654       return Attrs[0].getValueAsType();
6655 
6656     Optional<Type *> Ty;
6657     unsigned ArgNo = getIRPosition().getCallSiteArgNo();
6658 
6659     // Make sure the associated call site argument has the same type at all call
6660     // sites and it is an allocation we know is safe to privatize, for now that
6661     // means we only allow alloca instructions.
6662     // TODO: We can additionally analyze the accesses in the callee to  create
6663     //       the type from that information instead. That is a little more
6664     //       involved and will be done in a follow up patch.
6665     auto CallSiteCheck = [&](AbstractCallSite ACS) {
6666       IRPosition ACSArgPos = IRPosition::callsite_argument(ACS, ArgNo);
6667       // Check if a coresponding argument was found or if it is one not
6668       // associated (which can happen for callback calls).
6669       if (ACSArgPos.getPositionKind() == IRPosition::IRP_INVALID)
6670         return false;
6671 
6672       // Check that all call sites agree on a type.
6673       auto &PrivCSArgAA =
6674           A.getAAFor<AAPrivatizablePtr>(*this, ACSArgPos, DepClassTy::REQUIRED);
6675       Optional<Type *> CSTy = PrivCSArgAA.getPrivatizableType();
6676 
6677       LLVM_DEBUG({
6678         dbgs() << "[AAPrivatizablePtr] ACSPos: " << ACSArgPos << ", CSTy: ";
6679         if (CSTy.hasValue() && CSTy.getValue())
6680           CSTy.getValue()->print(dbgs());
6681         else if (CSTy.hasValue())
6682           dbgs() << "<nullptr>";
6683         else
6684           dbgs() << "<none>";
6685       });
6686 
6687       Ty = combineTypes(Ty, CSTy);
6688 
6689       LLVM_DEBUG({
6690         dbgs() << " : New Type: ";
6691         if (Ty.hasValue() && Ty.getValue())
6692           Ty.getValue()->print(dbgs());
6693         else if (Ty.hasValue())
6694           dbgs() << "<nullptr>";
6695         else
6696           dbgs() << "<none>";
6697         dbgs() << "\n";
6698       });
6699 
6700       return !Ty.hasValue() || Ty.getValue();
6701     };
6702 
6703     if (!A.checkForAllCallSites(CallSiteCheck, *this, true,
6704                                 UsedAssumedInformation))
6705       return nullptr;
6706     return Ty;
6707   }
6708 
6709   /// See AbstractAttribute::updateImpl(...).
6710   ChangeStatus updateImpl(Attributor &A) override {
6711     PrivatizableType = identifyPrivatizableType(A);
6712     if (!PrivatizableType.hasValue())
6713       return ChangeStatus::UNCHANGED;
6714     if (!PrivatizableType.getValue())
6715       return indicatePessimisticFixpoint();
6716 
6717     // The dependence is optional so we don't give up once we give up on the
6718     // alignment.
6719     A.getAAFor<AAAlign>(*this, IRPosition::value(getAssociatedValue()),
6720                         DepClassTy::OPTIONAL);
6721 
6722     // Avoid arguments with padding for now.
6723     if (!getIRPosition().hasAttr(Attribute::ByVal) &&
6724         !ArgumentPromotionPass::isDenselyPacked(PrivatizableType.getValue(),
6725                                                 A.getInfoCache().getDL())) {
6726       LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] Padding detected\n");
6727       return indicatePessimisticFixpoint();
6728     }
6729 
6730     // Collect the types that will replace the privatizable type in the function
6731     // signature.
6732     SmallVector<Type *, 16> ReplacementTypes;
6733     identifyReplacementTypes(PrivatizableType.getValue(), ReplacementTypes);
6734 
6735     // Verify callee and caller agree on how the promoted argument would be
6736     // passed.
6737     Function &Fn = *getIRPosition().getAnchorScope();
6738     const auto *TTI =
6739         A.getInfoCache().getAnalysisResultForFunction<TargetIRAnalysis>(Fn);
6740     if (!TTI) {
6741       LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] Missing TTI for function "
6742                         << Fn.getName() << "\n");
6743       return indicatePessimisticFixpoint();
6744     }
6745 
6746     auto CallSiteCheck = [&](AbstractCallSite ACS) {
6747       CallBase *CB = ACS.getInstruction();
6748       return TTI->areTypesABICompatible(
6749           CB->getCaller(), CB->getCalledFunction(), ReplacementTypes);
6750     };
6751     bool UsedAssumedInformation = false;
6752     if (!A.checkForAllCallSites(CallSiteCheck, *this, true,
6753                                 UsedAssumedInformation)) {
6754       LLVM_DEBUG(
6755           dbgs() << "[AAPrivatizablePtr] ABI incompatibility detected for "
6756                  << Fn.getName() << "\n");
6757       return indicatePessimisticFixpoint();
6758     }
6759 
6760     // Register a rewrite of the argument.
6761     Argument *Arg = getAssociatedArgument();
6762     if (!A.isValidFunctionSignatureRewrite(*Arg, ReplacementTypes)) {
6763       LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] Rewrite not valid\n");
6764       return indicatePessimisticFixpoint();
6765     }
6766 
6767     unsigned ArgNo = Arg->getArgNo();
6768 
6769     // Helper to check if for the given call site the associated argument is
6770     // passed to a callback where the privatization would be different.
6771     auto IsCompatiblePrivArgOfCallback = [&](CallBase &CB) {
6772       SmallVector<const Use *, 4> CallbackUses;
6773       AbstractCallSite::getCallbackUses(CB, CallbackUses);
6774       for (const Use *U : CallbackUses) {
6775         AbstractCallSite CBACS(U);
6776         assert(CBACS && CBACS.isCallbackCall());
6777         for (Argument &CBArg : CBACS.getCalledFunction()->args()) {
6778           int CBArgNo = CBACS.getCallArgOperandNo(CBArg);
6779 
6780           LLVM_DEBUG({
6781             dbgs()
6782                 << "[AAPrivatizablePtr] Argument " << *Arg
6783                 << "check if can be privatized in the context of its parent ("
6784                 << Arg->getParent()->getName()
6785                 << ")\n[AAPrivatizablePtr] because it is an argument in a "
6786                    "callback ("
6787                 << CBArgNo << "@" << CBACS.getCalledFunction()->getName()
6788                 << ")\n[AAPrivatizablePtr] " << CBArg << " : "
6789                 << CBACS.getCallArgOperand(CBArg) << " vs "
6790                 << CB.getArgOperand(ArgNo) << "\n"
6791                 << "[AAPrivatizablePtr] " << CBArg << " : "
6792                 << CBACS.getCallArgOperandNo(CBArg) << " vs " << ArgNo << "\n";
6793           });
6794 
6795           if (CBArgNo != int(ArgNo))
6796             continue;
6797           const auto &CBArgPrivAA = A.getAAFor<AAPrivatizablePtr>(
6798               *this, IRPosition::argument(CBArg), DepClassTy::REQUIRED);
6799           if (CBArgPrivAA.isValidState()) {
6800             auto CBArgPrivTy = CBArgPrivAA.getPrivatizableType();
6801             if (!CBArgPrivTy.hasValue())
6802               continue;
6803             if (CBArgPrivTy.getValue() == PrivatizableType)
6804               continue;
6805           }
6806 
6807           LLVM_DEBUG({
6808             dbgs() << "[AAPrivatizablePtr] Argument " << *Arg
6809                    << " cannot be privatized in the context of its parent ("
6810                    << Arg->getParent()->getName()
6811                    << ")\n[AAPrivatizablePtr] because it is an argument in a "
6812                       "callback ("
6813                    << CBArgNo << "@" << CBACS.getCalledFunction()->getName()
6814                    << ").\n[AAPrivatizablePtr] for which the argument "
6815                       "privatization is not compatible.\n";
6816           });
6817           return false;
6818         }
6819       }
6820       return true;
6821     };
6822 
6823     // Helper to check if for the given call site the associated argument is
6824     // passed to a direct call where the privatization would be different.
6825     auto IsCompatiblePrivArgOfDirectCS = [&](AbstractCallSite ACS) {
6826       CallBase *DC = cast<CallBase>(ACS.getInstruction());
6827       int DCArgNo = ACS.getCallArgOperandNo(ArgNo);
6828       assert(DCArgNo >= 0 && unsigned(DCArgNo) < DC->arg_size() &&
6829              "Expected a direct call operand for callback call operand");
6830 
6831       LLVM_DEBUG({
6832         dbgs() << "[AAPrivatizablePtr] Argument " << *Arg
6833                << " check if be privatized in the context of its parent ("
6834                << Arg->getParent()->getName()
6835                << ")\n[AAPrivatizablePtr] because it is an argument in a "
6836                   "direct call of ("
6837                << DCArgNo << "@" << DC->getCalledFunction()->getName()
6838                << ").\n";
6839       });
6840 
6841       Function *DCCallee = DC->getCalledFunction();
6842       if (unsigned(DCArgNo) < DCCallee->arg_size()) {
6843         const auto &DCArgPrivAA = A.getAAFor<AAPrivatizablePtr>(
6844             *this, IRPosition::argument(*DCCallee->getArg(DCArgNo)),
6845             DepClassTy::REQUIRED);
6846         if (DCArgPrivAA.isValidState()) {
6847           auto DCArgPrivTy = DCArgPrivAA.getPrivatizableType();
6848           if (!DCArgPrivTy.hasValue())
6849             return true;
6850           if (DCArgPrivTy.getValue() == PrivatizableType)
6851             return true;
6852         }
6853       }
6854 
6855       LLVM_DEBUG({
6856         dbgs() << "[AAPrivatizablePtr] Argument " << *Arg
6857                << " cannot be privatized in the context of its parent ("
6858                << Arg->getParent()->getName()
6859                << ")\n[AAPrivatizablePtr] because it is an argument in a "
6860                   "direct call of ("
6861                << ACS.getInstruction()->getCalledFunction()->getName()
6862                << ").\n[AAPrivatizablePtr] for which the argument "
6863                   "privatization is not compatible.\n";
6864       });
6865       return false;
6866     };
6867 
6868     // Helper to check if the associated argument is used at the given abstract
6869     // call site in a way that is incompatible with the privatization assumed
6870     // here.
6871     auto IsCompatiblePrivArgOfOtherCallSite = [&](AbstractCallSite ACS) {
6872       if (ACS.isDirectCall())
6873         return IsCompatiblePrivArgOfCallback(*ACS.getInstruction());
6874       if (ACS.isCallbackCall())
6875         return IsCompatiblePrivArgOfDirectCS(ACS);
6876       return false;
6877     };
6878 
6879     if (!A.checkForAllCallSites(IsCompatiblePrivArgOfOtherCallSite, *this, true,
6880                                 UsedAssumedInformation))
6881       return indicatePessimisticFixpoint();
6882 
6883     return ChangeStatus::UNCHANGED;
6884   }
6885 
6886   /// Given a type to private \p PrivType, collect the constituates (which are
6887   /// used) in \p ReplacementTypes.
6888   static void
6889   identifyReplacementTypes(Type *PrivType,
6890                            SmallVectorImpl<Type *> &ReplacementTypes) {
6891     // TODO: For now we expand the privatization type to the fullest which can
6892     //       lead to dead arguments that need to be removed later.
6893     assert(PrivType && "Expected privatizable type!");
6894 
6895     // Traverse the type, extract constituate types on the outermost level.
6896     if (auto *PrivStructType = dyn_cast<StructType>(PrivType)) {
6897       for (unsigned u = 0, e = PrivStructType->getNumElements(); u < e; u++)
6898         ReplacementTypes.push_back(PrivStructType->getElementType(u));
6899     } else if (auto *PrivArrayType = dyn_cast<ArrayType>(PrivType)) {
6900       ReplacementTypes.append(PrivArrayType->getNumElements(),
6901                               PrivArrayType->getElementType());
6902     } else {
6903       ReplacementTypes.push_back(PrivType);
6904     }
6905   }
6906 
6907   /// Initialize \p Base according to the type \p PrivType at position \p IP.
6908   /// The values needed are taken from the arguments of \p F starting at
6909   /// position \p ArgNo.
6910   static void createInitialization(Type *PrivType, Value &Base, Function &F,
6911                                    unsigned ArgNo, Instruction &IP) {
6912     assert(PrivType && "Expected privatizable type!");
6913 
6914     IRBuilder<NoFolder> IRB(&IP);
6915     const DataLayout &DL = F.getParent()->getDataLayout();
6916 
6917     // Traverse the type, build GEPs and stores.
6918     if (auto *PrivStructType = dyn_cast<StructType>(PrivType)) {
6919       const StructLayout *PrivStructLayout = DL.getStructLayout(PrivStructType);
6920       for (unsigned u = 0, e = PrivStructType->getNumElements(); u < e; u++) {
6921         Type *PointeeTy = PrivStructType->getElementType(u)->getPointerTo();
6922         Value *Ptr =
6923             constructPointer(PointeeTy, PrivType, &Base,
6924                              PrivStructLayout->getElementOffset(u), IRB, DL);
6925         new StoreInst(F.getArg(ArgNo + u), Ptr, &IP);
6926       }
6927     } else if (auto *PrivArrayType = dyn_cast<ArrayType>(PrivType)) {
6928       Type *PointeeTy = PrivArrayType->getElementType();
6929       Type *PointeePtrTy = PointeeTy->getPointerTo();
6930       uint64_t PointeeTySize = DL.getTypeStoreSize(PointeeTy);
6931       for (unsigned u = 0, e = PrivArrayType->getNumElements(); u < e; u++) {
6932         Value *Ptr = constructPointer(PointeePtrTy, PrivType, &Base,
6933                                       u * PointeeTySize, IRB, DL);
6934         new StoreInst(F.getArg(ArgNo + u), Ptr, &IP);
6935       }
6936     } else {
6937       new StoreInst(F.getArg(ArgNo), &Base, &IP);
6938     }
6939   }
6940 
6941   /// Extract values from \p Base according to the type \p PrivType at the
6942   /// call position \p ACS. The values are appended to \p ReplacementValues.
6943   void createReplacementValues(Align Alignment, Type *PrivType,
6944                                AbstractCallSite ACS, Value *Base,
6945                                SmallVectorImpl<Value *> &ReplacementValues) {
6946     assert(Base && "Expected base value!");
6947     assert(PrivType && "Expected privatizable type!");
6948     Instruction *IP = ACS.getInstruction();
6949 
6950     IRBuilder<NoFolder> IRB(IP);
6951     const DataLayout &DL = IP->getModule()->getDataLayout();
6952 
6953     Type *PrivPtrType = PrivType->getPointerTo();
6954     if (Base->getType() != PrivPtrType)
6955       Base = BitCastInst::CreatePointerBitCastOrAddrSpaceCast(
6956           Base, PrivPtrType, "", ACS.getInstruction());
6957 
6958     // Traverse the type, build GEPs and loads.
6959     if (auto *PrivStructType = dyn_cast<StructType>(PrivType)) {
6960       const StructLayout *PrivStructLayout = DL.getStructLayout(PrivStructType);
6961       for (unsigned u = 0, e = PrivStructType->getNumElements(); u < e; u++) {
6962         Type *PointeeTy = PrivStructType->getElementType(u);
6963         Value *Ptr =
6964             constructPointer(PointeeTy->getPointerTo(), PrivType, Base,
6965                              PrivStructLayout->getElementOffset(u), IRB, DL);
6966         LoadInst *L = new LoadInst(PointeeTy, Ptr, "", IP);
6967         L->setAlignment(Alignment);
6968         ReplacementValues.push_back(L);
6969       }
6970     } else if (auto *PrivArrayType = dyn_cast<ArrayType>(PrivType)) {
6971       Type *PointeeTy = PrivArrayType->getElementType();
6972       uint64_t PointeeTySize = DL.getTypeStoreSize(PointeeTy);
6973       Type *PointeePtrTy = PointeeTy->getPointerTo();
6974       for (unsigned u = 0, e = PrivArrayType->getNumElements(); u < e; u++) {
6975         Value *Ptr = constructPointer(PointeePtrTy, PrivType, Base,
6976                                       u * PointeeTySize, IRB, DL);
6977         LoadInst *L = new LoadInst(PointeeTy, Ptr, "", IP);
6978         L->setAlignment(Alignment);
6979         ReplacementValues.push_back(L);
6980       }
6981     } else {
6982       LoadInst *L = new LoadInst(PrivType, Base, "", IP);
6983       L->setAlignment(Alignment);
6984       ReplacementValues.push_back(L);
6985     }
6986   }
6987 
6988   /// See AbstractAttribute::manifest(...)
6989   ChangeStatus manifest(Attributor &A) override {
6990     if (!PrivatizableType.hasValue())
6991       return ChangeStatus::UNCHANGED;
6992     assert(PrivatizableType.getValue() && "Expected privatizable type!");
6993 
6994     // Collect all tail calls in the function as we cannot allow new allocas to
6995     // escape into tail recursion.
6996     // TODO: Be smarter about new allocas escaping into tail calls.
6997     SmallVector<CallInst *, 16> TailCalls;
6998     bool UsedAssumedInformation = false;
6999     if (!A.checkForAllInstructions(
7000             [&](Instruction &I) {
7001               CallInst &CI = cast<CallInst>(I);
7002               if (CI.isTailCall())
7003                 TailCalls.push_back(&CI);
7004               return true;
7005             },
7006             *this, {Instruction::Call}, UsedAssumedInformation))
7007       return ChangeStatus::UNCHANGED;
7008 
7009     Argument *Arg = getAssociatedArgument();
7010     // Query AAAlign attribute for alignment of associated argument to
7011     // determine the best alignment of loads.
7012     const auto &AlignAA =
7013         A.getAAFor<AAAlign>(*this, IRPosition::value(*Arg), DepClassTy::NONE);
7014 
7015     // Callback to repair the associated function. A new alloca is placed at the
7016     // beginning and initialized with the values passed through arguments. The
7017     // new alloca replaces the use of the old pointer argument.
7018     Attributor::ArgumentReplacementInfo::CalleeRepairCBTy FnRepairCB =
7019         [=](const Attributor::ArgumentReplacementInfo &ARI,
7020             Function &ReplacementFn, Function::arg_iterator ArgIt) {
7021           BasicBlock &EntryBB = ReplacementFn.getEntryBlock();
7022           Instruction *IP = &*EntryBB.getFirstInsertionPt();
7023           const DataLayout &DL = IP->getModule()->getDataLayout();
7024           unsigned AS = DL.getAllocaAddrSpace();
7025           Instruction *AI = new AllocaInst(PrivatizableType.getValue(), AS,
7026                                            Arg->getName() + ".priv", IP);
7027           createInitialization(PrivatizableType.getValue(), *AI, ReplacementFn,
7028                                ArgIt->getArgNo(), *IP);
7029 
7030           if (AI->getType() != Arg->getType())
7031             AI = BitCastInst::CreatePointerBitCastOrAddrSpaceCast(
7032                 AI, Arg->getType(), "", IP);
7033           Arg->replaceAllUsesWith(AI);
7034 
7035           for (CallInst *CI : TailCalls)
7036             CI->setTailCall(false);
7037         };
7038 
7039     // Callback to repair a call site of the associated function. The elements
7040     // of the privatizable type are loaded prior to the call and passed to the
7041     // new function version.
7042     Attributor::ArgumentReplacementInfo::ACSRepairCBTy ACSRepairCB =
7043         [=, &AlignAA](const Attributor::ArgumentReplacementInfo &ARI,
7044                       AbstractCallSite ACS,
7045                       SmallVectorImpl<Value *> &NewArgOperands) {
7046           // When no alignment is specified for the load instruction,
7047           // natural alignment is assumed.
7048           createReplacementValues(
7049               assumeAligned(AlignAA.getAssumedAlign()),
7050               PrivatizableType.getValue(), ACS,
7051               ACS.getCallArgOperand(ARI.getReplacedArg().getArgNo()),
7052               NewArgOperands);
7053         };
7054 
7055     // Collect the types that will replace the privatizable type in the function
7056     // signature.
7057     SmallVector<Type *, 16> ReplacementTypes;
7058     identifyReplacementTypes(PrivatizableType.getValue(), ReplacementTypes);
7059 
7060     // Register a rewrite of the argument.
7061     if (A.registerFunctionSignatureRewrite(*Arg, ReplacementTypes,
7062                                            std::move(FnRepairCB),
7063                                            std::move(ACSRepairCB)))
7064       return ChangeStatus::CHANGED;
7065     return ChangeStatus::UNCHANGED;
7066   }
7067 
7068   /// See AbstractAttribute::trackStatistics()
7069   void trackStatistics() const override {
7070     STATS_DECLTRACK_ARG_ATTR(privatizable_ptr);
7071   }
7072 };
7073 
7074 struct AAPrivatizablePtrFloating : public AAPrivatizablePtrImpl {
7075   AAPrivatizablePtrFloating(const IRPosition &IRP, Attributor &A)
7076       : AAPrivatizablePtrImpl(IRP, A) {}
7077 
7078   /// See AbstractAttribute::initialize(...).
7079   virtual void initialize(Attributor &A) override {
7080     // TODO: We can privatize more than arguments.
7081     indicatePessimisticFixpoint();
7082   }
7083 
7084   ChangeStatus updateImpl(Attributor &A) override {
7085     llvm_unreachable("AAPrivatizablePtr(Floating|Returned|CallSiteReturned)::"
7086                      "updateImpl will not be called");
7087   }
7088 
7089   /// See AAPrivatizablePtrImpl::identifyPrivatizableType(...)
7090   Optional<Type *> identifyPrivatizableType(Attributor &A) override {
7091     Value *Obj = getUnderlyingObject(&getAssociatedValue());
7092     if (!Obj) {
7093       LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] No underlying object found!\n");
7094       return nullptr;
7095     }
7096 
7097     if (auto *AI = dyn_cast<AllocaInst>(Obj))
7098       if (auto *CI = dyn_cast<ConstantInt>(AI->getArraySize()))
7099         if (CI->isOne())
7100           return AI->getAllocatedType();
7101     if (auto *Arg = dyn_cast<Argument>(Obj)) {
7102       auto &PrivArgAA = A.getAAFor<AAPrivatizablePtr>(
7103           *this, IRPosition::argument(*Arg), DepClassTy::REQUIRED);
7104       if (PrivArgAA.isAssumedPrivatizablePtr())
7105         return PrivArgAA.getPrivatizableType();
7106     }
7107 
7108     LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] Underlying object neither valid "
7109                          "alloca nor privatizable argument: "
7110                       << *Obj << "!\n");
7111     return nullptr;
7112   }
7113 
7114   /// See AbstractAttribute::trackStatistics()
7115   void trackStatistics() const override {
7116     STATS_DECLTRACK_FLOATING_ATTR(privatizable_ptr);
7117   }
7118 };
7119 
7120 struct AAPrivatizablePtrCallSiteArgument final
7121     : public AAPrivatizablePtrFloating {
7122   AAPrivatizablePtrCallSiteArgument(const IRPosition &IRP, Attributor &A)
7123       : AAPrivatizablePtrFloating(IRP, A) {}
7124 
7125   /// See AbstractAttribute::initialize(...).
7126   void initialize(Attributor &A) override {
7127     if (getIRPosition().hasAttr(Attribute::ByVal))
7128       indicateOptimisticFixpoint();
7129   }
7130 
7131   /// See AbstractAttribute::updateImpl(...).
7132   ChangeStatus updateImpl(Attributor &A) override {
7133     PrivatizableType = identifyPrivatizableType(A);
7134     if (!PrivatizableType.hasValue())
7135       return ChangeStatus::UNCHANGED;
7136     if (!PrivatizableType.getValue())
7137       return indicatePessimisticFixpoint();
7138 
7139     const IRPosition &IRP = getIRPosition();
7140     auto &NoCaptureAA =
7141         A.getAAFor<AANoCapture>(*this, IRP, DepClassTy::REQUIRED);
7142     if (!NoCaptureAA.isAssumedNoCapture()) {
7143       LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] pointer might be captured!\n");
7144       return indicatePessimisticFixpoint();
7145     }
7146 
7147     auto &NoAliasAA = A.getAAFor<AANoAlias>(*this, IRP, DepClassTy::REQUIRED);
7148     if (!NoAliasAA.isAssumedNoAlias()) {
7149       LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] pointer might alias!\n");
7150       return indicatePessimisticFixpoint();
7151     }
7152 
7153     bool IsKnown;
7154     if (!AA::isAssumedReadOnly(A, IRP, *this, IsKnown)) {
7155       LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] pointer is written!\n");
7156       return indicatePessimisticFixpoint();
7157     }
7158 
7159     return ChangeStatus::UNCHANGED;
7160   }
7161 
7162   /// See AbstractAttribute::trackStatistics()
7163   void trackStatistics() const override {
7164     STATS_DECLTRACK_CSARG_ATTR(privatizable_ptr);
7165   }
7166 };
7167 
7168 struct AAPrivatizablePtrCallSiteReturned final
7169     : public AAPrivatizablePtrFloating {
7170   AAPrivatizablePtrCallSiteReturned(const IRPosition &IRP, Attributor &A)
7171       : AAPrivatizablePtrFloating(IRP, A) {}
7172 
7173   /// See AbstractAttribute::initialize(...).
7174   void initialize(Attributor &A) override {
7175     // TODO: We can privatize more than arguments.
7176     indicatePessimisticFixpoint();
7177   }
7178 
7179   /// See AbstractAttribute::trackStatistics()
7180   void trackStatistics() const override {
7181     STATS_DECLTRACK_CSRET_ATTR(privatizable_ptr);
7182   }
7183 };
7184 
7185 struct AAPrivatizablePtrReturned final : public AAPrivatizablePtrFloating {
7186   AAPrivatizablePtrReturned(const IRPosition &IRP, Attributor &A)
7187       : AAPrivatizablePtrFloating(IRP, A) {}
7188 
7189   /// See AbstractAttribute::initialize(...).
7190   void initialize(Attributor &A) override {
7191     // TODO: We can privatize more than arguments.
7192     indicatePessimisticFixpoint();
7193   }
7194 
7195   /// See AbstractAttribute::trackStatistics()
7196   void trackStatistics() const override {
7197     STATS_DECLTRACK_FNRET_ATTR(privatizable_ptr);
7198   }
7199 };
7200 } // namespace
7201 
7202 /// -------------------- Memory Behavior Attributes ----------------------------
7203 /// Includes read-none, read-only, and write-only.
7204 /// ----------------------------------------------------------------------------
7205 namespace {
7206 struct AAMemoryBehaviorImpl : public AAMemoryBehavior {
7207   AAMemoryBehaviorImpl(const IRPosition &IRP, Attributor &A)
7208       : AAMemoryBehavior(IRP, A) {}
7209 
7210   /// See AbstractAttribute::initialize(...).
7211   void initialize(Attributor &A) override {
7212     intersectAssumedBits(BEST_STATE);
7213     getKnownStateFromValue(getIRPosition(), getState());
7214     AAMemoryBehavior::initialize(A);
7215   }
7216 
7217   /// Return the memory behavior information encoded in the IR for \p IRP.
7218   static void getKnownStateFromValue(const IRPosition &IRP,
7219                                      BitIntegerState &State,
7220                                      bool IgnoreSubsumingPositions = false) {
7221     SmallVector<Attribute, 2> Attrs;
7222     IRP.getAttrs(AttrKinds, Attrs, IgnoreSubsumingPositions);
7223     for (const Attribute &Attr : Attrs) {
7224       switch (Attr.getKindAsEnum()) {
7225       case Attribute::ReadNone:
7226         State.addKnownBits(NO_ACCESSES);
7227         break;
7228       case Attribute::ReadOnly:
7229         State.addKnownBits(NO_WRITES);
7230         break;
7231       case Attribute::WriteOnly:
7232         State.addKnownBits(NO_READS);
7233         break;
7234       default:
7235         llvm_unreachable("Unexpected attribute!");
7236       }
7237     }
7238 
7239     if (auto *I = dyn_cast<Instruction>(&IRP.getAnchorValue())) {
7240       if (!I->mayReadFromMemory())
7241         State.addKnownBits(NO_READS);
7242       if (!I->mayWriteToMemory())
7243         State.addKnownBits(NO_WRITES);
7244     }
7245   }
7246 
7247   /// See AbstractAttribute::getDeducedAttributes(...).
7248   void getDeducedAttributes(LLVMContext &Ctx,
7249                             SmallVectorImpl<Attribute> &Attrs) const override {
7250     assert(Attrs.size() == 0);
7251     if (isAssumedReadNone())
7252       Attrs.push_back(Attribute::get(Ctx, Attribute::ReadNone));
7253     else if (isAssumedReadOnly())
7254       Attrs.push_back(Attribute::get(Ctx, Attribute::ReadOnly));
7255     else if (isAssumedWriteOnly())
7256       Attrs.push_back(Attribute::get(Ctx, Attribute::WriteOnly));
7257     assert(Attrs.size() <= 1);
7258   }
7259 
7260   /// See AbstractAttribute::manifest(...).
7261   ChangeStatus manifest(Attributor &A) override {
7262     if (hasAttr(Attribute::ReadNone, /* IgnoreSubsumingPositions */ true))
7263       return ChangeStatus::UNCHANGED;
7264 
7265     const IRPosition &IRP = getIRPosition();
7266 
7267     // Check if we would improve the existing attributes first.
7268     SmallVector<Attribute, 4> DeducedAttrs;
7269     getDeducedAttributes(IRP.getAnchorValue().getContext(), DeducedAttrs);
7270     if (llvm::all_of(DeducedAttrs, [&](const Attribute &Attr) {
7271           return IRP.hasAttr(Attr.getKindAsEnum(),
7272                              /* IgnoreSubsumingPositions */ true);
7273         }))
7274       return ChangeStatus::UNCHANGED;
7275 
7276     // Clear existing attributes.
7277     IRP.removeAttrs(AttrKinds);
7278 
7279     // Use the generic manifest method.
7280     return IRAttribute::manifest(A);
7281   }
7282 
7283   /// See AbstractState::getAsStr().
7284   const std::string getAsStr() const override {
7285     if (isAssumedReadNone())
7286       return "readnone";
7287     if (isAssumedReadOnly())
7288       return "readonly";
7289     if (isAssumedWriteOnly())
7290       return "writeonly";
7291     return "may-read/write";
7292   }
7293 
7294   /// The set of IR attributes AAMemoryBehavior deals with.
7295   static const Attribute::AttrKind AttrKinds[3];
7296 };
7297 
7298 const Attribute::AttrKind AAMemoryBehaviorImpl::AttrKinds[] = {
7299     Attribute::ReadNone, Attribute::ReadOnly, Attribute::WriteOnly};
7300 
7301 /// Memory behavior attribute for a floating value.
7302 struct AAMemoryBehaviorFloating : AAMemoryBehaviorImpl {
7303   AAMemoryBehaviorFloating(const IRPosition &IRP, Attributor &A)
7304       : AAMemoryBehaviorImpl(IRP, A) {}
7305 
7306   /// See AbstractAttribute::updateImpl(...).
7307   ChangeStatus updateImpl(Attributor &A) override;
7308 
7309   /// See AbstractAttribute::trackStatistics()
7310   void trackStatistics() const override {
7311     if (isAssumedReadNone())
7312       STATS_DECLTRACK_FLOATING_ATTR(readnone)
7313     else if (isAssumedReadOnly())
7314       STATS_DECLTRACK_FLOATING_ATTR(readonly)
7315     else if (isAssumedWriteOnly())
7316       STATS_DECLTRACK_FLOATING_ATTR(writeonly)
7317   }
7318 
7319 private:
7320   /// Return true if users of \p UserI might access the underlying
7321   /// variable/location described by \p U and should therefore be analyzed.
7322   bool followUsersOfUseIn(Attributor &A, const Use &U,
7323                           const Instruction *UserI);
7324 
7325   /// Update the state according to the effect of use \p U in \p UserI.
7326   void analyzeUseIn(Attributor &A, const Use &U, const Instruction *UserI);
7327 };
7328 
7329 /// Memory behavior attribute for function argument.
7330 struct AAMemoryBehaviorArgument : AAMemoryBehaviorFloating {
7331   AAMemoryBehaviorArgument(const IRPosition &IRP, Attributor &A)
7332       : AAMemoryBehaviorFloating(IRP, A) {}
7333 
7334   /// See AbstractAttribute::initialize(...).
7335   void initialize(Attributor &A) override {
7336     intersectAssumedBits(BEST_STATE);
7337     const IRPosition &IRP = getIRPosition();
7338     // TODO: Make IgnoreSubsumingPositions a property of an IRAttribute so we
7339     // can query it when we use has/getAttr. That would allow us to reuse the
7340     // initialize of the base class here.
7341     bool HasByVal =
7342         IRP.hasAttr({Attribute::ByVal}, /* IgnoreSubsumingPositions */ true);
7343     getKnownStateFromValue(IRP, getState(),
7344                            /* IgnoreSubsumingPositions */ HasByVal);
7345 
7346     // Initialize the use vector with all direct uses of the associated value.
7347     Argument *Arg = getAssociatedArgument();
7348     if (!Arg || !A.isFunctionIPOAmendable(*(Arg->getParent())))
7349       indicatePessimisticFixpoint();
7350   }
7351 
7352   ChangeStatus manifest(Attributor &A) override {
7353     // TODO: Pointer arguments are not supported on vectors of pointers yet.
7354     if (!getAssociatedValue().getType()->isPointerTy())
7355       return ChangeStatus::UNCHANGED;
7356 
7357     // TODO: From readattrs.ll: "inalloca parameters are always
7358     //                           considered written"
7359     if (hasAttr({Attribute::InAlloca, Attribute::Preallocated})) {
7360       removeKnownBits(NO_WRITES);
7361       removeAssumedBits(NO_WRITES);
7362     }
7363     return AAMemoryBehaviorFloating::manifest(A);
7364   }
7365 
7366   /// See AbstractAttribute::trackStatistics()
7367   void trackStatistics() const override {
7368     if (isAssumedReadNone())
7369       STATS_DECLTRACK_ARG_ATTR(readnone)
7370     else if (isAssumedReadOnly())
7371       STATS_DECLTRACK_ARG_ATTR(readonly)
7372     else if (isAssumedWriteOnly())
7373       STATS_DECLTRACK_ARG_ATTR(writeonly)
7374   }
7375 };
7376 
7377 struct AAMemoryBehaviorCallSiteArgument final : AAMemoryBehaviorArgument {
7378   AAMemoryBehaviorCallSiteArgument(const IRPosition &IRP, Attributor &A)
7379       : AAMemoryBehaviorArgument(IRP, A) {}
7380 
7381   /// See AbstractAttribute::initialize(...).
7382   void initialize(Attributor &A) override {
7383     // If we don't have an associated attribute this is either a variadic call
7384     // or an indirect call, either way, nothing to do here.
7385     Argument *Arg = getAssociatedArgument();
7386     if (!Arg) {
7387       indicatePessimisticFixpoint();
7388       return;
7389     }
7390     if (Arg->hasByValAttr()) {
7391       addKnownBits(NO_WRITES);
7392       removeKnownBits(NO_READS);
7393       removeAssumedBits(NO_READS);
7394     }
7395     AAMemoryBehaviorArgument::initialize(A);
7396     if (getAssociatedFunction()->isDeclaration())
7397       indicatePessimisticFixpoint();
7398   }
7399 
7400   /// See AbstractAttribute::updateImpl(...).
7401   ChangeStatus updateImpl(Attributor &A) override {
7402     // TODO: Once we have call site specific value information we can provide
7403     //       call site specific liveness liveness information and then it makes
7404     //       sense to specialize attributes for call sites arguments instead of
7405     //       redirecting requests to the callee argument.
7406     Argument *Arg = getAssociatedArgument();
7407     const IRPosition &ArgPos = IRPosition::argument(*Arg);
7408     auto &ArgAA =
7409         A.getAAFor<AAMemoryBehavior>(*this, ArgPos, DepClassTy::REQUIRED);
7410     return clampStateAndIndicateChange(getState(), ArgAA.getState());
7411   }
7412 
7413   /// See AbstractAttribute::trackStatistics()
7414   void trackStatistics() const override {
7415     if (isAssumedReadNone())
7416       STATS_DECLTRACK_CSARG_ATTR(readnone)
7417     else if (isAssumedReadOnly())
7418       STATS_DECLTRACK_CSARG_ATTR(readonly)
7419     else if (isAssumedWriteOnly())
7420       STATS_DECLTRACK_CSARG_ATTR(writeonly)
7421   }
7422 };
7423 
7424 /// Memory behavior attribute for a call site return position.
7425 struct AAMemoryBehaviorCallSiteReturned final : AAMemoryBehaviorFloating {
7426   AAMemoryBehaviorCallSiteReturned(const IRPosition &IRP, Attributor &A)
7427       : AAMemoryBehaviorFloating(IRP, A) {}
7428 
7429   /// See AbstractAttribute::initialize(...).
7430   void initialize(Attributor &A) override {
7431     AAMemoryBehaviorImpl::initialize(A);
7432     Function *F = getAssociatedFunction();
7433     if (!F || F->isDeclaration())
7434       indicatePessimisticFixpoint();
7435   }
7436 
7437   /// See AbstractAttribute::manifest(...).
7438   ChangeStatus manifest(Attributor &A) override {
7439     // We do not annotate returned values.
7440     return ChangeStatus::UNCHANGED;
7441   }
7442 
7443   /// See AbstractAttribute::trackStatistics()
7444   void trackStatistics() const override {}
7445 };
7446 
7447 /// An AA to represent the memory behavior function attributes.
7448 struct AAMemoryBehaviorFunction final : public AAMemoryBehaviorImpl {
7449   AAMemoryBehaviorFunction(const IRPosition &IRP, Attributor &A)
7450       : AAMemoryBehaviorImpl(IRP, A) {}
7451 
7452   /// See AbstractAttribute::updateImpl(Attributor &A).
7453   virtual ChangeStatus updateImpl(Attributor &A) override;
7454 
7455   /// See AbstractAttribute::manifest(...).
7456   ChangeStatus manifest(Attributor &A) override {
7457     Function &F = cast<Function>(getAnchorValue());
7458     if (isAssumedReadNone()) {
7459       F.removeFnAttr(Attribute::ArgMemOnly);
7460       F.removeFnAttr(Attribute::InaccessibleMemOnly);
7461       F.removeFnAttr(Attribute::InaccessibleMemOrArgMemOnly);
7462     }
7463     return AAMemoryBehaviorImpl::manifest(A);
7464   }
7465 
7466   /// See AbstractAttribute::trackStatistics()
7467   void trackStatistics() const override {
7468     if (isAssumedReadNone())
7469       STATS_DECLTRACK_FN_ATTR(readnone)
7470     else if (isAssumedReadOnly())
7471       STATS_DECLTRACK_FN_ATTR(readonly)
7472     else if (isAssumedWriteOnly())
7473       STATS_DECLTRACK_FN_ATTR(writeonly)
7474   }
7475 };
7476 
7477 /// AAMemoryBehavior attribute for call sites.
7478 struct AAMemoryBehaviorCallSite final : AAMemoryBehaviorImpl {
7479   AAMemoryBehaviorCallSite(const IRPosition &IRP, Attributor &A)
7480       : AAMemoryBehaviorImpl(IRP, A) {}
7481 
7482   /// See AbstractAttribute::initialize(...).
7483   void initialize(Attributor &A) override {
7484     AAMemoryBehaviorImpl::initialize(A);
7485     Function *F = getAssociatedFunction();
7486     if (!F || F->isDeclaration())
7487       indicatePessimisticFixpoint();
7488   }
7489 
7490   /// See AbstractAttribute::updateImpl(...).
7491   ChangeStatus updateImpl(Attributor &A) override {
7492     // TODO: Once we have call site specific value information we can provide
7493     //       call site specific liveness liveness information and then it makes
7494     //       sense to specialize attributes for call sites arguments instead of
7495     //       redirecting requests to the callee argument.
7496     Function *F = getAssociatedFunction();
7497     const IRPosition &FnPos = IRPosition::function(*F);
7498     auto &FnAA =
7499         A.getAAFor<AAMemoryBehavior>(*this, FnPos, DepClassTy::REQUIRED);
7500     return clampStateAndIndicateChange(getState(), FnAA.getState());
7501   }
7502 
7503   /// See AbstractAttribute::trackStatistics()
7504   void trackStatistics() const override {
7505     if (isAssumedReadNone())
7506       STATS_DECLTRACK_CS_ATTR(readnone)
7507     else if (isAssumedReadOnly())
7508       STATS_DECLTRACK_CS_ATTR(readonly)
7509     else if (isAssumedWriteOnly())
7510       STATS_DECLTRACK_CS_ATTR(writeonly)
7511   }
7512 };
7513 
7514 ChangeStatus AAMemoryBehaviorFunction::updateImpl(Attributor &A) {
7515 
7516   // The current assumed state used to determine a change.
7517   auto AssumedState = getAssumed();
7518 
7519   auto CheckRWInst = [&](Instruction &I) {
7520     // If the instruction has an own memory behavior state, use it to restrict
7521     // the local state. No further analysis is required as the other memory
7522     // state is as optimistic as it gets.
7523     if (const auto *CB = dyn_cast<CallBase>(&I)) {
7524       const auto &MemBehaviorAA = A.getAAFor<AAMemoryBehavior>(
7525           *this, IRPosition::callsite_function(*CB), DepClassTy::REQUIRED);
7526       intersectAssumedBits(MemBehaviorAA.getAssumed());
7527       return !isAtFixpoint();
7528     }
7529 
7530     // Remove access kind modifiers if necessary.
7531     if (I.mayReadFromMemory())
7532       removeAssumedBits(NO_READS);
7533     if (I.mayWriteToMemory())
7534       removeAssumedBits(NO_WRITES);
7535     return !isAtFixpoint();
7536   };
7537 
7538   bool UsedAssumedInformation = false;
7539   if (!A.checkForAllReadWriteInstructions(CheckRWInst, *this,
7540                                           UsedAssumedInformation))
7541     return indicatePessimisticFixpoint();
7542 
7543   return (AssumedState != getAssumed()) ? ChangeStatus::CHANGED
7544                                         : ChangeStatus::UNCHANGED;
7545 }
7546 
7547 ChangeStatus AAMemoryBehaviorFloating::updateImpl(Attributor &A) {
7548 
7549   const IRPosition &IRP = getIRPosition();
7550   const IRPosition &FnPos = IRPosition::function_scope(IRP);
7551   AAMemoryBehavior::StateType &S = getState();
7552 
7553   // First, check the function scope. We take the known information and we avoid
7554   // work if the assumed information implies the current assumed information for
7555   // this attribute. This is a valid for all but byval arguments.
7556   Argument *Arg = IRP.getAssociatedArgument();
7557   AAMemoryBehavior::base_t FnMemAssumedState =
7558       AAMemoryBehavior::StateType::getWorstState();
7559   if (!Arg || !Arg->hasByValAttr()) {
7560     const auto &FnMemAA =
7561         A.getAAFor<AAMemoryBehavior>(*this, FnPos, DepClassTy::OPTIONAL);
7562     FnMemAssumedState = FnMemAA.getAssumed();
7563     S.addKnownBits(FnMemAA.getKnown());
7564     if ((S.getAssumed() & FnMemAA.getAssumed()) == S.getAssumed())
7565       return ChangeStatus::UNCHANGED;
7566   }
7567 
7568   // The current assumed state used to determine a change.
7569   auto AssumedState = S.getAssumed();
7570 
7571   // Make sure the value is not captured (except through "return"), if
7572   // it is, any information derived would be irrelevant anyway as we cannot
7573   // check the potential aliases introduced by the capture. However, no need
7574   // to fall back to anythign less optimistic than the function state.
7575   const auto &ArgNoCaptureAA =
7576       A.getAAFor<AANoCapture>(*this, IRP, DepClassTy::OPTIONAL);
7577   if (!ArgNoCaptureAA.isAssumedNoCaptureMaybeReturned()) {
7578     S.intersectAssumedBits(FnMemAssumedState);
7579     return (AssumedState != getAssumed()) ? ChangeStatus::CHANGED
7580                                           : ChangeStatus::UNCHANGED;
7581   }
7582 
7583   // Visit and expand uses until all are analyzed or a fixpoint is reached.
7584   auto UsePred = [&](const Use &U, bool &Follow) -> bool {
7585     Instruction *UserI = cast<Instruction>(U.getUser());
7586     LLVM_DEBUG(dbgs() << "[AAMemoryBehavior] Use: " << *U << " in " << *UserI
7587                       << " \n");
7588 
7589     // Droppable users, e.g., llvm::assume does not actually perform any action.
7590     if (UserI->isDroppable())
7591       return true;
7592 
7593     // Check if the users of UserI should also be visited.
7594     Follow = followUsersOfUseIn(A, U, UserI);
7595 
7596     // If UserI might touch memory we analyze the use in detail.
7597     if (UserI->mayReadOrWriteMemory())
7598       analyzeUseIn(A, U, UserI);
7599 
7600     return !isAtFixpoint();
7601   };
7602 
7603   if (!A.checkForAllUses(UsePred, *this, getAssociatedValue()))
7604     return indicatePessimisticFixpoint();
7605 
7606   return (AssumedState != getAssumed()) ? ChangeStatus::CHANGED
7607                                         : ChangeStatus::UNCHANGED;
7608 }
7609 
7610 bool AAMemoryBehaviorFloating::followUsersOfUseIn(Attributor &A, const Use &U,
7611                                                   const Instruction *UserI) {
7612   // The loaded value is unrelated to the pointer argument, no need to
7613   // follow the users of the load.
7614   if (isa<LoadInst>(UserI))
7615     return false;
7616 
7617   // By default we follow all uses assuming UserI might leak information on U,
7618   // we have special handling for call sites operands though.
7619   const auto *CB = dyn_cast<CallBase>(UserI);
7620   if (!CB || !CB->isArgOperand(&U))
7621     return true;
7622 
7623   // If the use is a call argument known not to be captured, the users of
7624   // the call do not need to be visited because they have to be unrelated to
7625   // the input. Note that this check is not trivial even though we disallow
7626   // general capturing of the underlying argument. The reason is that the
7627   // call might the argument "through return", which we allow and for which we
7628   // need to check call users.
7629   if (U.get()->getType()->isPointerTy()) {
7630     unsigned ArgNo = CB->getArgOperandNo(&U);
7631     const auto &ArgNoCaptureAA = A.getAAFor<AANoCapture>(
7632         *this, IRPosition::callsite_argument(*CB, ArgNo), DepClassTy::OPTIONAL);
7633     return !ArgNoCaptureAA.isAssumedNoCapture();
7634   }
7635 
7636   return true;
7637 }
7638 
7639 void AAMemoryBehaviorFloating::analyzeUseIn(Attributor &A, const Use &U,
7640                                             const Instruction *UserI) {
7641   assert(UserI->mayReadOrWriteMemory());
7642 
7643   switch (UserI->getOpcode()) {
7644   default:
7645     // TODO: Handle all atomics and other side-effect operations we know of.
7646     break;
7647   case Instruction::Load:
7648     // Loads cause the NO_READS property to disappear.
7649     removeAssumedBits(NO_READS);
7650     return;
7651 
7652   case Instruction::Store:
7653     // Stores cause the NO_WRITES property to disappear if the use is the
7654     // pointer operand. Note that while capturing was taken care of somewhere
7655     // else we need to deal with stores of the value that is not looked through.
7656     if (cast<StoreInst>(UserI)->getPointerOperand() == U.get())
7657       removeAssumedBits(NO_WRITES);
7658     else
7659       indicatePessimisticFixpoint();
7660     return;
7661 
7662   case Instruction::Call:
7663   case Instruction::CallBr:
7664   case Instruction::Invoke: {
7665     // For call sites we look at the argument memory behavior attribute (this
7666     // could be recursive!) in order to restrict our own state.
7667     const auto *CB = cast<CallBase>(UserI);
7668 
7669     // Give up on operand bundles.
7670     if (CB->isBundleOperand(&U)) {
7671       indicatePessimisticFixpoint();
7672       return;
7673     }
7674 
7675     // Calling a function does read the function pointer, maybe write it if the
7676     // function is self-modifying.
7677     if (CB->isCallee(&U)) {
7678       removeAssumedBits(NO_READS);
7679       break;
7680     }
7681 
7682     // Adjust the possible access behavior based on the information on the
7683     // argument.
7684     IRPosition Pos;
7685     if (U.get()->getType()->isPointerTy())
7686       Pos = IRPosition::callsite_argument(*CB, CB->getArgOperandNo(&U));
7687     else
7688       Pos = IRPosition::callsite_function(*CB);
7689     const auto &MemBehaviorAA =
7690         A.getAAFor<AAMemoryBehavior>(*this, Pos, DepClassTy::OPTIONAL);
7691     // "assumed" has at most the same bits as the MemBehaviorAA assumed
7692     // and at least "known".
7693     intersectAssumedBits(MemBehaviorAA.getAssumed());
7694     return;
7695   }
7696   };
7697 
7698   // Generally, look at the "may-properties" and adjust the assumed state if we
7699   // did not trigger special handling before.
7700   if (UserI->mayReadFromMemory())
7701     removeAssumedBits(NO_READS);
7702   if (UserI->mayWriteToMemory())
7703     removeAssumedBits(NO_WRITES);
7704 }
7705 } // namespace
7706 
7707 /// -------------------- Memory Locations Attributes ---------------------------
7708 /// Includes read-none, argmemonly, inaccessiblememonly,
7709 /// inaccessiblememorargmemonly
7710 /// ----------------------------------------------------------------------------
7711 
7712 std::string AAMemoryLocation::getMemoryLocationsAsStr(
7713     AAMemoryLocation::MemoryLocationsKind MLK) {
7714   if (0 == (MLK & AAMemoryLocation::NO_LOCATIONS))
7715     return "all memory";
7716   if (MLK == AAMemoryLocation::NO_LOCATIONS)
7717     return "no memory";
7718   std::string S = "memory:";
7719   if (0 == (MLK & AAMemoryLocation::NO_LOCAL_MEM))
7720     S += "stack,";
7721   if (0 == (MLK & AAMemoryLocation::NO_CONST_MEM))
7722     S += "constant,";
7723   if (0 == (MLK & AAMemoryLocation::NO_GLOBAL_INTERNAL_MEM))
7724     S += "internal global,";
7725   if (0 == (MLK & AAMemoryLocation::NO_GLOBAL_EXTERNAL_MEM))
7726     S += "external global,";
7727   if (0 == (MLK & AAMemoryLocation::NO_ARGUMENT_MEM))
7728     S += "argument,";
7729   if (0 == (MLK & AAMemoryLocation::NO_INACCESSIBLE_MEM))
7730     S += "inaccessible,";
7731   if (0 == (MLK & AAMemoryLocation::NO_MALLOCED_MEM))
7732     S += "malloced,";
7733   if (0 == (MLK & AAMemoryLocation::NO_UNKOWN_MEM))
7734     S += "unknown,";
7735   S.pop_back();
7736   return S;
7737 }
7738 
7739 namespace {
7740 struct AAMemoryLocationImpl : public AAMemoryLocation {
7741 
7742   AAMemoryLocationImpl(const IRPosition &IRP, Attributor &A)
7743       : AAMemoryLocation(IRP, A), Allocator(A.Allocator) {
7744     for (unsigned u = 0; u < llvm::CTLog2<VALID_STATE>(); ++u)
7745       AccessKind2Accesses[u] = nullptr;
7746   }
7747 
7748   ~AAMemoryLocationImpl() {
7749     // The AccessSets are allocated via a BumpPtrAllocator, we call
7750     // the destructor manually.
7751     for (unsigned u = 0; u < llvm::CTLog2<VALID_STATE>(); ++u)
7752       if (AccessKind2Accesses[u])
7753         AccessKind2Accesses[u]->~AccessSet();
7754   }
7755 
7756   /// See AbstractAttribute::initialize(...).
7757   void initialize(Attributor &A) override {
7758     intersectAssumedBits(BEST_STATE);
7759     getKnownStateFromValue(A, getIRPosition(), getState());
7760     AAMemoryLocation::initialize(A);
7761   }
7762 
7763   /// Return the memory behavior information encoded in the IR for \p IRP.
7764   static void getKnownStateFromValue(Attributor &A, const IRPosition &IRP,
7765                                      BitIntegerState &State,
7766                                      bool IgnoreSubsumingPositions = false) {
7767     // For internal functions we ignore `argmemonly` and
7768     // `inaccessiblememorargmemonly` as we might break it via interprocedural
7769     // constant propagation. It is unclear if this is the best way but it is
7770     // unlikely this will cause real performance problems. If we are deriving
7771     // attributes for the anchor function we even remove the attribute in
7772     // addition to ignoring it.
7773     bool UseArgMemOnly = true;
7774     Function *AnchorFn = IRP.getAnchorScope();
7775     if (AnchorFn && A.isRunOn(*AnchorFn))
7776       UseArgMemOnly = !AnchorFn->hasLocalLinkage();
7777 
7778     SmallVector<Attribute, 2> Attrs;
7779     IRP.getAttrs(AttrKinds, Attrs, IgnoreSubsumingPositions);
7780     for (const Attribute &Attr : Attrs) {
7781       switch (Attr.getKindAsEnum()) {
7782       case Attribute::ReadNone:
7783         State.addKnownBits(NO_LOCAL_MEM | NO_CONST_MEM);
7784         break;
7785       case Attribute::InaccessibleMemOnly:
7786         State.addKnownBits(inverseLocation(NO_INACCESSIBLE_MEM, true, true));
7787         break;
7788       case Attribute::ArgMemOnly:
7789         if (UseArgMemOnly)
7790           State.addKnownBits(inverseLocation(NO_ARGUMENT_MEM, true, true));
7791         else
7792           IRP.removeAttrs({Attribute::ArgMemOnly});
7793         break;
7794       case Attribute::InaccessibleMemOrArgMemOnly:
7795         if (UseArgMemOnly)
7796           State.addKnownBits(inverseLocation(
7797               NO_INACCESSIBLE_MEM | NO_ARGUMENT_MEM, true, true));
7798         else
7799           IRP.removeAttrs({Attribute::InaccessibleMemOrArgMemOnly});
7800         break;
7801       default:
7802         llvm_unreachable("Unexpected attribute!");
7803       }
7804     }
7805   }
7806 
7807   /// See AbstractAttribute::getDeducedAttributes(...).
7808   void getDeducedAttributes(LLVMContext &Ctx,
7809                             SmallVectorImpl<Attribute> &Attrs) const override {
7810     assert(Attrs.size() == 0);
7811     if (isAssumedReadNone()) {
7812       Attrs.push_back(Attribute::get(Ctx, Attribute::ReadNone));
7813     } else if (getIRPosition().getPositionKind() == IRPosition::IRP_FUNCTION) {
7814       if (isAssumedInaccessibleMemOnly())
7815         Attrs.push_back(Attribute::get(Ctx, Attribute::InaccessibleMemOnly));
7816       else if (isAssumedArgMemOnly())
7817         Attrs.push_back(Attribute::get(Ctx, Attribute::ArgMemOnly));
7818       else if (isAssumedInaccessibleOrArgMemOnly())
7819         Attrs.push_back(
7820             Attribute::get(Ctx, Attribute::InaccessibleMemOrArgMemOnly));
7821     }
7822     assert(Attrs.size() <= 1);
7823   }
7824 
7825   /// See AbstractAttribute::manifest(...).
7826   ChangeStatus manifest(Attributor &A) override {
7827     const IRPosition &IRP = getIRPosition();
7828 
7829     // Check if we would improve the existing attributes first.
7830     SmallVector<Attribute, 4> DeducedAttrs;
7831     getDeducedAttributes(IRP.getAnchorValue().getContext(), DeducedAttrs);
7832     if (llvm::all_of(DeducedAttrs, [&](const Attribute &Attr) {
7833           return IRP.hasAttr(Attr.getKindAsEnum(),
7834                              /* IgnoreSubsumingPositions */ true);
7835         }))
7836       return ChangeStatus::UNCHANGED;
7837 
7838     // Clear existing attributes.
7839     IRP.removeAttrs(AttrKinds);
7840     if (isAssumedReadNone())
7841       IRP.removeAttrs(AAMemoryBehaviorImpl::AttrKinds);
7842 
7843     // Use the generic manifest method.
7844     return IRAttribute::manifest(A);
7845   }
7846 
7847   /// See AAMemoryLocation::checkForAllAccessesToMemoryKind(...).
7848   bool checkForAllAccessesToMemoryKind(
7849       function_ref<bool(const Instruction *, const Value *, AccessKind,
7850                         MemoryLocationsKind)>
7851           Pred,
7852       MemoryLocationsKind RequestedMLK) const override {
7853     if (!isValidState())
7854       return false;
7855 
7856     MemoryLocationsKind AssumedMLK = getAssumedNotAccessedLocation();
7857     if (AssumedMLK == NO_LOCATIONS)
7858       return true;
7859 
7860     unsigned Idx = 0;
7861     for (MemoryLocationsKind CurMLK = 1; CurMLK < NO_LOCATIONS;
7862          CurMLK *= 2, ++Idx) {
7863       if (CurMLK & RequestedMLK)
7864         continue;
7865 
7866       if (const AccessSet *Accesses = AccessKind2Accesses[Idx])
7867         for (const AccessInfo &AI : *Accesses)
7868           if (!Pred(AI.I, AI.Ptr, AI.Kind, CurMLK))
7869             return false;
7870     }
7871 
7872     return true;
7873   }
7874 
7875   ChangeStatus indicatePessimisticFixpoint() override {
7876     // If we give up and indicate a pessimistic fixpoint this instruction will
7877     // become an access for all potential access kinds:
7878     // TODO: Add pointers for argmemonly and globals to improve the results of
7879     //       checkForAllAccessesToMemoryKind.
7880     bool Changed = false;
7881     MemoryLocationsKind KnownMLK = getKnown();
7882     Instruction *I = dyn_cast<Instruction>(&getAssociatedValue());
7883     for (MemoryLocationsKind CurMLK = 1; CurMLK < NO_LOCATIONS; CurMLK *= 2)
7884       if (!(CurMLK & KnownMLK))
7885         updateStateAndAccessesMap(getState(), CurMLK, I, nullptr, Changed,
7886                                   getAccessKindFromInst(I));
7887     return AAMemoryLocation::indicatePessimisticFixpoint();
7888   }
7889 
7890 protected:
7891   /// Helper struct to tie together an instruction that has a read or write
7892   /// effect with the pointer it accesses (if any).
7893   struct AccessInfo {
7894 
7895     /// The instruction that caused the access.
7896     const Instruction *I;
7897 
7898     /// The base pointer that is accessed, or null if unknown.
7899     const Value *Ptr;
7900 
7901     /// The kind of access (read/write/read+write).
7902     AccessKind Kind;
7903 
7904     bool operator==(const AccessInfo &RHS) const {
7905       return I == RHS.I && Ptr == RHS.Ptr && Kind == RHS.Kind;
7906     }
7907     bool operator()(const AccessInfo &LHS, const AccessInfo &RHS) const {
7908       if (LHS.I != RHS.I)
7909         return LHS.I < RHS.I;
7910       if (LHS.Ptr != RHS.Ptr)
7911         return LHS.Ptr < RHS.Ptr;
7912       if (LHS.Kind != RHS.Kind)
7913         return LHS.Kind < RHS.Kind;
7914       return false;
7915     }
7916   };
7917 
7918   /// Mapping from *single* memory location kinds, e.g., LOCAL_MEM with the
7919   /// value of NO_LOCAL_MEM, to the accesses encountered for this memory kind.
7920   using AccessSet = SmallSet<AccessInfo, 2, AccessInfo>;
7921   AccessSet *AccessKind2Accesses[llvm::CTLog2<VALID_STATE>()];
7922 
7923   /// Categorize the pointer arguments of CB that might access memory in
7924   /// AccessedLoc and update the state and access map accordingly.
7925   void
7926   categorizeArgumentPointerLocations(Attributor &A, CallBase &CB,
7927                                      AAMemoryLocation::StateType &AccessedLocs,
7928                                      bool &Changed);
7929 
7930   /// Return the kind(s) of location that may be accessed by \p V.
7931   AAMemoryLocation::MemoryLocationsKind
7932   categorizeAccessedLocations(Attributor &A, Instruction &I, bool &Changed);
7933 
7934   /// Return the access kind as determined by \p I.
7935   AccessKind getAccessKindFromInst(const Instruction *I) {
7936     AccessKind AK = READ_WRITE;
7937     if (I) {
7938       AK = I->mayReadFromMemory() ? READ : NONE;
7939       AK = AccessKind(AK | (I->mayWriteToMemory() ? WRITE : NONE));
7940     }
7941     return AK;
7942   }
7943 
7944   /// Update the state \p State and the AccessKind2Accesses given that \p I is
7945   /// an access of kind \p AK to a \p MLK memory location with the access
7946   /// pointer \p Ptr.
7947   void updateStateAndAccessesMap(AAMemoryLocation::StateType &State,
7948                                  MemoryLocationsKind MLK, const Instruction *I,
7949                                  const Value *Ptr, bool &Changed,
7950                                  AccessKind AK = READ_WRITE) {
7951 
7952     assert(isPowerOf2_32(MLK) && "Expected a single location set!");
7953     auto *&Accesses = AccessKind2Accesses[llvm::Log2_32(MLK)];
7954     if (!Accesses)
7955       Accesses = new (Allocator) AccessSet();
7956     Changed |= Accesses->insert(AccessInfo{I, Ptr, AK}).second;
7957     State.removeAssumedBits(MLK);
7958   }
7959 
7960   /// Determine the underlying locations kinds for \p Ptr, e.g., globals or
7961   /// arguments, and update the state and access map accordingly.
7962   void categorizePtrValue(Attributor &A, const Instruction &I, const Value &Ptr,
7963                           AAMemoryLocation::StateType &State, bool &Changed);
7964 
7965   /// Used to allocate access sets.
7966   BumpPtrAllocator &Allocator;
7967 
7968   /// The set of IR attributes AAMemoryLocation deals with.
7969   static const Attribute::AttrKind AttrKinds[4];
7970 };
7971 
7972 const Attribute::AttrKind AAMemoryLocationImpl::AttrKinds[] = {
7973     Attribute::ReadNone, Attribute::InaccessibleMemOnly, Attribute::ArgMemOnly,
7974     Attribute::InaccessibleMemOrArgMemOnly};
7975 
7976 void AAMemoryLocationImpl::categorizePtrValue(
7977     Attributor &A, const Instruction &I, const Value &Ptr,
7978     AAMemoryLocation::StateType &State, bool &Changed) {
7979   LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Categorize pointer locations for "
7980                     << Ptr << " ["
7981                     << getMemoryLocationsAsStr(State.getAssumed()) << "]\n");
7982 
7983   SmallVector<Value *, 8> Objects;
7984   bool UsedAssumedInformation = false;
7985   if (!AA::getAssumedUnderlyingObjects(A, Ptr, Objects, *this, &I,
7986                                        UsedAssumedInformation,
7987                                        AA::Intraprocedural)) {
7988     LLVM_DEBUG(
7989         dbgs() << "[AAMemoryLocation] Pointer locations not categorized\n");
7990     updateStateAndAccessesMap(State, NO_UNKOWN_MEM, &I, nullptr, Changed,
7991                               getAccessKindFromInst(&I));
7992     return;
7993   }
7994 
7995   for (Value *Obj : Objects) {
7996     // TODO: recognize the TBAA used for constant accesses.
7997     MemoryLocationsKind MLK = NO_LOCATIONS;
7998     if (isa<UndefValue>(Obj))
7999       continue;
8000     if (isa<Argument>(Obj)) {
8001       // TODO: For now we do not treat byval arguments as local copies performed
8002       // on the call edge, though, we should. To make that happen we need to
8003       // teach various passes, e.g., DSE, about the copy effect of a byval. That
8004       // would also allow us to mark functions only accessing byval arguments as
8005       // readnone again, atguably their acceses have no effect outside of the
8006       // function, like accesses to allocas.
8007       MLK = NO_ARGUMENT_MEM;
8008     } else if (auto *GV = dyn_cast<GlobalValue>(Obj)) {
8009       // Reading constant memory is not treated as a read "effect" by the
8010       // function attr pass so we won't neither. Constants defined by TBAA are
8011       // similar. (We know we do not write it because it is constant.)
8012       if (auto *GVar = dyn_cast<GlobalVariable>(GV))
8013         if (GVar->isConstant())
8014           continue;
8015 
8016       if (GV->hasLocalLinkage())
8017         MLK = NO_GLOBAL_INTERNAL_MEM;
8018       else
8019         MLK = NO_GLOBAL_EXTERNAL_MEM;
8020     } else if (isa<ConstantPointerNull>(Obj) &&
8021                !NullPointerIsDefined(getAssociatedFunction(),
8022                                      Ptr.getType()->getPointerAddressSpace())) {
8023       continue;
8024     } else if (isa<AllocaInst>(Obj)) {
8025       MLK = NO_LOCAL_MEM;
8026     } else if (const auto *CB = dyn_cast<CallBase>(Obj)) {
8027       const auto &NoAliasAA = A.getAAFor<AANoAlias>(
8028           *this, IRPosition::callsite_returned(*CB), DepClassTy::OPTIONAL);
8029       if (NoAliasAA.isAssumedNoAlias())
8030         MLK = NO_MALLOCED_MEM;
8031       else
8032         MLK = NO_UNKOWN_MEM;
8033     } else {
8034       MLK = NO_UNKOWN_MEM;
8035     }
8036 
8037     assert(MLK != NO_LOCATIONS && "No location specified!");
8038     LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Ptr value can be categorized: "
8039                       << *Obj << " -> " << getMemoryLocationsAsStr(MLK)
8040                       << "\n");
8041     updateStateAndAccessesMap(getState(), MLK, &I, Obj, Changed,
8042                               getAccessKindFromInst(&I));
8043   }
8044 
8045   LLVM_DEBUG(
8046       dbgs() << "[AAMemoryLocation] Accessed locations with pointer locations: "
8047              << getMemoryLocationsAsStr(State.getAssumed()) << "\n");
8048 }
8049 
8050 void AAMemoryLocationImpl::categorizeArgumentPointerLocations(
8051     Attributor &A, CallBase &CB, AAMemoryLocation::StateType &AccessedLocs,
8052     bool &Changed) {
8053   for (unsigned ArgNo = 0, E = CB.arg_size(); ArgNo < E; ++ArgNo) {
8054 
8055     // Skip non-pointer arguments.
8056     const Value *ArgOp = CB.getArgOperand(ArgNo);
8057     if (!ArgOp->getType()->isPtrOrPtrVectorTy())
8058       continue;
8059 
8060     // Skip readnone arguments.
8061     const IRPosition &ArgOpIRP = IRPosition::callsite_argument(CB, ArgNo);
8062     const auto &ArgOpMemLocationAA =
8063         A.getAAFor<AAMemoryBehavior>(*this, ArgOpIRP, DepClassTy::OPTIONAL);
8064 
8065     if (ArgOpMemLocationAA.isAssumedReadNone())
8066       continue;
8067 
8068     // Categorize potentially accessed pointer arguments as if there was an
8069     // access instruction with them as pointer.
8070     categorizePtrValue(A, CB, *ArgOp, AccessedLocs, Changed);
8071   }
8072 }
8073 
8074 AAMemoryLocation::MemoryLocationsKind
8075 AAMemoryLocationImpl::categorizeAccessedLocations(Attributor &A, Instruction &I,
8076                                                   bool &Changed) {
8077   LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Categorize accessed locations for "
8078                     << I << "\n");
8079 
8080   AAMemoryLocation::StateType AccessedLocs;
8081   AccessedLocs.intersectAssumedBits(NO_LOCATIONS);
8082 
8083   if (auto *CB = dyn_cast<CallBase>(&I)) {
8084 
8085     // First check if we assume any memory is access is visible.
8086     const auto &CBMemLocationAA = A.getAAFor<AAMemoryLocation>(
8087         *this, IRPosition::callsite_function(*CB), DepClassTy::OPTIONAL);
8088     LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Categorize call site: " << I
8089                       << " [" << CBMemLocationAA << "]\n");
8090 
8091     if (CBMemLocationAA.isAssumedReadNone())
8092       return NO_LOCATIONS;
8093 
8094     if (CBMemLocationAA.isAssumedInaccessibleMemOnly()) {
8095       updateStateAndAccessesMap(AccessedLocs, NO_INACCESSIBLE_MEM, &I, nullptr,
8096                                 Changed, getAccessKindFromInst(&I));
8097       return AccessedLocs.getAssumed();
8098     }
8099 
8100     uint32_t CBAssumedNotAccessedLocs =
8101         CBMemLocationAA.getAssumedNotAccessedLocation();
8102 
8103     // Set the argmemonly and global bit as we handle them separately below.
8104     uint32_t CBAssumedNotAccessedLocsNoArgMem =
8105         CBAssumedNotAccessedLocs | NO_ARGUMENT_MEM | NO_GLOBAL_MEM;
8106 
8107     for (MemoryLocationsKind CurMLK = 1; CurMLK < NO_LOCATIONS; CurMLK *= 2) {
8108       if (CBAssumedNotAccessedLocsNoArgMem & CurMLK)
8109         continue;
8110       updateStateAndAccessesMap(AccessedLocs, CurMLK, &I, nullptr, Changed,
8111                                 getAccessKindFromInst(&I));
8112     }
8113 
8114     // Now handle global memory if it might be accessed. This is slightly tricky
8115     // as NO_GLOBAL_MEM has multiple bits set.
8116     bool HasGlobalAccesses = ((~CBAssumedNotAccessedLocs) & NO_GLOBAL_MEM);
8117     if (HasGlobalAccesses) {
8118       auto AccessPred = [&](const Instruction *, const Value *Ptr,
8119                             AccessKind Kind, MemoryLocationsKind MLK) {
8120         updateStateAndAccessesMap(AccessedLocs, MLK, &I, Ptr, Changed,
8121                                   getAccessKindFromInst(&I));
8122         return true;
8123       };
8124       if (!CBMemLocationAA.checkForAllAccessesToMemoryKind(
8125               AccessPred, inverseLocation(NO_GLOBAL_MEM, false, false)))
8126         return AccessedLocs.getWorstState();
8127     }
8128 
8129     LLVM_DEBUG(
8130         dbgs() << "[AAMemoryLocation] Accessed state before argument handling: "
8131                << getMemoryLocationsAsStr(AccessedLocs.getAssumed()) << "\n");
8132 
8133     // Now handle argument memory if it might be accessed.
8134     bool HasArgAccesses = ((~CBAssumedNotAccessedLocs) & NO_ARGUMENT_MEM);
8135     if (HasArgAccesses)
8136       categorizeArgumentPointerLocations(A, *CB, AccessedLocs, Changed);
8137 
8138     LLVM_DEBUG(
8139         dbgs() << "[AAMemoryLocation] Accessed state after argument handling: "
8140                << getMemoryLocationsAsStr(AccessedLocs.getAssumed()) << "\n");
8141 
8142     return AccessedLocs.getAssumed();
8143   }
8144 
8145   if (const Value *Ptr = getPointerOperand(&I, /* AllowVolatile */ true)) {
8146     LLVM_DEBUG(
8147         dbgs() << "[AAMemoryLocation] Categorize memory access with pointer: "
8148                << I << " [" << *Ptr << "]\n");
8149     categorizePtrValue(A, I, *Ptr, AccessedLocs, Changed);
8150     return AccessedLocs.getAssumed();
8151   }
8152 
8153   LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Failed to categorize instruction: "
8154                     << I << "\n");
8155   updateStateAndAccessesMap(AccessedLocs, NO_UNKOWN_MEM, &I, nullptr, Changed,
8156                             getAccessKindFromInst(&I));
8157   return AccessedLocs.getAssumed();
8158 }
8159 
8160 /// An AA to represent the memory behavior function attributes.
8161 struct AAMemoryLocationFunction final : public AAMemoryLocationImpl {
8162   AAMemoryLocationFunction(const IRPosition &IRP, Attributor &A)
8163       : AAMemoryLocationImpl(IRP, A) {}
8164 
8165   /// See AbstractAttribute::updateImpl(Attributor &A).
8166   virtual ChangeStatus updateImpl(Attributor &A) override {
8167 
8168     const auto &MemBehaviorAA =
8169         A.getAAFor<AAMemoryBehavior>(*this, getIRPosition(), DepClassTy::NONE);
8170     if (MemBehaviorAA.isAssumedReadNone()) {
8171       if (MemBehaviorAA.isKnownReadNone())
8172         return indicateOptimisticFixpoint();
8173       assert(isAssumedReadNone() &&
8174              "AAMemoryLocation was not read-none but AAMemoryBehavior was!");
8175       A.recordDependence(MemBehaviorAA, *this, DepClassTy::OPTIONAL);
8176       return ChangeStatus::UNCHANGED;
8177     }
8178 
8179     // The current assumed state used to determine a change.
8180     auto AssumedState = getAssumed();
8181     bool Changed = false;
8182 
8183     auto CheckRWInst = [&](Instruction &I) {
8184       MemoryLocationsKind MLK = categorizeAccessedLocations(A, I, Changed);
8185       LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Accessed locations for " << I
8186                         << ": " << getMemoryLocationsAsStr(MLK) << "\n");
8187       removeAssumedBits(inverseLocation(MLK, false, false));
8188       // Stop once only the valid bit set in the *not assumed location*, thus
8189       // once we don't actually exclude any memory locations in the state.
8190       return getAssumedNotAccessedLocation() != VALID_STATE;
8191     };
8192 
8193     bool UsedAssumedInformation = false;
8194     if (!A.checkForAllReadWriteInstructions(CheckRWInst, *this,
8195                                             UsedAssumedInformation))
8196       return indicatePessimisticFixpoint();
8197 
8198     Changed |= AssumedState != getAssumed();
8199     return Changed ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED;
8200   }
8201 
8202   /// See AbstractAttribute::trackStatistics()
8203   void trackStatistics() const override {
8204     if (isAssumedReadNone())
8205       STATS_DECLTRACK_FN_ATTR(readnone)
8206     else if (isAssumedArgMemOnly())
8207       STATS_DECLTRACK_FN_ATTR(argmemonly)
8208     else if (isAssumedInaccessibleMemOnly())
8209       STATS_DECLTRACK_FN_ATTR(inaccessiblememonly)
8210     else if (isAssumedInaccessibleOrArgMemOnly())
8211       STATS_DECLTRACK_FN_ATTR(inaccessiblememorargmemonly)
8212   }
8213 };
8214 
8215 /// AAMemoryLocation attribute for call sites.
8216 struct AAMemoryLocationCallSite final : AAMemoryLocationImpl {
8217   AAMemoryLocationCallSite(const IRPosition &IRP, Attributor &A)
8218       : AAMemoryLocationImpl(IRP, A) {}
8219 
8220   /// See AbstractAttribute::initialize(...).
8221   void initialize(Attributor &A) override {
8222     AAMemoryLocationImpl::initialize(A);
8223     Function *F = getAssociatedFunction();
8224     if (!F || F->isDeclaration())
8225       indicatePessimisticFixpoint();
8226   }
8227 
8228   /// See AbstractAttribute::updateImpl(...).
8229   ChangeStatus updateImpl(Attributor &A) override {
8230     // TODO: Once we have call site specific value information we can provide
8231     //       call site specific liveness liveness information and then it makes
8232     //       sense to specialize attributes for call sites arguments instead of
8233     //       redirecting requests to the callee argument.
8234     Function *F = getAssociatedFunction();
8235     const IRPosition &FnPos = IRPosition::function(*F);
8236     auto &FnAA =
8237         A.getAAFor<AAMemoryLocation>(*this, FnPos, DepClassTy::REQUIRED);
8238     bool Changed = false;
8239     auto AccessPred = [&](const Instruction *I, const Value *Ptr,
8240                           AccessKind Kind, MemoryLocationsKind MLK) {
8241       updateStateAndAccessesMap(getState(), MLK, I, Ptr, Changed,
8242                                 getAccessKindFromInst(I));
8243       return true;
8244     };
8245     if (!FnAA.checkForAllAccessesToMemoryKind(AccessPred, ALL_LOCATIONS))
8246       return indicatePessimisticFixpoint();
8247     return Changed ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED;
8248   }
8249 
8250   /// See AbstractAttribute::trackStatistics()
8251   void trackStatistics() const override {
8252     if (isAssumedReadNone())
8253       STATS_DECLTRACK_CS_ATTR(readnone)
8254   }
8255 };
8256 } // namespace
8257 
8258 /// ------------------ Value Constant Range Attribute -------------------------
8259 
8260 namespace {
8261 struct AAValueConstantRangeImpl : AAValueConstantRange {
8262   using StateType = IntegerRangeState;
8263   AAValueConstantRangeImpl(const IRPosition &IRP, Attributor &A)
8264       : AAValueConstantRange(IRP, A) {}
8265 
8266   /// See AbstractAttribute::initialize(..).
8267   void initialize(Attributor &A) override {
8268     if (A.hasSimplificationCallback(getIRPosition())) {
8269       indicatePessimisticFixpoint();
8270       return;
8271     }
8272 
8273     // Intersect a range given by SCEV.
8274     intersectKnown(getConstantRangeFromSCEV(A, getCtxI()));
8275 
8276     // Intersect a range given by LVI.
8277     intersectKnown(getConstantRangeFromLVI(A, getCtxI()));
8278   }
8279 
8280   /// See AbstractAttribute::getAsStr().
8281   const std::string getAsStr() const override {
8282     std::string Str;
8283     llvm::raw_string_ostream OS(Str);
8284     OS << "range(" << getBitWidth() << ")<";
8285     getKnown().print(OS);
8286     OS << " / ";
8287     getAssumed().print(OS);
8288     OS << ">";
8289     return OS.str();
8290   }
8291 
8292   /// Helper function to get a SCEV expr for the associated value at program
8293   /// point \p I.
8294   const SCEV *getSCEV(Attributor &A, const Instruction *I = nullptr) const {
8295     if (!getAnchorScope())
8296       return nullptr;
8297 
8298     ScalarEvolution *SE =
8299         A.getInfoCache().getAnalysisResultForFunction<ScalarEvolutionAnalysis>(
8300             *getAnchorScope());
8301 
8302     LoopInfo *LI = A.getInfoCache().getAnalysisResultForFunction<LoopAnalysis>(
8303         *getAnchorScope());
8304 
8305     if (!SE || !LI)
8306       return nullptr;
8307 
8308     const SCEV *S = SE->getSCEV(&getAssociatedValue());
8309     if (!I)
8310       return S;
8311 
8312     return SE->getSCEVAtScope(S, LI->getLoopFor(I->getParent()));
8313   }
8314 
8315   /// Helper function to get a range from SCEV for the associated value at
8316   /// program point \p I.
8317   ConstantRange getConstantRangeFromSCEV(Attributor &A,
8318                                          const Instruction *I = nullptr) const {
8319     if (!getAnchorScope())
8320       return getWorstState(getBitWidth());
8321 
8322     ScalarEvolution *SE =
8323         A.getInfoCache().getAnalysisResultForFunction<ScalarEvolutionAnalysis>(
8324             *getAnchorScope());
8325 
8326     const SCEV *S = getSCEV(A, I);
8327     if (!SE || !S)
8328       return getWorstState(getBitWidth());
8329 
8330     return SE->getUnsignedRange(S);
8331   }
8332 
8333   /// Helper function to get a range from LVI for the associated value at
8334   /// program point \p I.
8335   ConstantRange
8336   getConstantRangeFromLVI(Attributor &A,
8337                           const Instruction *CtxI = nullptr) const {
8338     if (!getAnchorScope())
8339       return getWorstState(getBitWidth());
8340 
8341     LazyValueInfo *LVI =
8342         A.getInfoCache().getAnalysisResultForFunction<LazyValueAnalysis>(
8343             *getAnchorScope());
8344 
8345     if (!LVI || !CtxI)
8346       return getWorstState(getBitWidth());
8347     return LVI->getConstantRange(&getAssociatedValue(),
8348                                  const_cast<Instruction *>(CtxI));
8349   }
8350 
8351   /// Return true if \p CtxI is valid for querying outside analyses.
8352   /// This basically makes sure we do not ask intra-procedural analysis
8353   /// about a context in the wrong function or a context that violates
8354   /// dominance assumptions they might have. The \p AllowAACtxI flag indicates
8355   /// if the original context of this AA is OK or should be considered invalid.
8356   bool isValidCtxInstructionForOutsideAnalysis(Attributor &A,
8357                                                const Instruction *CtxI,
8358                                                bool AllowAACtxI) const {
8359     if (!CtxI || (!AllowAACtxI && CtxI == getCtxI()))
8360       return false;
8361 
8362     // Our context might be in a different function, neither intra-procedural
8363     // analysis (ScalarEvolution nor LazyValueInfo) can handle that.
8364     if (!AA::isValidInScope(getAssociatedValue(), CtxI->getFunction()))
8365       return false;
8366 
8367     // If the context is not dominated by the value there are paths to the
8368     // context that do not define the value. This cannot be handled by
8369     // LazyValueInfo so we need to bail.
8370     if (auto *I = dyn_cast<Instruction>(&getAssociatedValue())) {
8371       InformationCache &InfoCache = A.getInfoCache();
8372       const DominatorTree *DT =
8373           InfoCache.getAnalysisResultForFunction<DominatorTreeAnalysis>(
8374               *I->getFunction());
8375       return DT && DT->dominates(I, CtxI);
8376     }
8377 
8378     return true;
8379   }
8380 
8381   /// See AAValueConstantRange::getKnownConstantRange(..).
8382   ConstantRange
8383   getKnownConstantRange(Attributor &A,
8384                         const Instruction *CtxI = nullptr) const override {
8385     if (!isValidCtxInstructionForOutsideAnalysis(A, CtxI,
8386                                                  /* AllowAACtxI */ false))
8387       return getKnown();
8388 
8389     ConstantRange LVIR = getConstantRangeFromLVI(A, CtxI);
8390     ConstantRange SCEVR = getConstantRangeFromSCEV(A, CtxI);
8391     return getKnown().intersectWith(SCEVR).intersectWith(LVIR);
8392   }
8393 
8394   /// See AAValueConstantRange::getAssumedConstantRange(..).
8395   ConstantRange
8396   getAssumedConstantRange(Attributor &A,
8397                           const Instruction *CtxI = nullptr) const override {
8398     // TODO: Make SCEV use Attributor assumption.
8399     //       We may be able to bound a variable range via assumptions in
8400     //       Attributor. ex.) If x is assumed to be in [1, 3] and y is known to
8401     //       evolve to x^2 + x, then we can say that y is in [2, 12].
8402     if (!isValidCtxInstructionForOutsideAnalysis(A, CtxI,
8403                                                  /* AllowAACtxI */ false))
8404       return getAssumed();
8405 
8406     ConstantRange LVIR = getConstantRangeFromLVI(A, CtxI);
8407     ConstantRange SCEVR = getConstantRangeFromSCEV(A, CtxI);
8408     return getAssumed().intersectWith(SCEVR).intersectWith(LVIR);
8409   }
8410 
8411   /// Helper function to create MDNode for range metadata.
8412   static MDNode *
8413   getMDNodeForConstantRange(Type *Ty, LLVMContext &Ctx,
8414                             const ConstantRange &AssumedConstantRange) {
8415     Metadata *LowAndHigh[] = {ConstantAsMetadata::get(ConstantInt::get(
8416                                   Ty, AssumedConstantRange.getLower())),
8417                               ConstantAsMetadata::get(ConstantInt::get(
8418                                   Ty, AssumedConstantRange.getUpper()))};
8419     return MDNode::get(Ctx, LowAndHigh);
8420   }
8421 
8422   /// Return true if \p Assumed is included in \p KnownRanges.
8423   static bool isBetterRange(const ConstantRange &Assumed, MDNode *KnownRanges) {
8424 
8425     if (Assumed.isFullSet())
8426       return false;
8427 
8428     if (!KnownRanges)
8429       return true;
8430 
8431     // If multiple ranges are annotated in IR, we give up to annotate assumed
8432     // range for now.
8433 
8434     // TODO:  If there exists a known range which containts assumed range, we
8435     // can say assumed range is better.
8436     if (KnownRanges->getNumOperands() > 2)
8437       return false;
8438 
8439     ConstantInt *Lower =
8440         mdconst::extract<ConstantInt>(KnownRanges->getOperand(0));
8441     ConstantInt *Upper =
8442         mdconst::extract<ConstantInt>(KnownRanges->getOperand(1));
8443 
8444     ConstantRange Known(Lower->getValue(), Upper->getValue());
8445     return Known.contains(Assumed) && Known != Assumed;
8446   }
8447 
8448   /// Helper function to set range metadata.
8449   static bool
8450   setRangeMetadataIfisBetterRange(Instruction *I,
8451                                   const ConstantRange &AssumedConstantRange) {
8452     auto *OldRangeMD = I->getMetadata(LLVMContext::MD_range);
8453     if (isBetterRange(AssumedConstantRange, OldRangeMD)) {
8454       if (!AssumedConstantRange.isEmptySet()) {
8455         I->setMetadata(LLVMContext::MD_range,
8456                        getMDNodeForConstantRange(I->getType(), I->getContext(),
8457                                                  AssumedConstantRange));
8458         return true;
8459       }
8460     }
8461     return false;
8462   }
8463 
8464   /// See AbstractAttribute::manifest()
8465   ChangeStatus manifest(Attributor &A) override {
8466     ChangeStatus Changed = ChangeStatus::UNCHANGED;
8467     ConstantRange AssumedConstantRange = getAssumedConstantRange(A);
8468     assert(!AssumedConstantRange.isFullSet() && "Invalid state");
8469 
8470     auto &V = getAssociatedValue();
8471     if (!AssumedConstantRange.isEmptySet() &&
8472         !AssumedConstantRange.isSingleElement()) {
8473       if (Instruction *I = dyn_cast<Instruction>(&V)) {
8474         assert(I == getCtxI() && "Should not annotate an instruction which is "
8475                                  "not the context instruction");
8476         if (isa<CallInst>(I) || isa<LoadInst>(I))
8477           if (setRangeMetadataIfisBetterRange(I, AssumedConstantRange))
8478             Changed = ChangeStatus::CHANGED;
8479       }
8480     }
8481 
8482     return Changed;
8483   }
8484 };
8485 
8486 struct AAValueConstantRangeArgument final
8487     : AAArgumentFromCallSiteArguments<
8488           AAValueConstantRange, AAValueConstantRangeImpl, IntegerRangeState,
8489           true /* BridgeCallBaseContext */> {
8490   using Base = AAArgumentFromCallSiteArguments<
8491       AAValueConstantRange, AAValueConstantRangeImpl, IntegerRangeState,
8492       true /* BridgeCallBaseContext */>;
8493   AAValueConstantRangeArgument(const IRPosition &IRP, Attributor &A)
8494       : Base(IRP, A) {}
8495 
8496   /// See AbstractAttribute::initialize(..).
8497   void initialize(Attributor &A) override {
8498     if (!getAnchorScope() || getAnchorScope()->isDeclaration()) {
8499       indicatePessimisticFixpoint();
8500     } else {
8501       Base::initialize(A);
8502     }
8503   }
8504 
8505   /// See AbstractAttribute::trackStatistics()
8506   void trackStatistics() const override {
8507     STATS_DECLTRACK_ARG_ATTR(value_range)
8508   }
8509 };
8510 
8511 struct AAValueConstantRangeReturned
8512     : AAReturnedFromReturnedValues<AAValueConstantRange,
8513                                    AAValueConstantRangeImpl,
8514                                    AAValueConstantRangeImpl::StateType,
8515                                    /* PropogateCallBaseContext */ true> {
8516   using Base =
8517       AAReturnedFromReturnedValues<AAValueConstantRange,
8518                                    AAValueConstantRangeImpl,
8519                                    AAValueConstantRangeImpl::StateType,
8520                                    /* PropogateCallBaseContext */ true>;
8521   AAValueConstantRangeReturned(const IRPosition &IRP, Attributor &A)
8522       : Base(IRP, A) {}
8523 
8524   /// See AbstractAttribute::initialize(...).
8525   void initialize(Attributor &A) override {}
8526 
8527   /// See AbstractAttribute::trackStatistics()
8528   void trackStatistics() const override {
8529     STATS_DECLTRACK_FNRET_ATTR(value_range)
8530   }
8531 };
8532 
8533 struct AAValueConstantRangeFloating : AAValueConstantRangeImpl {
8534   AAValueConstantRangeFloating(const IRPosition &IRP, Attributor &A)
8535       : AAValueConstantRangeImpl(IRP, A) {}
8536 
8537   /// See AbstractAttribute::initialize(...).
8538   void initialize(Attributor &A) override {
8539     AAValueConstantRangeImpl::initialize(A);
8540     if (isAtFixpoint())
8541       return;
8542 
8543     Value &V = getAssociatedValue();
8544 
8545     if (auto *C = dyn_cast<ConstantInt>(&V)) {
8546       unionAssumed(ConstantRange(C->getValue()));
8547       indicateOptimisticFixpoint();
8548       return;
8549     }
8550 
8551     if (isa<UndefValue>(&V)) {
8552       // Collapse the undef state to 0.
8553       unionAssumed(ConstantRange(APInt(getBitWidth(), 0)));
8554       indicateOptimisticFixpoint();
8555       return;
8556     }
8557 
8558     if (isa<CallBase>(&V))
8559       return;
8560 
8561     if (isa<BinaryOperator>(&V) || isa<CmpInst>(&V) || isa<CastInst>(&V))
8562       return;
8563 
8564     // If it is a load instruction with range metadata, use it.
8565     if (LoadInst *LI = dyn_cast<LoadInst>(&V))
8566       if (auto *RangeMD = LI->getMetadata(LLVMContext::MD_range)) {
8567         intersectKnown(getConstantRangeFromMetadata(*RangeMD));
8568         return;
8569       }
8570 
8571     // We can work with PHI and select instruction as we traverse their operands
8572     // during update.
8573     if (isa<SelectInst>(V) || isa<PHINode>(V))
8574       return;
8575 
8576     // Otherwise we give up.
8577     indicatePessimisticFixpoint();
8578 
8579     LLVM_DEBUG(dbgs() << "[AAValueConstantRange] We give up: "
8580                       << getAssociatedValue() << "\n");
8581   }
8582 
8583   bool calculateBinaryOperator(
8584       Attributor &A, BinaryOperator *BinOp, IntegerRangeState &T,
8585       const Instruction *CtxI,
8586       SmallVectorImpl<const AAValueConstantRange *> &QuerriedAAs) {
8587     Value *LHS = BinOp->getOperand(0);
8588     Value *RHS = BinOp->getOperand(1);
8589 
8590     // Simplify the operands first.
8591     bool UsedAssumedInformation = false;
8592     const auto &SimplifiedLHS =
8593         A.getAssumedSimplified(IRPosition::value(*LHS, getCallBaseContext()),
8594                                *this, UsedAssumedInformation);
8595     if (!SimplifiedLHS.hasValue())
8596       return true;
8597     if (!SimplifiedLHS.getValue())
8598       return false;
8599     LHS = *SimplifiedLHS;
8600 
8601     const auto &SimplifiedRHS =
8602         A.getAssumedSimplified(IRPosition::value(*RHS, getCallBaseContext()),
8603                                *this, UsedAssumedInformation);
8604     if (!SimplifiedRHS.hasValue())
8605       return true;
8606     if (!SimplifiedRHS.getValue())
8607       return false;
8608     RHS = *SimplifiedRHS;
8609 
8610     // TODO: Allow non integers as well.
8611     if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy())
8612       return false;
8613 
8614     auto &LHSAA = A.getAAFor<AAValueConstantRange>(
8615         *this, IRPosition::value(*LHS, getCallBaseContext()),
8616         DepClassTy::REQUIRED);
8617     QuerriedAAs.push_back(&LHSAA);
8618     auto LHSAARange = LHSAA.getAssumedConstantRange(A, CtxI);
8619 
8620     auto &RHSAA = A.getAAFor<AAValueConstantRange>(
8621         *this, IRPosition::value(*RHS, getCallBaseContext()),
8622         DepClassTy::REQUIRED);
8623     QuerriedAAs.push_back(&RHSAA);
8624     auto RHSAARange = RHSAA.getAssumedConstantRange(A, CtxI);
8625 
8626     auto AssumedRange = LHSAARange.binaryOp(BinOp->getOpcode(), RHSAARange);
8627 
8628     T.unionAssumed(AssumedRange);
8629 
8630     // TODO: Track a known state too.
8631 
8632     return T.isValidState();
8633   }
8634 
8635   bool calculateCastInst(
8636       Attributor &A, CastInst *CastI, IntegerRangeState &T,
8637       const Instruction *CtxI,
8638       SmallVectorImpl<const AAValueConstantRange *> &QuerriedAAs) {
8639     assert(CastI->getNumOperands() == 1 && "Expected cast to be unary!");
8640     // TODO: Allow non integers as well.
8641     Value *OpV = CastI->getOperand(0);
8642 
8643     // Simplify the operand first.
8644     bool UsedAssumedInformation = false;
8645     const auto &SimplifiedOpV =
8646         A.getAssumedSimplified(IRPosition::value(*OpV, getCallBaseContext()),
8647                                *this, UsedAssumedInformation);
8648     if (!SimplifiedOpV.hasValue())
8649       return true;
8650     if (!SimplifiedOpV.getValue())
8651       return false;
8652     OpV = *SimplifiedOpV;
8653 
8654     if (!OpV->getType()->isIntegerTy())
8655       return false;
8656 
8657     auto &OpAA = A.getAAFor<AAValueConstantRange>(
8658         *this, IRPosition::value(*OpV, getCallBaseContext()),
8659         DepClassTy::REQUIRED);
8660     QuerriedAAs.push_back(&OpAA);
8661     T.unionAssumed(
8662         OpAA.getAssumed().castOp(CastI->getOpcode(), getState().getBitWidth()));
8663     return T.isValidState();
8664   }
8665 
8666   bool
8667   calculateCmpInst(Attributor &A, CmpInst *CmpI, IntegerRangeState &T,
8668                    const Instruction *CtxI,
8669                    SmallVectorImpl<const AAValueConstantRange *> &QuerriedAAs) {
8670     Value *LHS = CmpI->getOperand(0);
8671     Value *RHS = CmpI->getOperand(1);
8672 
8673     // Simplify the operands first.
8674     bool UsedAssumedInformation = false;
8675     const auto &SimplifiedLHS =
8676         A.getAssumedSimplified(IRPosition::value(*LHS, getCallBaseContext()),
8677                                *this, UsedAssumedInformation);
8678     if (!SimplifiedLHS.hasValue())
8679       return true;
8680     if (!SimplifiedLHS.getValue())
8681       return false;
8682     LHS = *SimplifiedLHS;
8683 
8684     const auto &SimplifiedRHS =
8685         A.getAssumedSimplified(IRPosition::value(*RHS, getCallBaseContext()),
8686                                *this, UsedAssumedInformation);
8687     if (!SimplifiedRHS.hasValue())
8688       return true;
8689     if (!SimplifiedRHS.getValue())
8690       return false;
8691     RHS = *SimplifiedRHS;
8692 
8693     // TODO: Allow non integers as well.
8694     if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy())
8695       return false;
8696 
8697     auto &LHSAA = A.getAAFor<AAValueConstantRange>(
8698         *this, IRPosition::value(*LHS, getCallBaseContext()),
8699         DepClassTy::REQUIRED);
8700     QuerriedAAs.push_back(&LHSAA);
8701     auto &RHSAA = A.getAAFor<AAValueConstantRange>(
8702         *this, IRPosition::value(*RHS, getCallBaseContext()),
8703         DepClassTy::REQUIRED);
8704     QuerriedAAs.push_back(&RHSAA);
8705     auto LHSAARange = LHSAA.getAssumedConstantRange(A, CtxI);
8706     auto RHSAARange = RHSAA.getAssumedConstantRange(A, CtxI);
8707 
8708     // If one of them is empty set, we can't decide.
8709     if (LHSAARange.isEmptySet() || RHSAARange.isEmptySet())
8710       return true;
8711 
8712     bool MustTrue = false, MustFalse = false;
8713 
8714     auto AllowedRegion =
8715         ConstantRange::makeAllowedICmpRegion(CmpI->getPredicate(), RHSAARange);
8716 
8717     if (AllowedRegion.intersectWith(LHSAARange).isEmptySet())
8718       MustFalse = true;
8719 
8720     if (LHSAARange.icmp(CmpI->getPredicate(), RHSAARange))
8721       MustTrue = true;
8722 
8723     assert((!MustTrue || !MustFalse) &&
8724            "Either MustTrue or MustFalse should be false!");
8725 
8726     if (MustTrue)
8727       T.unionAssumed(ConstantRange(APInt(/* numBits */ 1, /* val */ 1)));
8728     else if (MustFalse)
8729       T.unionAssumed(ConstantRange(APInt(/* numBits */ 1, /* val */ 0)));
8730     else
8731       T.unionAssumed(ConstantRange(/* BitWidth */ 1, /* isFullSet */ true));
8732 
8733     LLVM_DEBUG(dbgs() << "[AAValueConstantRange] " << *CmpI << " " << LHSAA
8734                       << " " << RHSAA << "\n");
8735 
8736     // TODO: Track a known state too.
8737     return T.isValidState();
8738   }
8739 
8740   /// See AbstractAttribute::updateImpl(...).
8741   ChangeStatus updateImpl(Attributor &A) override {
8742     auto VisitValueCB = [&](Value &V, const Instruction *CtxI,
8743                             IntegerRangeState &T, bool Stripped) -> bool {
8744       Instruction *I = dyn_cast<Instruction>(&V);
8745       if (!I || isa<CallBase>(I)) {
8746 
8747         // Simplify the operand first.
8748         bool UsedAssumedInformation = false;
8749         const auto &SimplifiedOpV =
8750             A.getAssumedSimplified(IRPosition::value(V, getCallBaseContext()),
8751                                    *this, UsedAssumedInformation);
8752         if (!SimplifiedOpV.hasValue())
8753           return true;
8754         if (!SimplifiedOpV.getValue())
8755           return false;
8756         Value *VPtr = *SimplifiedOpV;
8757 
8758         // If the value is not instruction, we query AA to Attributor.
8759         const auto &AA = A.getAAFor<AAValueConstantRange>(
8760             *this, IRPosition::value(*VPtr, getCallBaseContext()),
8761             DepClassTy::REQUIRED);
8762 
8763         // Clamp operator is not used to utilize a program point CtxI.
8764         T.unionAssumed(AA.getAssumedConstantRange(A, CtxI));
8765 
8766         return T.isValidState();
8767       }
8768 
8769       SmallVector<const AAValueConstantRange *, 4> QuerriedAAs;
8770       if (auto *BinOp = dyn_cast<BinaryOperator>(I)) {
8771         if (!calculateBinaryOperator(A, BinOp, T, CtxI, QuerriedAAs))
8772           return false;
8773       } else if (auto *CmpI = dyn_cast<CmpInst>(I)) {
8774         if (!calculateCmpInst(A, CmpI, T, CtxI, QuerriedAAs))
8775           return false;
8776       } else if (auto *CastI = dyn_cast<CastInst>(I)) {
8777         if (!calculateCastInst(A, CastI, T, CtxI, QuerriedAAs))
8778           return false;
8779       } else {
8780         // Give up with other instructions.
8781         // TODO: Add other instructions
8782 
8783         T.indicatePessimisticFixpoint();
8784         return false;
8785       }
8786 
8787       // Catch circular reasoning in a pessimistic way for now.
8788       // TODO: Check how the range evolves and if we stripped anything, see also
8789       //       AADereferenceable or AAAlign for similar situations.
8790       for (const AAValueConstantRange *QueriedAA : QuerriedAAs) {
8791         if (QueriedAA != this)
8792           continue;
8793         // If we are in a stady state we do not need to worry.
8794         if (T.getAssumed() == getState().getAssumed())
8795           continue;
8796         T.indicatePessimisticFixpoint();
8797       }
8798 
8799       return T.isValidState();
8800     };
8801 
8802     IntegerRangeState T(getBitWidth());
8803 
8804     bool UsedAssumedInformation = false;
8805     if (!genericValueTraversal<IntegerRangeState>(A, getIRPosition(), *this, T,
8806                                                   VisitValueCB, getCtxI(),
8807                                                   UsedAssumedInformation,
8808                                                   /* UseValueSimplify */ false))
8809       return indicatePessimisticFixpoint();
8810 
8811     // Ensure that long def-use chains can't cause circular reasoning either by
8812     // introducing a cutoff below.
8813     if (clampStateAndIndicateChange(getState(), T) == ChangeStatus::UNCHANGED)
8814       return ChangeStatus::UNCHANGED;
8815     if (++NumChanges > MaxNumChanges) {
8816       LLVM_DEBUG(dbgs() << "[AAValueConstantRange] performed " << NumChanges
8817                         << " but only " << MaxNumChanges
8818                         << " are allowed to avoid cyclic reasoning.");
8819       return indicatePessimisticFixpoint();
8820     }
8821     return ChangeStatus::CHANGED;
8822   }
8823 
8824   /// See AbstractAttribute::trackStatistics()
8825   void trackStatistics() const override {
8826     STATS_DECLTRACK_FLOATING_ATTR(value_range)
8827   }
8828 
8829   /// Tracker to bail after too many widening steps of the constant range.
8830   int NumChanges = 0;
8831 
8832   /// Upper bound for the number of allowed changes (=widening steps) for the
8833   /// constant range before we give up.
8834   static constexpr int MaxNumChanges = 5;
8835 };
8836 
8837 struct AAValueConstantRangeFunction : AAValueConstantRangeImpl {
8838   AAValueConstantRangeFunction(const IRPosition &IRP, Attributor &A)
8839       : AAValueConstantRangeImpl(IRP, A) {}
8840 
8841   /// See AbstractAttribute::initialize(...).
8842   ChangeStatus updateImpl(Attributor &A) override {
8843     llvm_unreachable("AAValueConstantRange(Function|CallSite)::updateImpl will "
8844                      "not be called");
8845   }
8846 
8847   /// See AbstractAttribute::trackStatistics()
8848   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(value_range) }
8849 };
8850 
8851 struct AAValueConstantRangeCallSite : AAValueConstantRangeFunction {
8852   AAValueConstantRangeCallSite(const IRPosition &IRP, Attributor &A)
8853       : AAValueConstantRangeFunction(IRP, A) {}
8854 
8855   /// See AbstractAttribute::trackStatistics()
8856   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(value_range) }
8857 };
8858 
8859 struct AAValueConstantRangeCallSiteReturned
8860     : AACallSiteReturnedFromReturned<AAValueConstantRange,
8861                                      AAValueConstantRangeImpl,
8862                                      AAValueConstantRangeImpl::StateType,
8863                                      /* IntroduceCallBaseContext */ true> {
8864   AAValueConstantRangeCallSiteReturned(const IRPosition &IRP, Attributor &A)
8865       : AACallSiteReturnedFromReturned<AAValueConstantRange,
8866                                        AAValueConstantRangeImpl,
8867                                        AAValueConstantRangeImpl::StateType,
8868                                        /* IntroduceCallBaseContext */ true>(IRP,
8869                                                                             A) {
8870   }
8871 
8872   /// See AbstractAttribute::initialize(...).
8873   void initialize(Attributor &A) override {
8874     // If it is a load instruction with range metadata, use the metadata.
8875     if (CallInst *CI = dyn_cast<CallInst>(&getAssociatedValue()))
8876       if (auto *RangeMD = CI->getMetadata(LLVMContext::MD_range))
8877         intersectKnown(getConstantRangeFromMetadata(*RangeMD));
8878 
8879     AAValueConstantRangeImpl::initialize(A);
8880   }
8881 
8882   /// See AbstractAttribute::trackStatistics()
8883   void trackStatistics() const override {
8884     STATS_DECLTRACK_CSRET_ATTR(value_range)
8885   }
8886 };
8887 struct AAValueConstantRangeCallSiteArgument : AAValueConstantRangeFloating {
8888   AAValueConstantRangeCallSiteArgument(const IRPosition &IRP, Attributor &A)
8889       : AAValueConstantRangeFloating(IRP, A) {}
8890 
8891   /// See AbstractAttribute::manifest()
8892   ChangeStatus manifest(Attributor &A) override {
8893     return ChangeStatus::UNCHANGED;
8894   }
8895 
8896   /// See AbstractAttribute::trackStatistics()
8897   void trackStatistics() const override {
8898     STATS_DECLTRACK_CSARG_ATTR(value_range)
8899   }
8900 };
8901 } // namespace
8902 
8903 /// ------------------ Potential Values Attribute -------------------------
8904 
8905 namespace {
8906 struct AAPotentialConstantValuesImpl : AAPotentialConstantValues {
8907   using StateType = PotentialConstantIntValuesState;
8908 
8909   AAPotentialConstantValuesImpl(const IRPosition &IRP, Attributor &A)
8910       : AAPotentialConstantValues(IRP, A) {}
8911 
8912   /// See AbstractAttribute::initialize(..).
8913   void initialize(Attributor &A) override {
8914     if (A.hasSimplificationCallback(getIRPosition()))
8915       indicatePessimisticFixpoint();
8916     else
8917       AAPotentialConstantValues::initialize(A);
8918   }
8919 
8920   /// See AbstractAttribute::getAsStr().
8921   const std::string getAsStr() const override {
8922     std::string Str;
8923     llvm::raw_string_ostream OS(Str);
8924     OS << getState();
8925     return OS.str();
8926   }
8927 
8928   /// See AbstractAttribute::updateImpl(...).
8929   ChangeStatus updateImpl(Attributor &A) override {
8930     return indicatePessimisticFixpoint();
8931   }
8932 };
8933 
8934 struct AAPotentialConstantValuesArgument final
8935     : AAArgumentFromCallSiteArguments<AAPotentialConstantValues,
8936                                       AAPotentialConstantValuesImpl,
8937                                       PotentialConstantIntValuesState> {
8938   using Base = AAArgumentFromCallSiteArguments<AAPotentialConstantValues,
8939                                                AAPotentialConstantValuesImpl,
8940                                                PotentialConstantIntValuesState>;
8941   AAPotentialConstantValuesArgument(const IRPosition &IRP, Attributor &A)
8942       : Base(IRP, A) {}
8943 
8944   /// See AbstractAttribute::initialize(..).
8945   void initialize(Attributor &A) override {
8946     if (!getAnchorScope() || getAnchorScope()->isDeclaration()) {
8947       indicatePessimisticFixpoint();
8948     } else {
8949       Base::initialize(A);
8950     }
8951   }
8952 
8953   /// See AbstractAttribute::trackStatistics()
8954   void trackStatistics() const override {
8955     STATS_DECLTRACK_ARG_ATTR(potential_values)
8956   }
8957 };
8958 
8959 struct AAPotentialConstantValuesReturned
8960     : AAReturnedFromReturnedValues<AAPotentialConstantValues,
8961                                    AAPotentialConstantValuesImpl> {
8962   using Base = AAReturnedFromReturnedValues<AAPotentialConstantValues,
8963                                             AAPotentialConstantValuesImpl>;
8964   AAPotentialConstantValuesReturned(const IRPosition &IRP, Attributor &A)
8965       : Base(IRP, A) {}
8966 
8967   /// See AbstractAttribute::trackStatistics()
8968   void trackStatistics() const override {
8969     STATS_DECLTRACK_FNRET_ATTR(potential_values)
8970   }
8971 };
8972 
8973 struct AAPotentialConstantValuesFloating : AAPotentialConstantValuesImpl {
8974   AAPotentialConstantValuesFloating(const IRPosition &IRP, Attributor &A)
8975       : AAPotentialConstantValuesImpl(IRP, A) {}
8976 
8977   /// See AbstractAttribute::initialize(..).
8978   void initialize(Attributor &A) override {
8979     AAPotentialConstantValuesImpl::initialize(A);
8980     if (isAtFixpoint())
8981       return;
8982 
8983     Value &V = getAssociatedValue();
8984 
8985     if (auto *C = dyn_cast<ConstantInt>(&V)) {
8986       unionAssumed(C->getValue());
8987       indicateOptimisticFixpoint();
8988       return;
8989     }
8990 
8991     if (isa<UndefValue>(&V)) {
8992       unionAssumedWithUndef();
8993       indicateOptimisticFixpoint();
8994       return;
8995     }
8996 
8997     if (isa<BinaryOperator>(&V) || isa<ICmpInst>(&V) || isa<CastInst>(&V))
8998       return;
8999 
9000     if (isa<SelectInst>(V) || isa<PHINode>(V) || isa<LoadInst>(V))
9001       return;
9002 
9003     indicatePessimisticFixpoint();
9004 
9005     LLVM_DEBUG(dbgs() << "[AAPotentialConstantValues] We give up: "
9006                       << getAssociatedValue() << "\n");
9007   }
9008 
9009   static bool calculateICmpInst(const ICmpInst *ICI, const APInt &LHS,
9010                                 const APInt &RHS) {
9011     return ICmpInst::compare(LHS, RHS, ICI->getPredicate());
9012   }
9013 
9014   static APInt calculateCastInst(const CastInst *CI, const APInt &Src,
9015                                  uint32_t ResultBitWidth) {
9016     Instruction::CastOps CastOp = CI->getOpcode();
9017     switch (CastOp) {
9018     default:
9019       llvm_unreachable("unsupported or not integer cast");
9020     case Instruction::Trunc:
9021       return Src.trunc(ResultBitWidth);
9022     case Instruction::SExt:
9023       return Src.sext(ResultBitWidth);
9024     case Instruction::ZExt:
9025       return Src.zext(ResultBitWidth);
9026     case Instruction::BitCast:
9027       return Src;
9028     }
9029   }
9030 
9031   static APInt calculateBinaryOperator(const BinaryOperator *BinOp,
9032                                        const APInt &LHS, const APInt &RHS,
9033                                        bool &SkipOperation, bool &Unsupported) {
9034     Instruction::BinaryOps BinOpcode = BinOp->getOpcode();
9035     // Unsupported is set to true when the binary operator is not supported.
9036     // SkipOperation is set to true when UB occur with the given operand pair
9037     // (LHS, RHS).
9038     // TODO: we should look at nsw and nuw keywords to handle operations
9039     //       that create poison or undef value.
9040     switch (BinOpcode) {
9041     default:
9042       Unsupported = true;
9043       return LHS;
9044     case Instruction::Add:
9045       return LHS + RHS;
9046     case Instruction::Sub:
9047       return LHS - RHS;
9048     case Instruction::Mul:
9049       return LHS * RHS;
9050     case Instruction::UDiv:
9051       if (RHS.isZero()) {
9052         SkipOperation = true;
9053         return LHS;
9054       }
9055       return LHS.udiv(RHS);
9056     case Instruction::SDiv:
9057       if (RHS.isZero()) {
9058         SkipOperation = true;
9059         return LHS;
9060       }
9061       return LHS.sdiv(RHS);
9062     case Instruction::URem:
9063       if (RHS.isZero()) {
9064         SkipOperation = true;
9065         return LHS;
9066       }
9067       return LHS.urem(RHS);
9068     case Instruction::SRem:
9069       if (RHS.isZero()) {
9070         SkipOperation = true;
9071         return LHS;
9072       }
9073       return LHS.srem(RHS);
9074     case Instruction::Shl:
9075       return LHS.shl(RHS);
9076     case Instruction::LShr:
9077       return LHS.lshr(RHS);
9078     case Instruction::AShr:
9079       return LHS.ashr(RHS);
9080     case Instruction::And:
9081       return LHS & RHS;
9082     case Instruction::Or:
9083       return LHS | RHS;
9084     case Instruction::Xor:
9085       return LHS ^ RHS;
9086     }
9087   }
9088 
9089   bool calculateBinaryOperatorAndTakeUnion(const BinaryOperator *BinOp,
9090                                            const APInt &LHS, const APInt &RHS) {
9091     bool SkipOperation = false;
9092     bool Unsupported = false;
9093     APInt Result =
9094         calculateBinaryOperator(BinOp, LHS, RHS, SkipOperation, Unsupported);
9095     if (Unsupported)
9096       return false;
9097     // If SkipOperation is true, we can ignore this operand pair (L, R).
9098     if (!SkipOperation)
9099       unionAssumed(Result);
9100     return isValidState();
9101   }
9102 
9103   ChangeStatus updateWithICmpInst(Attributor &A, ICmpInst *ICI) {
9104     auto AssumedBefore = getAssumed();
9105     Value *LHS = ICI->getOperand(0);
9106     Value *RHS = ICI->getOperand(1);
9107 
9108     // Simplify the operands first.
9109     bool UsedAssumedInformation = false;
9110     const auto &SimplifiedLHS =
9111         A.getAssumedSimplified(IRPosition::value(*LHS, getCallBaseContext()),
9112                                *this, UsedAssumedInformation);
9113     if (!SimplifiedLHS.hasValue())
9114       return ChangeStatus::UNCHANGED;
9115     if (!SimplifiedLHS.getValue())
9116       return indicatePessimisticFixpoint();
9117     LHS = *SimplifiedLHS;
9118 
9119     const auto &SimplifiedRHS =
9120         A.getAssumedSimplified(IRPosition::value(*RHS, getCallBaseContext()),
9121                                *this, UsedAssumedInformation);
9122     if (!SimplifiedRHS.hasValue())
9123       return ChangeStatus::UNCHANGED;
9124     if (!SimplifiedRHS.getValue())
9125       return indicatePessimisticFixpoint();
9126     RHS = *SimplifiedRHS;
9127 
9128     if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy())
9129       return indicatePessimisticFixpoint();
9130 
9131     auto &LHSAA = A.getAAFor<AAPotentialConstantValues>(
9132         *this, IRPosition::value(*LHS), DepClassTy::REQUIRED);
9133     if (!LHSAA.isValidState())
9134       return indicatePessimisticFixpoint();
9135 
9136     auto &RHSAA = A.getAAFor<AAPotentialConstantValues>(
9137         *this, IRPosition::value(*RHS), DepClassTy::REQUIRED);
9138     if (!RHSAA.isValidState())
9139       return indicatePessimisticFixpoint();
9140 
9141     const SetTy &LHSAAPVS = LHSAA.getAssumedSet();
9142     const SetTy &RHSAAPVS = RHSAA.getAssumedSet();
9143 
9144     // TODO: make use of undef flag to limit potential values aggressively.
9145     bool MaybeTrue = false, MaybeFalse = false;
9146     const APInt Zero(RHS->getType()->getIntegerBitWidth(), 0);
9147     if (LHSAA.undefIsContained() && RHSAA.undefIsContained()) {
9148       // The result of any comparison between undefs can be soundly replaced
9149       // with undef.
9150       unionAssumedWithUndef();
9151     } else if (LHSAA.undefIsContained()) {
9152       for (const APInt &R : RHSAAPVS) {
9153         bool CmpResult = calculateICmpInst(ICI, Zero, R);
9154         MaybeTrue |= CmpResult;
9155         MaybeFalse |= !CmpResult;
9156         if (MaybeTrue & MaybeFalse)
9157           return indicatePessimisticFixpoint();
9158       }
9159     } else if (RHSAA.undefIsContained()) {
9160       for (const APInt &L : LHSAAPVS) {
9161         bool CmpResult = calculateICmpInst(ICI, L, Zero);
9162         MaybeTrue |= CmpResult;
9163         MaybeFalse |= !CmpResult;
9164         if (MaybeTrue & MaybeFalse)
9165           return indicatePessimisticFixpoint();
9166       }
9167     } else {
9168       for (const APInt &L : LHSAAPVS) {
9169         for (const APInt &R : RHSAAPVS) {
9170           bool CmpResult = calculateICmpInst(ICI, L, R);
9171           MaybeTrue |= CmpResult;
9172           MaybeFalse |= !CmpResult;
9173           if (MaybeTrue & MaybeFalse)
9174             return indicatePessimisticFixpoint();
9175         }
9176       }
9177     }
9178     if (MaybeTrue)
9179       unionAssumed(APInt(/* numBits */ 1, /* val */ 1));
9180     if (MaybeFalse)
9181       unionAssumed(APInt(/* numBits */ 1, /* val */ 0));
9182     return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED
9183                                          : ChangeStatus::CHANGED;
9184   }
9185 
9186   ChangeStatus updateWithSelectInst(Attributor &A, SelectInst *SI) {
9187     auto AssumedBefore = getAssumed();
9188     Value *LHS = SI->getTrueValue();
9189     Value *RHS = SI->getFalseValue();
9190 
9191     // Simplify the operands first.
9192     bool UsedAssumedInformation = false;
9193     const auto &SimplifiedLHS =
9194         A.getAssumedSimplified(IRPosition::value(*LHS, getCallBaseContext()),
9195                                *this, UsedAssumedInformation);
9196     if (!SimplifiedLHS.hasValue())
9197       return ChangeStatus::UNCHANGED;
9198     if (!SimplifiedLHS.getValue())
9199       return indicatePessimisticFixpoint();
9200     LHS = *SimplifiedLHS;
9201 
9202     const auto &SimplifiedRHS =
9203         A.getAssumedSimplified(IRPosition::value(*RHS, getCallBaseContext()),
9204                                *this, UsedAssumedInformation);
9205     if (!SimplifiedRHS.hasValue())
9206       return ChangeStatus::UNCHANGED;
9207     if (!SimplifiedRHS.getValue())
9208       return indicatePessimisticFixpoint();
9209     RHS = *SimplifiedRHS;
9210 
9211     if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy())
9212       return indicatePessimisticFixpoint();
9213 
9214     Optional<Constant *> C = A.getAssumedConstant(*SI->getCondition(), *this,
9215                                                   UsedAssumedInformation);
9216 
9217     // Check if we only need one operand.
9218     bool OnlyLeft = false, OnlyRight = false;
9219     if (C.hasValue() && *C && (*C)->isOneValue())
9220       OnlyLeft = true;
9221     else if (C.hasValue() && *C && (*C)->isZeroValue())
9222       OnlyRight = true;
9223 
9224     const AAPotentialConstantValues *LHSAA = nullptr, *RHSAA = nullptr;
9225     if (!OnlyRight) {
9226       LHSAA = &A.getAAFor<AAPotentialConstantValues>(
9227           *this, IRPosition::value(*LHS), DepClassTy::REQUIRED);
9228       if (!LHSAA->isValidState())
9229         return indicatePessimisticFixpoint();
9230     }
9231     if (!OnlyLeft) {
9232       RHSAA = &A.getAAFor<AAPotentialConstantValues>(
9233           *this, IRPosition::value(*RHS), DepClassTy::REQUIRED);
9234       if (!RHSAA->isValidState())
9235         return indicatePessimisticFixpoint();
9236     }
9237 
9238     if (!LHSAA || !RHSAA) {
9239       // select (true/false), lhs, rhs
9240       auto *OpAA = LHSAA ? LHSAA : RHSAA;
9241 
9242       if (OpAA->undefIsContained())
9243         unionAssumedWithUndef();
9244       else
9245         unionAssumed(*OpAA);
9246 
9247     } else if (LHSAA->undefIsContained() && RHSAA->undefIsContained()) {
9248       // select i1 *, undef , undef => undef
9249       unionAssumedWithUndef();
9250     } else {
9251       unionAssumed(*LHSAA);
9252       unionAssumed(*RHSAA);
9253     }
9254     return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED
9255                                          : ChangeStatus::CHANGED;
9256   }
9257 
9258   ChangeStatus updateWithCastInst(Attributor &A, CastInst *CI) {
9259     auto AssumedBefore = getAssumed();
9260     if (!CI->isIntegerCast())
9261       return indicatePessimisticFixpoint();
9262     assert(CI->getNumOperands() == 1 && "Expected cast to be unary!");
9263     uint32_t ResultBitWidth = CI->getDestTy()->getIntegerBitWidth();
9264     Value *Src = CI->getOperand(0);
9265 
9266     // Simplify the operand first.
9267     bool UsedAssumedInformation = false;
9268     const auto &SimplifiedSrc =
9269         A.getAssumedSimplified(IRPosition::value(*Src, getCallBaseContext()),
9270                                *this, UsedAssumedInformation);
9271     if (!SimplifiedSrc.hasValue())
9272       return ChangeStatus::UNCHANGED;
9273     if (!SimplifiedSrc.getValue())
9274       return indicatePessimisticFixpoint();
9275     Src = *SimplifiedSrc;
9276 
9277     auto &SrcAA = A.getAAFor<AAPotentialConstantValues>(
9278         *this, IRPosition::value(*Src), DepClassTy::REQUIRED);
9279     if (!SrcAA.isValidState())
9280       return indicatePessimisticFixpoint();
9281     const SetTy &SrcAAPVS = SrcAA.getAssumedSet();
9282     if (SrcAA.undefIsContained())
9283       unionAssumedWithUndef();
9284     else {
9285       for (const APInt &S : SrcAAPVS) {
9286         APInt T = calculateCastInst(CI, S, ResultBitWidth);
9287         unionAssumed(T);
9288       }
9289     }
9290     return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED
9291                                          : ChangeStatus::CHANGED;
9292   }
9293 
9294   ChangeStatus updateWithBinaryOperator(Attributor &A, BinaryOperator *BinOp) {
9295     auto AssumedBefore = getAssumed();
9296     Value *LHS = BinOp->getOperand(0);
9297     Value *RHS = BinOp->getOperand(1);
9298 
9299     // Simplify the operands first.
9300     bool UsedAssumedInformation = false;
9301     const auto &SimplifiedLHS =
9302         A.getAssumedSimplified(IRPosition::value(*LHS, getCallBaseContext()),
9303                                *this, UsedAssumedInformation);
9304     if (!SimplifiedLHS.hasValue())
9305       return ChangeStatus::UNCHANGED;
9306     if (!SimplifiedLHS.getValue())
9307       return indicatePessimisticFixpoint();
9308     LHS = *SimplifiedLHS;
9309 
9310     const auto &SimplifiedRHS =
9311         A.getAssumedSimplified(IRPosition::value(*RHS, getCallBaseContext()),
9312                                *this, UsedAssumedInformation);
9313     if (!SimplifiedRHS.hasValue())
9314       return ChangeStatus::UNCHANGED;
9315     if (!SimplifiedRHS.getValue())
9316       return indicatePessimisticFixpoint();
9317     RHS = *SimplifiedRHS;
9318 
9319     if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy())
9320       return indicatePessimisticFixpoint();
9321 
9322     auto &LHSAA = A.getAAFor<AAPotentialConstantValues>(
9323         *this, IRPosition::value(*LHS), DepClassTy::REQUIRED);
9324     if (!LHSAA.isValidState())
9325       return indicatePessimisticFixpoint();
9326 
9327     auto &RHSAA = A.getAAFor<AAPotentialConstantValues>(
9328         *this, IRPosition::value(*RHS), DepClassTy::REQUIRED);
9329     if (!RHSAA.isValidState())
9330       return indicatePessimisticFixpoint();
9331 
9332     const SetTy &LHSAAPVS = LHSAA.getAssumedSet();
9333     const SetTy &RHSAAPVS = RHSAA.getAssumedSet();
9334     const APInt Zero = APInt(LHS->getType()->getIntegerBitWidth(), 0);
9335 
9336     // TODO: make use of undef flag to limit potential values aggressively.
9337     if (LHSAA.undefIsContained() && RHSAA.undefIsContained()) {
9338       if (!calculateBinaryOperatorAndTakeUnion(BinOp, Zero, Zero))
9339         return indicatePessimisticFixpoint();
9340     } else if (LHSAA.undefIsContained()) {
9341       for (const APInt &R : RHSAAPVS) {
9342         if (!calculateBinaryOperatorAndTakeUnion(BinOp, Zero, R))
9343           return indicatePessimisticFixpoint();
9344       }
9345     } else if (RHSAA.undefIsContained()) {
9346       for (const APInt &L : LHSAAPVS) {
9347         if (!calculateBinaryOperatorAndTakeUnion(BinOp, L, Zero))
9348           return indicatePessimisticFixpoint();
9349       }
9350     } else {
9351       for (const APInt &L : LHSAAPVS) {
9352         for (const APInt &R : RHSAAPVS) {
9353           if (!calculateBinaryOperatorAndTakeUnion(BinOp, L, R))
9354             return indicatePessimisticFixpoint();
9355         }
9356       }
9357     }
9358     return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED
9359                                          : ChangeStatus::CHANGED;
9360   }
9361 
9362   ChangeStatus updateWithPHINode(Attributor &A, PHINode *PHI) {
9363     auto AssumedBefore = getAssumed();
9364     for (unsigned u = 0, e = PHI->getNumIncomingValues(); u < e; u++) {
9365       Value *IncomingValue = PHI->getIncomingValue(u);
9366 
9367       // Simplify the operand first.
9368       bool UsedAssumedInformation = false;
9369       const auto &SimplifiedIncomingValue = A.getAssumedSimplified(
9370           IRPosition::value(*IncomingValue, getCallBaseContext()), *this,
9371           UsedAssumedInformation);
9372       if (!SimplifiedIncomingValue.hasValue())
9373         continue;
9374       if (!SimplifiedIncomingValue.getValue())
9375         return indicatePessimisticFixpoint();
9376       IncomingValue = *SimplifiedIncomingValue;
9377 
9378       auto &PotentialValuesAA = A.getAAFor<AAPotentialConstantValues>(
9379           *this, IRPosition::value(*IncomingValue), DepClassTy::REQUIRED);
9380       if (!PotentialValuesAA.isValidState())
9381         return indicatePessimisticFixpoint();
9382       if (PotentialValuesAA.undefIsContained())
9383         unionAssumedWithUndef();
9384       else
9385         unionAssumed(PotentialValuesAA.getAssumed());
9386     }
9387     return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED
9388                                          : ChangeStatus::CHANGED;
9389   }
9390 
9391   /// See AbstractAttribute::updateImpl(...).
9392   ChangeStatus updateImpl(Attributor &A) override {
9393     Value &V = getAssociatedValue();
9394     Instruction *I = dyn_cast<Instruction>(&V);
9395 
9396     if (auto *ICI = dyn_cast<ICmpInst>(I))
9397       return updateWithICmpInst(A, ICI);
9398 
9399     if (auto *SI = dyn_cast<SelectInst>(I))
9400       return updateWithSelectInst(A, SI);
9401 
9402     if (auto *CI = dyn_cast<CastInst>(I))
9403       return updateWithCastInst(A, CI);
9404 
9405     if (auto *BinOp = dyn_cast<BinaryOperator>(I))
9406       return updateWithBinaryOperator(A, BinOp);
9407 
9408     if (auto *PHI = dyn_cast<PHINode>(I))
9409       return updateWithPHINode(A, PHI);
9410 
9411     return indicatePessimisticFixpoint();
9412   }
9413 
9414   /// See AbstractAttribute::trackStatistics()
9415   void trackStatistics() const override {
9416     STATS_DECLTRACK_FLOATING_ATTR(potential_values)
9417   }
9418 };
9419 
9420 struct AAPotentialConstantValuesFunction : AAPotentialConstantValuesImpl {
9421   AAPotentialConstantValuesFunction(const IRPosition &IRP, Attributor &A)
9422       : AAPotentialConstantValuesImpl(IRP, A) {}
9423 
9424   /// See AbstractAttribute::initialize(...).
9425   ChangeStatus updateImpl(Attributor &A) override {
9426     llvm_unreachable(
9427         "AAPotentialConstantValues(Function|CallSite)::updateImpl will "
9428         "not be called");
9429   }
9430 
9431   /// See AbstractAttribute::trackStatistics()
9432   void trackStatistics() const override {
9433     STATS_DECLTRACK_FN_ATTR(potential_values)
9434   }
9435 };
9436 
9437 struct AAPotentialConstantValuesCallSite : AAPotentialConstantValuesFunction {
9438   AAPotentialConstantValuesCallSite(const IRPosition &IRP, Attributor &A)
9439       : AAPotentialConstantValuesFunction(IRP, A) {}
9440 
9441   /// See AbstractAttribute::trackStatistics()
9442   void trackStatistics() const override {
9443     STATS_DECLTRACK_CS_ATTR(potential_values)
9444   }
9445 };
9446 
9447 struct AAPotentialConstantValuesCallSiteReturned
9448     : AACallSiteReturnedFromReturned<AAPotentialConstantValues,
9449                                      AAPotentialConstantValuesImpl> {
9450   AAPotentialConstantValuesCallSiteReturned(const IRPosition &IRP,
9451                                             Attributor &A)
9452       : AACallSiteReturnedFromReturned<AAPotentialConstantValues,
9453                                        AAPotentialConstantValuesImpl>(IRP, A) {}
9454 
9455   /// See AbstractAttribute::trackStatistics()
9456   void trackStatistics() const override {
9457     STATS_DECLTRACK_CSRET_ATTR(potential_values)
9458   }
9459 };
9460 
9461 struct AAPotentialConstantValuesCallSiteArgument
9462     : AAPotentialConstantValuesFloating {
9463   AAPotentialConstantValuesCallSiteArgument(const IRPosition &IRP,
9464                                             Attributor &A)
9465       : AAPotentialConstantValuesFloating(IRP, A) {}
9466 
9467   /// See AbstractAttribute::initialize(..).
9468   void initialize(Attributor &A) override {
9469     AAPotentialConstantValuesImpl::initialize(A);
9470     if (isAtFixpoint())
9471       return;
9472 
9473     Value &V = getAssociatedValue();
9474 
9475     if (auto *C = dyn_cast<ConstantInt>(&V)) {
9476       unionAssumed(C->getValue());
9477       indicateOptimisticFixpoint();
9478       return;
9479     }
9480 
9481     if (isa<UndefValue>(&V)) {
9482       unionAssumedWithUndef();
9483       indicateOptimisticFixpoint();
9484       return;
9485     }
9486   }
9487 
9488   /// See AbstractAttribute::updateImpl(...).
9489   ChangeStatus updateImpl(Attributor &A) override {
9490     Value &V = getAssociatedValue();
9491     auto AssumedBefore = getAssumed();
9492     auto &AA = A.getAAFor<AAPotentialConstantValues>(
9493         *this, IRPosition::value(V), DepClassTy::REQUIRED);
9494     const auto &S = AA.getAssumed();
9495     unionAssumed(S);
9496     return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED
9497                                          : ChangeStatus::CHANGED;
9498   }
9499 
9500   /// See AbstractAttribute::trackStatistics()
9501   void trackStatistics() const override {
9502     STATS_DECLTRACK_CSARG_ATTR(potential_values)
9503   }
9504 };
9505 
9506 /// ------------------------ NoUndef Attribute ---------------------------------
9507 struct AANoUndefImpl : AANoUndef {
9508   AANoUndefImpl(const IRPosition &IRP, Attributor &A) : AANoUndef(IRP, A) {}
9509 
9510   /// See AbstractAttribute::initialize(...).
9511   void initialize(Attributor &A) override {
9512     if (getIRPosition().hasAttr({Attribute::NoUndef})) {
9513       indicateOptimisticFixpoint();
9514       return;
9515     }
9516     Value &V = getAssociatedValue();
9517     if (isa<UndefValue>(V))
9518       indicatePessimisticFixpoint();
9519     else if (isa<FreezeInst>(V))
9520       indicateOptimisticFixpoint();
9521     else if (getPositionKind() != IRPosition::IRP_RETURNED &&
9522              isGuaranteedNotToBeUndefOrPoison(&V))
9523       indicateOptimisticFixpoint();
9524     else
9525       AANoUndef::initialize(A);
9526   }
9527 
9528   /// See followUsesInMBEC
9529   bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I,
9530                        AANoUndef::StateType &State) {
9531     const Value *UseV = U->get();
9532     const DominatorTree *DT = nullptr;
9533     AssumptionCache *AC = nullptr;
9534     InformationCache &InfoCache = A.getInfoCache();
9535     if (Function *F = getAnchorScope()) {
9536       DT = InfoCache.getAnalysisResultForFunction<DominatorTreeAnalysis>(*F);
9537       AC = InfoCache.getAnalysisResultForFunction<AssumptionAnalysis>(*F);
9538     }
9539     State.setKnown(isGuaranteedNotToBeUndefOrPoison(UseV, AC, I, DT));
9540     bool TrackUse = false;
9541     // Track use for instructions which must produce undef or poison bits when
9542     // at least one operand contains such bits.
9543     if (isa<CastInst>(*I) || isa<GetElementPtrInst>(*I))
9544       TrackUse = true;
9545     return TrackUse;
9546   }
9547 
9548   /// See AbstractAttribute::getAsStr().
9549   const std::string getAsStr() const override {
9550     return getAssumed() ? "noundef" : "may-undef-or-poison";
9551   }
9552 
9553   ChangeStatus manifest(Attributor &A) override {
9554     // We don't manifest noundef attribute for dead positions because the
9555     // associated values with dead positions would be replaced with undef
9556     // values.
9557     bool UsedAssumedInformation = false;
9558     if (A.isAssumedDead(getIRPosition(), nullptr, nullptr,
9559                         UsedAssumedInformation))
9560       return ChangeStatus::UNCHANGED;
9561     // A position whose simplified value does not have any value is
9562     // considered to be dead. We don't manifest noundef in such positions for
9563     // the same reason above.
9564     if (!A.getAssumedSimplified(getIRPosition(), *this, UsedAssumedInformation)
9565              .hasValue())
9566       return ChangeStatus::UNCHANGED;
9567     return AANoUndef::manifest(A);
9568   }
9569 };
9570 
9571 struct AANoUndefFloating : public AANoUndefImpl {
9572   AANoUndefFloating(const IRPosition &IRP, Attributor &A)
9573       : AANoUndefImpl(IRP, A) {}
9574 
9575   /// See AbstractAttribute::initialize(...).
9576   void initialize(Attributor &A) override {
9577     AANoUndefImpl::initialize(A);
9578     if (!getState().isAtFixpoint())
9579       if (Instruction *CtxI = getCtxI())
9580         followUsesInMBEC(*this, A, getState(), *CtxI);
9581   }
9582 
9583   /// See AbstractAttribute::updateImpl(...).
9584   ChangeStatus updateImpl(Attributor &A) override {
9585     auto VisitValueCB = [&](Value &V, const Instruction *CtxI,
9586                             AANoUndef::StateType &T, bool Stripped) -> bool {
9587       const auto &AA = A.getAAFor<AANoUndef>(*this, IRPosition::value(V),
9588                                              DepClassTy::REQUIRED);
9589       if (!Stripped && this == &AA) {
9590         T.indicatePessimisticFixpoint();
9591       } else {
9592         const AANoUndef::StateType &S =
9593             static_cast<const AANoUndef::StateType &>(AA.getState());
9594         T ^= S;
9595       }
9596       return T.isValidState();
9597     };
9598 
9599     StateType T;
9600     bool UsedAssumedInformation = false;
9601     if (!genericValueTraversal<StateType>(A, getIRPosition(), *this, T,
9602                                           VisitValueCB, getCtxI(),
9603                                           UsedAssumedInformation))
9604       return indicatePessimisticFixpoint();
9605 
9606     return clampStateAndIndicateChange(getState(), T);
9607   }
9608 
9609   /// See AbstractAttribute::trackStatistics()
9610   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(noundef) }
9611 };
9612 
9613 struct AANoUndefReturned final
9614     : AAReturnedFromReturnedValues<AANoUndef, AANoUndefImpl> {
9615   AANoUndefReturned(const IRPosition &IRP, Attributor &A)
9616       : AAReturnedFromReturnedValues<AANoUndef, AANoUndefImpl>(IRP, A) {}
9617 
9618   /// See AbstractAttribute::trackStatistics()
9619   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(noundef) }
9620 };
9621 
9622 struct AANoUndefArgument final
9623     : AAArgumentFromCallSiteArguments<AANoUndef, AANoUndefImpl> {
9624   AANoUndefArgument(const IRPosition &IRP, Attributor &A)
9625       : AAArgumentFromCallSiteArguments<AANoUndef, AANoUndefImpl>(IRP, A) {}
9626 
9627   /// See AbstractAttribute::trackStatistics()
9628   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(noundef) }
9629 };
9630 
9631 struct AANoUndefCallSiteArgument final : AANoUndefFloating {
9632   AANoUndefCallSiteArgument(const IRPosition &IRP, Attributor &A)
9633       : AANoUndefFloating(IRP, A) {}
9634 
9635   /// See AbstractAttribute::trackStatistics()
9636   void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(noundef) }
9637 };
9638 
9639 struct AANoUndefCallSiteReturned final
9640     : AACallSiteReturnedFromReturned<AANoUndef, AANoUndefImpl> {
9641   AANoUndefCallSiteReturned(const IRPosition &IRP, Attributor &A)
9642       : AACallSiteReturnedFromReturned<AANoUndef, AANoUndefImpl>(IRP, A) {}
9643 
9644   /// See AbstractAttribute::trackStatistics()
9645   void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(noundef) }
9646 };
9647 
9648 struct AACallEdgesImpl : public AACallEdges {
9649   AACallEdgesImpl(const IRPosition &IRP, Attributor &A) : AACallEdges(IRP, A) {}
9650 
9651   virtual const SetVector<Function *> &getOptimisticEdges() const override {
9652     return CalledFunctions;
9653   }
9654 
9655   virtual bool hasUnknownCallee() const override { return HasUnknownCallee; }
9656 
9657   virtual bool hasNonAsmUnknownCallee() const override {
9658     return HasUnknownCalleeNonAsm;
9659   }
9660 
9661   const std::string getAsStr() const override {
9662     return "CallEdges[" + std::to_string(HasUnknownCallee) + "," +
9663            std::to_string(CalledFunctions.size()) + "]";
9664   }
9665 
9666   void trackStatistics() const override {}
9667 
9668 protected:
9669   void addCalledFunction(Function *Fn, ChangeStatus &Change) {
9670     if (CalledFunctions.insert(Fn)) {
9671       Change = ChangeStatus::CHANGED;
9672       LLVM_DEBUG(dbgs() << "[AACallEdges] New call edge: " << Fn->getName()
9673                         << "\n");
9674     }
9675   }
9676 
9677   void setHasUnknownCallee(bool NonAsm, ChangeStatus &Change) {
9678     if (!HasUnknownCallee)
9679       Change = ChangeStatus::CHANGED;
9680     if (NonAsm && !HasUnknownCalleeNonAsm)
9681       Change = ChangeStatus::CHANGED;
9682     HasUnknownCalleeNonAsm |= NonAsm;
9683     HasUnknownCallee = true;
9684   }
9685 
9686 private:
9687   /// Optimistic set of functions that might be called by this position.
9688   SetVector<Function *> CalledFunctions;
9689 
9690   /// Is there any call with a unknown callee.
9691   bool HasUnknownCallee = false;
9692 
9693   /// Is there any call with a unknown callee, excluding any inline asm.
9694   bool HasUnknownCalleeNonAsm = false;
9695 };
9696 
9697 struct AACallEdgesCallSite : public AACallEdgesImpl {
9698   AACallEdgesCallSite(const IRPosition &IRP, Attributor &A)
9699       : AACallEdgesImpl(IRP, A) {}
9700   /// See AbstractAttribute::updateImpl(...).
9701   ChangeStatus updateImpl(Attributor &A) override {
9702     ChangeStatus Change = ChangeStatus::UNCHANGED;
9703 
9704     auto VisitValue = [&](Value &V, const Instruction *CtxI, bool &HasUnknown,
9705                           bool Stripped) -> bool {
9706       if (Function *Fn = dyn_cast<Function>(&V)) {
9707         addCalledFunction(Fn, Change);
9708       } else {
9709         LLVM_DEBUG(dbgs() << "[AACallEdges] Unrecognized value: " << V << "\n");
9710         setHasUnknownCallee(true, Change);
9711       }
9712 
9713       // Explore all values.
9714       return true;
9715     };
9716 
9717     // Process any value that we might call.
9718     auto ProcessCalledOperand = [&](Value *V) {
9719       bool DummyValue = false;
9720       bool UsedAssumedInformation = false;
9721       if (!genericValueTraversal<bool>(A, IRPosition::value(*V), *this,
9722                                        DummyValue, VisitValue, nullptr,
9723                                        UsedAssumedInformation, false)) {
9724         // If we haven't gone through all values, assume that there are unknown
9725         // callees.
9726         setHasUnknownCallee(true, Change);
9727       }
9728     };
9729 
9730     CallBase *CB = cast<CallBase>(getCtxI());
9731 
9732     if (CB->isInlineAsm()) {
9733       if (!hasAssumption(*CB->getCaller(), "ompx_no_call_asm") &&
9734           !hasAssumption(*CB, "ompx_no_call_asm"))
9735         setHasUnknownCallee(false, Change);
9736       return Change;
9737     }
9738 
9739     // Process callee metadata if available.
9740     if (auto *MD = getCtxI()->getMetadata(LLVMContext::MD_callees)) {
9741       for (auto &Op : MD->operands()) {
9742         Function *Callee = mdconst::dyn_extract_or_null<Function>(Op);
9743         if (Callee)
9744           addCalledFunction(Callee, Change);
9745       }
9746       return Change;
9747     }
9748 
9749     // The most simple case.
9750     ProcessCalledOperand(CB->getCalledOperand());
9751 
9752     // Process callback functions.
9753     SmallVector<const Use *, 4u> CallbackUses;
9754     AbstractCallSite::getCallbackUses(*CB, CallbackUses);
9755     for (const Use *U : CallbackUses)
9756       ProcessCalledOperand(U->get());
9757 
9758     return Change;
9759   }
9760 };
9761 
9762 struct AACallEdgesFunction : public AACallEdgesImpl {
9763   AACallEdgesFunction(const IRPosition &IRP, Attributor &A)
9764       : AACallEdgesImpl(IRP, A) {}
9765 
9766   /// See AbstractAttribute::updateImpl(...).
9767   ChangeStatus updateImpl(Attributor &A) override {
9768     ChangeStatus Change = ChangeStatus::UNCHANGED;
9769 
9770     auto ProcessCallInst = [&](Instruction &Inst) {
9771       CallBase &CB = cast<CallBase>(Inst);
9772 
9773       auto &CBEdges = A.getAAFor<AACallEdges>(
9774           *this, IRPosition::callsite_function(CB), DepClassTy::REQUIRED);
9775       if (CBEdges.hasNonAsmUnknownCallee())
9776         setHasUnknownCallee(true, Change);
9777       if (CBEdges.hasUnknownCallee())
9778         setHasUnknownCallee(false, Change);
9779 
9780       for (Function *F : CBEdges.getOptimisticEdges())
9781         addCalledFunction(F, Change);
9782 
9783       return true;
9784     };
9785 
9786     // Visit all callable instructions.
9787     bool UsedAssumedInformation = false;
9788     if (!A.checkForAllCallLikeInstructions(ProcessCallInst, *this,
9789                                            UsedAssumedInformation,
9790                                            /* CheckBBLivenessOnly */ true)) {
9791       // If we haven't looked at all call like instructions, assume that there
9792       // are unknown callees.
9793       setHasUnknownCallee(true, Change);
9794     }
9795 
9796     return Change;
9797   }
9798 };
9799 
9800 struct AAFunctionReachabilityFunction : public AAFunctionReachability {
9801 private:
9802   struct QuerySet {
9803     void markReachable(const Function &Fn) {
9804       Reachable.insert(&Fn);
9805       Unreachable.erase(&Fn);
9806     }
9807 
9808     /// If there is no information about the function None is returned.
9809     Optional<bool> isCachedReachable(const Function &Fn) {
9810       // Assume that we can reach the function.
9811       // TODO: Be more specific with the unknown callee.
9812       if (CanReachUnknownCallee)
9813         return true;
9814 
9815       if (Reachable.count(&Fn))
9816         return true;
9817 
9818       if (Unreachable.count(&Fn))
9819         return false;
9820 
9821       return llvm::None;
9822     }
9823 
9824     /// Set of functions that we know for sure is reachable.
9825     DenseSet<const Function *> Reachable;
9826 
9827     /// Set of functions that are unreachable, but might become reachable.
9828     DenseSet<const Function *> Unreachable;
9829 
9830     /// If we can reach a function with a call to a unknown function we assume
9831     /// that we can reach any function.
9832     bool CanReachUnknownCallee = false;
9833   };
9834 
9835   struct QueryResolver : public QuerySet {
9836     ChangeStatus update(Attributor &A, const AAFunctionReachability &AA,
9837                         ArrayRef<const AACallEdges *> AAEdgesList) {
9838       ChangeStatus Change = ChangeStatus::UNCHANGED;
9839 
9840       for (auto *AAEdges : AAEdgesList) {
9841         if (AAEdges->hasUnknownCallee()) {
9842           if (!CanReachUnknownCallee)
9843             Change = ChangeStatus::CHANGED;
9844           CanReachUnknownCallee = true;
9845           return Change;
9846         }
9847       }
9848 
9849       for (const Function *Fn : make_early_inc_range(Unreachable)) {
9850         if (checkIfReachable(A, AA, AAEdgesList, *Fn)) {
9851           Change = ChangeStatus::CHANGED;
9852           markReachable(*Fn);
9853         }
9854       }
9855       return Change;
9856     }
9857 
9858     bool isReachable(Attributor &A, AAFunctionReachability &AA,
9859                      ArrayRef<const AACallEdges *> AAEdgesList,
9860                      const Function &Fn) {
9861       Optional<bool> Cached = isCachedReachable(Fn);
9862       if (Cached.hasValue())
9863         return Cached.getValue();
9864 
9865       // The query was not cached, thus it is new. We need to request an update
9866       // explicitly to make sure this the information is properly run to a
9867       // fixpoint.
9868       A.registerForUpdate(AA);
9869 
9870       // We need to assume that this function can't reach Fn to prevent
9871       // an infinite loop if this function is recursive.
9872       Unreachable.insert(&Fn);
9873 
9874       bool Result = checkIfReachable(A, AA, AAEdgesList, Fn);
9875       if (Result)
9876         markReachable(Fn);
9877       return Result;
9878     }
9879 
9880     bool checkIfReachable(Attributor &A, const AAFunctionReachability &AA,
9881                           ArrayRef<const AACallEdges *> AAEdgesList,
9882                           const Function &Fn) const {
9883 
9884       // Handle the most trivial case first.
9885       for (auto *AAEdges : AAEdgesList) {
9886         const SetVector<Function *> &Edges = AAEdges->getOptimisticEdges();
9887 
9888         if (Edges.count(const_cast<Function *>(&Fn)))
9889           return true;
9890       }
9891 
9892       SmallVector<const AAFunctionReachability *, 8> Deps;
9893       for (auto &AAEdges : AAEdgesList) {
9894         const SetVector<Function *> &Edges = AAEdges->getOptimisticEdges();
9895 
9896         for (Function *Edge : Edges) {
9897           // Functions that do not call back into the module can be ignored.
9898           if (Edge->hasFnAttribute(Attribute::NoCallback))
9899             continue;
9900 
9901           // We don't need a dependency if the result is reachable.
9902           const AAFunctionReachability &EdgeReachability =
9903               A.getAAFor<AAFunctionReachability>(
9904                   AA, IRPosition::function(*Edge), DepClassTy::NONE);
9905           Deps.push_back(&EdgeReachability);
9906 
9907           if (EdgeReachability.canReach(A, Fn))
9908             return true;
9909         }
9910       }
9911 
9912       // The result is false for now, set dependencies and leave.
9913       for (auto *Dep : Deps)
9914         A.recordDependence(*Dep, AA, DepClassTy::REQUIRED);
9915 
9916       return false;
9917     }
9918   };
9919 
9920   /// Get call edges that can be reached by this instruction.
9921   bool getReachableCallEdges(Attributor &A, const AAReachability &Reachability,
9922                              const Instruction &Inst,
9923                              SmallVector<const AACallEdges *> &Result) const {
9924     // Determine call like instructions that we can reach from the inst.
9925     auto CheckCallBase = [&](Instruction &CBInst) {
9926       if (!Reachability.isAssumedReachable(A, Inst, CBInst))
9927         return true;
9928 
9929       auto &CB = cast<CallBase>(CBInst);
9930       const AACallEdges &AAEdges = A.getAAFor<AACallEdges>(
9931           *this, IRPosition::callsite_function(CB), DepClassTy::REQUIRED);
9932 
9933       Result.push_back(&AAEdges);
9934       return true;
9935     };
9936 
9937     bool UsedAssumedInformation = false;
9938     return A.checkForAllCallLikeInstructions(CheckCallBase, *this,
9939                                              UsedAssumedInformation,
9940                                              /* CheckBBLivenessOnly */ true);
9941   }
9942 
9943 public:
9944   AAFunctionReachabilityFunction(const IRPosition &IRP, Attributor &A)
9945       : AAFunctionReachability(IRP, A) {}
9946 
9947   bool canReach(Attributor &A, const Function &Fn) const override {
9948     if (!isValidState())
9949       return true;
9950 
9951     const AACallEdges &AAEdges =
9952         A.getAAFor<AACallEdges>(*this, getIRPosition(), DepClassTy::REQUIRED);
9953 
9954     // Attributor returns attributes as const, so this function has to be
9955     // const for users of this attribute to use it without having to do
9956     // a const_cast.
9957     // This is a hack for us to be able to cache queries.
9958     auto *NonConstThis = const_cast<AAFunctionReachabilityFunction *>(this);
9959     bool Result = NonConstThis->WholeFunction.isReachable(A, *NonConstThis,
9960                                                           {&AAEdges}, Fn);
9961 
9962     return Result;
9963   }
9964 
9965   /// Can \p CB reach \p Fn
9966   bool canReach(Attributor &A, CallBase &CB,
9967                 const Function &Fn) const override {
9968     if (!isValidState())
9969       return true;
9970 
9971     const AACallEdges &AAEdges = A.getAAFor<AACallEdges>(
9972         *this, IRPosition::callsite_function(CB), DepClassTy::REQUIRED);
9973 
9974     // Attributor returns attributes as const, so this function has to be
9975     // const for users of this attribute to use it without having to do
9976     // a const_cast.
9977     // This is a hack for us to be able to cache queries.
9978     auto *NonConstThis = const_cast<AAFunctionReachabilityFunction *>(this);
9979     QueryResolver &CBQuery = NonConstThis->CBQueries[&CB];
9980 
9981     bool Result = CBQuery.isReachable(A, *NonConstThis, {&AAEdges}, Fn);
9982 
9983     return Result;
9984   }
9985 
9986   bool instructionCanReach(Attributor &A, const Instruction &Inst,
9987                            const Function &Fn,
9988                            bool UseBackwards) const override {
9989     if (!isValidState())
9990       return true;
9991 
9992     if (UseBackwards)
9993       return AA::isPotentiallyReachable(A, Inst, Fn, *this, nullptr);
9994 
9995     const auto &Reachability = A.getAAFor<AAReachability>(
9996         *this, IRPosition::function(*getAssociatedFunction()),
9997         DepClassTy::REQUIRED);
9998 
9999     SmallVector<const AACallEdges *> CallEdges;
10000     bool AllKnown = getReachableCallEdges(A, Reachability, Inst, CallEdges);
10001     // Attributor returns attributes as const, so this function has to be
10002     // const for users of this attribute to use it without having to do
10003     // a const_cast.
10004     // This is a hack for us to be able to cache queries.
10005     auto *NonConstThis = const_cast<AAFunctionReachabilityFunction *>(this);
10006     QueryResolver &InstQSet = NonConstThis->InstQueries[&Inst];
10007     if (!AllKnown)
10008       InstQSet.CanReachUnknownCallee = true;
10009 
10010     return InstQSet.isReachable(A, *NonConstThis, CallEdges, Fn);
10011   }
10012 
10013   /// See AbstractAttribute::updateImpl(...).
10014   ChangeStatus updateImpl(Attributor &A) override {
10015     const AACallEdges &AAEdges =
10016         A.getAAFor<AACallEdges>(*this, getIRPosition(), DepClassTy::REQUIRED);
10017     ChangeStatus Change = ChangeStatus::UNCHANGED;
10018 
10019     Change |= WholeFunction.update(A, *this, {&AAEdges});
10020 
10021     for (auto &CBPair : CBQueries) {
10022       const AACallEdges &AAEdges = A.getAAFor<AACallEdges>(
10023           *this, IRPosition::callsite_function(*CBPair.first),
10024           DepClassTy::REQUIRED);
10025 
10026       Change |= CBPair.second.update(A, *this, {&AAEdges});
10027     }
10028 
10029     // Update the Instruction queries.
10030     if (!InstQueries.empty()) {
10031       const AAReachability *Reachability = &A.getAAFor<AAReachability>(
10032           *this, IRPosition::function(*getAssociatedFunction()),
10033           DepClassTy::REQUIRED);
10034 
10035       // Check for local callbases first.
10036       for (auto &InstPair : InstQueries) {
10037         SmallVector<const AACallEdges *> CallEdges;
10038         bool AllKnown =
10039             getReachableCallEdges(A, *Reachability, *InstPair.first, CallEdges);
10040         // Update will return change if we this effects any queries.
10041         if (!AllKnown)
10042           InstPair.second.CanReachUnknownCallee = true;
10043         Change |= InstPair.second.update(A, *this, CallEdges);
10044       }
10045     }
10046 
10047     return Change;
10048   }
10049 
10050   const std::string getAsStr() const override {
10051     size_t QueryCount =
10052         WholeFunction.Reachable.size() + WholeFunction.Unreachable.size();
10053 
10054     return "FunctionReachability [" +
10055            std::to_string(WholeFunction.Reachable.size()) + "," +
10056            std::to_string(QueryCount) + "]";
10057   }
10058 
10059   void trackStatistics() const override {}
10060 
10061 private:
10062   bool canReachUnknownCallee() const override {
10063     return WholeFunction.CanReachUnknownCallee;
10064   }
10065 
10066   /// Used to answer if a the whole function can reacha a specific function.
10067   QueryResolver WholeFunction;
10068 
10069   /// Used to answer if a call base inside this function can reach a specific
10070   /// function.
10071   MapVector<const CallBase *, QueryResolver> CBQueries;
10072 
10073   /// This is for instruction queries than scan "forward".
10074   MapVector<const Instruction *, QueryResolver> InstQueries;
10075 };
10076 } // namespace
10077 
10078 /// ---------------------- Assumption Propagation ------------------------------
10079 namespace {
10080 struct AAAssumptionInfoImpl : public AAAssumptionInfo {
10081   AAAssumptionInfoImpl(const IRPosition &IRP, Attributor &A,
10082                        const DenseSet<StringRef> &Known)
10083       : AAAssumptionInfo(IRP, A, Known) {}
10084 
10085   bool hasAssumption(const StringRef Assumption) const override {
10086     return isValidState() && setContains(Assumption);
10087   }
10088 
10089   /// See AbstractAttribute::getAsStr()
10090   const std::string getAsStr() const override {
10091     const SetContents &Known = getKnown();
10092     const SetContents &Assumed = getAssumed();
10093 
10094     const std::string KnownStr =
10095         llvm::join(Known.getSet().begin(), Known.getSet().end(), ",");
10096     const std::string AssumedStr =
10097         (Assumed.isUniversal())
10098             ? "Universal"
10099             : llvm::join(Assumed.getSet().begin(), Assumed.getSet().end(), ",");
10100 
10101     return "Known [" + KnownStr + "]," + " Assumed [" + AssumedStr + "]";
10102   }
10103 };
10104 
10105 /// Propagates assumption information from parent functions to all of their
10106 /// successors. An assumption can be propagated if the containing function
10107 /// dominates the called function.
10108 ///
10109 /// We start with a "known" set of assumptions already valid for the associated
10110 /// function and an "assumed" set that initially contains all possible
10111 /// assumptions. The assumed set is inter-procedurally updated by narrowing its
10112 /// contents as concrete values are known. The concrete values are seeded by the
10113 /// first nodes that are either entries into the call graph, or contains no
10114 /// assumptions. Each node is updated as the intersection of the assumed state
10115 /// with all of its predecessors.
10116 struct AAAssumptionInfoFunction final : AAAssumptionInfoImpl {
10117   AAAssumptionInfoFunction(const IRPosition &IRP, Attributor &A)
10118       : AAAssumptionInfoImpl(IRP, A,
10119                              getAssumptions(*IRP.getAssociatedFunction())) {}
10120 
10121   /// See AbstractAttribute::manifest(...).
10122   ChangeStatus manifest(Attributor &A) override {
10123     const auto &Assumptions = getKnown();
10124 
10125     // Don't manifest a universal set if it somehow made it here.
10126     if (Assumptions.isUniversal())
10127       return ChangeStatus::UNCHANGED;
10128 
10129     Function *AssociatedFunction = getAssociatedFunction();
10130 
10131     bool Changed = addAssumptions(*AssociatedFunction, Assumptions.getSet());
10132 
10133     return Changed ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED;
10134   }
10135 
10136   /// See AbstractAttribute::updateImpl(...).
10137   ChangeStatus updateImpl(Attributor &A) override {
10138     bool Changed = false;
10139 
10140     auto CallSitePred = [&](AbstractCallSite ACS) {
10141       const auto &AssumptionAA = A.getAAFor<AAAssumptionInfo>(
10142           *this, IRPosition::callsite_function(*ACS.getInstruction()),
10143           DepClassTy::REQUIRED);
10144       // Get the set of assumptions shared by all of this function's callers.
10145       Changed |= getIntersection(AssumptionAA.getAssumed());
10146       return !getAssumed().empty() || !getKnown().empty();
10147     };
10148 
10149     bool UsedAssumedInformation = false;
10150     // Get the intersection of all assumptions held by this node's predecessors.
10151     // If we don't know all the call sites then this is either an entry into the
10152     // call graph or an empty node. This node is known to only contain its own
10153     // assumptions and can be propagated to its successors.
10154     if (!A.checkForAllCallSites(CallSitePred, *this, true,
10155                                 UsedAssumedInformation))
10156       return indicatePessimisticFixpoint();
10157 
10158     return Changed ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED;
10159   }
10160 
10161   void trackStatistics() const override {}
10162 };
10163 
10164 /// Assumption Info defined for call sites.
10165 struct AAAssumptionInfoCallSite final : AAAssumptionInfoImpl {
10166 
10167   AAAssumptionInfoCallSite(const IRPosition &IRP, Attributor &A)
10168       : AAAssumptionInfoImpl(IRP, A, getInitialAssumptions(IRP)) {}
10169 
10170   /// See AbstractAttribute::initialize(...).
10171   void initialize(Attributor &A) override {
10172     const IRPosition &FnPos = IRPosition::function(*getAnchorScope());
10173     A.getAAFor<AAAssumptionInfo>(*this, FnPos, DepClassTy::REQUIRED);
10174   }
10175 
10176   /// See AbstractAttribute::manifest(...).
10177   ChangeStatus manifest(Attributor &A) override {
10178     // Don't manifest a universal set if it somehow made it here.
10179     if (getKnown().isUniversal())
10180       return ChangeStatus::UNCHANGED;
10181 
10182     CallBase &AssociatedCall = cast<CallBase>(getAssociatedValue());
10183     bool Changed = addAssumptions(AssociatedCall, getAssumed().getSet());
10184 
10185     return Changed ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED;
10186   }
10187 
10188   /// See AbstractAttribute::updateImpl(...).
10189   ChangeStatus updateImpl(Attributor &A) override {
10190     const IRPosition &FnPos = IRPosition::function(*getAnchorScope());
10191     auto &AssumptionAA =
10192         A.getAAFor<AAAssumptionInfo>(*this, FnPos, DepClassTy::REQUIRED);
10193     bool Changed = getIntersection(AssumptionAA.getAssumed());
10194     return Changed ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED;
10195   }
10196 
10197   /// See AbstractAttribute::trackStatistics()
10198   void trackStatistics() const override {}
10199 
10200 private:
10201   /// Helper to initialized the known set as all the assumptions this call and
10202   /// the callee contain.
10203   DenseSet<StringRef> getInitialAssumptions(const IRPosition &IRP) {
10204     const CallBase &CB = cast<CallBase>(IRP.getAssociatedValue());
10205     auto Assumptions = getAssumptions(CB);
10206     if (Function *F = IRP.getAssociatedFunction())
10207       set_union(Assumptions, getAssumptions(*F));
10208     if (Function *F = IRP.getAssociatedFunction())
10209       set_union(Assumptions, getAssumptions(*F));
10210     return Assumptions;
10211   }
10212 };
10213 } // namespace
10214 
10215 AACallGraphNode *AACallEdgeIterator::operator*() const {
10216   return static_cast<AACallGraphNode *>(const_cast<AACallEdges *>(
10217       &A.getOrCreateAAFor<AACallEdges>(IRPosition::function(**I))));
10218 }
10219 
10220 void AttributorCallGraph::print() { llvm::WriteGraph(outs(), this); }
10221 
10222 const char AAReturnedValues::ID = 0;
10223 const char AANoUnwind::ID = 0;
10224 const char AANoSync::ID = 0;
10225 const char AANoFree::ID = 0;
10226 const char AANonNull::ID = 0;
10227 const char AANoRecurse::ID = 0;
10228 const char AAWillReturn::ID = 0;
10229 const char AAUndefinedBehavior::ID = 0;
10230 const char AANoAlias::ID = 0;
10231 const char AAReachability::ID = 0;
10232 const char AANoReturn::ID = 0;
10233 const char AAIsDead::ID = 0;
10234 const char AADereferenceable::ID = 0;
10235 const char AAAlign::ID = 0;
10236 const char AAInstanceInfo::ID = 0;
10237 const char AANoCapture::ID = 0;
10238 const char AAValueSimplify::ID = 0;
10239 const char AAHeapToStack::ID = 0;
10240 const char AAPrivatizablePtr::ID = 0;
10241 const char AAMemoryBehavior::ID = 0;
10242 const char AAMemoryLocation::ID = 0;
10243 const char AAValueConstantRange::ID = 0;
10244 const char AAPotentialConstantValues::ID = 0;
10245 const char AANoUndef::ID = 0;
10246 const char AACallEdges::ID = 0;
10247 const char AAFunctionReachability::ID = 0;
10248 const char AAPointerInfo::ID = 0;
10249 const char AAAssumptionInfo::ID = 0;
10250 
10251 // Macro magic to create the static generator function for attributes that
10252 // follow the naming scheme.
10253 
10254 #define SWITCH_PK_INV(CLASS, PK, POS_NAME)                                     \
10255   case IRPosition::PK:                                                         \
10256     llvm_unreachable("Cannot create " #CLASS " for a " POS_NAME " position!");
10257 
10258 #define SWITCH_PK_CREATE(CLASS, IRP, PK, SUFFIX)                               \
10259   case IRPosition::PK:                                                         \
10260     AA = new (A.Allocator) CLASS##SUFFIX(IRP, A);                              \
10261     ++NumAAs;                                                                  \
10262     break;
10263 
10264 #define CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS)                 \
10265   CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) {      \
10266     CLASS *AA = nullptr;                                                       \
10267     switch (IRP.getPositionKind()) {                                           \
10268       SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid")                             \
10269       SWITCH_PK_INV(CLASS, IRP_FLOAT, "floating")                              \
10270       SWITCH_PK_INV(CLASS, IRP_ARGUMENT, "argument")                           \
10271       SWITCH_PK_INV(CLASS, IRP_RETURNED, "returned")                           \
10272       SWITCH_PK_INV(CLASS, IRP_CALL_SITE_RETURNED, "call site returned")       \
10273       SWITCH_PK_INV(CLASS, IRP_CALL_SITE_ARGUMENT, "call site argument")       \
10274       SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function)                     \
10275       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE, CallSite)                    \
10276     }                                                                          \
10277     return *AA;                                                                \
10278   }
10279 
10280 #define CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS)                    \
10281   CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) {      \
10282     CLASS *AA = nullptr;                                                       \
10283     switch (IRP.getPositionKind()) {                                           \
10284       SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid")                             \
10285       SWITCH_PK_INV(CLASS, IRP_FUNCTION, "function")                           \
10286       SWITCH_PK_INV(CLASS, IRP_CALL_SITE, "call site")                         \
10287       SWITCH_PK_CREATE(CLASS, IRP, IRP_FLOAT, Floating)                        \
10288       SWITCH_PK_CREATE(CLASS, IRP, IRP_ARGUMENT, Argument)                     \
10289       SWITCH_PK_CREATE(CLASS, IRP, IRP_RETURNED, Returned)                     \
10290       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_RETURNED, CallSiteReturned)   \
10291       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_ARGUMENT, CallSiteArgument)   \
10292     }                                                                          \
10293     return *AA;                                                                \
10294   }
10295 
10296 #define CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS)                      \
10297   CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) {      \
10298     CLASS *AA = nullptr;                                                       \
10299     switch (IRP.getPositionKind()) {                                           \
10300       SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid")                             \
10301       SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function)                     \
10302       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE, CallSite)                    \
10303       SWITCH_PK_CREATE(CLASS, IRP, IRP_FLOAT, Floating)                        \
10304       SWITCH_PK_CREATE(CLASS, IRP, IRP_ARGUMENT, Argument)                     \
10305       SWITCH_PK_CREATE(CLASS, IRP, IRP_RETURNED, Returned)                     \
10306       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_RETURNED, CallSiteReturned)   \
10307       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_ARGUMENT, CallSiteArgument)   \
10308     }                                                                          \
10309     return *AA;                                                                \
10310   }
10311 
10312 #define CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS)            \
10313   CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) {      \
10314     CLASS *AA = nullptr;                                                       \
10315     switch (IRP.getPositionKind()) {                                           \
10316       SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid")                             \
10317       SWITCH_PK_INV(CLASS, IRP_ARGUMENT, "argument")                           \
10318       SWITCH_PK_INV(CLASS, IRP_FLOAT, "floating")                              \
10319       SWITCH_PK_INV(CLASS, IRP_RETURNED, "returned")                           \
10320       SWITCH_PK_INV(CLASS, IRP_CALL_SITE_RETURNED, "call site returned")       \
10321       SWITCH_PK_INV(CLASS, IRP_CALL_SITE_ARGUMENT, "call site argument")       \
10322       SWITCH_PK_INV(CLASS, IRP_CALL_SITE, "call site")                         \
10323       SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function)                     \
10324     }                                                                          \
10325     return *AA;                                                                \
10326   }
10327 
10328 #define CREATE_NON_RET_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS)                  \
10329   CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) {      \
10330     CLASS *AA = nullptr;                                                       \
10331     switch (IRP.getPositionKind()) {                                           \
10332       SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid")                             \
10333       SWITCH_PK_INV(CLASS, IRP_RETURNED, "returned")                           \
10334       SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function)                     \
10335       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE, CallSite)                    \
10336       SWITCH_PK_CREATE(CLASS, IRP, IRP_FLOAT, Floating)                        \
10337       SWITCH_PK_CREATE(CLASS, IRP, IRP_ARGUMENT, Argument)                     \
10338       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_RETURNED, CallSiteReturned)   \
10339       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_ARGUMENT, CallSiteArgument)   \
10340     }                                                                          \
10341     return *AA;                                                                \
10342   }
10343 
10344 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoUnwind)
10345 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoSync)
10346 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoRecurse)
10347 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAWillReturn)
10348 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoReturn)
10349 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAReturnedValues)
10350 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAMemoryLocation)
10351 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AACallEdges)
10352 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAAssumptionInfo)
10353 
10354 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANonNull)
10355 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoAlias)
10356 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAPrivatizablePtr)
10357 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AADereferenceable)
10358 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAAlign)
10359 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAInstanceInfo)
10360 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoCapture)
10361 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAValueConstantRange)
10362 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAPotentialConstantValues)
10363 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoUndef)
10364 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAPointerInfo)
10365 
10366 CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAValueSimplify)
10367 CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAIsDead)
10368 CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoFree)
10369 
10370 CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAHeapToStack)
10371 CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAReachability)
10372 CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAUndefinedBehavior)
10373 CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAFunctionReachability)
10374 
10375 CREATE_NON_RET_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAMemoryBehavior)
10376 
10377 #undef CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION
10378 #undef CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION
10379 #undef CREATE_NON_RET_ABSTRACT_ATTRIBUTE_FOR_POSITION
10380 #undef CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION
10381 #undef CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION
10382 #undef SWITCH_PK_CREATE
10383 #undef SWITCH_PK_INV
10384