Home | History | Annotate | Line # | Download | only in IPO
      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/SCCIterator.h"
     17 #include "llvm/ADT/SmallPtrSet.h"
     18 #include "llvm/ADT/Statistic.h"
     19 #include "llvm/Analysis/AliasAnalysis.h"
     20 #include "llvm/Analysis/AssumeBundleQueries.h"
     21 #include "llvm/Analysis/AssumptionCache.h"
     22 #include "llvm/Analysis/CaptureTracking.h"
     23 #include "llvm/Analysis/LazyValueInfo.h"
     24 #include "llvm/Analysis/MemoryBuiltins.h"
     25 #include "llvm/Analysis/ScalarEvolution.h"
     26 #include "llvm/Analysis/TargetTransformInfo.h"
     27 #include "llvm/Analysis/ValueTracking.h"
     28 #include "llvm/IR/IRBuilder.h"
     29 #include "llvm/IR/Instruction.h"
     30 #include "llvm/IR/IntrinsicInst.h"
     31 #include "llvm/IR/NoFolder.h"
     32 #include "llvm/Support/CommandLine.h"
     33 #include "llvm/Transforms/IPO/ArgumentPromotion.h"
     34 #include "llvm/Transforms/Utils/Local.h"
     35 
     36 #include <cassert>
     37 
     38 using namespace llvm;
     39 
     40 #define DEBUG_TYPE "attributor"
     41 
     42 static cl::opt<bool> ManifestInternal(
     43     "attributor-manifest-internal", cl::Hidden,
     44     cl::desc("Manifest Attributor internal string attributes."),
     45     cl::init(false));
     46 
     47 static cl::opt<int> MaxHeapToStackSize("max-heap-to-stack-size", cl::init(128),
     48                                        cl::Hidden);
     49 
     50 template <>
     51 unsigned llvm::PotentialConstantIntValuesState::MaxPotentialValues = 0;
     52 
     53 static cl::opt<unsigned, true> MaxPotentialValues(
     54     "attributor-max-potential-values", cl::Hidden,
     55     cl::desc("Maximum number of potential values to be "
     56              "tracked for each position."),
     57     cl::location(llvm::PotentialConstantIntValuesState::MaxPotentialValues),
     58     cl::init(7));
     59 
     60 STATISTIC(NumAAs, "Number of abstract attributes created");
     61 
     62 // Some helper macros to deal with statistics tracking.
     63 //
     64 // Usage:
     65 // For simple IR attribute tracking overload trackStatistics in the abstract
     66 // attribute and choose the right STATS_DECLTRACK_********* macro,
     67 // e.g.,:
     68 //  void trackStatistics() const override {
     69 //    STATS_DECLTRACK_ARG_ATTR(returned)
     70 //  }
     71 // If there is a single "increment" side one can use the macro
     72 // STATS_DECLTRACK with a custom message. If there are multiple increment
     73 // sides, STATS_DECL and STATS_TRACK can also be used separately.
     74 //
     75 #define BUILD_STAT_MSG_IR_ATTR(TYPE, NAME)                                     \
     76   ("Number of " #TYPE " marked '" #NAME "'")
     77 #define BUILD_STAT_NAME(NAME, TYPE) NumIR##TYPE##_##NAME
     78 #define STATS_DECL_(NAME, MSG) STATISTIC(NAME, MSG);
     79 #define STATS_DECL(NAME, TYPE, MSG)                                            \
     80   STATS_DECL_(BUILD_STAT_NAME(NAME, TYPE), MSG);
     81 #define STATS_TRACK(NAME, TYPE) ++(BUILD_STAT_NAME(NAME, TYPE));
     82 #define STATS_DECLTRACK(NAME, TYPE, MSG)                                       \
     83   {                                                                            \
     84     STATS_DECL(NAME, TYPE, MSG)                                                \
     85     STATS_TRACK(NAME, TYPE)                                                    \
     86   }
     87 #define STATS_DECLTRACK_ARG_ATTR(NAME)                                         \
     88   STATS_DECLTRACK(NAME, Arguments, BUILD_STAT_MSG_IR_ATTR(arguments, NAME))
     89 #define STATS_DECLTRACK_CSARG_ATTR(NAME)                                       \
     90   STATS_DECLTRACK(NAME, CSArguments,                                           \
     91                   BUILD_STAT_MSG_IR_ATTR(call site arguments, NAME))
     92 #define STATS_DECLTRACK_FN_ATTR(NAME)                                          \
     93   STATS_DECLTRACK(NAME, Function, BUILD_STAT_MSG_IR_ATTR(functions, NAME))
     94 #define STATS_DECLTRACK_CS_ATTR(NAME)                                          \
     95   STATS_DECLTRACK(NAME, CS, BUILD_STAT_MSG_IR_ATTR(call site, NAME))
     96 #define STATS_DECLTRACK_FNRET_ATTR(NAME)                                       \
     97   STATS_DECLTRACK(NAME, FunctionReturn,                                        \
     98                   BUILD_STAT_MSG_IR_ATTR(function returns, NAME))
     99 #define STATS_DECLTRACK_CSRET_ATTR(NAME)                                       \
    100   STATS_DECLTRACK(NAME, CSReturn,                                              \
    101                   BUILD_STAT_MSG_IR_ATTR(call site returns, NAME))
    102 #define STATS_DECLTRACK_FLOATING_ATTR(NAME)                                    \
    103   STATS_DECLTRACK(NAME, Floating,                                              \
    104                   ("Number of floating values known to be '" #NAME "'"))
    105 
    106 // Specialization of the operator<< for abstract attributes subclasses. This
    107 // disambiguates situations where multiple operators are applicable.
    108 namespace llvm {
    109 #define PIPE_OPERATOR(CLASS)                                                   \
    110   raw_ostream &operator<<(raw_ostream &OS, const CLASS &AA) {                  \
    111     return OS << static_cast<const AbstractAttribute &>(AA);                   \
    112   }
    113 
    114 PIPE_OPERATOR(AAIsDead)
    115 PIPE_OPERATOR(AANoUnwind)
    116 PIPE_OPERATOR(AANoSync)
    117 PIPE_OPERATOR(AANoRecurse)
    118 PIPE_OPERATOR(AAWillReturn)
    119 PIPE_OPERATOR(AANoReturn)
    120 PIPE_OPERATOR(AAReturnedValues)
    121 PIPE_OPERATOR(AANonNull)
    122 PIPE_OPERATOR(AANoAlias)
    123 PIPE_OPERATOR(AADereferenceable)
    124 PIPE_OPERATOR(AAAlign)
    125 PIPE_OPERATOR(AANoCapture)
    126 PIPE_OPERATOR(AAValueSimplify)
    127 PIPE_OPERATOR(AANoFree)
    128 PIPE_OPERATOR(AAHeapToStack)
    129 PIPE_OPERATOR(AAReachability)
    130 PIPE_OPERATOR(AAMemoryBehavior)
    131 PIPE_OPERATOR(AAMemoryLocation)
    132 PIPE_OPERATOR(AAValueConstantRange)
    133 PIPE_OPERATOR(AAPrivatizablePtr)
    134 PIPE_OPERATOR(AAUndefinedBehavior)
    135 PIPE_OPERATOR(AAPotentialValues)
    136 PIPE_OPERATOR(AANoUndef)
    137 
    138 #undef PIPE_OPERATOR
    139 } // namespace llvm
    140 
    141 namespace {
    142 
    143 static Optional<ConstantInt *>
    144 getAssumedConstantInt(Attributor &A, const Value &V,
    145                       const AbstractAttribute &AA,
    146                       bool &UsedAssumedInformation) {
    147   Optional<Constant *> C = A.getAssumedConstant(V, AA, UsedAssumedInformation);
    148   if (C.hasValue())
    149     return dyn_cast_or_null<ConstantInt>(C.getValue());
    150   return llvm::None;
    151 }
    152 
    153 /// Get pointer operand of memory accessing instruction. If \p I is
    154 /// not a memory accessing instruction, return nullptr. If \p AllowVolatile,
    155 /// is set to false and the instruction is volatile, return nullptr.
    156 static const Value *getPointerOperand(const Instruction *I,
    157                                       bool AllowVolatile) {
    158   if (!AllowVolatile && I->isVolatile())
    159     return nullptr;
    160 
    161   if (auto *LI = dyn_cast<LoadInst>(I)) {
    162     return LI->getPointerOperand();
    163   }
    164 
    165   if (auto *SI = dyn_cast<StoreInst>(I)) {
    166     return SI->getPointerOperand();
    167   }
    168 
    169   if (auto *CXI = dyn_cast<AtomicCmpXchgInst>(I)) {
    170     return CXI->getPointerOperand();
    171   }
    172 
    173   if (auto *RMWI = dyn_cast<AtomicRMWInst>(I)) {
    174     return RMWI->getPointerOperand();
    175   }
    176 
    177   return nullptr;
    178 }
    179 
    180 /// Helper function to create a pointer of type \p ResTy, based on \p Ptr, and
    181 /// advanced by \p Offset bytes. To aid later analysis the method tries to build
    182 /// getelement pointer instructions that traverse the natural type of \p Ptr if
    183 /// possible. If that fails, the remaining offset is adjusted byte-wise, hence
    184 /// through a cast to i8*.
    185 ///
    186 /// TODO: This could probably live somewhere more prominantly if it doesn't
    187 ///       already exist.
    188 static Value *constructPointer(Type *ResTy, Type *PtrElemTy, Value *Ptr,
    189                                int64_t Offset, IRBuilder<NoFolder> &IRB,
    190                                const DataLayout &DL) {
    191   assert(Offset >= 0 && "Negative offset not supported yet!");
    192   LLVM_DEBUG(dbgs() << "Construct pointer: " << *Ptr << " + " << Offset
    193                     << "-bytes as " << *ResTy << "\n");
    194 
    195   if (Offset) {
    196     SmallVector<Value *, 4> Indices;
    197     std::string GEPName = Ptr->getName().str() + ".0";
    198 
    199     // Add 0 index to look through the pointer.
    200     assert((uint64_t)Offset < DL.getTypeAllocSize(PtrElemTy) &&
    201            "Offset out of bounds");
    202     Indices.push_back(Constant::getNullValue(IRB.getInt32Ty()));
    203 
    204     Type *Ty = PtrElemTy;
    205     do {
    206       auto *STy = dyn_cast<StructType>(Ty);
    207       if (!STy)
    208         // Non-aggregate type, we cast and make byte-wise progress now.
    209         break;
    210 
    211       const StructLayout *SL = DL.getStructLayout(STy);
    212       if (int64_t(SL->getSizeInBytes()) < Offset)
    213         break;
    214 
    215       uint64_t Idx = SL->getElementContainingOffset(Offset);
    216       assert(Idx < STy->getNumElements() && "Offset calculation error!");
    217       uint64_t Rem = Offset - SL->getElementOffset(Idx);
    218       Ty = STy->getElementType(Idx);
    219 
    220       LLVM_DEBUG(errs() << "Ty: " << *Ty << " Offset: " << Offset
    221                         << " Idx: " << Idx << " Rem: " << Rem << "\n");
    222 
    223       GEPName += "." + std::to_string(Idx);
    224       Indices.push_back(ConstantInt::get(IRB.getInt32Ty(), Idx));
    225       Offset = Rem;
    226     } while (Offset);
    227 
    228     // Create a GEP for the indices collected above.
    229     Ptr = IRB.CreateGEP(PtrElemTy, Ptr, Indices, GEPName);
    230 
    231     // If an offset is left we use byte-wise adjustment.
    232     if (Offset) {
    233       Ptr = IRB.CreateBitCast(Ptr, IRB.getInt8PtrTy());
    234       Ptr = IRB.CreateGEP(IRB.getInt8Ty(), Ptr, IRB.getInt32(Offset),
    235                           GEPName + ".b" + Twine(Offset));
    236     }
    237   }
    238 
    239   // Ensure the result has the requested type.
    240   Ptr = IRB.CreateBitOrPointerCast(Ptr, ResTy, Ptr->getName() + ".cast");
    241 
    242   LLVM_DEBUG(dbgs() << "Constructed pointer: " << *Ptr << "\n");
    243   return Ptr;
    244 }
    245 
    246 /// Recursively visit all values that might become \p IRP at some point. This
    247 /// will be done by looking through cast instructions, selects, phis, and calls
    248 /// with the "returned" attribute. Once we cannot look through the value any
    249 /// further, the callback \p VisitValueCB is invoked and passed the current
    250 /// value, the \p State, and a flag to indicate if we stripped anything.
    251 /// Stripped means that we unpacked the value associated with \p IRP at least
    252 /// once. Note that the value used for the callback may still be the value
    253 /// associated with \p IRP (due to PHIs). To limit how much effort is invested,
    254 /// we will never visit more values than specified by \p MaxValues.
    255 template <typename AAType, typename StateTy>
    256 static bool genericValueTraversal(
    257     Attributor &A, IRPosition IRP, const AAType &QueryingAA, StateTy &State,
    258     function_ref<bool(Value &, const Instruction *, StateTy &, bool)>
    259         VisitValueCB,
    260     const Instruction *CtxI, bool UseValueSimplify = true, int MaxValues = 16,
    261     function_ref<Value *(Value *)> StripCB = nullptr) {
    262 
    263   const AAIsDead *LivenessAA = nullptr;
    264   if (IRP.getAnchorScope())
    265     LivenessAA = &A.getAAFor<AAIsDead>(
    266         QueryingAA,
    267         IRPosition::function(*IRP.getAnchorScope(), IRP.getCallBaseContext()),
    268         DepClassTy::NONE);
    269   bool AnyDead = false;
    270 
    271   using Item = std::pair<Value *, const Instruction *>;
    272   SmallSet<Item, 16> Visited;
    273   SmallVector<Item, 16> Worklist;
    274   Worklist.push_back({&IRP.getAssociatedValue(), CtxI});
    275 
    276   int Iteration = 0;
    277   do {
    278     Item I = Worklist.pop_back_val();
    279     Value *V = I.first;
    280     CtxI = I.second;
    281     if (StripCB)
    282       V = StripCB(V);
    283 
    284     // Check if we should process the current value. To prevent endless
    285     // recursion keep a record of the values we followed!
    286     if (!Visited.insert(I).second)
    287       continue;
    288 
    289     // Make sure we limit the compile time for complex expressions.
    290     if (Iteration++ >= MaxValues)
    291       return false;
    292 
    293     // Explicitly look through calls with a "returned" attribute if we do
    294     // not have a pointer as stripPointerCasts only works on them.
    295     Value *NewV = nullptr;
    296     if (V->getType()->isPointerTy()) {
    297       NewV = V->stripPointerCasts();
    298     } else {
    299       auto *CB = dyn_cast<CallBase>(V);
    300       if (CB && CB->getCalledFunction()) {
    301         for (Argument &Arg : CB->getCalledFunction()->args())
    302           if (Arg.hasReturnedAttr()) {
    303             NewV = CB->getArgOperand(Arg.getArgNo());
    304             break;
    305           }
    306       }
    307     }
    308     if (NewV && NewV != V) {
    309       Worklist.push_back({NewV, CtxI});
    310       continue;
    311     }
    312 
    313     // Look through select instructions, visit both potential values.
    314     if (auto *SI = dyn_cast<SelectInst>(V)) {
    315       Worklist.push_back({SI->getTrueValue(), CtxI});
    316       Worklist.push_back({SI->getFalseValue(), CtxI});
    317       continue;
    318     }
    319 
    320     // Look through phi nodes, visit all live operands.
    321     if (auto *PHI = dyn_cast<PHINode>(V)) {
    322       assert(LivenessAA &&
    323              "Expected liveness in the presence of instructions!");
    324       for (unsigned u = 0, e = PHI->getNumIncomingValues(); u < e; u++) {
    325         BasicBlock *IncomingBB = PHI->getIncomingBlock(u);
    326         if (A.isAssumedDead(*IncomingBB->getTerminator(), &QueryingAA,
    327                             LivenessAA,
    328                             /* CheckBBLivenessOnly */ true)) {
    329           AnyDead = true;
    330           continue;
    331         }
    332         Worklist.push_back(
    333             {PHI->getIncomingValue(u), IncomingBB->getTerminator()});
    334       }
    335       continue;
    336     }
    337 
    338     if (UseValueSimplify && !isa<Constant>(V)) {
    339       bool UsedAssumedInformation = false;
    340       Optional<Constant *> C =
    341           A.getAssumedConstant(*V, QueryingAA, UsedAssumedInformation);
    342       if (!C.hasValue())
    343         continue;
    344       if (Value *NewV = C.getValue()) {
    345         Worklist.push_back({NewV, CtxI});
    346         continue;
    347       }
    348     }
    349 
    350     // Once a leaf is reached we inform the user through the callback.
    351     if (!VisitValueCB(*V, CtxI, State, Iteration > 1))
    352       return false;
    353   } while (!Worklist.empty());
    354 
    355   // If we actually used liveness information so we have to record a dependence.
    356   if (AnyDead)
    357     A.recordDependence(*LivenessAA, QueryingAA, DepClassTy::OPTIONAL);
    358 
    359   // All values have been visited.
    360   return true;
    361 }
    362 
    363 const Value *stripAndAccumulateMinimalOffsets(
    364     Attributor &A, const AbstractAttribute &QueryingAA, const Value *Val,
    365     const DataLayout &DL, APInt &Offset, bool AllowNonInbounds,
    366     bool UseAssumed = false) {
    367 
    368   auto AttributorAnalysis = [&](Value &V, APInt &ROffset) -> bool {
    369     const IRPosition &Pos = IRPosition::value(V);
    370     // Only track dependence if we are going to use the assumed info.
    371     const AAValueConstantRange &ValueConstantRangeAA =
    372         A.getAAFor<AAValueConstantRange>(QueryingAA, Pos,
    373                                          UseAssumed ? DepClassTy::OPTIONAL
    374                                                     : DepClassTy::NONE);
    375     ConstantRange Range = UseAssumed ? ValueConstantRangeAA.getAssumed()
    376                                      : ValueConstantRangeAA.getKnown();
    377     // We can only use the lower part of the range because the upper part can
    378     // be higher than what the value can really be.
    379     ROffset = Range.getSignedMin();
    380     return true;
    381   };
    382 
    383   return Val->stripAndAccumulateConstantOffsets(DL, Offset, AllowNonInbounds,
    384                                                 AttributorAnalysis);
    385 }
    386 
    387 static const Value *getMinimalBaseOfAccsesPointerOperand(
    388     Attributor &A, const AbstractAttribute &QueryingAA, const Instruction *I,
    389     int64_t &BytesOffset, const DataLayout &DL, bool AllowNonInbounds = false) {
    390   const Value *Ptr = getPointerOperand(I, /* AllowVolatile */ false);
    391   if (!Ptr)
    392     return nullptr;
    393   APInt OffsetAPInt(DL.getIndexTypeSizeInBits(Ptr->getType()), 0);
    394   const Value *Base = stripAndAccumulateMinimalOffsets(
    395       A, QueryingAA, Ptr, DL, OffsetAPInt, AllowNonInbounds);
    396 
    397   BytesOffset = OffsetAPInt.getSExtValue();
    398   return Base;
    399 }
    400 
    401 static const Value *
    402 getBasePointerOfAccessPointerOperand(const Instruction *I, int64_t &BytesOffset,
    403                                      const DataLayout &DL,
    404                                      bool AllowNonInbounds = false) {
    405   const Value *Ptr = getPointerOperand(I, /* AllowVolatile */ false);
    406   if (!Ptr)
    407     return nullptr;
    408 
    409   return GetPointerBaseWithConstantOffset(Ptr, BytesOffset, DL,
    410                                           AllowNonInbounds);
    411 }
    412 
    413 /// Helper function to clamp a state \p S of type \p StateType with the
    414 /// information in \p R and indicate/return if \p S did change (as-in update is
    415 /// required to be run again).
    416 template <typename StateType>
    417 ChangeStatus clampStateAndIndicateChange(StateType &S, const StateType &R) {
    418   auto Assumed = S.getAssumed();
    419   S ^= R;
    420   return Assumed == S.getAssumed() ? ChangeStatus::UNCHANGED
    421                                    : ChangeStatus::CHANGED;
    422 }
    423 
    424 /// Clamp the information known for all returned values of a function
    425 /// (identified by \p QueryingAA) into \p S.
    426 template <typename AAType, typename StateType = typename AAType::StateType>
    427 static void clampReturnedValueStates(
    428     Attributor &A, const AAType &QueryingAA, StateType &S,
    429     const IRPosition::CallBaseContext *CBContext = nullptr) {
    430   LLVM_DEBUG(dbgs() << "[Attributor] Clamp return value states for "
    431                     << QueryingAA << " into " << S << "\n");
    432 
    433   assert((QueryingAA.getIRPosition().getPositionKind() ==
    434               IRPosition::IRP_RETURNED ||
    435           QueryingAA.getIRPosition().getPositionKind() ==
    436               IRPosition::IRP_CALL_SITE_RETURNED) &&
    437          "Can only clamp returned value states for a function returned or call "
    438          "site returned position!");
    439 
    440   // Use an optional state as there might not be any return values and we want
    441   // to join (IntegerState::operator&) the state of all there are.
    442   Optional<StateType> T;
    443 
    444   // Callback for each possibly returned value.
    445   auto CheckReturnValue = [&](Value &RV) -> bool {
    446     const IRPosition &RVPos = IRPosition::value(RV, CBContext);
    447     const AAType &AA =
    448         A.getAAFor<AAType>(QueryingAA, RVPos, DepClassTy::REQUIRED);
    449     LLVM_DEBUG(dbgs() << "[Attributor] RV: " << RV << " AA: " << AA.getAsStr()
    450                       << " @ " << RVPos << "\n");
    451     const StateType &AAS = AA.getState();
    452     if (T.hasValue())
    453       *T &= AAS;
    454     else
    455       T = AAS;
    456     LLVM_DEBUG(dbgs() << "[Attributor] AA State: " << AAS << " RV State: " << T
    457                       << "\n");
    458     return T->isValidState();
    459   };
    460 
    461   if (!A.checkForAllReturnedValues(CheckReturnValue, QueryingAA))
    462     S.indicatePessimisticFixpoint();
    463   else if (T.hasValue())
    464     S ^= *T;
    465 }
    466 
    467 /// Helper class for generic deduction: return value -> returned position.
    468 template <typename AAType, typename BaseType,
    469           typename StateType = typename BaseType::StateType,
    470           bool PropagateCallBaseContext = false>
    471 struct AAReturnedFromReturnedValues : public BaseType {
    472   AAReturnedFromReturnedValues(const IRPosition &IRP, Attributor &A)
    473       : BaseType(IRP, A) {}
    474 
    475   /// See AbstractAttribute::updateImpl(...).
    476   ChangeStatus updateImpl(Attributor &A) override {
    477     StateType S(StateType::getBestState(this->getState()));
    478     clampReturnedValueStates<AAType, StateType>(
    479         A, *this, S,
    480         PropagateCallBaseContext ? this->getCallBaseContext() : nullptr);
    481     // TODO: If we know we visited all returned values, thus no are assumed
    482     // dead, we can take the known information from the state T.
    483     return clampStateAndIndicateChange<StateType>(this->getState(), S);
    484   }
    485 };
    486 
    487 /// Clamp the information known at all call sites for a given argument
    488 /// (identified by \p QueryingAA) into \p S.
    489 template <typename AAType, typename StateType = typename AAType::StateType>
    490 static void clampCallSiteArgumentStates(Attributor &A, const AAType &QueryingAA,
    491                                         StateType &S) {
    492   LLVM_DEBUG(dbgs() << "[Attributor] Clamp call site argument states for "
    493                     << QueryingAA << " into " << S << "\n");
    494 
    495   assert(QueryingAA.getIRPosition().getPositionKind() ==
    496              IRPosition::IRP_ARGUMENT &&
    497          "Can only clamp call site argument states for an argument position!");
    498 
    499   // Use an optional state as there might not be any return values and we want
    500   // to join (IntegerState::operator&) the state of all there are.
    501   Optional<StateType> T;
    502 
    503   // The argument number which is also the call site argument number.
    504   unsigned ArgNo = QueryingAA.getIRPosition().getCallSiteArgNo();
    505 
    506   auto CallSiteCheck = [&](AbstractCallSite ACS) {
    507     const IRPosition &ACSArgPos = IRPosition::callsite_argument(ACS, ArgNo);
    508     // Check if a coresponding argument was found or if it is on not associated
    509     // (which can happen for callback calls).
    510     if (ACSArgPos.getPositionKind() == IRPosition::IRP_INVALID)
    511       return false;
    512 
    513     const AAType &AA =
    514         A.getAAFor<AAType>(QueryingAA, ACSArgPos, DepClassTy::REQUIRED);
    515     LLVM_DEBUG(dbgs() << "[Attributor] ACS: " << *ACS.getInstruction()
    516                       << " AA: " << AA.getAsStr() << " @" << ACSArgPos << "\n");
    517     const StateType &AAS = AA.getState();
    518     if (T.hasValue())
    519       *T &= AAS;
    520     else
    521       T = AAS;
    522     LLVM_DEBUG(dbgs() << "[Attributor] AA State: " << AAS << " CSA State: " << T
    523                       << "\n");
    524     return T->isValidState();
    525   };
    526 
    527   bool AllCallSitesKnown;
    528   if (!A.checkForAllCallSites(CallSiteCheck, QueryingAA, true,
    529                               AllCallSitesKnown))
    530     S.indicatePessimisticFixpoint();
    531   else if (T.hasValue())
    532     S ^= *T;
    533 }
    534 
    535 /// This function is the bridge between argument position and the call base
    536 /// context.
    537 template <typename AAType, typename BaseType,
    538           typename StateType = typename AAType::StateType>
    539 bool getArgumentStateFromCallBaseContext(Attributor &A,
    540                                          BaseType &QueryingAttribute,
    541                                          IRPosition &Pos, StateType &State) {
    542   assert((Pos.getPositionKind() == IRPosition::IRP_ARGUMENT) &&
    543          "Expected an 'argument' position !");
    544   const CallBase *CBContext = Pos.getCallBaseContext();
    545   if (!CBContext)
    546     return false;
    547 
    548   int ArgNo = Pos.getCallSiteArgNo();
    549   assert(ArgNo >= 0 && "Invalid Arg No!");
    550 
    551   const auto &AA = A.getAAFor<AAType>(
    552       QueryingAttribute, IRPosition::callsite_argument(*CBContext, ArgNo),
    553       DepClassTy::REQUIRED);
    554   const StateType &CBArgumentState =
    555       static_cast<const StateType &>(AA.getState());
    556 
    557   LLVM_DEBUG(dbgs() << "[Attributor] Briding Call site context to argument"
    558                     << "Position:" << Pos << "CB Arg state:" << CBArgumentState
    559                     << "\n");
    560 
    561   // NOTE: If we want to do call site grouping it should happen here.
    562   State ^= CBArgumentState;
    563   return true;
    564 }
    565 
    566 /// Helper class for generic deduction: call site argument -> argument position.
    567 template <typename AAType, typename BaseType,
    568           typename StateType = typename AAType::StateType,
    569           bool BridgeCallBaseContext = false>
    570 struct AAArgumentFromCallSiteArguments : public BaseType {
    571   AAArgumentFromCallSiteArguments(const IRPosition &IRP, Attributor &A)
    572       : BaseType(IRP, A) {}
    573 
    574   /// See AbstractAttribute::updateImpl(...).
    575   ChangeStatus updateImpl(Attributor &A) override {
    576     StateType S = StateType::getBestState(this->getState());
    577 
    578     if (BridgeCallBaseContext) {
    579       bool Success =
    580           getArgumentStateFromCallBaseContext<AAType, BaseType, StateType>(
    581               A, *this, this->getIRPosition(), S);
    582       if (Success)
    583         return clampStateAndIndicateChange<StateType>(this->getState(), S);
    584     }
    585     clampCallSiteArgumentStates<AAType, StateType>(A, *this, S);
    586 
    587     // TODO: If we know we visited all incoming values, thus no are assumed
    588     // dead, we can take the known information from the state T.
    589     return clampStateAndIndicateChange<StateType>(this->getState(), S);
    590   }
    591 };
    592 
    593 /// Helper class for generic replication: function returned -> cs returned.
    594 template <typename AAType, typename BaseType,
    595           typename StateType = typename BaseType::StateType,
    596           bool IntroduceCallBaseContext = false>
    597 struct AACallSiteReturnedFromReturned : public BaseType {
    598   AACallSiteReturnedFromReturned(const IRPosition &IRP, Attributor &A)
    599       : BaseType(IRP, A) {}
    600 
    601   /// See AbstractAttribute::updateImpl(...).
    602   ChangeStatus updateImpl(Attributor &A) override {
    603     assert(this->getIRPosition().getPositionKind() ==
    604                IRPosition::IRP_CALL_SITE_RETURNED &&
    605            "Can only wrap function returned positions for call site returned "
    606            "positions!");
    607     auto &S = this->getState();
    608 
    609     const Function *AssociatedFunction =
    610         this->getIRPosition().getAssociatedFunction();
    611     if (!AssociatedFunction)
    612       return S.indicatePessimisticFixpoint();
    613 
    614     CallBase &CBContext = static_cast<CallBase &>(this->getAnchorValue());
    615     if (IntroduceCallBaseContext)
    616       LLVM_DEBUG(dbgs() << "[Attributor] Introducing call base context:"
    617                         << CBContext << "\n");
    618 
    619     IRPosition FnPos = IRPosition::returned(
    620         *AssociatedFunction, IntroduceCallBaseContext ? &CBContext : nullptr);
    621     const AAType &AA = A.getAAFor<AAType>(*this, FnPos, DepClassTy::REQUIRED);
    622     return clampStateAndIndicateChange(S, AA.getState());
    623   }
    624 };
    625 
    626 /// Helper function to accumulate uses.
    627 template <class AAType, typename StateType = typename AAType::StateType>
    628 static void followUsesInContext(AAType &AA, Attributor &A,
    629                                 MustBeExecutedContextExplorer &Explorer,
    630                                 const Instruction *CtxI,
    631                                 SetVector<const Use *> &Uses,
    632                                 StateType &State) {
    633   auto EIt = Explorer.begin(CtxI), EEnd = Explorer.end(CtxI);
    634   for (unsigned u = 0; u < Uses.size(); ++u) {
    635     const Use *U = Uses[u];
    636     if (const Instruction *UserI = dyn_cast<Instruction>(U->getUser())) {
    637       bool Found = Explorer.findInContextOf(UserI, EIt, EEnd);
    638       if (Found && AA.followUseInMBEC(A, U, UserI, State))
    639         for (const Use &Us : UserI->uses())
    640           Uses.insert(&Us);
    641     }
    642   }
    643 }
    644 
    645 /// Use the must-be-executed-context around \p I to add information into \p S.
    646 /// The AAType class is required to have `followUseInMBEC` method with the
    647 /// following signature and behaviour:
    648 ///
    649 /// bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I)
    650 /// U - Underlying use.
    651 /// I - The user of the \p U.
    652 /// Returns true if the value should be tracked transitively.
    653 ///
    654 template <class AAType, typename StateType = typename AAType::StateType>
    655 static void followUsesInMBEC(AAType &AA, Attributor &A, StateType &S,
    656                              Instruction &CtxI) {
    657 
    658   // Container for (transitive) uses of the associated value.
    659   SetVector<const Use *> Uses;
    660   for (const Use &U : AA.getIRPosition().getAssociatedValue().uses())
    661     Uses.insert(&U);
    662 
    663   MustBeExecutedContextExplorer &Explorer =
    664       A.getInfoCache().getMustBeExecutedContextExplorer();
    665 
    666   followUsesInContext<AAType>(AA, A, Explorer, &CtxI, Uses, S);
    667 
    668   if (S.isAtFixpoint())
    669     return;
    670 
    671   SmallVector<const BranchInst *, 4> BrInsts;
    672   auto Pred = [&](const Instruction *I) {
    673     if (const BranchInst *Br = dyn_cast<BranchInst>(I))
    674       if (Br->isConditional())
    675         BrInsts.push_back(Br);
    676     return true;
    677   };
    678 
    679   // Here, accumulate conditional branch instructions in the context. We
    680   // explore the child paths and collect the known states. The disjunction of
    681   // those states can be merged to its own state. Let ParentState_i be a state
    682   // to indicate the known information for an i-th branch instruction in the
    683   // context. ChildStates are created for its successors respectively.
    684   //
    685   // ParentS_1 = ChildS_{1, 1} /\ ChildS_{1, 2} /\ ... /\ ChildS_{1, n_1}
    686   // ParentS_2 = ChildS_{2, 1} /\ ChildS_{2, 2} /\ ... /\ ChildS_{2, n_2}
    687   //      ...
    688   // ParentS_m = ChildS_{m, 1} /\ ChildS_{m, 2} /\ ... /\ ChildS_{m, n_m}
    689   //
    690   // Known State |= ParentS_1 \/ ParentS_2 \/... \/ ParentS_m
    691   //
    692   // FIXME: Currently, recursive branches are not handled. For example, we
    693   // can't deduce that ptr must be dereferenced in below function.
    694   //
    695   // void f(int a, int c, int *ptr) {
    696   //    if(a)
    697   //      if (b) {
    698   //        *ptr = 0;
    699   //      } else {
    700   //        *ptr = 1;
    701   //      }
    702   //    else {
    703   //      if (b) {
    704   //        *ptr = 0;
    705   //      } else {
    706   //        *ptr = 1;
    707   //      }
    708   //    }
    709   // }
    710 
    711   Explorer.checkForAllContext(&CtxI, Pred);
    712   for (const BranchInst *Br : BrInsts) {
    713     StateType ParentState;
    714 
    715     // The known state of the parent state is a conjunction of children's
    716     // known states so it is initialized with a best state.
    717     ParentState.indicateOptimisticFixpoint();
    718 
    719     for (const BasicBlock *BB : Br->successors()) {
    720       StateType ChildState;
    721 
    722       size_t BeforeSize = Uses.size();
    723       followUsesInContext(AA, A, Explorer, &BB->front(), Uses, ChildState);
    724 
    725       // Erase uses which only appear in the child.
    726       for (auto It = Uses.begin() + BeforeSize; It != Uses.end();)
    727         It = Uses.erase(It);
    728 
    729       ParentState &= ChildState;
    730     }
    731 
    732     // Use only known state.
    733     S += ParentState;
    734   }
    735 }
    736 
    737 /// -----------------------NoUnwind Function Attribute--------------------------
    738 
    739 struct AANoUnwindImpl : AANoUnwind {
    740   AANoUnwindImpl(const IRPosition &IRP, Attributor &A) : AANoUnwind(IRP, A) {}
    741 
    742   const std::string getAsStr() const override {
    743     return getAssumed() ? "nounwind" : "may-unwind";
    744   }
    745 
    746   /// See AbstractAttribute::updateImpl(...).
    747   ChangeStatus updateImpl(Attributor &A) override {
    748     auto Opcodes = {
    749         (unsigned)Instruction::Invoke,      (unsigned)Instruction::CallBr,
    750         (unsigned)Instruction::Call,        (unsigned)Instruction::CleanupRet,
    751         (unsigned)Instruction::CatchSwitch, (unsigned)Instruction::Resume};
    752 
    753     auto CheckForNoUnwind = [&](Instruction &I) {
    754       if (!I.mayThrow())
    755         return true;
    756 
    757       if (const auto *CB = dyn_cast<CallBase>(&I)) {
    758         const auto &NoUnwindAA = A.getAAFor<AANoUnwind>(
    759             *this, IRPosition::callsite_function(*CB), DepClassTy::REQUIRED);
    760         return NoUnwindAA.isAssumedNoUnwind();
    761       }
    762       return false;
    763     };
    764 
    765     if (!A.checkForAllInstructions(CheckForNoUnwind, *this, Opcodes))
    766       return indicatePessimisticFixpoint();
    767 
    768     return ChangeStatus::UNCHANGED;
    769   }
    770 };
    771 
    772 struct AANoUnwindFunction final : public AANoUnwindImpl {
    773   AANoUnwindFunction(const IRPosition &IRP, Attributor &A)
    774       : AANoUnwindImpl(IRP, A) {}
    775 
    776   /// See AbstractAttribute::trackStatistics()
    777   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nounwind) }
    778 };
    779 
    780 /// NoUnwind attribute deduction for a call sites.
    781 struct AANoUnwindCallSite final : AANoUnwindImpl {
    782   AANoUnwindCallSite(const IRPosition &IRP, Attributor &A)
    783       : AANoUnwindImpl(IRP, A) {}
    784 
    785   /// See AbstractAttribute::initialize(...).
    786   void initialize(Attributor &A) override {
    787     AANoUnwindImpl::initialize(A);
    788     Function *F = getAssociatedFunction();
    789     if (!F || F->isDeclaration())
    790       indicatePessimisticFixpoint();
    791   }
    792 
    793   /// See AbstractAttribute::updateImpl(...).
    794   ChangeStatus updateImpl(Attributor &A) override {
    795     // TODO: Once we have call site specific value information we can provide
    796     //       call site specific liveness information and then it makes
    797     //       sense to specialize attributes for call sites arguments instead of
    798     //       redirecting requests to the callee argument.
    799     Function *F = getAssociatedFunction();
    800     const IRPosition &FnPos = IRPosition::function(*F);
    801     auto &FnAA = A.getAAFor<AANoUnwind>(*this, FnPos, DepClassTy::REQUIRED);
    802     return clampStateAndIndicateChange(getState(), FnAA.getState());
    803   }
    804 
    805   /// See AbstractAttribute::trackStatistics()
    806   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nounwind); }
    807 };
    808 
    809 /// --------------------- Function Return Values -------------------------------
    810 
    811 /// "Attribute" that collects all potential returned values and the return
    812 /// instructions that they arise from.
    813 ///
    814 /// If there is a unique returned value R, the manifest method will:
    815 ///   - mark R with the "returned" attribute, if R is an argument.
    816 class AAReturnedValuesImpl : public AAReturnedValues, public AbstractState {
    817 
    818   /// Mapping of values potentially returned by the associated function to the
    819   /// return instructions that might return them.
    820   MapVector<Value *, SmallSetVector<ReturnInst *, 4>> ReturnedValues;
    821 
    822   /// Mapping to remember the number of returned values for a call site such
    823   /// that we can avoid updates if nothing changed.
    824   DenseMap<const CallBase *, unsigned> NumReturnedValuesPerKnownAA;
    825 
    826   /// Set of unresolved calls returned by the associated function.
    827   SmallSetVector<CallBase *, 4> UnresolvedCalls;
    828 
    829   /// State flags
    830   ///
    831   ///{
    832   bool IsFixed = false;
    833   bool IsValidState = true;
    834   ///}
    835 
    836 public:
    837   AAReturnedValuesImpl(const IRPosition &IRP, Attributor &A)
    838       : AAReturnedValues(IRP, A) {}
    839 
    840   /// See AbstractAttribute::initialize(...).
    841   void initialize(Attributor &A) override {
    842     // Reset the state.
    843     IsFixed = false;
    844     IsValidState = true;
    845     ReturnedValues.clear();
    846 
    847     Function *F = getAssociatedFunction();
    848     if (!F || F->isDeclaration()) {
    849       indicatePessimisticFixpoint();
    850       return;
    851     }
    852     assert(!F->getReturnType()->isVoidTy() &&
    853            "Did not expect a void return type!");
    854 
    855     // The map from instruction opcodes to those instructions in the function.
    856     auto &OpcodeInstMap = A.getInfoCache().getOpcodeInstMapForFunction(*F);
    857 
    858     // Look through all arguments, if one is marked as returned we are done.
    859     for (Argument &Arg : F->args()) {
    860       if (Arg.hasReturnedAttr()) {
    861         auto &ReturnInstSet = ReturnedValues[&Arg];
    862         if (auto *Insts = OpcodeInstMap.lookup(Instruction::Ret))
    863           for (Instruction *RI : *Insts)
    864             ReturnInstSet.insert(cast<ReturnInst>(RI));
    865 
    866         indicateOptimisticFixpoint();
    867         return;
    868       }
    869     }
    870 
    871     if (!A.isFunctionIPOAmendable(*F))
    872       indicatePessimisticFixpoint();
    873   }
    874 
    875   /// See AbstractAttribute::manifest(...).
    876   ChangeStatus manifest(Attributor &A) override;
    877 
    878   /// See AbstractAttribute::getState(...).
    879   AbstractState &getState() override { return *this; }
    880 
    881   /// See AbstractAttribute::getState(...).
    882   const AbstractState &getState() const override { return *this; }
    883 
    884   /// See AbstractAttribute::updateImpl(Attributor &A).
    885   ChangeStatus updateImpl(Attributor &A) override;
    886 
    887   llvm::iterator_range<iterator> returned_values() override {
    888     return llvm::make_range(ReturnedValues.begin(), ReturnedValues.end());
    889   }
    890 
    891   llvm::iterator_range<const_iterator> returned_values() const override {
    892     return llvm::make_range(ReturnedValues.begin(), ReturnedValues.end());
    893   }
    894 
    895   const SmallSetVector<CallBase *, 4> &getUnresolvedCalls() const override {
    896     return UnresolvedCalls;
    897   }
    898 
    899   /// Return the number of potential return values, -1 if unknown.
    900   size_t getNumReturnValues() const override {
    901     return isValidState() ? ReturnedValues.size() : -1;
    902   }
    903 
    904   /// Return an assumed unique return value if a single candidate is found. If
    905   /// there cannot be one, return a nullptr. If it is not clear yet, return the
    906   /// Optional::NoneType.
    907   Optional<Value *> getAssumedUniqueReturnValue(Attributor &A) const;
    908 
    909   /// See AbstractState::checkForAllReturnedValues(...).
    910   bool checkForAllReturnedValuesAndReturnInsts(
    911       function_ref<bool(Value &, const SmallSetVector<ReturnInst *, 4> &)> Pred)
    912       const override;
    913 
    914   /// Pretty print the attribute similar to the IR representation.
    915   const std::string getAsStr() const override;
    916 
    917   /// See AbstractState::isAtFixpoint().
    918   bool isAtFixpoint() const override { return IsFixed; }
    919 
    920   /// See AbstractState::isValidState().
    921   bool isValidState() const override { return IsValidState; }
    922 
    923   /// See AbstractState::indicateOptimisticFixpoint(...).
    924   ChangeStatus indicateOptimisticFixpoint() override {
    925     IsFixed = true;
    926     return ChangeStatus::UNCHANGED;
    927   }
    928 
    929   ChangeStatus indicatePessimisticFixpoint() override {
    930     IsFixed = true;
    931     IsValidState = false;
    932     return ChangeStatus::CHANGED;
    933   }
    934 };
    935 
    936 ChangeStatus AAReturnedValuesImpl::manifest(Attributor &A) {
    937   ChangeStatus Changed = ChangeStatus::UNCHANGED;
    938 
    939   // Bookkeeping.
    940   assert(isValidState());
    941   STATS_DECLTRACK(KnownReturnValues, FunctionReturn,
    942                   "Number of function with known return values");
    943 
    944   // Check if we have an assumed unique return value that we could manifest.
    945   Optional<Value *> UniqueRV = getAssumedUniqueReturnValue(A);
    946 
    947   if (!UniqueRV.hasValue() || !UniqueRV.getValue())
    948     return Changed;
    949 
    950   // Bookkeeping.
    951   STATS_DECLTRACK(UniqueReturnValue, FunctionReturn,
    952                   "Number of function with unique return");
    953 
    954   // Callback to replace the uses of CB with the constant C.
    955   auto ReplaceCallSiteUsersWith = [&A](CallBase &CB, Constant &C) {
    956     if (CB.use_empty())
    957       return ChangeStatus::UNCHANGED;
    958     if (A.changeValueAfterManifest(CB, C))
    959       return ChangeStatus::CHANGED;
    960     return ChangeStatus::UNCHANGED;
    961   };
    962 
    963   // If the assumed unique return value is an argument, annotate it.
    964   if (auto *UniqueRVArg = dyn_cast<Argument>(UniqueRV.getValue())) {
    965     if (UniqueRVArg->getType()->canLosslesslyBitCastTo(
    966             getAssociatedFunction()->getReturnType())) {
    967       getIRPosition() = IRPosition::argument(*UniqueRVArg);
    968       Changed = IRAttribute::manifest(A);
    969     }
    970   } else if (auto *RVC = dyn_cast<Constant>(UniqueRV.getValue())) {
    971     // We can replace the returned value with the unique returned constant.
    972     Value &AnchorValue = getAnchorValue();
    973     if (Function *F = dyn_cast<Function>(&AnchorValue)) {
    974       for (const Use &U : F->uses())
    975         if (CallBase *CB = dyn_cast<CallBase>(U.getUser()))
    976           if (CB->isCallee(&U)) {
    977             Constant *RVCCast =
    978                 CB->getType() == RVC->getType()
    979                     ? RVC
    980                     : ConstantExpr::getTruncOrBitCast(RVC, CB->getType());
    981             Changed = ReplaceCallSiteUsersWith(*CB, *RVCCast) | Changed;
    982           }
    983     } else {
    984       assert(isa<CallBase>(AnchorValue) &&
    985              "Expcected a function or call base anchor!");
    986       Constant *RVCCast =
    987           AnchorValue.getType() == RVC->getType()
    988               ? RVC
    989               : ConstantExpr::getTruncOrBitCast(RVC, AnchorValue.getType());
    990       Changed = ReplaceCallSiteUsersWith(cast<CallBase>(AnchorValue), *RVCCast);
    991     }
    992     if (Changed == ChangeStatus::CHANGED)
    993       STATS_DECLTRACK(UniqueConstantReturnValue, FunctionReturn,
    994                       "Number of function returns replaced by constant return");
    995   }
    996 
    997   return Changed;
    998 }
    999 
   1000 const std::string AAReturnedValuesImpl::getAsStr() const {
   1001   return (isAtFixpoint() ? "returns(#" : "may-return(#") +
   1002          (isValidState() ? std::to_string(getNumReturnValues()) : "?") +
   1003          ")[#UC: " + std::to_string(UnresolvedCalls.size()) + "]";
   1004 }
   1005 
   1006 Optional<Value *>
   1007 AAReturnedValuesImpl::getAssumedUniqueReturnValue(Attributor &A) const {
   1008   // If checkForAllReturnedValues provides a unique value, ignoring potential
   1009   // undef values that can also be present, it is assumed to be the actual
   1010   // return value and forwarded to the caller of this method. If there are
   1011   // multiple, a nullptr is returned indicating there cannot be a unique
   1012   // returned value.
   1013   Optional<Value *> UniqueRV;
   1014 
   1015   auto Pred = [&](Value &RV) -> bool {
   1016     // If we found a second returned value and neither the current nor the saved
   1017     // one is an undef, there is no unique returned value. Undefs are special
   1018     // since we can pretend they have any value.
   1019     if (UniqueRV.hasValue() && UniqueRV != &RV &&
   1020         !(isa<UndefValue>(RV) || isa<UndefValue>(UniqueRV.getValue()))) {
   1021       UniqueRV = nullptr;
   1022       return false;
   1023     }
   1024 
   1025     // Do not overwrite a value with an undef.
   1026     if (!UniqueRV.hasValue() || !isa<UndefValue>(RV))
   1027       UniqueRV = &RV;
   1028 
   1029     return true;
   1030   };
   1031 
   1032   if (!A.checkForAllReturnedValues(Pred, *this))
   1033     UniqueRV = nullptr;
   1034 
   1035   return UniqueRV;
   1036 }
   1037 
   1038 bool AAReturnedValuesImpl::checkForAllReturnedValuesAndReturnInsts(
   1039     function_ref<bool(Value &, const SmallSetVector<ReturnInst *, 4> &)> Pred)
   1040     const {
   1041   if (!isValidState())
   1042     return false;
   1043 
   1044   // Check all returned values but ignore call sites as long as we have not
   1045   // encountered an overdefined one during an update.
   1046   for (auto &It : ReturnedValues) {
   1047     Value *RV = It.first;
   1048 
   1049     CallBase *CB = dyn_cast<CallBase>(RV);
   1050     if (CB && !UnresolvedCalls.count(CB))
   1051       continue;
   1052 
   1053     if (!Pred(*RV, It.second))
   1054       return false;
   1055   }
   1056 
   1057   return true;
   1058 }
   1059 
   1060 ChangeStatus AAReturnedValuesImpl::updateImpl(Attributor &A) {
   1061   size_t NumUnresolvedCalls = UnresolvedCalls.size();
   1062   bool Changed = false;
   1063 
   1064   // State used in the value traversals starting in returned values.
   1065   struct RVState {
   1066     // The map in which we collect return values -> return instrs.
   1067     decltype(ReturnedValues) &RetValsMap;
   1068     // The flag to indicate a change.
   1069     bool &Changed;
   1070     // The return instrs we come from.
   1071     SmallSetVector<ReturnInst *, 4> RetInsts;
   1072   };
   1073 
   1074   // Callback for a leaf value returned by the associated function.
   1075   auto VisitValueCB = [](Value &Val, const Instruction *, RVState &RVS,
   1076                          bool) -> bool {
   1077     auto Size = RVS.RetValsMap[&Val].size();
   1078     RVS.RetValsMap[&Val].insert(RVS.RetInsts.begin(), RVS.RetInsts.end());
   1079     bool Inserted = RVS.RetValsMap[&Val].size() != Size;
   1080     RVS.Changed |= Inserted;
   1081     LLVM_DEBUG({
   1082       if (Inserted)
   1083         dbgs() << "[AAReturnedValues] 1 Add new returned value " << Val
   1084                << " => " << RVS.RetInsts.size() << "\n";
   1085     });
   1086     return true;
   1087   };
   1088 
   1089   // Helper method to invoke the generic value traversal.
   1090   auto VisitReturnedValue = [&](Value &RV, RVState &RVS,
   1091                                 const Instruction *CtxI) {
   1092     IRPosition RetValPos = IRPosition::value(RV, getCallBaseContext());
   1093     return genericValueTraversal<AAReturnedValues, RVState>(
   1094         A, RetValPos, *this, RVS, VisitValueCB, CtxI,
   1095         /* UseValueSimplify */ false);
   1096   };
   1097 
   1098   // Callback for all "return intructions" live in the associated function.
   1099   auto CheckReturnInst = [this, &VisitReturnedValue, &Changed](Instruction &I) {
   1100     ReturnInst &Ret = cast<ReturnInst>(I);
   1101     RVState RVS({ReturnedValues, Changed, {}});
   1102     RVS.RetInsts.insert(&Ret);
   1103     return VisitReturnedValue(*Ret.getReturnValue(), RVS, &I);
   1104   };
   1105 
   1106   // Start by discovering returned values from all live returned instructions in
   1107   // the associated function.
   1108   if (!A.checkForAllInstructions(CheckReturnInst, *this, {Instruction::Ret}))
   1109     return indicatePessimisticFixpoint();
   1110 
   1111   // Once returned values "directly" present in the code are handled we try to
   1112   // resolve returned calls. To avoid modifications to the ReturnedValues map
   1113   // while we iterate over it we kept record of potential new entries in a copy
   1114   // map, NewRVsMap.
   1115   decltype(ReturnedValues) NewRVsMap;
   1116 
   1117   auto HandleReturnValue = [&](Value *RV,
   1118                                SmallSetVector<ReturnInst *, 4> &RIs) {
   1119     LLVM_DEBUG(dbgs() << "[AAReturnedValues] Returned value: " << *RV << " by #"
   1120                       << RIs.size() << " RIs\n");
   1121     CallBase *CB = dyn_cast<CallBase>(RV);
   1122     if (!CB || UnresolvedCalls.count(CB))
   1123       return;
   1124 
   1125     if (!CB->getCalledFunction()) {
   1126       LLVM_DEBUG(dbgs() << "[AAReturnedValues] Unresolved call: " << *CB
   1127                         << "\n");
   1128       UnresolvedCalls.insert(CB);
   1129       return;
   1130     }
   1131 
   1132     // TODO: use the function scope once we have call site AAReturnedValues.
   1133     const auto &RetValAA = A.getAAFor<AAReturnedValues>(
   1134         *this, IRPosition::function(*CB->getCalledFunction()),
   1135         DepClassTy::REQUIRED);
   1136     LLVM_DEBUG(dbgs() << "[AAReturnedValues] Found another AAReturnedValues: "
   1137                       << RetValAA << "\n");
   1138 
   1139     // Skip dead ends, thus if we do not know anything about the returned
   1140     // call we mark it as unresolved and it will stay that way.
   1141     if (!RetValAA.getState().isValidState()) {
   1142       LLVM_DEBUG(dbgs() << "[AAReturnedValues] Unresolved call: " << *CB
   1143                         << "\n");
   1144       UnresolvedCalls.insert(CB);
   1145       return;
   1146     }
   1147 
   1148     // Do not try to learn partial information. If the callee has unresolved
   1149     // return values we will treat the call as unresolved/opaque.
   1150     auto &RetValAAUnresolvedCalls = RetValAA.getUnresolvedCalls();
   1151     if (!RetValAAUnresolvedCalls.empty()) {
   1152       UnresolvedCalls.insert(CB);
   1153       return;
   1154     }
   1155 
   1156     // Now check if we can track transitively returned values. If possible, thus
   1157     // if all return value can be represented in the current scope, do so.
   1158     bool Unresolved = false;
   1159     for (auto &RetValAAIt : RetValAA.returned_values()) {
   1160       Value *RetVal = RetValAAIt.first;
   1161       if (isa<Argument>(RetVal) || isa<CallBase>(RetVal) ||
   1162           isa<Constant>(RetVal))
   1163         continue;
   1164       // Anything that did not fit in the above categories cannot be resolved,
   1165       // mark the call as unresolved.
   1166       LLVM_DEBUG(dbgs() << "[AAReturnedValues] transitively returned value "
   1167                            "cannot be translated: "
   1168                         << *RetVal << "\n");
   1169       UnresolvedCalls.insert(CB);
   1170       Unresolved = true;
   1171       break;
   1172     }
   1173 
   1174     if (Unresolved)
   1175       return;
   1176 
   1177     // Now track transitively returned values.
   1178     unsigned &NumRetAA = NumReturnedValuesPerKnownAA[CB];
   1179     if (NumRetAA == RetValAA.getNumReturnValues()) {
   1180       LLVM_DEBUG(dbgs() << "[AAReturnedValues] Skip call as it has not "
   1181                            "changed since it was seen last\n");
   1182       return;
   1183     }
   1184     NumRetAA = RetValAA.getNumReturnValues();
   1185 
   1186     for (auto &RetValAAIt : RetValAA.returned_values()) {
   1187       Value *RetVal = RetValAAIt.first;
   1188       if (Argument *Arg = dyn_cast<Argument>(RetVal)) {
   1189         // Arguments are mapped to call site operands and we begin the traversal
   1190         // again.
   1191         bool Unused = false;
   1192         RVState RVS({NewRVsMap, Unused, RetValAAIt.second});
   1193         VisitReturnedValue(*CB->getArgOperand(Arg->getArgNo()), RVS, CB);
   1194         continue;
   1195       }
   1196       if (isa<CallBase>(RetVal)) {
   1197         // Call sites are resolved by the callee attribute over time, no need to
   1198         // do anything for us.
   1199         continue;
   1200       }
   1201       if (isa<Constant>(RetVal)) {
   1202         // Constants are valid everywhere, we can simply take them.
   1203         NewRVsMap[RetVal].insert(RIs.begin(), RIs.end());
   1204         continue;
   1205       }
   1206     }
   1207   };
   1208 
   1209   for (auto &It : ReturnedValues)
   1210     HandleReturnValue(It.first, It.second);
   1211 
   1212   // Because processing the new information can again lead to new return values
   1213   // we have to be careful and iterate until this iteration is complete. The
   1214   // idea is that we are in a stable state at the end of an update. All return
   1215   // values have been handled and properly categorized. We might not update
   1216   // again if we have not requested a non-fix attribute so we cannot "wait" for
   1217   // the next update to analyze a new return value.
   1218   while (!NewRVsMap.empty()) {
   1219     auto It = std::move(NewRVsMap.back());
   1220     NewRVsMap.pop_back();
   1221 
   1222     assert(!It.second.empty() && "Entry does not add anything.");
   1223     auto &ReturnInsts = ReturnedValues[It.first];
   1224     for (ReturnInst *RI : It.second)
   1225       if (ReturnInsts.insert(RI)) {
   1226         LLVM_DEBUG(dbgs() << "[AAReturnedValues] Add new returned value "
   1227                           << *It.first << " => " << *RI << "\n");
   1228         HandleReturnValue(It.first, ReturnInsts);
   1229         Changed = true;
   1230       }
   1231   }
   1232 
   1233   Changed |= (NumUnresolvedCalls != UnresolvedCalls.size());
   1234   return Changed ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED;
   1235 }
   1236 
   1237 struct AAReturnedValuesFunction final : public AAReturnedValuesImpl {
   1238   AAReturnedValuesFunction(const IRPosition &IRP, Attributor &A)
   1239       : AAReturnedValuesImpl(IRP, A) {}
   1240 
   1241   /// See AbstractAttribute::trackStatistics()
   1242   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(returned) }
   1243 };
   1244 
   1245 /// Returned values information for a call sites.
   1246 struct AAReturnedValuesCallSite final : AAReturnedValuesImpl {
   1247   AAReturnedValuesCallSite(const IRPosition &IRP, Attributor &A)
   1248       : AAReturnedValuesImpl(IRP, A) {}
   1249 
   1250   /// See AbstractAttribute::initialize(...).
   1251   void initialize(Attributor &A) override {
   1252     // TODO: Once we have call site specific value information we can provide
   1253     //       call site specific liveness information and then it makes
   1254     //       sense to specialize attributes for call sites instead of
   1255     //       redirecting requests to the callee.
   1256     llvm_unreachable("Abstract attributes for returned values are not "
   1257                      "supported for call sites yet!");
   1258   }
   1259 
   1260   /// See AbstractAttribute::updateImpl(...).
   1261   ChangeStatus updateImpl(Attributor &A) override {
   1262     return indicatePessimisticFixpoint();
   1263   }
   1264 
   1265   /// See AbstractAttribute::trackStatistics()
   1266   void trackStatistics() const override {}
   1267 };
   1268 
   1269 /// ------------------------ NoSync Function Attribute -------------------------
   1270 
   1271 struct AANoSyncImpl : AANoSync {
   1272   AANoSyncImpl(const IRPosition &IRP, Attributor &A) : AANoSync(IRP, A) {}
   1273 
   1274   const std::string getAsStr() const override {
   1275     return getAssumed() ? "nosync" : "may-sync";
   1276   }
   1277 
   1278   /// See AbstractAttribute::updateImpl(...).
   1279   ChangeStatus updateImpl(Attributor &A) override;
   1280 
   1281   /// Helper function used to determine whether an instruction is non-relaxed
   1282   /// atomic. In other words, if an atomic instruction does not have unordered
   1283   /// or monotonic ordering
   1284   static bool isNonRelaxedAtomic(Instruction *I);
   1285 
   1286   /// Helper function specific for intrinsics which are potentially volatile
   1287   static bool isNoSyncIntrinsic(Instruction *I);
   1288 };
   1289 
   1290 bool AANoSyncImpl::isNonRelaxedAtomic(Instruction *I) {
   1291   if (!I->isAtomic())
   1292     return false;
   1293 
   1294   if (auto *FI = dyn_cast<FenceInst>(I))
   1295     // All legal orderings for fence are stronger than monotonic.
   1296     return FI->getSyncScopeID() != SyncScope::SingleThread;
   1297   else if (auto *AI = dyn_cast<AtomicCmpXchgInst>(I)) {
   1298     // Unordered is not a legal ordering for cmpxchg.
   1299     return (AI->getSuccessOrdering() != AtomicOrdering::Monotonic ||
   1300             AI->getFailureOrdering() != AtomicOrdering::Monotonic);
   1301   }
   1302 
   1303   AtomicOrdering Ordering;
   1304   switch (I->getOpcode()) {
   1305   case Instruction::AtomicRMW:
   1306     Ordering = cast<AtomicRMWInst>(I)->getOrdering();
   1307     break;
   1308   case Instruction::Store:
   1309     Ordering = cast<StoreInst>(I)->getOrdering();
   1310     break;
   1311   case Instruction::Load:
   1312     Ordering = cast<LoadInst>(I)->getOrdering();
   1313     break;
   1314   default:
   1315     llvm_unreachable(
   1316         "New atomic operations need to be known in the attributor.");
   1317   }
   1318 
   1319   return (Ordering != AtomicOrdering::Unordered &&
   1320           Ordering != AtomicOrdering::Monotonic);
   1321 }
   1322 
   1323 /// Return true if this intrinsic is nosync.  This is only used for intrinsics
   1324 /// which would be nosync except that they have a volatile flag.  All other
   1325 /// intrinsics are simply annotated with the nosync attribute in Intrinsics.td.
   1326 bool AANoSyncImpl::isNoSyncIntrinsic(Instruction *I) {
   1327   if (auto *MI = dyn_cast<MemIntrinsic>(I))
   1328     return !MI->isVolatile();
   1329   return false;
   1330 }
   1331 
   1332 ChangeStatus AANoSyncImpl::updateImpl(Attributor &A) {
   1333 
   1334   auto CheckRWInstForNoSync = [&](Instruction &I) {
   1335     /// We are looking for volatile instructions or Non-Relaxed atomics.
   1336 
   1337     if (const auto *CB = dyn_cast<CallBase>(&I)) {
   1338       if (CB->hasFnAttr(Attribute::NoSync))
   1339         return true;
   1340 
   1341       if (isNoSyncIntrinsic(&I))
   1342         return true;
   1343 
   1344       const auto &NoSyncAA = A.getAAFor<AANoSync>(
   1345           *this, IRPosition::callsite_function(*CB), DepClassTy::REQUIRED);
   1346       return NoSyncAA.isAssumedNoSync();
   1347     }
   1348 
   1349     if (!I.isVolatile() && !isNonRelaxedAtomic(&I))
   1350       return true;
   1351 
   1352     return false;
   1353   };
   1354 
   1355   auto CheckForNoSync = [&](Instruction &I) {
   1356     // At this point we handled all read/write effects and they are all
   1357     // nosync, so they can be skipped.
   1358     if (I.mayReadOrWriteMemory())
   1359       return true;
   1360 
   1361     // non-convergent and readnone imply nosync.
   1362     return !cast<CallBase>(I).isConvergent();
   1363   };
   1364 
   1365   if (!A.checkForAllReadWriteInstructions(CheckRWInstForNoSync, *this) ||
   1366       !A.checkForAllCallLikeInstructions(CheckForNoSync, *this))
   1367     return indicatePessimisticFixpoint();
   1368 
   1369   return ChangeStatus::UNCHANGED;
   1370 }
   1371 
   1372 struct AANoSyncFunction final : public AANoSyncImpl {
   1373   AANoSyncFunction(const IRPosition &IRP, Attributor &A)
   1374       : AANoSyncImpl(IRP, A) {}
   1375 
   1376   /// See AbstractAttribute::trackStatistics()
   1377   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nosync) }
   1378 };
   1379 
   1380 /// NoSync attribute deduction for a call sites.
   1381 struct AANoSyncCallSite final : AANoSyncImpl {
   1382   AANoSyncCallSite(const IRPosition &IRP, Attributor &A)
   1383       : AANoSyncImpl(IRP, A) {}
   1384 
   1385   /// See AbstractAttribute::initialize(...).
   1386   void initialize(Attributor &A) override {
   1387     AANoSyncImpl::initialize(A);
   1388     Function *F = getAssociatedFunction();
   1389     if (!F || F->isDeclaration())
   1390       indicatePessimisticFixpoint();
   1391   }
   1392 
   1393   /// See AbstractAttribute::updateImpl(...).
   1394   ChangeStatus updateImpl(Attributor &A) override {
   1395     // TODO: Once we have call site specific value information we can provide
   1396     //       call site specific liveness information and then it makes
   1397     //       sense to specialize attributes for call sites arguments instead of
   1398     //       redirecting requests to the callee argument.
   1399     Function *F = getAssociatedFunction();
   1400     const IRPosition &FnPos = IRPosition::function(*F);
   1401     auto &FnAA = A.getAAFor<AANoSync>(*this, FnPos, DepClassTy::REQUIRED);
   1402     return clampStateAndIndicateChange(getState(), FnAA.getState());
   1403   }
   1404 
   1405   /// See AbstractAttribute::trackStatistics()
   1406   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nosync); }
   1407 };
   1408 
   1409 /// ------------------------ No-Free Attributes ----------------------------
   1410 
   1411 struct AANoFreeImpl : public AANoFree {
   1412   AANoFreeImpl(const IRPosition &IRP, Attributor &A) : AANoFree(IRP, A) {}
   1413 
   1414   /// See AbstractAttribute::updateImpl(...).
   1415   ChangeStatus updateImpl(Attributor &A) override {
   1416     auto CheckForNoFree = [&](Instruction &I) {
   1417       const auto &CB = cast<CallBase>(I);
   1418       if (CB.hasFnAttr(Attribute::NoFree))
   1419         return true;
   1420 
   1421       const auto &NoFreeAA = A.getAAFor<AANoFree>(
   1422           *this, IRPosition::callsite_function(CB), DepClassTy::REQUIRED);
   1423       return NoFreeAA.isAssumedNoFree();
   1424     };
   1425 
   1426     if (!A.checkForAllCallLikeInstructions(CheckForNoFree, *this))
   1427       return indicatePessimisticFixpoint();
   1428     return ChangeStatus::UNCHANGED;
   1429   }
   1430 
   1431   /// See AbstractAttribute::getAsStr().
   1432   const std::string getAsStr() const override {
   1433     return getAssumed() ? "nofree" : "may-free";
   1434   }
   1435 };
   1436 
   1437 struct AANoFreeFunction final : public AANoFreeImpl {
   1438   AANoFreeFunction(const IRPosition &IRP, Attributor &A)
   1439       : AANoFreeImpl(IRP, A) {}
   1440 
   1441   /// See AbstractAttribute::trackStatistics()
   1442   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nofree) }
   1443 };
   1444 
   1445 /// NoFree attribute deduction for a call sites.
   1446 struct AANoFreeCallSite final : AANoFreeImpl {
   1447   AANoFreeCallSite(const IRPosition &IRP, Attributor &A)
   1448       : AANoFreeImpl(IRP, A) {}
   1449 
   1450   /// See AbstractAttribute::initialize(...).
   1451   void initialize(Attributor &A) override {
   1452     AANoFreeImpl::initialize(A);
   1453     Function *F = getAssociatedFunction();
   1454     if (!F || F->isDeclaration())
   1455       indicatePessimisticFixpoint();
   1456   }
   1457 
   1458   /// See AbstractAttribute::updateImpl(...).
   1459   ChangeStatus updateImpl(Attributor &A) override {
   1460     // TODO: Once we have call site specific value information we can provide
   1461     //       call site specific liveness information and then it makes
   1462     //       sense to specialize attributes for call sites arguments instead of
   1463     //       redirecting requests to the callee argument.
   1464     Function *F = getAssociatedFunction();
   1465     const IRPosition &FnPos = IRPosition::function(*F);
   1466     auto &FnAA = A.getAAFor<AANoFree>(*this, FnPos, DepClassTy::REQUIRED);
   1467     return clampStateAndIndicateChange(getState(), FnAA.getState());
   1468   }
   1469 
   1470   /// See AbstractAttribute::trackStatistics()
   1471   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nofree); }
   1472 };
   1473 
   1474 /// NoFree attribute for floating values.
   1475 struct AANoFreeFloating : AANoFreeImpl {
   1476   AANoFreeFloating(const IRPosition &IRP, Attributor &A)
   1477       : AANoFreeImpl(IRP, A) {}
   1478 
   1479   /// See AbstractAttribute::trackStatistics()
   1480   void trackStatistics() const override{STATS_DECLTRACK_FLOATING_ATTR(nofree)}
   1481 
   1482   /// See Abstract Attribute::updateImpl(...).
   1483   ChangeStatus updateImpl(Attributor &A) override {
   1484     const IRPosition &IRP = getIRPosition();
   1485 
   1486     const auto &NoFreeAA = A.getAAFor<AANoFree>(
   1487         *this, IRPosition::function_scope(IRP), DepClassTy::OPTIONAL);
   1488     if (NoFreeAA.isAssumedNoFree())
   1489       return ChangeStatus::UNCHANGED;
   1490 
   1491     Value &AssociatedValue = getIRPosition().getAssociatedValue();
   1492     auto Pred = [&](const Use &U, bool &Follow) -> bool {
   1493       Instruction *UserI = cast<Instruction>(U.getUser());
   1494       if (auto *CB = dyn_cast<CallBase>(UserI)) {
   1495         if (CB->isBundleOperand(&U))
   1496           return false;
   1497         if (!CB->isArgOperand(&U))
   1498           return true;
   1499         unsigned ArgNo = CB->getArgOperandNo(&U);
   1500 
   1501         const auto &NoFreeArg = A.getAAFor<AANoFree>(
   1502             *this, IRPosition::callsite_argument(*CB, ArgNo),
   1503             DepClassTy::REQUIRED);
   1504         return NoFreeArg.isAssumedNoFree();
   1505       }
   1506 
   1507       if (isa<GetElementPtrInst>(UserI) || isa<BitCastInst>(UserI) ||
   1508           isa<PHINode>(UserI) || isa<SelectInst>(UserI)) {
   1509         Follow = true;
   1510         return true;
   1511       }
   1512       if (isa<ReturnInst>(UserI))
   1513         return true;
   1514 
   1515       // Unknown user.
   1516       return false;
   1517     };
   1518     if (!A.checkForAllUses(Pred, *this, AssociatedValue))
   1519       return indicatePessimisticFixpoint();
   1520 
   1521     return ChangeStatus::UNCHANGED;
   1522   }
   1523 };
   1524 
   1525 /// NoFree attribute for a call site argument.
   1526 struct AANoFreeArgument final : AANoFreeFloating {
   1527   AANoFreeArgument(const IRPosition &IRP, Attributor &A)
   1528       : AANoFreeFloating(IRP, A) {}
   1529 
   1530   /// See AbstractAttribute::trackStatistics()
   1531   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(nofree) }
   1532 };
   1533 
   1534 /// NoFree attribute for call site arguments.
   1535 struct AANoFreeCallSiteArgument final : AANoFreeFloating {
   1536   AANoFreeCallSiteArgument(const IRPosition &IRP, Attributor &A)
   1537       : AANoFreeFloating(IRP, A) {}
   1538 
   1539   /// See AbstractAttribute::updateImpl(...).
   1540   ChangeStatus updateImpl(Attributor &A) override {
   1541     // TODO: Once we have call site specific value information we can provide
   1542     //       call site specific liveness information and then it makes
   1543     //       sense to specialize attributes for call sites arguments instead of
   1544     //       redirecting requests to the callee argument.
   1545     Argument *Arg = getAssociatedArgument();
   1546     if (!Arg)
   1547       return indicatePessimisticFixpoint();
   1548     const IRPosition &ArgPos = IRPosition::argument(*Arg);
   1549     auto &ArgAA = A.getAAFor<AANoFree>(*this, ArgPos, DepClassTy::REQUIRED);
   1550     return clampStateAndIndicateChange(getState(), ArgAA.getState());
   1551   }
   1552 
   1553   /// See AbstractAttribute::trackStatistics()
   1554   void trackStatistics() const override{STATS_DECLTRACK_CSARG_ATTR(nofree)};
   1555 };
   1556 
   1557 /// NoFree attribute for function return value.
   1558 struct AANoFreeReturned final : AANoFreeFloating {
   1559   AANoFreeReturned(const IRPosition &IRP, Attributor &A)
   1560       : AANoFreeFloating(IRP, A) {
   1561     llvm_unreachable("NoFree is not applicable to function returns!");
   1562   }
   1563 
   1564   /// See AbstractAttribute::initialize(...).
   1565   void initialize(Attributor &A) override {
   1566     llvm_unreachable("NoFree is not applicable to function returns!");
   1567   }
   1568 
   1569   /// See AbstractAttribute::updateImpl(...).
   1570   ChangeStatus updateImpl(Attributor &A) override {
   1571     llvm_unreachable("NoFree is not applicable to function returns!");
   1572   }
   1573 
   1574   /// See AbstractAttribute::trackStatistics()
   1575   void trackStatistics() const override {}
   1576 };
   1577 
   1578 /// NoFree attribute deduction for a call site return value.
   1579 struct AANoFreeCallSiteReturned final : AANoFreeFloating {
   1580   AANoFreeCallSiteReturned(const IRPosition &IRP, Attributor &A)
   1581       : AANoFreeFloating(IRP, A) {}
   1582 
   1583   ChangeStatus manifest(Attributor &A) override {
   1584     return ChangeStatus::UNCHANGED;
   1585   }
   1586   /// See AbstractAttribute::trackStatistics()
   1587   void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(nofree) }
   1588 };
   1589 
   1590 /// ------------------------ NonNull Argument Attribute ------------------------
   1591 static int64_t getKnownNonNullAndDerefBytesForUse(
   1592     Attributor &A, const AbstractAttribute &QueryingAA, Value &AssociatedValue,
   1593     const Use *U, const Instruction *I, bool &IsNonNull, bool &TrackUse) {
   1594   TrackUse = false;
   1595 
   1596   const Value *UseV = U->get();
   1597   if (!UseV->getType()->isPointerTy())
   1598     return 0;
   1599 
   1600   // We need to follow common pointer manipulation uses to the accesses they
   1601   // feed into. We can try to be smart to avoid looking through things we do not
   1602   // like for now, e.g., non-inbounds GEPs.
   1603   if (isa<CastInst>(I)) {
   1604     TrackUse = true;
   1605     return 0;
   1606   }
   1607 
   1608   if (isa<GetElementPtrInst>(I)) {
   1609     TrackUse = true;
   1610     return 0;
   1611   }
   1612 
   1613   Type *PtrTy = UseV->getType();
   1614   const Function *F = I->getFunction();
   1615   bool NullPointerIsDefined =
   1616       F ? llvm::NullPointerIsDefined(F, PtrTy->getPointerAddressSpace()) : true;
   1617   const DataLayout &DL = A.getInfoCache().getDL();
   1618   if (const auto *CB = dyn_cast<CallBase>(I)) {
   1619     if (CB->isBundleOperand(U)) {
   1620       if (RetainedKnowledge RK = getKnowledgeFromUse(
   1621               U, {Attribute::NonNull, Attribute::Dereferenceable})) {
   1622         IsNonNull |=
   1623             (RK.AttrKind == Attribute::NonNull || !NullPointerIsDefined);
   1624         return RK.ArgValue;
   1625       }
   1626       return 0;
   1627     }
   1628 
   1629     if (CB->isCallee(U)) {
   1630       IsNonNull |= !NullPointerIsDefined;
   1631       return 0;
   1632     }
   1633 
   1634     unsigned ArgNo = CB->getArgOperandNo(U);
   1635     IRPosition IRP = IRPosition::callsite_argument(*CB, ArgNo);
   1636     // As long as we only use known information there is no need to track
   1637     // dependences here.
   1638     auto &DerefAA =
   1639         A.getAAFor<AADereferenceable>(QueryingAA, IRP, DepClassTy::NONE);
   1640     IsNonNull |= DerefAA.isKnownNonNull();
   1641     return DerefAA.getKnownDereferenceableBytes();
   1642   }
   1643 
   1644   int64_t Offset;
   1645   const Value *Base =
   1646       getMinimalBaseOfAccsesPointerOperand(A, QueryingAA, I, Offset, DL);
   1647   if (Base) {
   1648     if (Base == &AssociatedValue &&
   1649         getPointerOperand(I, /* AllowVolatile */ false) == UseV) {
   1650       int64_t DerefBytes =
   1651           (int64_t)DL.getTypeStoreSize(PtrTy->getPointerElementType()) + Offset;
   1652 
   1653       IsNonNull |= !NullPointerIsDefined;
   1654       return std::max(int64_t(0), DerefBytes);
   1655     }
   1656   }
   1657 
   1658   /// Corner case when an offset is 0.
   1659   Base = getBasePointerOfAccessPointerOperand(I, Offset, DL,
   1660                                               /*AllowNonInbounds*/ true);
   1661   if (Base) {
   1662     if (Offset == 0 && Base == &AssociatedValue &&
   1663         getPointerOperand(I, /* AllowVolatile */ false) == UseV) {
   1664       int64_t DerefBytes =
   1665           (int64_t)DL.getTypeStoreSize(PtrTy->getPointerElementType());
   1666       IsNonNull |= !NullPointerIsDefined;
   1667       return std::max(int64_t(0), DerefBytes);
   1668     }
   1669   }
   1670 
   1671   return 0;
   1672 }
   1673 
   1674 struct AANonNullImpl : AANonNull {
   1675   AANonNullImpl(const IRPosition &IRP, Attributor &A)
   1676       : AANonNull(IRP, A),
   1677         NullIsDefined(NullPointerIsDefined(
   1678             getAnchorScope(),
   1679             getAssociatedValue().getType()->getPointerAddressSpace())) {}
   1680 
   1681   /// See AbstractAttribute::initialize(...).
   1682   void initialize(Attributor &A) override {
   1683     Value &V = getAssociatedValue();
   1684     if (!NullIsDefined &&
   1685         hasAttr({Attribute::NonNull, Attribute::Dereferenceable},
   1686                 /* IgnoreSubsumingPositions */ false, &A)) {
   1687       indicateOptimisticFixpoint();
   1688       return;
   1689     }
   1690 
   1691     if (isa<ConstantPointerNull>(V)) {
   1692       indicatePessimisticFixpoint();
   1693       return;
   1694     }
   1695 
   1696     AANonNull::initialize(A);
   1697 
   1698     bool CanBeNull, CanBeFreed;
   1699     if (V.getPointerDereferenceableBytes(A.getDataLayout(), CanBeNull,
   1700                                          CanBeFreed)) {
   1701       if (!CanBeNull) {
   1702         indicateOptimisticFixpoint();
   1703         return;
   1704       }
   1705     }
   1706 
   1707     if (isa<GlobalValue>(&getAssociatedValue())) {
   1708       indicatePessimisticFixpoint();
   1709       return;
   1710     }
   1711 
   1712     if (Instruction *CtxI = getCtxI())
   1713       followUsesInMBEC(*this, A, getState(), *CtxI);
   1714   }
   1715 
   1716   /// See followUsesInMBEC
   1717   bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I,
   1718                        AANonNull::StateType &State) {
   1719     bool IsNonNull = false;
   1720     bool TrackUse = false;
   1721     getKnownNonNullAndDerefBytesForUse(A, *this, getAssociatedValue(), U, I,
   1722                                        IsNonNull, TrackUse);
   1723     State.setKnown(IsNonNull);
   1724     return TrackUse;
   1725   }
   1726 
   1727   /// See AbstractAttribute::getAsStr().
   1728   const std::string getAsStr() const override {
   1729     return getAssumed() ? "nonnull" : "may-null";
   1730   }
   1731 
   1732   /// Flag to determine if the underlying value can be null and still allow
   1733   /// valid accesses.
   1734   const bool NullIsDefined;
   1735 };
   1736 
   1737 /// NonNull attribute for a floating value.
   1738 struct AANonNullFloating : public AANonNullImpl {
   1739   AANonNullFloating(const IRPosition &IRP, Attributor &A)
   1740       : AANonNullImpl(IRP, A) {}
   1741 
   1742   /// See AbstractAttribute::updateImpl(...).
   1743   ChangeStatus updateImpl(Attributor &A) override {
   1744     const DataLayout &DL = A.getDataLayout();
   1745 
   1746     DominatorTree *DT = nullptr;
   1747     AssumptionCache *AC = nullptr;
   1748     InformationCache &InfoCache = A.getInfoCache();
   1749     if (const Function *Fn = getAnchorScope()) {
   1750       DT = InfoCache.getAnalysisResultForFunction<DominatorTreeAnalysis>(*Fn);
   1751       AC = InfoCache.getAnalysisResultForFunction<AssumptionAnalysis>(*Fn);
   1752     }
   1753 
   1754     auto VisitValueCB = [&](Value &V, const Instruction *CtxI,
   1755                             AANonNull::StateType &T, bool Stripped) -> bool {
   1756       const auto &AA = A.getAAFor<AANonNull>(*this, IRPosition::value(V),
   1757                                              DepClassTy::REQUIRED);
   1758       if (!Stripped && this == &AA) {
   1759         if (!isKnownNonZero(&V, DL, 0, AC, CtxI, DT))
   1760           T.indicatePessimisticFixpoint();
   1761       } else {
   1762         // Use abstract attribute information.
   1763         const AANonNull::StateType &NS = AA.getState();
   1764         T ^= NS;
   1765       }
   1766       return T.isValidState();
   1767     };
   1768 
   1769     StateType T;
   1770     if (!genericValueTraversal<AANonNull, StateType>(
   1771             A, getIRPosition(), *this, T, VisitValueCB, getCtxI()))
   1772       return indicatePessimisticFixpoint();
   1773 
   1774     return clampStateAndIndicateChange(getState(), T);
   1775   }
   1776 
   1777   /// See AbstractAttribute::trackStatistics()
   1778   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(nonnull) }
   1779 };
   1780 
   1781 /// NonNull attribute for function return value.
   1782 struct AANonNullReturned final
   1783     : AAReturnedFromReturnedValues<AANonNull, AANonNull> {
   1784   AANonNullReturned(const IRPosition &IRP, Attributor &A)
   1785       : AAReturnedFromReturnedValues<AANonNull, AANonNull>(IRP, A) {}
   1786 
   1787   /// See AbstractAttribute::getAsStr().
   1788   const std::string getAsStr() const override {
   1789     return getAssumed() ? "nonnull" : "may-null";
   1790   }
   1791 
   1792   /// See AbstractAttribute::trackStatistics()
   1793   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(nonnull) }
   1794 };
   1795 
   1796 /// NonNull attribute for function argument.
   1797 struct AANonNullArgument final
   1798     : AAArgumentFromCallSiteArguments<AANonNull, AANonNullImpl> {
   1799   AANonNullArgument(const IRPosition &IRP, Attributor &A)
   1800       : AAArgumentFromCallSiteArguments<AANonNull, AANonNullImpl>(IRP, A) {}
   1801 
   1802   /// See AbstractAttribute::trackStatistics()
   1803   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(nonnull) }
   1804 };
   1805 
   1806 struct AANonNullCallSiteArgument final : AANonNullFloating {
   1807   AANonNullCallSiteArgument(const IRPosition &IRP, Attributor &A)
   1808       : AANonNullFloating(IRP, A) {}
   1809 
   1810   /// See AbstractAttribute::trackStatistics()
   1811   void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(nonnull) }
   1812 };
   1813 
   1814 /// NonNull attribute for a call site return position.
   1815 struct AANonNullCallSiteReturned final
   1816     : AACallSiteReturnedFromReturned<AANonNull, AANonNullImpl> {
   1817   AANonNullCallSiteReturned(const IRPosition &IRP, Attributor &A)
   1818       : AACallSiteReturnedFromReturned<AANonNull, AANonNullImpl>(IRP, A) {}
   1819 
   1820   /// See AbstractAttribute::trackStatistics()
   1821   void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(nonnull) }
   1822 };
   1823 
   1824 /// ------------------------ No-Recurse Attributes ----------------------------
   1825 
   1826 struct AANoRecurseImpl : public AANoRecurse {
   1827   AANoRecurseImpl(const IRPosition &IRP, Attributor &A) : AANoRecurse(IRP, A) {}
   1828 
   1829   /// See AbstractAttribute::getAsStr()
   1830   const std::string getAsStr() const override {
   1831     return getAssumed() ? "norecurse" : "may-recurse";
   1832   }
   1833 };
   1834 
   1835 struct AANoRecurseFunction final : AANoRecurseImpl {
   1836   AANoRecurseFunction(const IRPosition &IRP, Attributor &A)
   1837       : AANoRecurseImpl(IRP, A) {}
   1838 
   1839   /// See AbstractAttribute::initialize(...).
   1840   void initialize(Attributor &A) override {
   1841     AANoRecurseImpl::initialize(A);
   1842     if (const Function *F = getAnchorScope())
   1843       if (A.getInfoCache().getSccSize(*F) != 1)
   1844         indicatePessimisticFixpoint();
   1845   }
   1846 
   1847   /// See AbstractAttribute::updateImpl(...).
   1848   ChangeStatus updateImpl(Attributor &A) override {
   1849 
   1850     // If all live call sites are known to be no-recurse, we are as well.
   1851     auto CallSitePred = [&](AbstractCallSite ACS) {
   1852       const auto &NoRecurseAA = A.getAAFor<AANoRecurse>(
   1853           *this, IRPosition::function(*ACS.getInstruction()->getFunction()),
   1854           DepClassTy::NONE);
   1855       return NoRecurseAA.isKnownNoRecurse();
   1856     };
   1857     bool AllCallSitesKnown;
   1858     if (A.checkForAllCallSites(CallSitePred, *this, true, AllCallSitesKnown)) {
   1859       // If we know all call sites and all are known no-recurse, we are done.
   1860       // If all known call sites, which might not be all that exist, are known
   1861       // to be no-recurse, we are not done but we can continue to assume
   1862       // no-recurse. If one of the call sites we have not visited will become
   1863       // live, another update is triggered.
   1864       if (AllCallSitesKnown)
   1865         indicateOptimisticFixpoint();
   1866       return ChangeStatus::UNCHANGED;
   1867     }
   1868 
   1869     // If the above check does not hold anymore we look at the calls.
   1870     auto CheckForNoRecurse = [&](Instruction &I) {
   1871       const auto &CB = cast<CallBase>(I);
   1872       if (CB.hasFnAttr(Attribute::NoRecurse))
   1873         return true;
   1874 
   1875       const auto &NoRecurseAA = A.getAAFor<AANoRecurse>(
   1876           *this, IRPosition::callsite_function(CB), DepClassTy::REQUIRED);
   1877       if (!NoRecurseAA.isAssumedNoRecurse())
   1878         return false;
   1879 
   1880       // Recursion to the same function
   1881       if (CB.getCalledFunction() == getAnchorScope())
   1882         return false;
   1883 
   1884       return true;
   1885     };
   1886 
   1887     if (!A.checkForAllCallLikeInstructions(CheckForNoRecurse, *this))
   1888       return indicatePessimisticFixpoint();
   1889     return ChangeStatus::UNCHANGED;
   1890   }
   1891 
   1892   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(norecurse) }
   1893 };
   1894 
   1895 /// NoRecurse attribute deduction for a call sites.
   1896 struct AANoRecurseCallSite final : AANoRecurseImpl {
   1897   AANoRecurseCallSite(const IRPosition &IRP, Attributor &A)
   1898       : AANoRecurseImpl(IRP, A) {}
   1899 
   1900   /// See AbstractAttribute::initialize(...).
   1901   void initialize(Attributor &A) override {
   1902     AANoRecurseImpl::initialize(A);
   1903     Function *F = getAssociatedFunction();
   1904     if (!F || F->isDeclaration())
   1905       indicatePessimisticFixpoint();
   1906   }
   1907 
   1908   /// See AbstractAttribute::updateImpl(...).
   1909   ChangeStatus updateImpl(Attributor &A) override {
   1910     // TODO: Once we have call site specific value information we can provide
   1911     //       call site specific liveness information and then it makes
   1912     //       sense to specialize attributes for call sites arguments instead of
   1913     //       redirecting requests to the callee argument.
   1914     Function *F = getAssociatedFunction();
   1915     const IRPosition &FnPos = IRPosition::function(*F);
   1916     auto &FnAA = A.getAAFor<AANoRecurse>(*this, FnPos, DepClassTy::REQUIRED);
   1917     return clampStateAndIndicateChange(getState(), FnAA.getState());
   1918   }
   1919 
   1920   /// See AbstractAttribute::trackStatistics()
   1921   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(norecurse); }
   1922 };
   1923 
   1924 /// -------------------- Undefined-Behavior Attributes ------------------------
   1925 
   1926 struct AAUndefinedBehaviorImpl : public AAUndefinedBehavior {
   1927   AAUndefinedBehaviorImpl(const IRPosition &IRP, Attributor &A)
   1928       : AAUndefinedBehavior(IRP, A) {}
   1929 
   1930   /// See AbstractAttribute::updateImpl(...).
   1931   // through a pointer (i.e. also branches etc.)
   1932   ChangeStatus updateImpl(Attributor &A) override {
   1933     const size_t UBPrevSize = KnownUBInsts.size();
   1934     const size_t NoUBPrevSize = AssumedNoUBInsts.size();
   1935 
   1936     auto InspectMemAccessInstForUB = [&](Instruction &I) {
   1937       // Skip instructions that are already saved.
   1938       if (AssumedNoUBInsts.count(&I) || KnownUBInsts.count(&I))
   1939         return true;
   1940 
   1941       // If we reach here, we know we have an instruction
   1942       // that accesses memory through a pointer operand,
   1943       // for which getPointerOperand() should give it to us.
   1944       const Value *PtrOp = getPointerOperand(&I, /* AllowVolatile */ true);
   1945       assert(PtrOp &&
   1946              "Expected pointer operand of memory accessing instruction");
   1947 
   1948       // Either we stopped and the appropriate action was taken,
   1949       // or we got back a simplified value to continue.
   1950       Optional<Value *> SimplifiedPtrOp = stopOnUndefOrAssumed(A, PtrOp, &I);
   1951       if (!SimplifiedPtrOp.hasValue())
   1952         return true;
   1953       const Value *PtrOpVal = SimplifiedPtrOp.getValue();
   1954 
   1955       // A memory access through a pointer is considered UB
   1956       // only if the pointer has constant null value.
   1957       // TODO: Expand it to not only check constant values.
   1958       if (!isa<ConstantPointerNull>(PtrOpVal)) {
   1959         AssumedNoUBInsts.insert(&I);
   1960         return true;
   1961       }
   1962       const Type *PtrTy = PtrOpVal->getType();
   1963 
   1964       // Because we only consider instructions inside functions,
   1965       // assume that a parent function exists.
   1966       const Function *F = I.getFunction();
   1967 
   1968       // A memory access using constant null pointer is only considered UB
   1969       // if null pointer is _not_ defined for the target platform.
   1970       if (llvm::NullPointerIsDefined(F, PtrTy->getPointerAddressSpace()))
   1971         AssumedNoUBInsts.insert(&I);
   1972       else
   1973         KnownUBInsts.insert(&I);
   1974       return true;
   1975     };
   1976 
   1977     auto InspectBrInstForUB = [&](Instruction &I) {
   1978       // A conditional branch instruction is considered UB if it has `undef`
   1979       // condition.
   1980 
   1981       // Skip instructions that are already saved.
   1982       if (AssumedNoUBInsts.count(&I) || KnownUBInsts.count(&I))
   1983         return true;
   1984 
   1985       // We know we have a branch instruction.
   1986       auto BrInst = cast<BranchInst>(&I);
   1987 
   1988       // Unconditional branches are never considered UB.
   1989       if (BrInst->isUnconditional())
   1990         return true;
   1991 
   1992       // Either we stopped and the appropriate action was taken,
   1993       // or we got back a simplified value to continue.
   1994       Optional<Value *> SimplifiedCond =
   1995           stopOnUndefOrAssumed(A, BrInst->getCondition(), BrInst);
   1996       if (!SimplifiedCond.hasValue())
   1997         return true;
   1998       AssumedNoUBInsts.insert(&I);
   1999       return true;
   2000     };
   2001 
   2002     auto InspectCallSiteForUB = [&](Instruction &I) {
   2003       // Check whether a callsite always cause UB or not
   2004 
   2005       // Skip instructions that are already saved.
   2006       if (AssumedNoUBInsts.count(&I) || KnownUBInsts.count(&I))
   2007         return true;
   2008 
   2009       // Check nonnull and noundef argument attribute violation for each
   2010       // callsite.
   2011       CallBase &CB = cast<CallBase>(I);
   2012       Function *Callee = CB.getCalledFunction();
   2013       if (!Callee)
   2014         return true;
   2015       for (unsigned idx = 0; idx < CB.getNumArgOperands(); idx++) {
   2016         // If current argument is known to be simplified to null pointer and the
   2017         // corresponding argument position is known to have nonnull attribute,
   2018         // the argument is poison. Furthermore, if the argument is poison and
   2019         // the position is known to have noundef attriubte, this callsite is
   2020         // considered UB.
   2021         if (idx >= Callee->arg_size())
   2022           break;
   2023         Value *ArgVal = CB.getArgOperand(idx);
   2024         if (!ArgVal)
   2025           continue;
   2026         // Here, we handle three cases.
   2027         //   (1) Not having a value means it is dead. (we can replace the value
   2028         //       with undef)
   2029         //   (2) Simplified to undef. The argument violate noundef attriubte.
   2030         //   (3) Simplified to null pointer where known to be nonnull.
   2031         //       The argument is a poison value and violate noundef attribute.
   2032         IRPosition CalleeArgumentIRP = IRPosition::callsite_argument(CB, idx);
   2033         auto &NoUndefAA =
   2034             A.getAAFor<AANoUndef>(*this, CalleeArgumentIRP, DepClassTy::NONE);
   2035         if (!NoUndefAA.isKnownNoUndef())
   2036           continue;
   2037         auto &ValueSimplifyAA = A.getAAFor<AAValueSimplify>(
   2038             *this, IRPosition::value(*ArgVal), DepClassTy::NONE);
   2039         if (!ValueSimplifyAA.isKnown())
   2040           continue;
   2041         Optional<Value *> SimplifiedVal =
   2042             ValueSimplifyAA.getAssumedSimplifiedValue(A);
   2043         if (!SimplifiedVal.hasValue() ||
   2044             isa<UndefValue>(*SimplifiedVal.getValue())) {
   2045           KnownUBInsts.insert(&I);
   2046           continue;
   2047         }
   2048         if (!ArgVal->getType()->isPointerTy() ||
   2049             !isa<ConstantPointerNull>(*SimplifiedVal.getValue()))
   2050           continue;
   2051         auto &NonNullAA =
   2052             A.getAAFor<AANonNull>(*this, CalleeArgumentIRP, DepClassTy::NONE);
   2053         if (NonNullAA.isKnownNonNull())
   2054           KnownUBInsts.insert(&I);
   2055       }
   2056       return true;
   2057     };
   2058 
   2059     auto InspectReturnInstForUB =
   2060         [&](Value &V, const SmallSetVector<ReturnInst *, 4> RetInsts) {
   2061           // Check if a return instruction always cause UB or not
   2062           // Note: It is guaranteed that the returned position of the anchor
   2063           //       scope has noundef attribute when this is called.
   2064           //       We also ensure the return position is not "assumed dead"
   2065           //       because the returned value was then potentially simplified to
   2066           //       `undef` in AAReturnedValues without removing the `noundef`
   2067           //       attribute yet.
   2068 
   2069           // When the returned position has noundef attriubte, UB occur in the
   2070           // following cases.
   2071           //   (1) Returned value is known to be undef.
   2072           //   (2) The value is known to be a null pointer and the returned
   2073           //       position has nonnull attribute (because the returned value is
   2074           //       poison).
   2075           bool FoundUB = false;
   2076           if (isa<UndefValue>(V)) {
   2077             FoundUB = true;
   2078           } else {
   2079             if (isa<ConstantPointerNull>(V)) {
   2080               auto &NonNullAA = A.getAAFor<AANonNull>(
   2081                   *this, IRPosition::returned(*getAnchorScope()),
   2082                   DepClassTy::NONE);
   2083               if (NonNullAA.isKnownNonNull())
   2084                 FoundUB = true;
   2085             }
   2086           }
   2087 
   2088           if (FoundUB)
   2089             for (ReturnInst *RI : RetInsts)
   2090               KnownUBInsts.insert(RI);
   2091           return true;
   2092         };
   2093 
   2094     A.checkForAllInstructions(InspectMemAccessInstForUB, *this,
   2095                               {Instruction::Load, Instruction::Store,
   2096                                Instruction::AtomicCmpXchg,
   2097                                Instruction::AtomicRMW},
   2098                               /* CheckBBLivenessOnly */ true);
   2099     A.checkForAllInstructions(InspectBrInstForUB, *this, {Instruction::Br},
   2100                               /* CheckBBLivenessOnly */ true);
   2101     A.checkForAllCallLikeInstructions(InspectCallSiteForUB, *this);
   2102 
   2103     // If the returned position of the anchor scope has noundef attriubte, check
   2104     // all returned instructions.
   2105     if (!getAnchorScope()->getReturnType()->isVoidTy()) {
   2106       const IRPosition &ReturnIRP = IRPosition::returned(*getAnchorScope());
   2107       if (!A.isAssumedDead(ReturnIRP, this, nullptr)) {
   2108         auto &RetPosNoUndefAA =
   2109             A.getAAFor<AANoUndef>(*this, ReturnIRP, DepClassTy::NONE);
   2110         if (RetPosNoUndefAA.isKnownNoUndef())
   2111           A.checkForAllReturnedValuesAndReturnInsts(InspectReturnInstForUB,
   2112                                                     *this);
   2113       }
   2114     }
   2115 
   2116     if (NoUBPrevSize != AssumedNoUBInsts.size() ||
   2117         UBPrevSize != KnownUBInsts.size())
   2118       return ChangeStatus::CHANGED;
   2119     return ChangeStatus::UNCHANGED;
   2120   }
   2121 
   2122   bool isKnownToCauseUB(Instruction *I) const override {
   2123     return KnownUBInsts.count(I);
   2124   }
   2125 
   2126   bool isAssumedToCauseUB(Instruction *I) const override {
   2127     // In simple words, if an instruction is not in the assumed to _not_
   2128     // cause UB, then it is assumed UB (that includes those
   2129     // in the KnownUBInsts set). The rest is boilerplate
   2130     // is to ensure that it is one of the instructions we test
   2131     // for UB.
   2132 
   2133     switch (I->getOpcode()) {
   2134     case Instruction::Load:
   2135     case Instruction::Store:
   2136     case Instruction::AtomicCmpXchg:
   2137     case Instruction::AtomicRMW:
   2138       return !AssumedNoUBInsts.count(I);
   2139     case Instruction::Br: {
   2140       auto BrInst = cast<BranchInst>(I);
   2141       if (BrInst->isUnconditional())
   2142         return false;
   2143       return !AssumedNoUBInsts.count(I);
   2144     } break;
   2145     default:
   2146       return false;
   2147     }
   2148     return false;
   2149   }
   2150 
   2151   ChangeStatus manifest(Attributor &A) override {
   2152     if (KnownUBInsts.empty())
   2153       return ChangeStatus::UNCHANGED;
   2154     for (Instruction *I : KnownUBInsts)
   2155       A.changeToUnreachableAfterManifest(I);
   2156     return ChangeStatus::CHANGED;
   2157   }
   2158 
   2159   /// See AbstractAttribute::getAsStr()
   2160   const std::string getAsStr() const override {
   2161     return getAssumed() ? "undefined-behavior" : "no-ub";
   2162   }
   2163 
   2164   /// Note: The correctness of this analysis depends on the fact that the
   2165   /// following 2 sets will stop changing after some point.
   2166   /// "Change" here means that their size changes.
   2167   /// The size of each set is monotonically increasing
   2168   /// (we only add items to them) and it is upper bounded by the number of
   2169   /// instructions in the processed function (we can never save more
   2170   /// elements in either set than this number). Hence, at some point,
   2171   /// they will stop increasing.
   2172   /// Consequently, at some point, both sets will have stopped
   2173   /// changing, effectively making the analysis reach a fixpoint.
   2174 
   2175   /// Note: These 2 sets are disjoint and an instruction can be considered
   2176   /// one of 3 things:
   2177   /// 1) Known to cause UB (AAUndefinedBehavior could prove it) and put it in
   2178   ///    the KnownUBInsts set.
   2179   /// 2) Assumed to cause UB (in every updateImpl, AAUndefinedBehavior
   2180   ///    has a reason to assume it).
   2181   /// 3) Assumed to not cause UB. very other instruction - AAUndefinedBehavior
   2182   ///    could not find a reason to assume or prove that it can cause UB,
   2183   ///    hence it assumes it doesn't. We have a set for these instructions
   2184   ///    so that we don't reprocess them in every update.
   2185   ///    Note however that instructions in this set may cause UB.
   2186 
   2187 protected:
   2188   /// A set of all live instructions _known_ to cause UB.
   2189   SmallPtrSet<Instruction *, 8> KnownUBInsts;
   2190 
   2191 private:
   2192   /// A set of all the (live) instructions that are assumed to _not_ cause UB.
   2193   SmallPtrSet<Instruction *, 8> AssumedNoUBInsts;
   2194 
   2195   // Should be called on updates in which if we're processing an instruction
   2196   // \p I that depends on a value \p V, one of the following has to happen:
   2197   // - If the value is assumed, then stop.
   2198   // - If the value is known but undef, then consider it UB.
   2199   // - Otherwise, do specific processing with the simplified value.
   2200   // We return None in the first 2 cases to signify that an appropriate
   2201   // action was taken and the caller should stop.
   2202   // Otherwise, we return the simplified value that the caller should
   2203   // use for specific processing.
   2204   Optional<Value *> stopOnUndefOrAssumed(Attributor &A, const Value *V,
   2205                                          Instruction *I) {
   2206     const auto &ValueSimplifyAA = A.getAAFor<AAValueSimplify>(
   2207         *this, IRPosition::value(*V), DepClassTy::REQUIRED);
   2208     Optional<Value *> SimplifiedV =
   2209         ValueSimplifyAA.getAssumedSimplifiedValue(A);
   2210     if (!ValueSimplifyAA.isKnown()) {
   2211       // Don't depend on assumed values.
   2212       return llvm::None;
   2213     }
   2214     if (!SimplifiedV.hasValue()) {
   2215       // If it is known (which we tested above) but it doesn't have a value,
   2216       // then we can assume `undef` and hence the instruction is UB.
   2217       KnownUBInsts.insert(I);
   2218       return llvm::None;
   2219     }
   2220     Value *Val = SimplifiedV.getValue();
   2221     if (isa<UndefValue>(Val)) {
   2222       KnownUBInsts.insert(I);
   2223       return llvm::None;
   2224     }
   2225     return Val;
   2226   }
   2227 };
   2228 
   2229 struct AAUndefinedBehaviorFunction final : AAUndefinedBehaviorImpl {
   2230   AAUndefinedBehaviorFunction(const IRPosition &IRP, Attributor &A)
   2231       : AAUndefinedBehaviorImpl(IRP, A) {}
   2232 
   2233   /// See AbstractAttribute::trackStatistics()
   2234   void trackStatistics() const override {
   2235     STATS_DECL(UndefinedBehaviorInstruction, Instruction,
   2236                "Number of instructions known to have UB");
   2237     BUILD_STAT_NAME(UndefinedBehaviorInstruction, Instruction) +=
   2238         KnownUBInsts.size();
   2239   }
   2240 };
   2241 
   2242 /// ------------------------ Will-Return Attributes ----------------------------
   2243 
   2244 // Helper function that checks whether a function has any cycle which we don't
   2245 // know if it is bounded or not.
   2246 // Loops with maximum trip count are considered bounded, any other cycle not.
   2247 static bool mayContainUnboundedCycle(Function &F, Attributor &A) {
   2248   ScalarEvolution *SE =
   2249       A.getInfoCache().getAnalysisResultForFunction<ScalarEvolutionAnalysis>(F);
   2250   LoopInfo *LI = A.getInfoCache().getAnalysisResultForFunction<LoopAnalysis>(F);
   2251   // If either SCEV or LoopInfo is not available for the function then we assume
   2252   // any cycle to be unbounded cycle.
   2253   // We use scc_iterator which uses Tarjan algorithm to find all the maximal
   2254   // SCCs.To detect if there's a cycle, we only need to find the maximal ones.
   2255   if (!SE || !LI) {
   2256     for (scc_iterator<Function *> SCCI = scc_begin(&F); !SCCI.isAtEnd(); ++SCCI)
   2257       if (SCCI.hasCycle())
   2258         return true;
   2259     return false;
   2260   }
   2261 
   2262   // If there's irreducible control, the function may contain non-loop cycles.
   2263   if (mayContainIrreducibleControl(F, LI))
   2264     return true;
   2265 
   2266   // Any loop that does not have a max trip count is considered unbounded cycle.
   2267   for (auto *L : LI->getLoopsInPreorder()) {
   2268     if (!SE->getSmallConstantMaxTripCount(L))
   2269       return true;
   2270   }
   2271   return false;
   2272 }
   2273 
   2274 struct AAWillReturnImpl : public AAWillReturn {
   2275   AAWillReturnImpl(const IRPosition &IRP, Attributor &A)
   2276       : AAWillReturn(IRP, A) {}
   2277 
   2278   /// See AbstractAttribute::initialize(...).
   2279   void initialize(Attributor &A) override {
   2280     AAWillReturn::initialize(A);
   2281 
   2282     if (isImpliedByMustprogressAndReadonly(A, /* KnownOnly */ true)) {
   2283       indicateOptimisticFixpoint();
   2284       return;
   2285     }
   2286   }
   2287 
   2288   /// Check for `mustprogress` and `readonly` as they imply `willreturn`.
   2289   bool isImpliedByMustprogressAndReadonly(Attributor &A, bool KnownOnly) {
   2290     // Check for `mustprogress` in the scope and the associated function which
   2291     // might be different if this is a call site.
   2292     if ((!getAnchorScope() || !getAnchorScope()->mustProgress()) &&
   2293         (!getAssociatedFunction() || !getAssociatedFunction()->mustProgress()))
   2294       return false;
   2295 
   2296     const auto &MemAA = A.getAAFor<AAMemoryBehavior>(*this, getIRPosition(),
   2297                                                       DepClassTy::NONE);
   2298     if (!MemAA.isAssumedReadOnly())
   2299       return false;
   2300     if (KnownOnly && !MemAA.isKnownReadOnly())
   2301       return false;
   2302     if (!MemAA.isKnownReadOnly())
   2303       A.recordDependence(MemAA, *this, DepClassTy::OPTIONAL);
   2304 
   2305     return true;
   2306   }
   2307 
   2308   /// See AbstractAttribute::updateImpl(...).
   2309   ChangeStatus updateImpl(Attributor &A) override {
   2310     if (isImpliedByMustprogressAndReadonly(A, /* KnownOnly */ false))
   2311       return ChangeStatus::UNCHANGED;
   2312 
   2313     auto CheckForWillReturn = [&](Instruction &I) {
   2314       IRPosition IPos = IRPosition::callsite_function(cast<CallBase>(I));
   2315       const auto &WillReturnAA =
   2316           A.getAAFor<AAWillReturn>(*this, IPos, DepClassTy::REQUIRED);
   2317       if (WillReturnAA.isKnownWillReturn())
   2318         return true;
   2319       if (!WillReturnAA.isAssumedWillReturn())
   2320         return false;
   2321       const auto &NoRecurseAA =
   2322           A.getAAFor<AANoRecurse>(*this, IPos, DepClassTy::REQUIRED);
   2323       return NoRecurseAA.isAssumedNoRecurse();
   2324     };
   2325 
   2326     if (!A.checkForAllCallLikeInstructions(CheckForWillReturn, *this))
   2327       return indicatePessimisticFixpoint();
   2328 
   2329     return ChangeStatus::UNCHANGED;
   2330   }
   2331 
   2332   /// See AbstractAttribute::getAsStr()
   2333   const std::string getAsStr() const override {
   2334     return getAssumed() ? "willreturn" : "may-noreturn";
   2335   }
   2336 };
   2337 
   2338 struct AAWillReturnFunction final : AAWillReturnImpl {
   2339   AAWillReturnFunction(const IRPosition &IRP, Attributor &A)
   2340       : AAWillReturnImpl(IRP, A) {}
   2341 
   2342   /// See AbstractAttribute::initialize(...).
   2343   void initialize(Attributor &A) override {
   2344     AAWillReturnImpl::initialize(A);
   2345 
   2346     Function *F = getAnchorScope();
   2347     if (!F || F->isDeclaration() || mayContainUnboundedCycle(*F, A))
   2348       indicatePessimisticFixpoint();
   2349   }
   2350 
   2351   /// See AbstractAttribute::trackStatistics()
   2352   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(willreturn) }
   2353 };
   2354 
   2355 /// WillReturn attribute deduction for a call sites.
   2356 struct AAWillReturnCallSite final : AAWillReturnImpl {
   2357   AAWillReturnCallSite(const IRPosition &IRP, Attributor &A)
   2358       : AAWillReturnImpl(IRP, A) {}
   2359 
   2360   /// See AbstractAttribute::initialize(...).
   2361   void initialize(Attributor &A) override {
   2362     AAWillReturnImpl::initialize(A);
   2363     Function *F = getAssociatedFunction();
   2364     if (!F || !A.isFunctionIPOAmendable(*F))
   2365       indicatePessimisticFixpoint();
   2366   }
   2367 
   2368   /// See AbstractAttribute::updateImpl(...).
   2369   ChangeStatus updateImpl(Attributor &A) override {
   2370     if (isImpliedByMustprogressAndReadonly(A, /* KnownOnly */ false))
   2371       return ChangeStatus::UNCHANGED;
   2372 
   2373     // TODO: Once we have call site specific value information we can provide
   2374     //       call site specific liveness information and then it makes
   2375     //       sense to specialize attributes for call sites arguments instead of
   2376     //       redirecting requests to the callee argument.
   2377     Function *F = getAssociatedFunction();
   2378     const IRPosition &FnPos = IRPosition::function(*F);
   2379     auto &FnAA = A.getAAFor<AAWillReturn>(*this, FnPos, DepClassTy::REQUIRED);
   2380     return clampStateAndIndicateChange(getState(), FnAA.getState());
   2381   }
   2382 
   2383   /// See AbstractAttribute::trackStatistics()
   2384   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(willreturn); }
   2385 };
   2386 
   2387 /// -------------------AAReachability Attribute--------------------------
   2388 
   2389 struct AAReachabilityImpl : AAReachability {
   2390   AAReachabilityImpl(const IRPosition &IRP, Attributor &A)
   2391       : AAReachability(IRP, A) {}
   2392 
   2393   const std::string getAsStr() const override {
   2394     // TODO: Return the number of reachable queries.
   2395     return "reachable";
   2396   }
   2397 
   2398   /// See AbstractAttribute::initialize(...).
   2399   void initialize(Attributor &A) override { indicatePessimisticFixpoint(); }
   2400 
   2401   /// See AbstractAttribute::updateImpl(...).
   2402   ChangeStatus updateImpl(Attributor &A) override {
   2403     return indicatePessimisticFixpoint();
   2404   }
   2405 };
   2406 
   2407 struct AAReachabilityFunction final : public AAReachabilityImpl {
   2408   AAReachabilityFunction(const IRPosition &IRP, Attributor &A)
   2409       : AAReachabilityImpl(IRP, A) {}
   2410 
   2411   /// See AbstractAttribute::trackStatistics()
   2412   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(reachable); }
   2413 };
   2414 
   2415 /// ------------------------ NoAlias Argument Attribute ------------------------
   2416 
   2417 struct AANoAliasImpl : AANoAlias {
   2418   AANoAliasImpl(const IRPosition &IRP, Attributor &A) : AANoAlias(IRP, A) {
   2419     assert(getAssociatedType()->isPointerTy() &&
   2420            "Noalias is a pointer attribute");
   2421   }
   2422 
   2423   const std::string getAsStr() const override {
   2424     return getAssumed() ? "noalias" : "may-alias";
   2425   }
   2426 };
   2427 
   2428 /// NoAlias attribute for a floating value.
   2429 struct AANoAliasFloating final : AANoAliasImpl {
   2430   AANoAliasFloating(const IRPosition &IRP, Attributor &A)
   2431       : AANoAliasImpl(IRP, A) {}
   2432 
   2433   /// See AbstractAttribute::initialize(...).
   2434   void initialize(Attributor &A) override {
   2435     AANoAliasImpl::initialize(A);
   2436     Value *Val = &getAssociatedValue();
   2437     do {
   2438       CastInst *CI = dyn_cast<CastInst>(Val);
   2439       if (!CI)
   2440         break;
   2441       Value *Base = CI->getOperand(0);
   2442       if (!Base->hasOneUse())
   2443         break;
   2444       Val = Base;
   2445     } while (true);
   2446 
   2447     if (!Val->getType()->isPointerTy()) {
   2448       indicatePessimisticFixpoint();
   2449       return;
   2450     }
   2451 
   2452     if (isa<AllocaInst>(Val))
   2453       indicateOptimisticFixpoint();
   2454     else if (isa<ConstantPointerNull>(Val) &&
   2455              !NullPointerIsDefined(getAnchorScope(),
   2456                                    Val->getType()->getPointerAddressSpace()))
   2457       indicateOptimisticFixpoint();
   2458     else if (Val != &getAssociatedValue()) {
   2459       const auto &ValNoAliasAA = A.getAAFor<AANoAlias>(
   2460           *this, IRPosition::value(*Val), DepClassTy::OPTIONAL);
   2461       if (ValNoAliasAA.isKnownNoAlias())
   2462         indicateOptimisticFixpoint();
   2463     }
   2464   }
   2465 
   2466   /// See AbstractAttribute::updateImpl(...).
   2467   ChangeStatus updateImpl(Attributor &A) override {
   2468     // TODO: Implement this.
   2469     return indicatePessimisticFixpoint();
   2470   }
   2471 
   2472   /// See AbstractAttribute::trackStatistics()
   2473   void trackStatistics() const override {
   2474     STATS_DECLTRACK_FLOATING_ATTR(noalias)
   2475   }
   2476 };
   2477 
   2478 /// NoAlias attribute for an argument.
   2479 struct AANoAliasArgument final
   2480     : AAArgumentFromCallSiteArguments<AANoAlias, AANoAliasImpl> {
   2481   using Base = AAArgumentFromCallSiteArguments<AANoAlias, AANoAliasImpl>;
   2482   AANoAliasArgument(const IRPosition &IRP, Attributor &A) : Base(IRP, A) {}
   2483 
   2484   /// See AbstractAttribute::initialize(...).
   2485   void initialize(Attributor &A) override {
   2486     Base::initialize(A);
   2487     // See callsite argument attribute and callee argument attribute.
   2488     if (hasAttr({Attribute::ByVal}))
   2489       indicateOptimisticFixpoint();
   2490   }
   2491 
   2492   /// See AbstractAttribute::update(...).
   2493   ChangeStatus updateImpl(Attributor &A) override {
   2494     // We have to make sure no-alias on the argument does not break
   2495     // synchronization when this is a callback argument, see also [1] below.
   2496     // If synchronization cannot be affected, we delegate to the base updateImpl
   2497     // function, otherwise we give up for now.
   2498 
   2499     // If the function is no-sync, no-alias cannot break synchronization.
   2500     const auto &NoSyncAA =
   2501         A.getAAFor<AANoSync>(*this, IRPosition::function_scope(getIRPosition()),
   2502                              DepClassTy::OPTIONAL);
   2503     if (NoSyncAA.isAssumedNoSync())
   2504       return Base::updateImpl(A);
   2505 
   2506     // If the argument is read-only, no-alias cannot break synchronization.
   2507     const auto &MemBehaviorAA = A.getAAFor<AAMemoryBehavior>(
   2508         *this, getIRPosition(), DepClassTy::OPTIONAL);
   2509     if (MemBehaviorAA.isAssumedReadOnly())
   2510       return Base::updateImpl(A);
   2511 
   2512     // If the argument is never passed through callbacks, no-alias cannot break
   2513     // synchronization.
   2514     bool AllCallSitesKnown;
   2515     if (A.checkForAllCallSites(
   2516             [](AbstractCallSite ACS) { return !ACS.isCallbackCall(); }, *this,
   2517             true, AllCallSitesKnown))
   2518       return Base::updateImpl(A);
   2519 
   2520     // TODO: add no-alias but make sure it doesn't break synchronization by
   2521     // introducing fake uses. See:
   2522     // [1] Compiler Optimizations for OpenMP, J. Doerfert and H. Finkel,
   2523     //     International Workshop on OpenMP 2018,
   2524     //     http://compilers.cs.uni-saarland.de/people/doerfert/par_opt18.pdf
   2525 
   2526     return indicatePessimisticFixpoint();
   2527   }
   2528 
   2529   /// See AbstractAttribute::trackStatistics()
   2530   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(noalias) }
   2531 };
   2532 
   2533 struct AANoAliasCallSiteArgument final : AANoAliasImpl {
   2534   AANoAliasCallSiteArgument(const IRPosition &IRP, Attributor &A)
   2535       : AANoAliasImpl(IRP, A) {}
   2536 
   2537   /// See AbstractAttribute::initialize(...).
   2538   void initialize(Attributor &A) override {
   2539     // See callsite argument attribute and callee argument attribute.
   2540     const auto &CB = cast<CallBase>(getAnchorValue());
   2541     if (CB.paramHasAttr(getCallSiteArgNo(), Attribute::NoAlias))
   2542       indicateOptimisticFixpoint();
   2543     Value &Val = getAssociatedValue();
   2544     if (isa<ConstantPointerNull>(Val) &&
   2545         !NullPointerIsDefined(getAnchorScope(),
   2546                               Val.getType()->getPointerAddressSpace()))
   2547       indicateOptimisticFixpoint();
   2548   }
   2549 
   2550   /// Determine if the underlying value may alias with the call site argument
   2551   /// \p OtherArgNo of \p ICS (= the underlying call site).
   2552   bool mayAliasWithArgument(Attributor &A, AAResults *&AAR,
   2553                             const AAMemoryBehavior &MemBehaviorAA,
   2554                             const CallBase &CB, unsigned OtherArgNo) {
   2555     // We do not need to worry about aliasing with the underlying IRP.
   2556     if (this->getCalleeArgNo() == (int)OtherArgNo)
   2557       return false;
   2558 
   2559     // If it is not a pointer or pointer vector we do not alias.
   2560     const Value *ArgOp = CB.getArgOperand(OtherArgNo);
   2561     if (!ArgOp->getType()->isPtrOrPtrVectorTy())
   2562       return false;
   2563 
   2564     auto &CBArgMemBehaviorAA = A.getAAFor<AAMemoryBehavior>(
   2565         *this, IRPosition::callsite_argument(CB, OtherArgNo), DepClassTy::NONE);
   2566 
   2567     // If the argument is readnone, there is no read-write aliasing.
   2568     if (CBArgMemBehaviorAA.isAssumedReadNone()) {
   2569       A.recordDependence(CBArgMemBehaviorAA, *this, DepClassTy::OPTIONAL);
   2570       return false;
   2571     }
   2572 
   2573     // If the argument is readonly and the underlying value is readonly, there
   2574     // is no read-write aliasing.
   2575     bool IsReadOnly = MemBehaviorAA.isAssumedReadOnly();
   2576     if (CBArgMemBehaviorAA.isAssumedReadOnly() && IsReadOnly) {
   2577       A.recordDependence(MemBehaviorAA, *this, DepClassTy::OPTIONAL);
   2578       A.recordDependence(CBArgMemBehaviorAA, *this, DepClassTy::OPTIONAL);
   2579       return false;
   2580     }
   2581 
   2582     // We have to utilize actual alias analysis queries so we need the object.
   2583     if (!AAR)
   2584       AAR = A.getInfoCache().getAAResultsForFunction(*getAnchorScope());
   2585 
   2586     // Try to rule it out at the call site.
   2587     bool IsAliasing = !AAR || !AAR->isNoAlias(&getAssociatedValue(), ArgOp);
   2588     LLVM_DEBUG(dbgs() << "[NoAliasCSArg] Check alias between "
   2589                          "callsite arguments: "
   2590                       << getAssociatedValue() << " " << *ArgOp << " => "
   2591                       << (IsAliasing ? "" : "no-") << "alias \n");
   2592 
   2593     return IsAliasing;
   2594   }
   2595 
   2596   bool
   2597   isKnownNoAliasDueToNoAliasPreservation(Attributor &A, AAResults *&AAR,
   2598                                          const AAMemoryBehavior &MemBehaviorAA,
   2599                                          const AANoAlias &NoAliasAA) {
   2600     // We can deduce "noalias" if the following conditions hold.
   2601     // (i)   Associated value is assumed to be noalias in the definition.
   2602     // (ii)  Associated value is assumed to be no-capture in all the uses
   2603     //       possibly executed before this callsite.
   2604     // (iii) There is no other pointer argument which could alias with the
   2605     //       value.
   2606 
   2607     bool AssociatedValueIsNoAliasAtDef = NoAliasAA.isAssumedNoAlias();
   2608     if (!AssociatedValueIsNoAliasAtDef) {
   2609       LLVM_DEBUG(dbgs() << "[AANoAlias] " << getAssociatedValue()
   2610                         << " is not no-alias at the definition\n");
   2611       return false;
   2612     }
   2613 
   2614     A.recordDependence(NoAliasAA, *this, DepClassTy::OPTIONAL);
   2615 
   2616     const IRPosition &VIRP = IRPosition::value(getAssociatedValue());
   2617     const Function *ScopeFn = VIRP.getAnchorScope();
   2618     auto &NoCaptureAA = A.getAAFor<AANoCapture>(*this, VIRP, DepClassTy::NONE);
   2619     // Check whether the value is captured in the scope using AANoCapture.
   2620     //      Look at CFG and check only uses possibly executed before this
   2621     //      callsite.
   2622     auto UsePred = [&](const Use &U, bool &Follow) -> bool {
   2623       Instruction *UserI = cast<Instruction>(U.getUser());
   2624 
   2625       // If UserI is the curr instruction and there is a single potential use of
   2626       // the value in UserI we allow the use.
   2627       // TODO: We should inspect the operands and allow those that cannot alias
   2628       //       with the value.
   2629       if (UserI == getCtxI() && UserI->getNumOperands() == 1)
   2630         return true;
   2631 
   2632       if (ScopeFn) {
   2633         const auto &ReachabilityAA = A.getAAFor<AAReachability>(
   2634             *this, IRPosition::function(*ScopeFn), DepClassTy::OPTIONAL);
   2635 
   2636         if (!ReachabilityAA.isAssumedReachable(A, *UserI, *getCtxI()))
   2637           return true;
   2638 
   2639         if (auto *CB = dyn_cast<CallBase>(UserI)) {
   2640           if (CB->isArgOperand(&U)) {
   2641 
   2642             unsigned ArgNo = CB->getArgOperandNo(&U);
   2643 
   2644             const auto &NoCaptureAA = A.getAAFor<AANoCapture>(
   2645                 *this, IRPosition::callsite_argument(*CB, ArgNo),
   2646                 DepClassTy::OPTIONAL);
   2647 
   2648             if (NoCaptureAA.isAssumedNoCapture())
   2649               return true;
   2650           }
   2651         }
   2652       }
   2653 
   2654       // For cases which can potentially have more users
   2655       if (isa<GetElementPtrInst>(U) || isa<BitCastInst>(U) || isa<PHINode>(U) ||
   2656           isa<SelectInst>(U)) {
   2657         Follow = true;
   2658         return true;
   2659       }
   2660 
   2661       LLVM_DEBUG(dbgs() << "[AANoAliasCSArg] Unknown user: " << *U << "\n");
   2662       return false;
   2663     };
   2664 
   2665     if (!NoCaptureAA.isAssumedNoCaptureMaybeReturned()) {
   2666       if (!A.checkForAllUses(UsePred, *this, getAssociatedValue())) {
   2667         LLVM_DEBUG(
   2668             dbgs() << "[AANoAliasCSArg] " << getAssociatedValue()
   2669                    << " cannot be noalias as it is potentially captured\n");
   2670         return false;
   2671       }
   2672     }
   2673     A.recordDependence(NoCaptureAA, *this, DepClassTy::OPTIONAL);
   2674 
   2675     // Check there is no other pointer argument which could alias with the
   2676     // value passed at this call site.
   2677     // TODO: AbstractCallSite
   2678     const auto &CB = cast<CallBase>(getAnchorValue());
   2679     for (unsigned OtherArgNo = 0; OtherArgNo < CB.getNumArgOperands();
   2680          OtherArgNo++)
   2681       if (mayAliasWithArgument(A, AAR, MemBehaviorAA, CB, OtherArgNo))
   2682         return false;
   2683 
   2684     return true;
   2685   }
   2686 
   2687   /// See AbstractAttribute::updateImpl(...).
   2688   ChangeStatus updateImpl(Attributor &A) override {
   2689     // If the argument is readnone we are done as there are no accesses via the
   2690     // argument.
   2691     auto &MemBehaviorAA =
   2692         A.getAAFor<AAMemoryBehavior>(*this, getIRPosition(), DepClassTy::NONE);
   2693     if (MemBehaviorAA.isAssumedReadNone()) {
   2694       A.recordDependence(MemBehaviorAA, *this, DepClassTy::OPTIONAL);
   2695       return ChangeStatus::UNCHANGED;
   2696     }
   2697 
   2698     const IRPosition &VIRP = IRPosition::value(getAssociatedValue());
   2699     const auto &NoAliasAA =
   2700         A.getAAFor<AANoAlias>(*this, VIRP, DepClassTy::NONE);
   2701 
   2702     AAResults *AAR = nullptr;
   2703     if (isKnownNoAliasDueToNoAliasPreservation(A, AAR, MemBehaviorAA,
   2704                                                NoAliasAA)) {
   2705       LLVM_DEBUG(
   2706           dbgs() << "[AANoAlias] No-Alias deduced via no-alias preservation\n");
   2707       return ChangeStatus::UNCHANGED;
   2708     }
   2709 
   2710     return indicatePessimisticFixpoint();
   2711   }
   2712 
   2713   /// See AbstractAttribute::trackStatistics()
   2714   void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(noalias) }
   2715 };
   2716 
   2717 /// NoAlias attribute for function return value.
   2718 struct AANoAliasReturned final : AANoAliasImpl {
   2719   AANoAliasReturned(const IRPosition &IRP, Attributor &A)
   2720       : AANoAliasImpl(IRP, A) {}
   2721 
   2722   /// See AbstractAttribute::initialize(...).
   2723   void initialize(Attributor &A) override {
   2724     AANoAliasImpl::initialize(A);
   2725     Function *F = getAssociatedFunction();
   2726     if (!F || F->isDeclaration())
   2727       indicatePessimisticFixpoint();
   2728   }
   2729 
   2730   /// See AbstractAttribute::updateImpl(...).
   2731   virtual ChangeStatus updateImpl(Attributor &A) override {
   2732 
   2733     auto CheckReturnValue = [&](Value &RV) -> bool {
   2734       if (Constant *C = dyn_cast<Constant>(&RV))
   2735         if (C->isNullValue() || isa<UndefValue>(C))
   2736           return true;
   2737 
   2738       /// For now, we can only deduce noalias if we have call sites.
   2739       /// FIXME: add more support.
   2740       if (!isa<CallBase>(&RV))
   2741         return false;
   2742 
   2743       const IRPosition &RVPos = IRPosition::value(RV);
   2744       const auto &NoAliasAA =
   2745           A.getAAFor<AANoAlias>(*this, RVPos, DepClassTy::REQUIRED);
   2746       if (!NoAliasAA.isAssumedNoAlias())
   2747         return false;
   2748 
   2749       const auto &NoCaptureAA =
   2750           A.getAAFor<AANoCapture>(*this, RVPos, DepClassTy::REQUIRED);
   2751       return NoCaptureAA.isAssumedNoCaptureMaybeReturned();
   2752     };
   2753 
   2754     if (!A.checkForAllReturnedValues(CheckReturnValue, *this))
   2755       return indicatePessimisticFixpoint();
   2756 
   2757     return ChangeStatus::UNCHANGED;
   2758   }
   2759 
   2760   /// See AbstractAttribute::trackStatistics()
   2761   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(noalias) }
   2762 };
   2763 
   2764 /// NoAlias attribute deduction for a call site return value.
   2765 struct AANoAliasCallSiteReturned final : AANoAliasImpl {
   2766   AANoAliasCallSiteReturned(const IRPosition &IRP, Attributor &A)
   2767       : AANoAliasImpl(IRP, A) {}
   2768 
   2769   /// See AbstractAttribute::initialize(...).
   2770   void initialize(Attributor &A) override {
   2771     AANoAliasImpl::initialize(A);
   2772     Function *F = getAssociatedFunction();
   2773     if (!F || F->isDeclaration())
   2774       indicatePessimisticFixpoint();
   2775   }
   2776 
   2777   /// See AbstractAttribute::updateImpl(...).
   2778   ChangeStatus updateImpl(Attributor &A) override {
   2779     // TODO: Once we have call site specific value information we can provide
   2780     //       call site specific liveness information and then it makes
   2781     //       sense to specialize attributes for call sites arguments instead of
   2782     //       redirecting requests to the callee argument.
   2783     Function *F = getAssociatedFunction();
   2784     const IRPosition &FnPos = IRPosition::returned(*F);
   2785     auto &FnAA = A.getAAFor<AANoAlias>(*this, FnPos, DepClassTy::REQUIRED);
   2786     return clampStateAndIndicateChange(getState(), FnAA.getState());
   2787   }
   2788 
   2789   /// See AbstractAttribute::trackStatistics()
   2790   void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(noalias); }
   2791 };
   2792 
   2793 /// -------------------AAIsDead Function Attribute-----------------------
   2794 
   2795 struct AAIsDeadValueImpl : public AAIsDead {
   2796   AAIsDeadValueImpl(const IRPosition &IRP, Attributor &A) : AAIsDead(IRP, A) {}
   2797 
   2798   /// See AAIsDead::isAssumedDead().
   2799   bool isAssumedDead() const override { return getAssumed(); }
   2800 
   2801   /// See AAIsDead::isKnownDead().
   2802   bool isKnownDead() const override { return getKnown(); }
   2803 
   2804   /// See AAIsDead::isAssumedDead(BasicBlock *).
   2805   bool isAssumedDead(const BasicBlock *BB) const override { return false; }
   2806 
   2807   /// See AAIsDead::isKnownDead(BasicBlock *).
   2808   bool isKnownDead(const BasicBlock *BB) const override { return false; }
   2809 
   2810   /// See AAIsDead::isAssumedDead(Instruction *I).
   2811   bool isAssumedDead(const Instruction *I) const override {
   2812     return I == getCtxI() && isAssumedDead();
   2813   }
   2814 
   2815   /// See AAIsDead::isKnownDead(Instruction *I).
   2816   bool isKnownDead(const Instruction *I) const override {
   2817     return isAssumedDead(I) && getKnown();
   2818   }
   2819 
   2820   /// See AbstractAttribute::getAsStr().
   2821   const std::string getAsStr() const override {
   2822     return isAssumedDead() ? "assumed-dead" : "assumed-live";
   2823   }
   2824 
   2825   /// Check if all uses are assumed dead.
   2826   bool areAllUsesAssumedDead(Attributor &A, Value &V) {
   2827     auto UsePred = [&](const Use &U, bool &Follow) { return false; };
   2828     // Explicitly set the dependence class to required because we want a long
   2829     // chain of N dependent instructions to be considered live as soon as one is
   2830     // without going through N update cycles. This is not required for
   2831     // correctness.
   2832     return A.checkForAllUses(UsePred, *this, V, DepClassTy::REQUIRED);
   2833   }
   2834 
   2835   /// Determine if \p I is assumed to be side-effect free.
   2836   bool isAssumedSideEffectFree(Attributor &A, Instruction *I) {
   2837     if (!I || wouldInstructionBeTriviallyDead(I))
   2838       return true;
   2839 
   2840     auto *CB = dyn_cast<CallBase>(I);
   2841     if (!CB || isa<IntrinsicInst>(CB))
   2842       return false;
   2843 
   2844     const IRPosition &CallIRP = IRPosition::callsite_function(*CB);
   2845     const auto &NoUnwindAA =
   2846         A.getAndUpdateAAFor<AANoUnwind>(*this, CallIRP, DepClassTy::NONE);
   2847     if (!NoUnwindAA.isAssumedNoUnwind())
   2848       return false;
   2849     if (!NoUnwindAA.isKnownNoUnwind())
   2850       A.recordDependence(NoUnwindAA, *this, DepClassTy::OPTIONAL);
   2851 
   2852     const auto &MemBehaviorAA =
   2853         A.getAndUpdateAAFor<AAMemoryBehavior>(*this, CallIRP, DepClassTy::NONE);
   2854     if (MemBehaviorAA.isAssumedReadOnly()) {
   2855       if (!MemBehaviorAA.isKnownReadOnly())
   2856         A.recordDependence(MemBehaviorAA, *this, DepClassTy::OPTIONAL);
   2857       return true;
   2858     }
   2859     return false;
   2860   }
   2861 };
   2862 
   2863 struct AAIsDeadFloating : public AAIsDeadValueImpl {
   2864   AAIsDeadFloating(const IRPosition &IRP, Attributor &A)
   2865       : AAIsDeadValueImpl(IRP, A) {}
   2866 
   2867   /// See AbstractAttribute::initialize(...).
   2868   void initialize(Attributor &A) override {
   2869     if (isa<UndefValue>(getAssociatedValue())) {
   2870       indicatePessimisticFixpoint();
   2871       return;
   2872     }
   2873 
   2874     Instruction *I = dyn_cast<Instruction>(&getAssociatedValue());
   2875     if (!isAssumedSideEffectFree(A, I))
   2876       indicatePessimisticFixpoint();
   2877   }
   2878 
   2879   /// See AbstractAttribute::updateImpl(...).
   2880   ChangeStatus updateImpl(Attributor &A) override {
   2881     Instruction *I = dyn_cast<Instruction>(&getAssociatedValue());
   2882     if (!isAssumedSideEffectFree(A, I))
   2883       return indicatePessimisticFixpoint();
   2884 
   2885     if (!areAllUsesAssumedDead(A, getAssociatedValue()))
   2886       return indicatePessimisticFixpoint();
   2887     return ChangeStatus::UNCHANGED;
   2888   }
   2889 
   2890   /// See AbstractAttribute::manifest(...).
   2891   ChangeStatus manifest(Attributor &A) override {
   2892     Value &V = getAssociatedValue();
   2893     if (auto *I = dyn_cast<Instruction>(&V)) {
   2894       // If we get here we basically know the users are all dead. We check if
   2895       // isAssumedSideEffectFree returns true here again because it might not be
   2896       // the case and only the users are dead but the instruction (=call) is
   2897       // still needed.
   2898       if (isAssumedSideEffectFree(A, I) && !isa<InvokeInst>(I)) {
   2899         A.deleteAfterManifest(*I);
   2900         return ChangeStatus::CHANGED;
   2901       }
   2902     }
   2903     if (V.use_empty())
   2904       return ChangeStatus::UNCHANGED;
   2905 
   2906     bool UsedAssumedInformation = false;
   2907     Optional<Constant *> C =
   2908         A.getAssumedConstant(V, *this, UsedAssumedInformation);
   2909     if (C.hasValue() && C.getValue())
   2910       return ChangeStatus::UNCHANGED;
   2911 
   2912     // Replace the value with undef as it is dead but keep droppable uses around
   2913     // as they provide information we don't want to give up on just yet.
   2914     UndefValue &UV = *UndefValue::get(V.getType());
   2915     bool AnyChange =
   2916         A.changeValueAfterManifest(V, UV, /* ChangeDropppable */ false);
   2917     return AnyChange ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED;
   2918   }
   2919 
   2920   /// See AbstractAttribute::trackStatistics()
   2921   void trackStatistics() const override {
   2922     STATS_DECLTRACK_FLOATING_ATTR(IsDead)
   2923   }
   2924 };
   2925 
   2926 struct AAIsDeadArgument : public AAIsDeadFloating {
   2927   AAIsDeadArgument(const IRPosition &IRP, Attributor &A)
   2928       : AAIsDeadFloating(IRP, A) {}
   2929 
   2930   /// See AbstractAttribute::initialize(...).
   2931   void initialize(Attributor &A) override {
   2932     if (!A.isFunctionIPOAmendable(*getAnchorScope()))
   2933       indicatePessimisticFixpoint();
   2934   }
   2935 
   2936   /// See AbstractAttribute::manifest(...).
   2937   ChangeStatus manifest(Attributor &A) override {
   2938     ChangeStatus Changed = AAIsDeadFloating::manifest(A);
   2939     Argument &Arg = *getAssociatedArgument();
   2940     if (A.isValidFunctionSignatureRewrite(Arg, /* ReplacementTypes */ {}))
   2941       if (A.registerFunctionSignatureRewrite(
   2942               Arg, /* ReplacementTypes */ {},
   2943               Attributor::ArgumentReplacementInfo::CalleeRepairCBTy{},
   2944               Attributor::ArgumentReplacementInfo::ACSRepairCBTy{})) {
   2945         Arg.dropDroppableUses();
   2946         return ChangeStatus::CHANGED;
   2947       }
   2948     return Changed;
   2949   }
   2950 
   2951   /// See AbstractAttribute::trackStatistics()
   2952   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(IsDead) }
   2953 };
   2954 
   2955 struct AAIsDeadCallSiteArgument : public AAIsDeadValueImpl {
   2956   AAIsDeadCallSiteArgument(const IRPosition &IRP, Attributor &A)
   2957       : AAIsDeadValueImpl(IRP, A) {}
   2958 
   2959   /// See AbstractAttribute::initialize(...).
   2960   void initialize(Attributor &A) override {
   2961     if (isa<UndefValue>(getAssociatedValue()))
   2962       indicatePessimisticFixpoint();
   2963   }
   2964 
   2965   /// See AbstractAttribute::updateImpl(...).
   2966   ChangeStatus updateImpl(Attributor &A) override {
   2967     // TODO: Once we have call site specific value information we can provide
   2968     //       call site specific liveness information and then it makes
   2969     //       sense to specialize attributes for call sites arguments instead of
   2970     //       redirecting requests to the callee argument.
   2971     Argument *Arg = getAssociatedArgument();
   2972     if (!Arg)
   2973       return indicatePessimisticFixpoint();
   2974     const IRPosition &ArgPos = IRPosition::argument(*Arg);
   2975     auto &ArgAA = A.getAAFor<AAIsDead>(*this, ArgPos, DepClassTy::REQUIRED);
   2976     return clampStateAndIndicateChange(getState(), ArgAA.getState());
   2977   }
   2978 
   2979   /// See AbstractAttribute::manifest(...).
   2980   ChangeStatus manifest(Attributor &A) override {
   2981     CallBase &CB = cast<CallBase>(getAnchorValue());
   2982     Use &U = CB.getArgOperandUse(getCallSiteArgNo());
   2983     assert(!isa<UndefValue>(U.get()) &&
   2984            "Expected undef values to be filtered out!");
   2985     UndefValue &UV = *UndefValue::get(U->getType());
   2986     if (A.changeUseAfterManifest(U, UV))
   2987       return ChangeStatus::CHANGED;
   2988     return ChangeStatus::UNCHANGED;
   2989   }
   2990 
   2991   /// See AbstractAttribute::trackStatistics()
   2992   void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(IsDead) }
   2993 };
   2994 
   2995 struct AAIsDeadCallSiteReturned : public AAIsDeadFloating {
   2996   AAIsDeadCallSiteReturned(const IRPosition &IRP, Attributor &A)
   2997       : AAIsDeadFloating(IRP, A), IsAssumedSideEffectFree(true) {}
   2998 
   2999   /// See AAIsDead::isAssumedDead().
   3000   bool isAssumedDead() const override {
   3001     return AAIsDeadFloating::isAssumedDead() && IsAssumedSideEffectFree;
   3002   }
   3003 
   3004   /// See AbstractAttribute::initialize(...).
   3005   void initialize(Attributor &A) override {
   3006     if (isa<UndefValue>(getAssociatedValue())) {
   3007       indicatePessimisticFixpoint();
   3008       return;
   3009     }
   3010 
   3011     // We track this separately as a secondary state.
   3012     IsAssumedSideEffectFree = isAssumedSideEffectFree(A, getCtxI());
   3013   }
   3014 
   3015   /// See AbstractAttribute::updateImpl(...).
   3016   ChangeStatus updateImpl(Attributor &A) override {
   3017     ChangeStatus Changed = ChangeStatus::UNCHANGED;
   3018     if (IsAssumedSideEffectFree && !isAssumedSideEffectFree(A, getCtxI())) {
   3019       IsAssumedSideEffectFree = false;
   3020       Changed = ChangeStatus::CHANGED;
   3021     }
   3022 
   3023     if (!areAllUsesAssumedDead(A, getAssociatedValue()))
   3024       return indicatePessimisticFixpoint();
   3025     return Changed;
   3026   }
   3027 
   3028   /// See AbstractAttribute::trackStatistics()
   3029   void trackStatistics() const override {
   3030     if (IsAssumedSideEffectFree)
   3031       STATS_DECLTRACK_CSRET_ATTR(IsDead)
   3032     else
   3033       STATS_DECLTRACK_CSRET_ATTR(UnusedResult)
   3034   }
   3035 
   3036   /// See AbstractAttribute::getAsStr().
   3037   const std::string getAsStr() const override {
   3038     return isAssumedDead()
   3039                ? "assumed-dead"
   3040                : (getAssumed() ? "assumed-dead-users" : "assumed-live");
   3041   }
   3042 
   3043 private:
   3044   bool IsAssumedSideEffectFree;
   3045 };
   3046 
   3047 struct AAIsDeadReturned : public AAIsDeadValueImpl {
   3048   AAIsDeadReturned(const IRPosition &IRP, Attributor &A)
   3049       : AAIsDeadValueImpl(IRP, A) {}
   3050 
   3051   /// See AbstractAttribute::updateImpl(...).
   3052   ChangeStatus updateImpl(Attributor &A) override {
   3053 
   3054     A.checkForAllInstructions([](Instruction &) { return true; }, *this,
   3055                               {Instruction::Ret});
   3056 
   3057     auto PredForCallSite = [&](AbstractCallSite ACS) {
   3058       if (ACS.isCallbackCall() || !ACS.getInstruction())
   3059         return false;
   3060       return areAllUsesAssumedDead(A, *ACS.getInstruction());
   3061     };
   3062 
   3063     bool AllCallSitesKnown;
   3064     if (!A.checkForAllCallSites(PredForCallSite, *this, true,
   3065                                 AllCallSitesKnown))
   3066       return indicatePessimisticFixpoint();
   3067 
   3068     return ChangeStatus::UNCHANGED;
   3069   }
   3070 
   3071   /// See AbstractAttribute::manifest(...).
   3072   ChangeStatus manifest(Attributor &A) override {
   3073     // TODO: Rewrite the signature to return void?
   3074     bool AnyChange = false;
   3075     UndefValue &UV = *UndefValue::get(getAssociatedFunction()->getReturnType());
   3076     auto RetInstPred = [&](Instruction &I) {
   3077       ReturnInst &RI = cast<ReturnInst>(I);
   3078       if (!isa<UndefValue>(RI.getReturnValue()))
   3079         AnyChange |= A.changeUseAfterManifest(RI.getOperandUse(0), UV);
   3080       return true;
   3081     };
   3082     A.checkForAllInstructions(RetInstPred, *this, {Instruction::Ret});
   3083     return AnyChange ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED;
   3084   }
   3085 
   3086   /// See AbstractAttribute::trackStatistics()
   3087   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(IsDead) }
   3088 };
   3089 
   3090 struct AAIsDeadFunction : public AAIsDead {
   3091   AAIsDeadFunction(const IRPosition &IRP, Attributor &A) : AAIsDead(IRP, A) {}
   3092 
   3093   /// See AbstractAttribute::initialize(...).
   3094   void initialize(Attributor &A) override {
   3095     const Function *F = getAnchorScope();
   3096     if (F && !F->isDeclaration()) {
   3097       // We only want to compute liveness once. If the function is not part of
   3098       // the SCC, skip it.
   3099       if (A.isRunOn(*const_cast<Function *>(F))) {
   3100         ToBeExploredFrom.insert(&F->getEntryBlock().front());
   3101         assumeLive(A, F->getEntryBlock());
   3102       } else {
   3103         indicatePessimisticFixpoint();
   3104       }
   3105     }
   3106   }
   3107 
   3108   /// See AbstractAttribute::getAsStr().
   3109   const std::string getAsStr() const override {
   3110     return "Live[#BB " + std::to_string(AssumedLiveBlocks.size()) + "/" +
   3111            std::to_string(getAnchorScope()->size()) + "][#TBEP " +
   3112            std::to_string(ToBeExploredFrom.size()) + "][#KDE " +
   3113            std::to_string(KnownDeadEnds.size()) + "]";
   3114   }
   3115 
   3116   /// See AbstractAttribute::manifest(...).
   3117   ChangeStatus manifest(Attributor &A) override {
   3118     assert(getState().isValidState() &&
   3119            "Attempted to manifest an invalid state!");
   3120 
   3121     ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
   3122     Function &F = *getAnchorScope();
   3123 
   3124     if (AssumedLiveBlocks.empty()) {
   3125       A.deleteAfterManifest(F);
   3126       return ChangeStatus::CHANGED;
   3127     }
   3128 
   3129     // Flag to determine if we can change an invoke to a call assuming the
   3130     // callee is nounwind. This is not possible if the personality of the
   3131     // function allows to catch asynchronous exceptions.
   3132     bool Invoke2CallAllowed = !mayCatchAsynchronousExceptions(F);
   3133 
   3134     KnownDeadEnds.set_union(ToBeExploredFrom);
   3135     for (const Instruction *DeadEndI : KnownDeadEnds) {
   3136       auto *CB = dyn_cast<CallBase>(DeadEndI);
   3137       if (!CB)
   3138         continue;
   3139       const auto &NoReturnAA = A.getAndUpdateAAFor<AANoReturn>(
   3140           *this, IRPosition::callsite_function(*CB), DepClassTy::OPTIONAL);
   3141       bool MayReturn = !NoReturnAA.isAssumedNoReturn();
   3142       if (MayReturn && (!Invoke2CallAllowed || !isa<InvokeInst>(CB)))
   3143         continue;
   3144 
   3145       if (auto *II = dyn_cast<InvokeInst>(DeadEndI))
   3146         A.registerInvokeWithDeadSuccessor(const_cast<InvokeInst &>(*II));
   3147       else
   3148         A.changeToUnreachableAfterManifest(
   3149             const_cast<Instruction *>(DeadEndI->getNextNode()));
   3150       HasChanged = ChangeStatus::CHANGED;
   3151     }
   3152 
   3153     STATS_DECL(AAIsDead, BasicBlock, "Number of dead basic blocks deleted.");
   3154     for (BasicBlock &BB : F)
   3155       if (!AssumedLiveBlocks.count(&BB)) {
   3156         A.deleteAfterManifest(BB);
   3157         ++BUILD_STAT_NAME(AAIsDead, BasicBlock);
   3158       }
   3159 
   3160     return HasChanged;
   3161   }
   3162 
   3163   /// See AbstractAttribute::updateImpl(...).
   3164   ChangeStatus updateImpl(Attributor &A) override;
   3165 
   3166   bool isEdgeDead(const BasicBlock *From, const BasicBlock *To) const override {
   3167     return !AssumedLiveEdges.count(std::make_pair(From, To));
   3168   }
   3169 
   3170   /// See AbstractAttribute::trackStatistics()
   3171   void trackStatistics() const override {}
   3172 
   3173   /// Returns true if the function is assumed dead.
   3174   bool isAssumedDead() const override { return false; }
   3175 
   3176   /// See AAIsDead::isKnownDead().
   3177   bool isKnownDead() const override { return false; }
   3178 
   3179   /// See AAIsDead::isAssumedDead(BasicBlock *).
   3180   bool isAssumedDead(const BasicBlock *BB) const override {
   3181     assert(BB->getParent() == getAnchorScope() &&
   3182            "BB must be in the same anchor scope function.");
   3183 
   3184     if (!getAssumed())
   3185       return false;
   3186     return !AssumedLiveBlocks.count(BB);
   3187   }
   3188 
   3189   /// See AAIsDead::isKnownDead(BasicBlock *).
   3190   bool isKnownDead(const BasicBlock *BB) const override {
   3191     return getKnown() && isAssumedDead(BB);
   3192   }
   3193 
   3194   /// See AAIsDead::isAssumed(Instruction *I).
   3195   bool isAssumedDead(const Instruction *I) const override {
   3196     assert(I->getParent()->getParent() == getAnchorScope() &&
   3197            "Instruction must be in the same anchor scope function.");
   3198 
   3199     if (!getAssumed())
   3200       return false;
   3201 
   3202     // If it is not in AssumedLiveBlocks then it for sure dead.
   3203     // Otherwise, it can still be after noreturn call in a live block.
   3204     if (!AssumedLiveBlocks.count(I->getParent()))
   3205       return true;
   3206 
   3207     // If it is not after a liveness barrier it is live.
   3208     const Instruction *PrevI = I->getPrevNode();
   3209     while (PrevI) {
   3210       if (KnownDeadEnds.count(PrevI) || ToBeExploredFrom.count(PrevI))
   3211         return true;
   3212       PrevI = PrevI->getPrevNode();
   3213     }
   3214     return false;
   3215   }
   3216 
   3217   /// See AAIsDead::isKnownDead(Instruction *I).
   3218   bool isKnownDead(const Instruction *I) const override {
   3219     return getKnown() && isAssumedDead(I);
   3220   }
   3221 
   3222   /// Assume \p BB is (partially) live now and indicate to the Attributor \p A
   3223   /// that internal function called from \p BB should now be looked at.
   3224   bool assumeLive(Attributor &A, const BasicBlock &BB) {
   3225     if (!AssumedLiveBlocks.insert(&BB).second)
   3226       return false;
   3227 
   3228     // We assume that all of BB is (probably) live now and if there are calls to
   3229     // internal functions we will assume that those are now live as well. This
   3230     // is a performance optimization for blocks with calls to a lot of internal
   3231     // functions. It can however cause dead functions to be treated as live.
   3232     for (const Instruction &I : BB)
   3233       if (const auto *CB = dyn_cast<CallBase>(&I))
   3234         if (const Function *F = CB->getCalledFunction())
   3235           if (F->hasLocalLinkage())
   3236             A.markLiveInternalFunction(*F);
   3237     return true;
   3238   }
   3239 
   3240   /// Collection of instructions that need to be explored again, e.g., we
   3241   /// did assume they do not transfer control to (one of their) successors.
   3242   SmallSetVector<const Instruction *, 8> ToBeExploredFrom;
   3243 
   3244   /// Collection of instructions that are known to not transfer control.
   3245   SmallSetVector<const Instruction *, 8> KnownDeadEnds;
   3246 
   3247   /// Collection of all assumed live edges
   3248   DenseSet<std::pair<const BasicBlock *, const BasicBlock *>> AssumedLiveEdges;
   3249 
   3250   /// Collection of all assumed live BasicBlocks.
   3251   DenseSet<const BasicBlock *> AssumedLiveBlocks;
   3252 };
   3253 
   3254 static bool
   3255 identifyAliveSuccessors(Attributor &A, const CallBase &CB,
   3256                         AbstractAttribute &AA,
   3257                         SmallVectorImpl<const Instruction *> &AliveSuccessors) {
   3258   const IRPosition &IPos = IRPosition::callsite_function(CB);
   3259 
   3260   const auto &NoReturnAA =
   3261       A.getAndUpdateAAFor<AANoReturn>(AA, IPos, DepClassTy::OPTIONAL);
   3262   if (NoReturnAA.isAssumedNoReturn())
   3263     return !NoReturnAA.isKnownNoReturn();
   3264   if (CB.isTerminator())
   3265     AliveSuccessors.push_back(&CB.getSuccessor(0)->front());
   3266   else
   3267     AliveSuccessors.push_back(CB.getNextNode());
   3268   return false;
   3269 }
   3270 
   3271 static bool
   3272 identifyAliveSuccessors(Attributor &A, const InvokeInst &II,
   3273                         AbstractAttribute &AA,
   3274                         SmallVectorImpl<const Instruction *> &AliveSuccessors) {
   3275   bool UsedAssumedInformation =
   3276       identifyAliveSuccessors(A, cast<CallBase>(II), AA, AliveSuccessors);
   3277 
   3278   // First, determine if we can change an invoke to a call assuming the
   3279   // callee is nounwind. This is not possible if the personality of the
   3280   // function allows to catch asynchronous exceptions.
   3281   if (AAIsDeadFunction::mayCatchAsynchronousExceptions(*II.getFunction())) {
   3282     AliveSuccessors.push_back(&II.getUnwindDest()->front());
   3283   } else {
   3284     const IRPosition &IPos = IRPosition::callsite_function(II);
   3285     const auto &AANoUnw =
   3286         A.getAndUpdateAAFor<AANoUnwind>(AA, IPos, DepClassTy::OPTIONAL);
   3287     if (AANoUnw.isAssumedNoUnwind()) {
   3288       UsedAssumedInformation |= !AANoUnw.isKnownNoUnwind();
   3289     } else {
   3290       AliveSuccessors.push_back(&II.getUnwindDest()->front());
   3291     }
   3292   }
   3293   return UsedAssumedInformation;
   3294 }
   3295 
   3296 static bool
   3297 identifyAliveSuccessors(Attributor &A, const BranchInst &BI,
   3298                         AbstractAttribute &AA,
   3299                         SmallVectorImpl<const Instruction *> &AliveSuccessors) {
   3300   bool UsedAssumedInformation = false;
   3301   if (BI.getNumSuccessors() == 1) {
   3302     AliveSuccessors.push_back(&BI.getSuccessor(0)->front());
   3303   } else {
   3304     Optional<ConstantInt *> CI = getAssumedConstantInt(
   3305         A, *BI.getCondition(), AA, UsedAssumedInformation);
   3306     if (!CI.hasValue()) {
   3307       // No value yet, assume both edges are dead.
   3308     } else if (CI.getValue()) {
   3309       const BasicBlock *SuccBB =
   3310           BI.getSuccessor(1 - CI.getValue()->getZExtValue());
   3311       AliveSuccessors.push_back(&SuccBB->front());
   3312     } else {
   3313       AliveSuccessors.push_back(&BI.getSuccessor(0)->front());
   3314       AliveSuccessors.push_back(&BI.getSuccessor(1)->front());
   3315       UsedAssumedInformation = false;
   3316     }
   3317   }
   3318   return UsedAssumedInformation;
   3319 }
   3320 
   3321 static bool
   3322 identifyAliveSuccessors(Attributor &A, const SwitchInst &SI,
   3323                         AbstractAttribute &AA,
   3324                         SmallVectorImpl<const Instruction *> &AliveSuccessors) {
   3325   bool UsedAssumedInformation = false;
   3326   Optional<ConstantInt *> CI =
   3327       getAssumedConstantInt(A, *SI.getCondition(), AA, UsedAssumedInformation);
   3328   if (!CI.hasValue()) {
   3329     // No value yet, assume all edges are dead.
   3330   } else if (CI.getValue()) {
   3331     for (auto &CaseIt : SI.cases()) {
   3332       if (CaseIt.getCaseValue() == CI.getValue()) {
   3333         AliveSuccessors.push_back(&CaseIt.getCaseSuccessor()->front());
   3334         return UsedAssumedInformation;
   3335       }
   3336     }
   3337     AliveSuccessors.push_back(&SI.getDefaultDest()->front());
   3338     return UsedAssumedInformation;
   3339   } else {
   3340     for (const BasicBlock *SuccBB : successors(SI.getParent()))
   3341       AliveSuccessors.push_back(&SuccBB->front());
   3342   }
   3343   return UsedAssumedInformation;
   3344 }
   3345 
   3346 ChangeStatus AAIsDeadFunction::updateImpl(Attributor &A) {
   3347   ChangeStatus Change = ChangeStatus::UNCHANGED;
   3348 
   3349   LLVM_DEBUG(dbgs() << "[AAIsDead] Live [" << AssumedLiveBlocks.size() << "/"
   3350                     << getAnchorScope()->size() << "] BBs and "
   3351                     << ToBeExploredFrom.size() << " exploration points and "
   3352                     << KnownDeadEnds.size() << " known dead ends\n");
   3353 
   3354   // Copy and clear the list of instructions we need to explore from. It is
   3355   // refilled with instructions the next update has to look at.
   3356   SmallVector<const Instruction *, 8> Worklist(ToBeExploredFrom.begin(),
   3357                                                ToBeExploredFrom.end());
   3358   decltype(ToBeExploredFrom) NewToBeExploredFrom;
   3359 
   3360   SmallVector<const Instruction *, 8> AliveSuccessors;
   3361   while (!Worklist.empty()) {
   3362     const Instruction *I = Worklist.pop_back_val();
   3363     LLVM_DEBUG(dbgs() << "[AAIsDead] Exploration inst: " << *I << "\n");
   3364 
   3365     // Fast forward for uninteresting instructions. We could look for UB here
   3366     // though.
   3367     while (!I->isTerminator() && !isa<CallBase>(I)) {
   3368       Change = ChangeStatus::CHANGED;
   3369       I = I->getNextNode();
   3370     }
   3371 
   3372     AliveSuccessors.clear();
   3373 
   3374     bool UsedAssumedInformation = false;
   3375     switch (I->getOpcode()) {
   3376     // TODO: look for (assumed) UB to backwards propagate "deadness".
   3377     default:
   3378       assert(I->isTerminator() &&
   3379              "Expected non-terminators to be handled already!");
   3380       for (const BasicBlock *SuccBB : successors(I->getParent()))
   3381         AliveSuccessors.push_back(&SuccBB->front());
   3382       break;
   3383     case Instruction::Call:
   3384       UsedAssumedInformation = identifyAliveSuccessors(A, cast<CallInst>(*I),
   3385                                                        *this, AliveSuccessors);
   3386       break;
   3387     case Instruction::Invoke:
   3388       UsedAssumedInformation = identifyAliveSuccessors(A, cast<InvokeInst>(*I),
   3389                                                        *this, AliveSuccessors);
   3390       break;
   3391     case Instruction::Br:
   3392       UsedAssumedInformation = identifyAliveSuccessors(A, cast<BranchInst>(*I),
   3393                                                        *this, AliveSuccessors);
   3394       break;
   3395     case Instruction::Switch:
   3396       UsedAssumedInformation = identifyAliveSuccessors(A, cast<SwitchInst>(*I),
   3397                                                        *this, AliveSuccessors);
   3398       break;
   3399     }
   3400 
   3401     if (UsedAssumedInformation) {
   3402       NewToBeExploredFrom.insert(I);
   3403     } else {
   3404       Change = ChangeStatus::CHANGED;
   3405       if (AliveSuccessors.empty() ||
   3406           (I->isTerminator() && AliveSuccessors.size() < I->getNumSuccessors()))
   3407         KnownDeadEnds.insert(I);
   3408     }
   3409 
   3410     LLVM_DEBUG(dbgs() << "[AAIsDead] #AliveSuccessors: "
   3411                       << AliveSuccessors.size() << " UsedAssumedInformation: "
   3412                       << UsedAssumedInformation << "\n");
   3413 
   3414     for (const Instruction *AliveSuccessor : AliveSuccessors) {
   3415       if (!I->isTerminator()) {
   3416         assert(AliveSuccessors.size() == 1 &&
   3417                "Non-terminator expected to have a single successor!");
   3418         Worklist.push_back(AliveSuccessor);
   3419       } else {
   3420         // record the assumed live edge
   3421         AssumedLiveEdges.insert(
   3422             std::make_pair(I->getParent(), AliveSuccessor->getParent()));
   3423         if (assumeLive(A, *AliveSuccessor->getParent()))
   3424           Worklist.push_back(AliveSuccessor);
   3425       }
   3426     }
   3427   }
   3428 
   3429   ToBeExploredFrom = std::move(NewToBeExploredFrom);
   3430 
   3431   // If we know everything is live there is no need to query for liveness.
   3432   // Instead, indicating a pessimistic fixpoint will cause the state to be
   3433   // "invalid" and all queries to be answered conservatively without lookups.
   3434   // To be in this state we have to (1) finished the exploration and (3) not
   3435   // discovered any non-trivial dead end and (2) not ruled unreachable code
   3436   // dead.
   3437   if (ToBeExploredFrom.empty() &&
   3438       getAnchorScope()->size() == AssumedLiveBlocks.size() &&
   3439       llvm::all_of(KnownDeadEnds, [](const Instruction *DeadEndI) {
   3440         return DeadEndI->isTerminator() && DeadEndI->getNumSuccessors() == 0;
   3441       }))
   3442     return indicatePessimisticFixpoint();
   3443   return Change;
   3444 }
   3445 
   3446 /// Liveness information for a call sites.
   3447 struct AAIsDeadCallSite final : AAIsDeadFunction {
   3448   AAIsDeadCallSite(const IRPosition &IRP, Attributor &A)
   3449       : AAIsDeadFunction(IRP, A) {}
   3450 
   3451   /// See AbstractAttribute::initialize(...).
   3452   void initialize(Attributor &A) override {
   3453     // TODO: Once we have call site specific value information we can provide
   3454     //       call site specific liveness information and then it makes
   3455     //       sense to specialize attributes for call sites instead of
   3456     //       redirecting requests to the callee.
   3457     llvm_unreachable("Abstract attributes for liveness are not "
   3458                      "supported for call sites yet!");
   3459   }
   3460 
   3461   /// See AbstractAttribute::updateImpl(...).
   3462   ChangeStatus updateImpl(Attributor &A) override {
   3463     return indicatePessimisticFixpoint();
   3464   }
   3465 
   3466   /// See AbstractAttribute::trackStatistics()
   3467   void trackStatistics() const override {}
   3468 };
   3469 
   3470 /// -------------------- Dereferenceable Argument Attribute --------------------
   3471 
   3472 template <>
   3473 ChangeStatus clampStateAndIndicateChange<DerefState>(DerefState &S,
   3474                                                      const DerefState &R) {
   3475   ChangeStatus CS0 =
   3476       clampStateAndIndicateChange(S.DerefBytesState, R.DerefBytesState);
   3477   ChangeStatus CS1 = clampStateAndIndicateChange(S.GlobalState, R.GlobalState);
   3478   return CS0 | CS1;
   3479 }
   3480 
   3481 struct AADereferenceableImpl : AADereferenceable {
   3482   AADereferenceableImpl(const IRPosition &IRP, Attributor &A)
   3483       : AADereferenceable(IRP, A) {}
   3484   using StateType = DerefState;
   3485 
   3486   /// See AbstractAttribute::initialize(...).
   3487   void initialize(Attributor &A) override {
   3488     SmallVector<Attribute, 4> Attrs;
   3489     getAttrs({Attribute::Dereferenceable, Attribute::DereferenceableOrNull},
   3490              Attrs, /* IgnoreSubsumingPositions */ false, &A);
   3491     for (const Attribute &Attr : Attrs)
   3492       takeKnownDerefBytesMaximum(Attr.getValueAsInt());
   3493 
   3494     const IRPosition &IRP = this->getIRPosition();
   3495     NonNullAA = &A.getAAFor<AANonNull>(*this, IRP, DepClassTy::NONE);
   3496 
   3497     bool CanBeNull, CanBeFreed;
   3498     takeKnownDerefBytesMaximum(
   3499         IRP.getAssociatedValue().getPointerDereferenceableBytes(
   3500             A.getDataLayout(), CanBeNull, CanBeFreed));
   3501 
   3502     bool IsFnInterface = IRP.isFnInterfaceKind();
   3503     Function *FnScope = IRP.getAnchorScope();
   3504     if (IsFnInterface && (!FnScope || !A.isFunctionIPOAmendable(*FnScope))) {
   3505       indicatePessimisticFixpoint();
   3506       return;
   3507     }
   3508 
   3509     if (Instruction *CtxI = getCtxI())
   3510       followUsesInMBEC(*this, A, getState(), *CtxI);
   3511   }
   3512 
   3513   /// See AbstractAttribute::getState()
   3514   /// {
   3515   StateType &getState() override { return *this; }
   3516   const StateType &getState() const override { return *this; }
   3517   /// }
   3518 
   3519   /// Helper function for collecting accessed bytes in must-be-executed-context
   3520   void addAccessedBytesForUse(Attributor &A, const Use *U, const Instruction *I,
   3521                               DerefState &State) {
   3522     const Value *UseV = U->get();
   3523     if (!UseV->getType()->isPointerTy())
   3524       return;
   3525 
   3526     Type *PtrTy = UseV->getType();
   3527     const DataLayout &DL = A.getDataLayout();
   3528     int64_t Offset;
   3529     if (const Value *Base = getBasePointerOfAccessPointerOperand(
   3530             I, Offset, DL, /*AllowNonInbounds*/ true)) {
   3531       if (Base == &getAssociatedValue() &&
   3532           getPointerOperand(I, /* AllowVolatile */ false) == UseV) {
   3533         uint64_t Size = DL.getTypeStoreSize(PtrTy->getPointerElementType());
   3534         State.addAccessedBytes(Offset, Size);
   3535       }
   3536     }
   3537   }
   3538 
   3539   /// See followUsesInMBEC
   3540   bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I,
   3541                        AADereferenceable::StateType &State) {
   3542     bool IsNonNull = false;
   3543     bool TrackUse = false;
   3544     int64_t DerefBytes = getKnownNonNullAndDerefBytesForUse(
   3545         A, *this, getAssociatedValue(), U, I, IsNonNull, TrackUse);
   3546     LLVM_DEBUG(dbgs() << "[AADereferenceable] Deref bytes: " << DerefBytes
   3547                       << " for instruction " << *I << "\n");
   3548 
   3549     addAccessedBytesForUse(A, U, I, State);
   3550     State.takeKnownDerefBytesMaximum(DerefBytes);
   3551     return TrackUse;
   3552   }
   3553 
   3554   /// See AbstractAttribute::manifest(...).
   3555   ChangeStatus manifest(Attributor &A) override {
   3556     ChangeStatus Change = AADereferenceable::manifest(A);
   3557     if (isAssumedNonNull() && hasAttr(Attribute::DereferenceableOrNull)) {
   3558       removeAttrs({Attribute::DereferenceableOrNull});
   3559       return ChangeStatus::CHANGED;
   3560     }
   3561     return Change;
   3562   }
   3563 
   3564   void getDeducedAttributes(LLVMContext &Ctx,
   3565                             SmallVectorImpl<Attribute> &Attrs) const override {
   3566     // TODO: Add *_globally support
   3567     if (isAssumedNonNull())
   3568       Attrs.emplace_back(Attribute::getWithDereferenceableBytes(
   3569           Ctx, getAssumedDereferenceableBytes()));
   3570     else
   3571       Attrs.emplace_back(Attribute::getWithDereferenceableOrNullBytes(
   3572           Ctx, getAssumedDereferenceableBytes()));
   3573   }
   3574 
   3575   /// See AbstractAttribute::getAsStr().
   3576   const std::string getAsStr() const override {
   3577     if (!getAssumedDereferenceableBytes())
   3578       return "unknown-dereferenceable";
   3579     return std::string("dereferenceable") +
   3580            (isAssumedNonNull() ? "" : "_or_null") +
   3581            (isAssumedGlobal() ? "_globally" : "") + "<" +
   3582            std::to_string(getKnownDereferenceableBytes()) + "-" +
   3583            std::to_string(getAssumedDereferenceableBytes()) + ">";
   3584   }
   3585 };
   3586 
   3587 /// Dereferenceable attribute for a floating value.
   3588 struct AADereferenceableFloating : AADereferenceableImpl {
   3589   AADereferenceableFloating(const IRPosition &IRP, Attributor &A)
   3590       : AADereferenceableImpl(IRP, A) {}
   3591 
   3592   /// See AbstractAttribute::updateImpl(...).
   3593   ChangeStatus updateImpl(Attributor &A) override {
   3594     const DataLayout &DL = A.getDataLayout();
   3595 
   3596     auto VisitValueCB = [&](const Value &V, const Instruction *, DerefState &T,
   3597                             bool Stripped) -> bool {
   3598       unsigned IdxWidth =
   3599           DL.getIndexSizeInBits(V.getType()->getPointerAddressSpace());
   3600       APInt Offset(IdxWidth, 0);
   3601       const Value *Base =
   3602           stripAndAccumulateMinimalOffsets(A, *this, &V, DL, Offset, false);
   3603 
   3604       const auto &AA = A.getAAFor<AADereferenceable>(
   3605           *this, IRPosition::value(*Base), DepClassTy::REQUIRED);
   3606       int64_t DerefBytes = 0;
   3607       if (!Stripped && this == &AA) {
   3608         // Use IR information if we did not strip anything.
   3609         // TODO: track globally.
   3610         bool CanBeNull, CanBeFreed;
   3611         DerefBytes =
   3612           Base->getPointerDereferenceableBytes(DL, CanBeNull, CanBeFreed);
   3613         T.GlobalState.indicatePessimisticFixpoint();
   3614       } else {
   3615         const DerefState &DS = AA.getState();
   3616         DerefBytes = DS.DerefBytesState.getAssumed();
   3617         T.GlobalState &= DS.GlobalState;
   3618       }
   3619 
   3620       // For now we do not try to "increase" dereferenceability due to negative
   3621       // indices as we first have to come up with code to deal with loops and
   3622       // for overflows of the dereferenceable bytes.
   3623       int64_t OffsetSExt = Offset.getSExtValue();
   3624       if (OffsetSExt < 0)
   3625         OffsetSExt = 0;
   3626 
   3627       T.takeAssumedDerefBytesMinimum(
   3628           std::max(int64_t(0), DerefBytes - OffsetSExt));
   3629 
   3630       if (this == &AA) {
   3631         if (!Stripped) {
   3632           // If nothing was stripped IR information is all we got.
   3633           T.takeKnownDerefBytesMaximum(
   3634               std::max(int64_t(0), DerefBytes - OffsetSExt));
   3635           T.indicatePessimisticFixpoint();
   3636         } else if (OffsetSExt > 0) {
   3637           // If something was stripped but there is circular reasoning we look
   3638           // for the offset. If it is positive we basically decrease the
   3639           // dereferenceable bytes in a circluar loop now, which will simply
   3640           // drive them down to the known value in a very slow way which we
   3641           // can accelerate.
   3642           T.indicatePessimisticFixpoint();
   3643         }
   3644       }
   3645 
   3646       return T.isValidState();
   3647     };
   3648 
   3649     DerefState T;
   3650     if (!genericValueTraversal<AADereferenceable, DerefState>(
   3651             A, getIRPosition(), *this, T, VisitValueCB, getCtxI()))
   3652       return indicatePessimisticFixpoint();
   3653 
   3654     return clampStateAndIndicateChange(getState(), T);
   3655   }
   3656 
   3657   /// See AbstractAttribute::trackStatistics()
   3658   void trackStatistics() const override {
   3659     STATS_DECLTRACK_FLOATING_ATTR(dereferenceable)
   3660   }
   3661 };
   3662 
   3663 /// Dereferenceable attribute for a return value.
   3664 struct AADereferenceableReturned final
   3665     : AAReturnedFromReturnedValues<AADereferenceable, AADereferenceableImpl> {
   3666   AADereferenceableReturned(const IRPosition &IRP, Attributor &A)
   3667       : AAReturnedFromReturnedValues<AADereferenceable, AADereferenceableImpl>(
   3668             IRP, A) {}
   3669 
   3670   /// See AbstractAttribute::trackStatistics()
   3671   void trackStatistics() const override {
   3672     STATS_DECLTRACK_FNRET_ATTR(dereferenceable)
   3673   }
   3674 };
   3675 
   3676 /// Dereferenceable attribute for an argument
   3677 struct AADereferenceableArgument final
   3678     : AAArgumentFromCallSiteArguments<AADereferenceable,
   3679                                       AADereferenceableImpl> {
   3680   using Base =
   3681       AAArgumentFromCallSiteArguments<AADereferenceable, AADereferenceableImpl>;
   3682   AADereferenceableArgument(const IRPosition &IRP, Attributor &A)
   3683       : Base(IRP, A) {}
   3684 
   3685   /// See AbstractAttribute::trackStatistics()
   3686   void trackStatistics() const override {
   3687     STATS_DECLTRACK_ARG_ATTR(dereferenceable)
   3688   }
   3689 };
   3690 
   3691 /// Dereferenceable attribute for a call site argument.
   3692 struct AADereferenceableCallSiteArgument final : AADereferenceableFloating {
   3693   AADereferenceableCallSiteArgument(const IRPosition &IRP, Attributor &A)
   3694       : AADereferenceableFloating(IRP, A) {}
   3695 
   3696   /// See AbstractAttribute::trackStatistics()
   3697   void trackStatistics() const override {
   3698     STATS_DECLTRACK_CSARG_ATTR(dereferenceable)
   3699   }
   3700 };
   3701 
   3702 /// Dereferenceable attribute deduction for a call site return value.
   3703 struct AADereferenceableCallSiteReturned final
   3704     : AACallSiteReturnedFromReturned<AADereferenceable, AADereferenceableImpl> {
   3705   using Base =
   3706       AACallSiteReturnedFromReturned<AADereferenceable, AADereferenceableImpl>;
   3707   AADereferenceableCallSiteReturned(const IRPosition &IRP, Attributor &A)
   3708       : Base(IRP, A) {}
   3709 
   3710   /// See AbstractAttribute::trackStatistics()
   3711   void trackStatistics() const override {
   3712     STATS_DECLTRACK_CS_ATTR(dereferenceable);
   3713   }
   3714 };
   3715 
   3716 // ------------------------ Align Argument Attribute ------------------------
   3717 
   3718 static unsigned getKnownAlignForUse(Attributor &A, AAAlign &QueryingAA,
   3719                                     Value &AssociatedValue, const Use *U,
   3720                                     const Instruction *I, bool &TrackUse) {
   3721   // We need to follow common pointer manipulation uses to the accesses they
   3722   // feed into.
   3723   if (isa<CastInst>(I)) {
   3724     // Follow all but ptr2int casts.
   3725     TrackUse = !isa<PtrToIntInst>(I);
   3726     return 0;
   3727   }
   3728   if (auto *GEP = dyn_cast<GetElementPtrInst>(I)) {
   3729     if (GEP->hasAllConstantIndices())
   3730       TrackUse = true;
   3731     return 0;
   3732   }
   3733 
   3734   MaybeAlign MA;
   3735   if (const auto *CB = dyn_cast<CallBase>(I)) {
   3736     if (CB->isBundleOperand(U) || CB->isCallee(U))
   3737       return 0;
   3738 
   3739     unsigned ArgNo = CB->getArgOperandNo(U);
   3740     IRPosition IRP = IRPosition::callsite_argument(*CB, ArgNo);
   3741     // As long as we only use known information there is no need to track
   3742     // dependences here.
   3743     auto &AlignAA = A.getAAFor<AAAlign>(QueryingAA, IRP, DepClassTy::NONE);
   3744     MA = MaybeAlign(AlignAA.getKnownAlign());
   3745   }
   3746 
   3747   const DataLayout &DL = A.getDataLayout();
   3748   const Value *UseV = U->get();
   3749   if (auto *SI = dyn_cast<StoreInst>(I)) {
   3750     if (SI->getPointerOperand() == UseV)
   3751       MA = SI->getAlign();
   3752   } else if (auto *LI = dyn_cast<LoadInst>(I)) {
   3753     if (LI->getPointerOperand() == UseV)
   3754       MA = LI->getAlign();
   3755   }
   3756 
   3757   if (!MA || *MA <= QueryingAA.getKnownAlign())
   3758     return 0;
   3759 
   3760   unsigned Alignment = MA->value();
   3761   int64_t Offset;
   3762 
   3763   if (const Value *Base = GetPointerBaseWithConstantOffset(UseV, Offset, DL)) {
   3764     if (Base == &AssociatedValue) {
   3765       // BasePointerAddr + Offset = Alignment * Q for some integer Q.
   3766       // So we can say that the maximum power of two which is a divisor of
   3767       // gcd(Offset, Alignment) is an alignment.
   3768 
   3769       uint32_t gcd =
   3770           greatestCommonDivisor(uint32_t(abs((int32_t)Offset)), Alignment);
   3771       Alignment = llvm::PowerOf2Floor(gcd);
   3772     }
   3773   }
   3774 
   3775   return Alignment;
   3776 }
   3777 
   3778 struct AAAlignImpl : AAAlign {
   3779   AAAlignImpl(const IRPosition &IRP, Attributor &A) : AAAlign(IRP, A) {}
   3780 
   3781   /// See AbstractAttribute::initialize(...).
   3782   void initialize(Attributor &A) override {
   3783     SmallVector<Attribute, 4> Attrs;
   3784     getAttrs({Attribute::Alignment}, Attrs);
   3785     for (const Attribute &Attr : Attrs)
   3786       takeKnownMaximum(Attr.getValueAsInt());
   3787 
   3788     Value &V = getAssociatedValue();
   3789     // TODO: This is a HACK to avoid getPointerAlignment to introduce a ptr2int
   3790     //       use of the function pointer. This was caused by D73131. We want to
   3791     //       avoid this for function pointers especially because we iterate
   3792     //       their uses and int2ptr is not handled. It is not a correctness
   3793     //       problem though!
   3794     if (!V.getType()->getPointerElementType()->isFunctionTy())
   3795       takeKnownMaximum(V.getPointerAlignment(A.getDataLayout()).value());
   3796 
   3797     if (getIRPosition().isFnInterfaceKind() &&
   3798         (!getAnchorScope() ||
   3799          !A.isFunctionIPOAmendable(*getAssociatedFunction()))) {
   3800       indicatePessimisticFixpoint();
   3801       return;
   3802     }
   3803 
   3804     if (Instruction *CtxI = getCtxI())
   3805       followUsesInMBEC(*this, A, getState(), *CtxI);
   3806   }
   3807 
   3808   /// See AbstractAttribute::manifest(...).
   3809   ChangeStatus manifest(Attributor &A) override {
   3810     ChangeStatus LoadStoreChanged = ChangeStatus::UNCHANGED;
   3811 
   3812     // Check for users that allow alignment annotations.
   3813     Value &AssociatedValue = getAssociatedValue();
   3814     for (const Use &U : AssociatedValue.uses()) {
   3815       if (auto *SI = dyn_cast<StoreInst>(U.getUser())) {
   3816         if (SI->getPointerOperand() == &AssociatedValue)
   3817           if (SI->getAlignment() < getAssumedAlign()) {
   3818             STATS_DECLTRACK(AAAlign, Store,
   3819                             "Number of times alignment added to a store");
   3820             SI->setAlignment(Align(getAssumedAlign()));
   3821             LoadStoreChanged = ChangeStatus::CHANGED;
   3822           }
   3823       } else if (auto *LI = dyn_cast<LoadInst>(U.getUser())) {
   3824         if (LI->getPointerOperand() == &AssociatedValue)
   3825           if (LI->getAlignment() < getAssumedAlign()) {
   3826             LI->setAlignment(Align(getAssumedAlign()));
   3827             STATS_DECLTRACK(AAAlign, Load,
   3828                             "Number of times alignment added to a load");
   3829             LoadStoreChanged = ChangeStatus::CHANGED;
   3830           }
   3831       }
   3832     }
   3833 
   3834     ChangeStatus Changed = AAAlign::manifest(A);
   3835 
   3836     Align InheritAlign =
   3837         getAssociatedValue().getPointerAlignment(A.getDataLayout());
   3838     if (InheritAlign >= getAssumedAlign())
   3839       return LoadStoreChanged;
   3840     return Changed | LoadStoreChanged;
   3841   }
   3842 
   3843   // TODO: Provide a helper to determine the implied ABI alignment and check in
   3844   //       the existing manifest method and a new one for AAAlignImpl that value
   3845   //       to avoid making the alignment explicit if it did not improve.
   3846 
   3847   /// See AbstractAttribute::getDeducedAttributes
   3848   virtual void
   3849   getDeducedAttributes(LLVMContext &Ctx,
   3850                        SmallVectorImpl<Attribute> &Attrs) const override {
   3851     if (getAssumedAlign() > 1)
   3852       Attrs.emplace_back(
   3853           Attribute::getWithAlignment(Ctx, Align(getAssumedAlign())));
   3854   }
   3855 
   3856   /// See followUsesInMBEC
   3857   bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I,
   3858                        AAAlign::StateType &State) {
   3859     bool TrackUse = false;
   3860 
   3861     unsigned int KnownAlign =
   3862         getKnownAlignForUse(A, *this, getAssociatedValue(), U, I, TrackUse);
   3863     State.takeKnownMaximum(KnownAlign);
   3864 
   3865     return TrackUse;
   3866   }
   3867 
   3868   /// See AbstractAttribute::getAsStr().
   3869   const std::string getAsStr() const override {
   3870     return getAssumedAlign() ? ("align<" + std::to_string(getKnownAlign()) +
   3871                                 "-" + std::to_string(getAssumedAlign()) + ">")
   3872                              : "unknown-align";
   3873   }
   3874 };
   3875 
   3876 /// Align attribute for a floating value.
   3877 struct AAAlignFloating : AAAlignImpl {
   3878   AAAlignFloating(const IRPosition &IRP, Attributor &A) : AAAlignImpl(IRP, A) {}
   3879 
   3880   /// See AbstractAttribute::updateImpl(...).
   3881   ChangeStatus updateImpl(Attributor &A) override {
   3882     const DataLayout &DL = A.getDataLayout();
   3883 
   3884     auto VisitValueCB = [&](Value &V, const Instruction *,
   3885                             AAAlign::StateType &T, bool Stripped) -> bool {
   3886       const auto &AA = A.getAAFor<AAAlign>(*this, IRPosition::value(V),
   3887                                            DepClassTy::REQUIRED);
   3888       if (!Stripped && this == &AA) {
   3889         int64_t Offset;
   3890         unsigned Alignment = 1;
   3891         if (const Value *Base =
   3892                 GetPointerBaseWithConstantOffset(&V, Offset, DL)) {
   3893           Align PA = Base->getPointerAlignment(DL);
   3894           // BasePointerAddr + Offset = Alignment * Q for some integer Q.
   3895           // So we can say that the maximum power of two which is a divisor of
   3896           // gcd(Offset, Alignment) is an alignment.
   3897 
   3898           uint32_t gcd = greatestCommonDivisor(uint32_t(abs((int32_t)Offset)),
   3899                                                uint32_t(PA.value()));
   3900           Alignment = llvm::PowerOf2Floor(gcd);
   3901         } else {
   3902           Alignment = V.getPointerAlignment(DL).value();
   3903         }
   3904         // Use only IR information if we did not strip anything.
   3905         T.takeKnownMaximum(Alignment);
   3906         T.indicatePessimisticFixpoint();
   3907       } else {
   3908         // Use abstract attribute information.
   3909         const AAAlign::StateType &DS = AA.getState();
   3910         T ^= DS;
   3911       }
   3912       return T.isValidState();
   3913     };
   3914 
   3915     StateType T;
   3916     if (!genericValueTraversal<AAAlign, StateType>(A, getIRPosition(), *this, T,
   3917                                                    VisitValueCB, getCtxI()))
   3918       return indicatePessimisticFixpoint();
   3919 
   3920     // TODO: If we know we visited all incoming values, thus no are assumed
   3921     // dead, we can take the known information from the state T.
   3922     return clampStateAndIndicateChange(getState(), T);
   3923   }
   3924 
   3925   /// See AbstractAttribute::trackStatistics()
   3926   void trackStatistics() const override { STATS_DECLTRACK_FLOATING_ATTR(align) }
   3927 };
   3928 
   3929 /// Align attribute for function return value.
   3930 struct AAAlignReturned final
   3931     : AAReturnedFromReturnedValues<AAAlign, AAAlignImpl> {
   3932   using Base = AAReturnedFromReturnedValues<AAAlign, AAAlignImpl>;
   3933   AAAlignReturned(const IRPosition &IRP, Attributor &A) : Base(IRP, A) {}
   3934 
   3935   /// See AbstractAttribute::initialize(...).
   3936   void initialize(Attributor &A) override {
   3937     Base::initialize(A);
   3938     Function *F = getAssociatedFunction();
   3939     if (!F || F->isDeclaration())
   3940       indicatePessimisticFixpoint();
   3941   }
   3942 
   3943   /// See AbstractAttribute::trackStatistics()
   3944   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(aligned) }
   3945 };
   3946 
   3947 /// Align attribute for function argument.
   3948 struct AAAlignArgument final
   3949     : AAArgumentFromCallSiteArguments<AAAlign, AAAlignImpl> {
   3950   using Base = AAArgumentFromCallSiteArguments<AAAlign, AAAlignImpl>;
   3951   AAAlignArgument(const IRPosition &IRP, Attributor &A) : Base(IRP, A) {}
   3952 
   3953   /// See AbstractAttribute::manifest(...).
   3954   ChangeStatus manifest(Attributor &A) override {
   3955     // If the associated argument is involved in a must-tail call we give up
   3956     // because we would need to keep the argument alignments of caller and
   3957     // callee in-sync. Just does not seem worth the trouble right now.
   3958     if (A.getInfoCache().isInvolvedInMustTailCall(*getAssociatedArgument()))
   3959       return ChangeStatus::UNCHANGED;
   3960     return Base::manifest(A);
   3961   }
   3962 
   3963   /// See AbstractAttribute::trackStatistics()
   3964   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(aligned) }
   3965 };
   3966 
   3967 struct AAAlignCallSiteArgument final : AAAlignFloating {
   3968   AAAlignCallSiteArgument(const IRPosition &IRP, Attributor &A)
   3969       : AAAlignFloating(IRP, A) {}
   3970 
   3971   /// See AbstractAttribute::manifest(...).
   3972   ChangeStatus manifest(Attributor &A) override {
   3973     // If the associated argument is involved in a must-tail call we give up
   3974     // because we would need to keep the argument alignments of caller and
   3975     // callee in-sync. Just does not seem worth the trouble right now.
   3976     if (Argument *Arg = getAssociatedArgument())
   3977       if (A.getInfoCache().isInvolvedInMustTailCall(*Arg))
   3978         return ChangeStatus::UNCHANGED;
   3979     ChangeStatus Changed = AAAlignImpl::manifest(A);
   3980     Align InheritAlign =
   3981         getAssociatedValue().getPointerAlignment(A.getDataLayout());
   3982     if (InheritAlign >= getAssumedAlign())
   3983       Changed = ChangeStatus::UNCHANGED;
   3984     return Changed;
   3985   }
   3986 
   3987   /// See AbstractAttribute::updateImpl(Attributor &A).
   3988   ChangeStatus updateImpl(Attributor &A) override {
   3989     ChangeStatus Changed = AAAlignFloating::updateImpl(A);
   3990     if (Argument *Arg = getAssociatedArgument()) {
   3991       // We only take known information from the argument
   3992       // so we do not need to track a dependence.
   3993       const auto &ArgAlignAA = A.getAAFor<AAAlign>(
   3994           *this, IRPosition::argument(*Arg), DepClassTy::NONE);
   3995       takeKnownMaximum(ArgAlignAA.getKnownAlign());
   3996     }
   3997     return Changed;
   3998   }
   3999 
   4000   /// See AbstractAttribute::trackStatistics()
   4001   void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(aligned) }
   4002 };
   4003 
   4004 /// Align attribute deduction for a call site return value.
   4005 struct AAAlignCallSiteReturned final
   4006     : AACallSiteReturnedFromReturned<AAAlign, AAAlignImpl> {
   4007   using Base = AACallSiteReturnedFromReturned<AAAlign, AAAlignImpl>;
   4008   AAAlignCallSiteReturned(const IRPosition &IRP, Attributor &A)
   4009       : Base(IRP, A) {}
   4010 
   4011   /// See AbstractAttribute::initialize(...).
   4012   void initialize(Attributor &A) override {
   4013     Base::initialize(A);
   4014     Function *F = getAssociatedFunction();
   4015     if (!F || F->isDeclaration())
   4016       indicatePessimisticFixpoint();
   4017   }
   4018 
   4019   /// See AbstractAttribute::trackStatistics()
   4020   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(align); }
   4021 };
   4022 
   4023 /// ------------------ Function No-Return Attribute ----------------------------
   4024 struct AANoReturnImpl : public AANoReturn {
   4025   AANoReturnImpl(const IRPosition &IRP, Attributor &A) : AANoReturn(IRP, A) {}
   4026 
   4027   /// See AbstractAttribute::initialize(...).
   4028   void initialize(Attributor &A) override {
   4029     AANoReturn::initialize(A);
   4030     Function *F = getAssociatedFunction();
   4031     if (!F || F->isDeclaration())
   4032       indicatePessimisticFixpoint();
   4033   }
   4034 
   4035   /// See AbstractAttribute::getAsStr().
   4036   const std::string getAsStr() const override {
   4037     return getAssumed() ? "noreturn" : "may-return";
   4038   }
   4039 
   4040   /// See AbstractAttribute::updateImpl(Attributor &A).
   4041   virtual ChangeStatus updateImpl(Attributor &A) override {
   4042     auto CheckForNoReturn = [](Instruction &) { return false; };
   4043     if (!A.checkForAllInstructions(CheckForNoReturn, *this,
   4044                                    {(unsigned)Instruction::Ret}))
   4045       return indicatePessimisticFixpoint();
   4046     return ChangeStatus::UNCHANGED;
   4047   }
   4048 };
   4049 
   4050 struct AANoReturnFunction final : AANoReturnImpl {
   4051   AANoReturnFunction(const IRPosition &IRP, Attributor &A)
   4052       : AANoReturnImpl(IRP, A) {}
   4053 
   4054   /// See AbstractAttribute::trackStatistics()
   4055   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(noreturn) }
   4056 };
   4057 
   4058 /// NoReturn attribute deduction for a call sites.
   4059 struct AANoReturnCallSite final : AANoReturnImpl {
   4060   AANoReturnCallSite(const IRPosition &IRP, Attributor &A)
   4061       : AANoReturnImpl(IRP, A) {}
   4062 
   4063   /// See AbstractAttribute::initialize(...).
   4064   void initialize(Attributor &A) override {
   4065     AANoReturnImpl::initialize(A);
   4066     if (Function *F = getAssociatedFunction()) {
   4067       const IRPosition &FnPos = IRPosition::function(*F);
   4068       auto &FnAA = A.getAAFor<AANoReturn>(*this, FnPos, DepClassTy::REQUIRED);
   4069       if (!FnAA.isAssumedNoReturn())
   4070         indicatePessimisticFixpoint();
   4071     }
   4072   }
   4073 
   4074   /// See AbstractAttribute::updateImpl(...).
   4075   ChangeStatus updateImpl(Attributor &A) override {
   4076     // TODO: Once we have call site specific value information we can provide
   4077     //       call site specific liveness information and then it makes
   4078     //       sense to specialize attributes for call sites arguments instead of
   4079     //       redirecting requests to the callee argument.
   4080     Function *F = getAssociatedFunction();
   4081     const IRPosition &FnPos = IRPosition::function(*F);
   4082     auto &FnAA = A.getAAFor<AANoReturn>(*this, FnPos, DepClassTy::REQUIRED);
   4083     return clampStateAndIndicateChange(getState(), FnAA.getState());
   4084   }
   4085 
   4086   /// See AbstractAttribute::trackStatistics()
   4087   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(noreturn); }
   4088 };
   4089 
   4090 /// ----------------------- Variable Capturing ---------------------------------
   4091 
   4092 /// A class to hold the state of for no-capture attributes.
   4093 struct AANoCaptureImpl : public AANoCapture {
   4094   AANoCaptureImpl(const IRPosition &IRP, Attributor &A) : AANoCapture(IRP, A) {}
   4095 
   4096   /// See AbstractAttribute::initialize(...).
   4097   void initialize(Attributor &A) override {
   4098     if (hasAttr(getAttrKind(), /* IgnoreSubsumingPositions */ true)) {
   4099       indicateOptimisticFixpoint();
   4100       return;
   4101     }
   4102     Function *AnchorScope = getAnchorScope();
   4103     if (isFnInterfaceKind() &&
   4104         (!AnchorScope || !A.isFunctionIPOAmendable(*AnchorScope))) {
   4105       indicatePessimisticFixpoint();
   4106       return;
   4107     }
   4108 
   4109     // You cannot "capture" null in the default address space.
   4110     if (isa<ConstantPointerNull>(getAssociatedValue()) &&
   4111         getAssociatedValue().getType()->getPointerAddressSpace() == 0) {
   4112       indicateOptimisticFixpoint();
   4113       return;
   4114     }
   4115 
   4116     const Function *F =
   4117         isArgumentPosition() ? getAssociatedFunction() : AnchorScope;
   4118 
   4119     // Check what state the associated function can actually capture.
   4120     if (F)
   4121       determineFunctionCaptureCapabilities(getIRPosition(), *F, *this);
   4122     else
   4123       indicatePessimisticFixpoint();
   4124   }
   4125 
   4126   /// See AbstractAttribute::updateImpl(...).
   4127   ChangeStatus updateImpl(Attributor &A) override;
   4128 
   4129   /// see AbstractAttribute::isAssumedNoCaptureMaybeReturned(...).
   4130   virtual void
   4131   getDeducedAttributes(LLVMContext &Ctx,
   4132                        SmallVectorImpl<Attribute> &Attrs) const override {
   4133     if (!isAssumedNoCaptureMaybeReturned())
   4134       return;
   4135 
   4136     if (isArgumentPosition()) {
   4137       if (isAssumedNoCapture())
   4138         Attrs.emplace_back(Attribute::get(Ctx, Attribute::NoCapture));
   4139       else if (ManifestInternal)
   4140         Attrs.emplace_back(Attribute::get(Ctx, "no-capture-maybe-returned"));
   4141     }
   4142   }
   4143 
   4144   /// Set the NOT_CAPTURED_IN_MEM and NOT_CAPTURED_IN_RET bits in \p Known
   4145   /// depending on the ability of the function associated with \p IRP to capture
   4146   /// state in memory and through "returning/throwing", respectively.
   4147   static void determineFunctionCaptureCapabilities(const IRPosition &IRP,
   4148                                                    const Function &F,
   4149                                                    BitIntegerState &State) {
   4150     // TODO: Once we have memory behavior attributes we should use them here.
   4151 
   4152     // If we know we cannot communicate or write to memory, we do not care about
   4153     // ptr2int anymore.
   4154     if (F.onlyReadsMemory() && F.doesNotThrow() &&
   4155         F.getReturnType()->isVoidTy()) {
   4156       State.addKnownBits(NO_CAPTURE);
   4157       return;
   4158     }
   4159 
   4160     // A function cannot capture state in memory if it only reads memory, it can
   4161     // however return/throw state and the state might be influenced by the
   4162     // pointer value, e.g., loading from a returned pointer might reveal a bit.
   4163     if (F.onlyReadsMemory())
   4164       State.addKnownBits(NOT_CAPTURED_IN_MEM);
   4165 
   4166     // A function cannot communicate state back if it does not through
   4167     // exceptions and doesn not return values.
   4168     if (F.doesNotThrow() && F.getReturnType()->isVoidTy())
   4169       State.addKnownBits(NOT_CAPTURED_IN_RET);
   4170 
   4171     // Check existing "returned" attributes.
   4172     int ArgNo = IRP.getCalleeArgNo();
   4173     if (F.doesNotThrow() && ArgNo >= 0) {
   4174       for (unsigned u = 0, e = F.arg_size(); u < e; ++u)
   4175         if (F.hasParamAttribute(u, Attribute::Returned)) {
   4176           if (u == unsigned(ArgNo))
   4177             State.removeAssumedBits(NOT_CAPTURED_IN_RET);
   4178           else if (F.onlyReadsMemory())
   4179             State.addKnownBits(NO_CAPTURE);
   4180           else
   4181             State.addKnownBits(NOT_CAPTURED_IN_RET);
   4182           break;
   4183         }
   4184     }
   4185   }
   4186 
   4187   /// See AbstractState::getAsStr().
   4188   const std::string getAsStr() const override {
   4189     if (isKnownNoCapture())
   4190       return "known not-captured";
   4191     if (isAssumedNoCapture())
   4192       return "assumed not-captured";
   4193     if (isKnownNoCaptureMaybeReturned())
   4194       return "known not-captured-maybe-returned";
   4195     if (isAssumedNoCaptureMaybeReturned())
   4196       return "assumed not-captured-maybe-returned";
   4197     return "assumed-captured";
   4198   }
   4199 };
   4200 
   4201 /// Attributor-aware capture tracker.
   4202 struct AACaptureUseTracker final : public CaptureTracker {
   4203 
   4204   /// Create a capture tracker that can lookup in-flight abstract attributes
   4205   /// through the Attributor \p A.
   4206   ///
   4207   /// If a use leads to a potential capture, \p CapturedInMemory is set and the
   4208   /// search is stopped. If a use leads to a return instruction,
   4209   /// \p CommunicatedBack is set to true and \p CapturedInMemory is not changed.
   4210   /// If a use leads to a ptr2int which may capture the value,
   4211   /// \p CapturedInInteger is set. If a use is found that is currently assumed
   4212   /// "no-capture-maybe-returned", the user is added to the \p PotentialCopies
   4213   /// set. All values in \p PotentialCopies are later tracked as well. For every
   4214   /// explored use we decrement \p RemainingUsesToExplore. Once it reaches 0,
   4215   /// the search is stopped with \p CapturedInMemory and \p CapturedInInteger
   4216   /// conservatively set to true.
   4217   AACaptureUseTracker(Attributor &A, AANoCapture &NoCaptureAA,
   4218                       const AAIsDead &IsDeadAA, AANoCapture::StateType &State,
   4219                       SmallVectorImpl<const Value *> &PotentialCopies,
   4220                       unsigned &RemainingUsesToExplore)
   4221       : A(A), NoCaptureAA(NoCaptureAA), IsDeadAA(IsDeadAA), State(State),
   4222         PotentialCopies(PotentialCopies),
   4223         RemainingUsesToExplore(RemainingUsesToExplore) {}
   4224 
   4225   /// Determine if \p V maybe captured. *Also updates the state!*
   4226   bool valueMayBeCaptured(const Value *V) {
   4227     if (V->getType()->isPointerTy()) {
   4228       PointerMayBeCaptured(V, this);
   4229     } else {
   4230       State.indicatePessimisticFixpoint();
   4231     }
   4232     return State.isAssumed(AANoCapture::NO_CAPTURE_MAYBE_RETURNED);
   4233   }
   4234 
   4235   /// See CaptureTracker::tooManyUses().
   4236   void tooManyUses() override {
   4237     State.removeAssumedBits(AANoCapture::NO_CAPTURE);
   4238   }
   4239 
   4240   bool isDereferenceableOrNull(Value *O, const DataLayout &DL) override {
   4241     if (CaptureTracker::isDereferenceableOrNull(O, DL))
   4242       return true;
   4243     const auto &DerefAA = A.getAAFor<AADereferenceable>(
   4244         NoCaptureAA, IRPosition::value(*O), DepClassTy::OPTIONAL);
   4245     return DerefAA.getAssumedDereferenceableBytes();
   4246   }
   4247 
   4248   /// See CaptureTracker::captured(...).
   4249   bool captured(const Use *U) override {
   4250     Instruction *UInst = cast<Instruction>(U->getUser());
   4251     LLVM_DEBUG(dbgs() << "Check use: " << *U->get() << " in " << *UInst
   4252                       << "\n");
   4253 
   4254     // Because we may reuse the tracker multiple times we keep track of the
   4255     // number of explored uses ourselves as well.
   4256     if (RemainingUsesToExplore-- == 0) {
   4257       LLVM_DEBUG(dbgs() << " - too many uses to explore!\n");
   4258       return isCapturedIn(/* Memory */ true, /* Integer */ true,
   4259                           /* Return */ true);
   4260     }
   4261 
   4262     // Deal with ptr2int by following uses.
   4263     if (isa<PtrToIntInst>(UInst)) {
   4264       LLVM_DEBUG(dbgs() << " - ptr2int assume the worst!\n");
   4265       return valueMayBeCaptured(UInst);
   4266     }
   4267 
   4268     // Explicitly catch return instructions.
   4269     if (isa<ReturnInst>(UInst))
   4270       return isCapturedIn(/* Memory */ false, /* Integer */ false,
   4271                           /* Return */ true);
   4272 
   4273     // For now we only use special logic for call sites. However, the tracker
   4274     // itself knows about a lot of other non-capturing cases already.
   4275     auto *CB = dyn_cast<CallBase>(UInst);
   4276     if (!CB || !CB->isArgOperand(U))
   4277       return isCapturedIn(/* Memory */ true, /* Integer */ true,
   4278                           /* Return */ true);
   4279 
   4280     unsigned ArgNo = CB->getArgOperandNo(U);
   4281     const IRPosition &CSArgPos = IRPosition::callsite_argument(*CB, ArgNo);
   4282     // If we have a abstract no-capture attribute for the argument we can use
   4283     // it to justify a non-capture attribute here. This allows recursion!
   4284     auto &ArgNoCaptureAA =
   4285         A.getAAFor<AANoCapture>(NoCaptureAA, CSArgPos, DepClassTy::REQUIRED);
   4286     if (ArgNoCaptureAA.isAssumedNoCapture())
   4287       return isCapturedIn(/* Memory */ false, /* Integer */ false,
   4288                           /* Return */ false);
   4289     if (ArgNoCaptureAA.isAssumedNoCaptureMaybeReturned()) {
   4290       addPotentialCopy(*CB);
   4291       return isCapturedIn(/* Memory */ false, /* Integer */ false,
   4292                           /* Return */ false);
   4293     }
   4294 
   4295     // Lastly, we could not find a reason no-capture can be assumed so we don't.
   4296     return isCapturedIn(/* Memory */ true, /* Integer */ true,
   4297                         /* Return */ true);
   4298   }
   4299 
   4300   /// Register \p CS as potential copy of the value we are checking.
   4301   void addPotentialCopy(CallBase &CB) { PotentialCopies.push_back(&CB); }
   4302 
   4303   /// See CaptureTracker::shouldExplore(...).
   4304   bool shouldExplore(const Use *U) override {
   4305     // Check liveness and ignore droppable users.
   4306     return !U->getUser()->isDroppable() &&
   4307            !A.isAssumedDead(*U, &NoCaptureAA, &IsDeadAA);
   4308   }
   4309 
   4310   /// Update the state according to \p CapturedInMem, \p CapturedInInt, and
   4311   /// \p CapturedInRet, then return the appropriate value for use in the
   4312   /// CaptureTracker::captured() interface.
   4313   bool isCapturedIn(bool CapturedInMem, bool CapturedInInt,
   4314                     bool CapturedInRet) {
   4315     LLVM_DEBUG(dbgs() << " - captures [Mem " << CapturedInMem << "|Int "
   4316                       << CapturedInInt << "|Ret " << CapturedInRet << "]\n");
   4317     if (CapturedInMem)
   4318       State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_MEM);
   4319     if (CapturedInInt)
   4320       State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_INT);
   4321     if (CapturedInRet)
   4322       State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_RET);
   4323     return !State.isAssumed(AANoCapture::NO_CAPTURE_MAYBE_RETURNED);
   4324   }
   4325 
   4326 private:
   4327   /// The attributor providing in-flight abstract attributes.
   4328   Attributor &A;
   4329 
   4330   /// The abstract attribute currently updated.
   4331   AANoCapture &NoCaptureAA;
   4332 
   4333   /// The abstract liveness state.
   4334   const AAIsDead &IsDeadAA;
   4335 
   4336   /// The state currently updated.
   4337   AANoCapture::StateType &State;
   4338 
   4339   /// Set of potential copies of the tracked value.
   4340   SmallVectorImpl<const Value *> &PotentialCopies;
   4341 
   4342   /// Global counter to limit the number of explored uses.
   4343   unsigned &RemainingUsesToExplore;
   4344 };
   4345 
   4346 ChangeStatus AANoCaptureImpl::updateImpl(Attributor &A) {
   4347   const IRPosition &IRP = getIRPosition();
   4348   const Value *V = isArgumentPosition() ? IRP.getAssociatedArgument()
   4349                                         : &IRP.getAssociatedValue();
   4350   if (!V)
   4351     return indicatePessimisticFixpoint();
   4352 
   4353   const Function *F =
   4354       isArgumentPosition() ? IRP.getAssociatedFunction() : IRP.getAnchorScope();
   4355   assert(F && "Expected a function!");
   4356   const IRPosition &FnPos = IRPosition::function(*F);
   4357   const auto &IsDeadAA = A.getAAFor<AAIsDead>(*this, FnPos, DepClassTy::NONE);
   4358 
   4359   AANoCapture::StateType T;
   4360 
   4361   // Readonly means we cannot capture through memory.
   4362   const auto &FnMemAA =
   4363       A.getAAFor<AAMemoryBehavior>(*this, FnPos, DepClassTy::NONE);
   4364   if (FnMemAA.isAssumedReadOnly()) {
   4365     T.addKnownBits(NOT_CAPTURED_IN_MEM);
   4366     if (FnMemAA.isKnownReadOnly())
   4367       addKnownBits(NOT_CAPTURED_IN_MEM);
   4368     else
   4369       A.recordDependence(FnMemAA, *this, DepClassTy::OPTIONAL);
   4370   }
   4371 
   4372   // Make sure all returned values are different than the underlying value.
   4373   // TODO: we could do this in a more sophisticated way inside
   4374   //       AAReturnedValues, e.g., track all values that escape through returns
   4375   //       directly somehow.
   4376   auto CheckReturnedArgs = [&](const AAReturnedValues &RVAA) {
   4377     bool SeenConstant = false;
   4378     for (auto &It : RVAA.returned_values()) {
   4379       if (isa<Constant>(It.first)) {
   4380         if (SeenConstant)
   4381           return false;
   4382         SeenConstant = true;
   4383       } else if (!isa<Argument>(It.first) ||
   4384                  It.first == getAssociatedArgument())
   4385         return false;
   4386     }
   4387     return true;
   4388   };
   4389 
   4390   const auto &NoUnwindAA =
   4391       A.getAAFor<AANoUnwind>(*this, FnPos, DepClassTy::OPTIONAL);
   4392   if (NoUnwindAA.isAssumedNoUnwind()) {
   4393     bool IsVoidTy = F->getReturnType()->isVoidTy();
   4394     const AAReturnedValues *RVAA =
   4395         IsVoidTy ? nullptr
   4396                  : &A.getAAFor<AAReturnedValues>(*this, FnPos,
   4397 
   4398                                                  DepClassTy::OPTIONAL);
   4399     if (IsVoidTy || CheckReturnedArgs(*RVAA)) {
   4400       T.addKnownBits(NOT_CAPTURED_IN_RET);
   4401       if (T.isKnown(NOT_CAPTURED_IN_MEM))
   4402         return ChangeStatus::UNCHANGED;
   4403       if (NoUnwindAA.isKnownNoUnwind() &&
   4404           (IsVoidTy || RVAA->getState().isAtFixpoint())) {
   4405         addKnownBits(NOT_CAPTURED_IN_RET);
   4406         if (isKnown(NOT_CAPTURED_IN_MEM))
   4407           return indicateOptimisticFixpoint();
   4408       }
   4409     }
   4410   }
   4411 
   4412   // Use the CaptureTracker interface and logic with the specialized tracker,
   4413   // defined in AACaptureUseTracker, that can look at in-flight abstract
   4414   // attributes and directly updates the assumed state.
   4415   SmallVector<const Value *, 4> PotentialCopies;
   4416   unsigned RemainingUsesToExplore =
   4417       getDefaultMaxUsesToExploreForCaptureTracking();
   4418   AACaptureUseTracker Tracker(A, *this, IsDeadAA, T, PotentialCopies,
   4419                               RemainingUsesToExplore);
   4420 
   4421   // Check all potential copies of the associated value until we can assume
   4422   // none will be captured or we have to assume at least one might be.
   4423   unsigned Idx = 0;
   4424   PotentialCopies.push_back(V);
   4425   while (T.isAssumed(NO_CAPTURE_MAYBE_RETURNED) && Idx < PotentialCopies.size())
   4426     Tracker.valueMayBeCaptured(PotentialCopies[Idx++]);
   4427 
   4428   AANoCapture::StateType &S = getState();
   4429   auto Assumed = S.getAssumed();
   4430   S.intersectAssumedBits(T.getAssumed());
   4431   if (!isAssumedNoCaptureMaybeReturned())
   4432     return indicatePessimisticFixpoint();
   4433   return Assumed == S.getAssumed() ? ChangeStatus::UNCHANGED
   4434                                    : ChangeStatus::CHANGED;
   4435 }
   4436 
   4437 /// NoCapture attribute for function arguments.
   4438 struct AANoCaptureArgument final : AANoCaptureImpl {
   4439   AANoCaptureArgument(const IRPosition &IRP, Attributor &A)
   4440       : AANoCaptureImpl(IRP, A) {}
   4441 
   4442   /// See AbstractAttribute::trackStatistics()
   4443   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(nocapture) }
   4444 };
   4445 
   4446 /// NoCapture attribute for call site arguments.
   4447 struct AANoCaptureCallSiteArgument final : AANoCaptureImpl {
   4448   AANoCaptureCallSiteArgument(const IRPosition &IRP, Attributor &A)
   4449       : AANoCaptureImpl(IRP, A) {}
   4450 
   4451   /// See AbstractAttribute::initialize(...).
   4452   void initialize(Attributor &A) override {
   4453     if (Argument *Arg = getAssociatedArgument())
   4454       if (Arg->hasByValAttr())
   4455         indicateOptimisticFixpoint();
   4456     AANoCaptureImpl::initialize(A);
   4457   }
   4458 
   4459   /// See AbstractAttribute::updateImpl(...).
   4460   ChangeStatus updateImpl(Attributor &A) override {
   4461     // TODO: Once we have call site specific value information we can provide
   4462     //       call site specific liveness information and then it makes
   4463     //       sense to specialize attributes for call sites arguments instead of
   4464     //       redirecting requests to the callee argument.
   4465     Argument *Arg = getAssociatedArgument();
   4466     if (!Arg)
   4467       return indicatePessimisticFixpoint();
   4468     const IRPosition &ArgPos = IRPosition::argument(*Arg);
   4469     auto &ArgAA = A.getAAFor<AANoCapture>(*this, ArgPos, DepClassTy::REQUIRED);
   4470     return clampStateAndIndicateChange(getState(), ArgAA.getState());
   4471   }
   4472 
   4473   /// See AbstractAttribute::trackStatistics()
   4474   void trackStatistics() const override{STATS_DECLTRACK_CSARG_ATTR(nocapture)};
   4475 };
   4476 
   4477 /// NoCapture attribute for floating values.
   4478 struct AANoCaptureFloating final : AANoCaptureImpl {
   4479   AANoCaptureFloating(const IRPosition &IRP, Attributor &A)
   4480       : AANoCaptureImpl(IRP, A) {}
   4481 
   4482   /// See AbstractAttribute::trackStatistics()
   4483   void trackStatistics() const override {
   4484     STATS_DECLTRACK_FLOATING_ATTR(nocapture)
   4485   }
   4486 };
   4487 
   4488 /// NoCapture attribute for function return value.
   4489 struct AANoCaptureReturned final : AANoCaptureImpl {
   4490   AANoCaptureReturned(const IRPosition &IRP, Attributor &A)
   4491       : AANoCaptureImpl(IRP, A) {
   4492     llvm_unreachable("NoCapture is not applicable to function returns!");
   4493   }
   4494 
   4495   /// See AbstractAttribute::initialize(...).
   4496   void initialize(Attributor &A) override {
   4497     llvm_unreachable("NoCapture is not applicable to function returns!");
   4498   }
   4499 
   4500   /// See AbstractAttribute::updateImpl(...).
   4501   ChangeStatus updateImpl(Attributor &A) override {
   4502     llvm_unreachable("NoCapture is not applicable to function returns!");
   4503   }
   4504 
   4505   /// See AbstractAttribute::trackStatistics()
   4506   void trackStatistics() const override {}
   4507 };
   4508 
   4509 /// NoCapture attribute deduction for a call site return value.
   4510 struct AANoCaptureCallSiteReturned final : AANoCaptureImpl {
   4511   AANoCaptureCallSiteReturned(const IRPosition &IRP, Attributor &A)
   4512       : AANoCaptureImpl(IRP, A) {}
   4513 
   4514   /// See AbstractAttribute::initialize(...).
   4515   void initialize(Attributor &A) override {
   4516     const Function *F = getAnchorScope();
   4517     // Check what state the associated function can actually capture.
   4518     determineFunctionCaptureCapabilities(getIRPosition(), *F, *this);
   4519   }
   4520 
   4521   /// See AbstractAttribute::trackStatistics()
   4522   void trackStatistics() const override {
   4523     STATS_DECLTRACK_CSRET_ATTR(nocapture)
   4524   }
   4525 };
   4526 
   4527 /// ------------------ Value Simplify Attribute ----------------------------
   4528 struct AAValueSimplifyImpl : AAValueSimplify {
   4529   AAValueSimplifyImpl(const IRPosition &IRP, Attributor &A)
   4530       : AAValueSimplify(IRP, A) {}
   4531 
   4532   /// See AbstractAttribute::initialize(...).
   4533   void initialize(Attributor &A) override {
   4534     if (getAssociatedValue().getType()->isVoidTy())
   4535       indicatePessimisticFixpoint();
   4536   }
   4537 
   4538   /// See AbstractAttribute::getAsStr().
   4539   const std::string getAsStr() const override {
   4540     return getAssumed() ? (getKnown() ? "simplified" : "maybe-simple")
   4541                         : "not-simple";
   4542   }
   4543 
   4544   /// See AbstractAttribute::trackStatistics()
   4545   void trackStatistics() const override {}
   4546 
   4547   /// See AAValueSimplify::getAssumedSimplifiedValue()
   4548   Optional<Value *> getAssumedSimplifiedValue(Attributor &A) const override {
   4549     if (!getAssumed())
   4550       return const_cast<Value *>(&getAssociatedValue());
   4551     return SimplifiedAssociatedValue;
   4552   }
   4553 
   4554   /// Helper function for querying AAValueSimplify and updating candicate.
   4555   /// \param QueryingValue Value trying to unify with SimplifiedValue
   4556   /// \param AccumulatedSimplifiedValue Current simplification result.
   4557   static bool checkAndUpdate(Attributor &A, const AbstractAttribute &QueryingAA,
   4558                              Value &QueryingValue,
   4559                              Optional<Value *> &AccumulatedSimplifiedValue) {
   4560     // FIXME: Add a typecast support.
   4561 
   4562     auto &ValueSimplifyAA = A.getAAFor<AAValueSimplify>(
   4563         QueryingAA,
   4564         IRPosition::value(QueryingValue, QueryingAA.getCallBaseContext()),
   4565         DepClassTy::REQUIRED);
   4566 
   4567     Optional<Value *> QueryingValueSimplified =
   4568         ValueSimplifyAA.getAssumedSimplifiedValue(A);
   4569 
   4570     if (!QueryingValueSimplified.hasValue())
   4571       return true;
   4572 
   4573     if (!QueryingValueSimplified.getValue())
   4574       return false;
   4575 
   4576     Value &QueryingValueSimplifiedUnwrapped =
   4577         *QueryingValueSimplified.getValue();
   4578 
   4579     if (AccumulatedSimplifiedValue.hasValue() &&
   4580         !isa<UndefValue>(AccumulatedSimplifiedValue.getValue()) &&
   4581         !isa<UndefValue>(QueryingValueSimplifiedUnwrapped))
   4582       return AccumulatedSimplifiedValue == QueryingValueSimplified;
   4583     if (AccumulatedSimplifiedValue.hasValue() &&
   4584         isa<UndefValue>(QueryingValueSimplifiedUnwrapped))
   4585       return true;
   4586 
   4587     LLVM_DEBUG(dbgs() << "[ValueSimplify] " << QueryingValue
   4588                       << " is assumed to be "
   4589                       << QueryingValueSimplifiedUnwrapped << "\n");
   4590 
   4591     AccumulatedSimplifiedValue = QueryingValueSimplified;
   4592     return true;
   4593   }
   4594 
   4595   /// Returns a candidate is found or not
   4596   template <typename AAType> bool askSimplifiedValueFor(Attributor &A) {
   4597     if (!getAssociatedValue().getType()->isIntegerTy())
   4598       return false;
   4599 
   4600     // This will also pass the call base context.
   4601     const auto &AA =
   4602         A.getAAFor<AAType>(*this, getIRPosition(), DepClassTy::NONE);
   4603 
   4604     Optional<ConstantInt *> COpt = AA.getAssumedConstantInt(A);
   4605 
   4606     if (!COpt.hasValue()) {
   4607       SimplifiedAssociatedValue = llvm::None;
   4608       A.recordDependence(AA, *this, DepClassTy::OPTIONAL);
   4609       return true;
   4610     }
   4611     if (auto *C = COpt.getValue()) {
   4612       SimplifiedAssociatedValue = C;
   4613       A.recordDependence(AA, *this, DepClassTy::OPTIONAL);
   4614       return true;
   4615     }
   4616     return false;
   4617   }
   4618 
   4619   bool askSimplifiedValueForOtherAAs(Attributor &A) {
   4620     if (askSimplifiedValueFor<AAValueConstantRange>(A))
   4621       return true;
   4622     if (askSimplifiedValueFor<AAPotentialValues>(A))
   4623       return true;
   4624     return false;
   4625   }
   4626 
   4627   /// See AbstractAttribute::manifest(...).
   4628   ChangeStatus manifest(Attributor &A) override {
   4629     ChangeStatus Changed = ChangeStatus::UNCHANGED;
   4630 
   4631     if (SimplifiedAssociatedValue.hasValue() &&
   4632         !SimplifiedAssociatedValue.getValue())
   4633       return Changed;
   4634 
   4635     Value &V = getAssociatedValue();
   4636     auto *C = SimplifiedAssociatedValue.hasValue()
   4637                   ? dyn_cast<Constant>(SimplifiedAssociatedValue.getValue())
   4638                   : UndefValue::get(V.getType());
   4639     if (C) {
   4640       // We can replace the AssociatedValue with the constant.
   4641       if (!V.user_empty() && &V != C && V.getType() == C->getType()) {
   4642         LLVM_DEBUG(dbgs() << "[ValueSimplify] " << V << " -> " << *C
   4643                           << " :: " << *this << "\n");
   4644         if (A.changeValueAfterManifest(V, *C))
   4645           Changed = ChangeStatus::CHANGED;
   4646       }
   4647     }
   4648 
   4649     return Changed | AAValueSimplify::manifest(A);
   4650   }
   4651 
   4652   /// See AbstractState::indicatePessimisticFixpoint(...).
   4653   ChangeStatus indicatePessimisticFixpoint() override {
   4654     // NOTE: Associated value will be returned in a pessimistic fixpoint and is
   4655     // regarded as known. That's why`indicateOptimisticFixpoint` is called.
   4656     SimplifiedAssociatedValue = &getAssociatedValue();
   4657     indicateOptimisticFixpoint();
   4658     return ChangeStatus::CHANGED;
   4659   }
   4660 
   4661 protected:
   4662   // An assumed simplified value. Initially, it is set to Optional::None, which
   4663   // means that the value is not clear under current assumption. If in the
   4664   // pessimistic state, getAssumedSimplifiedValue doesn't return this value but
   4665   // returns orignal associated value.
   4666   Optional<Value *> SimplifiedAssociatedValue;
   4667 };
   4668 
   4669 struct AAValueSimplifyArgument final : AAValueSimplifyImpl {
   4670   AAValueSimplifyArgument(const IRPosition &IRP, Attributor &A)
   4671       : AAValueSimplifyImpl(IRP, A) {}
   4672 
   4673   void initialize(Attributor &A) override {
   4674     AAValueSimplifyImpl::initialize(A);
   4675     if (!getAnchorScope() || getAnchorScope()->isDeclaration())
   4676       indicatePessimisticFixpoint();
   4677     if (hasAttr({Attribute::InAlloca, Attribute::Preallocated,
   4678                  Attribute::StructRet, Attribute::Nest},
   4679                 /* IgnoreSubsumingPositions */ true))
   4680       indicatePessimisticFixpoint();
   4681 
   4682     // FIXME: This is a hack to prevent us from propagating function poiner in
   4683     // the new pass manager CGSCC pass as it creates call edges the
   4684     // CallGraphUpdater cannot handle yet.
   4685     Value &V = getAssociatedValue();
   4686     if (V.getType()->isPointerTy() &&
   4687         V.getType()->getPointerElementType()->isFunctionTy() &&
   4688         !A.isModulePass())
   4689       indicatePessimisticFixpoint();
   4690   }
   4691 
   4692   /// See AbstractAttribute::updateImpl(...).
   4693   ChangeStatus updateImpl(Attributor &A) override {
   4694     // Byval is only replacable if it is readonly otherwise we would write into
   4695     // the replaced value and not the copy that byval creates implicitly.
   4696     Argument *Arg = getAssociatedArgument();
   4697     if (Arg->hasByValAttr()) {
   4698       // TODO: We probably need to verify synchronization is not an issue, e.g.,
   4699       //       there is no race by not copying a constant byval.
   4700       const auto &MemAA = A.getAAFor<AAMemoryBehavior>(*this, getIRPosition(),
   4701                                                        DepClassTy::REQUIRED);
   4702       if (!MemAA.isAssumedReadOnly())
   4703         return indicatePessimisticFixpoint();
   4704     }
   4705 
   4706     bool HasValueBefore = SimplifiedAssociatedValue.hasValue();
   4707 
   4708     auto PredForCallSite = [&](AbstractCallSite ACS) {
   4709       const IRPosition &ACSArgPos =
   4710           IRPosition::callsite_argument(ACS, getCallSiteArgNo());
   4711       // Check if a coresponding argument was found or if it is on not
   4712       // associated (which can happen for callback calls).
   4713       if (ACSArgPos.getPositionKind() == IRPosition::IRP_INVALID)
   4714         return false;
   4715 
   4716       // We can only propagate thread independent values through callbacks.
   4717       // This is different to direct/indirect call sites because for them we
   4718       // know the thread executing the caller and callee is the same. For
   4719       // callbacks this is not guaranteed, thus a thread dependent value could
   4720       // be different for the caller and callee, making it invalid to propagate.
   4721       Value &ArgOp = ACSArgPos.getAssociatedValue();
   4722       if (ACS.isCallbackCall())
   4723         if (auto *C = dyn_cast<Constant>(&ArgOp))
   4724           if (C->isThreadDependent())
   4725             return false;
   4726       return checkAndUpdate(A, *this, ArgOp, SimplifiedAssociatedValue);
   4727     };
   4728 
   4729     // Generate a answer specific to a call site context.
   4730     bool Success;
   4731     bool AllCallSitesKnown;
   4732     if (hasCallBaseContext())
   4733       Success = PredForCallSite(
   4734           AbstractCallSite(&getCallBaseContext()->getCalledOperandUse()));
   4735     else
   4736       Success = A.checkForAllCallSites(PredForCallSite, *this, true,
   4737                                        AllCallSitesKnown);
   4738 
   4739     if (!Success)
   4740       if (!askSimplifiedValueForOtherAAs(A))
   4741         return indicatePessimisticFixpoint();
   4742 
   4743     // If a candicate was found in this update, return CHANGED.
   4744     return HasValueBefore == SimplifiedAssociatedValue.hasValue()
   4745                ? ChangeStatus::UNCHANGED
   4746                : ChangeStatus ::CHANGED;
   4747   }
   4748 
   4749   /// See AbstractAttribute::trackStatistics()
   4750   void trackStatistics() const override {
   4751     STATS_DECLTRACK_ARG_ATTR(value_simplify)
   4752   }
   4753 };
   4754 
   4755 struct AAValueSimplifyReturned : AAValueSimplifyImpl {
   4756   AAValueSimplifyReturned(const IRPosition &IRP, Attributor &A)
   4757       : AAValueSimplifyImpl(IRP, A) {}
   4758 
   4759   /// See AbstractAttribute::updateImpl(...).
   4760   ChangeStatus updateImpl(Attributor &A) override {
   4761     bool HasValueBefore = SimplifiedAssociatedValue.hasValue();
   4762 
   4763     auto PredForReturned = [&](Value &V) {
   4764       return checkAndUpdate(A, *this, V, SimplifiedAssociatedValue);
   4765     };
   4766 
   4767     if (!A.checkForAllReturnedValues(PredForReturned, *this))
   4768       if (!askSimplifiedValueForOtherAAs(A))
   4769         return indicatePessimisticFixpoint();
   4770 
   4771     // If a candicate was found in this update, return CHANGED.
   4772     return HasValueBefore == SimplifiedAssociatedValue.hasValue()
   4773                ? ChangeStatus::UNCHANGED
   4774                : ChangeStatus ::CHANGED;
   4775   }
   4776 
   4777   ChangeStatus manifest(Attributor &A) override {
   4778     ChangeStatus Changed = ChangeStatus::UNCHANGED;
   4779 
   4780     if (SimplifiedAssociatedValue.hasValue() &&
   4781         !SimplifiedAssociatedValue.getValue())
   4782       return Changed;
   4783 
   4784     Value &V = getAssociatedValue();
   4785     auto *C = SimplifiedAssociatedValue.hasValue()
   4786                   ? dyn_cast<Constant>(SimplifiedAssociatedValue.getValue())
   4787                   : UndefValue::get(V.getType());
   4788     if (C) {
   4789       auto PredForReturned =
   4790           [&](Value &V, const SmallSetVector<ReturnInst *, 4> &RetInsts) {
   4791             // We can replace the AssociatedValue with the constant.
   4792             if (&V == C || V.getType() != C->getType() || isa<UndefValue>(V))
   4793               return true;
   4794 
   4795             for (ReturnInst *RI : RetInsts) {
   4796               if (RI->getFunction() != getAnchorScope())
   4797                 continue;
   4798               auto *RC = C;
   4799               if (RC->getType() != RI->getReturnValue()->getType())
   4800                 RC = ConstantExpr::getBitCast(RC,
   4801                                               RI->getReturnValue()->getType());
   4802               LLVM_DEBUG(dbgs() << "[ValueSimplify] " << V << " -> " << *RC
   4803                                 << " in " << *RI << " :: " << *this << "\n");
   4804               if (A.changeUseAfterManifest(RI->getOperandUse(0), *RC))
   4805                 Changed = ChangeStatus::CHANGED;
   4806             }
   4807             return true;
   4808           };
   4809       A.checkForAllReturnedValuesAndReturnInsts(PredForReturned, *this);
   4810     }
   4811 
   4812     return Changed | AAValueSimplify::manifest(A);
   4813   }
   4814 
   4815   /// See AbstractAttribute::trackStatistics()
   4816   void trackStatistics() const override {
   4817     STATS_DECLTRACK_FNRET_ATTR(value_simplify)
   4818   }
   4819 };
   4820 
   4821 struct AAValueSimplifyFloating : AAValueSimplifyImpl {
   4822   AAValueSimplifyFloating(const IRPosition &IRP, Attributor &A)
   4823       : AAValueSimplifyImpl(IRP, A) {}
   4824 
   4825   /// See AbstractAttribute::initialize(...).
   4826   void initialize(Attributor &A) override {
   4827     // FIXME: This might have exposed a SCC iterator update bug in the old PM.
   4828     //        Needs investigation.
   4829     // AAValueSimplifyImpl::initialize(A);
   4830     Value &V = getAnchorValue();
   4831 
   4832     // TODO: add other stuffs
   4833     if (isa<Constant>(V))
   4834       indicatePessimisticFixpoint();
   4835   }
   4836 
   4837   /// Check if \p ICmp is an equality comparison (==/!=) with at least one
   4838   /// nullptr. If so, try to simplify it using AANonNull on the other operand.
   4839   /// Return true if successful, in that case SimplifiedAssociatedValue will be
   4840   /// updated and \p Changed is set appropriately.
   4841   bool checkForNullPtrCompare(Attributor &A, ICmpInst *ICmp,
   4842                               ChangeStatus &Changed) {
   4843     if (!ICmp)
   4844       return false;
   4845     if (!ICmp->isEquality())
   4846       return false;
   4847 
   4848     // This is a comparison with == or !-. We check for nullptr now.
   4849     bool Op0IsNull = isa<ConstantPointerNull>(ICmp->getOperand(0));
   4850     bool Op1IsNull = isa<ConstantPointerNull>(ICmp->getOperand(1));
   4851     if (!Op0IsNull && !Op1IsNull)
   4852       return false;
   4853 
   4854     LLVMContext &Ctx = ICmp->getContext();
   4855     // Check for `nullptr ==/!= nullptr` first:
   4856     if (Op0IsNull && Op1IsNull) {
   4857       Value *NewVal = ConstantInt::get(
   4858           Type::getInt1Ty(Ctx), ICmp->getPredicate() == CmpInst::ICMP_EQ);
   4859       assert(!SimplifiedAssociatedValue.hasValue() &&
   4860              "Did not expect non-fixed value for constant comparison");
   4861       SimplifiedAssociatedValue = NewVal;
   4862       indicateOptimisticFixpoint();
   4863       Changed = ChangeStatus::CHANGED;
   4864       return true;
   4865     }
   4866 
   4867     // Left is the nullptr ==/!= non-nullptr case. We'll use AANonNull on the
   4868     // non-nullptr operand and if we assume it's non-null we can conclude the
   4869     // result of the comparison.
   4870     assert((Op0IsNull || Op1IsNull) &&
   4871            "Expected nullptr versus non-nullptr comparison at this point");
   4872 
   4873     // The index is the operand that we assume is not null.
   4874     unsigned PtrIdx = Op0IsNull;
   4875     auto &PtrNonNullAA = A.getAAFor<AANonNull>(
   4876         *this, IRPosition::value(*ICmp->getOperand(PtrIdx)),
   4877         DepClassTy::REQUIRED);
   4878     if (!PtrNonNullAA.isAssumedNonNull())
   4879       return false;
   4880 
   4881     // The new value depends on the predicate, true for != and false for ==.
   4882     Value *NewVal = ConstantInt::get(Type::getInt1Ty(Ctx),
   4883                                      ICmp->getPredicate() == CmpInst::ICMP_NE);
   4884 
   4885     assert((!SimplifiedAssociatedValue.hasValue() ||
   4886             SimplifiedAssociatedValue == NewVal) &&
   4887            "Did not expect to change value for zero-comparison");
   4888 
   4889     bool HasValueBefore = SimplifiedAssociatedValue.hasValue();
   4890     SimplifiedAssociatedValue = NewVal;
   4891 
   4892     if (PtrNonNullAA.isKnownNonNull())
   4893       indicateOptimisticFixpoint();
   4894 
   4895     Changed = HasValueBefore ? ChangeStatus::UNCHANGED : ChangeStatus ::CHANGED;
   4896     return true;
   4897   }
   4898 
   4899   /// See AbstractAttribute::updateImpl(...).
   4900   ChangeStatus updateImpl(Attributor &A) override {
   4901     bool HasValueBefore = SimplifiedAssociatedValue.hasValue();
   4902 
   4903     ChangeStatus Changed;
   4904     if (checkForNullPtrCompare(A, dyn_cast<ICmpInst>(&getAnchorValue()),
   4905                                Changed))
   4906       return Changed;
   4907 
   4908     auto VisitValueCB = [&](Value &V, const Instruction *CtxI, bool &,
   4909                             bool Stripped) -> bool {
   4910       auto &AA = A.getAAFor<AAValueSimplify>(
   4911           *this, IRPosition::value(V, getCallBaseContext()),
   4912           DepClassTy::REQUIRED);
   4913       if (!Stripped && this == &AA) {
   4914         // TODO: Look the instruction and check recursively.
   4915 
   4916         LLVM_DEBUG(dbgs() << "[ValueSimplify] Can't be stripped more : " << V
   4917                           << "\n");
   4918         return false;
   4919       }
   4920       return checkAndUpdate(A, *this, V, SimplifiedAssociatedValue);
   4921     };
   4922 
   4923     bool Dummy = false;
   4924     if (!genericValueTraversal<AAValueSimplify, bool>(
   4925             A, getIRPosition(), *this, Dummy, VisitValueCB, getCtxI(),
   4926             /* UseValueSimplify */ false))
   4927       if (!askSimplifiedValueForOtherAAs(A))
   4928         return indicatePessimisticFixpoint();
   4929 
   4930     // If a candicate was found in this update, return CHANGED.
   4931 
   4932     return HasValueBefore == SimplifiedAssociatedValue.hasValue()
   4933                ? ChangeStatus::UNCHANGED
   4934                : ChangeStatus ::CHANGED;
   4935   }
   4936 
   4937   /// See AbstractAttribute::trackStatistics()
   4938   void trackStatistics() const override {
   4939     STATS_DECLTRACK_FLOATING_ATTR(value_simplify)
   4940   }
   4941 };
   4942 
   4943 struct AAValueSimplifyFunction : AAValueSimplifyImpl {
   4944   AAValueSimplifyFunction(const IRPosition &IRP, Attributor &A)
   4945       : AAValueSimplifyImpl(IRP, A) {}
   4946 
   4947   /// See AbstractAttribute::initialize(...).
   4948   void initialize(Attributor &A) override {
   4949     SimplifiedAssociatedValue = &getAnchorValue();
   4950     indicateOptimisticFixpoint();
   4951   }
   4952   /// See AbstractAttribute::initialize(...).
   4953   ChangeStatus updateImpl(Attributor &A) override {
   4954     llvm_unreachable(
   4955         "AAValueSimplify(Function|CallSite)::updateImpl will not be called");
   4956   }
   4957   /// See AbstractAttribute::trackStatistics()
   4958   void trackStatistics() const override {
   4959     STATS_DECLTRACK_FN_ATTR(value_simplify)
   4960   }
   4961 };
   4962 
   4963 struct AAValueSimplifyCallSite : AAValueSimplifyFunction {
   4964   AAValueSimplifyCallSite(const IRPosition &IRP, Attributor &A)
   4965       : AAValueSimplifyFunction(IRP, A) {}
   4966   /// See AbstractAttribute::trackStatistics()
   4967   void trackStatistics() const override {
   4968     STATS_DECLTRACK_CS_ATTR(value_simplify)
   4969   }
   4970 };
   4971 
   4972 struct AAValueSimplifyCallSiteReturned : AAValueSimplifyReturned {
   4973   AAValueSimplifyCallSiteReturned(const IRPosition &IRP, Attributor &A)
   4974       : AAValueSimplifyReturned(IRP, A) {}
   4975 
   4976   /// See AbstractAttribute::manifest(...).
   4977   ChangeStatus manifest(Attributor &A) override {
   4978     return AAValueSimplifyImpl::manifest(A);
   4979   }
   4980 
   4981   void trackStatistics() const override {
   4982     STATS_DECLTRACK_CSRET_ATTR(value_simplify)
   4983   }
   4984 };
   4985 struct AAValueSimplifyCallSiteArgument : AAValueSimplifyFloating {
   4986   AAValueSimplifyCallSiteArgument(const IRPosition &IRP, Attributor &A)
   4987       : AAValueSimplifyFloating(IRP, A) {}
   4988 
   4989   /// See AbstractAttribute::manifest(...).
   4990   ChangeStatus manifest(Attributor &A) override {
   4991     ChangeStatus Changed = ChangeStatus::UNCHANGED;
   4992 
   4993     if (SimplifiedAssociatedValue.hasValue() &&
   4994         !SimplifiedAssociatedValue.getValue())
   4995       return Changed;
   4996 
   4997     Value &V = getAssociatedValue();
   4998     auto *C = SimplifiedAssociatedValue.hasValue()
   4999                   ? dyn_cast<Constant>(SimplifiedAssociatedValue.getValue())
   5000                   : UndefValue::get(V.getType());
   5001     if (C) {
   5002       Use &U = cast<CallBase>(&getAnchorValue())
   5003                    ->getArgOperandUse(getCallSiteArgNo());
   5004       // We can replace the AssociatedValue with the constant.
   5005       if (&V != C && V.getType() == C->getType()) {
   5006         if (A.changeUseAfterManifest(U, *C))
   5007           Changed = ChangeStatus::CHANGED;
   5008       }
   5009     }
   5010 
   5011     return Changed | AAValueSimplify::manifest(A);
   5012   }
   5013 
   5014   void trackStatistics() const override {
   5015     STATS_DECLTRACK_CSARG_ATTR(value_simplify)
   5016   }
   5017 };
   5018 
   5019 /// ----------------------- Heap-To-Stack Conversion ---------------------------
   5020 struct AAHeapToStackImpl : public AAHeapToStack {
   5021   AAHeapToStackImpl(const IRPosition &IRP, Attributor &A)
   5022       : AAHeapToStack(IRP, A) {}
   5023 
   5024   const std::string getAsStr() const override {
   5025     return "[H2S] Mallocs: " + std::to_string(MallocCalls.size());
   5026   }
   5027 
   5028   ChangeStatus manifest(Attributor &A) override {
   5029     assert(getState().isValidState() &&
   5030            "Attempted to manifest an invalid state!");
   5031 
   5032     ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
   5033     Function *F = getAnchorScope();
   5034     const auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(*F);
   5035 
   5036     for (Instruction *MallocCall : MallocCalls) {
   5037       // This malloc cannot be replaced.
   5038       if (BadMallocCalls.count(MallocCall))
   5039         continue;
   5040 
   5041       for (Instruction *FreeCall : FreesForMalloc[MallocCall]) {
   5042         LLVM_DEBUG(dbgs() << "H2S: Removing free call: " << *FreeCall << "\n");
   5043         A.deleteAfterManifest(*FreeCall);
   5044         HasChanged = ChangeStatus::CHANGED;
   5045       }
   5046 
   5047       LLVM_DEBUG(dbgs() << "H2S: Removing malloc call: " << *MallocCall
   5048                         << "\n");
   5049 
   5050       Align Alignment;
   5051       Value *Size;
   5052       if (isCallocLikeFn(MallocCall, TLI)) {
   5053         auto *Num = MallocCall->getOperand(0);
   5054         auto *SizeT = MallocCall->getOperand(1);
   5055         IRBuilder<> B(MallocCall);
   5056         Size = B.CreateMul(Num, SizeT, "h2s.calloc.size");
   5057       } else if (isAlignedAllocLikeFn(MallocCall, TLI)) {
   5058         Size = MallocCall->getOperand(1);
   5059         Alignment = MaybeAlign(cast<ConstantInt>(MallocCall->getOperand(0))
   5060                                    ->getValue()
   5061                                    .getZExtValue())
   5062                         .valueOrOne();
   5063       } else {
   5064         Size = MallocCall->getOperand(0);
   5065       }
   5066 
   5067       unsigned AS = cast<PointerType>(MallocCall->getType())->getAddressSpace();
   5068       Instruction *AI =
   5069           new AllocaInst(Type::getInt8Ty(F->getContext()), AS, Size, Alignment,
   5070                          "", MallocCall->getNextNode());
   5071 
   5072       if (AI->getType() != MallocCall->getType())
   5073         AI = new BitCastInst(AI, MallocCall->getType(), "malloc_bc",
   5074                              AI->getNextNode());
   5075 
   5076       A.changeValueAfterManifest(*MallocCall, *AI);
   5077 
   5078       if (auto *II = dyn_cast<InvokeInst>(MallocCall)) {
   5079         auto *NBB = II->getNormalDest();
   5080         BranchInst::Create(NBB, MallocCall->getParent());
   5081         A.deleteAfterManifest(*MallocCall);
   5082       } else {
   5083         A.deleteAfterManifest(*MallocCall);
   5084       }
   5085 
   5086       // Zero out the allocated memory if it was a calloc.
   5087       if (isCallocLikeFn(MallocCall, TLI)) {
   5088         auto *BI = new BitCastInst(AI, MallocCall->getType(), "calloc_bc",
   5089                                    AI->getNextNode());
   5090         Value *Ops[] = {
   5091             BI, ConstantInt::get(F->getContext(), APInt(8, 0, false)), Size,
   5092             ConstantInt::get(Type::getInt1Ty(F->getContext()), false)};
   5093 
   5094         Type *Tys[] = {BI->getType(), MallocCall->getOperand(0)->getType()};
   5095         Module *M = F->getParent();
   5096         Function *Fn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys);
   5097         CallInst::Create(Fn, Ops, "", BI->getNextNode());
   5098       }
   5099       HasChanged = ChangeStatus::CHANGED;
   5100     }
   5101 
   5102     return HasChanged;
   5103   }
   5104 
   5105   /// Collection of all malloc calls in a function.
   5106   SmallSetVector<Instruction *, 4> MallocCalls;
   5107 
   5108   /// Collection of malloc calls that cannot be converted.
   5109   DenseSet<const Instruction *> BadMallocCalls;
   5110 
   5111   /// A map for each malloc call to the set of associated free calls.
   5112   DenseMap<Instruction *, SmallPtrSet<Instruction *, 4>> FreesForMalloc;
   5113 
   5114   ChangeStatus updateImpl(Attributor &A) override;
   5115 };
   5116 
   5117 ChangeStatus AAHeapToStackImpl::updateImpl(Attributor &A) {
   5118   const Function *F = getAnchorScope();
   5119   const auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(*F);
   5120 
   5121   MustBeExecutedContextExplorer &Explorer =
   5122       A.getInfoCache().getMustBeExecutedContextExplorer();
   5123 
   5124   auto FreeCheck = [&](Instruction &I) {
   5125     const auto &Frees = FreesForMalloc.lookup(&I);
   5126     if (Frees.size() != 1)
   5127       return false;
   5128     Instruction *UniqueFree = *Frees.begin();
   5129     return Explorer.findInContextOf(UniqueFree, I.getNextNode());
   5130   };
   5131 
   5132   auto UsesCheck = [&](Instruction &I) {
   5133     bool ValidUsesOnly = true;
   5134     bool MustUse = true;
   5135     auto Pred = [&](const Use &U, bool &Follow) -> bool {
   5136       Instruction *UserI = cast<Instruction>(U.getUser());
   5137       if (isa<LoadInst>(UserI))
   5138         return true;
   5139       if (auto *SI = dyn_cast<StoreInst>(UserI)) {
   5140         if (SI->getValueOperand() == U.get()) {
   5141           LLVM_DEBUG(dbgs()
   5142                      << "[H2S] escaping store to memory: " << *UserI << "\n");
   5143           ValidUsesOnly = false;
   5144         } else {
   5145           // A store into the malloc'ed memory is fine.
   5146         }
   5147         return true;
   5148       }
   5149       if (auto *CB = dyn_cast<CallBase>(UserI)) {
   5150         if (!CB->isArgOperand(&U) || CB->isLifetimeStartOrEnd())
   5151           return true;
   5152         // Record malloc.
   5153         if (isFreeCall(UserI, TLI)) {
   5154           if (MustUse) {
   5155             FreesForMalloc[&I].insert(UserI);
   5156           } else {
   5157             LLVM_DEBUG(dbgs() << "[H2S] free potentially on different mallocs: "
   5158                               << *UserI << "\n");
   5159             ValidUsesOnly = false;
   5160           }
   5161           return true;
   5162         }
   5163 
   5164         unsigned ArgNo = CB->getArgOperandNo(&U);
   5165 
   5166         const auto &NoCaptureAA = A.getAAFor<AANoCapture>(
   5167             *this, IRPosition::callsite_argument(*CB, ArgNo),
   5168             DepClassTy::REQUIRED);
   5169 
   5170         // If a callsite argument use is nofree, we are fine.
   5171         const auto &ArgNoFreeAA = A.getAAFor<AANoFree>(
   5172             *this, IRPosition::callsite_argument(*CB, ArgNo),
   5173             DepClassTy::REQUIRED);
   5174 
   5175         if (!NoCaptureAA.isAssumedNoCapture() ||
   5176             !ArgNoFreeAA.isAssumedNoFree()) {
   5177           LLVM_DEBUG(dbgs() << "[H2S] Bad user: " << *UserI << "\n");
   5178           ValidUsesOnly = false;
   5179         }
   5180         return true;
   5181       }
   5182 
   5183       if (isa<GetElementPtrInst>(UserI) || isa<BitCastInst>(UserI) ||
   5184           isa<PHINode>(UserI) || isa<SelectInst>(UserI)) {
   5185         MustUse &= !(isa<PHINode>(UserI) || isa<SelectInst>(UserI));
   5186         Follow = true;
   5187         return true;
   5188       }
   5189       // Unknown user for which we can not track uses further (in a way that
   5190       // makes sense).
   5191       LLVM_DEBUG(dbgs() << "[H2S] Unknown user: " << *UserI << "\n");
   5192       ValidUsesOnly = false;
   5193       return true;
   5194     };
   5195     A.checkForAllUses(Pred, *this, I);
   5196     return ValidUsesOnly;
   5197   };
   5198 
   5199   auto MallocCallocCheck = [&](Instruction &I) {
   5200     if (BadMallocCalls.count(&I))
   5201       return true;
   5202 
   5203     bool IsMalloc = isMallocLikeFn(&I, TLI);
   5204     bool IsAlignedAllocLike = isAlignedAllocLikeFn(&I, TLI);
   5205     bool IsCalloc = !IsMalloc && isCallocLikeFn(&I, TLI);
   5206     if (!IsMalloc && !IsAlignedAllocLike && !IsCalloc) {
   5207       BadMallocCalls.insert(&I);
   5208       return true;
   5209     }
   5210 
   5211     if (IsMalloc) {
   5212       if (MaxHeapToStackSize == -1) {
   5213         if (UsesCheck(I) || FreeCheck(I)) {
   5214           MallocCalls.insert(&I);
   5215           return true;
   5216         }
   5217       }
   5218       if (auto *Size = dyn_cast<ConstantInt>(I.getOperand(0)))
   5219         if (Size->getValue().ule(MaxHeapToStackSize))
   5220           if (UsesCheck(I) || FreeCheck(I)) {
   5221             MallocCalls.insert(&I);
   5222             return true;
   5223           }
   5224     } else if (IsAlignedAllocLike && isa<ConstantInt>(I.getOperand(0))) {
   5225       if (MaxHeapToStackSize == -1) {
   5226         if (UsesCheck(I) || FreeCheck(I)) {
   5227           MallocCalls.insert(&I);
   5228           return true;
   5229         }
   5230       }
   5231       // Only if the alignment and sizes are constant.
   5232       if (auto *Size = dyn_cast<ConstantInt>(I.getOperand(1)))
   5233         if (Size->getValue().ule(MaxHeapToStackSize))
   5234           if (UsesCheck(I) || FreeCheck(I)) {
   5235             MallocCalls.insert(&I);
   5236             return true;
   5237           }
   5238     } else if (IsCalloc) {
   5239       if (MaxHeapToStackSize == -1) {
   5240         if (UsesCheck(I) || FreeCheck(I)) {
   5241           MallocCalls.insert(&I);
   5242           return true;
   5243         }
   5244       }
   5245       bool Overflow = false;
   5246       if (auto *Num = dyn_cast<ConstantInt>(I.getOperand(0)))
   5247         if (auto *Size = dyn_cast<ConstantInt>(I.getOperand(1)))
   5248           if ((Size->getValue().umul_ov(Num->getValue(), Overflow))
   5249                   .ule(MaxHeapToStackSize))
   5250             if (!Overflow && (UsesCheck(I) || FreeCheck(I))) {
   5251               MallocCalls.insert(&I);
   5252               return true;
   5253             }
   5254     }
   5255 
   5256     BadMallocCalls.insert(&I);
   5257     return true;
   5258   };
   5259 
   5260   size_t NumBadMallocs = BadMallocCalls.size();
   5261 
   5262   A.checkForAllCallLikeInstructions(MallocCallocCheck, *this);
   5263 
   5264   if (NumBadMallocs != BadMallocCalls.size())
   5265     return ChangeStatus::CHANGED;
   5266 
   5267   return ChangeStatus::UNCHANGED;
   5268 }
   5269 
   5270 struct AAHeapToStackFunction final : public AAHeapToStackImpl {
   5271   AAHeapToStackFunction(const IRPosition &IRP, Attributor &A)
   5272       : AAHeapToStackImpl(IRP, A) {}
   5273 
   5274   /// See AbstractAttribute::trackStatistics().
   5275   void trackStatistics() const override {
   5276     STATS_DECL(
   5277         MallocCalls, Function,
   5278         "Number of malloc/calloc/aligned_alloc calls converted to allocas");
   5279     for (auto *C : MallocCalls)
   5280       if (!BadMallocCalls.count(C))
   5281         ++BUILD_STAT_NAME(MallocCalls, Function);
   5282   }
   5283 };
   5284 
   5285 /// ----------------------- Privatizable Pointers ------------------------------
   5286 struct AAPrivatizablePtrImpl : public AAPrivatizablePtr {
   5287   AAPrivatizablePtrImpl(const IRPosition &IRP, Attributor &A)
   5288       : AAPrivatizablePtr(IRP, A), PrivatizableType(llvm::None) {}
   5289 
   5290   ChangeStatus indicatePessimisticFixpoint() override {
   5291     AAPrivatizablePtr::indicatePessimisticFixpoint();
   5292     PrivatizableType = nullptr;
   5293     return ChangeStatus::CHANGED;
   5294   }
   5295 
   5296   /// Identify the type we can chose for a private copy of the underlying
   5297   /// argument. None means it is not clear yet, nullptr means there is none.
   5298   virtual Optional<Type *> identifyPrivatizableType(Attributor &A) = 0;
   5299 
   5300   /// Return a privatizable type that encloses both T0 and T1.
   5301   /// TODO: This is merely a stub for now as we should manage a mapping as well.
   5302   Optional<Type *> combineTypes(Optional<Type *> T0, Optional<Type *> T1) {
   5303     if (!T0.hasValue())
   5304       return T1;
   5305     if (!T1.hasValue())
   5306       return T0;
   5307     if (T0 == T1)
   5308       return T0;
   5309     return nullptr;
   5310   }
   5311 
   5312   Optional<Type *> getPrivatizableType() const override {
   5313     return PrivatizableType;
   5314   }
   5315 
   5316   const std::string getAsStr() const override {
   5317     return isAssumedPrivatizablePtr() ? "[priv]" : "[no-priv]";
   5318   }
   5319 
   5320 protected:
   5321   Optional<Type *> PrivatizableType;
   5322 };
   5323 
   5324 // TODO: Do this for call site arguments (probably also other values) as well.
   5325 
   5326 struct AAPrivatizablePtrArgument final : public AAPrivatizablePtrImpl {
   5327   AAPrivatizablePtrArgument(const IRPosition &IRP, Attributor &A)
   5328       : AAPrivatizablePtrImpl(IRP, A) {}
   5329 
   5330   /// See AAPrivatizablePtrImpl::identifyPrivatizableType(...)
   5331   Optional<Type *> identifyPrivatizableType(Attributor &A) override {
   5332     // If this is a byval argument and we know all the call sites (so we can
   5333     // rewrite them), there is no need to check them explicitly.
   5334     bool AllCallSitesKnown;
   5335     if (getIRPosition().hasAttr(Attribute::ByVal) &&
   5336         A.checkForAllCallSites([](AbstractCallSite ACS) { return true; }, *this,
   5337                                true, AllCallSitesKnown))
   5338       return getAssociatedValue().getType()->getPointerElementType();
   5339 
   5340     Optional<Type *> Ty;
   5341     unsigned ArgNo = getIRPosition().getCallSiteArgNo();
   5342 
   5343     // Make sure the associated call site argument has the same type at all call
   5344     // sites and it is an allocation we know is safe to privatize, for now that
   5345     // means we only allow alloca instructions.
   5346     // TODO: We can additionally analyze the accesses in the callee to  create
   5347     //       the type from that information instead. That is a little more
   5348     //       involved and will be done in a follow up patch.
   5349     auto CallSiteCheck = [&](AbstractCallSite ACS) {
   5350       IRPosition ACSArgPos = IRPosition::callsite_argument(ACS, ArgNo);
   5351       // Check if a coresponding argument was found or if it is one not
   5352       // associated (which can happen for callback calls).
   5353       if (ACSArgPos.getPositionKind() == IRPosition::IRP_INVALID)
   5354         return false;
   5355 
   5356       // Check that all call sites agree on a type.
   5357       auto &PrivCSArgAA =
   5358           A.getAAFor<AAPrivatizablePtr>(*this, ACSArgPos, DepClassTy::REQUIRED);
   5359       Optional<Type *> CSTy = PrivCSArgAA.getPrivatizableType();
   5360 
   5361       LLVM_DEBUG({
   5362         dbgs() << "[AAPrivatizablePtr] ACSPos: " << ACSArgPos << ", CSTy: ";
   5363         if (CSTy.hasValue() && CSTy.getValue())
   5364           CSTy.getValue()->print(dbgs());
   5365         else if (CSTy.hasValue())
   5366           dbgs() << "<nullptr>";
   5367         else
   5368           dbgs() << "<none>";
   5369       });
   5370 
   5371       Ty = combineTypes(Ty, CSTy);
   5372 
   5373       LLVM_DEBUG({
   5374         dbgs() << " : New Type: ";
   5375         if (Ty.hasValue() && Ty.getValue())
   5376           Ty.getValue()->print(dbgs());
   5377         else if (Ty.hasValue())
   5378           dbgs() << "<nullptr>";
   5379         else
   5380           dbgs() << "<none>";
   5381         dbgs() << "\n";
   5382       });
   5383 
   5384       return !Ty.hasValue() || Ty.getValue();
   5385     };
   5386 
   5387     if (!A.checkForAllCallSites(CallSiteCheck, *this, true, AllCallSitesKnown))
   5388       return nullptr;
   5389     return Ty;
   5390   }
   5391 
   5392   /// See AbstractAttribute::updateImpl(...).
   5393   ChangeStatus updateImpl(Attributor &A) override {
   5394     PrivatizableType = identifyPrivatizableType(A);
   5395     if (!PrivatizableType.hasValue())
   5396       return ChangeStatus::UNCHANGED;
   5397     if (!PrivatizableType.getValue())
   5398       return indicatePessimisticFixpoint();
   5399 
   5400     // The dependence is optional so we don't give up once we give up on the
   5401     // alignment.
   5402     A.getAAFor<AAAlign>(*this, IRPosition::value(getAssociatedValue()),
   5403                         DepClassTy::OPTIONAL);
   5404 
   5405     // Avoid arguments with padding for now.
   5406     if (!getIRPosition().hasAttr(Attribute::ByVal) &&
   5407         !ArgumentPromotionPass::isDenselyPacked(PrivatizableType.getValue(),
   5408                                                 A.getInfoCache().getDL())) {
   5409       LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] Padding detected\n");
   5410       return indicatePessimisticFixpoint();
   5411     }
   5412 
   5413     // Verify callee and caller agree on how the promoted argument would be
   5414     // passed.
   5415     // TODO: The use of the ArgumentPromotion interface here is ugly, we need a
   5416     // specialized form of TargetTransformInfo::areFunctionArgsABICompatible
   5417     // which doesn't require the arguments ArgumentPromotion wanted to pass.
   5418     Function &Fn = *getIRPosition().getAnchorScope();
   5419     SmallPtrSet<Argument *, 1> ArgsToPromote, Dummy;
   5420     ArgsToPromote.insert(getAssociatedArgument());
   5421     const auto *TTI =
   5422         A.getInfoCache().getAnalysisResultForFunction<TargetIRAnalysis>(Fn);
   5423     if (!TTI ||
   5424         !ArgumentPromotionPass::areFunctionArgsABICompatible(
   5425             Fn, *TTI, ArgsToPromote, Dummy) ||
   5426         ArgsToPromote.empty()) {
   5427       LLVM_DEBUG(
   5428           dbgs() << "[AAPrivatizablePtr] ABI incompatibility detected for "
   5429                  << Fn.getName() << "\n");
   5430       return indicatePessimisticFixpoint();
   5431     }
   5432 
   5433     // Collect the types that will replace the privatizable type in the function
   5434     // signature.
   5435     SmallVector<Type *, 16> ReplacementTypes;
   5436     identifyReplacementTypes(PrivatizableType.getValue(), ReplacementTypes);
   5437 
   5438     // Register a rewrite of the argument.
   5439     Argument *Arg = getAssociatedArgument();
   5440     if (!A.isValidFunctionSignatureRewrite(*Arg, ReplacementTypes)) {
   5441       LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] Rewrite not valid\n");
   5442       return indicatePessimisticFixpoint();
   5443     }
   5444 
   5445     unsigned ArgNo = Arg->getArgNo();
   5446 
   5447     // Helper to check if for the given call site the associated argument is
   5448     // passed to a callback where the privatization would be different.
   5449     auto IsCompatiblePrivArgOfCallback = [&](CallBase &CB) {
   5450       SmallVector<const Use *, 4> CallbackUses;
   5451       AbstractCallSite::getCallbackUses(CB, CallbackUses);
   5452       for (const Use *U : CallbackUses) {
   5453         AbstractCallSite CBACS(U);
   5454         assert(CBACS && CBACS.isCallbackCall());
   5455         for (Argument &CBArg : CBACS.getCalledFunction()->args()) {
   5456           int CBArgNo = CBACS.getCallArgOperandNo(CBArg);
   5457 
   5458           LLVM_DEBUG({
   5459             dbgs()
   5460                 << "[AAPrivatizablePtr] Argument " << *Arg
   5461                 << "check if can be privatized in the context of its parent ("
   5462                 << Arg->getParent()->getName()
   5463                 << ")\n[AAPrivatizablePtr] because it is an argument in a "
   5464                    "callback ("
   5465                 << CBArgNo << "@" << CBACS.getCalledFunction()->getName()
   5466                 << ")\n[AAPrivatizablePtr] " << CBArg << " : "
   5467                 << CBACS.getCallArgOperand(CBArg) << " vs "
   5468                 << CB.getArgOperand(ArgNo) << "\n"
   5469                 << "[AAPrivatizablePtr] " << CBArg << " : "
   5470                 << CBACS.getCallArgOperandNo(CBArg) << " vs " << ArgNo << "\n";
   5471           });
   5472 
   5473           if (CBArgNo != int(ArgNo))
   5474             continue;
   5475           const auto &CBArgPrivAA = A.getAAFor<AAPrivatizablePtr>(
   5476               *this, IRPosition::argument(CBArg), DepClassTy::REQUIRED);
   5477           if (CBArgPrivAA.isValidState()) {
   5478             auto CBArgPrivTy = CBArgPrivAA.getPrivatizableType();
   5479             if (!CBArgPrivTy.hasValue())
   5480               continue;
   5481             if (CBArgPrivTy.getValue() == PrivatizableType)
   5482               continue;
   5483           }
   5484 
   5485           LLVM_DEBUG({
   5486             dbgs() << "[AAPrivatizablePtr] Argument " << *Arg
   5487                    << " cannot be privatized in the context of its parent ("
   5488                    << Arg->getParent()->getName()
   5489                    << ")\n[AAPrivatizablePtr] because it is an argument in a "
   5490                       "callback ("
   5491                    << CBArgNo << "@" << CBACS.getCalledFunction()->getName()
   5492                    << ").\n[AAPrivatizablePtr] for which the argument "
   5493                       "privatization is not compatible.\n";
   5494           });
   5495           return false;
   5496         }
   5497       }
   5498       return true;
   5499     };
   5500 
   5501     // Helper to check if for the given call site the associated argument is
   5502     // passed to a direct call where the privatization would be different.
   5503     auto IsCompatiblePrivArgOfDirectCS = [&](AbstractCallSite ACS) {
   5504       CallBase *DC = cast<CallBase>(ACS.getInstruction());
   5505       int DCArgNo = ACS.getCallArgOperandNo(ArgNo);
   5506       assert(DCArgNo >= 0 && unsigned(DCArgNo) < DC->getNumArgOperands() &&
   5507              "Expected a direct call operand for callback call operand");
   5508 
   5509       LLVM_DEBUG({
   5510         dbgs() << "[AAPrivatizablePtr] Argument " << *Arg
   5511                << " check if be privatized in the context of its parent ("
   5512                << Arg->getParent()->getName()
   5513                << ")\n[AAPrivatizablePtr] because it is an argument in a "
   5514                   "direct call of ("
   5515                << DCArgNo << "@" << DC->getCalledFunction()->getName()
   5516                << ").\n";
   5517       });
   5518 
   5519       Function *DCCallee = DC->getCalledFunction();
   5520       if (unsigned(DCArgNo) < DCCallee->arg_size()) {
   5521         const auto &DCArgPrivAA = A.getAAFor<AAPrivatizablePtr>(
   5522             *this, IRPosition::argument(*DCCallee->getArg(DCArgNo)),
   5523             DepClassTy::REQUIRED);
   5524         if (DCArgPrivAA.isValidState()) {
   5525           auto DCArgPrivTy = DCArgPrivAA.getPrivatizableType();
   5526           if (!DCArgPrivTy.hasValue())
   5527             return true;
   5528           if (DCArgPrivTy.getValue() == PrivatizableType)
   5529             return true;
   5530         }
   5531       }
   5532 
   5533       LLVM_DEBUG({
   5534         dbgs() << "[AAPrivatizablePtr] Argument " << *Arg
   5535                << " cannot be privatized in the context of its parent ("
   5536                << Arg->getParent()->getName()
   5537                << ")\n[AAPrivatizablePtr] because it is an argument in a "
   5538                   "direct call of ("
   5539                << ACS.getInstruction()->getCalledFunction()->getName()
   5540                << ").\n[AAPrivatizablePtr] for which the argument "
   5541                   "privatization is not compatible.\n";
   5542       });
   5543       return false;
   5544     };
   5545 
   5546     // Helper to check if the associated argument is used at the given abstract
   5547     // call site in a way that is incompatible with the privatization assumed
   5548     // here.
   5549     auto IsCompatiblePrivArgOfOtherCallSite = [&](AbstractCallSite ACS) {
   5550       if (ACS.isDirectCall())
   5551         return IsCompatiblePrivArgOfCallback(*ACS.getInstruction());
   5552       if (ACS.isCallbackCall())
   5553         return IsCompatiblePrivArgOfDirectCS(ACS);
   5554       return false;
   5555     };
   5556 
   5557     bool AllCallSitesKnown;
   5558     if (!A.checkForAllCallSites(IsCompatiblePrivArgOfOtherCallSite, *this, true,
   5559                                 AllCallSitesKnown))
   5560       return indicatePessimisticFixpoint();
   5561 
   5562     return ChangeStatus::UNCHANGED;
   5563   }
   5564 
   5565   /// Given a type to private \p PrivType, collect the constituates (which are
   5566   /// used) in \p ReplacementTypes.
   5567   static void
   5568   identifyReplacementTypes(Type *PrivType,
   5569                            SmallVectorImpl<Type *> &ReplacementTypes) {
   5570     // TODO: For now we expand the privatization type to the fullest which can
   5571     //       lead to dead arguments that need to be removed later.
   5572     assert(PrivType && "Expected privatizable type!");
   5573 
   5574     // Traverse the type, extract constituate types on the outermost level.
   5575     if (auto *PrivStructType = dyn_cast<StructType>(PrivType)) {
   5576       for (unsigned u = 0, e = PrivStructType->getNumElements(); u < e; u++)
   5577         ReplacementTypes.push_back(PrivStructType->getElementType(u));
   5578     } else if (auto *PrivArrayType = dyn_cast<ArrayType>(PrivType)) {
   5579       ReplacementTypes.append(PrivArrayType->getNumElements(),
   5580                               PrivArrayType->getElementType());
   5581     } else {
   5582       ReplacementTypes.push_back(PrivType);
   5583     }
   5584   }
   5585 
   5586   /// Initialize \p Base according to the type \p PrivType at position \p IP.
   5587   /// The values needed are taken from the arguments of \p F starting at
   5588   /// position \p ArgNo.
   5589   static void createInitialization(Type *PrivType, Value &Base, Function &F,
   5590                                    unsigned ArgNo, Instruction &IP) {
   5591     assert(PrivType && "Expected privatizable type!");
   5592 
   5593     IRBuilder<NoFolder> IRB(&IP);
   5594     const DataLayout &DL = F.getParent()->getDataLayout();
   5595 
   5596     // Traverse the type, build GEPs and stores.
   5597     if (auto *PrivStructType = dyn_cast<StructType>(PrivType)) {
   5598       const StructLayout *PrivStructLayout = DL.getStructLayout(PrivStructType);
   5599       for (unsigned u = 0, e = PrivStructType->getNumElements(); u < e; u++) {
   5600         Type *PointeeTy = PrivStructType->getElementType(u)->getPointerTo();
   5601         Value *Ptr =
   5602             constructPointer(PointeeTy, PrivType, &Base,
   5603                              PrivStructLayout->getElementOffset(u), IRB, DL);
   5604         new StoreInst(F.getArg(ArgNo + u), Ptr, &IP);
   5605       }
   5606     } else if (auto *PrivArrayType = dyn_cast<ArrayType>(PrivType)) {
   5607       Type *PointeeTy = PrivArrayType->getElementType();
   5608       Type *PointeePtrTy = PointeeTy->getPointerTo();
   5609       uint64_t PointeeTySize = DL.getTypeStoreSize(PointeeTy);
   5610       for (unsigned u = 0, e = PrivArrayType->getNumElements(); u < e; u++) {
   5611         Value *Ptr = constructPointer(PointeePtrTy, PrivType, &Base,
   5612                                       u * PointeeTySize, IRB, DL);
   5613         new StoreInst(F.getArg(ArgNo + u), Ptr, &IP);
   5614       }
   5615     } else {
   5616       new StoreInst(F.getArg(ArgNo), &Base, &IP);
   5617     }
   5618   }
   5619 
   5620   /// Extract values from \p Base according to the type \p PrivType at the
   5621   /// call position \p ACS. The values are appended to \p ReplacementValues.
   5622   void createReplacementValues(Align Alignment, Type *PrivType,
   5623                                AbstractCallSite ACS, Value *Base,
   5624                                SmallVectorImpl<Value *> &ReplacementValues) {
   5625     assert(Base && "Expected base value!");
   5626     assert(PrivType && "Expected privatizable type!");
   5627     Instruction *IP = ACS.getInstruction();
   5628 
   5629     IRBuilder<NoFolder> IRB(IP);
   5630     const DataLayout &DL = IP->getModule()->getDataLayout();
   5631 
   5632     if (Base->getType()->getPointerElementType() != PrivType)
   5633       Base = BitCastInst::CreateBitOrPointerCast(Base, PrivType->getPointerTo(),
   5634                                                  "", ACS.getInstruction());
   5635 
   5636     // Traverse the type, build GEPs and loads.
   5637     if (auto *PrivStructType = dyn_cast<StructType>(PrivType)) {
   5638       const StructLayout *PrivStructLayout = DL.getStructLayout(PrivStructType);
   5639       for (unsigned u = 0, e = PrivStructType->getNumElements(); u < e; u++) {
   5640         Type *PointeeTy = PrivStructType->getElementType(u);
   5641         Value *Ptr =
   5642             constructPointer(PointeeTy->getPointerTo(), PrivType, Base,
   5643                              PrivStructLayout->getElementOffset(u), IRB, DL);
   5644         LoadInst *L = new LoadInst(PointeeTy, Ptr, "", IP);
   5645         L->setAlignment(Alignment);
   5646         ReplacementValues.push_back(L);
   5647       }
   5648     } else if (auto *PrivArrayType = dyn_cast<ArrayType>(PrivType)) {
   5649       Type *PointeeTy = PrivArrayType->getElementType();
   5650       uint64_t PointeeTySize = DL.getTypeStoreSize(PointeeTy);
   5651       Type *PointeePtrTy = PointeeTy->getPointerTo();
   5652       for (unsigned u = 0, e = PrivArrayType->getNumElements(); u < e; u++) {
   5653         Value *Ptr = constructPointer(PointeePtrTy, PrivType, Base,
   5654                                       u * PointeeTySize, IRB, DL);
   5655         LoadInst *L = new LoadInst(PointeeTy, Ptr, "", IP);
   5656         L->setAlignment(Alignment);
   5657         ReplacementValues.push_back(L);
   5658       }
   5659     } else {
   5660       LoadInst *L = new LoadInst(PrivType, Base, "", IP);
   5661       L->setAlignment(Alignment);
   5662       ReplacementValues.push_back(L);
   5663     }
   5664   }
   5665 
   5666   /// See AbstractAttribute::manifest(...)
   5667   ChangeStatus manifest(Attributor &A) override {
   5668     if (!PrivatizableType.hasValue())
   5669       return ChangeStatus::UNCHANGED;
   5670     assert(PrivatizableType.getValue() && "Expected privatizable type!");
   5671 
   5672     // Collect all tail calls in the function as we cannot allow new allocas to
   5673     // escape into tail recursion.
   5674     // TODO: Be smarter about new allocas escaping into tail calls.
   5675     SmallVector<CallInst *, 16> TailCalls;
   5676     if (!A.checkForAllInstructions(
   5677             [&](Instruction &I) {
   5678               CallInst &CI = cast<CallInst>(I);
   5679               if (CI.isTailCall())
   5680                 TailCalls.push_back(&CI);
   5681               return true;
   5682             },
   5683             *this, {Instruction::Call}))
   5684       return ChangeStatus::UNCHANGED;
   5685 
   5686     Argument *Arg = getAssociatedArgument();
   5687     // Query AAAlign attribute for alignment of associated argument to
   5688     // determine the best alignment of loads.
   5689     const auto &AlignAA =
   5690         A.getAAFor<AAAlign>(*this, IRPosition::value(*Arg), DepClassTy::NONE);
   5691 
   5692     // Callback to repair the associated function. A new alloca is placed at the
   5693     // beginning and initialized with the values passed through arguments. The
   5694     // new alloca replaces the use of the old pointer argument.
   5695     Attributor::ArgumentReplacementInfo::CalleeRepairCBTy FnRepairCB =
   5696         [=](const Attributor::ArgumentReplacementInfo &ARI,
   5697             Function &ReplacementFn, Function::arg_iterator ArgIt) {
   5698           BasicBlock &EntryBB = ReplacementFn.getEntryBlock();
   5699           Instruction *IP = &*EntryBB.getFirstInsertionPt();
   5700           Instruction *AI = new AllocaInst(PrivatizableType.getValue(), 0,
   5701                                            Arg->getName() + ".priv", IP);
   5702           createInitialization(PrivatizableType.getValue(), *AI, ReplacementFn,
   5703                                ArgIt->getArgNo(), *IP);
   5704 
   5705           if (AI->getType() != Arg->getType())
   5706             AI =
   5707                 BitCastInst::CreateBitOrPointerCast(AI, Arg->getType(), "", IP);
   5708           Arg->replaceAllUsesWith(AI);
   5709 
   5710           for (CallInst *CI : TailCalls)
   5711             CI->setTailCall(false);
   5712         };
   5713 
   5714     // Callback to repair a call site of the associated function. The elements
   5715     // of the privatizable type are loaded prior to the call and passed to the
   5716     // new function version.
   5717     Attributor::ArgumentReplacementInfo::ACSRepairCBTy ACSRepairCB =
   5718         [=, &AlignAA](const Attributor::ArgumentReplacementInfo &ARI,
   5719                       AbstractCallSite ACS,
   5720                       SmallVectorImpl<Value *> &NewArgOperands) {
   5721           // When no alignment is specified for the load instruction,
   5722           // natural alignment is assumed.
   5723           createReplacementValues(
   5724               assumeAligned(AlignAA.getAssumedAlign()),
   5725               PrivatizableType.getValue(), ACS,
   5726               ACS.getCallArgOperand(ARI.getReplacedArg().getArgNo()),
   5727               NewArgOperands);
   5728         };
   5729 
   5730     // Collect the types that will replace the privatizable type in the function
   5731     // signature.
   5732     SmallVector<Type *, 16> ReplacementTypes;
   5733     identifyReplacementTypes(PrivatizableType.getValue(), ReplacementTypes);
   5734 
   5735     // Register a rewrite of the argument.
   5736     if (A.registerFunctionSignatureRewrite(*Arg, ReplacementTypes,
   5737                                            std::move(FnRepairCB),
   5738                                            std::move(ACSRepairCB)))
   5739       return ChangeStatus::CHANGED;
   5740     return ChangeStatus::UNCHANGED;
   5741   }
   5742 
   5743   /// See AbstractAttribute::trackStatistics()
   5744   void trackStatistics() const override {
   5745     STATS_DECLTRACK_ARG_ATTR(privatizable_ptr);
   5746   }
   5747 };
   5748 
   5749 struct AAPrivatizablePtrFloating : public AAPrivatizablePtrImpl {
   5750   AAPrivatizablePtrFloating(const IRPosition &IRP, Attributor &A)
   5751       : AAPrivatizablePtrImpl(IRP, A) {}
   5752 
   5753   /// See AbstractAttribute::initialize(...).
   5754   virtual void initialize(Attributor &A) override {
   5755     // TODO: We can privatize more than arguments.
   5756     indicatePessimisticFixpoint();
   5757   }
   5758 
   5759   ChangeStatus updateImpl(Attributor &A) override {
   5760     llvm_unreachable("AAPrivatizablePtr(Floating|Returned|CallSiteReturned)::"
   5761                      "updateImpl will not be called");
   5762   }
   5763 
   5764   /// See AAPrivatizablePtrImpl::identifyPrivatizableType(...)
   5765   Optional<Type *> identifyPrivatizableType(Attributor &A) override {
   5766     Value *Obj = getUnderlyingObject(&getAssociatedValue());
   5767     if (!Obj) {
   5768       LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] No underlying object found!\n");
   5769       return nullptr;
   5770     }
   5771 
   5772     if (auto *AI = dyn_cast<AllocaInst>(Obj))
   5773       if (auto *CI = dyn_cast<ConstantInt>(AI->getArraySize()))
   5774         if (CI->isOne())
   5775           return Obj->getType()->getPointerElementType();
   5776     if (auto *Arg = dyn_cast<Argument>(Obj)) {
   5777       auto &PrivArgAA = A.getAAFor<AAPrivatizablePtr>(
   5778           *this, IRPosition::argument(*Arg), DepClassTy::REQUIRED);
   5779       if (PrivArgAA.isAssumedPrivatizablePtr())
   5780         return Obj->getType()->getPointerElementType();
   5781     }
   5782 
   5783     LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] Underlying object neither valid "
   5784                          "alloca nor privatizable argument: "
   5785                       << *Obj << "!\n");
   5786     return nullptr;
   5787   }
   5788 
   5789   /// See AbstractAttribute::trackStatistics()
   5790   void trackStatistics() const override {
   5791     STATS_DECLTRACK_FLOATING_ATTR(privatizable_ptr);
   5792   }
   5793 };
   5794 
   5795 struct AAPrivatizablePtrCallSiteArgument final
   5796     : public AAPrivatizablePtrFloating {
   5797   AAPrivatizablePtrCallSiteArgument(const IRPosition &IRP, Attributor &A)
   5798       : AAPrivatizablePtrFloating(IRP, A) {}
   5799 
   5800   /// See AbstractAttribute::initialize(...).
   5801   void initialize(Attributor &A) override {
   5802     if (getIRPosition().hasAttr(Attribute::ByVal))
   5803       indicateOptimisticFixpoint();
   5804   }
   5805 
   5806   /// See AbstractAttribute::updateImpl(...).
   5807   ChangeStatus updateImpl(Attributor &A) override {
   5808     PrivatizableType = identifyPrivatizableType(A);
   5809     if (!PrivatizableType.hasValue())
   5810       return ChangeStatus::UNCHANGED;
   5811     if (!PrivatizableType.getValue())
   5812       return indicatePessimisticFixpoint();
   5813 
   5814     const IRPosition &IRP = getIRPosition();
   5815     auto &NoCaptureAA =
   5816         A.getAAFor<AANoCapture>(*this, IRP, DepClassTy::REQUIRED);
   5817     if (!NoCaptureAA.isAssumedNoCapture()) {
   5818       LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] pointer might be captured!\n");
   5819       return indicatePessimisticFixpoint();
   5820     }
   5821 
   5822     auto &NoAliasAA = A.getAAFor<AANoAlias>(*this, IRP, DepClassTy::REQUIRED);
   5823     if (!NoAliasAA.isAssumedNoAlias()) {
   5824       LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] pointer might alias!\n");
   5825       return indicatePessimisticFixpoint();
   5826     }
   5827 
   5828     const auto &MemBehaviorAA =
   5829         A.getAAFor<AAMemoryBehavior>(*this, IRP, DepClassTy::REQUIRED);
   5830     if (!MemBehaviorAA.isAssumedReadOnly()) {
   5831       LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] pointer is written!\n");
   5832       return indicatePessimisticFixpoint();
   5833     }
   5834 
   5835     return ChangeStatus::UNCHANGED;
   5836   }
   5837 
   5838   /// See AbstractAttribute::trackStatistics()
   5839   void trackStatistics() const override {
   5840     STATS_DECLTRACK_CSARG_ATTR(privatizable_ptr);
   5841   }
   5842 };
   5843 
   5844 struct AAPrivatizablePtrCallSiteReturned final
   5845     : public AAPrivatizablePtrFloating {
   5846   AAPrivatizablePtrCallSiteReturned(const IRPosition &IRP, Attributor &A)
   5847       : AAPrivatizablePtrFloating(IRP, A) {}
   5848 
   5849   /// See AbstractAttribute::initialize(...).
   5850   void initialize(Attributor &A) override {
   5851     // TODO: We can privatize more than arguments.
   5852     indicatePessimisticFixpoint();
   5853   }
   5854 
   5855   /// See AbstractAttribute::trackStatistics()
   5856   void trackStatistics() const override {
   5857     STATS_DECLTRACK_CSRET_ATTR(privatizable_ptr);
   5858   }
   5859 };
   5860 
   5861 struct AAPrivatizablePtrReturned final : public AAPrivatizablePtrFloating {
   5862   AAPrivatizablePtrReturned(const IRPosition &IRP, Attributor &A)
   5863       : AAPrivatizablePtrFloating(IRP, A) {}
   5864 
   5865   /// See AbstractAttribute::initialize(...).
   5866   void initialize(Attributor &A) override {
   5867     // TODO: We can privatize more than arguments.
   5868     indicatePessimisticFixpoint();
   5869   }
   5870 
   5871   /// See AbstractAttribute::trackStatistics()
   5872   void trackStatistics() const override {
   5873     STATS_DECLTRACK_FNRET_ATTR(privatizable_ptr);
   5874   }
   5875 };
   5876 
   5877 /// -------------------- Memory Behavior Attributes ----------------------------
   5878 /// Includes read-none, read-only, and write-only.
   5879 /// ----------------------------------------------------------------------------
   5880 struct AAMemoryBehaviorImpl : public AAMemoryBehavior {
   5881   AAMemoryBehaviorImpl(const IRPosition &IRP, Attributor &A)
   5882       : AAMemoryBehavior(IRP, A) {}
   5883 
   5884   /// See AbstractAttribute::initialize(...).
   5885   void initialize(Attributor &A) override {
   5886     intersectAssumedBits(BEST_STATE);
   5887     getKnownStateFromValue(getIRPosition(), getState());
   5888     AAMemoryBehavior::initialize(A);
   5889   }
   5890 
   5891   /// Return the memory behavior information encoded in the IR for \p IRP.
   5892   static void getKnownStateFromValue(const IRPosition &IRP,
   5893                                      BitIntegerState &State,
   5894                                      bool IgnoreSubsumingPositions = false) {
   5895     SmallVector<Attribute, 2> Attrs;
   5896     IRP.getAttrs(AttrKinds, Attrs, IgnoreSubsumingPositions);
   5897     for (const Attribute &Attr : Attrs) {
   5898       switch (Attr.getKindAsEnum()) {
   5899       case Attribute::ReadNone:
   5900         State.addKnownBits(NO_ACCESSES);
   5901         break;
   5902       case Attribute::ReadOnly:
   5903         State.addKnownBits(NO_WRITES);
   5904         break;
   5905       case Attribute::WriteOnly:
   5906         State.addKnownBits(NO_READS);
   5907         break;
   5908       default:
   5909         llvm_unreachable("Unexpected attribute!");
   5910       }
   5911     }
   5912 
   5913     if (auto *I = dyn_cast<Instruction>(&IRP.getAnchorValue())) {
   5914       if (!I->mayReadFromMemory())
   5915         State.addKnownBits(NO_READS);
   5916       if (!I->mayWriteToMemory())
   5917         State.addKnownBits(NO_WRITES);
   5918     }
   5919   }
   5920 
   5921   /// See AbstractAttribute::getDeducedAttributes(...).
   5922   void getDeducedAttributes(LLVMContext &Ctx,
   5923                             SmallVectorImpl<Attribute> &Attrs) const override {
   5924     assert(Attrs.size() == 0);
   5925     if (isAssumedReadNone())
   5926       Attrs.push_back(Attribute::get(Ctx, Attribute::ReadNone));
   5927     else if (isAssumedReadOnly())
   5928       Attrs.push_back(Attribute::get(Ctx, Attribute::ReadOnly));
   5929     else if (isAssumedWriteOnly())
   5930       Attrs.push_back(Attribute::get(Ctx, Attribute::WriteOnly));
   5931     assert(Attrs.size() <= 1);
   5932   }
   5933 
   5934   /// See AbstractAttribute::manifest(...).
   5935   ChangeStatus manifest(Attributor &A) override {
   5936     if (hasAttr(Attribute::ReadNone, /* IgnoreSubsumingPositions */ true))
   5937       return ChangeStatus::UNCHANGED;
   5938 
   5939     const IRPosition &IRP = getIRPosition();
   5940 
   5941     // Check if we would improve the existing attributes first.
   5942     SmallVector<Attribute, 4> DeducedAttrs;
   5943     getDeducedAttributes(IRP.getAnchorValue().getContext(), DeducedAttrs);
   5944     if (llvm::all_of(DeducedAttrs, [&](const Attribute &Attr) {
   5945           return IRP.hasAttr(Attr.getKindAsEnum(),
   5946                              /* IgnoreSubsumingPositions */ true);
   5947         }))
   5948       return ChangeStatus::UNCHANGED;
   5949 
   5950     // Clear existing attributes.
   5951     IRP.removeAttrs(AttrKinds);
   5952 
   5953     // Use the generic manifest method.
   5954     return IRAttribute::manifest(A);
   5955   }
   5956 
   5957   /// See AbstractState::getAsStr().
   5958   const std::string getAsStr() const override {
   5959     if (isAssumedReadNone())
   5960       return "readnone";
   5961     if (isAssumedReadOnly())
   5962       return "readonly";
   5963     if (isAssumedWriteOnly())
   5964       return "writeonly";
   5965     return "may-read/write";
   5966   }
   5967 
   5968   /// The set of IR attributes AAMemoryBehavior deals with.
   5969   static const Attribute::AttrKind AttrKinds[3];
   5970 };
   5971 
   5972 const Attribute::AttrKind AAMemoryBehaviorImpl::AttrKinds[] = {
   5973     Attribute::ReadNone, Attribute::ReadOnly, Attribute::WriteOnly};
   5974 
   5975 /// Memory behavior attribute for a floating value.
   5976 struct AAMemoryBehaviorFloating : AAMemoryBehaviorImpl {
   5977   AAMemoryBehaviorFloating(const IRPosition &IRP, Attributor &A)
   5978       : AAMemoryBehaviorImpl(IRP, A) {}
   5979 
   5980   /// See AbstractAttribute::initialize(...).
   5981   void initialize(Attributor &A) override {
   5982     AAMemoryBehaviorImpl::initialize(A);
   5983     addUsesOf(A, getAssociatedValue());
   5984   }
   5985 
   5986   /// See AbstractAttribute::updateImpl(...).
   5987   ChangeStatus updateImpl(Attributor &A) override;
   5988 
   5989   /// See AbstractAttribute::trackStatistics()
   5990   void trackStatistics() const override {
   5991     if (isAssumedReadNone())
   5992       STATS_DECLTRACK_FLOATING_ATTR(readnone)
   5993     else if (isAssumedReadOnly())
   5994       STATS_DECLTRACK_FLOATING_ATTR(readonly)
   5995     else if (isAssumedWriteOnly())
   5996       STATS_DECLTRACK_FLOATING_ATTR(writeonly)
   5997   }
   5998 
   5999 private:
   6000   /// Return true if users of \p UserI might access the underlying
   6001   /// variable/location described by \p U and should therefore be analyzed.
   6002   bool followUsersOfUseIn(Attributor &A, const Use *U,
   6003                           const Instruction *UserI);
   6004 
   6005   /// Update the state according to the effect of use \p U in \p UserI.
   6006   void analyzeUseIn(Attributor &A, const Use *U, const Instruction *UserI);
   6007 
   6008 protected:
   6009   /// Add the uses of \p V to the `Uses` set we look at during the update step.
   6010   void addUsesOf(Attributor &A, const Value &V);
   6011 
   6012   /// Container for (transitive) uses of the associated argument.
   6013   SmallVector<const Use *, 8> Uses;
   6014 
   6015   /// Set to remember the uses we already traversed.
   6016   SmallPtrSet<const Use *, 8> Visited;
   6017 };
   6018 
   6019 /// Memory behavior attribute for function argument.
   6020 struct AAMemoryBehaviorArgument : AAMemoryBehaviorFloating {
   6021   AAMemoryBehaviorArgument(const IRPosition &IRP, Attributor &A)
   6022       : AAMemoryBehaviorFloating(IRP, A) {}
   6023 
   6024   /// See AbstractAttribute::initialize(...).
   6025   void initialize(Attributor &A) override {
   6026     intersectAssumedBits(BEST_STATE);
   6027     const IRPosition &IRP = getIRPosition();
   6028     // TODO: Make IgnoreSubsumingPositions a property of an IRAttribute so we
   6029     // can query it when we use has/getAttr. That would allow us to reuse the
   6030     // initialize of the base class here.
   6031     bool HasByVal =
   6032         IRP.hasAttr({Attribute::ByVal}, /* IgnoreSubsumingPositions */ true);
   6033     getKnownStateFromValue(IRP, getState(),
   6034                            /* IgnoreSubsumingPositions */ HasByVal);
   6035 
   6036     // Initialize the use vector with all direct uses of the associated value.
   6037     Argument *Arg = getAssociatedArgument();
   6038     if (!Arg || !A.isFunctionIPOAmendable(*(Arg->getParent()))) {
   6039       indicatePessimisticFixpoint();
   6040     } else {
   6041       addUsesOf(A, *Arg);
   6042     }
   6043   }
   6044 
   6045   ChangeStatus manifest(Attributor &A) override {
   6046     // TODO: Pointer arguments are not supported on vectors of pointers yet.
   6047     if (!getAssociatedValue().getType()->isPointerTy())
   6048       return ChangeStatus::UNCHANGED;
   6049 
   6050     // TODO: From readattrs.ll: "inalloca parameters are always
   6051     //                           considered written"
   6052     if (hasAttr({Attribute::InAlloca, Attribute::Preallocated})) {
   6053       removeKnownBits(NO_WRITES);
   6054       removeAssumedBits(NO_WRITES);
   6055     }
   6056     return AAMemoryBehaviorFloating::manifest(A);
   6057   }
   6058 
   6059   /// See AbstractAttribute::trackStatistics()
   6060   void trackStatistics() const override {
   6061     if (isAssumedReadNone())
   6062       STATS_DECLTRACK_ARG_ATTR(readnone)
   6063     else if (isAssumedReadOnly())
   6064       STATS_DECLTRACK_ARG_ATTR(readonly)
   6065     else if (isAssumedWriteOnly())
   6066       STATS_DECLTRACK_ARG_ATTR(writeonly)
   6067   }
   6068 };
   6069 
   6070 struct AAMemoryBehaviorCallSiteArgument final : AAMemoryBehaviorArgument {
   6071   AAMemoryBehaviorCallSiteArgument(const IRPosition &IRP, Attributor &A)
   6072       : AAMemoryBehaviorArgument(IRP, A) {}
   6073 
   6074   /// See AbstractAttribute::initialize(...).
   6075   void initialize(Attributor &A) override {
   6076     // If we don't have an associated attribute this is either a variadic call
   6077     // or an indirect call, either way, nothing to do here.
   6078     Argument *Arg = getAssociatedArgument();
   6079     if (!Arg) {
   6080       indicatePessimisticFixpoint();
   6081       return;
   6082     }
   6083     if (Arg->hasByValAttr()) {
   6084       addKnownBits(NO_WRITES);
   6085       removeKnownBits(NO_READS);
   6086       removeAssumedBits(NO_READS);
   6087     }
   6088     AAMemoryBehaviorArgument::initialize(A);
   6089     if (getAssociatedFunction()->isDeclaration())
   6090       indicatePessimisticFixpoint();
   6091   }
   6092 
   6093   /// See AbstractAttribute::updateImpl(...).
   6094   ChangeStatus updateImpl(Attributor &A) override {
   6095     // TODO: Once we have call site specific value information we can provide
   6096     //       call site specific liveness liveness information and then it makes
   6097     //       sense to specialize attributes for call sites arguments instead of
   6098     //       redirecting requests to the callee argument.
   6099     Argument *Arg = getAssociatedArgument();
   6100     const IRPosition &ArgPos = IRPosition::argument(*Arg);
   6101     auto &ArgAA =
   6102         A.getAAFor<AAMemoryBehavior>(*this, ArgPos, DepClassTy::REQUIRED);
   6103     return clampStateAndIndicateChange(getState(), ArgAA.getState());
   6104   }
   6105 
   6106   /// See AbstractAttribute::trackStatistics()
   6107   void trackStatistics() const override {
   6108     if (isAssumedReadNone())
   6109       STATS_DECLTRACK_CSARG_ATTR(readnone)
   6110     else if (isAssumedReadOnly())
   6111       STATS_DECLTRACK_CSARG_ATTR(readonly)
   6112     else if (isAssumedWriteOnly())
   6113       STATS_DECLTRACK_CSARG_ATTR(writeonly)
   6114   }
   6115 };
   6116 
   6117 /// Memory behavior attribute for a call site return position.
   6118 struct AAMemoryBehaviorCallSiteReturned final : AAMemoryBehaviorFloating {
   6119   AAMemoryBehaviorCallSiteReturned(const IRPosition &IRP, Attributor &A)
   6120       : AAMemoryBehaviorFloating(IRP, A) {}
   6121 
   6122   /// See AbstractAttribute::initialize(...).
   6123   void initialize(Attributor &A) override {
   6124     AAMemoryBehaviorImpl::initialize(A);
   6125     Function *F = getAssociatedFunction();
   6126     if (!F || F->isDeclaration())
   6127       indicatePessimisticFixpoint();
   6128   }
   6129 
   6130   /// See AbstractAttribute::manifest(...).
   6131   ChangeStatus manifest(Attributor &A) override {
   6132     // We do not annotate returned values.
   6133     return ChangeStatus::UNCHANGED;
   6134   }
   6135 
   6136   /// See AbstractAttribute::trackStatistics()
   6137   void trackStatistics() const override {}
   6138 };
   6139 
   6140 /// An AA to represent the memory behavior function attributes.
   6141 struct AAMemoryBehaviorFunction final : public AAMemoryBehaviorImpl {
   6142   AAMemoryBehaviorFunction(const IRPosition &IRP, Attributor &A)
   6143       : AAMemoryBehaviorImpl(IRP, A) {}
   6144 
   6145   /// See AbstractAttribute::updateImpl(Attributor &A).
   6146   virtual ChangeStatus updateImpl(Attributor &A) override;
   6147 
   6148   /// See AbstractAttribute::manifest(...).
   6149   ChangeStatus manifest(Attributor &A) override {
   6150     Function &F = cast<Function>(getAnchorValue());
   6151     if (isAssumedReadNone()) {
   6152       F.removeFnAttr(Attribute::ArgMemOnly);
   6153       F.removeFnAttr(Attribute::InaccessibleMemOnly);
   6154       F.removeFnAttr(Attribute::InaccessibleMemOrArgMemOnly);
   6155     }
   6156     return AAMemoryBehaviorImpl::manifest(A);
   6157   }
   6158 
   6159   /// See AbstractAttribute::trackStatistics()
   6160   void trackStatistics() const override {
   6161     if (isAssumedReadNone())
   6162       STATS_DECLTRACK_FN_ATTR(readnone)
   6163     else if (isAssumedReadOnly())
   6164       STATS_DECLTRACK_FN_ATTR(readonly)
   6165     else if (isAssumedWriteOnly())
   6166       STATS_DECLTRACK_FN_ATTR(writeonly)
   6167   }
   6168 };
   6169 
   6170 /// AAMemoryBehavior attribute for call sites.
   6171 struct AAMemoryBehaviorCallSite final : AAMemoryBehaviorImpl {
   6172   AAMemoryBehaviorCallSite(const IRPosition &IRP, Attributor &A)
   6173       : AAMemoryBehaviorImpl(IRP, A) {}
   6174 
   6175   /// See AbstractAttribute::initialize(...).
   6176   void initialize(Attributor &A) override {
   6177     AAMemoryBehaviorImpl::initialize(A);
   6178     Function *F = getAssociatedFunction();
   6179     if (!F || F->isDeclaration())
   6180       indicatePessimisticFixpoint();
   6181   }
   6182 
   6183   /// See AbstractAttribute::updateImpl(...).
   6184   ChangeStatus updateImpl(Attributor &A) override {
   6185     // TODO: Once we have call site specific value information we can provide
   6186     //       call site specific liveness liveness information and then it makes
   6187     //       sense to specialize attributes for call sites arguments instead of
   6188     //       redirecting requests to the callee argument.
   6189     Function *F = getAssociatedFunction();
   6190     const IRPosition &FnPos = IRPosition::function(*F);
   6191     auto &FnAA =
   6192         A.getAAFor<AAMemoryBehavior>(*this, FnPos, DepClassTy::REQUIRED);
   6193     return clampStateAndIndicateChange(getState(), FnAA.getState());
   6194   }
   6195 
   6196   /// See AbstractAttribute::trackStatistics()
   6197   void trackStatistics() const override {
   6198     if (isAssumedReadNone())
   6199       STATS_DECLTRACK_CS_ATTR(readnone)
   6200     else if (isAssumedReadOnly())
   6201       STATS_DECLTRACK_CS_ATTR(readonly)
   6202     else if (isAssumedWriteOnly())
   6203       STATS_DECLTRACK_CS_ATTR(writeonly)
   6204   }
   6205 };
   6206 
   6207 ChangeStatus AAMemoryBehaviorFunction::updateImpl(Attributor &A) {
   6208 
   6209   // The current assumed state used to determine a change.
   6210   auto AssumedState = getAssumed();
   6211 
   6212   auto CheckRWInst = [&](Instruction &I) {
   6213     // If the instruction has an own memory behavior state, use it to restrict
   6214     // the local state. No further analysis is required as the other memory
   6215     // state is as optimistic as it gets.
   6216     if (const auto *CB = dyn_cast<CallBase>(&I)) {
   6217       const auto &MemBehaviorAA = A.getAAFor<AAMemoryBehavior>(
   6218           *this, IRPosition::callsite_function(*CB), DepClassTy::REQUIRED);
   6219       intersectAssumedBits(MemBehaviorAA.getAssumed());
   6220       return !isAtFixpoint();
   6221     }
   6222 
   6223     // Remove access kind modifiers if necessary.
   6224     if (I.mayReadFromMemory())
   6225       removeAssumedBits(NO_READS);
   6226     if (I.mayWriteToMemory())
   6227       removeAssumedBits(NO_WRITES);
   6228     return !isAtFixpoint();
   6229   };
   6230 
   6231   if (!A.checkForAllReadWriteInstructions(CheckRWInst, *this))
   6232     return indicatePessimisticFixpoint();
   6233 
   6234   return (AssumedState != getAssumed()) ? ChangeStatus::CHANGED
   6235                                         : ChangeStatus::UNCHANGED;
   6236 }
   6237 
   6238 ChangeStatus AAMemoryBehaviorFloating::updateImpl(Attributor &A) {
   6239 
   6240   const IRPosition &IRP = getIRPosition();
   6241   const IRPosition &FnPos = IRPosition::function_scope(IRP);
   6242   AAMemoryBehavior::StateType &S = getState();
   6243 
   6244   // First, check the function scope. We take the known information and we avoid
   6245   // work if the assumed information implies the current assumed information for
   6246   // this attribute. This is a valid for all but byval arguments.
   6247   Argument *Arg = IRP.getAssociatedArgument();
   6248   AAMemoryBehavior::base_t FnMemAssumedState =
   6249       AAMemoryBehavior::StateType::getWorstState();
   6250   if (!Arg || !Arg->hasByValAttr()) {
   6251     const auto &FnMemAA =
   6252         A.getAAFor<AAMemoryBehavior>(*this, FnPos, DepClassTy::OPTIONAL);
   6253     FnMemAssumedState = FnMemAA.getAssumed();
   6254     S.addKnownBits(FnMemAA.getKnown());
   6255     if ((S.getAssumed() & FnMemAA.getAssumed()) == S.getAssumed())
   6256       return ChangeStatus::UNCHANGED;
   6257   }
   6258 
   6259   // Make sure the value is not captured (except through "return"), if
   6260   // it is, any information derived would be irrelevant anyway as we cannot
   6261   // check the potential aliases introduced by the capture. However, no need
   6262   // to fall back to anythign less optimistic than the function state.
   6263   const auto &ArgNoCaptureAA =
   6264       A.getAAFor<AANoCapture>(*this, IRP, DepClassTy::OPTIONAL);
   6265   if (!ArgNoCaptureAA.isAssumedNoCaptureMaybeReturned()) {
   6266     S.intersectAssumedBits(FnMemAssumedState);
   6267     return ChangeStatus::CHANGED;
   6268   }
   6269 
   6270   // The current assumed state used to determine a change.
   6271   auto AssumedState = S.getAssumed();
   6272 
   6273   // Liveness information to exclude dead users.
   6274   // TODO: Take the FnPos once we have call site specific liveness information.
   6275   const auto &LivenessAA = A.getAAFor<AAIsDead>(
   6276       *this, IRPosition::function(*IRP.getAssociatedFunction()),
   6277       DepClassTy::NONE);
   6278 
   6279   // Visit and expand uses until all are analyzed or a fixpoint is reached.
   6280   for (unsigned i = 0; i < Uses.size() && !isAtFixpoint(); i++) {
   6281     const Use *U = Uses[i];
   6282     Instruction *UserI = cast<Instruction>(U->getUser());
   6283     LLVM_DEBUG(dbgs() << "[AAMemoryBehavior] Use: " << **U << " in " << *UserI
   6284                       << " [Dead: " << (A.isAssumedDead(*U, this, &LivenessAA))
   6285                       << "]\n");
   6286     if (A.isAssumedDead(*U, this, &LivenessAA))
   6287       continue;
   6288 
   6289     // Droppable users, e.g., llvm::assume does not actually perform any action.
   6290     if (UserI->isDroppable())
   6291       continue;
   6292 
   6293     // Check if the users of UserI should also be visited.
   6294     if (followUsersOfUseIn(A, U, UserI))
   6295       addUsesOf(A, *UserI);
   6296 
   6297     // If UserI might touch memory we analyze the use in detail.
   6298     if (UserI->mayReadOrWriteMemory())
   6299       analyzeUseIn(A, U, UserI);
   6300   }
   6301 
   6302   return (AssumedState != getAssumed()) ? ChangeStatus::CHANGED
   6303                                         : ChangeStatus::UNCHANGED;
   6304 }
   6305 
   6306 void AAMemoryBehaviorFloating::addUsesOf(Attributor &A, const Value &V) {
   6307   SmallVector<const Use *, 8> WL;
   6308   for (const Use &U : V.uses())
   6309     WL.push_back(&U);
   6310 
   6311   while (!WL.empty()) {
   6312     const Use *U = WL.pop_back_val();
   6313     if (!Visited.insert(U).second)
   6314       continue;
   6315 
   6316     const Instruction *UserI = cast<Instruction>(U->getUser());
   6317     if (UserI->mayReadOrWriteMemory()) {
   6318       Uses.push_back(U);
   6319       continue;
   6320     }
   6321     if (!followUsersOfUseIn(A, U, UserI))
   6322       continue;
   6323     for (const Use &UU : UserI->uses())
   6324       WL.push_back(&UU);
   6325   }
   6326 }
   6327 
   6328 bool AAMemoryBehaviorFloating::followUsersOfUseIn(Attributor &A, const Use *U,
   6329                                                   const Instruction *UserI) {
   6330   // The loaded value is unrelated to the pointer argument, no need to
   6331   // follow the users of the load.
   6332   if (isa<LoadInst>(UserI))
   6333     return false;
   6334 
   6335   // By default we follow all uses assuming UserI might leak information on U,
   6336   // we have special handling for call sites operands though.
   6337   const auto *CB = dyn_cast<CallBase>(UserI);
   6338   if (!CB || !CB->isArgOperand(U))
   6339     return true;
   6340 
   6341   // If the use is a call argument known not to be captured, the users of
   6342   // the call do not need to be visited because they have to be unrelated to
   6343   // the input. Note that this check is not trivial even though we disallow
   6344   // general capturing of the underlying argument. The reason is that the
   6345   // call might the argument "through return", which we allow and for which we
   6346   // need to check call users.
   6347   if (U->get()->getType()->isPointerTy()) {
   6348     unsigned ArgNo = CB->getArgOperandNo(U);
   6349     const auto &ArgNoCaptureAA = A.getAAFor<AANoCapture>(
   6350         *this, IRPosition::callsite_argument(*CB, ArgNo), DepClassTy::OPTIONAL);
   6351     return !ArgNoCaptureAA.isAssumedNoCapture();
   6352   }
   6353 
   6354   return true;
   6355 }
   6356 
   6357 void AAMemoryBehaviorFloating::analyzeUseIn(Attributor &A, const Use *U,
   6358                                             const Instruction *UserI) {
   6359   assert(UserI->mayReadOrWriteMemory());
   6360 
   6361   switch (UserI->getOpcode()) {
   6362   default:
   6363     // TODO: Handle all atomics and other side-effect operations we know of.
   6364     break;
   6365   case Instruction::Load:
   6366     // Loads cause the NO_READS property to disappear.
   6367     removeAssumedBits(NO_READS);
   6368     return;
   6369 
   6370   case Instruction::Store:
   6371     // Stores cause the NO_WRITES property to disappear if the use is the
   6372     // pointer operand. Note that we do assume that capturing was taken care of
   6373     // somewhere else.
   6374     if (cast<StoreInst>(UserI)->getPointerOperand() == U->get())
   6375       removeAssumedBits(NO_WRITES);
   6376     return;
   6377 
   6378   case Instruction::Call:
   6379   case Instruction::CallBr:
   6380   case Instruction::Invoke: {
   6381     // For call sites we look at the argument memory behavior attribute (this
   6382     // could be recursive!) in order to restrict our own state.
   6383     const auto *CB = cast<CallBase>(UserI);
   6384 
   6385     // Give up on operand bundles.
   6386     if (CB->isBundleOperand(U)) {
   6387       indicatePessimisticFixpoint();
   6388       return;
   6389     }
   6390 
   6391     // Calling a function does read the function pointer, maybe write it if the
   6392     // function is self-modifying.
   6393     if (CB->isCallee(U)) {
   6394       removeAssumedBits(NO_READS);
   6395       break;
   6396     }
   6397 
   6398     // Adjust the possible access behavior based on the information on the
   6399     // argument.
   6400     IRPosition Pos;
   6401     if (U->get()->getType()->isPointerTy())
   6402       Pos = IRPosition::callsite_argument(*CB, CB->getArgOperandNo(U));
   6403     else
   6404       Pos = IRPosition::callsite_function(*CB);
   6405     const auto &MemBehaviorAA =
   6406         A.getAAFor<AAMemoryBehavior>(*this, Pos, DepClassTy::OPTIONAL);
   6407     // "assumed" has at most the same bits as the MemBehaviorAA assumed
   6408     // and at least "known".
   6409     intersectAssumedBits(MemBehaviorAA.getAssumed());
   6410     return;
   6411   }
   6412   };
   6413 
   6414   // Generally, look at the "may-properties" and adjust the assumed state if we
   6415   // did not trigger special handling before.
   6416   if (UserI->mayReadFromMemory())
   6417     removeAssumedBits(NO_READS);
   6418   if (UserI->mayWriteToMemory())
   6419     removeAssumedBits(NO_WRITES);
   6420 }
   6421 
   6422 } // namespace
   6423 
   6424 /// -------------------- Memory Locations Attributes ---------------------------
   6425 /// Includes read-none, argmemonly, inaccessiblememonly,
   6426 /// inaccessiblememorargmemonly
   6427 /// ----------------------------------------------------------------------------
   6428 
   6429 std::string AAMemoryLocation::getMemoryLocationsAsStr(
   6430     AAMemoryLocation::MemoryLocationsKind MLK) {
   6431   if (0 == (MLK & AAMemoryLocation::NO_LOCATIONS))
   6432     return "all memory";
   6433   if (MLK == AAMemoryLocation::NO_LOCATIONS)
   6434     return "no memory";
   6435   std::string S = "memory:";
   6436   if (0 == (MLK & AAMemoryLocation::NO_LOCAL_MEM))
   6437     S += "stack,";
   6438   if (0 == (MLK & AAMemoryLocation::NO_CONST_MEM))
   6439     S += "constant,";
   6440   if (0 == (MLK & AAMemoryLocation::NO_GLOBAL_INTERNAL_MEM))
   6441     S += "internal global,";
   6442   if (0 == (MLK & AAMemoryLocation::NO_GLOBAL_EXTERNAL_MEM))
   6443     S += "external global,";
   6444   if (0 == (MLK & AAMemoryLocation::NO_ARGUMENT_MEM))
   6445     S += "argument,";
   6446   if (0 == (MLK & AAMemoryLocation::NO_INACCESSIBLE_MEM))
   6447     S += "inaccessible,";
   6448   if (0 == (MLK & AAMemoryLocation::NO_MALLOCED_MEM))
   6449     S += "malloced,";
   6450   if (0 == (MLK & AAMemoryLocation::NO_UNKOWN_MEM))
   6451     S += "unknown,";
   6452   S.pop_back();
   6453   return S;
   6454 }
   6455 
   6456 namespace {
   6457 struct AAMemoryLocationImpl : public AAMemoryLocation {
   6458 
   6459   AAMemoryLocationImpl(const IRPosition &IRP, Attributor &A)
   6460       : AAMemoryLocation(IRP, A), Allocator(A.Allocator) {
   6461     for (unsigned u = 0; u < llvm::CTLog2<VALID_STATE>(); ++u)
   6462       AccessKind2Accesses[u] = nullptr;
   6463   }
   6464 
   6465   ~AAMemoryLocationImpl() {
   6466     // The AccessSets are allocated via a BumpPtrAllocator, we call
   6467     // the destructor manually.
   6468     for (unsigned u = 0; u < llvm::CTLog2<VALID_STATE>(); ++u)
   6469       if (AccessKind2Accesses[u])
   6470         AccessKind2Accesses[u]->~AccessSet();
   6471   }
   6472 
   6473   /// See AbstractAttribute::initialize(...).
   6474   void initialize(Attributor &A) override {
   6475     intersectAssumedBits(BEST_STATE);
   6476     getKnownStateFromValue(A, getIRPosition(), getState());
   6477     AAMemoryLocation::initialize(A);
   6478   }
   6479 
   6480   /// Return the memory behavior information encoded in the IR for \p IRP.
   6481   static void getKnownStateFromValue(Attributor &A, const IRPosition &IRP,
   6482                                      BitIntegerState &State,
   6483                                      bool IgnoreSubsumingPositions = false) {
   6484     // For internal functions we ignore `argmemonly` and
   6485     // `inaccessiblememorargmemonly` as we might break it via interprocedural
   6486     // constant propagation. It is unclear if this is the best way but it is
   6487     // unlikely this will cause real performance problems. If we are deriving
   6488     // attributes for the anchor function we even remove the attribute in
   6489     // addition to ignoring it.
   6490     bool UseArgMemOnly = true;
   6491     Function *AnchorFn = IRP.getAnchorScope();
   6492     if (AnchorFn && A.isRunOn(*AnchorFn))
   6493       UseArgMemOnly = !AnchorFn->hasLocalLinkage();
   6494 
   6495     SmallVector<Attribute, 2> Attrs;
   6496     IRP.getAttrs(AttrKinds, Attrs, IgnoreSubsumingPositions);
   6497     for (const Attribute &Attr : Attrs) {
   6498       switch (Attr.getKindAsEnum()) {
   6499       case Attribute::ReadNone:
   6500         State.addKnownBits(NO_LOCAL_MEM | NO_CONST_MEM);
   6501         break;
   6502       case Attribute::InaccessibleMemOnly:
   6503         State.addKnownBits(inverseLocation(NO_INACCESSIBLE_MEM, true, true));
   6504         break;
   6505       case Attribute::ArgMemOnly:
   6506         if (UseArgMemOnly)
   6507           State.addKnownBits(inverseLocation(NO_ARGUMENT_MEM, true, true));
   6508         else
   6509           IRP.removeAttrs({Attribute::ArgMemOnly});
   6510         break;
   6511       case Attribute::InaccessibleMemOrArgMemOnly:
   6512         if (UseArgMemOnly)
   6513           State.addKnownBits(inverseLocation(
   6514               NO_INACCESSIBLE_MEM | NO_ARGUMENT_MEM, true, true));
   6515         else
   6516           IRP.removeAttrs({Attribute::InaccessibleMemOrArgMemOnly});
   6517         break;
   6518       default:
   6519         llvm_unreachable("Unexpected attribute!");
   6520       }
   6521     }
   6522   }
   6523 
   6524   /// See AbstractAttribute::getDeducedAttributes(...).
   6525   void getDeducedAttributes(LLVMContext &Ctx,
   6526                             SmallVectorImpl<Attribute> &Attrs) const override {
   6527     assert(Attrs.size() == 0);
   6528     if (isAssumedReadNone()) {
   6529       Attrs.push_back(Attribute::get(Ctx, Attribute::ReadNone));
   6530     } else if (getIRPosition().getPositionKind() == IRPosition::IRP_FUNCTION) {
   6531       if (isAssumedInaccessibleMemOnly())
   6532         Attrs.push_back(Attribute::get(Ctx, Attribute::InaccessibleMemOnly));
   6533       else if (isAssumedArgMemOnly())
   6534         Attrs.push_back(Attribute::get(Ctx, Attribute::ArgMemOnly));
   6535       else if (isAssumedInaccessibleOrArgMemOnly())
   6536         Attrs.push_back(
   6537             Attribute::get(Ctx, Attribute::InaccessibleMemOrArgMemOnly));
   6538     }
   6539     assert(Attrs.size() <= 1);
   6540   }
   6541 
   6542   /// See AbstractAttribute::manifest(...).
   6543   ChangeStatus manifest(Attributor &A) override {
   6544     const IRPosition &IRP = getIRPosition();
   6545 
   6546     // Check if we would improve the existing attributes first.
   6547     SmallVector<Attribute, 4> DeducedAttrs;
   6548     getDeducedAttributes(IRP.getAnchorValue().getContext(), DeducedAttrs);
   6549     if (llvm::all_of(DeducedAttrs, [&](const Attribute &Attr) {
   6550           return IRP.hasAttr(Attr.getKindAsEnum(),
   6551                              /* IgnoreSubsumingPositions */ true);
   6552         }))
   6553       return ChangeStatus::UNCHANGED;
   6554 
   6555     // Clear existing attributes.
   6556     IRP.removeAttrs(AttrKinds);
   6557     if (isAssumedReadNone())
   6558       IRP.removeAttrs(AAMemoryBehaviorImpl::AttrKinds);
   6559 
   6560     // Use the generic manifest method.
   6561     return IRAttribute::manifest(A);
   6562   }
   6563 
   6564   /// See AAMemoryLocation::checkForAllAccessesToMemoryKind(...).
   6565   bool checkForAllAccessesToMemoryKind(
   6566       function_ref<bool(const Instruction *, const Value *, AccessKind,
   6567                         MemoryLocationsKind)>
   6568           Pred,
   6569       MemoryLocationsKind RequestedMLK) const override {
   6570     if (!isValidState())
   6571       return false;
   6572 
   6573     MemoryLocationsKind AssumedMLK = getAssumedNotAccessedLocation();
   6574     if (AssumedMLK == NO_LOCATIONS)
   6575       return true;
   6576 
   6577     unsigned Idx = 0;
   6578     for (MemoryLocationsKind CurMLK = 1; CurMLK < NO_LOCATIONS;
   6579          CurMLK *= 2, ++Idx) {
   6580       if (CurMLK & RequestedMLK)
   6581         continue;
   6582 
   6583       if (const AccessSet *Accesses = AccessKind2Accesses[Idx])
   6584         for (const AccessInfo &AI : *Accesses)
   6585           if (!Pred(AI.I, AI.Ptr, AI.Kind, CurMLK))
   6586             return false;
   6587     }
   6588 
   6589     return true;
   6590   }
   6591 
   6592   ChangeStatus indicatePessimisticFixpoint() override {
   6593     // If we give up and indicate a pessimistic fixpoint this instruction will
   6594     // become an access for all potential access kinds:
   6595     // TODO: Add pointers for argmemonly and globals to improve the results of
   6596     //       checkForAllAccessesToMemoryKind.
   6597     bool Changed = false;
   6598     MemoryLocationsKind KnownMLK = getKnown();
   6599     Instruction *I = dyn_cast<Instruction>(&getAssociatedValue());
   6600     for (MemoryLocationsKind CurMLK = 1; CurMLK < NO_LOCATIONS; CurMLK *= 2)
   6601       if (!(CurMLK & KnownMLK))
   6602         updateStateAndAccessesMap(getState(), CurMLK, I, nullptr, Changed,
   6603                                   getAccessKindFromInst(I));
   6604     return AAMemoryLocation::indicatePessimisticFixpoint();
   6605   }
   6606 
   6607 protected:
   6608   /// Helper struct to tie together an instruction that has a read or write
   6609   /// effect with the pointer it accesses (if any).
   6610   struct AccessInfo {
   6611 
   6612     /// The instruction that caused the access.
   6613     const Instruction *I;
   6614 
   6615     /// The base pointer that is accessed, or null if unknown.
   6616     const Value *Ptr;
   6617 
   6618     /// The kind of access (read/write/read+write).
   6619     AccessKind Kind;
   6620 
   6621     bool operator==(const AccessInfo &RHS) const {
   6622       return I == RHS.I && Ptr == RHS.Ptr && Kind == RHS.Kind;
   6623     }
   6624     bool operator()(const AccessInfo &LHS, const AccessInfo &RHS) const {
   6625       if (LHS.I != RHS.I)
   6626         return LHS.I < RHS.I;
   6627       if (LHS.Ptr != RHS.Ptr)
   6628         return LHS.Ptr < RHS.Ptr;
   6629       if (LHS.Kind != RHS.Kind)
   6630         return LHS.Kind < RHS.Kind;
   6631       return false;
   6632     }
   6633   };
   6634 
   6635   /// Mapping from *single* memory location kinds, e.g., LOCAL_MEM with the
   6636   /// value of NO_LOCAL_MEM, to the accesses encountered for this memory kind.
   6637   using AccessSet = SmallSet<AccessInfo, 2, AccessInfo>;
   6638   AccessSet *AccessKind2Accesses[llvm::CTLog2<VALID_STATE>()];
   6639 
   6640   /// Categorize the pointer arguments of CB that might access memory in
   6641   /// AccessedLoc and update the state and access map accordingly.
   6642   void
   6643   categorizeArgumentPointerLocations(Attributor &A, CallBase &CB,
   6644                                      AAMemoryLocation::StateType &AccessedLocs,
   6645                                      bool &Changed);
   6646 
   6647   /// Return the kind(s) of location that may be accessed by \p V.
   6648   AAMemoryLocation::MemoryLocationsKind
   6649   categorizeAccessedLocations(Attributor &A, Instruction &I, bool &Changed);
   6650 
   6651   /// Return the access kind as determined by \p I.
   6652   AccessKind getAccessKindFromInst(const Instruction *I) {
   6653     AccessKind AK = READ_WRITE;
   6654     if (I) {
   6655       AK = I->mayReadFromMemory() ? READ : NONE;
   6656       AK = AccessKind(AK | (I->mayWriteToMemory() ? WRITE : NONE));
   6657     }
   6658     return AK;
   6659   }
   6660 
   6661   /// Update the state \p State and the AccessKind2Accesses given that \p I is
   6662   /// an access of kind \p AK to a \p MLK memory location with the access
   6663   /// pointer \p Ptr.
   6664   void updateStateAndAccessesMap(AAMemoryLocation::StateType &State,
   6665                                  MemoryLocationsKind MLK, const Instruction *I,
   6666                                  const Value *Ptr, bool &Changed,
   6667                                  AccessKind AK = READ_WRITE) {
   6668 
   6669     assert(isPowerOf2_32(MLK) && "Expected a single location set!");
   6670     auto *&Accesses = AccessKind2Accesses[llvm::Log2_32(MLK)];
   6671     if (!Accesses)
   6672       Accesses = new (Allocator) AccessSet();
   6673     Changed |= Accesses->insert(AccessInfo{I, Ptr, AK}).second;
   6674     State.removeAssumedBits(MLK);
   6675   }
   6676 
   6677   /// Determine the underlying locations kinds for \p Ptr, e.g., globals or
   6678   /// arguments, and update the state and access map accordingly.
   6679   void categorizePtrValue(Attributor &A, const Instruction &I, const Value &Ptr,
   6680                           AAMemoryLocation::StateType &State, bool &Changed);
   6681 
   6682   /// Used to allocate access sets.
   6683   BumpPtrAllocator &Allocator;
   6684 
   6685   /// The set of IR attributes AAMemoryLocation deals with.
   6686   static const Attribute::AttrKind AttrKinds[4];
   6687 };
   6688 
   6689 const Attribute::AttrKind AAMemoryLocationImpl::AttrKinds[] = {
   6690     Attribute::ReadNone, Attribute::InaccessibleMemOnly, Attribute::ArgMemOnly,
   6691     Attribute::InaccessibleMemOrArgMemOnly};
   6692 
   6693 void AAMemoryLocationImpl::categorizePtrValue(
   6694     Attributor &A, const Instruction &I, const Value &Ptr,
   6695     AAMemoryLocation::StateType &State, bool &Changed) {
   6696   LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Categorize pointer locations for "
   6697                     << Ptr << " ["
   6698                     << getMemoryLocationsAsStr(State.getAssumed()) << "]\n");
   6699 
   6700   auto StripGEPCB = [](Value *V) -> Value * {
   6701     auto *GEP = dyn_cast<GEPOperator>(V);
   6702     while (GEP) {
   6703       V = GEP->getPointerOperand();
   6704       GEP = dyn_cast<GEPOperator>(V);
   6705     }
   6706     return V;
   6707   };
   6708 
   6709   auto VisitValueCB = [&](Value &V, const Instruction *,
   6710                           AAMemoryLocation::StateType &T,
   6711                           bool Stripped) -> bool {
   6712     // TODO: recognize the TBAA used for constant accesses.
   6713     MemoryLocationsKind MLK = NO_LOCATIONS;
   6714     assert(!isa<GEPOperator>(V) && "GEPs should have been stripped.");
   6715     if (isa<UndefValue>(V))
   6716       return true;
   6717     if (auto *Arg = dyn_cast<Argument>(&V)) {
   6718       if (Arg->hasByValAttr())
   6719         MLK = NO_LOCAL_MEM;
   6720       else
   6721         MLK = NO_ARGUMENT_MEM;
   6722     } else if (auto *GV = dyn_cast<GlobalValue>(&V)) {
   6723       // Reading constant memory is not treated as a read "effect" by the
   6724       // function attr pass so we won't neither. Constants defined by TBAA are
   6725       // similar. (We know we do not write it because it is constant.)
   6726       if (auto *GVar = dyn_cast<GlobalVariable>(GV))
   6727         if (GVar->isConstant())
   6728           return true;
   6729 
   6730       if (GV->hasLocalLinkage())
   6731         MLK = NO_GLOBAL_INTERNAL_MEM;
   6732       else
   6733         MLK = NO_GLOBAL_EXTERNAL_MEM;
   6734     } else if (isa<ConstantPointerNull>(V) &&
   6735                !NullPointerIsDefined(getAssociatedFunction(),
   6736                                      V.getType()->getPointerAddressSpace())) {
   6737       return true;
   6738     } else if (isa<AllocaInst>(V)) {
   6739       MLK = NO_LOCAL_MEM;
   6740     } else if (const auto *CB = dyn_cast<CallBase>(&V)) {
   6741       const auto &NoAliasAA = A.getAAFor<AANoAlias>(
   6742           *this, IRPosition::callsite_returned(*CB), DepClassTy::OPTIONAL);
   6743       if (NoAliasAA.isAssumedNoAlias())
   6744         MLK = NO_MALLOCED_MEM;
   6745       else
   6746         MLK = NO_UNKOWN_MEM;
   6747     } else {
   6748       MLK = NO_UNKOWN_MEM;
   6749     }
   6750 
   6751     assert(MLK != NO_LOCATIONS && "No location specified!");
   6752     updateStateAndAccessesMap(T, MLK, &I, &V, Changed,
   6753                               getAccessKindFromInst(&I));
   6754     LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Ptr value cannot be categorized: "
   6755                       << V << " -> " << getMemoryLocationsAsStr(T.getAssumed())
   6756                       << "\n");
   6757     return true;
   6758   };
   6759 
   6760   if (!genericValueTraversal<AAMemoryLocation, AAMemoryLocation::StateType>(
   6761           A, IRPosition::value(Ptr), *this, State, VisitValueCB, getCtxI(),
   6762           /* UseValueSimplify */ true,
   6763           /* MaxValues */ 32, StripGEPCB)) {
   6764     LLVM_DEBUG(
   6765         dbgs() << "[AAMemoryLocation] Pointer locations not categorized\n");
   6766     updateStateAndAccessesMap(State, NO_UNKOWN_MEM, &I, nullptr, Changed,
   6767                               getAccessKindFromInst(&I));
   6768   } else {
   6769     LLVM_DEBUG(
   6770         dbgs()
   6771         << "[AAMemoryLocation] Accessed locations with pointer locations: "
   6772         << getMemoryLocationsAsStr(State.getAssumed()) << "\n");
   6773   }
   6774 }
   6775 
   6776 void AAMemoryLocationImpl::categorizeArgumentPointerLocations(
   6777     Attributor &A, CallBase &CB, AAMemoryLocation::StateType &AccessedLocs,
   6778     bool &Changed) {
   6779   for (unsigned ArgNo = 0, E = CB.getNumArgOperands(); ArgNo < E; ++ArgNo) {
   6780 
   6781     // Skip non-pointer arguments.
   6782     const Value *ArgOp = CB.getArgOperand(ArgNo);
   6783     if (!ArgOp->getType()->isPtrOrPtrVectorTy())
   6784       continue;
   6785 
   6786     // Skip readnone arguments.
   6787     const IRPosition &ArgOpIRP = IRPosition::callsite_argument(CB, ArgNo);
   6788     const auto &ArgOpMemLocationAA =
   6789         A.getAAFor<AAMemoryBehavior>(*this, ArgOpIRP, DepClassTy::OPTIONAL);
   6790 
   6791     if (ArgOpMemLocationAA.isAssumedReadNone())
   6792       continue;
   6793 
   6794     // Categorize potentially accessed pointer arguments as if there was an
   6795     // access instruction with them as pointer.
   6796     categorizePtrValue(A, CB, *ArgOp, AccessedLocs, Changed);
   6797   }
   6798 }
   6799 
   6800 AAMemoryLocation::MemoryLocationsKind
   6801 AAMemoryLocationImpl::categorizeAccessedLocations(Attributor &A, Instruction &I,
   6802                                                   bool &Changed) {
   6803   LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Categorize accessed locations for "
   6804                     << I << "\n");
   6805 
   6806   AAMemoryLocation::StateType AccessedLocs;
   6807   AccessedLocs.intersectAssumedBits(NO_LOCATIONS);
   6808 
   6809   if (auto *CB = dyn_cast<CallBase>(&I)) {
   6810 
   6811     // First check if we assume any memory is access is visible.
   6812     const auto &CBMemLocationAA = A.getAAFor<AAMemoryLocation>(
   6813         *this, IRPosition::callsite_function(*CB), DepClassTy::OPTIONAL);
   6814     LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Categorize call site: " << I
   6815                       << " [" << CBMemLocationAA << "]\n");
   6816 
   6817     if (CBMemLocationAA.isAssumedReadNone())
   6818       return NO_LOCATIONS;
   6819 
   6820     if (CBMemLocationAA.isAssumedInaccessibleMemOnly()) {
   6821       updateStateAndAccessesMap(AccessedLocs, NO_INACCESSIBLE_MEM, &I, nullptr,
   6822                                 Changed, getAccessKindFromInst(&I));
   6823       return AccessedLocs.getAssumed();
   6824     }
   6825 
   6826     uint32_t CBAssumedNotAccessedLocs =
   6827         CBMemLocationAA.getAssumedNotAccessedLocation();
   6828 
   6829     // Set the argmemonly and global bit as we handle them separately below.
   6830     uint32_t CBAssumedNotAccessedLocsNoArgMem =
   6831         CBAssumedNotAccessedLocs | NO_ARGUMENT_MEM | NO_GLOBAL_MEM;
   6832 
   6833     for (MemoryLocationsKind CurMLK = 1; CurMLK < NO_LOCATIONS; CurMLK *= 2) {
   6834       if (CBAssumedNotAccessedLocsNoArgMem & CurMLK)
   6835         continue;
   6836       updateStateAndAccessesMap(AccessedLocs, CurMLK, &I, nullptr, Changed,
   6837                                 getAccessKindFromInst(&I));
   6838     }
   6839 
   6840     // Now handle global memory if it might be accessed. This is slightly tricky
   6841     // as NO_GLOBAL_MEM has multiple bits set.
   6842     bool HasGlobalAccesses = ((~CBAssumedNotAccessedLocs) & NO_GLOBAL_MEM);
   6843     if (HasGlobalAccesses) {
   6844       auto AccessPred = [&](const Instruction *, const Value *Ptr,
   6845                             AccessKind Kind, MemoryLocationsKind MLK) {
   6846         updateStateAndAccessesMap(AccessedLocs, MLK, &I, Ptr, Changed,
   6847                                   getAccessKindFromInst(&I));
   6848         return true;
   6849       };
   6850       if (!CBMemLocationAA.checkForAllAccessesToMemoryKind(
   6851               AccessPred, inverseLocation(NO_GLOBAL_MEM, false, false)))
   6852         return AccessedLocs.getWorstState();
   6853     }
   6854 
   6855     LLVM_DEBUG(
   6856         dbgs() << "[AAMemoryLocation] Accessed state before argument handling: "
   6857                << getMemoryLocationsAsStr(AccessedLocs.getAssumed()) << "\n");
   6858 
   6859     // Now handle argument memory if it might be accessed.
   6860     bool HasArgAccesses = ((~CBAssumedNotAccessedLocs) & NO_ARGUMENT_MEM);
   6861     if (HasArgAccesses)
   6862       categorizeArgumentPointerLocations(A, *CB, AccessedLocs, Changed);
   6863 
   6864     LLVM_DEBUG(
   6865         dbgs() << "[AAMemoryLocation] Accessed state after argument handling: "
   6866                << getMemoryLocationsAsStr(AccessedLocs.getAssumed()) << "\n");
   6867 
   6868     return AccessedLocs.getAssumed();
   6869   }
   6870 
   6871   if (const Value *Ptr = getPointerOperand(&I, /* AllowVolatile */ true)) {
   6872     LLVM_DEBUG(
   6873         dbgs() << "[AAMemoryLocation] Categorize memory access with pointer: "
   6874                << I << " [" << *Ptr << "]\n");
   6875     categorizePtrValue(A, I, *Ptr, AccessedLocs, Changed);
   6876     return AccessedLocs.getAssumed();
   6877   }
   6878 
   6879   LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Failed to categorize instruction: "
   6880                     << I << "\n");
   6881   updateStateAndAccessesMap(AccessedLocs, NO_UNKOWN_MEM, &I, nullptr, Changed,
   6882                             getAccessKindFromInst(&I));
   6883   return AccessedLocs.getAssumed();
   6884 }
   6885 
   6886 /// An AA to represent the memory behavior function attributes.
   6887 struct AAMemoryLocationFunction final : public AAMemoryLocationImpl {
   6888   AAMemoryLocationFunction(const IRPosition &IRP, Attributor &A)
   6889       : AAMemoryLocationImpl(IRP, A) {}
   6890 
   6891   /// See AbstractAttribute::updateImpl(Attributor &A).
   6892   virtual ChangeStatus updateImpl(Attributor &A) override {
   6893 
   6894     const auto &MemBehaviorAA =
   6895         A.getAAFor<AAMemoryBehavior>(*this, getIRPosition(), DepClassTy::NONE);
   6896     if (MemBehaviorAA.isAssumedReadNone()) {
   6897       if (MemBehaviorAA.isKnownReadNone())
   6898         return indicateOptimisticFixpoint();
   6899       assert(isAssumedReadNone() &&
   6900              "AAMemoryLocation was not read-none but AAMemoryBehavior was!");
   6901       A.recordDependence(MemBehaviorAA, *this, DepClassTy::OPTIONAL);
   6902       return ChangeStatus::UNCHANGED;
   6903     }
   6904 
   6905     // The current assumed state used to determine a change.
   6906     auto AssumedState = getAssumed();
   6907     bool Changed = false;
   6908 
   6909     auto CheckRWInst = [&](Instruction &I) {
   6910       MemoryLocationsKind MLK = categorizeAccessedLocations(A, I, Changed);
   6911       LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Accessed locations for " << I
   6912                         << ": " << getMemoryLocationsAsStr(MLK) << "\n");
   6913       removeAssumedBits(inverseLocation(MLK, false, false));
   6914       // Stop once only the valid bit set in the *not assumed location*, thus
   6915       // once we don't actually exclude any memory locations in the state.
   6916       return getAssumedNotAccessedLocation() != VALID_STATE;
   6917     };
   6918 
   6919     if (!A.checkForAllReadWriteInstructions(CheckRWInst, *this))
   6920       return indicatePessimisticFixpoint();
   6921 
   6922     Changed |= AssumedState != getAssumed();
   6923     return Changed ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED;
   6924   }
   6925 
   6926   /// See AbstractAttribute::trackStatistics()
   6927   void trackStatistics() const override {
   6928     if (isAssumedReadNone())
   6929       STATS_DECLTRACK_FN_ATTR(readnone)
   6930     else if (isAssumedArgMemOnly())
   6931       STATS_DECLTRACK_FN_ATTR(argmemonly)
   6932     else if (isAssumedInaccessibleMemOnly())
   6933       STATS_DECLTRACK_FN_ATTR(inaccessiblememonly)
   6934     else if (isAssumedInaccessibleOrArgMemOnly())
   6935       STATS_DECLTRACK_FN_ATTR(inaccessiblememorargmemonly)
   6936   }
   6937 };
   6938 
   6939 /// AAMemoryLocation attribute for call sites.
   6940 struct AAMemoryLocationCallSite final : AAMemoryLocationImpl {
   6941   AAMemoryLocationCallSite(const IRPosition &IRP, Attributor &A)
   6942       : AAMemoryLocationImpl(IRP, A) {}
   6943 
   6944   /// See AbstractAttribute::initialize(...).
   6945   void initialize(Attributor &A) override {
   6946     AAMemoryLocationImpl::initialize(A);
   6947     Function *F = getAssociatedFunction();
   6948     if (!F || F->isDeclaration())
   6949       indicatePessimisticFixpoint();
   6950   }
   6951 
   6952   /// See AbstractAttribute::updateImpl(...).
   6953   ChangeStatus updateImpl(Attributor &A) override {
   6954     // TODO: Once we have call site specific value information we can provide
   6955     //       call site specific liveness liveness information and then it makes
   6956     //       sense to specialize attributes for call sites arguments instead of
   6957     //       redirecting requests to the callee argument.
   6958     Function *F = getAssociatedFunction();
   6959     const IRPosition &FnPos = IRPosition::function(*F);
   6960     auto &FnAA =
   6961         A.getAAFor<AAMemoryLocation>(*this, FnPos, DepClassTy::REQUIRED);
   6962     bool Changed = false;
   6963     auto AccessPred = [&](const Instruction *I, const Value *Ptr,
   6964                           AccessKind Kind, MemoryLocationsKind MLK) {
   6965       updateStateAndAccessesMap(getState(), MLK, I, Ptr, Changed,
   6966                                 getAccessKindFromInst(I));
   6967       return true;
   6968     };
   6969     if (!FnAA.checkForAllAccessesToMemoryKind(AccessPred, ALL_LOCATIONS))
   6970       return indicatePessimisticFixpoint();
   6971     return Changed ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED;
   6972   }
   6973 
   6974   /// See AbstractAttribute::trackStatistics()
   6975   void trackStatistics() const override {
   6976     if (isAssumedReadNone())
   6977       STATS_DECLTRACK_CS_ATTR(readnone)
   6978   }
   6979 };
   6980 
   6981 /// ------------------ Value Constant Range Attribute -------------------------
   6982 
   6983 struct AAValueConstantRangeImpl : AAValueConstantRange {
   6984   using StateType = IntegerRangeState;
   6985   AAValueConstantRangeImpl(const IRPosition &IRP, Attributor &A)
   6986       : AAValueConstantRange(IRP, A) {}
   6987 
   6988   /// See AbstractAttribute::getAsStr().
   6989   const std::string getAsStr() const override {
   6990     std::string Str;
   6991     llvm::raw_string_ostream OS(Str);
   6992     OS << "range(" << getBitWidth() << ")<";
   6993     getKnown().print(OS);
   6994     OS << " / ";
   6995     getAssumed().print(OS);
   6996     OS << ">";
   6997     return OS.str();
   6998   }
   6999 
   7000   /// Helper function to get a SCEV expr for the associated value at program
   7001   /// point \p I.
   7002   const SCEV *getSCEV(Attributor &A, const Instruction *I = nullptr) const {
   7003     if (!getAnchorScope())
   7004       return nullptr;
   7005 
   7006     ScalarEvolution *SE =
   7007         A.getInfoCache().getAnalysisResultForFunction<ScalarEvolutionAnalysis>(
   7008             *getAnchorScope());
   7009 
   7010     LoopInfo *LI = A.getInfoCache().getAnalysisResultForFunction<LoopAnalysis>(
   7011         *getAnchorScope());
   7012 
   7013     if (!SE || !LI)
   7014       return nullptr;
   7015 
   7016     const SCEV *S = SE->getSCEV(&getAssociatedValue());
   7017     if (!I)
   7018       return S;
   7019 
   7020     return SE->getSCEVAtScope(S, LI->getLoopFor(I->getParent()));
   7021   }
   7022 
   7023   /// Helper function to get a range from SCEV for the associated value at
   7024   /// program point \p I.
   7025   ConstantRange getConstantRangeFromSCEV(Attributor &A,
   7026                                          const Instruction *I = nullptr) const {
   7027     if (!getAnchorScope())
   7028       return getWorstState(getBitWidth());
   7029 
   7030     ScalarEvolution *SE =
   7031         A.getInfoCache().getAnalysisResultForFunction<ScalarEvolutionAnalysis>(
   7032             *getAnchorScope());
   7033 
   7034     const SCEV *S = getSCEV(A, I);
   7035     if (!SE || !S)
   7036       return getWorstState(getBitWidth());
   7037 
   7038     return SE->getUnsignedRange(S);
   7039   }
   7040 
   7041   /// Helper function to get a range from LVI for the associated value at
   7042   /// program point \p I.
   7043   ConstantRange
   7044   getConstantRangeFromLVI(Attributor &A,
   7045                           const Instruction *CtxI = nullptr) const {
   7046     if (!getAnchorScope())
   7047       return getWorstState(getBitWidth());
   7048 
   7049     LazyValueInfo *LVI =
   7050         A.getInfoCache().getAnalysisResultForFunction<LazyValueAnalysis>(
   7051             *getAnchorScope());
   7052 
   7053     if (!LVI || !CtxI)
   7054       return getWorstState(getBitWidth());
   7055     return LVI->getConstantRange(&getAssociatedValue(),
   7056                                  const_cast<Instruction *>(CtxI));
   7057   }
   7058 
   7059   /// See AAValueConstantRange::getKnownConstantRange(..).
   7060   ConstantRange
   7061   getKnownConstantRange(Attributor &A,
   7062                         const Instruction *CtxI = nullptr) const override {
   7063     if (!CtxI || CtxI == getCtxI())
   7064       return getKnown();
   7065 
   7066     ConstantRange LVIR = getConstantRangeFromLVI(A, CtxI);
   7067     ConstantRange SCEVR = getConstantRangeFromSCEV(A, CtxI);
   7068     return getKnown().intersectWith(SCEVR).intersectWith(LVIR);
   7069   }
   7070 
   7071   /// See AAValueConstantRange::getAssumedConstantRange(..).
   7072   ConstantRange
   7073   getAssumedConstantRange(Attributor &A,
   7074                           const Instruction *CtxI = nullptr) const override {
   7075     // TODO: Make SCEV use Attributor assumption.
   7076     //       We may be able to bound a variable range via assumptions in
   7077     //       Attributor. ex.) If x is assumed to be in [1, 3] and y is known to
   7078     //       evolve to x^2 + x, then we can say that y is in [2, 12].
   7079 
   7080     if (!CtxI || CtxI == getCtxI())
   7081       return getAssumed();
   7082 
   7083     ConstantRange LVIR = getConstantRangeFromLVI(A, CtxI);
   7084     ConstantRange SCEVR = getConstantRangeFromSCEV(A, CtxI);
   7085     return getAssumed().intersectWith(SCEVR).intersectWith(LVIR);
   7086   }
   7087 
   7088   /// See AbstractAttribute::initialize(..).
   7089   void initialize(Attributor &A) override {
   7090     // Intersect a range given by SCEV.
   7091     intersectKnown(getConstantRangeFromSCEV(A, getCtxI()));
   7092 
   7093     // Intersect a range given by LVI.
   7094     intersectKnown(getConstantRangeFromLVI(A, getCtxI()));
   7095   }
   7096 
   7097   /// Helper function to create MDNode for range metadata.
   7098   static MDNode *
   7099   getMDNodeForConstantRange(Type *Ty, LLVMContext &Ctx,
   7100                             const ConstantRange &AssumedConstantRange) {
   7101     Metadata *LowAndHigh[] = {ConstantAsMetadata::get(ConstantInt::get(
   7102                                   Ty, AssumedConstantRange.getLower())),
   7103                               ConstantAsMetadata::get(ConstantInt::get(
   7104                                   Ty, AssumedConstantRange.getUpper()))};
   7105     return MDNode::get(Ctx, LowAndHigh);
   7106   }
   7107 
   7108   /// Return true if \p Assumed is included in \p KnownRanges.
   7109   static bool isBetterRange(const ConstantRange &Assumed, MDNode *KnownRanges) {
   7110 
   7111     if (Assumed.isFullSet())
   7112       return false;
   7113 
   7114     if (!KnownRanges)
   7115       return true;
   7116 
   7117     // If multiple ranges are annotated in IR, we give up to annotate assumed
   7118     // range for now.
   7119 
   7120     // TODO:  If there exists a known range which containts assumed range, we
   7121     // can say assumed range is better.
   7122     if (KnownRanges->getNumOperands() > 2)
   7123       return false;
   7124 
   7125     ConstantInt *Lower =
   7126         mdconst::extract<ConstantInt>(KnownRanges->getOperand(0));
   7127     ConstantInt *Upper =
   7128         mdconst::extract<ConstantInt>(KnownRanges->getOperand(1));
   7129 
   7130     ConstantRange Known(Lower->getValue(), Upper->getValue());
   7131     return Known.contains(Assumed) && Known != Assumed;
   7132   }
   7133 
   7134   /// Helper function to set range metadata.
   7135   static bool
   7136   setRangeMetadataIfisBetterRange(Instruction *I,
   7137                                   const ConstantRange &AssumedConstantRange) {
   7138     auto *OldRangeMD = I->getMetadata(LLVMContext::MD_range);
   7139     if (isBetterRange(AssumedConstantRange, OldRangeMD)) {
   7140       if (!AssumedConstantRange.isEmptySet()) {
   7141         I->setMetadata(LLVMContext::MD_range,
   7142                        getMDNodeForConstantRange(I->getType(), I->getContext(),
   7143                                                  AssumedConstantRange));
   7144         return true;
   7145       }
   7146     }
   7147     return false;
   7148   }
   7149 
   7150   /// See AbstractAttribute::manifest()
   7151   ChangeStatus manifest(Attributor &A) override {
   7152     ChangeStatus Changed = ChangeStatus::UNCHANGED;
   7153     ConstantRange AssumedConstantRange = getAssumedConstantRange(A);
   7154     assert(!AssumedConstantRange.isFullSet() && "Invalid state");
   7155 
   7156     auto &V = getAssociatedValue();
   7157     if (!AssumedConstantRange.isEmptySet() &&
   7158         !AssumedConstantRange.isSingleElement()) {
   7159       if (Instruction *I = dyn_cast<Instruction>(&V)) {
   7160         assert(I == getCtxI() && "Should not annotate an instruction which is "
   7161                                  "not the context instruction");
   7162         if (isa<CallInst>(I) || isa<LoadInst>(I))
   7163           if (setRangeMetadataIfisBetterRange(I, AssumedConstantRange))
   7164             Changed = ChangeStatus::CHANGED;
   7165       }
   7166     }
   7167 
   7168     return Changed;
   7169   }
   7170 };
   7171 
   7172 struct AAValueConstantRangeArgument final
   7173     : AAArgumentFromCallSiteArguments<
   7174           AAValueConstantRange, AAValueConstantRangeImpl, IntegerRangeState,
   7175           true /* BridgeCallBaseContext */> {
   7176   using Base = AAArgumentFromCallSiteArguments<
   7177       AAValueConstantRange, AAValueConstantRangeImpl, IntegerRangeState,
   7178       true /* BridgeCallBaseContext */>;
   7179   AAValueConstantRangeArgument(const IRPosition &IRP, Attributor &A)
   7180       : Base(IRP, A) {}
   7181 
   7182   /// See AbstractAttribute::initialize(..).
   7183   void initialize(Attributor &A) override {
   7184     if (!getAnchorScope() || getAnchorScope()->isDeclaration()) {
   7185       indicatePessimisticFixpoint();
   7186     } else {
   7187       Base::initialize(A);
   7188     }
   7189   }
   7190 
   7191   /// See AbstractAttribute::trackStatistics()
   7192   void trackStatistics() const override {
   7193     STATS_DECLTRACK_ARG_ATTR(value_range)
   7194   }
   7195 };
   7196 
   7197 struct AAValueConstantRangeReturned
   7198     : AAReturnedFromReturnedValues<AAValueConstantRange,
   7199                                    AAValueConstantRangeImpl,
   7200                                    AAValueConstantRangeImpl::StateType,
   7201                                    /* PropogateCallBaseContext */ true> {
   7202   using Base =
   7203       AAReturnedFromReturnedValues<AAValueConstantRange,
   7204                                    AAValueConstantRangeImpl,
   7205                                    AAValueConstantRangeImpl::StateType,
   7206                                    /* PropogateCallBaseContext */ true>;
   7207   AAValueConstantRangeReturned(const IRPosition &IRP, Attributor &A)
   7208       : Base(IRP, A) {}
   7209 
   7210   /// See AbstractAttribute::initialize(...).
   7211   void initialize(Attributor &A) override {}
   7212 
   7213   /// See AbstractAttribute::trackStatistics()
   7214   void trackStatistics() const override {
   7215     STATS_DECLTRACK_FNRET_ATTR(value_range)
   7216   }
   7217 };
   7218 
   7219 struct AAValueConstantRangeFloating : AAValueConstantRangeImpl {
   7220   AAValueConstantRangeFloating(const IRPosition &IRP, Attributor &A)
   7221       : AAValueConstantRangeImpl(IRP, A) {}
   7222 
   7223   /// See AbstractAttribute::initialize(...).
   7224   void initialize(Attributor &A) override {
   7225     AAValueConstantRangeImpl::initialize(A);
   7226     Value &V = getAssociatedValue();
   7227 
   7228     if (auto *C = dyn_cast<ConstantInt>(&V)) {
   7229       unionAssumed(ConstantRange(C->getValue()));
   7230       indicateOptimisticFixpoint();
   7231       return;
   7232     }
   7233 
   7234     if (isa<UndefValue>(&V)) {
   7235       // Collapse the undef state to 0.
   7236       unionAssumed(ConstantRange(APInt(getBitWidth(), 0)));
   7237       indicateOptimisticFixpoint();
   7238       return;
   7239     }
   7240 
   7241     if (isa<CallBase>(&V))
   7242       return;
   7243 
   7244     if (isa<BinaryOperator>(&V) || isa<CmpInst>(&V) || isa<CastInst>(&V))
   7245       return;
   7246     // If it is a load instruction with range metadata, use it.
   7247     if (LoadInst *LI = dyn_cast<LoadInst>(&V))
   7248       if (auto *RangeMD = LI->getMetadata(LLVMContext::MD_range)) {
   7249         intersectKnown(getConstantRangeFromMetadata(*RangeMD));
   7250         return;
   7251       }
   7252 
   7253     // We can work with PHI and select instruction as we traverse their operands
   7254     // during update.
   7255     if (isa<SelectInst>(V) || isa<PHINode>(V))
   7256       return;
   7257 
   7258     // Otherwise we give up.
   7259     indicatePessimisticFixpoint();
   7260 
   7261     LLVM_DEBUG(dbgs() << "[AAValueConstantRange] We give up: "
   7262                       << getAssociatedValue() << "\n");
   7263   }
   7264 
   7265   bool calculateBinaryOperator(
   7266       Attributor &A, BinaryOperator *BinOp, IntegerRangeState &T,
   7267       const Instruction *CtxI,
   7268       SmallVectorImpl<const AAValueConstantRange *> &QuerriedAAs) {
   7269     Value *LHS = BinOp->getOperand(0);
   7270     Value *RHS = BinOp->getOperand(1);
   7271     // TODO: Allow non integers as well.
   7272     if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy())
   7273       return false;
   7274 
   7275     auto &LHSAA = A.getAAFor<AAValueConstantRange>(
   7276         *this, IRPosition::value(*LHS, getCallBaseContext()),
   7277         DepClassTy::REQUIRED);
   7278     QuerriedAAs.push_back(&LHSAA);
   7279     auto LHSAARange = LHSAA.getAssumedConstantRange(A, CtxI);
   7280 
   7281     auto &RHSAA = A.getAAFor<AAValueConstantRange>(
   7282         *this, IRPosition::value(*RHS, getCallBaseContext()),
   7283         DepClassTy::REQUIRED);
   7284     QuerriedAAs.push_back(&RHSAA);
   7285     auto RHSAARange = RHSAA.getAssumedConstantRange(A, CtxI);
   7286 
   7287     auto AssumedRange = LHSAARange.binaryOp(BinOp->getOpcode(), RHSAARange);
   7288 
   7289     T.unionAssumed(AssumedRange);
   7290 
   7291     // TODO: Track a known state too.
   7292 
   7293     return T.isValidState();
   7294   }
   7295 
   7296   bool calculateCastInst(
   7297       Attributor &A, CastInst *CastI, IntegerRangeState &T,
   7298       const Instruction *CtxI,
   7299       SmallVectorImpl<const AAValueConstantRange *> &QuerriedAAs) {
   7300     assert(CastI->getNumOperands() == 1 && "Expected cast to be unary!");
   7301     // TODO: Allow non integers as well.
   7302     Value &OpV = *CastI->getOperand(0);
   7303     if (!OpV.getType()->isIntegerTy())
   7304       return false;
   7305 
   7306     auto &OpAA = A.getAAFor<AAValueConstantRange>(
   7307         *this, IRPosition::value(OpV, getCallBaseContext()),
   7308         DepClassTy::REQUIRED);
   7309     QuerriedAAs.push_back(&OpAA);
   7310     T.unionAssumed(
   7311         OpAA.getAssumed().castOp(CastI->getOpcode(), getState().getBitWidth()));
   7312     return T.isValidState();
   7313   }
   7314 
   7315   bool
   7316   calculateCmpInst(Attributor &A, CmpInst *CmpI, IntegerRangeState &T,
   7317                    const Instruction *CtxI,
   7318                    SmallVectorImpl<const AAValueConstantRange *> &QuerriedAAs) {
   7319     Value *LHS = CmpI->getOperand(0);
   7320     Value *RHS = CmpI->getOperand(1);
   7321     // TODO: Allow non integers as well.
   7322     if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy())
   7323       return false;
   7324 
   7325     auto &LHSAA = A.getAAFor<AAValueConstantRange>(
   7326         *this, IRPosition::value(*LHS, getCallBaseContext()),
   7327         DepClassTy::REQUIRED);
   7328     QuerriedAAs.push_back(&LHSAA);
   7329     auto &RHSAA = A.getAAFor<AAValueConstantRange>(
   7330         *this, IRPosition::value(*RHS, getCallBaseContext()),
   7331         DepClassTy::REQUIRED);
   7332     auto LHSAARange = LHSAA.getAssumedConstantRange(A, CtxI);
   7333     auto RHSAARange = RHSAA.getAssumedConstantRange(A, CtxI);
   7334 
   7335     // If one of them is empty set, we can't decide.
   7336     if (LHSAARange.isEmptySet() || RHSAARange.isEmptySet())
   7337       return true;
   7338 
   7339     bool MustTrue = false, MustFalse = false;
   7340 
   7341     auto AllowedRegion =
   7342         ConstantRange::makeAllowedICmpRegion(CmpI->getPredicate(), RHSAARange);
   7343 
   7344     if (AllowedRegion.intersectWith(LHSAARange).isEmptySet())
   7345       MustFalse = true;
   7346 
   7347     if (LHSAARange.icmp(CmpI->getPredicate(), RHSAARange))
   7348       MustTrue = true;
   7349 
   7350     assert((!MustTrue || !MustFalse) &&
   7351            "Either MustTrue or MustFalse should be false!");
   7352 
   7353     if (MustTrue)
   7354       T.unionAssumed(ConstantRange(APInt(/* numBits */ 1, /* val */ 1)));
   7355     else if (MustFalse)
   7356       T.unionAssumed(ConstantRange(APInt(/* numBits */ 1, /* val */ 0)));
   7357     else
   7358       T.unionAssumed(ConstantRange(/* BitWidth */ 1, /* isFullSet */ true));
   7359 
   7360     LLVM_DEBUG(dbgs() << "[AAValueConstantRange] " << *CmpI << " " << LHSAA
   7361                       << " " << RHSAA << "\n");
   7362 
   7363     // TODO: Track a known state too.
   7364     return T.isValidState();
   7365   }
   7366 
   7367   /// See AbstractAttribute::updateImpl(...).
   7368   ChangeStatus updateImpl(Attributor &A) override {
   7369     auto VisitValueCB = [&](Value &V, const Instruction *CtxI,
   7370                             IntegerRangeState &T, bool Stripped) -> bool {
   7371       Instruction *I = dyn_cast<Instruction>(&V);
   7372       if (!I || isa<CallBase>(I)) {
   7373 
   7374         // If the value is not instruction, we query AA to Attributor.
   7375         const auto &AA = A.getAAFor<AAValueConstantRange>(
   7376             *this, IRPosition::value(V, getCallBaseContext()),
   7377             DepClassTy::REQUIRED);
   7378 
   7379         // Clamp operator is not used to utilize a program point CtxI.
   7380         T.unionAssumed(AA.getAssumedConstantRange(A, CtxI));
   7381 
   7382         return T.isValidState();
   7383       }
   7384 
   7385       SmallVector<const AAValueConstantRange *, 4> QuerriedAAs;
   7386       if (auto *BinOp = dyn_cast<BinaryOperator>(I)) {
   7387         if (!calculateBinaryOperator(A, BinOp, T, CtxI, QuerriedAAs))
   7388           return false;
   7389       } else if (auto *CmpI = dyn_cast<CmpInst>(I)) {
   7390         if (!calculateCmpInst(A, CmpI, T, CtxI, QuerriedAAs))
   7391           return false;
   7392       } else if (auto *CastI = dyn_cast<CastInst>(I)) {
   7393         if (!calculateCastInst(A, CastI, T, CtxI, QuerriedAAs))
   7394           return false;
   7395       } else {
   7396         // Give up with other instructions.
   7397         // TODO: Add other instructions
   7398 
   7399         T.indicatePessimisticFixpoint();
   7400         return false;
   7401       }
   7402 
   7403       // Catch circular reasoning in a pessimistic way for now.
   7404       // TODO: Check how the range evolves and if we stripped anything, see also
   7405       //       AADereferenceable or AAAlign for similar situations.
   7406       for (const AAValueConstantRange *QueriedAA : QuerriedAAs) {
   7407         if (QueriedAA != this)
   7408           continue;
   7409         // If we are in a stady state we do not need to worry.
   7410         if (T.getAssumed() == getState().getAssumed())
   7411           continue;
   7412         T.indicatePessimisticFixpoint();
   7413       }
   7414 
   7415       return T.isValidState();
   7416     };
   7417 
   7418     IntegerRangeState T(getBitWidth());
   7419 
   7420     if (!genericValueTraversal<AAValueConstantRange, IntegerRangeState>(
   7421             A, getIRPosition(), *this, T, VisitValueCB, getCtxI(),
   7422             /* UseValueSimplify */ false))
   7423       return indicatePessimisticFixpoint();
   7424 
   7425     return clampStateAndIndicateChange(getState(), T);
   7426   }
   7427 
   7428   /// See AbstractAttribute::trackStatistics()
   7429   void trackStatistics() const override {
   7430     STATS_DECLTRACK_FLOATING_ATTR(value_range)
   7431   }
   7432 };
   7433 
   7434 struct AAValueConstantRangeFunction : AAValueConstantRangeImpl {
   7435   AAValueConstantRangeFunction(const IRPosition &IRP, Attributor &A)
   7436       : AAValueConstantRangeImpl(IRP, A) {}
   7437 
   7438   /// See AbstractAttribute::initialize(...).
   7439   ChangeStatus updateImpl(Attributor &A) override {
   7440     llvm_unreachable("AAValueConstantRange(Function|CallSite)::updateImpl will "
   7441                      "not be called");
   7442   }
   7443 
   7444   /// See AbstractAttribute::trackStatistics()
   7445   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(value_range) }
   7446 };
   7447 
   7448 struct AAValueConstantRangeCallSite : AAValueConstantRangeFunction {
   7449   AAValueConstantRangeCallSite(const IRPosition &IRP, Attributor &A)
   7450       : AAValueConstantRangeFunction(IRP, A) {}
   7451 
   7452   /// See AbstractAttribute::trackStatistics()
   7453   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(value_range) }
   7454 };
   7455 
   7456 struct AAValueConstantRangeCallSiteReturned
   7457     : AACallSiteReturnedFromReturned<AAValueConstantRange,
   7458                                      AAValueConstantRangeImpl,
   7459                                      AAValueConstantRangeImpl::StateType,
   7460                                      /* IntroduceCallBaseContext */ true> {
   7461   AAValueConstantRangeCallSiteReturned(const IRPosition &IRP, Attributor &A)
   7462       : AACallSiteReturnedFromReturned<AAValueConstantRange,
   7463                                        AAValueConstantRangeImpl,
   7464                                        AAValueConstantRangeImpl::StateType,
   7465                                        /* IntroduceCallBaseContext */ true>(IRP,
   7466                                                                             A) {
   7467   }
   7468 
   7469   /// See AbstractAttribute::initialize(...).
   7470   void initialize(Attributor &A) override {
   7471     // If it is a load instruction with range metadata, use the metadata.
   7472     if (CallInst *CI = dyn_cast<CallInst>(&getAssociatedValue()))
   7473       if (auto *RangeMD = CI->getMetadata(LLVMContext::MD_range))
   7474         intersectKnown(getConstantRangeFromMetadata(*RangeMD));
   7475 
   7476     AAValueConstantRangeImpl::initialize(A);
   7477   }
   7478 
   7479   /// See AbstractAttribute::trackStatistics()
   7480   void trackStatistics() const override {
   7481     STATS_DECLTRACK_CSRET_ATTR(value_range)
   7482   }
   7483 };
   7484 struct AAValueConstantRangeCallSiteArgument : AAValueConstantRangeFloating {
   7485   AAValueConstantRangeCallSiteArgument(const IRPosition &IRP, Attributor &A)
   7486       : AAValueConstantRangeFloating(IRP, A) {}
   7487 
   7488   /// See AbstractAttribute::manifest()
   7489   ChangeStatus manifest(Attributor &A) override {
   7490     return ChangeStatus::UNCHANGED;
   7491   }
   7492 
   7493   /// See AbstractAttribute::trackStatistics()
   7494   void trackStatistics() const override {
   7495     STATS_DECLTRACK_CSARG_ATTR(value_range)
   7496   }
   7497 };
   7498 
   7499 /// ------------------ Potential Values Attribute -------------------------
   7500 
   7501 struct AAPotentialValuesImpl : AAPotentialValues {
   7502   using StateType = PotentialConstantIntValuesState;
   7503 
   7504   AAPotentialValuesImpl(const IRPosition &IRP, Attributor &A)
   7505       : AAPotentialValues(IRP, A) {}
   7506 
   7507   /// See AbstractAttribute::getAsStr().
   7508   const std::string getAsStr() const override {
   7509     std::string Str;
   7510     llvm::raw_string_ostream OS(Str);
   7511     OS << getState();
   7512     return OS.str();
   7513   }
   7514 
   7515   /// See AbstractAttribute::updateImpl(...).
   7516   ChangeStatus updateImpl(Attributor &A) override {
   7517     return indicatePessimisticFixpoint();
   7518   }
   7519 };
   7520 
   7521 struct AAPotentialValuesArgument final
   7522     : AAArgumentFromCallSiteArguments<AAPotentialValues, AAPotentialValuesImpl,
   7523                                       PotentialConstantIntValuesState> {
   7524   using Base =
   7525       AAArgumentFromCallSiteArguments<AAPotentialValues, AAPotentialValuesImpl,
   7526                                       PotentialConstantIntValuesState>;
   7527   AAPotentialValuesArgument(const IRPosition &IRP, Attributor &A)
   7528       : Base(IRP, A) {}
   7529 
   7530   /// See AbstractAttribute::initialize(..).
   7531   void initialize(Attributor &A) override {
   7532     if (!getAnchorScope() || getAnchorScope()->isDeclaration()) {
   7533       indicatePessimisticFixpoint();
   7534     } else {
   7535       Base::initialize(A);
   7536     }
   7537   }
   7538 
   7539   /// See AbstractAttribute::trackStatistics()
   7540   void trackStatistics() const override {
   7541     STATS_DECLTRACK_ARG_ATTR(potential_values)
   7542   }
   7543 };
   7544 
   7545 struct AAPotentialValuesReturned
   7546     : AAReturnedFromReturnedValues<AAPotentialValues, AAPotentialValuesImpl> {
   7547   using Base =
   7548       AAReturnedFromReturnedValues<AAPotentialValues, AAPotentialValuesImpl>;
   7549   AAPotentialValuesReturned(const IRPosition &IRP, Attributor &A)
   7550       : Base(IRP, A) {}
   7551 
   7552   /// See AbstractAttribute::trackStatistics()
   7553   void trackStatistics() const override {
   7554     STATS_DECLTRACK_FNRET_ATTR(potential_values)
   7555   }
   7556 };
   7557 
   7558 struct AAPotentialValuesFloating : AAPotentialValuesImpl {
   7559   AAPotentialValuesFloating(const IRPosition &IRP, Attributor &A)
   7560       : AAPotentialValuesImpl(IRP, A) {}
   7561 
   7562   /// See AbstractAttribute::initialize(..).
   7563   void initialize(Attributor &A) override {
   7564     Value &V = getAssociatedValue();
   7565 
   7566     if (auto *C = dyn_cast<ConstantInt>(&V)) {
   7567       unionAssumed(C->getValue());
   7568       indicateOptimisticFixpoint();
   7569       return;
   7570     }
   7571 
   7572     if (isa<UndefValue>(&V)) {
   7573       unionAssumedWithUndef();
   7574       indicateOptimisticFixpoint();
   7575       return;
   7576     }
   7577 
   7578     if (isa<BinaryOperator>(&V) || isa<ICmpInst>(&V) || isa<CastInst>(&V))
   7579       return;
   7580 
   7581     if (isa<SelectInst>(V) || isa<PHINode>(V))
   7582       return;
   7583 
   7584     indicatePessimisticFixpoint();
   7585 
   7586     LLVM_DEBUG(dbgs() << "[AAPotentialValues] We give up: "
   7587                       << getAssociatedValue() << "\n");
   7588   }
   7589 
   7590   static bool calculateICmpInst(const ICmpInst *ICI, const APInt &LHS,
   7591                                 const APInt &RHS) {
   7592     ICmpInst::Predicate Pred = ICI->getPredicate();
   7593     switch (Pred) {
   7594     case ICmpInst::ICMP_UGT:
   7595       return LHS.ugt(RHS);
   7596     case ICmpInst::ICMP_SGT:
   7597       return LHS.sgt(RHS);
   7598     case ICmpInst::ICMP_EQ:
   7599       return LHS.eq(RHS);
   7600     case ICmpInst::ICMP_UGE:
   7601       return LHS.uge(RHS);
   7602     case ICmpInst::ICMP_SGE:
   7603       return LHS.sge(RHS);
   7604     case ICmpInst::ICMP_ULT:
   7605       return LHS.ult(RHS);
   7606     case ICmpInst::ICMP_SLT:
   7607       return LHS.slt(RHS);
   7608     case ICmpInst::ICMP_NE:
   7609       return LHS.ne(RHS);
   7610     case ICmpInst::ICMP_ULE:
   7611       return LHS.ule(RHS);
   7612     case ICmpInst::ICMP_SLE:
   7613       return LHS.sle(RHS);
   7614     default:
   7615       llvm_unreachable("Invalid ICmp predicate!");
   7616     }
   7617   }
   7618 
   7619   static APInt calculateCastInst(const CastInst *CI, const APInt &Src,
   7620                                  uint32_t ResultBitWidth) {
   7621     Instruction::CastOps CastOp = CI->getOpcode();
   7622     switch (CastOp) {
   7623     default:
   7624       llvm_unreachable("unsupported or not integer cast");
   7625     case Instruction::Trunc:
   7626       return Src.trunc(ResultBitWidth);
   7627     case Instruction::SExt:
   7628       return Src.sext(ResultBitWidth);
   7629     case Instruction::ZExt:
   7630       return Src.zext(ResultBitWidth);
   7631     case Instruction::BitCast:
   7632       return Src;
   7633     }
   7634   }
   7635 
   7636   static APInt calculateBinaryOperator(const BinaryOperator *BinOp,
   7637                                        const APInt &LHS, const APInt &RHS,
   7638                                        bool &SkipOperation, bool &Unsupported) {
   7639     Instruction::BinaryOps BinOpcode = BinOp->getOpcode();
   7640     // Unsupported is set to true when the binary operator is not supported.
   7641     // SkipOperation is set to true when UB occur with the given operand pair
   7642     // (LHS, RHS).
   7643     // TODO: we should look at nsw and nuw keywords to handle operations
   7644     //       that create poison or undef value.
   7645     switch (BinOpcode) {
   7646     default:
   7647       Unsupported = true;
   7648       return LHS;
   7649     case Instruction::Add:
   7650       return LHS + RHS;
   7651     case Instruction::Sub:
   7652       return LHS - RHS;
   7653     case Instruction::Mul:
   7654       return LHS * RHS;
   7655     case Instruction::UDiv:
   7656       if (RHS.isNullValue()) {
   7657         SkipOperation = true;
   7658         return LHS;
   7659       }
   7660       return LHS.udiv(RHS);
   7661     case Instruction::SDiv:
   7662       if (RHS.isNullValue()) {
   7663         SkipOperation = true;
   7664         return LHS;
   7665       }
   7666       return LHS.sdiv(RHS);
   7667     case Instruction::URem:
   7668       if (RHS.isNullValue()) {
   7669         SkipOperation = true;
   7670         return LHS;
   7671       }
   7672       return LHS.urem(RHS);
   7673     case Instruction::SRem:
   7674       if (RHS.isNullValue()) {
   7675         SkipOperation = true;
   7676         return LHS;
   7677       }
   7678       return LHS.srem(RHS);
   7679     case Instruction::Shl:
   7680       return LHS.shl(RHS);
   7681     case Instruction::LShr:
   7682       return LHS.lshr(RHS);
   7683     case Instruction::AShr:
   7684       return LHS.ashr(RHS);
   7685     case Instruction::And:
   7686       return LHS & RHS;
   7687     case Instruction::Or:
   7688       return LHS | RHS;
   7689     case Instruction::Xor:
   7690       return LHS ^ RHS;
   7691     }
   7692   }
   7693 
   7694   bool calculateBinaryOperatorAndTakeUnion(const BinaryOperator *BinOp,
   7695                                            const APInt &LHS, const APInt &RHS) {
   7696     bool SkipOperation = false;
   7697     bool Unsupported = false;
   7698     APInt Result =
   7699         calculateBinaryOperator(BinOp, LHS, RHS, SkipOperation, Unsupported);
   7700     if (Unsupported)
   7701       return false;
   7702     // If SkipOperation is true, we can ignore this operand pair (L, R).
   7703     if (!SkipOperation)
   7704       unionAssumed(Result);
   7705     return isValidState();
   7706   }
   7707 
   7708   ChangeStatus updateWithICmpInst(Attributor &A, ICmpInst *ICI) {
   7709     auto AssumedBefore = getAssumed();
   7710     Value *LHS = ICI->getOperand(0);
   7711     Value *RHS = ICI->getOperand(1);
   7712     if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy())
   7713       return indicatePessimisticFixpoint();
   7714 
   7715     auto &LHSAA = A.getAAFor<AAPotentialValues>(*this, IRPosition::value(*LHS),
   7716                                                 DepClassTy::REQUIRED);
   7717     if (!LHSAA.isValidState())
   7718       return indicatePessimisticFixpoint();
   7719 
   7720     auto &RHSAA = A.getAAFor<AAPotentialValues>(*this, IRPosition::value(*RHS),
   7721                                                 DepClassTy::REQUIRED);
   7722     if (!RHSAA.isValidState())
   7723       return indicatePessimisticFixpoint();
   7724 
   7725     const DenseSet<APInt> &LHSAAPVS = LHSAA.getAssumedSet();
   7726     const DenseSet<APInt> &RHSAAPVS = RHSAA.getAssumedSet();
   7727 
   7728     // TODO: make use of undef flag to limit potential values aggressively.
   7729     bool MaybeTrue = false, MaybeFalse = false;
   7730     const APInt Zero(RHS->getType()->getIntegerBitWidth(), 0);
   7731     if (LHSAA.undefIsContained() && RHSAA.undefIsContained()) {
   7732       // The result of any comparison between undefs can be soundly replaced
   7733       // with undef.
   7734       unionAssumedWithUndef();
   7735     } else if (LHSAA.undefIsContained()) {
   7736       bool MaybeTrue = false, MaybeFalse = false;
   7737       for (const APInt &R : RHSAAPVS) {
   7738         bool CmpResult = calculateICmpInst(ICI, Zero, R);
   7739         MaybeTrue |= CmpResult;
   7740         MaybeFalse |= !CmpResult;
   7741         if (MaybeTrue & MaybeFalse)
   7742           return indicatePessimisticFixpoint();
   7743       }
   7744     } else if (RHSAA.undefIsContained()) {
   7745       for (const APInt &L : LHSAAPVS) {
   7746         bool CmpResult = calculateICmpInst(ICI, L, Zero);
   7747         MaybeTrue |= CmpResult;
   7748         MaybeFalse |= !CmpResult;
   7749         if (MaybeTrue & MaybeFalse)
   7750           return indicatePessimisticFixpoint();
   7751       }
   7752     } else {
   7753       for (const APInt &L : LHSAAPVS) {
   7754         for (const APInt &R : RHSAAPVS) {
   7755           bool CmpResult = calculateICmpInst(ICI, L, R);
   7756           MaybeTrue |= CmpResult;
   7757           MaybeFalse |= !CmpResult;
   7758           if (MaybeTrue & MaybeFalse)
   7759             return indicatePessimisticFixpoint();
   7760         }
   7761       }
   7762     }
   7763     if (MaybeTrue)
   7764       unionAssumed(APInt(/* numBits */ 1, /* val */ 1));
   7765     if (MaybeFalse)
   7766       unionAssumed(APInt(/* numBits */ 1, /* val */ 0));
   7767     return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED
   7768                                          : ChangeStatus::CHANGED;
   7769   }
   7770 
   7771   ChangeStatus updateWithSelectInst(Attributor &A, SelectInst *SI) {
   7772     auto AssumedBefore = getAssumed();
   7773     Value *LHS = SI->getTrueValue();
   7774     Value *RHS = SI->getFalseValue();
   7775     if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy())
   7776       return indicatePessimisticFixpoint();
   7777 
   7778     // TODO: Use assumed simplified condition value
   7779     auto &LHSAA = A.getAAFor<AAPotentialValues>(*this, IRPosition::value(*LHS),
   7780                                                 DepClassTy::REQUIRED);
   7781     if (!LHSAA.isValidState())
   7782       return indicatePessimisticFixpoint();
   7783 
   7784     auto &RHSAA = A.getAAFor<AAPotentialValues>(*this, IRPosition::value(*RHS),
   7785                                                 DepClassTy::REQUIRED);
   7786     if (!RHSAA.isValidState())
   7787       return indicatePessimisticFixpoint();
   7788 
   7789     if (LHSAA.undefIsContained() && RHSAA.undefIsContained())
   7790       // select i1 *, undef , undef => undef
   7791       unionAssumedWithUndef();
   7792     else {
   7793       unionAssumed(LHSAA);
   7794       unionAssumed(RHSAA);
   7795     }
   7796     return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED
   7797                                          : ChangeStatus::CHANGED;
   7798   }
   7799 
   7800   ChangeStatus updateWithCastInst(Attributor &A, CastInst *CI) {
   7801     auto AssumedBefore = getAssumed();
   7802     if (!CI->isIntegerCast())
   7803       return indicatePessimisticFixpoint();
   7804     assert(CI->getNumOperands() == 1 && "Expected cast to be unary!");
   7805     uint32_t ResultBitWidth = CI->getDestTy()->getIntegerBitWidth();
   7806     Value *Src = CI->getOperand(0);
   7807     auto &SrcAA = A.getAAFor<AAPotentialValues>(*this, IRPosition::value(*Src),
   7808                                                 DepClassTy::REQUIRED);
   7809     if (!SrcAA.isValidState())
   7810       return indicatePessimisticFixpoint();
   7811     const DenseSet<APInt> &SrcAAPVS = SrcAA.getAssumedSet();
   7812     if (SrcAA.undefIsContained())
   7813       unionAssumedWithUndef();
   7814     else {
   7815       for (const APInt &S : SrcAAPVS) {
   7816         APInt T = calculateCastInst(CI, S, ResultBitWidth);
   7817         unionAssumed(T);
   7818       }
   7819     }
   7820     return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED
   7821                                          : ChangeStatus::CHANGED;
   7822   }
   7823 
   7824   ChangeStatus updateWithBinaryOperator(Attributor &A, BinaryOperator *BinOp) {
   7825     auto AssumedBefore = getAssumed();
   7826     Value *LHS = BinOp->getOperand(0);
   7827     Value *RHS = BinOp->getOperand(1);
   7828     if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy())
   7829       return indicatePessimisticFixpoint();
   7830 
   7831     auto &LHSAA = A.getAAFor<AAPotentialValues>(*this, IRPosition::value(*LHS),
   7832                                                 DepClassTy::REQUIRED);
   7833     if (!LHSAA.isValidState())
   7834       return indicatePessimisticFixpoint();
   7835 
   7836     auto &RHSAA = A.getAAFor<AAPotentialValues>(*this, IRPosition::value(*RHS),
   7837                                                 DepClassTy::REQUIRED);
   7838     if (!RHSAA.isValidState())
   7839       return indicatePessimisticFixpoint();
   7840 
   7841     const DenseSet<APInt> &LHSAAPVS = LHSAA.getAssumedSet();
   7842     const DenseSet<APInt> &RHSAAPVS = RHSAA.getAssumedSet();
   7843     const APInt Zero = APInt(LHS->getType()->getIntegerBitWidth(), 0);
   7844 
   7845     // TODO: make use of undef flag to limit potential values aggressively.
   7846     if (LHSAA.undefIsContained() && RHSAA.undefIsContained()) {
   7847       if (!calculateBinaryOperatorAndTakeUnion(BinOp, Zero, Zero))
   7848         return indicatePessimisticFixpoint();
   7849     } else if (LHSAA.undefIsContained()) {
   7850       for (const APInt &R : RHSAAPVS) {
   7851         if (!calculateBinaryOperatorAndTakeUnion(BinOp, Zero, R))
   7852           return indicatePessimisticFixpoint();
   7853       }
   7854     } else if (RHSAA.undefIsContained()) {
   7855       for (const APInt &L : LHSAAPVS) {
   7856         if (!calculateBinaryOperatorAndTakeUnion(BinOp, L, Zero))
   7857           return indicatePessimisticFixpoint();
   7858       }
   7859     } else {
   7860       for (const APInt &L : LHSAAPVS) {
   7861         for (const APInt &R : RHSAAPVS) {
   7862           if (!calculateBinaryOperatorAndTakeUnion(BinOp, L, R))
   7863             return indicatePessimisticFixpoint();
   7864         }
   7865       }
   7866     }
   7867     return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED
   7868                                          : ChangeStatus::CHANGED;
   7869   }
   7870 
   7871   ChangeStatus updateWithPHINode(Attributor &A, PHINode *PHI) {
   7872     auto AssumedBefore = getAssumed();
   7873     for (unsigned u = 0, e = PHI->getNumIncomingValues(); u < e; u++) {
   7874       Value *IncomingValue = PHI->getIncomingValue(u);
   7875       auto &PotentialValuesAA = A.getAAFor<AAPotentialValues>(
   7876           *this, IRPosition::value(*IncomingValue), DepClassTy::REQUIRED);
   7877       if (!PotentialValuesAA.isValidState())
   7878         return indicatePessimisticFixpoint();
   7879       if (PotentialValuesAA.undefIsContained())
   7880         unionAssumedWithUndef();
   7881       else
   7882         unionAssumed(PotentialValuesAA.getAssumed());
   7883     }
   7884     return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED
   7885                                          : ChangeStatus::CHANGED;
   7886   }
   7887 
   7888   /// See AbstractAttribute::updateImpl(...).
   7889   ChangeStatus updateImpl(Attributor &A) override {
   7890     Value &V = getAssociatedValue();
   7891     Instruction *I = dyn_cast<Instruction>(&V);
   7892 
   7893     if (auto *ICI = dyn_cast<ICmpInst>(I))
   7894       return updateWithICmpInst(A, ICI);
   7895 
   7896     if (auto *SI = dyn_cast<SelectInst>(I))
   7897       return updateWithSelectInst(A, SI);
   7898 
   7899     if (auto *CI = dyn_cast<CastInst>(I))
   7900       return updateWithCastInst(A, CI);
   7901 
   7902     if (auto *BinOp = dyn_cast<BinaryOperator>(I))
   7903       return updateWithBinaryOperator(A, BinOp);
   7904 
   7905     if (auto *PHI = dyn_cast<PHINode>(I))
   7906       return updateWithPHINode(A, PHI);
   7907 
   7908     return indicatePessimisticFixpoint();
   7909   }
   7910 
   7911   /// See AbstractAttribute::trackStatistics()
   7912   void trackStatistics() const override {
   7913     STATS_DECLTRACK_FLOATING_ATTR(potential_values)
   7914   }
   7915 };
   7916 
   7917 struct AAPotentialValuesFunction : AAPotentialValuesImpl {
   7918   AAPotentialValuesFunction(const IRPosition &IRP, Attributor &A)
   7919       : AAPotentialValuesImpl(IRP, A) {}
   7920 
   7921   /// See AbstractAttribute::initialize(...).
   7922   ChangeStatus updateImpl(Attributor &A) override {
   7923     llvm_unreachable("AAPotentialValues(Function|CallSite)::updateImpl will "
   7924                      "not be called");
   7925   }
   7926 
   7927   /// See AbstractAttribute::trackStatistics()
   7928   void trackStatistics() const override {
   7929     STATS_DECLTRACK_FN_ATTR(potential_values)
   7930   }
   7931 };
   7932 
   7933 struct AAPotentialValuesCallSite : AAPotentialValuesFunction {
   7934   AAPotentialValuesCallSite(const IRPosition &IRP, Attributor &A)
   7935       : AAPotentialValuesFunction(IRP, A) {}
   7936 
   7937   /// See AbstractAttribute::trackStatistics()
   7938   void trackStatistics() const override {
   7939     STATS_DECLTRACK_CS_ATTR(potential_values)
   7940   }
   7941 };
   7942 
   7943 struct AAPotentialValuesCallSiteReturned
   7944     : AACallSiteReturnedFromReturned<AAPotentialValues, AAPotentialValuesImpl> {
   7945   AAPotentialValuesCallSiteReturned(const IRPosition &IRP, Attributor &A)
   7946       : AACallSiteReturnedFromReturned<AAPotentialValues,
   7947                                        AAPotentialValuesImpl>(IRP, A) {}
   7948 
   7949   /// See AbstractAttribute::trackStatistics()
   7950   void trackStatistics() const override {
   7951     STATS_DECLTRACK_CSRET_ATTR(potential_values)
   7952   }
   7953 };
   7954 
   7955 struct AAPotentialValuesCallSiteArgument : AAPotentialValuesFloating {
   7956   AAPotentialValuesCallSiteArgument(const IRPosition &IRP, Attributor &A)
   7957       : AAPotentialValuesFloating(IRP, A) {}
   7958 
   7959   /// See AbstractAttribute::initialize(..).
   7960   void initialize(Attributor &A) override {
   7961     Value &V = getAssociatedValue();
   7962 
   7963     if (auto *C = dyn_cast<ConstantInt>(&V)) {
   7964       unionAssumed(C->getValue());
   7965       indicateOptimisticFixpoint();
   7966       return;
   7967     }
   7968 
   7969     if (isa<UndefValue>(&V)) {
   7970       unionAssumedWithUndef();
   7971       indicateOptimisticFixpoint();
   7972       return;
   7973     }
   7974   }
   7975 
   7976   /// See AbstractAttribute::updateImpl(...).
   7977   ChangeStatus updateImpl(Attributor &A) override {
   7978     Value &V = getAssociatedValue();
   7979     auto AssumedBefore = getAssumed();
   7980     auto &AA = A.getAAFor<AAPotentialValues>(*this, IRPosition::value(V),
   7981                                              DepClassTy::REQUIRED);
   7982     const auto &S = AA.getAssumed();
   7983     unionAssumed(S);
   7984     return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED
   7985                                          : ChangeStatus::CHANGED;
   7986   }
   7987 
   7988   /// See AbstractAttribute::trackStatistics()
   7989   void trackStatistics() const override {
   7990     STATS_DECLTRACK_CSARG_ATTR(potential_values)
   7991   }
   7992 };
   7993 
   7994 /// ------------------------ NoUndef Attribute ---------------------------------
   7995 struct AANoUndefImpl : AANoUndef {
   7996   AANoUndefImpl(const IRPosition &IRP, Attributor &A) : AANoUndef(IRP, A) {}
   7997 
   7998   /// See AbstractAttribute::initialize(...).
   7999   void initialize(Attributor &A) override {
   8000     if (getIRPosition().hasAttr({Attribute::NoUndef})) {
   8001       indicateOptimisticFixpoint();
   8002       return;
   8003     }
   8004     Value &V = getAssociatedValue();
   8005     if (isa<UndefValue>(V))
   8006       indicatePessimisticFixpoint();
   8007     else if (isa<FreezeInst>(V))
   8008       indicateOptimisticFixpoint();
   8009     else if (getPositionKind() != IRPosition::IRP_RETURNED &&
   8010              isGuaranteedNotToBeUndefOrPoison(&V))
   8011       indicateOptimisticFixpoint();
   8012     else
   8013       AANoUndef::initialize(A);
   8014   }
   8015 
   8016   /// See followUsesInMBEC
   8017   bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I,
   8018                        AANoUndef::StateType &State) {
   8019     const Value *UseV = U->get();
   8020     const DominatorTree *DT = nullptr;
   8021     AssumptionCache *AC = nullptr;
   8022     InformationCache &InfoCache = A.getInfoCache();
   8023     if (Function *F = getAnchorScope()) {
   8024       DT = InfoCache.getAnalysisResultForFunction<DominatorTreeAnalysis>(*F);
   8025       AC = InfoCache.getAnalysisResultForFunction<AssumptionAnalysis>(*F);
   8026     }
   8027     State.setKnown(isGuaranteedNotToBeUndefOrPoison(UseV, AC, I, DT));
   8028     bool TrackUse = false;
   8029     // Track use for instructions which must produce undef or poison bits when
   8030     // at least one operand contains such bits.
   8031     if (isa<CastInst>(*I) || isa<GetElementPtrInst>(*I))
   8032       TrackUse = true;
   8033     return TrackUse;
   8034   }
   8035 
   8036   /// See AbstractAttribute::getAsStr().
   8037   const std::string getAsStr() const override {
   8038     return getAssumed() ? "noundef" : "may-undef-or-poison";
   8039   }
   8040 
   8041   ChangeStatus manifest(Attributor &A) override {
   8042     // We don't manifest noundef attribute for dead positions because the
   8043     // associated values with dead positions would be replaced with undef
   8044     // values.
   8045     if (A.isAssumedDead(getIRPosition(), nullptr, nullptr))
   8046       return ChangeStatus::UNCHANGED;
   8047     // A position whose simplified value does not have any value is
   8048     // considered to be dead. We don't manifest noundef in such positions for
   8049     // the same reason above.
   8050     auto &ValueSimplifyAA =
   8051         A.getAAFor<AAValueSimplify>(*this, getIRPosition(), DepClassTy::NONE);
   8052     if (!ValueSimplifyAA.getAssumedSimplifiedValue(A).hasValue())
   8053       return ChangeStatus::UNCHANGED;
   8054     return AANoUndef::manifest(A);
   8055   }
   8056 };
   8057 
   8058 struct AANoUndefFloating : public AANoUndefImpl {
   8059   AANoUndefFloating(const IRPosition &IRP, Attributor &A)
   8060       : AANoUndefImpl(IRP, A) {}
   8061 
   8062   /// See AbstractAttribute::initialize(...).
   8063   void initialize(Attributor &A) override {
   8064     AANoUndefImpl::initialize(A);
   8065     if (!getState().isAtFixpoint())
   8066       if (Instruction *CtxI = getCtxI())
   8067         followUsesInMBEC(*this, A, getState(), *CtxI);
   8068   }
   8069 
   8070   /// See AbstractAttribute::updateImpl(...).
   8071   ChangeStatus updateImpl(Attributor &A) override {
   8072     auto VisitValueCB = [&](Value &V, const Instruction *CtxI,
   8073                             AANoUndef::StateType &T, bool Stripped) -> bool {
   8074       const auto &AA = A.getAAFor<AANoUndef>(*this, IRPosition::value(V),
   8075                                              DepClassTy::REQUIRED);
   8076       if (!Stripped && this == &AA) {
   8077         T.indicatePessimisticFixpoint();
   8078       } else {
   8079         const AANoUndef::StateType &S =
   8080             static_cast<const AANoUndef::StateType &>(AA.getState());
   8081         T ^= S;
   8082       }
   8083       return T.isValidState();
   8084     };
   8085 
   8086     StateType T;
   8087     if (!genericValueTraversal<AANoUndef, StateType>(
   8088             A, getIRPosition(), *this, T, VisitValueCB, getCtxI()))
   8089       return indicatePessimisticFixpoint();
   8090 
   8091     return clampStateAndIndicateChange(getState(), T);
   8092   }
   8093 
   8094   /// See AbstractAttribute::trackStatistics()
   8095   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(noundef) }
   8096 };
   8097 
   8098 struct AANoUndefReturned final
   8099     : AAReturnedFromReturnedValues<AANoUndef, AANoUndefImpl> {
   8100   AANoUndefReturned(const IRPosition &IRP, Attributor &A)
   8101       : AAReturnedFromReturnedValues<AANoUndef, AANoUndefImpl>(IRP, A) {}
   8102 
   8103   /// See AbstractAttribute::trackStatistics()
   8104   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(noundef) }
   8105 };
   8106 
   8107 struct AANoUndefArgument final
   8108     : AAArgumentFromCallSiteArguments<AANoUndef, AANoUndefImpl> {
   8109   AANoUndefArgument(const IRPosition &IRP, Attributor &A)
   8110       : AAArgumentFromCallSiteArguments<AANoUndef, AANoUndefImpl>(IRP, A) {}
   8111 
   8112   /// See AbstractAttribute::trackStatistics()
   8113   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(noundef) }
   8114 };
   8115 
   8116 struct AANoUndefCallSiteArgument final : AANoUndefFloating {
   8117   AANoUndefCallSiteArgument(const IRPosition &IRP, Attributor &A)
   8118       : AANoUndefFloating(IRP, A) {}
   8119 
   8120   /// See AbstractAttribute::trackStatistics()
   8121   void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(noundef) }
   8122 };
   8123 
   8124 struct AANoUndefCallSiteReturned final
   8125     : AACallSiteReturnedFromReturned<AANoUndef, AANoUndefImpl> {
   8126   AANoUndefCallSiteReturned(const IRPosition &IRP, Attributor &A)
   8127       : AACallSiteReturnedFromReturned<AANoUndef, AANoUndefImpl>(IRP, A) {}
   8128 
   8129   /// See AbstractAttribute::trackStatistics()
   8130   void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(noundef) }
   8131 };
   8132 } // namespace
   8133 
   8134 const char AAReturnedValues::ID = 0;
   8135 const char AANoUnwind::ID = 0;
   8136 const char AANoSync::ID = 0;
   8137 const char AANoFree::ID = 0;
   8138 const char AANonNull::ID = 0;
   8139 const char AANoRecurse::ID = 0;
   8140 const char AAWillReturn::ID = 0;
   8141 const char AAUndefinedBehavior::ID = 0;
   8142 const char AANoAlias::ID = 0;
   8143 const char AAReachability::ID = 0;
   8144 const char AANoReturn::ID = 0;
   8145 const char AAIsDead::ID = 0;
   8146 const char AADereferenceable::ID = 0;
   8147 const char AAAlign::ID = 0;
   8148 const char AANoCapture::ID = 0;
   8149 const char AAValueSimplify::ID = 0;
   8150 const char AAHeapToStack::ID = 0;
   8151 const char AAPrivatizablePtr::ID = 0;
   8152 const char AAMemoryBehavior::ID = 0;
   8153 const char AAMemoryLocation::ID = 0;
   8154 const char AAValueConstantRange::ID = 0;
   8155 const char AAPotentialValues::ID = 0;
   8156 const char AANoUndef::ID = 0;
   8157 
   8158 // Macro magic to create the static generator function for attributes that
   8159 // follow the naming scheme.
   8160 
   8161 #define SWITCH_PK_INV(CLASS, PK, POS_NAME)                                     \
   8162   case IRPosition::PK:                                                         \
   8163     llvm_unreachable("Cannot create " #CLASS " for a " POS_NAME " position!");
   8164 
   8165 #define SWITCH_PK_CREATE(CLASS, IRP, PK, SUFFIX)                               \
   8166   case IRPosition::PK:                                                         \
   8167     AA = new (A.Allocator) CLASS##SUFFIX(IRP, A);                              \
   8168     ++NumAAs;                                                                  \
   8169     break;
   8170 
   8171 #define CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS)                 \
   8172   CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) {      \
   8173     CLASS *AA = nullptr;                                                       \
   8174     switch (IRP.getPositionKind()) {                                           \
   8175       SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid")                             \
   8176       SWITCH_PK_INV(CLASS, IRP_FLOAT, "floating")                              \
   8177       SWITCH_PK_INV(CLASS, IRP_ARGUMENT, "argument")                           \
   8178       SWITCH_PK_INV(CLASS, IRP_RETURNED, "returned")                           \
   8179       SWITCH_PK_INV(CLASS, IRP_CALL_SITE_RETURNED, "call site returned")       \
   8180       SWITCH_PK_INV(CLASS, IRP_CALL_SITE_ARGUMENT, "call site argument")       \
   8181       SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function)                     \
   8182       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE, CallSite)                    \
   8183     }                                                                          \
   8184     return *AA;                                                                \
   8185   }
   8186 
   8187 #define CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS)                    \
   8188   CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) {      \
   8189     CLASS *AA = nullptr;                                                       \
   8190     switch (IRP.getPositionKind()) {                                           \
   8191       SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid")                             \
   8192       SWITCH_PK_INV(CLASS, IRP_FUNCTION, "function")                           \
   8193       SWITCH_PK_INV(CLASS, IRP_CALL_SITE, "call site")                         \
   8194       SWITCH_PK_CREATE(CLASS, IRP, IRP_FLOAT, Floating)                        \
   8195       SWITCH_PK_CREATE(CLASS, IRP, IRP_ARGUMENT, Argument)                     \
   8196       SWITCH_PK_CREATE(CLASS, IRP, IRP_RETURNED, Returned)                     \
   8197       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_RETURNED, CallSiteReturned)   \
   8198       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_ARGUMENT, CallSiteArgument)   \
   8199     }                                                                          \
   8200     return *AA;                                                                \
   8201   }
   8202 
   8203 #define CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS)                      \
   8204   CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) {      \
   8205     CLASS *AA = nullptr;                                                       \
   8206     switch (IRP.getPositionKind()) {                                           \
   8207       SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid")                             \
   8208       SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function)                     \
   8209       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE, CallSite)                    \
   8210       SWITCH_PK_CREATE(CLASS, IRP, IRP_FLOAT, Floating)                        \
   8211       SWITCH_PK_CREATE(CLASS, IRP, IRP_ARGUMENT, Argument)                     \
   8212       SWITCH_PK_CREATE(CLASS, IRP, IRP_RETURNED, Returned)                     \
   8213       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_RETURNED, CallSiteReturned)   \
   8214       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_ARGUMENT, CallSiteArgument)   \
   8215     }                                                                          \
   8216     return *AA;                                                                \
   8217   }
   8218 
   8219 #define CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS)            \
   8220   CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) {      \
   8221     CLASS *AA = nullptr;                                                       \
   8222     switch (IRP.getPositionKind()) {                                           \
   8223       SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid")                             \
   8224       SWITCH_PK_INV(CLASS, IRP_ARGUMENT, "argument")                           \
   8225       SWITCH_PK_INV(CLASS, IRP_FLOAT, "floating")                              \
   8226       SWITCH_PK_INV(CLASS, IRP_RETURNED, "returned")                           \
   8227       SWITCH_PK_INV(CLASS, IRP_CALL_SITE_RETURNED, "call site returned")       \
   8228       SWITCH_PK_INV(CLASS, IRP_CALL_SITE_ARGUMENT, "call site argument")       \
   8229       SWITCH_PK_INV(CLASS, IRP_CALL_SITE, "call site")                         \
   8230       SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function)                     \
   8231     }                                                                          \
   8232     return *AA;                                                                \
   8233   }
   8234 
   8235 #define CREATE_NON_RET_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS)                  \
   8236   CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) {      \
   8237     CLASS *AA = nullptr;                                                       \
   8238     switch (IRP.getPositionKind()) {                                           \
   8239       SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid")                             \
   8240       SWITCH_PK_INV(CLASS, IRP_RETURNED, "returned")                           \
   8241       SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function)                     \
   8242       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE, CallSite)                    \
   8243       SWITCH_PK_CREATE(CLASS, IRP, IRP_FLOAT, Floating)                        \
   8244       SWITCH_PK_CREATE(CLASS, IRP, IRP_ARGUMENT, Argument)                     \
   8245       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_RETURNED, CallSiteReturned)   \
   8246       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_ARGUMENT, CallSiteArgument)   \
   8247     }                                                                          \
   8248     return *AA;                                                                \
   8249   }
   8250 
   8251 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoUnwind)
   8252 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoSync)
   8253 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoRecurse)
   8254 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAWillReturn)
   8255 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoReturn)
   8256 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAReturnedValues)
   8257 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAMemoryLocation)
   8258 
   8259 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANonNull)
   8260 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoAlias)
   8261 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAPrivatizablePtr)
   8262 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AADereferenceable)
   8263 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAAlign)
   8264 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoCapture)
   8265 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAValueConstantRange)
   8266 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAPotentialValues)
   8267 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoUndef)
   8268 
   8269 CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAValueSimplify)
   8270 CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAIsDead)
   8271 CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoFree)
   8272 
   8273 CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAHeapToStack)
   8274 CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAReachability)
   8275 CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAUndefinedBehavior)
   8276 
   8277 CREATE_NON_RET_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAMemoryBehavior)
   8278 
   8279 #undef CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION
   8280 #undef CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION
   8281 #undef CREATE_NON_RET_ABSTRACT_ATTRIBUTE_FOR_POSITION
   8282 #undef CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION
   8283 #undef CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION
   8284 #undef SWITCH_PK_CREATE
   8285 #undef SWITCH_PK_INV
   8286