1 //===- Attributor.cpp - Module-wide attribute 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 // This file implements an inter procedural pass that deduces and/or propagating
10 // attributes. This is done in an abstract interpretation style fixpoint
11 // iteration. See the Attributor.h file comment and the class descriptions in
12 // that file for more information.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #include "llvm/Transforms/IPO/Attributor.h"
17 
18 #include "llvm/ADT/DepthFirstIterator.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/ADT/SmallPtrSet.h"
21 #include "llvm/ADT/SmallVector.h"
22 #include "llvm/ADT/Statistic.h"
23 #include "llvm/Analysis/CaptureTracking.h"
24 #include "llvm/Analysis/EHPersonalities.h"
25 #include "llvm/Analysis/GlobalsModRef.h"
26 #include "llvm/Analysis/Loads.h"
27 #include "llvm/Analysis/MemoryBuiltins.h"
28 #include "llvm/Analysis/ValueTracking.h"
29 #include "llvm/IR/Argument.h"
30 #include "llvm/IR/Attributes.h"
31 #include "llvm/IR/CFG.h"
32 #include "llvm/IR/InstIterator.h"
33 #include "llvm/IR/IntrinsicInst.h"
34 #include "llvm/Support/CommandLine.h"
35 #include "llvm/Support/Debug.h"
36 #include "llvm/Support/raw_ostream.h"
37 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
38 #include "llvm/Transforms/Utils/Local.h"
39 
40 #include <cassert>
41 
42 using namespace llvm;
43 
44 #define DEBUG_TYPE "attributor"
45 
46 STATISTIC(NumFnWithExactDefinition,
47           "Number of function with exact definitions");
48 STATISTIC(NumFnWithoutExactDefinition,
49           "Number of function without exact definitions");
50 STATISTIC(NumAttributesTimedOut,
51           "Number of abstract attributes timed out before fixpoint");
52 STATISTIC(NumAttributesValidFixpoint,
53           "Number of abstract attributes in a valid fixpoint state");
54 STATISTIC(NumAttributesManifested,
55           "Number of abstract attributes manifested in IR");
56 
57 // Some helper macros to deal with statistics tracking.
58 //
59 // Usage:
60 // For simple IR attribute tracking overload trackStatistics in the abstract
61 // attribute and choose the right STATS_DECLTRACK_********* macro,
62 // e.g.,:
63 //  void trackStatistics() const override {
64 //    STATS_DECLTRACK_ARG_ATTR(returned)
65 //  }
66 // If there is a single "increment" side one can use the macro
67 // STATS_DECLTRACK with a custom message. If there are multiple increment
68 // sides, STATS_DECL and STATS_TRACK can also be used separatly.
69 //
70 #define BUILD_STAT_MSG_IR_ATTR(TYPE, NAME)                                     \
71   ("Number of " #TYPE " marked '" #NAME "'")
72 #define BUILD_STAT_NAME(NAME, TYPE) NumIR##TYPE##_##NAME
73 #define STATS_DECL_(NAME, MSG) STATISTIC(NAME, MSG);
74 #define STATS_DECL(NAME, TYPE, MSG)                                            \
75   STATS_DECL_(BUILD_STAT_NAME(NAME, TYPE), MSG);
76 #define STATS_TRACK(NAME, TYPE) ++(BUILD_STAT_NAME(NAME, TYPE));
77 #define STATS_DECLTRACK(NAME, TYPE, MSG)                                       \
78   {                                                                            \
79     STATS_DECL(NAME, TYPE, MSG)                                                \
80     STATS_TRACK(NAME, TYPE)                                                    \
81   }
82 #define STATS_DECLTRACK_ARG_ATTR(NAME)                                         \
83   STATS_DECLTRACK(NAME, Arguments, BUILD_STAT_MSG_IR_ATTR(arguments, NAME))
84 #define STATS_DECLTRACK_CSARG_ATTR(NAME)                                       \
85   STATS_DECLTRACK(NAME, CSArguments,                                           \
86                   BUILD_STAT_MSG_IR_ATTR(call site arguments, NAME))
87 #define STATS_DECLTRACK_FN_ATTR(NAME)                                          \
88   STATS_DECLTRACK(NAME, Function, BUILD_STAT_MSG_IR_ATTR(functions, NAME))
89 #define STATS_DECLTRACK_CS_ATTR(NAME)                                          \
90   STATS_DECLTRACK(NAME, CS, BUILD_STAT_MSG_IR_ATTR(call site, NAME))
91 #define STATS_DECLTRACK_FNRET_ATTR(NAME)                                       \
92   STATS_DECLTRACK(NAME, FunctionReturn,                                        \
93                   BUILD_STAT_MSG_IR_ATTR(function returns, NAME))
94 #define STATS_DECLTRACK_CSRET_ATTR(NAME)                                       \
95   STATS_DECLTRACK(NAME, CSReturn,                                              \
96                   BUILD_STAT_MSG_IR_ATTR(call site returns, NAME))
97 #define STATS_DECLTRACK_FLOATING_ATTR(NAME)                                    \
98   STATS_DECLTRACK(NAME, Floating,                                              \
99                   ("Number of floating values known to be '" #NAME "'"))
100 
101 // TODO: Determine a good default value.
102 //
103 // In the LLVM-TS and SPEC2006, 32 seems to not induce compile time overheads
104 // (when run with the first 5 abstract attributes). The results also indicate
105 // that we never reach 32 iterations but always find a fixpoint sooner.
106 //
107 // This will become more evolved once we perform two interleaved fixpoint
108 // iterations: bottom-up and top-down.
109 static cl::opt<unsigned>
110     MaxFixpointIterations("attributor-max-iterations", cl::Hidden,
111                           cl::desc("Maximal number of fixpoint iterations."),
112                           cl::init(32));
113 static cl::opt<bool> VerifyMaxFixpointIterations(
114     "attributor-max-iterations-verify", cl::Hidden,
115     cl::desc("Verify that max-iterations is a tight bound for a fixpoint"),
116     cl::init(false));
117 
118 static cl::opt<bool> DisableAttributor(
119     "attributor-disable", cl::Hidden,
120     cl::desc("Disable the attributor inter-procedural deduction pass."),
121     cl::init(true));
122 
123 static cl::opt<bool> ManifestInternal(
124     "attributor-manifest-internal", cl::Hidden,
125     cl::desc("Manifest Attributor internal string attributes."),
126     cl::init(false));
127 
128 static cl::opt<bool> VerifyAttributor(
129     "attributor-verify", cl::Hidden,
130     cl::desc("Verify the Attributor deduction and "
131              "manifestation of attributes -- may issue false-positive errors"),
132     cl::init(false));
133 
134 static cl::opt<unsigned> DepRecInterval(
135     "attributor-dependence-recompute-interval", cl::Hidden,
136     cl::desc("Number of iterations until dependences are recomputed."),
137     cl::init(4));
138 
139 static cl::opt<bool> EnableHeapToStack("enable-heap-to-stack-conversion",
140                                        cl::init(true), cl::Hidden);
141 
142 static cl::opt<int> MaxHeapToStackSize("max-heap-to-stack-size",
143                                        cl::init(128), cl::Hidden);
144 
145 /// Logic operators for the change status enum class.
146 ///
147 ///{
148 ChangeStatus llvm::operator|(ChangeStatus l, ChangeStatus r) {
149   return l == ChangeStatus::CHANGED ? l : r;
150 }
151 ChangeStatus llvm::operator&(ChangeStatus l, ChangeStatus r) {
152   return l == ChangeStatus::UNCHANGED ? l : r;
153 }
154 ///}
155 
156 /// Recursively visit all values that might become \p IRP at some point. This
157 /// will be done by looking through cast instructions, selects, phis, and calls
158 /// with the "returned" attribute. Once we cannot look through the value any
159 /// further, the callback \p VisitValueCB is invoked and passed the current
160 /// value, the \p State, and a flag to indicate if we stripped anything. To
161 /// limit how much effort is invested, we will never visit more values than
162 /// specified by \p MaxValues.
163 template <typename AAType, typename StateTy>
164 static bool genericValueTraversal(
165     Attributor &A, IRPosition IRP, const AAType &QueryingAA, StateTy &State,
166     const function_ref<bool(Value &, StateTy &, bool)> &VisitValueCB,
167     int MaxValues = 8) {
168 
169   const AAIsDead *LivenessAA = nullptr;
170   if (IRP.getAnchorScope())
171     LivenessAA = &A.getAAFor<AAIsDead>(
172         QueryingAA, IRPosition::function(*IRP.getAnchorScope()),
173         /* TrackDependence */ false);
174   bool AnyDead = false;
175 
176   // TODO: Use Positions here to allow context sensitivity in VisitValueCB
177   SmallPtrSet<Value *, 16> Visited;
178   SmallVector<Value *, 16> Worklist;
179   Worklist.push_back(&IRP.getAssociatedValue());
180 
181   int Iteration = 0;
182   do {
183     Value *V = Worklist.pop_back_val();
184 
185     // Check if we should process the current value. To prevent endless
186     // recursion keep a record of the values we followed!
187     if (!Visited.insert(V).second)
188       continue;
189 
190     // Make sure we limit the compile time for complex expressions.
191     if (Iteration++ >= MaxValues)
192       return false;
193 
194     // Explicitly look through calls with a "returned" attribute if we do
195     // not have a pointer as stripPointerCasts only works on them.
196     Value *NewV = nullptr;
197     if (V->getType()->isPointerTy()) {
198       NewV = V->stripPointerCasts();
199     } else {
200       CallSite CS(V);
201       if (CS && CS.getCalledFunction()) {
202         for (Argument &Arg : CS.getCalledFunction()->args())
203           if (Arg.hasReturnedAttr()) {
204             NewV = CS.getArgOperand(Arg.getArgNo());
205             break;
206           }
207       }
208     }
209     if (NewV && NewV != V) {
210       Worklist.push_back(NewV);
211       continue;
212     }
213 
214     // Look through select instructions, visit both potential values.
215     if (auto *SI = dyn_cast<SelectInst>(V)) {
216       Worklist.push_back(SI->getTrueValue());
217       Worklist.push_back(SI->getFalseValue());
218       continue;
219     }
220 
221     // Look through phi nodes, visit all live operands.
222     if (auto *PHI = dyn_cast<PHINode>(V)) {
223       assert(LivenessAA &&
224              "Expected liveness in the presence of instructions!");
225       for (unsigned u = 0, e = PHI->getNumIncomingValues(); u < e; u++) {
226         const BasicBlock *IncomingBB = PHI->getIncomingBlock(u);
227         if (LivenessAA->isAssumedDead(IncomingBB->getTerminator())) {
228           AnyDead = true;
229           continue;
230         }
231         Worklist.push_back(PHI->getIncomingValue(u));
232       }
233       continue;
234     }
235 
236     // Once a leaf is reached we inform the user through the callback.
237     if (!VisitValueCB(*V, State, Iteration > 1))
238       return false;
239   } while (!Worklist.empty());
240 
241   // If we actually used liveness information so we have to record a dependence.
242   if (AnyDead)
243     A.recordDependence(*LivenessAA, QueryingAA);
244 
245   // All values have been visited.
246   return true;
247 }
248 
249 /// Return true if \p New is equal or worse than \p Old.
250 static bool isEqualOrWorse(const Attribute &New, const Attribute &Old) {
251   if (!Old.isIntAttribute())
252     return true;
253 
254   return Old.getValueAsInt() >= New.getValueAsInt();
255 }
256 
257 /// Return true if the information provided by \p Attr was added to the
258 /// attribute list \p Attrs. This is only the case if it was not already present
259 /// in \p Attrs at the position describe by \p PK and \p AttrIdx.
260 static bool addIfNotExistent(LLVMContext &Ctx, const Attribute &Attr,
261                              AttributeList &Attrs, int AttrIdx) {
262 
263   if (Attr.isEnumAttribute()) {
264     Attribute::AttrKind Kind = Attr.getKindAsEnum();
265     if (Attrs.hasAttribute(AttrIdx, Kind))
266       if (isEqualOrWorse(Attr, Attrs.getAttribute(AttrIdx, Kind)))
267         return false;
268     Attrs = Attrs.addAttribute(Ctx, AttrIdx, Attr);
269     return true;
270   }
271   if (Attr.isStringAttribute()) {
272     StringRef Kind = Attr.getKindAsString();
273     if (Attrs.hasAttribute(AttrIdx, Kind))
274       if (isEqualOrWorse(Attr, Attrs.getAttribute(AttrIdx, Kind)))
275         return false;
276     Attrs = Attrs.addAttribute(Ctx, AttrIdx, Attr);
277     return true;
278   }
279   if (Attr.isIntAttribute()) {
280     Attribute::AttrKind Kind = Attr.getKindAsEnum();
281     if (Attrs.hasAttribute(AttrIdx, Kind))
282       if (isEqualOrWorse(Attr, Attrs.getAttribute(AttrIdx, Kind)))
283         return false;
284     Attrs = Attrs.removeAttribute(Ctx, AttrIdx, Kind);
285     Attrs = Attrs.addAttribute(Ctx, AttrIdx, Attr);
286     return true;
287   }
288 
289   llvm_unreachable("Expected enum or string attribute!");
290 }
291 
292 ChangeStatus AbstractAttribute::update(Attributor &A) {
293   ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
294   if (getState().isAtFixpoint())
295     return HasChanged;
296 
297   LLVM_DEBUG(dbgs() << "[Attributor] Update: " << *this << "\n");
298 
299   HasChanged = updateImpl(A);
300 
301   LLVM_DEBUG(dbgs() << "[Attributor] Update " << HasChanged << " " << *this
302                     << "\n");
303 
304   return HasChanged;
305 }
306 
307 ChangeStatus
308 IRAttributeManifest::manifestAttrs(Attributor &A, IRPosition &IRP,
309                                    const ArrayRef<Attribute> &DeducedAttrs) {
310   Function *ScopeFn = IRP.getAssociatedFunction();
311   IRPosition::Kind PK = IRP.getPositionKind();
312 
313   // In the following some generic code that will manifest attributes in
314   // DeducedAttrs if they improve the current IR. Due to the different
315   // annotation positions we use the underlying AttributeList interface.
316 
317   AttributeList Attrs;
318   switch (PK) {
319   case IRPosition::IRP_INVALID:
320   case IRPosition::IRP_FLOAT:
321     return ChangeStatus::UNCHANGED;
322   case IRPosition::IRP_ARGUMENT:
323   case IRPosition::IRP_FUNCTION:
324   case IRPosition::IRP_RETURNED:
325     Attrs = ScopeFn->getAttributes();
326     break;
327   case IRPosition::IRP_CALL_SITE:
328   case IRPosition::IRP_CALL_SITE_RETURNED:
329   case IRPosition::IRP_CALL_SITE_ARGUMENT:
330     Attrs = ImmutableCallSite(&IRP.getAnchorValue()).getAttributes();
331     break;
332   }
333 
334   ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
335   LLVMContext &Ctx = IRP.getAnchorValue().getContext();
336   for (const Attribute &Attr : DeducedAttrs) {
337     if (!addIfNotExistent(Ctx, Attr, Attrs, IRP.getAttrIdx()))
338       continue;
339 
340     HasChanged = ChangeStatus::CHANGED;
341   }
342 
343   if (HasChanged == ChangeStatus::UNCHANGED)
344     return HasChanged;
345 
346   switch (PK) {
347   case IRPosition::IRP_ARGUMENT:
348   case IRPosition::IRP_FUNCTION:
349   case IRPosition::IRP_RETURNED:
350     ScopeFn->setAttributes(Attrs);
351     break;
352   case IRPosition::IRP_CALL_SITE:
353   case IRPosition::IRP_CALL_SITE_RETURNED:
354   case IRPosition::IRP_CALL_SITE_ARGUMENT:
355     CallSite(&IRP.getAnchorValue()).setAttributes(Attrs);
356     break;
357   case IRPosition::IRP_INVALID:
358   case IRPosition::IRP_FLOAT:
359     break;
360   }
361 
362   return HasChanged;
363 }
364 
365 const IRPosition IRPosition::EmptyKey(255);
366 const IRPosition IRPosition::TombstoneKey(256);
367 
368 SubsumingPositionIterator::SubsumingPositionIterator(const IRPosition &IRP) {
369   IRPositions.emplace_back(IRP);
370 
371   ImmutableCallSite ICS(&IRP.getAnchorValue());
372   switch (IRP.getPositionKind()) {
373   case IRPosition::IRP_INVALID:
374   case IRPosition::IRP_FLOAT:
375   case IRPosition::IRP_FUNCTION:
376     return;
377   case IRPosition::IRP_ARGUMENT:
378   case IRPosition::IRP_RETURNED:
379     IRPositions.emplace_back(
380         IRPosition::function(*IRP.getAssociatedFunction()));
381     return;
382   case IRPosition::IRP_CALL_SITE:
383     assert(ICS && "Expected call site!");
384     // TODO: We need to look at the operand bundles similar to the redirection
385     //       in CallBase.
386     if (!ICS.hasOperandBundles())
387       if (const Function *Callee = ICS.getCalledFunction())
388         IRPositions.emplace_back(IRPosition::function(*Callee));
389     return;
390   case IRPosition::IRP_CALL_SITE_RETURNED:
391     assert(ICS && "Expected call site!");
392     // TODO: We need to look at the operand bundles similar to the redirection
393     //       in CallBase.
394     if (!ICS.hasOperandBundles()) {
395       if (const Function *Callee = ICS.getCalledFunction()) {
396         IRPositions.emplace_back(IRPosition::returned(*Callee));
397         IRPositions.emplace_back(IRPosition::function(*Callee));
398       }
399     }
400     IRPositions.emplace_back(
401         IRPosition::callsite_function(cast<CallBase>(*ICS.getInstruction())));
402     return;
403   case IRPosition::IRP_CALL_SITE_ARGUMENT: {
404     int ArgNo = IRP.getArgNo();
405     assert(ICS && ArgNo >= 0 && "Expected call site!");
406     // TODO: We need to look at the operand bundles similar to the redirection
407     //       in CallBase.
408     if (!ICS.hasOperandBundles()) {
409       const Function *Callee = ICS.getCalledFunction();
410       if (Callee && Callee->arg_size() > unsigned(ArgNo))
411         IRPositions.emplace_back(IRPosition::argument(*Callee->getArg(ArgNo)));
412       if (Callee)
413         IRPositions.emplace_back(IRPosition::function(*Callee));
414     }
415     IRPositions.emplace_back(IRPosition::value(IRP.getAssociatedValue()));
416     return;
417   }
418   }
419 }
420 
421 bool IRPosition::hasAttr(ArrayRef<Attribute::AttrKind> AKs) const {
422   for (const IRPosition &EquivIRP : SubsumingPositionIterator(*this))
423     for (Attribute::AttrKind AK : AKs)
424       if (EquivIRP.getAttr(AK).getKindAsEnum() == AK)
425         return true;
426   return false;
427 }
428 
429 void IRPosition::getAttrs(ArrayRef<Attribute::AttrKind> AKs,
430                           SmallVectorImpl<Attribute> &Attrs) const {
431   for (const IRPosition &EquivIRP : SubsumingPositionIterator(*this))
432     for (Attribute::AttrKind AK : AKs) {
433       const Attribute &Attr = EquivIRP.getAttr(AK);
434       if (Attr.getKindAsEnum() == AK)
435         Attrs.push_back(Attr);
436     }
437 }
438 
439 void IRPosition::verify() {
440   switch (KindOrArgNo) {
441   default:
442     assert(KindOrArgNo >= 0 && "Expected argument or call site argument!");
443     assert((isa<CallBase>(AnchorVal) || isa<Argument>(AnchorVal)) &&
444            "Expected call base or argument for positive attribute index!");
445     if (isa<Argument>(AnchorVal)) {
446       assert(cast<Argument>(AnchorVal)->getArgNo() == unsigned(getArgNo()) &&
447              "Argument number mismatch!");
448       assert(cast<Argument>(AnchorVal) == &getAssociatedValue() &&
449              "Associated value mismatch!");
450     } else {
451       assert(cast<CallBase>(*AnchorVal).arg_size() > unsigned(getArgNo()) &&
452              "Call site argument number mismatch!");
453       assert(cast<CallBase>(*AnchorVal).getArgOperand(getArgNo()) ==
454                  &getAssociatedValue() &&
455              "Associated value mismatch!");
456     }
457     break;
458   case IRP_INVALID:
459     assert(!AnchorVal && "Expected no value for an invalid position!");
460     break;
461   case IRP_FLOAT:
462     assert((!isa<CallBase>(&getAssociatedValue()) &&
463             !isa<Argument>(&getAssociatedValue())) &&
464            "Expected specialized kind for call base and argument values!");
465     break;
466   case IRP_RETURNED:
467     assert(isa<Function>(AnchorVal) &&
468            "Expected function for a 'returned' position!");
469     assert(AnchorVal == &getAssociatedValue() && "Associated value mismatch!");
470     break;
471   case IRP_CALL_SITE_RETURNED:
472     assert((isa<CallBase>(AnchorVal)) &&
473            "Expected call base for 'call site returned' position!");
474     assert(AnchorVal == &getAssociatedValue() && "Associated value mismatch!");
475     break;
476   case IRP_CALL_SITE:
477     assert((isa<CallBase>(AnchorVal)) &&
478            "Expected call base for 'call site function' position!");
479     assert(AnchorVal == &getAssociatedValue() && "Associated value mismatch!");
480     break;
481   case IRP_FUNCTION:
482     assert(isa<Function>(AnchorVal) &&
483            "Expected function for a 'function' position!");
484     assert(AnchorVal == &getAssociatedValue() && "Associated value mismatch!");
485     break;
486   }
487 }
488 
489 namespace {
490 /// Helper functions to clamp a state \p S of type \p StateType with the
491 /// information in \p R and indicate/return if \p S did change (as-in update is
492 /// required to be run again).
493 ///
494 ///{
495 template <typename StateType>
496 ChangeStatus clampStateAndIndicateChange(StateType &S, const StateType &R);
497 
498 template <>
499 ChangeStatus clampStateAndIndicateChange<IntegerState>(IntegerState &S,
500                                                        const IntegerState &R) {
501   auto Assumed = S.getAssumed();
502   S ^= R;
503   return Assumed == S.getAssumed() ? ChangeStatus::UNCHANGED
504                                    : ChangeStatus::CHANGED;
505 }
506 
507 template <>
508 ChangeStatus clampStateAndIndicateChange<BooleanState>(BooleanState &S,
509                                                        const BooleanState &R) {
510   return clampStateAndIndicateChange<IntegerState>(S, R);
511 }
512 ///}
513 
514 /// Clamp the information known for all returned values of a function
515 /// (identified by \p QueryingAA) into \p S.
516 template <typename AAType, typename StateType = typename AAType::StateType>
517 static void clampReturnedValueStates(Attributor &A, const AAType &QueryingAA,
518                                      StateType &S) {
519   LLVM_DEBUG(dbgs() << "[Attributor] Clamp return value states for "
520                     << static_cast<const AbstractAttribute &>(QueryingAA)
521                     << " into " << S << "\n");
522 
523   assert((QueryingAA.getIRPosition().getPositionKind() ==
524               IRPosition::IRP_RETURNED ||
525           QueryingAA.getIRPosition().getPositionKind() ==
526               IRPosition::IRP_CALL_SITE_RETURNED) &&
527          "Can only clamp returned value states for a function returned or call "
528          "site returned position!");
529 
530   // Use an optional state as there might not be any return values and we want
531   // to join (IntegerState::operator&) the state of all there are.
532   Optional<StateType> T;
533 
534   // Callback for each possibly returned value.
535   auto CheckReturnValue = [&](Value &RV) -> bool {
536     const IRPosition &RVPos = IRPosition::value(RV);
537     const AAType &AA = A.getAAFor<AAType>(QueryingAA, RVPos);
538     LLVM_DEBUG(dbgs() << "[Attributor] RV: " << RV << " AA: " << AA.getAsStr()
539                       << " @ " << RVPos << "\n");
540     const StateType &AAS = static_cast<const StateType &>(AA.getState());
541     if (T.hasValue())
542       *T &= AAS;
543     else
544       T = AAS;
545     LLVM_DEBUG(dbgs() << "[Attributor] AA State: " << AAS << " RV State: " << T
546                       << "\n");
547     return T->isValidState();
548   };
549 
550   if (!A.checkForAllReturnedValues(CheckReturnValue, QueryingAA))
551     S.indicatePessimisticFixpoint();
552   else if (T.hasValue())
553     S ^= *T;
554 }
555 
556 /// Helper class for generic deduction: return value -> returned position.
557 template <typename AAType, typename Base,
558           typename StateType = typename AAType::StateType>
559 struct AAReturnedFromReturnedValues : public Base {
560   AAReturnedFromReturnedValues(const IRPosition &IRP) : Base(IRP) {}
561 
562   /// See AbstractAttribute::updateImpl(...).
563   ChangeStatus updateImpl(Attributor &A) override {
564     StateType S;
565     clampReturnedValueStates<AAType, StateType>(A, *this, S);
566     // TODO: If we know we visited all returned values, thus no are assumed
567     // dead, we can take the known information from the state T.
568     return clampStateAndIndicateChange<StateType>(this->getState(), S);
569   }
570 };
571 
572 /// Clamp the information known at all call sites for a given argument
573 /// (identified by \p QueryingAA) into \p S.
574 template <typename AAType, typename StateType = typename AAType::StateType>
575 static void clampCallSiteArgumentStates(Attributor &A, const AAType &QueryingAA,
576                                         StateType &S) {
577   LLVM_DEBUG(dbgs() << "[Attributor] Clamp call site argument states for "
578                     << static_cast<const AbstractAttribute &>(QueryingAA)
579                     << " into " << S << "\n");
580 
581   assert(QueryingAA.getIRPosition().getPositionKind() ==
582              IRPosition::IRP_ARGUMENT &&
583          "Can only clamp call site argument states for an argument position!");
584 
585   // Use an optional state as there might not be any return values and we want
586   // to join (IntegerState::operator&) the state of all there are.
587   Optional<StateType> T;
588 
589   // The argument number which is also the call site argument number.
590   unsigned ArgNo = QueryingAA.getIRPosition().getArgNo();
591 
592   auto CallSiteCheck = [&](CallSite CS) {
593     const IRPosition &CSArgPos = IRPosition::callsite_argument(CS, ArgNo);
594     const AAType &AA = A.getAAFor<AAType>(QueryingAA, CSArgPos);
595     LLVM_DEBUG(dbgs() << "[Attributor] CS: " << *CS.getInstruction()
596                       << " AA: " << AA.getAsStr() << " @" << CSArgPos << "\n");
597     const StateType &AAS = static_cast<const StateType &>(AA.getState());
598     if (T.hasValue())
599       *T &= AAS;
600     else
601       T = AAS;
602     LLVM_DEBUG(dbgs() << "[Attributor] AA State: " << AAS << " CSA State: " << T
603                       << "\n");
604     return T->isValidState();
605   };
606 
607   if (!A.checkForAllCallSites(CallSiteCheck, QueryingAA, true))
608     S.indicatePessimisticFixpoint();
609   else if (T.hasValue())
610     S ^= *T;
611 }
612 
613 /// Helper class for generic deduction: call site argument -> argument position.
614 template <typename AAType, typename Base,
615           typename StateType = typename AAType::StateType>
616 struct AAArgumentFromCallSiteArguments : public Base {
617   AAArgumentFromCallSiteArguments(const IRPosition &IRP) : Base(IRP) {}
618 
619   /// See AbstractAttribute::updateImpl(...).
620   ChangeStatus updateImpl(Attributor &A) override {
621     StateType S;
622     clampCallSiteArgumentStates<AAType, StateType>(A, *this, S);
623     // TODO: If we know we visited all incoming values, thus no are assumed
624     // dead, we can take the known information from the state T.
625     return clampStateAndIndicateChange<StateType>(this->getState(), S);
626   }
627 };
628 
629 /// Helper class for generic replication: function returned -> cs returned.
630 template <typename AAType, typename Base>
631 struct AACallSiteReturnedFromReturned : public Base {
632   AACallSiteReturnedFromReturned(const IRPosition &IRP) : Base(IRP) {}
633 
634   /// See AbstractAttribute::updateImpl(...).
635   ChangeStatus updateImpl(Attributor &A) override {
636     assert(this->getIRPosition().getPositionKind() ==
637                IRPosition::IRP_CALL_SITE_RETURNED &&
638            "Can only wrap function returned positions for call site returned "
639            "positions!");
640     auto &S = this->getState();
641 
642     const Function *AssociatedFunction =
643         this->getIRPosition().getAssociatedFunction();
644     if (!AssociatedFunction)
645       return S.indicatePessimisticFixpoint();
646 
647     IRPosition FnPos = IRPosition::returned(*AssociatedFunction);
648     const AAType &AA = A.getAAFor<AAType>(*this, FnPos);
649     return clampStateAndIndicateChange(
650         S, static_cast<const typename AAType::StateType &>(AA.getState()));
651   }
652 };
653 
654 /// -----------------------NoUnwind Function Attribute--------------------------
655 
656 struct AANoUnwindImpl : AANoUnwind {
657   AANoUnwindImpl(const IRPosition &IRP) : AANoUnwind(IRP) {}
658 
659   const std::string getAsStr() const override {
660     return getAssumed() ? "nounwind" : "may-unwind";
661   }
662 
663   /// See AbstractAttribute::updateImpl(...).
664   ChangeStatus updateImpl(Attributor &A) override {
665     auto Opcodes = {
666         (unsigned)Instruction::Invoke,      (unsigned)Instruction::CallBr,
667         (unsigned)Instruction::Call,        (unsigned)Instruction::CleanupRet,
668         (unsigned)Instruction::CatchSwitch, (unsigned)Instruction::Resume};
669 
670     auto CheckForNoUnwind = [&](Instruction &I) {
671       if (!I.mayThrow())
672         return true;
673 
674       if (ImmutableCallSite ICS = ImmutableCallSite(&I)) {
675         const auto &NoUnwindAA =
676             A.getAAFor<AANoUnwind>(*this, IRPosition::callsite_function(ICS));
677         return NoUnwindAA.isAssumedNoUnwind();
678       }
679       return false;
680     };
681 
682     if (!A.checkForAllInstructions(CheckForNoUnwind, *this, Opcodes))
683       return indicatePessimisticFixpoint();
684 
685     return ChangeStatus::UNCHANGED;
686   }
687 };
688 
689 struct AANoUnwindFunction final : public AANoUnwindImpl {
690   AANoUnwindFunction(const IRPosition &IRP) : AANoUnwindImpl(IRP) {}
691 
692   /// See AbstractAttribute::trackStatistics()
693   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nounwind) }
694 };
695 
696 /// NoUnwind attribute deduction for a call sites.
697 struct AANoUnwindCallSite final : AANoUnwindImpl {
698   AANoUnwindCallSite(const IRPosition &IRP) : AANoUnwindImpl(IRP) {}
699 
700   /// See AbstractAttribute::initialize(...).
701   void initialize(Attributor &A) override {
702     AANoUnwindImpl::initialize(A);
703     Function *F = getAssociatedFunction();
704     if (!F)
705       indicatePessimisticFixpoint();
706   }
707 
708   /// See AbstractAttribute::updateImpl(...).
709   ChangeStatus updateImpl(Attributor &A) override {
710     // TODO: Once we have call site specific value information we can provide
711     //       call site specific liveness information and then it makes
712     //       sense to specialize attributes for call sites arguments instead of
713     //       redirecting requests to the callee argument.
714     Function *F = getAssociatedFunction();
715     const IRPosition &FnPos = IRPosition::function(*F);
716     auto &FnAA = A.getAAFor<AANoUnwind>(*this, FnPos);
717     return clampStateAndIndicateChange(
718         getState(),
719         static_cast<const AANoUnwind::StateType &>(FnAA.getState()));
720   }
721 
722   /// See AbstractAttribute::trackStatistics()
723   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nounwind); }
724 };
725 
726 /// --------------------- Function Return Values -------------------------------
727 
728 /// "Attribute" that collects all potential returned values and the return
729 /// instructions that they arise from.
730 ///
731 /// If there is a unique returned value R, the manifest method will:
732 ///   - mark R with the "returned" attribute, if R is an argument.
733 class AAReturnedValuesImpl : public AAReturnedValues, public AbstractState {
734 
735   /// Mapping of values potentially returned by the associated function to the
736   /// return instructions that might return them.
737   MapVector<Value *, SmallSetVector<ReturnInst *, 4>> ReturnedValues;
738 
739   /// Mapping to remember the number of returned values for a call site such
740   /// that we can avoid updates if nothing changed.
741   DenseMap<const CallBase *, unsigned> NumReturnedValuesPerKnownAA;
742 
743   /// Set of unresolved calls returned by the associated function.
744   SmallSetVector<CallBase *, 4> UnresolvedCalls;
745 
746   /// State flags
747   ///
748   ///{
749   bool IsFixed = false;
750   bool IsValidState = true;
751   ///}
752 
753 public:
754   AAReturnedValuesImpl(const IRPosition &IRP) : AAReturnedValues(IRP) {}
755 
756   /// See AbstractAttribute::initialize(...).
757   void initialize(Attributor &A) override {
758     // Reset the state.
759     IsFixed = false;
760     IsValidState = true;
761     ReturnedValues.clear();
762 
763     Function *F = getAssociatedFunction();
764     if (!F) {
765       indicatePessimisticFixpoint();
766       return;
767     }
768 
769     // The map from instruction opcodes to those instructions in the function.
770     auto &OpcodeInstMap = A.getInfoCache().getOpcodeInstMapForFunction(*F);
771 
772     // Look through all arguments, if one is marked as returned we are done.
773     for (Argument &Arg : F->args()) {
774       if (Arg.hasReturnedAttr()) {
775         auto &ReturnInstSet = ReturnedValues[&Arg];
776         for (Instruction *RI : OpcodeInstMap[Instruction::Ret])
777           ReturnInstSet.insert(cast<ReturnInst>(RI));
778 
779         indicateOptimisticFixpoint();
780         return;
781       }
782     }
783 
784     if (!F->hasExactDefinition())
785       indicatePessimisticFixpoint();
786   }
787 
788   /// See AbstractAttribute::manifest(...).
789   ChangeStatus manifest(Attributor &A) override;
790 
791   /// See AbstractAttribute::getState(...).
792   AbstractState &getState() override { return *this; }
793 
794   /// See AbstractAttribute::getState(...).
795   const AbstractState &getState() const override { return *this; }
796 
797   /// See AbstractAttribute::updateImpl(Attributor &A).
798   ChangeStatus updateImpl(Attributor &A) override;
799 
800   llvm::iterator_range<iterator> returned_values() override {
801     return llvm::make_range(ReturnedValues.begin(), ReturnedValues.end());
802   }
803 
804   llvm::iterator_range<const_iterator> returned_values() const override {
805     return llvm::make_range(ReturnedValues.begin(), ReturnedValues.end());
806   }
807 
808   const SmallSetVector<CallBase *, 4> &getUnresolvedCalls() const override {
809     return UnresolvedCalls;
810   }
811 
812   /// Return the number of potential return values, -1 if unknown.
813   size_t getNumReturnValues() const override {
814     return isValidState() ? ReturnedValues.size() : -1;
815   }
816 
817   /// Return an assumed unique return value if a single candidate is found. If
818   /// there cannot be one, return a nullptr. If it is not clear yet, return the
819   /// Optional::NoneType.
820   Optional<Value *> getAssumedUniqueReturnValue(Attributor &A) const;
821 
822   /// See AbstractState::checkForAllReturnedValues(...).
823   bool checkForAllReturnedValuesAndReturnInsts(
824       const function_ref<bool(Value &, const SmallSetVector<ReturnInst *, 4> &)>
825           &Pred) const override;
826 
827   /// Pretty print the attribute similar to the IR representation.
828   const std::string getAsStr() const override;
829 
830   /// See AbstractState::isAtFixpoint().
831   bool isAtFixpoint() const override { return IsFixed; }
832 
833   /// See AbstractState::isValidState().
834   bool isValidState() const override { return IsValidState; }
835 
836   /// See AbstractState::indicateOptimisticFixpoint(...).
837   ChangeStatus indicateOptimisticFixpoint() override {
838     IsFixed = true;
839     return ChangeStatus::UNCHANGED;
840   }
841 
842   ChangeStatus indicatePessimisticFixpoint() override {
843     IsFixed = true;
844     IsValidState = false;
845     return ChangeStatus::CHANGED;
846   }
847 };
848 
849 ChangeStatus AAReturnedValuesImpl::manifest(Attributor &A) {
850   ChangeStatus Changed = ChangeStatus::UNCHANGED;
851 
852   // Bookkeeping.
853   assert(isValidState());
854   STATS_DECLTRACK(KnownReturnValues, FunctionReturn,
855                   "Number of function with known return values");
856 
857   // Check if we have an assumed unique return value that we could manifest.
858   Optional<Value *> UniqueRV = getAssumedUniqueReturnValue(A);
859 
860   if (!UniqueRV.hasValue() || !UniqueRV.getValue())
861     return Changed;
862 
863   // Bookkeeping.
864   STATS_DECLTRACK(UniqueReturnValue, FunctionReturn,
865                   "Number of function with unique return");
866 
867   // Callback to replace the uses of CB with the constant C.
868   auto ReplaceCallSiteUsersWith = [](CallBase &CB, Constant &C) {
869     if (CB.getNumUses() == 0)
870       return ChangeStatus::UNCHANGED;
871     CB.replaceAllUsesWith(&C);
872     return ChangeStatus::CHANGED;
873   };
874 
875   // If the assumed unique return value is an argument, annotate it.
876   if (auto *UniqueRVArg = dyn_cast<Argument>(UniqueRV.getValue())) {
877     getIRPosition() = IRPosition::argument(*UniqueRVArg);
878     Changed = IRAttribute::manifest(A);
879   } else if (auto *RVC = dyn_cast<Constant>(UniqueRV.getValue())) {
880     // We can replace the returned value with the unique returned constant.
881     Value &AnchorValue = getAnchorValue();
882     if (Function *F = dyn_cast<Function>(&AnchorValue)) {
883       for (const Use &U : F->uses())
884         if (CallBase *CB = dyn_cast<CallBase>(U.getUser()))
885           if (CB->isCallee(&U)) {
886             Constant *RVCCast =
887                 ConstantExpr::getTruncOrBitCast(RVC, CB->getType());
888             Changed = ReplaceCallSiteUsersWith(*CB, *RVCCast) | Changed;
889           }
890     } else {
891       assert(isa<CallBase>(AnchorValue) &&
892              "Expcected a function or call base anchor!");
893       Constant *RVCCast =
894           ConstantExpr::getTruncOrBitCast(RVC, AnchorValue.getType());
895       Changed = ReplaceCallSiteUsersWith(cast<CallBase>(AnchorValue), *RVCCast);
896     }
897     if (Changed == ChangeStatus::CHANGED)
898       STATS_DECLTRACK(UniqueConstantReturnValue, FunctionReturn,
899                       "Number of function returns replaced by constant return");
900   }
901 
902   return Changed;
903 }
904 
905 const std::string AAReturnedValuesImpl::getAsStr() const {
906   return (isAtFixpoint() ? "returns(#" : "may-return(#") +
907          (isValidState() ? std::to_string(getNumReturnValues()) : "?") +
908          ")[#UC: " + std::to_string(UnresolvedCalls.size()) + "]";
909 }
910 
911 Optional<Value *>
912 AAReturnedValuesImpl::getAssumedUniqueReturnValue(Attributor &A) const {
913   // If checkForAllReturnedValues provides a unique value, ignoring potential
914   // undef values that can also be present, it is assumed to be the actual
915   // return value and forwarded to the caller of this method. If there are
916   // multiple, a nullptr is returned indicating there cannot be a unique
917   // returned value.
918   Optional<Value *> UniqueRV;
919 
920   auto Pred = [&](Value &RV) -> bool {
921     // If we found a second returned value and neither the current nor the saved
922     // one is an undef, there is no unique returned value. Undefs are special
923     // since we can pretend they have any value.
924     if (UniqueRV.hasValue() && UniqueRV != &RV &&
925         !(isa<UndefValue>(RV) || isa<UndefValue>(UniqueRV.getValue()))) {
926       UniqueRV = nullptr;
927       return false;
928     }
929 
930     // Do not overwrite a value with an undef.
931     if (!UniqueRV.hasValue() || !isa<UndefValue>(RV))
932       UniqueRV = &RV;
933 
934     return true;
935   };
936 
937   if (!A.checkForAllReturnedValues(Pred, *this))
938     UniqueRV = nullptr;
939 
940   return UniqueRV;
941 }
942 
943 bool AAReturnedValuesImpl::checkForAllReturnedValuesAndReturnInsts(
944     const function_ref<bool(Value &, const SmallSetVector<ReturnInst *, 4> &)>
945         &Pred) const {
946   if (!isValidState())
947     return false;
948 
949   // Check all returned values but ignore call sites as long as we have not
950   // encountered an overdefined one during an update.
951   for (auto &It : ReturnedValues) {
952     Value *RV = It.first;
953 
954     CallBase *CB = dyn_cast<CallBase>(RV);
955     if (CB && !UnresolvedCalls.count(CB))
956       continue;
957 
958     if (!Pred(*RV, It.second))
959       return false;
960   }
961 
962   return true;
963 }
964 
965 ChangeStatus AAReturnedValuesImpl::updateImpl(Attributor &A) {
966   size_t NumUnresolvedCalls = UnresolvedCalls.size();
967   bool Changed = false;
968 
969   // State used in the value traversals starting in returned values.
970   struct RVState {
971     // The map in which we collect return values -> return instrs.
972     decltype(ReturnedValues) &RetValsMap;
973     // The flag to indicate a change.
974     bool &Changed;
975     // The return instrs we come from.
976     SmallSetVector<ReturnInst *, 4> RetInsts;
977   };
978 
979   // Callback for a leaf value returned by the associated function.
980   auto VisitValueCB = [](Value &Val, RVState &RVS, bool) -> bool {
981     auto Size = RVS.RetValsMap[&Val].size();
982     RVS.RetValsMap[&Val].insert(RVS.RetInsts.begin(), RVS.RetInsts.end());
983     bool Inserted = RVS.RetValsMap[&Val].size() != Size;
984     RVS.Changed |= Inserted;
985     LLVM_DEBUG({
986       if (Inserted)
987         dbgs() << "[AAReturnedValues] 1 Add new returned value " << Val
988                << " => " << RVS.RetInsts.size() << "\n";
989     });
990     return true;
991   };
992 
993   // Helper method to invoke the generic value traversal.
994   auto VisitReturnedValue = [&](Value &RV, RVState &RVS) {
995     IRPosition RetValPos = IRPosition::value(RV);
996     return genericValueTraversal<AAReturnedValues, RVState>(A, RetValPos, *this,
997                                                             RVS, VisitValueCB);
998   };
999 
1000   // Callback for all "return intructions" live in the associated function.
1001   auto CheckReturnInst = [this, &VisitReturnedValue, &Changed](Instruction &I) {
1002     ReturnInst &Ret = cast<ReturnInst>(I);
1003     RVState RVS({ReturnedValues, Changed, {}});
1004     RVS.RetInsts.insert(&Ret);
1005     return VisitReturnedValue(*Ret.getReturnValue(), RVS);
1006   };
1007 
1008   // Start by discovering returned values from all live returned instructions in
1009   // the associated function.
1010   if (!A.checkForAllInstructions(CheckReturnInst, *this, {Instruction::Ret}))
1011     return indicatePessimisticFixpoint();
1012 
1013   // Once returned values "directly" present in the code are handled we try to
1014   // resolve returned calls.
1015   decltype(ReturnedValues) NewRVsMap;
1016   for (auto &It : ReturnedValues) {
1017     LLVM_DEBUG(dbgs() << "[AAReturnedValues] Returned value: " << *It.first
1018                       << " by #" << It.second.size() << " RIs\n");
1019     CallBase *CB = dyn_cast<CallBase>(It.first);
1020     if (!CB || UnresolvedCalls.count(CB))
1021       continue;
1022 
1023     if (!CB->getCalledFunction()) {
1024       LLVM_DEBUG(dbgs() << "[AAReturnedValues] Unresolved call: " << *CB
1025                         << "\n");
1026       UnresolvedCalls.insert(CB);
1027       continue;
1028     }
1029 
1030     // TODO: use the function scope once we have call site AAReturnedValues.
1031     const auto &RetValAA = A.getAAFor<AAReturnedValues>(
1032         *this, IRPosition::function(*CB->getCalledFunction()));
1033     LLVM_DEBUG(dbgs() << "[AAReturnedValues] Found another AAReturnedValues: "
1034                       << static_cast<const AbstractAttribute &>(RetValAA)
1035                       << "\n");
1036 
1037     // Skip dead ends, thus if we do not know anything about the returned
1038     // call we mark it as unresolved and it will stay that way.
1039     if (!RetValAA.getState().isValidState()) {
1040       LLVM_DEBUG(dbgs() << "[AAReturnedValues] Unresolved call: " << *CB
1041                         << "\n");
1042       UnresolvedCalls.insert(CB);
1043       continue;
1044     }
1045 
1046     // Do not try to learn partial information. If the callee has unresolved
1047     // return values we will treat the call as unresolved/opaque.
1048     auto &RetValAAUnresolvedCalls = RetValAA.getUnresolvedCalls();
1049     if (!RetValAAUnresolvedCalls.empty()) {
1050       UnresolvedCalls.insert(CB);
1051       continue;
1052     }
1053 
1054     // Now check if we can track transitively returned values. If possible, thus
1055     // if all return value can be represented in the current scope, do so.
1056     bool Unresolved = false;
1057     for (auto &RetValAAIt : RetValAA.returned_values()) {
1058       Value *RetVal = RetValAAIt.first;
1059       if (isa<Argument>(RetVal) || isa<CallBase>(RetVal) ||
1060           isa<Constant>(RetVal))
1061         continue;
1062       // Anything that did not fit in the above categories cannot be resolved,
1063       // mark the call as unresolved.
1064       LLVM_DEBUG(dbgs() << "[AAReturnedValues] transitively returned value "
1065                            "cannot be translated: "
1066                         << *RetVal << "\n");
1067       UnresolvedCalls.insert(CB);
1068       Unresolved = true;
1069       break;
1070     }
1071 
1072     if (Unresolved)
1073       continue;
1074 
1075     // Now track transitively returned values.
1076     unsigned &NumRetAA = NumReturnedValuesPerKnownAA[CB];
1077     if (NumRetAA == RetValAA.getNumReturnValues()) {
1078       LLVM_DEBUG(dbgs() << "[AAReturnedValues] Skip call as it has not "
1079                            "changed since it was seen last\n");
1080       continue;
1081     }
1082     NumRetAA = RetValAA.getNumReturnValues();
1083 
1084     for (auto &RetValAAIt : RetValAA.returned_values()) {
1085       Value *RetVal = RetValAAIt.first;
1086       if (Argument *Arg = dyn_cast<Argument>(RetVal)) {
1087         // Arguments are mapped to call site operands and we begin the traversal
1088         // again.
1089         bool Unused = false;
1090         RVState RVS({NewRVsMap, Unused, RetValAAIt.second});
1091         VisitReturnedValue(*CB->getArgOperand(Arg->getArgNo()), RVS);
1092         continue;
1093       } else if (isa<CallBase>(RetVal)) {
1094         // Call sites are resolved by the callee attribute over time, no need to
1095         // do anything for us.
1096         continue;
1097       } else if (isa<Constant>(RetVal)) {
1098         // Constants are valid everywhere, we can simply take them.
1099         NewRVsMap[RetVal].insert(It.second.begin(), It.second.end());
1100         continue;
1101       }
1102     }
1103   }
1104 
1105   // To avoid modifications to the ReturnedValues map while we iterate over it
1106   // we kept record of potential new entries in a copy map, NewRVsMap.
1107   for (auto &It : NewRVsMap) {
1108     assert(!It.second.empty() && "Entry does not add anything.");
1109     auto &ReturnInsts = ReturnedValues[It.first];
1110     for (ReturnInst *RI : It.second)
1111       if (ReturnInsts.insert(RI)) {
1112         LLVM_DEBUG(dbgs() << "[AAReturnedValues] Add new returned value "
1113                           << *It.first << " => " << *RI << "\n");
1114         Changed = true;
1115       }
1116   }
1117 
1118   Changed |= (NumUnresolvedCalls != UnresolvedCalls.size());
1119   return Changed ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED;
1120 }
1121 
1122 struct AAReturnedValuesFunction final : public AAReturnedValuesImpl {
1123   AAReturnedValuesFunction(const IRPosition &IRP) : AAReturnedValuesImpl(IRP) {}
1124 
1125   /// See AbstractAttribute::trackStatistics()
1126   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(returned) }
1127 };
1128 
1129 /// Returned values information for a call sites.
1130 struct AAReturnedValuesCallSite final : AAReturnedValuesImpl {
1131   AAReturnedValuesCallSite(const IRPosition &IRP) : AAReturnedValuesImpl(IRP) {}
1132 
1133   /// See AbstractAttribute::initialize(...).
1134   void initialize(Attributor &A) override {
1135     // TODO: Once we have call site specific value information we can provide
1136     //       call site specific liveness information and then it makes
1137     //       sense to specialize attributes for call sites instead of
1138     //       redirecting requests to the callee.
1139     llvm_unreachable("Abstract attributes for returned values are not "
1140                      "supported for call sites yet!");
1141   }
1142 
1143   /// See AbstractAttribute::updateImpl(...).
1144   ChangeStatus updateImpl(Attributor &A) override {
1145     return indicatePessimisticFixpoint();
1146   }
1147 
1148   /// See AbstractAttribute::trackStatistics()
1149   void trackStatistics() const override {}
1150 };
1151 
1152 /// ------------------------ NoSync Function Attribute -------------------------
1153 
1154 struct AANoSyncImpl : AANoSync {
1155   AANoSyncImpl(const IRPosition &IRP) : AANoSync(IRP) {}
1156 
1157   const std::string getAsStr() const override {
1158     return getAssumed() ? "nosync" : "may-sync";
1159   }
1160 
1161   /// See AbstractAttribute::updateImpl(...).
1162   ChangeStatus updateImpl(Attributor &A) override;
1163 
1164   /// Helper function used to determine whether an instruction is non-relaxed
1165   /// atomic. In other words, if an atomic instruction does not have unordered
1166   /// or monotonic ordering
1167   static bool isNonRelaxedAtomic(Instruction *I);
1168 
1169   /// Helper function used to determine whether an instruction is volatile.
1170   static bool isVolatile(Instruction *I);
1171 
1172   /// Helper function uset to check if intrinsic is volatile (memcpy, memmove,
1173   /// memset).
1174   static bool isNoSyncIntrinsic(Instruction *I);
1175 };
1176 
1177 bool AANoSyncImpl::isNonRelaxedAtomic(Instruction *I) {
1178   if (!I->isAtomic())
1179     return false;
1180 
1181   AtomicOrdering Ordering;
1182   switch (I->getOpcode()) {
1183   case Instruction::AtomicRMW:
1184     Ordering = cast<AtomicRMWInst>(I)->getOrdering();
1185     break;
1186   case Instruction::Store:
1187     Ordering = cast<StoreInst>(I)->getOrdering();
1188     break;
1189   case Instruction::Load:
1190     Ordering = cast<LoadInst>(I)->getOrdering();
1191     break;
1192   case Instruction::Fence: {
1193     auto *FI = cast<FenceInst>(I);
1194     if (FI->getSyncScopeID() == SyncScope::SingleThread)
1195       return false;
1196     Ordering = FI->getOrdering();
1197     break;
1198   }
1199   case Instruction::AtomicCmpXchg: {
1200     AtomicOrdering Success = cast<AtomicCmpXchgInst>(I)->getSuccessOrdering();
1201     AtomicOrdering Failure = cast<AtomicCmpXchgInst>(I)->getFailureOrdering();
1202     // Only if both are relaxed, than it can be treated as relaxed.
1203     // Otherwise it is non-relaxed.
1204     if (Success != AtomicOrdering::Unordered &&
1205         Success != AtomicOrdering::Monotonic)
1206       return true;
1207     if (Failure != AtomicOrdering::Unordered &&
1208         Failure != AtomicOrdering::Monotonic)
1209       return true;
1210     return false;
1211   }
1212   default:
1213     llvm_unreachable(
1214         "New atomic operations need to be known in the attributor.");
1215   }
1216 
1217   // Relaxed.
1218   if (Ordering == AtomicOrdering::Unordered ||
1219       Ordering == AtomicOrdering::Monotonic)
1220     return false;
1221   return true;
1222 }
1223 
1224 /// Checks if an intrinsic is nosync. Currently only checks mem* intrinsics.
1225 /// FIXME: We should ipmrove the handling of intrinsics.
1226 bool AANoSyncImpl::isNoSyncIntrinsic(Instruction *I) {
1227   if (auto *II = dyn_cast<IntrinsicInst>(I)) {
1228     switch (II->getIntrinsicID()) {
1229     /// Element wise atomic memory intrinsics are can only be unordered,
1230     /// therefore nosync.
1231     case Intrinsic::memset_element_unordered_atomic:
1232     case Intrinsic::memmove_element_unordered_atomic:
1233     case Intrinsic::memcpy_element_unordered_atomic:
1234       return true;
1235     case Intrinsic::memset:
1236     case Intrinsic::memmove:
1237     case Intrinsic::memcpy:
1238       if (!cast<MemIntrinsic>(II)->isVolatile())
1239         return true;
1240       return false;
1241     default:
1242       return false;
1243     }
1244   }
1245   return false;
1246 }
1247 
1248 bool AANoSyncImpl::isVolatile(Instruction *I) {
1249   assert(!ImmutableCallSite(I) && !isa<CallBase>(I) &&
1250          "Calls should not be checked here");
1251 
1252   switch (I->getOpcode()) {
1253   case Instruction::AtomicRMW:
1254     return cast<AtomicRMWInst>(I)->isVolatile();
1255   case Instruction::Store:
1256     return cast<StoreInst>(I)->isVolatile();
1257   case Instruction::Load:
1258     return cast<LoadInst>(I)->isVolatile();
1259   case Instruction::AtomicCmpXchg:
1260     return cast<AtomicCmpXchgInst>(I)->isVolatile();
1261   default:
1262     return false;
1263   }
1264 }
1265 
1266 ChangeStatus AANoSyncImpl::updateImpl(Attributor &A) {
1267 
1268   auto CheckRWInstForNoSync = [&](Instruction &I) {
1269     /// We are looking for volatile instructions or Non-Relaxed atomics.
1270     /// FIXME: We should ipmrove the handling of intrinsics.
1271 
1272     if (isa<IntrinsicInst>(&I) && isNoSyncIntrinsic(&I))
1273       return true;
1274 
1275     if (ImmutableCallSite ICS = ImmutableCallSite(&I)) {
1276       if (ICS.hasFnAttr(Attribute::NoSync))
1277         return true;
1278 
1279       const auto &NoSyncAA =
1280           A.getAAFor<AANoSync>(*this, IRPosition::callsite_function(ICS));
1281       if (NoSyncAA.isAssumedNoSync())
1282         return true;
1283       return false;
1284     }
1285 
1286     if (!isVolatile(&I) && !isNonRelaxedAtomic(&I))
1287       return true;
1288 
1289     return false;
1290   };
1291 
1292   auto CheckForNoSync = [&](Instruction &I) {
1293     // At this point we handled all read/write effects and they are all
1294     // nosync, so they can be skipped.
1295     if (I.mayReadOrWriteMemory())
1296       return true;
1297 
1298     // non-convergent and readnone imply nosync.
1299     return !ImmutableCallSite(&I).isConvergent();
1300   };
1301 
1302   if (!A.checkForAllReadWriteInstructions(CheckRWInstForNoSync, *this) ||
1303       !A.checkForAllCallLikeInstructions(CheckForNoSync, *this))
1304     return indicatePessimisticFixpoint();
1305 
1306   return ChangeStatus::UNCHANGED;
1307 }
1308 
1309 struct AANoSyncFunction final : public AANoSyncImpl {
1310   AANoSyncFunction(const IRPosition &IRP) : AANoSyncImpl(IRP) {}
1311 
1312   /// See AbstractAttribute::trackStatistics()
1313   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nosync) }
1314 };
1315 
1316 /// NoSync attribute deduction for a call sites.
1317 struct AANoSyncCallSite final : AANoSyncImpl {
1318   AANoSyncCallSite(const IRPosition &IRP) : AANoSyncImpl(IRP) {}
1319 
1320   /// See AbstractAttribute::initialize(...).
1321   void initialize(Attributor &A) override {
1322     AANoSyncImpl::initialize(A);
1323     Function *F = getAssociatedFunction();
1324     if (!F)
1325       indicatePessimisticFixpoint();
1326   }
1327 
1328   /// See AbstractAttribute::updateImpl(...).
1329   ChangeStatus updateImpl(Attributor &A) override {
1330     // TODO: Once we have call site specific value information we can provide
1331     //       call site specific liveness information and then it makes
1332     //       sense to specialize attributes for call sites arguments instead of
1333     //       redirecting requests to the callee argument.
1334     Function *F = getAssociatedFunction();
1335     const IRPosition &FnPos = IRPosition::function(*F);
1336     auto &FnAA = A.getAAFor<AANoSync>(*this, FnPos);
1337     return clampStateAndIndicateChange(
1338         getState(), static_cast<const AANoSync::StateType &>(FnAA.getState()));
1339   }
1340 
1341   /// See AbstractAttribute::trackStatistics()
1342   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nosync); }
1343 };
1344 
1345 /// ------------------------ No-Free Attributes ----------------------------
1346 
1347 struct AANoFreeImpl : public AANoFree {
1348   AANoFreeImpl(const IRPosition &IRP) : AANoFree(IRP) {}
1349 
1350   /// See AbstractAttribute::updateImpl(...).
1351   ChangeStatus updateImpl(Attributor &A) override {
1352     auto CheckForNoFree = [&](Instruction &I) {
1353       ImmutableCallSite ICS(&I);
1354       if (ICS.hasFnAttr(Attribute::NoFree))
1355         return true;
1356 
1357       const auto &NoFreeAA =
1358           A.getAAFor<AANoFree>(*this, IRPosition::callsite_function(ICS));
1359       return NoFreeAA.isAssumedNoFree();
1360     };
1361 
1362     if (!A.checkForAllCallLikeInstructions(CheckForNoFree, *this))
1363       return indicatePessimisticFixpoint();
1364     return ChangeStatus::UNCHANGED;
1365   }
1366 
1367   /// See AbstractAttribute::getAsStr().
1368   const std::string getAsStr() const override {
1369     return getAssumed() ? "nofree" : "may-free";
1370   }
1371 };
1372 
1373 struct AANoFreeFunction final : public AANoFreeImpl {
1374   AANoFreeFunction(const IRPosition &IRP) : AANoFreeImpl(IRP) {}
1375 
1376   /// See AbstractAttribute::trackStatistics()
1377   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nofree) }
1378 };
1379 
1380 /// NoFree attribute deduction for a call sites.
1381 struct AANoFreeCallSite final : AANoFreeImpl {
1382   AANoFreeCallSite(const IRPosition &IRP) : AANoFreeImpl(IRP) {}
1383 
1384   /// See AbstractAttribute::initialize(...).
1385   void initialize(Attributor &A) override {
1386     AANoFreeImpl::initialize(A);
1387     Function *F = getAssociatedFunction();
1388     if (!F)
1389       indicatePessimisticFixpoint();
1390   }
1391 
1392   /// See AbstractAttribute::updateImpl(...).
1393   ChangeStatus updateImpl(Attributor &A) override {
1394     // TODO: Once we have call site specific value information we can provide
1395     //       call site specific liveness information and then it makes
1396     //       sense to specialize attributes for call sites arguments instead of
1397     //       redirecting requests to the callee argument.
1398     Function *F = getAssociatedFunction();
1399     const IRPosition &FnPos = IRPosition::function(*F);
1400     auto &FnAA = A.getAAFor<AANoFree>(*this, FnPos);
1401     return clampStateAndIndicateChange(
1402         getState(), static_cast<const AANoFree::StateType &>(FnAA.getState()));
1403   }
1404 
1405   /// See AbstractAttribute::trackStatistics()
1406   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nofree); }
1407 };
1408 
1409 /// ------------------------ NonNull Argument Attribute ------------------------
1410 struct AANonNullImpl : AANonNull {
1411   AANonNullImpl(const IRPosition &IRP) : AANonNull(IRP) {}
1412 
1413   /// See AbstractAttribute::initialize(...).
1414   void initialize(Attributor &A) override {
1415     if (hasAttr({Attribute::NonNull, Attribute::Dereferenceable}))
1416       indicateOptimisticFixpoint();
1417     else
1418       AANonNull::initialize(A);
1419   }
1420 
1421   /// See AbstractAttribute::getAsStr().
1422   const std::string getAsStr() const override {
1423     return getAssumed() ? "nonnull" : "may-null";
1424   }
1425 };
1426 
1427 /// NonNull attribute for a floating value.
1428 struct AANonNullFloating : AANonNullImpl {
1429   AANonNullFloating(const IRPosition &IRP) : AANonNullImpl(IRP) {}
1430 
1431   /// See AbstractAttribute::initialize(...).
1432   void initialize(Attributor &A) override {
1433     AANonNullImpl::initialize(A);
1434 
1435     if (isAtFixpoint())
1436       return;
1437 
1438     const IRPosition &IRP = getIRPosition();
1439     const Value &V = IRP.getAssociatedValue();
1440     const DataLayout &DL = A.getDataLayout();
1441 
1442     // TODO: This context sensitive query should be removed once we can do
1443     // context sensitive queries in the genericValueTraversal below.
1444     if (isKnownNonZero(&V, DL, 0, /* TODO: AC */ nullptr, IRP.getCtxI(),
1445                        /* TODO: DT */ nullptr))
1446       indicateOptimisticFixpoint();
1447   }
1448 
1449   /// See AbstractAttribute::updateImpl(...).
1450   ChangeStatus updateImpl(Attributor &A) override {
1451     const DataLayout &DL = A.getDataLayout();
1452 
1453     auto VisitValueCB = [&](Value &V, AAAlign::StateType &T,
1454                             bool Stripped) -> bool {
1455       const auto &AA = A.getAAFor<AANonNull>(*this, IRPosition::value(V));
1456       if (!Stripped && this == &AA) {
1457         if (!isKnownNonZero(&V, DL, 0, /* TODO: AC */ nullptr,
1458                             /* TODO: CtxI */ nullptr,
1459                             /* TODO: DT */ nullptr))
1460           T.indicatePessimisticFixpoint();
1461       } else {
1462         // Use abstract attribute information.
1463         const AANonNull::StateType &NS =
1464             static_cast<const AANonNull::StateType &>(AA.getState());
1465         T ^= NS;
1466       }
1467       return T.isValidState();
1468     };
1469 
1470     StateType T;
1471     if (!genericValueTraversal<AANonNull, StateType>(A, getIRPosition(), *this,
1472                                                      T, VisitValueCB))
1473       return indicatePessimisticFixpoint();
1474 
1475     return clampStateAndIndicateChange(getState(), T);
1476   }
1477 
1478   /// See AbstractAttribute::trackStatistics()
1479   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(nonnull) }
1480 };
1481 
1482 /// NonNull attribute for function return value.
1483 struct AANonNullReturned final
1484     : AAReturnedFromReturnedValues<AANonNull, AANonNullImpl> {
1485   AANonNullReturned(const IRPosition &IRP)
1486       : AAReturnedFromReturnedValues<AANonNull, AANonNullImpl>(IRP) {}
1487 
1488   /// See AbstractAttribute::trackStatistics()
1489   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(nonnull) }
1490 };
1491 
1492 /// NonNull attribute for function argument.
1493 struct AANonNullArgument final
1494     : AAArgumentFromCallSiteArguments<AANonNull, AANonNullImpl> {
1495   AANonNullArgument(const IRPosition &IRP)
1496       : AAArgumentFromCallSiteArguments<AANonNull, AANonNullImpl>(IRP) {}
1497 
1498   /// See AbstractAttribute::trackStatistics()
1499   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(nonnull) }
1500 };
1501 
1502 struct AANonNullCallSiteArgument final : AANonNullFloating {
1503   AANonNullCallSiteArgument(const IRPosition &IRP) : AANonNullFloating(IRP) {}
1504 
1505   /// See AbstractAttribute::trackStatistics()
1506   void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(nonnull) }
1507 };
1508 
1509 /// NonNull attribute for a call site return position.
1510 struct AANonNullCallSiteReturned final
1511     : AACallSiteReturnedFromReturned<AANonNull, AANonNullImpl> {
1512   AANonNullCallSiteReturned(const IRPosition &IRP)
1513       : AACallSiteReturnedFromReturned<AANonNull, AANonNullImpl>(IRP) {}
1514 
1515   /// See AbstractAttribute::trackStatistics()
1516   void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(nonnull) }
1517 };
1518 
1519 /// ------------------------ No-Recurse Attributes ----------------------------
1520 
1521 struct AANoRecurseImpl : public AANoRecurse {
1522   AANoRecurseImpl(const IRPosition &IRP) : AANoRecurse(IRP) {}
1523 
1524   /// See AbstractAttribute::getAsStr()
1525   const std::string getAsStr() const override {
1526     return getAssumed() ? "norecurse" : "may-recurse";
1527   }
1528 };
1529 
1530 struct AANoRecurseFunction final : AANoRecurseImpl {
1531   AANoRecurseFunction(const IRPosition &IRP) : AANoRecurseImpl(IRP) {}
1532 
1533   /// See AbstractAttribute::initialize(...).
1534   void initialize(Attributor &A) override {
1535     AANoRecurseImpl::initialize(A);
1536     if (const Function *F = getAnchorScope())
1537       if (A.getInfoCache().getSccSize(*F) == 1)
1538         return;
1539     indicatePessimisticFixpoint();
1540   }
1541 
1542   /// See AbstractAttribute::updateImpl(...).
1543   ChangeStatus updateImpl(Attributor &A) override {
1544 
1545     auto CheckForNoRecurse = [&](Instruction &I) {
1546       ImmutableCallSite ICS(&I);
1547       if (ICS.hasFnAttr(Attribute::NoRecurse))
1548         return true;
1549 
1550       const auto &NoRecurseAA =
1551           A.getAAFor<AANoRecurse>(*this, IRPosition::callsite_function(ICS));
1552       if (!NoRecurseAA.isAssumedNoRecurse())
1553         return false;
1554 
1555       // Recursion to the same function
1556       if (ICS.getCalledFunction() == getAnchorScope())
1557         return false;
1558 
1559       return true;
1560     };
1561 
1562     if (!A.checkForAllCallLikeInstructions(CheckForNoRecurse, *this))
1563       return indicatePessimisticFixpoint();
1564     return ChangeStatus::UNCHANGED;
1565   }
1566 
1567   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(norecurse) }
1568 };
1569 
1570 /// NoRecurse attribute deduction for a call sites.
1571 struct AANoRecurseCallSite final : AANoRecurseImpl {
1572   AANoRecurseCallSite(const IRPosition &IRP) : AANoRecurseImpl(IRP) {}
1573 
1574   /// See AbstractAttribute::initialize(...).
1575   void initialize(Attributor &A) override {
1576     AANoRecurseImpl::initialize(A);
1577     Function *F = getAssociatedFunction();
1578     if (!F)
1579       indicatePessimisticFixpoint();
1580   }
1581 
1582   /// See AbstractAttribute::updateImpl(...).
1583   ChangeStatus updateImpl(Attributor &A) override {
1584     // TODO: Once we have call site specific value information we can provide
1585     //       call site specific liveness information and then it makes
1586     //       sense to specialize attributes for call sites arguments instead of
1587     //       redirecting requests to the callee argument.
1588     Function *F = getAssociatedFunction();
1589     const IRPosition &FnPos = IRPosition::function(*F);
1590     auto &FnAA = A.getAAFor<AANoRecurse>(*this, FnPos);
1591     return clampStateAndIndicateChange(
1592         getState(),
1593         static_cast<const AANoRecurse::StateType &>(FnAA.getState()));
1594   }
1595 
1596   /// See AbstractAttribute::trackStatistics()
1597   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(norecurse); }
1598 };
1599 
1600 /// ------------------------ Will-Return Attributes ----------------------------
1601 
1602 // Helper function that checks whether a function has any cycle.
1603 // TODO: Replace with more efficent code
1604 static bool containsCycle(Function &F) {
1605   SmallPtrSet<BasicBlock *, 32> Visited;
1606 
1607   // Traverse BB by dfs and check whether successor is already visited.
1608   for (BasicBlock *BB : depth_first(&F)) {
1609     Visited.insert(BB);
1610     for (auto *SuccBB : successors(BB)) {
1611       if (Visited.count(SuccBB))
1612         return true;
1613     }
1614   }
1615   return false;
1616 }
1617 
1618 // Helper function that checks the function have a loop which might become an
1619 // endless loop
1620 // FIXME: Any cycle is regarded as endless loop for now.
1621 //        We have to allow some patterns.
1622 static bool containsPossiblyEndlessLoop(Function *F) {
1623   return !F || !F->hasExactDefinition() || containsCycle(*F);
1624 }
1625 
1626 struct AAWillReturnImpl : public AAWillReturn {
1627   AAWillReturnImpl(const IRPosition &IRP) : AAWillReturn(IRP) {}
1628 
1629   /// See AbstractAttribute::initialize(...).
1630   void initialize(Attributor &A) override {
1631     AAWillReturn::initialize(A);
1632 
1633     Function *F = getAssociatedFunction();
1634     if (containsPossiblyEndlessLoop(F))
1635       indicatePessimisticFixpoint();
1636   }
1637 
1638   /// See AbstractAttribute::updateImpl(...).
1639   ChangeStatus updateImpl(Attributor &A) override {
1640     auto CheckForWillReturn = [&](Instruction &I) {
1641       IRPosition IPos = IRPosition::callsite_function(ImmutableCallSite(&I));
1642       const auto &WillReturnAA = A.getAAFor<AAWillReturn>(*this, IPos);
1643       if (WillReturnAA.isKnownWillReturn())
1644         return true;
1645       if (!WillReturnAA.isAssumedWillReturn())
1646         return false;
1647       const auto &NoRecurseAA = A.getAAFor<AANoRecurse>(*this, IPos);
1648       return NoRecurseAA.isAssumedNoRecurse();
1649     };
1650 
1651     if (!A.checkForAllCallLikeInstructions(CheckForWillReturn, *this))
1652       return indicatePessimisticFixpoint();
1653 
1654     return ChangeStatus::UNCHANGED;
1655   }
1656 
1657   /// See AbstractAttribute::getAsStr()
1658   const std::string getAsStr() const override {
1659     return getAssumed() ? "willreturn" : "may-noreturn";
1660   }
1661 };
1662 
1663 struct AAWillReturnFunction final : AAWillReturnImpl {
1664   AAWillReturnFunction(const IRPosition &IRP) : AAWillReturnImpl(IRP) {}
1665 
1666   /// See AbstractAttribute::trackStatistics()
1667   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(willreturn) }
1668 };
1669 
1670 /// WillReturn attribute deduction for a call sites.
1671 struct AAWillReturnCallSite final : AAWillReturnImpl {
1672   AAWillReturnCallSite(const IRPosition &IRP) : AAWillReturnImpl(IRP) {}
1673 
1674   /// See AbstractAttribute::initialize(...).
1675   void initialize(Attributor &A) override {
1676     AAWillReturnImpl::initialize(A);
1677     Function *F = getAssociatedFunction();
1678     if (!F)
1679       indicatePessimisticFixpoint();
1680   }
1681 
1682   /// See AbstractAttribute::updateImpl(...).
1683   ChangeStatus updateImpl(Attributor &A) override {
1684     // TODO: Once we have call site specific value information we can provide
1685     //       call site specific liveness information and then it makes
1686     //       sense to specialize attributes for call sites arguments instead of
1687     //       redirecting requests to the callee argument.
1688     Function *F = getAssociatedFunction();
1689     const IRPosition &FnPos = IRPosition::function(*F);
1690     auto &FnAA = A.getAAFor<AAWillReturn>(*this, FnPos);
1691     return clampStateAndIndicateChange(
1692         getState(),
1693         static_cast<const AAWillReturn::StateType &>(FnAA.getState()));
1694   }
1695 
1696   /// See AbstractAttribute::trackStatistics()
1697   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(willreturn); }
1698 };
1699 
1700 /// ------------------------ NoAlias Argument Attribute ------------------------
1701 
1702 struct AANoAliasImpl : AANoAlias {
1703   AANoAliasImpl(const IRPosition &IRP) : AANoAlias(IRP) {}
1704 
1705   const std::string getAsStr() const override {
1706     return getAssumed() ? "noalias" : "may-alias";
1707   }
1708 };
1709 
1710 /// NoAlias attribute for a floating value.
1711 struct AANoAliasFloating final : AANoAliasImpl {
1712   AANoAliasFloating(const IRPosition &IRP) : AANoAliasImpl(IRP) {}
1713 
1714   /// See AbstractAttribute::initialize(...).
1715   void initialize(Attributor &A) override {
1716     AANoAliasImpl::initialize(A);
1717     if (isa<AllocaInst>(getAnchorValue()))
1718       indicateOptimisticFixpoint();
1719   }
1720 
1721   /// See AbstractAttribute::updateImpl(...).
1722   ChangeStatus updateImpl(Attributor &A) override {
1723     // TODO: Implement this.
1724     return indicatePessimisticFixpoint();
1725   }
1726 
1727   /// See AbstractAttribute::trackStatistics()
1728   void trackStatistics() const override {
1729     STATS_DECLTRACK_FLOATING_ATTR(noalias)
1730   }
1731 };
1732 
1733 /// NoAlias attribute for an argument.
1734 struct AANoAliasArgument final
1735     : AAArgumentFromCallSiteArguments<AANoAlias, AANoAliasImpl> {
1736   AANoAliasArgument(const IRPosition &IRP)
1737       : AAArgumentFromCallSiteArguments<AANoAlias, AANoAliasImpl>(IRP) {}
1738 
1739   /// See AbstractAttribute::trackStatistics()
1740   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(noalias) }
1741 };
1742 
1743 struct AANoAliasCallSiteArgument final : AANoAliasImpl {
1744   AANoAliasCallSiteArgument(const IRPosition &IRP) : AANoAliasImpl(IRP) {}
1745 
1746   /// See AbstractAttribute::initialize(...).
1747   void initialize(Attributor &A) override {
1748     // See callsite argument attribute and callee argument attribute.
1749     ImmutableCallSite ICS(&getAnchorValue());
1750     if (ICS.paramHasAttr(getArgNo(), Attribute::NoAlias))
1751       indicateOptimisticFixpoint();
1752   }
1753 
1754   /// See AbstractAttribute::updateImpl(...).
1755   ChangeStatus updateImpl(Attributor &A) override {
1756     // We can deduce "noalias" if the following conditions hold.
1757     // (i)   Associated value is assumed to be noalias in the definition.
1758     // (ii)  Associated value is assumed to be no-capture in all the uses
1759     //       possibly executed before this callsite.
1760     // (iii) There is no other pointer argument which could alias with the
1761     //       value.
1762 
1763     const Value &V = getAssociatedValue();
1764     const IRPosition IRP = IRPosition::value(V);
1765 
1766     // (i) Check whether noalias holds in the definition.
1767 
1768     auto &NoAliasAA = A.getAAFor<AANoAlias>(*this, IRP);
1769 
1770     if (!NoAliasAA.isAssumedNoAlias())
1771       return indicatePessimisticFixpoint();
1772 
1773     LLVM_DEBUG(dbgs() << "[Attributor][AANoAliasCSArg] " << V
1774                       << " is assumed NoAlias in the definition\n");
1775 
1776     // (ii) Check whether the value is captured in the scope using AANoCapture.
1777     //      FIXME: This is conservative though, it is better to look at CFG and
1778     //             check only uses possibly executed before this callsite.
1779 
1780     auto &NoCaptureAA = A.getAAFor<AANoCapture>(*this, IRP);
1781     if (!NoCaptureAA.isAssumedNoCaptureMaybeReturned())
1782       return indicatePessimisticFixpoint();
1783 
1784     // (iii) Check there is no other pointer argument which could alias with the
1785     // value.
1786     ImmutableCallSite ICS(&getAnchorValue());
1787     for (unsigned i = 0; i < ICS.getNumArgOperands(); i++) {
1788       if (getArgNo() == (int)i)
1789         continue;
1790       const Value *ArgOp = ICS.getArgOperand(i);
1791       if (!ArgOp->getType()->isPointerTy())
1792         continue;
1793 
1794       if (const Function *F = getAnchorScope()) {
1795         if (AAResults *AAR = A.getInfoCache().getAAResultsForFunction(*F)) {
1796           LLVM_DEBUG(dbgs()
1797                      << "[Attributor][NoAliasCSArg] Check alias between "
1798                         "callsite arguments "
1799                      << AAR->isNoAlias(&getAssociatedValue(), ArgOp) << " "
1800                      << getAssociatedValue() << " " << *ArgOp << "\n");
1801 
1802           if (AAR->isNoAlias(&getAssociatedValue(), ArgOp))
1803             continue;
1804         }
1805       }
1806       return indicatePessimisticFixpoint();
1807     }
1808 
1809     return ChangeStatus::UNCHANGED;
1810   }
1811 
1812   /// See AbstractAttribute::trackStatistics()
1813   void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(noalias) }
1814 };
1815 
1816 /// NoAlias attribute for function return value.
1817 struct AANoAliasReturned final : AANoAliasImpl {
1818   AANoAliasReturned(const IRPosition &IRP) : AANoAliasImpl(IRP) {}
1819 
1820   /// See AbstractAttribute::updateImpl(...).
1821   virtual ChangeStatus updateImpl(Attributor &A) override {
1822 
1823     auto CheckReturnValue = [&](Value &RV) -> bool {
1824       if (Constant *C = dyn_cast<Constant>(&RV))
1825         if (C->isNullValue() || isa<UndefValue>(C))
1826           return true;
1827 
1828       /// For now, we can only deduce noalias if we have call sites.
1829       /// FIXME: add more support.
1830       ImmutableCallSite ICS(&RV);
1831       if (!ICS)
1832         return false;
1833 
1834       const IRPosition &RVPos = IRPosition::value(RV);
1835       const auto &NoAliasAA = A.getAAFor<AANoAlias>(*this, RVPos);
1836       if (!NoAliasAA.isAssumedNoAlias())
1837         return false;
1838 
1839       const auto &NoCaptureAA = A.getAAFor<AANoCapture>(*this, RVPos);
1840       return NoCaptureAA.isAssumedNoCaptureMaybeReturned();
1841     };
1842 
1843     if (!A.checkForAllReturnedValues(CheckReturnValue, *this))
1844       return indicatePessimisticFixpoint();
1845 
1846     return ChangeStatus::UNCHANGED;
1847   }
1848 
1849   /// See AbstractAttribute::trackStatistics()
1850   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(noalias) }
1851 };
1852 
1853 /// NoAlias attribute deduction for a call site return value.
1854 struct AANoAliasCallSiteReturned final : AANoAliasImpl {
1855   AANoAliasCallSiteReturned(const IRPosition &IRP) : AANoAliasImpl(IRP) {}
1856 
1857   /// See AbstractAttribute::initialize(...).
1858   void initialize(Attributor &A) override {
1859     AANoAliasImpl::initialize(A);
1860     Function *F = getAssociatedFunction();
1861     if (!F)
1862       indicatePessimisticFixpoint();
1863   }
1864 
1865   /// See AbstractAttribute::updateImpl(...).
1866   ChangeStatus updateImpl(Attributor &A) override {
1867     // TODO: Once we have call site specific value information we can provide
1868     //       call site specific liveness information and then it makes
1869     //       sense to specialize attributes for call sites arguments instead of
1870     //       redirecting requests to the callee argument.
1871     Function *F = getAssociatedFunction();
1872     const IRPosition &FnPos = IRPosition::returned(*F);
1873     auto &FnAA = A.getAAFor<AANoAlias>(*this, FnPos);
1874     return clampStateAndIndicateChange(
1875         getState(), static_cast<const AANoAlias::StateType &>(FnAA.getState()));
1876   }
1877 
1878   /// See AbstractAttribute::trackStatistics()
1879   void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(noalias); }
1880 };
1881 
1882 /// -------------------AAIsDead Function Attribute-----------------------
1883 
1884 struct AAIsDeadImpl : public AAIsDead {
1885   AAIsDeadImpl(const IRPosition &IRP) : AAIsDead(IRP) {}
1886 
1887   void initialize(Attributor &A) override {
1888     const Function *F = getAssociatedFunction();
1889     if (F && !F->isDeclaration())
1890       exploreFromEntry(A, F);
1891   }
1892 
1893   void exploreFromEntry(Attributor &A, const Function *F) {
1894     ToBeExploredPaths.insert(&(F->getEntryBlock().front()));
1895 
1896     for (size_t i = 0; i < ToBeExploredPaths.size(); ++i)
1897       if (const Instruction *NextNoReturnI =
1898               findNextNoReturn(A, ToBeExploredPaths[i]))
1899         NoReturnCalls.insert(NextNoReturnI);
1900 
1901     // Mark the block live after we looked for no-return instructions.
1902     assumeLive(A, F->getEntryBlock());
1903   }
1904 
1905   /// Find the next assumed noreturn instruction in the block of \p I starting
1906   /// from, thus including, \p I.
1907   ///
1908   /// The caller is responsible to monitor the ToBeExploredPaths set as new
1909   /// instructions discovered in other basic block will be placed in there.
1910   ///
1911   /// \returns The next assumed noreturn instructions in the block of \p I
1912   ///          starting from, thus including, \p I.
1913   const Instruction *findNextNoReturn(Attributor &A, const Instruction *I);
1914 
1915   /// See AbstractAttribute::getAsStr().
1916   const std::string getAsStr() const override {
1917     return "Live[#BB " + std::to_string(AssumedLiveBlocks.size()) + "/" +
1918            std::to_string(getAssociatedFunction()->size()) + "][#NRI " +
1919            std::to_string(NoReturnCalls.size()) + "]";
1920   }
1921 
1922   /// See AbstractAttribute::manifest(...).
1923   ChangeStatus manifest(Attributor &A) override {
1924     assert(getState().isValidState() &&
1925            "Attempted to manifest an invalid state!");
1926 
1927     ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
1928     Function &F = *getAssociatedFunction();
1929 
1930     if (AssumedLiveBlocks.empty()) {
1931       A.deleteAfterManifest(F);
1932       return ChangeStatus::CHANGED;
1933     }
1934 
1935     // Flag to determine if we can change an invoke to a call assuming the
1936     // callee is nounwind. This is not possible if the personality of the
1937     // function allows to catch asynchronous exceptions.
1938     bool Invoke2CallAllowed = !mayCatchAsynchronousExceptions(F);
1939 
1940     for (const Instruction *NRC : NoReturnCalls) {
1941       Instruction *I = const_cast<Instruction *>(NRC);
1942       BasicBlock *BB = I->getParent();
1943       Instruction *SplitPos = I->getNextNode();
1944       // TODO: mark stuff before unreachable instructions as dead.
1945       if (isa_and_nonnull<UnreachableInst>(SplitPos))
1946         continue;
1947 
1948       if (auto *II = dyn_cast<InvokeInst>(I)) {
1949         // If we keep the invoke the split position is at the beginning of the
1950         // normal desitination block (it invokes a noreturn function after all).
1951         BasicBlock *NormalDestBB = II->getNormalDest();
1952         SplitPos = &NormalDestBB->front();
1953 
1954         /// Invoke is replaced with a call and unreachable is placed after it if
1955         /// the callee is nounwind and noreturn. Otherwise, we keep the invoke
1956         /// and only place an unreachable in the normal successor.
1957         if (Invoke2CallAllowed) {
1958           if (II->getCalledFunction()) {
1959             const IRPosition &IPos = IRPosition::callsite_function(*II);
1960             const auto &AANoUnw = A.getAAFor<AANoUnwind>(*this, IPos);
1961             if (AANoUnw.isAssumedNoUnwind()) {
1962               LLVM_DEBUG(dbgs()
1963                          << "[AAIsDead] Replace invoke with call inst\n");
1964               // We do not need an invoke (II) but instead want a call followed
1965               // by an unreachable. However, we do not remove II as other
1966               // abstract attributes might have it cached as part of their
1967               // results. Given that we modify the CFG anyway, we simply keep II
1968               // around but in a new dead block. To avoid II being live through
1969               // a different edge we have to ensure the block we place it in is
1970               // only reached from the current block of II and then not reached
1971               // at all when we insert the unreachable.
1972               SplitBlockPredecessors(NormalDestBB, {BB}, ".i2c");
1973               CallInst *CI = createCallMatchingInvoke(II);
1974               CI->insertBefore(II);
1975               CI->takeName(II);
1976               II->replaceAllUsesWith(CI);
1977               SplitPos = CI->getNextNode();
1978             }
1979           }
1980         }
1981 
1982         if (SplitPos == &NormalDestBB->front()) {
1983           // If this is an invoke of a noreturn function the edge to the normal
1984           // destination block is dead but not necessarily the block itself.
1985           // TODO: We need to move to an edge based system during deduction and
1986           //       also manifest.
1987           assert(!NormalDestBB->isLandingPad() &&
1988                  "Expected the normal destination not to be a landingpad!");
1989           BasicBlock *SplitBB =
1990               SplitBlockPredecessors(NormalDestBB, {BB}, ".dead");
1991           // The split block is live even if it contains only an unreachable
1992           // instruction at the end.
1993           assumeLive(A, *SplitBB);
1994           SplitPos = SplitBB->getTerminator();
1995         }
1996       }
1997 
1998       BB = SplitPos->getParent();
1999       SplitBlock(BB, SplitPos);
2000       changeToUnreachable(BB->getTerminator(), /* UseLLVMTrap */ false);
2001       HasChanged = ChangeStatus::CHANGED;
2002     }
2003 
2004     for (BasicBlock &BB : F)
2005       if (!AssumedLiveBlocks.count(&BB))
2006         A.deleteAfterManifest(BB);
2007 
2008     return HasChanged;
2009   }
2010 
2011   /// See AbstractAttribute::updateImpl(...).
2012   ChangeStatus updateImpl(Attributor &A) override;
2013 
2014   /// See AAIsDead::isAssumedDead(BasicBlock *).
2015   bool isAssumedDead(const BasicBlock *BB) const override {
2016     assert(BB->getParent() == getAssociatedFunction() &&
2017            "BB must be in the same anchor scope function.");
2018 
2019     if (!getAssumed())
2020       return false;
2021     return !AssumedLiveBlocks.count(BB);
2022   }
2023 
2024   /// See AAIsDead::isKnownDead(BasicBlock *).
2025   bool isKnownDead(const BasicBlock *BB) const override {
2026     return getKnown() && isAssumedDead(BB);
2027   }
2028 
2029   /// See AAIsDead::isAssumed(Instruction *I).
2030   bool isAssumedDead(const Instruction *I) const override {
2031     assert(I->getParent()->getParent() == getAssociatedFunction() &&
2032            "Instruction must be in the same anchor scope function.");
2033 
2034     if (!getAssumed())
2035       return false;
2036 
2037     // If it is not in AssumedLiveBlocks then it for sure dead.
2038     // Otherwise, it can still be after noreturn call in a live block.
2039     if (!AssumedLiveBlocks.count(I->getParent()))
2040       return true;
2041 
2042     // If it is not after a noreturn call, than it is live.
2043     return isAfterNoReturn(I);
2044   }
2045 
2046   /// See AAIsDead::isKnownDead(Instruction *I).
2047   bool isKnownDead(const Instruction *I) const override {
2048     return getKnown() && isAssumedDead(I);
2049   }
2050 
2051   /// Check if instruction is after noreturn call, in other words, assumed dead.
2052   bool isAfterNoReturn(const Instruction *I) const;
2053 
2054   /// Determine if \p F might catch asynchronous exceptions.
2055   static bool mayCatchAsynchronousExceptions(const Function &F) {
2056     return F.hasPersonalityFn() && !canSimplifyInvokeNoUnwind(&F);
2057   }
2058 
2059   /// Assume \p BB is (partially) live now and indicate to the Attributor \p A
2060   /// that internal function called from \p BB should now be looked at.
2061   void assumeLive(Attributor &A, const BasicBlock &BB) {
2062     if (!AssumedLiveBlocks.insert(&BB).second)
2063       return;
2064 
2065     // We assume that all of BB is (probably) live now and if there are calls to
2066     // internal functions we will assume that those are now live as well. This
2067     // is a performance optimization for blocks with calls to a lot of internal
2068     // functions. It can however cause dead functions to be treated as live.
2069     for (const Instruction &I : BB)
2070       if (ImmutableCallSite ICS = ImmutableCallSite(&I))
2071         if (const Function *F = ICS.getCalledFunction())
2072           if (F->hasInternalLinkage())
2073             A.markLiveInternalFunction(*F);
2074   }
2075 
2076   /// Collection of to be explored paths.
2077   SmallSetVector<const Instruction *, 8> ToBeExploredPaths;
2078 
2079   /// Collection of all assumed live BasicBlocks.
2080   DenseSet<const BasicBlock *> AssumedLiveBlocks;
2081 
2082   /// Collection of calls with noreturn attribute, assumed or knwon.
2083   SmallSetVector<const Instruction *, 4> NoReturnCalls;
2084 };
2085 
2086 struct AAIsDeadFunction final : public AAIsDeadImpl {
2087   AAIsDeadFunction(const IRPosition &IRP) : AAIsDeadImpl(IRP) {}
2088 
2089   /// See AbstractAttribute::trackStatistics()
2090   void trackStatistics() const override {
2091     STATS_DECL(PartiallyDeadBlocks, Function,
2092                "Number of basic blocks classified as partially dead");
2093     BUILD_STAT_NAME(PartiallyDeadBlocks, Function) += NoReturnCalls.size();
2094   }
2095 };
2096 
2097 bool AAIsDeadImpl::isAfterNoReturn(const Instruction *I) const {
2098   const Instruction *PrevI = I->getPrevNode();
2099   while (PrevI) {
2100     if (NoReturnCalls.count(PrevI))
2101       return true;
2102     PrevI = PrevI->getPrevNode();
2103   }
2104   return false;
2105 }
2106 
2107 const Instruction *AAIsDeadImpl::findNextNoReturn(Attributor &A,
2108                                                   const Instruction *I) {
2109   const BasicBlock *BB = I->getParent();
2110   const Function &F = *BB->getParent();
2111 
2112   // Flag to determine if we can change an invoke to a call assuming the callee
2113   // is nounwind. This is not possible if the personality of the function allows
2114   // to catch asynchronous exceptions.
2115   bool Invoke2CallAllowed = !mayCatchAsynchronousExceptions(F);
2116 
2117   // TODO: We should have a function that determines if an "edge" is dead.
2118   //       Edges could be from an instruction to the next or from a terminator
2119   //       to the successor. For now, we need to special case the unwind block
2120   //       of InvokeInst below.
2121 
2122   while (I) {
2123     ImmutableCallSite ICS(I);
2124 
2125     if (ICS) {
2126       const IRPosition &IPos = IRPosition::callsite_function(ICS);
2127       // Regarless of the no-return property of an invoke instruction we only
2128       // learn that the regular successor is not reachable through this
2129       // instruction but the unwind block might still be.
2130       if (auto *Invoke = dyn_cast<InvokeInst>(I)) {
2131         // Use nounwind to justify the unwind block is dead as well.
2132         const auto &AANoUnw = A.getAAFor<AANoUnwind>(*this, IPos);
2133         if (!Invoke2CallAllowed || !AANoUnw.isAssumedNoUnwind()) {
2134           assumeLive(A, *Invoke->getUnwindDest());
2135           ToBeExploredPaths.insert(&Invoke->getUnwindDest()->front());
2136         }
2137       }
2138 
2139       const auto &NoReturnAA = A.getAAFor<AANoReturn>(*this, IPos);
2140       if (NoReturnAA.isAssumedNoReturn())
2141         return I;
2142     }
2143 
2144     I = I->getNextNode();
2145   }
2146 
2147   // get new paths (reachable blocks).
2148   for (const BasicBlock *SuccBB : successors(BB)) {
2149     assumeLive(A, *SuccBB);
2150     ToBeExploredPaths.insert(&SuccBB->front());
2151   }
2152 
2153   // No noreturn instruction found.
2154   return nullptr;
2155 }
2156 
2157 ChangeStatus AAIsDeadImpl::updateImpl(Attributor &A) {
2158   ChangeStatus Status = ChangeStatus::UNCHANGED;
2159 
2160   // Temporary collection to iterate over existing noreturn instructions. This
2161   // will alow easier modification of NoReturnCalls collection
2162   SmallVector<const Instruction *, 8> NoReturnChanged;
2163 
2164   for (const Instruction *I : NoReturnCalls)
2165     NoReturnChanged.push_back(I);
2166 
2167   for (const Instruction *I : NoReturnChanged) {
2168     size_t Size = ToBeExploredPaths.size();
2169 
2170     const Instruction *NextNoReturnI = findNextNoReturn(A, I);
2171     if (NextNoReturnI != I) {
2172       Status = ChangeStatus::CHANGED;
2173       NoReturnCalls.remove(I);
2174       if (NextNoReturnI)
2175         NoReturnCalls.insert(NextNoReturnI);
2176     }
2177 
2178     // Explore new paths.
2179     while (Size != ToBeExploredPaths.size()) {
2180       Status = ChangeStatus::CHANGED;
2181       if (const Instruction *NextNoReturnI =
2182               findNextNoReturn(A, ToBeExploredPaths[Size++]))
2183         NoReturnCalls.insert(NextNoReturnI);
2184     }
2185   }
2186 
2187   LLVM_DEBUG(dbgs() << "[AAIsDead] AssumedLiveBlocks: "
2188                     << AssumedLiveBlocks.size() << " Total number of blocks: "
2189                     << getAssociatedFunction()->size() << "\n");
2190 
2191   // If we know everything is live there is no need to query for liveness.
2192   if (NoReturnCalls.empty() &&
2193       getAssociatedFunction()->size() == AssumedLiveBlocks.size()) {
2194     // Indicating a pessimistic fixpoint will cause the state to be "invalid"
2195     // which will cause the Attributor to not return the AAIsDead on request,
2196     // which will prevent us from querying isAssumedDead().
2197     indicatePessimisticFixpoint();
2198     assert(!isValidState() && "Expected an invalid state!");
2199     Status = ChangeStatus::CHANGED;
2200   }
2201 
2202   return Status;
2203 }
2204 
2205 /// Liveness information for a call sites.
2206 struct AAIsDeadCallSite final : AAIsDeadImpl {
2207   AAIsDeadCallSite(const IRPosition &IRP) : AAIsDeadImpl(IRP) {}
2208 
2209   /// See AbstractAttribute::initialize(...).
2210   void initialize(Attributor &A) override {
2211     // TODO: Once we have call site specific value information we can provide
2212     //       call site specific liveness information and then it makes
2213     //       sense to specialize attributes for call sites instead of
2214     //       redirecting requests to the callee.
2215     llvm_unreachable("Abstract attributes for liveness are not "
2216                      "supported for call sites yet!");
2217   }
2218 
2219   /// See AbstractAttribute::updateImpl(...).
2220   ChangeStatus updateImpl(Attributor &A) override {
2221     return indicatePessimisticFixpoint();
2222   }
2223 
2224   /// See AbstractAttribute::trackStatistics()
2225   void trackStatistics() const override {}
2226 };
2227 
2228 /// -------------------- Dereferenceable Argument Attribute --------------------
2229 
2230 template <>
2231 ChangeStatus clampStateAndIndicateChange<DerefState>(DerefState &S,
2232                                                      const DerefState &R) {
2233   ChangeStatus CS0 = clampStateAndIndicateChange<IntegerState>(
2234       S.DerefBytesState, R.DerefBytesState);
2235   ChangeStatus CS1 =
2236       clampStateAndIndicateChange<IntegerState>(S.GlobalState, R.GlobalState);
2237   return CS0 | CS1;
2238 }
2239 
2240 struct AADereferenceableImpl : AADereferenceable {
2241   AADereferenceableImpl(const IRPosition &IRP) : AADereferenceable(IRP) {}
2242   using StateType = DerefState;
2243 
2244   void initialize(Attributor &A) override {
2245     SmallVector<Attribute, 4> Attrs;
2246     getAttrs({Attribute::Dereferenceable, Attribute::DereferenceableOrNull},
2247              Attrs);
2248     for (const Attribute &Attr : Attrs)
2249       takeKnownDerefBytesMaximum(Attr.getValueAsInt());
2250 
2251     NonNullAA = &A.getAAFor<AANonNull>(*this, getIRPosition());
2252 
2253     const IRPosition &IRP = this->getIRPosition();
2254     bool IsFnInterface = IRP.isFnInterfaceKind();
2255     const Function *FnScope = IRP.getAnchorScope();
2256     if (IsFnInterface && (!FnScope || !FnScope->hasExactDefinition()))
2257       indicatePessimisticFixpoint();
2258   }
2259 
2260   /// See AbstractAttribute::getState()
2261   /// {
2262   StateType &getState() override { return *this; }
2263   const StateType &getState() const override { return *this; }
2264   /// }
2265 
2266   void getDeducedAttributes(LLVMContext &Ctx,
2267                             SmallVectorImpl<Attribute> &Attrs) const override {
2268     // TODO: Add *_globally support
2269     if (isAssumedNonNull())
2270       Attrs.emplace_back(Attribute::getWithDereferenceableBytes(
2271           Ctx, getAssumedDereferenceableBytes()));
2272     else
2273       Attrs.emplace_back(Attribute::getWithDereferenceableOrNullBytes(
2274           Ctx, getAssumedDereferenceableBytes()));
2275   }
2276 
2277   /// See AbstractAttribute::getAsStr().
2278   const std::string getAsStr() const override {
2279     if (!getAssumedDereferenceableBytes())
2280       return "unknown-dereferenceable";
2281     return std::string("dereferenceable") +
2282            (isAssumedNonNull() ? "" : "_or_null") +
2283            (isAssumedGlobal() ? "_globally" : "") + "<" +
2284            std::to_string(getKnownDereferenceableBytes()) + "-" +
2285            std::to_string(getAssumedDereferenceableBytes()) + ">";
2286   }
2287 };
2288 
2289 /// Dereferenceable attribute for a floating value.
2290 struct AADereferenceableFloating : AADereferenceableImpl {
2291   AADereferenceableFloating(const IRPosition &IRP)
2292       : AADereferenceableImpl(IRP) {}
2293 
2294   /// See AbstractAttribute::updateImpl(...).
2295   ChangeStatus updateImpl(Attributor &A) override {
2296     const DataLayout &DL = A.getDataLayout();
2297 
2298     auto VisitValueCB = [&](Value &V, DerefState &T, bool Stripped) -> bool {
2299       unsigned IdxWidth =
2300           DL.getIndexSizeInBits(V.getType()->getPointerAddressSpace());
2301       APInt Offset(IdxWidth, 0);
2302       const Value *Base =
2303           V.stripAndAccumulateInBoundsConstantOffsets(DL, Offset);
2304 
2305       const auto &AA =
2306           A.getAAFor<AADereferenceable>(*this, IRPosition::value(*Base));
2307       int64_t DerefBytes = 0;
2308       if (!Stripped && this == &AA) {
2309         // Use IR information if we did not strip anything.
2310         // TODO: track globally.
2311         bool CanBeNull;
2312         DerefBytes = Base->getPointerDereferenceableBytes(DL, CanBeNull);
2313         T.GlobalState.indicatePessimisticFixpoint();
2314       } else {
2315         const DerefState &DS = static_cast<const DerefState &>(AA.getState());
2316         DerefBytes = DS.DerefBytesState.getAssumed();
2317         T.GlobalState &= DS.GlobalState;
2318       }
2319 
2320       // For now we do not try to "increase" dereferenceability due to negative
2321       // indices as we first have to come up with code to deal with loops and
2322       // for overflows of the dereferenceable bytes.
2323       int64_t OffsetSExt = Offset.getSExtValue();
2324       if (OffsetSExt < 0)
2325         Offset = 0;
2326 
2327       T.takeAssumedDerefBytesMinimum(
2328           std::max(int64_t(0), DerefBytes - OffsetSExt));
2329 
2330       if (this == &AA) {
2331         if (!Stripped) {
2332           // If nothing was stripped IR information is all we got.
2333           T.takeKnownDerefBytesMaximum(
2334               std::max(int64_t(0), DerefBytes - OffsetSExt));
2335           T.indicatePessimisticFixpoint();
2336         } else if (OffsetSExt > 0) {
2337           // If something was stripped but there is circular reasoning we look
2338           // for the offset. If it is positive we basically decrease the
2339           // dereferenceable bytes in a circluar loop now, which will simply
2340           // drive them down to the known value in a very slow way which we
2341           // can accelerate.
2342           T.indicatePessimisticFixpoint();
2343         }
2344       }
2345 
2346       return T.isValidState();
2347     };
2348 
2349     DerefState T;
2350     if (!genericValueTraversal<AADereferenceable, DerefState>(
2351             A, getIRPosition(), *this, T, VisitValueCB))
2352       return indicatePessimisticFixpoint();
2353 
2354     return clampStateAndIndicateChange(getState(), T);
2355   }
2356 
2357   /// See AbstractAttribute::trackStatistics()
2358   void trackStatistics() const override {
2359     STATS_DECLTRACK_FLOATING_ATTR(dereferenceable)
2360   }
2361 };
2362 
2363 /// Dereferenceable attribute for a return value.
2364 struct AADereferenceableReturned final
2365     : AAReturnedFromReturnedValues<AADereferenceable, AADereferenceableImpl,
2366                                    DerefState> {
2367   AADereferenceableReturned(const IRPosition &IRP)
2368       : AAReturnedFromReturnedValues<AADereferenceable, AADereferenceableImpl,
2369                                      DerefState>(IRP) {}
2370 
2371   /// See AbstractAttribute::trackStatistics()
2372   void trackStatistics() const override {
2373     STATS_DECLTRACK_FNRET_ATTR(dereferenceable)
2374   }
2375 };
2376 
2377 /// Dereferenceable attribute for an argument
2378 struct AADereferenceableArgument final
2379     : AAArgumentFromCallSiteArguments<AADereferenceable, AADereferenceableImpl,
2380                                       DerefState> {
2381   AADereferenceableArgument(const IRPosition &IRP)
2382       : AAArgumentFromCallSiteArguments<AADereferenceable,
2383                                         AADereferenceableImpl, DerefState>(
2384             IRP) {}
2385 
2386   /// See AbstractAttribute::trackStatistics()
2387   void trackStatistics() const override {
2388     STATS_DECLTRACK_ARG_ATTR(dereferenceable)
2389   }
2390 };
2391 
2392 /// Dereferenceable attribute for a call site argument.
2393 struct AADereferenceableCallSiteArgument final : AADereferenceableFloating {
2394   AADereferenceableCallSiteArgument(const IRPosition &IRP)
2395       : AADereferenceableFloating(IRP) {}
2396 
2397   /// See AbstractAttribute::trackStatistics()
2398   void trackStatistics() const override {
2399     STATS_DECLTRACK_CSARG_ATTR(dereferenceable)
2400   }
2401 };
2402 
2403 /// Dereferenceable attribute deduction for a call site return value.
2404 struct AADereferenceableCallSiteReturned final : AADereferenceableImpl {
2405   AADereferenceableCallSiteReturned(const IRPosition &IRP)
2406       : AADereferenceableImpl(IRP) {}
2407 
2408   /// See AbstractAttribute::initialize(...).
2409   void initialize(Attributor &A) override {
2410     AADereferenceableImpl::initialize(A);
2411     Function *F = getAssociatedFunction();
2412     if (!F)
2413       indicatePessimisticFixpoint();
2414   }
2415 
2416   /// See AbstractAttribute::updateImpl(...).
2417   ChangeStatus updateImpl(Attributor &A) override {
2418     // TODO: Once we have call site specific value information we can provide
2419     //       call site specific liveness information and then it makes
2420     //       sense to specialize attributes for call sites arguments instead of
2421     //       redirecting requests to the callee argument.
2422     Function *F = getAssociatedFunction();
2423     const IRPosition &FnPos = IRPosition::returned(*F);
2424     auto &FnAA = A.getAAFor<AADereferenceable>(*this, FnPos);
2425     return clampStateAndIndicateChange(
2426         getState(), static_cast<const DerefState &>(FnAA.getState()));
2427   }
2428 
2429   /// See AbstractAttribute::trackStatistics()
2430   void trackStatistics() const override {
2431     STATS_DECLTRACK_CS_ATTR(dereferenceable);
2432   }
2433 };
2434 
2435 // ------------------------ Align Argument Attribute ------------------------
2436 
2437 struct AAAlignImpl : AAAlign {
2438   AAAlignImpl(const IRPosition &IRP) : AAAlign(IRP) {}
2439 
2440   // Max alignemnt value allowed in IR
2441   static const unsigned MAX_ALIGN = 1U << 29;
2442 
2443   /// See AbstractAttribute::initialize(...).
2444   void initialize(Attributor &A) override {
2445     takeAssumedMinimum(MAX_ALIGN);
2446 
2447     SmallVector<Attribute, 4> Attrs;
2448     getAttrs({Attribute::Alignment}, Attrs);
2449     for (const Attribute &Attr : Attrs)
2450       takeKnownMaximum(Attr.getValueAsInt());
2451 
2452     if (getIRPosition().isFnInterfaceKind() &&
2453         (!getAssociatedFunction() ||
2454          !getAssociatedFunction()->hasExactDefinition()))
2455       indicatePessimisticFixpoint();
2456   }
2457 
2458   /// See AbstractAttribute::manifest(...).
2459   ChangeStatus manifest(Attributor &A) override {
2460     ChangeStatus Changed = ChangeStatus::UNCHANGED;
2461 
2462     // Check for users that allow alignment annotations.
2463     Value &AnchorVal = getIRPosition().getAnchorValue();
2464     for (const Use &U : AnchorVal.uses()) {
2465       if (auto *SI = dyn_cast<StoreInst>(U.getUser())) {
2466         if (SI->getPointerOperand() == &AnchorVal)
2467           if (SI->getAlignment() < getAssumedAlign()) {
2468             STATS_DECLTRACK(AAAlign, Store,
2469                             "Number of times alignemnt added to a store");
2470             SI->setAlignment(getAssumedAlign());
2471             Changed = ChangeStatus::CHANGED;
2472           }
2473       } else if (auto *LI = dyn_cast<LoadInst>(U.getUser())) {
2474         if (LI->getPointerOperand() == &AnchorVal)
2475           if (LI->getAlignment() < getAssumedAlign()) {
2476             LI->setAlignment(getAssumedAlign());
2477             STATS_DECLTRACK(AAAlign, Load,
2478                             "Number of times alignemnt added to a load");
2479             Changed = ChangeStatus::CHANGED;
2480           }
2481       }
2482     }
2483 
2484     return AAAlign::manifest(A) | Changed;
2485   }
2486 
2487   // TODO: Provide a helper to determine the implied ABI alignment and check in
2488   //       the existing manifest method and a new one for AAAlignImpl that value
2489   //       to avoid making the alignment explicit if it did not improve.
2490 
2491   /// See AbstractAttribute::getDeducedAttributes
2492   virtual void
2493   getDeducedAttributes(LLVMContext &Ctx,
2494                        SmallVectorImpl<Attribute> &Attrs) const override {
2495     if (getAssumedAlign() > 1)
2496       Attrs.emplace_back(Attribute::getWithAlignment(Ctx, getAssumedAlign()));
2497   }
2498 
2499   /// See AbstractAttribute::getAsStr().
2500   const std::string getAsStr() const override {
2501     return getAssumedAlign() ? ("align<" + std::to_string(getKnownAlign()) +
2502                                 "-" + std::to_string(getAssumedAlign()) + ">")
2503                              : "unknown-align";
2504   }
2505 };
2506 
2507 /// Align attribute for a floating value.
2508 struct AAAlignFloating : AAAlignImpl {
2509   AAAlignFloating(const IRPosition &IRP) : AAAlignImpl(IRP) {}
2510 
2511   /// See AbstractAttribute::updateImpl(...).
2512   ChangeStatus updateImpl(Attributor &A) override {
2513     const DataLayout &DL = A.getDataLayout();
2514 
2515     auto VisitValueCB = [&](Value &V, AAAlign::StateType &T,
2516                             bool Stripped) -> bool {
2517       const auto &AA = A.getAAFor<AAAlign>(*this, IRPosition::value(V));
2518       if (!Stripped && this == &AA) {
2519         // Use only IR information if we did not strip anything.
2520         T.takeKnownMaximum(V.getPointerAlignment(DL));
2521         T.indicatePessimisticFixpoint();
2522       } else {
2523         // Use abstract attribute information.
2524         const AAAlign::StateType &DS =
2525             static_cast<const AAAlign::StateType &>(AA.getState());
2526         T ^= DS;
2527       }
2528       return T.isValidState();
2529     };
2530 
2531     StateType T;
2532     if (!genericValueTraversal<AAAlign, StateType>(A, getIRPosition(), *this, T,
2533                                                    VisitValueCB))
2534       return indicatePessimisticFixpoint();
2535 
2536     // TODO: If we know we visited all incoming values, thus no are assumed
2537     // dead, we can take the known information from the state T.
2538     return clampStateAndIndicateChange(getState(), T);
2539   }
2540 
2541   /// See AbstractAttribute::trackStatistics()
2542   void trackStatistics() const override { STATS_DECLTRACK_FLOATING_ATTR(align) }
2543 };
2544 
2545 /// Align attribute for function return value.
2546 struct AAAlignReturned final
2547     : AAReturnedFromReturnedValues<AAAlign, AAAlignImpl> {
2548   AAAlignReturned(const IRPosition &IRP)
2549       : AAReturnedFromReturnedValues<AAAlign, AAAlignImpl>(IRP) {}
2550 
2551   /// See AbstractAttribute::trackStatistics()
2552   void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(aligned) }
2553 };
2554 
2555 /// Align attribute for function argument.
2556 struct AAAlignArgument final
2557     : AAArgumentFromCallSiteArguments<AAAlign, AAAlignImpl> {
2558   AAAlignArgument(const IRPosition &IRP)
2559       : AAArgumentFromCallSiteArguments<AAAlign, AAAlignImpl>(IRP) {}
2560 
2561   /// See AbstractAttribute::trackStatistics()
2562   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(aligned) }
2563 };
2564 
2565 struct AAAlignCallSiteArgument final : AAAlignFloating {
2566   AAAlignCallSiteArgument(const IRPosition &IRP) : AAAlignFloating(IRP) {}
2567 
2568   /// See AbstractAttribute::manifest(...).
2569   ChangeStatus manifest(Attributor &A) override {
2570     return AAAlignImpl::manifest(A);
2571   }
2572 
2573   /// See AbstractAttribute::trackStatistics()
2574   void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(aligned) }
2575 };
2576 
2577 /// Align attribute deduction for a call site return value.
2578 struct AAAlignCallSiteReturned final : AAAlignImpl {
2579   AAAlignCallSiteReturned(const IRPosition &IRP) : AAAlignImpl(IRP) {}
2580 
2581   /// See AbstractAttribute::initialize(...).
2582   void initialize(Attributor &A) override {
2583     AAAlignImpl::initialize(A);
2584     Function *F = getAssociatedFunction();
2585     if (!F)
2586       indicatePessimisticFixpoint();
2587   }
2588 
2589   /// See AbstractAttribute::updateImpl(...).
2590   ChangeStatus updateImpl(Attributor &A) override {
2591     // TODO: Once we have call site specific value information we can provide
2592     //       call site specific liveness information and then it makes
2593     //       sense to specialize attributes for call sites arguments instead of
2594     //       redirecting requests to the callee argument.
2595     Function *F = getAssociatedFunction();
2596     const IRPosition &FnPos = IRPosition::returned(*F);
2597     auto &FnAA = A.getAAFor<AAAlign>(*this, FnPos);
2598     return clampStateAndIndicateChange(
2599         getState(), static_cast<const AAAlign::StateType &>(FnAA.getState()));
2600   }
2601 
2602   /// See AbstractAttribute::trackStatistics()
2603   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(align); }
2604 };
2605 
2606 /// ------------------ Function No-Return Attribute ----------------------------
2607 struct AANoReturnImpl : public AANoReturn {
2608   AANoReturnImpl(const IRPosition &IRP) : AANoReturn(IRP) {}
2609 
2610   /// See AbstractAttribute::getAsStr().
2611   const std::string getAsStr() const override {
2612     return getAssumed() ? "noreturn" : "may-return";
2613   }
2614 
2615   /// See AbstractAttribute::updateImpl(Attributor &A).
2616   virtual ChangeStatus updateImpl(Attributor &A) override {
2617     auto CheckForNoReturn = [](Instruction &) { return false; };
2618     if (!A.checkForAllInstructions(CheckForNoReturn, *this,
2619                                    {(unsigned)Instruction::Ret}))
2620       return indicatePessimisticFixpoint();
2621     return ChangeStatus::UNCHANGED;
2622   }
2623 };
2624 
2625 struct AANoReturnFunction final : AANoReturnImpl {
2626   AANoReturnFunction(const IRPosition &IRP) : AANoReturnImpl(IRP) {}
2627 
2628   /// See AbstractAttribute::trackStatistics()
2629   void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(noreturn) }
2630 };
2631 
2632 /// NoReturn attribute deduction for a call sites.
2633 struct AANoReturnCallSite final : AANoReturnImpl {
2634   AANoReturnCallSite(const IRPosition &IRP) : AANoReturnImpl(IRP) {}
2635 
2636   /// See AbstractAttribute::initialize(...).
2637   void initialize(Attributor &A) override {
2638     AANoReturnImpl::initialize(A);
2639     Function *F = getAssociatedFunction();
2640     if (!F)
2641       indicatePessimisticFixpoint();
2642   }
2643 
2644   /// See AbstractAttribute::updateImpl(...).
2645   ChangeStatus updateImpl(Attributor &A) override {
2646     // TODO: Once we have call site specific value information we can provide
2647     //       call site specific liveness information and then it makes
2648     //       sense to specialize attributes for call sites arguments instead of
2649     //       redirecting requests to the callee argument.
2650     Function *F = getAssociatedFunction();
2651     const IRPosition &FnPos = IRPosition::function(*F);
2652     auto &FnAA = A.getAAFor<AANoReturn>(*this, FnPos);
2653     return clampStateAndIndicateChange(
2654         getState(),
2655         static_cast<const AANoReturn::StateType &>(FnAA.getState()));
2656   }
2657 
2658   /// See AbstractAttribute::trackStatistics()
2659   void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(noreturn); }
2660 };
2661 
2662 /// ----------------------- Variable Capturing ---------------------------------
2663 
2664 /// A class to hold the state of for no-capture attributes.
2665 struct AANoCaptureImpl : public AANoCapture {
2666   AANoCaptureImpl(const IRPosition &IRP) : AANoCapture(IRP) {}
2667 
2668   /// See AbstractAttribute::initialize(...).
2669   void initialize(Attributor &A) override {
2670     AANoCapture::initialize(A);
2671 
2672     const IRPosition &IRP = getIRPosition();
2673     const Function *F =
2674         getArgNo() >= 0 ? IRP.getAssociatedFunction() : IRP.getAnchorScope();
2675 
2676     // Check what state the associated function can actually capture.
2677     if (F)
2678       determineFunctionCaptureCapabilities(*F, *this);
2679     else
2680       indicatePessimisticFixpoint();
2681   }
2682 
2683   /// See AbstractAttribute::updateImpl(...).
2684   ChangeStatus updateImpl(Attributor &A) override;
2685 
2686   /// see AbstractAttribute::isAssumedNoCaptureMaybeReturned(...).
2687   virtual void
2688   getDeducedAttributes(LLVMContext &Ctx,
2689                        SmallVectorImpl<Attribute> &Attrs) const override {
2690     if (!isAssumedNoCaptureMaybeReturned())
2691       return;
2692 
2693     if (getArgNo() >= 0) {
2694       if (isAssumedNoCapture())
2695         Attrs.emplace_back(Attribute::get(Ctx, Attribute::NoCapture));
2696       else if (ManifestInternal)
2697         Attrs.emplace_back(Attribute::get(Ctx, "no-capture-maybe-returned"));
2698     }
2699   }
2700 
2701   /// Set the NOT_CAPTURED_IN_MEM and NOT_CAPTURED_IN_RET bits in \p Known
2702   /// depending on the ability of the function associated with \p IRP to capture
2703   /// state in memory and through "returning/throwing", respectively.
2704   static void determineFunctionCaptureCapabilities(const Function &F,
2705                                                    IntegerState &State) {
2706     // TODO: Once we have memory behavior attributes we should use them here.
2707 
2708     // If we know we cannot communicate or write to memory, we do not care about
2709     // ptr2int anymore.
2710     if (F.onlyReadsMemory() && F.doesNotThrow() &&
2711         F.getReturnType()->isVoidTy()) {
2712       State.addKnownBits(NO_CAPTURE);
2713       return;
2714     }
2715 
2716     // A function cannot capture state in memory if it only reads memory, it can
2717     // however return/throw state and the state might be influenced by the
2718     // pointer value, e.g., loading from a returned pointer might reveal a bit.
2719     if (F.onlyReadsMemory())
2720       State.addKnownBits(NOT_CAPTURED_IN_MEM);
2721 
2722     // A function cannot communicate state back if it does not through
2723     // exceptions and doesn not return values.
2724     if (F.doesNotThrow() && F.getReturnType()->isVoidTy())
2725       State.addKnownBits(NOT_CAPTURED_IN_RET);
2726   }
2727 
2728   /// See AbstractState::getAsStr().
2729   const std::string getAsStr() const override {
2730     if (isKnownNoCapture())
2731       return "known not-captured";
2732     if (isAssumedNoCapture())
2733       return "assumed not-captured";
2734     if (isKnownNoCaptureMaybeReturned())
2735       return "known not-captured-maybe-returned";
2736     if (isAssumedNoCaptureMaybeReturned())
2737       return "assumed not-captured-maybe-returned";
2738     return "assumed-captured";
2739   }
2740 };
2741 
2742 /// Attributor-aware capture tracker.
2743 struct AACaptureUseTracker final : public CaptureTracker {
2744 
2745   /// Create a capture tracker that can lookup in-flight abstract attributes
2746   /// through the Attributor \p A.
2747   ///
2748   /// If a use leads to a potential capture, \p CapturedInMemory is set and the
2749   /// search is stopped. If a use leads to a return instruction,
2750   /// \p CommunicatedBack is set to true and \p CapturedInMemory is not changed.
2751   /// If a use leads to a ptr2int which may capture the value,
2752   /// \p CapturedInInteger is set. If a use is found that is currently assumed
2753   /// "no-capture-maybe-returned", the user is added to the \p PotentialCopies
2754   /// set. All values in \p PotentialCopies are later tracked as well. For every
2755   /// explored use we decrement \p RemainingUsesToExplore. Once it reaches 0,
2756   /// the search is stopped with \p CapturedInMemory and \p CapturedInInteger
2757   /// conservatively set to true.
2758   AACaptureUseTracker(Attributor &A, AANoCapture &NoCaptureAA,
2759                       const AAIsDead &IsDeadAA, IntegerState &State,
2760                       SmallVectorImpl<const Value *> &PotentialCopies,
2761                       unsigned &RemainingUsesToExplore)
2762       : A(A), NoCaptureAA(NoCaptureAA), IsDeadAA(IsDeadAA), State(State),
2763         PotentialCopies(PotentialCopies),
2764         RemainingUsesToExplore(RemainingUsesToExplore) {}
2765 
2766   /// Determine if \p V maybe captured. *Also updates the state!*
2767   bool valueMayBeCaptured(const Value *V) {
2768     if (V->getType()->isPointerTy()) {
2769       PointerMayBeCaptured(V, this);
2770     } else {
2771       State.indicatePessimisticFixpoint();
2772     }
2773     return State.isAssumed(AANoCapture::NO_CAPTURE_MAYBE_RETURNED);
2774   }
2775 
2776   /// See CaptureTracker::tooManyUses().
2777   void tooManyUses() override {
2778     State.removeAssumedBits(AANoCapture::NO_CAPTURE);
2779   }
2780 
2781   bool isDereferenceableOrNull(Value *O, const DataLayout &DL) override {
2782     if (CaptureTracker::isDereferenceableOrNull(O, DL))
2783       return true;
2784     const auto &DerefAA =
2785         A.getAAFor<AADereferenceable>(NoCaptureAA, IRPosition::value(*O));
2786     return DerefAA.getAssumedDereferenceableBytes();
2787   }
2788 
2789   /// See CaptureTracker::captured(...).
2790   bool captured(const Use *U) override {
2791     Instruction *UInst = cast<Instruction>(U->getUser());
2792     LLVM_DEBUG(dbgs() << "Check use: " << *U->get() << " in " << *UInst
2793                       << "\n");
2794 
2795     // Because we may reuse the tracker multiple times we keep track of the
2796     // number of explored uses ourselves as well.
2797     if (RemainingUsesToExplore-- == 0) {
2798       LLVM_DEBUG(dbgs() << " - too many uses to explore!\n");
2799       return isCapturedIn(/* Memory */ true, /* Integer */ true,
2800                           /* Return */ true);
2801     }
2802 
2803     // Deal with ptr2int by following uses.
2804     if (isa<PtrToIntInst>(UInst)) {
2805       LLVM_DEBUG(dbgs() << " - ptr2int assume the worst!\n");
2806       return valueMayBeCaptured(UInst);
2807     }
2808 
2809     // Explicitly catch return instructions.
2810     if (isa<ReturnInst>(UInst))
2811       return isCapturedIn(/* Memory */ false, /* Integer */ false,
2812                           /* Return */ true);
2813 
2814     // For now we only use special logic for call sites. However, the tracker
2815     // itself knows about a lot of other non-capturing cases already.
2816     CallSite CS(UInst);
2817     if (!CS || !CS.isArgOperand(U))
2818       return isCapturedIn(/* Memory */ true, /* Integer */ true,
2819                           /* Return */ true);
2820 
2821     unsigned ArgNo = CS.getArgumentNo(U);
2822     const IRPosition &CSArgPos = IRPosition::callsite_argument(CS, ArgNo);
2823     // If we have a abstract no-capture attribute for the argument we can use
2824     // it to justify a non-capture attribute here. This allows recursion!
2825     auto &ArgNoCaptureAA = A.getAAFor<AANoCapture>(NoCaptureAA, CSArgPos);
2826     if (ArgNoCaptureAA.isAssumedNoCapture())
2827       return isCapturedIn(/* Memory */ false, /* Integer */ false,
2828                           /* Return */ false);
2829     if (ArgNoCaptureAA.isAssumedNoCaptureMaybeReturned()) {
2830       addPotentialCopy(CS);
2831       return isCapturedIn(/* Memory */ false, /* Integer */ false,
2832                           /* Return */ false);
2833     }
2834 
2835     // Lastly, we could not find a reason no-capture can be assumed so we don't.
2836     return isCapturedIn(/* Memory */ true, /* Integer */ true,
2837                         /* Return */ true);
2838   }
2839 
2840   /// Register \p CS as potential copy of the value we are checking.
2841   void addPotentialCopy(CallSite CS) {
2842     PotentialCopies.push_back(CS.getInstruction());
2843   }
2844 
2845   /// See CaptureTracker::shouldExplore(...).
2846   bool shouldExplore(const Use *U) override {
2847     // Check liveness.
2848     return !IsDeadAA.isAssumedDead(cast<Instruction>(U->getUser()));
2849   }
2850 
2851   /// Update the state according to \p CapturedInMem, \p CapturedInInt, and
2852   /// \p CapturedInRet, then return the appropriate value for use in the
2853   /// CaptureTracker::captured() interface.
2854   bool isCapturedIn(bool CapturedInMem, bool CapturedInInt,
2855                     bool CapturedInRet) {
2856     LLVM_DEBUG(dbgs() << " - captures [Mem " << CapturedInMem << "|Int "
2857                       << CapturedInInt << "|Ret " << CapturedInRet << "]\n");
2858     if (CapturedInMem)
2859       State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_MEM);
2860     if (CapturedInInt)
2861       State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_INT);
2862     if (CapturedInRet)
2863       State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_RET);
2864     return !State.isAssumed(AANoCapture::NO_CAPTURE_MAYBE_RETURNED);
2865   }
2866 
2867 private:
2868   /// The attributor providing in-flight abstract attributes.
2869   Attributor &A;
2870 
2871   /// The abstract attribute currently updated.
2872   AANoCapture &NoCaptureAA;
2873 
2874   /// The abstract liveness state.
2875   const AAIsDead &IsDeadAA;
2876 
2877   /// The state currently updated.
2878   IntegerState &State;
2879 
2880   /// Set of potential copies of the tracked value.
2881   SmallVectorImpl<const Value *> &PotentialCopies;
2882 
2883   /// Global counter to limit the number of explored uses.
2884   unsigned &RemainingUsesToExplore;
2885 };
2886 
2887 ChangeStatus AANoCaptureImpl::updateImpl(Attributor &A) {
2888   const IRPosition &IRP = getIRPosition();
2889   const Value *V =
2890       getArgNo() >= 0 ? IRP.getAssociatedArgument() : &IRP.getAssociatedValue();
2891   if (!V)
2892     return indicatePessimisticFixpoint();
2893 
2894   const Function *F =
2895       getArgNo() >= 0 ? IRP.getAssociatedFunction() : IRP.getAnchorScope();
2896   assert(F && "Expected a function!");
2897   const auto &IsDeadAA = A.getAAFor<AAIsDead>(*this, IRPosition::function(*F));
2898 
2899   AANoCapture::StateType T;
2900   // TODO: Once we have memory behavior attributes we should use them here
2901   // similar to the reasoning in
2902   // AANoCaptureImpl::determineFunctionCaptureCapabilities(...).
2903 
2904   // TODO: Use the AAReturnedValues to learn if the argument can return or
2905   // not.
2906 
2907   // Use the CaptureTracker interface and logic with the specialized tracker,
2908   // defined in AACaptureUseTracker, that can look at in-flight abstract
2909   // attributes and directly updates the assumed state.
2910   SmallVector<const Value *, 4> PotentialCopies;
2911   unsigned RemainingUsesToExplore = DefaultMaxUsesToExplore;
2912   AACaptureUseTracker Tracker(A, *this, IsDeadAA, T, PotentialCopies,
2913                               RemainingUsesToExplore);
2914 
2915   // Check all potential copies of the associated value until we can assume
2916   // none will be captured or we have to assume at least one might be.
2917   unsigned Idx = 0;
2918   PotentialCopies.push_back(V);
2919   while (T.isAssumed(NO_CAPTURE_MAYBE_RETURNED) && Idx < PotentialCopies.size())
2920     Tracker.valueMayBeCaptured(PotentialCopies[Idx++]);
2921 
2922   AAAlign::StateType &S = getState();
2923   auto Assumed = S.getAssumed();
2924   S.intersectAssumedBits(T.getAssumed());
2925   return Assumed == S.getAssumed() ? ChangeStatus::UNCHANGED
2926                                    : ChangeStatus::CHANGED;
2927 }
2928 
2929 /// NoCapture attribute for function arguments.
2930 struct AANoCaptureArgument final : AANoCaptureImpl {
2931   AANoCaptureArgument(const IRPosition &IRP) : AANoCaptureImpl(IRP) {}
2932 
2933   /// See AbstractAttribute::trackStatistics()
2934   void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(nocapture) }
2935 };
2936 
2937 /// NoCapture attribute for call site arguments.
2938 struct AANoCaptureCallSiteArgument final : AANoCaptureImpl {
2939   AANoCaptureCallSiteArgument(const IRPosition &IRP) : AANoCaptureImpl(IRP) {}
2940 
2941   /// See AbstractAttribute::updateImpl(...).
2942   ChangeStatus updateImpl(Attributor &A) override {
2943     // TODO: Once we have call site specific value information we can provide
2944     //       call site specific liveness information and then it makes
2945     //       sense to specialize attributes for call sites arguments instead of
2946     //       redirecting requests to the callee argument.
2947     Argument *Arg = getAssociatedArgument();
2948     if (!Arg)
2949       return indicatePessimisticFixpoint();
2950     const IRPosition &ArgPos = IRPosition::argument(*Arg);
2951     auto &ArgAA = A.getAAFor<AANoCapture>(*this, ArgPos);
2952     return clampStateAndIndicateChange(
2953         getState(),
2954         static_cast<const AANoCapture::StateType &>(ArgAA.getState()));
2955   }
2956 
2957   /// See AbstractAttribute::trackStatistics()
2958   void trackStatistics() const override{STATS_DECLTRACK_CSARG_ATTR(nocapture)};
2959 };
2960 
2961 /// NoCapture attribute for floating values.
2962 struct AANoCaptureFloating final : AANoCaptureImpl {
2963   AANoCaptureFloating(const IRPosition &IRP) : AANoCaptureImpl(IRP) {}
2964 
2965   /// See AbstractAttribute::trackStatistics()
2966   void trackStatistics() const override {
2967     STATS_DECLTRACK_FLOATING_ATTR(nocapture)
2968   }
2969 };
2970 
2971 /// NoCapture attribute for function return value.
2972 struct AANoCaptureReturned final : AANoCaptureImpl {
2973   AANoCaptureReturned(const IRPosition &IRP) : AANoCaptureImpl(IRP) {
2974     llvm_unreachable("NoCapture is not applicable to function returns!");
2975   }
2976 
2977   /// See AbstractAttribute::initialize(...).
2978   void initialize(Attributor &A) override {
2979     llvm_unreachable("NoCapture is not applicable to function returns!");
2980   }
2981 
2982   /// See AbstractAttribute::updateImpl(...).
2983   ChangeStatus updateImpl(Attributor &A) override {
2984     llvm_unreachable("NoCapture is not applicable to function returns!");
2985   }
2986 
2987   /// See AbstractAttribute::trackStatistics()
2988   void trackStatistics() const override {}
2989 };
2990 
2991 /// NoCapture attribute deduction for a call site return value.
2992 struct AANoCaptureCallSiteReturned final : AANoCaptureImpl {
2993   AANoCaptureCallSiteReturned(const IRPosition &IRP) : AANoCaptureImpl(IRP) {}
2994 
2995   /// See AbstractAttribute::trackStatistics()
2996   void trackStatistics() const override {
2997     STATS_DECLTRACK_CSRET_ATTR(nocapture)
2998   }
2999 };
3000 
3001 /// ------------------ Value Simplify Attribute ----------------------------
3002 struct AAValueSimplifyImpl : AAValueSimplify {
3003   AAValueSimplifyImpl(const IRPosition &IRP) : AAValueSimplify(IRP) {}
3004 
3005   /// See AbstractAttribute::getAsStr().
3006   const std::string getAsStr() const override {
3007     return getAssumed() ? (getKnown() ? "simplified" : "maybe-simple")
3008                         : "not-simple";
3009   }
3010 
3011   /// See AbstractAttribute::trackStatistics()
3012   void trackStatistics() const override {}
3013 
3014   /// See AAValueSimplify::getAssumedSimplifiedValue()
3015   Optional<Value *> getAssumedSimplifiedValue(Attributor &A) const override {
3016     if (!getAssumed())
3017       return const_cast<Value *>(&getAssociatedValue());
3018     return SimplifiedAssociatedValue;
3019   }
3020   void initialize(Attributor &A) override {}
3021 
3022   /// Helper function for querying AAValueSimplify and updating candicate.
3023   /// \param QueryingValue Value trying to unify with SimplifiedValue
3024   /// \param AccumulatedSimplifiedValue Current simplification result.
3025   static bool checkAndUpdate(Attributor &A, const AbstractAttribute &QueryingAA,
3026                              Value &QueryingValue,
3027                              Optional<Value *> &AccumulatedSimplifiedValue) {
3028     // FIXME: Add a typecast support.
3029 
3030     auto &ValueSimpifyAA = A.getAAFor<AAValueSimplify>(
3031         QueryingAA, IRPosition::value(QueryingValue));
3032 
3033     Optional<Value *> QueryingValueSimplified =
3034         ValueSimpifyAA.getAssumedSimplifiedValue(A);
3035 
3036     if (!QueryingValueSimplified.hasValue())
3037       return true;
3038 
3039     if (!QueryingValueSimplified.getValue())
3040       return false;
3041 
3042     Value &QueryingValueSimplifiedUnwrapped =
3043         *QueryingValueSimplified.getValue();
3044 
3045     if (isa<UndefValue>(QueryingValueSimplifiedUnwrapped))
3046       return true;
3047 
3048     if (AccumulatedSimplifiedValue.hasValue())
3049       return AccumulatedSimplifiedValue == QueryingValueSimplified;
3050 
3051     LLVM_DEBUG(dbgs() << "[Attributor][ValueSimplify] " << QueryingValue
3052                       << " is assumed to be "
3053                       << QueryingValueSimplifiedUnwrapped << "\n");
3054 
3055     AccumulatedSimplifiedValue = QueryingValueSimplified;
3056     return true;
3057   }
3058 
3059   /// See AbstractAttribute::manifest(...).
3060   ChangeStatus manifest(Attributor &A) override {
3061     ChangeStatus Changed = ChangeStatus::UNCHANGED;
3062 
3063     if (!SimplifiedAssociatedValue.hasValue() ||
3064         !SimplifiedAssociatedValue.getValue())
3065       return Changed;
3066 
3067     if (auto *C = dyn_cast<Constant>(SimplifiedAssociatedValue.getValue())) {
3068       // We can replace the AssociatedValue with the constant.
3069       Value &V = getAssociatedValue();
3070       if (!V.user_empty() && &V != C && V.getType() == C->getType()) {
3071         LLVM_DEBUG(dbgs() << "[Attributor][ValueSimplify] " << V << " -> " << *C
3072                           << "\n");
3073         V.replaceAllUsesWith(C);
3074         Changed = ChangeStatus::CHANGED;
3075       }
3076     }
3077 
3078     return Changed | AAValueSimplify::manifest(A);
3079   }
3080 
3081 protected:
3082   // An assumed simplified value. Initially, it is set to Optional::None, which
3083   // means that the value is not clear under current assumption. If in the
3084   // pessimistic state, getAssumedSimplifiedValue doesn't return this value but
3085   // returns orignal associated value.
3086   Optional<Value *> SimplifiedAssociatedValue;
3087 };
3088 
3089 struct AAValueSimplifyArgument final : AAValueSimplifyImpl {
3090   AAValueSimplifyArgument(const IRPosition &IRP) : AAValueSimplifyImpl(IRP) {}
3091 
3092   /// See AbstractAttribute::updateImpl(...).
3093   ChangeStatus updateImpl(Attributor &A) override {
3094     bool HasValueBefore = SimplifiedAssociatedValue.hasValue();
3095 
3096     auto PredForCallSite = [&](CallSite CS) {
3097       return checkAndUpdate(A, *this, *CS.getArgOperand(getArgNo()),
3098                             SimplifiedAssociatedValue);
3099     };
3100 
3101     if (!A.checkForAllCallSites(PredForCallSite, *this, true))
3102       return indicatePessimisticFixpoint();
3103 
3104     // If a candicate was found in this update, return CHANGED.
3105     return HasValueBefore == SimplifiedAssociatedValue.hasValue()
3106                ? ChangeStatus::UNCHANGED
3107                : ChangeStatus ::CHANGED;
3108   }
3109 
3110   /// See AbstractAttribute::trackStatistics()
3111   void trackStatistics() const override {
3112     STATS_DECLTRACK_ARG_ATTR(value_simplify)
3113   }
3114 };
3115 
3116 struct AAValueSimplifyReturned : AAValueSimplifyImpl {
3117   AAValueSimplifyReturned(const IRPosition &IRP) : AAValueSimplifyImpl(IRP) {}
3118 
3119   /// See AbstractAttribute::updateImpl(...).
3120   ChangeStatus updateImpl(Attributor &A) override {
3121     bool HasValueBefore = SimplifiedAssociatedValue.hasValue();
3122 
3123     auto PredForReturned = [&](Value &V) {
3124       return checkAndUpdate(A, *this, V, SimplifiedAssociatedValue);
3125     };
3126 
3127     if (!A.checkForAllReturnedValues(PredForReturned, *this))
3128       return indicatePessimisticFixpoint();
3129 
3130     // If a candicate was found in this update, return CHANGED.
3131     return HasValueBefore == SimplifiedAssociatedValue.hasValue()
3132                ? ChangeStatus::UNCHANGED
3133                : ChangeStatus ::CHANGED;
3134   }
3135   /// See AbstractAttribute::trackStatistics()
3136   void trackStatistics() const override {
3137     STATS_DECLTRACK_FNRET_ATTR(value_simplify)
3138   }
3139 };
3140 
3141 struct AAValueSimplifyFloating : AAValueSimplifyImpl {
3142   AAValueSimplifyFloating(const IRPosition &IRP) : AAValueSimplifyImpl(IRP) {}
3143 
3144   /// See AbstractAttribute::initialize(...).
3145   void initialize(Attributor &A) override {
3146     Value &V = getAnchorValue();
3147 
3148     // TODO: add other stuffs
3149     if (isa<Constant>(V) || isa<UndefValue>(V))
3150       indicatePessimisticFixpoint();
3151   }
3152 
3153   /// See AbstractAttribute::updateImpl(...).
3154   ChangeStatus updateImpl(Attributor &A) override {
3155     bool HasValueBefore = SimplifiedAssociatedValue.hasValue();
3156 
3157     auto VisitValueCB = [&](Value &V, BooleanState, bool Stripped) -> bool {
3158       auto &AA = A.getAAFor<AAValueSimplify>(*this, IRPosition::value(V));
3159       if (!Stripped && this == &AA) {
3160         // TODO: Look the instruction and check recursively.
3161         LLVM_DEBUG(
3162             dbgs() << "[Attributor][ValueSimplify] Can't be stripped more : "
3163                    << V << "\n");
3164         indicatePessimisticFixpoint();
3165         return false;
3166       }
3167       return checkAndUpdate(A, *this, V, SimplifiedAssociatedValue);
3168     };
3169 
3170     if (!genericValueTraversal<AAValueSimplify, BooleanState>(
3171             A, getIRPosition(), *this, static_cast<BooleanState &>(*this),
3172             VisitValueCB))
3173       return indicatePessimisticFixpoint();
3174 
3175     // If a candicate was found in this update, return CHANGED.
3176 
3177     return HasValueBefore == SimplifiedAssociatedValue.hasValue()
3178                ? ChangeStatus::UNCHANGED
3179                : ChangeStatus ::CHANGED;
3180   }
3181 
3182   /// See AbstractAttribute::trackStatistics()
3183   void trackStatistics() const override {
3184     STATS_DECLTRACK_FLOATING_ATTR(value_simplify)
3185   }
3186 };
3187 
3188 struct AAValueSimplifyFunction : AAValueSimplifyImpl {
3189   AAValueSimplifyFunction(const IRPosition &IRP) : AAValueSimplifyImpl(IRP) {}
3190 
3191   /// See AbstractAttribute::initialize(...).
3192   void initialize(Attributor &A) override {
3193     SimplifiedAssociatedValue = &getAnchorValue();
3194     indicateOptimisticFixpoint();
3195   }
3196   /// See AbstractAttribute::initialize(...).
3197   ChangeStatus updateImpl(Attributor &A) override {
3198     llvm_unreachable(
3199         "AAValueSimplify(Function|CallSite)::updateImpl will not be called");
3200   }
3201   /// See AbstractAttribute::trackStatistics()
3202   void trackStatistics() const override {
3203     STATS_DECLTRACK_FN_ATTR(value_simplify)
3204   }
3205 };
3206 
3207 struct AAValueSimplifyCallSite : AAValueSimplifyFunction {
3208   AAValueSimplifyCallSite(const IRPosition &IRP)
3209       : AAValueSimplifyFunction(IRP) {}
3210   /// See AbstractAttribute::trackStatistics()
3211   void trackStatistics() const override {
3212     STATS_DECLTRACK_CS_ATTR(value_simplify)
3213   }
3214 };
3215 
3216 struct AAValueSimplifyCallSiteReturned : AAValueSimplifyReturned {
3217   AAValueSimplifyCallSiteReturned(const IRPosition &IRP)
3218       : AAValueSimplifyReturned(IRP) {}
3219 
3220   void trackStatistics() const override {
3221     STATS_DECLTRACK_CSRET_ATTR(value_simplify)
3222   }
3223 };
3224 struct AAValueSimplifyCallSiteArgument : AAValueSimplifyFloating {
3225   AAValueSimplifyCallSiteArgument(const IRPosition &IRP)
3226       : AAValueSimplifyFloating(IRP) {}
3227 
3228   void trackStatistics() const override {
3229     STATS_DECLTRACK_CSARG_ATTR(value_simplify)
3230   }
3231 };
3232 
3233 /// ----------------------- Heap-To-Stack Conversion ---------------------------
3234 struct AAHeapToStackImpl : public AAHeapToStack {
3235   AAHeapToStackImpl(const IRPosition &IRP) : AAHeapToStack(IRP) {}
3236 
3237   const std::string getAsStr() const override {
3238     return "[H2S] Mallocs: " + std::to_string(MallocCalls.size());
3239   }
3240 
3241   ChangeStatus manifest(Attributor &A) override {
3242     assert(getState().isValidState() &&
3243            "Attempted to manifest an invalid state!");
3244 
3245     ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
3246     Function *F = getAssociatedFunction();
3247     const auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(*F);
3248 
3249     for (Instruction *MallocCall : MallocCalls) {
3250       // This malloc cannot be replaced.
3251       if (BadMallocCalls.count(MallocCall))
3252         continue;
3253 
3254       for (Instruction *FreeCall : FreesForMalloc[MallocCall]) {
3255         LLVM_DEBUG(dbgs() << "H2S: Removing free call: " << *FreeCall << "\n");
3256         A.deleteAfterManifest(*FreeCall);
3257         HasChanged = ChangeStatus::CHANGED;
3258       }
3259 
3260       LLVM_DEBUG(dbgs() << "H2S: Removing malloc call: " << *MallocCall
3261                         << "\n");
3262 
3263       Constant *Size;
3264       if (isCallocLikeFn(MallocCall, TLI)) {
3265         auto *Num = cast<ConstantInt>(MallocCall->getOperand(0));
3266         auto *SizeT = dyn_cast<ConstantInt>(MallocCall->getOperand(1));
3267         APInt TotalSize = SizeT->getValue() * Num->getValue();
3268         Size =
3269             ConstantInt::get(MallocCall->getOperand(0)->getType(), TotalSize);
3270       } else {
3271         Size = cast<ConstantInt>(MallocCall->getOperand(0));
3272       }
3273 
3274       unsigned AS = cast<PointerType>(MallocCall->getType())->getAddressSpace();
3275       Instruction *AI = new AllocaInst(Type::getInt8Ty(F->getContext()), AS,
3276                                        Size, "", MallocCall->getNextNode());
3277 
3278       if (AI->getType() != MallocCall->getType())
3279         AI = new BitCastInst(AI, MallocCall->getType(), "malloc_bc",
3280                              AI->getNextNode());
3281 
3282       MallocCall->replaceAllUsesWith(AI);
3283 
3284       if (auto *II = dyn_cast<InvokeInst>(MallocCall)) {
3285         auto *NBB = II->getNormalDest();
3286         BranchInst::Create(NBB, MallocCall->getParent());
3287         A.deleteAfterManifest(*MallocCall);
3288       } else {
3289         A.deleteAfterManifest(*MallocCall);
3290       }
3291 
3292       if (isCallocLikeFn(MallocCall, TLI)) {
3293         auto *BI = new BitCastInst(AI, MallocCall->getType(), "calloc_bc",
3294                                    AI->getNextNode());
3295         Value *Ops[] = {
3296             BI, ConstantInt::get(F->getContext(), APInt(8, 0, false)), Size,
3297             ConstantInt::get(Type::getInt1Ty(F->getContext()), false)};
3298 
3299         Type *Tys[] = {BI->getType(), MallocCall->getOperand(0)->getType()};
3300         Module *M = F->getParent();
3301         Function *Fn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys);
3302         CallInst::Create(Fn, Ops, "", BI->getNextNode());
3303       }
3304       HasChanged = ChangeStatus::CHANGED;
3305     }
3306 
3307     return HasChanged;
3308   }
3309 
3310   /// Collection of all malloc calls in a function.
3311   SmallSetVector<Instruction *, 4> MallocCalls;
3312 
3313   /// Collection of malloc calls that cannot be converted.
3314   DenseSet<const Instruction *> BadMallocCalls;
3315 
3316   /// A map for each malloc call to the set of associated free calls.
3317   DenseMap<Instruction *, SmallPtrSet<Instruction *, 4>> FreesForMalloc;
3318 
3319   ChangeStatus updateImpl(Attributor &A) override;
3320 };
3321 
3322 ChangeStatus AAHeapToStackImpl::updateImpl(Attributor &A) {
3323   const Function *F = getAssociatedFunction();
3324   const auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(*F);
3325 
3326   auto UsesCheck = [&](Instruction &I) {
3327     SmallPtrSet<const Use *, 8> Visited;
3328     SmallVector<const Use *, 8> Worklist;
3329 
3330     for (Use &U : I.uses())
3331       Worklist.push_back(&U);
3332 
3333     while (!Worklist.empty()) {
3334       const Use *U = Worklist.pop_back_val();
3335       if (!Visited.insert(U).second)
3336         continue;
3337 
3338       auto *UserI = U->getUser();
3339 
3340       if (isa<LoadInst>(UserI) || isa<StoreInst>(UserI))
3341         continue;
3342 
3343       // NOTE: Right now, if a function that has malloc pointer as an argument
3344       // frees memory, we assume that the malloc pointer is freed.
3345 
3346       // TODO: Add nofree callsite argument attribute to indicate that pointer
3347       // argument is not freed.
3348       if (auto *CB = dyn_cast<CallBase>(UserI)) {
3349         if (!CB->isArgOperand(U))
3350           continue;
3351 
3352         if (CB->isLifetimeStartOrEnd())
3353           continue;
3354 
3355         // Record malloc.
3356         if (isFreeCall(UserI, TLI)) {
3357           FreesForMalloc[&I].insert(
3358               cast<Instruction>(const_cast<User *>(UserI)));
3359           continue;
3360         }
3361 
3362         // If a function does not free memory we are fine
3363         const auto &NoFreeAA =
3364             A.getAAFor<AANoFree>(*this, IRPosition::callsite_function(*CB));
3365 
3366         unsigned ArgNo = U - CB->arg_begin();
3367         const auto &NoCaptureAA = A.getAAFor<AANoCapture>(
3368             *this, IRPosition::callsite_argument(*CB, ArgNo));
3369 
3370         if (!NoCaptureAA.isAssumedNoCapture() || !NoFreeAA.isAssumedNoFree()) {
3371           LLVM_DEBUG(dbgs() << "[H2S] Bad user: " << *UserI << "\n");
3372           return false;
3373         }
3374         continue;
3375       }
3376 
3377       if (isa<GetElementPtrInst>(UserI) || isa<BitCastInst>(UserI)) {
3378         for (Use &U : UserI->uses())
3379           Worklist.push_back(&U);
3380         continue;
3381       }
3382 
3383       // Unknown user.
3384       LLVM_DEBUG(dbgs() << "[H2S] Unknown user: " << *UserI << "\n");
3385       return false;
3386     }
3387     return true;
3388   };
3389 
3390   auto MallocCallocCheck = [&](Instruction &I) {
3391     if (isMallocLikeFn(&I, TLI)) {
3392       if (auto *Size = dyn_cast<ConstantInt>(I.getOperand(0)))
3393         if (!Size->getValue().sle(MaxHeapToStackSize))
3394           return true;
3395     } else if (isCallocLikeFn(&I, TLI)) {
3396       bool Overflow = false;
3397       if (auto *Num = dyn_cast<ConstantInt>(I.getOperand(0)))
3398         if (auto *Size = dyn_cast<ConstantInt>(I.getOperand(1)))
3399           if (!(Size->getValue().umul_ov(Num->getValue(), Overflow))
3400                    .sle(MaxHeapToStackSize))
3401             if (!Overflow)
3402               return true;
3403     } else {
3404       BadMallocCalls.insert(&I);
3405       return true;
3406     }
3407 
3408     if (BadMallocCalls.count(&I))
3409       return true;
3410 
3411     if (UsesCheck(I))
3412       MallocCalls.insert(&I);
3413     else
3414       BadMallocCalls.insert(&I);
3415     return true;
3416   };
3417 
3418   size_t NumBadMallocs = BadMallocCalls.size();
3419 
3420   A.checkForAllCallLikeInstructions(MallocCallocCheck, *this);
3421 
3422   if (NumBadMallocs != BadMallocCalls.size())
3423     return ChangeStatus::CHANGED;
3424 
3425   return ChangeStatus::UNCHANGED;
3426 }
3427 
3428 struct AAHeapToStackFunction final : public AAHeapToStackImpl {
3429   AAHeapToStackFunction(const IRPosition &IRP) : AAHeapToStackImpl(IRP) {}
3430 
3431   /// See AbstractAttribute::trackStatistics()
3432   void trackStatistics() const override {
3433     STATS_DECL(MallocCalls, Function,
3434                "Number of MallocCalls converted to allocas");
3435     BUILD_STAT_NAME(MallocCalls, Function) += MallocCalls.size();
3436   }
3437 };
3438 } // namespace
3439 
3440 /// ----------------------------------------------------------------------------
3441 ///                               Attributor
3442 /// ----------------------------------------------------------------------------
3443 
3444 bool Attributor::isAssumedDead(const AbstractAttribute &AA,
3445                                const AAIsDead *LivenessAA) {
3446   const Instruction *CtxI = AA.getIRPosition().getCtxI();
3447   if (!CtxI)
3448     return false;
3449 
3450   if (!LivenessAA)
3451     LivenessAA =
3452         &getAAFor<AAIsDead>(AA, IRPosition::function(*CtxI->getFunction()),
3453                             /* TrackDependence */ false);
3454 
3455   // Don't check liveness for AAIsDead.
3456   if (&AA == LivenessAA)
3457     return false;
3458 
3459   if (!LivenessAA->isAssumedDead(CtxI))
3460     return false;
3461 
3462   // We actually used liveness information so we have to record a dependence.
3463   recordDependence(*LivenessAA, AA);
3464 
3465   return true;
3466 }
3467 
3468 bool Attributor::checkForAllCallSites(const function_ref<bool(CallSite)> &Pred,
3469                                       const AbstractAttribute &QueryingAA,
3470                                       bool RequireAllCallSites) {
3471   // We can try to determine information from
3472   // the call sites. However, this is only possible all call sites are known,
3473   // hence the function has internal linkage.
3474   const IRPosition &IRP = QueryingAA.getIRPosition();
3475   const Function *AssociatedFunction = IRP.getAssociatedFunction();
3476   if (!AssociatedFunction)
3477     return false;
3478 
3479   if (RequireAllCallSites && !AssociatedFunction->hasInternalLinkage()) {
3480     LLVM_DEBUG(
3481         dbgs()
3482         << "[Attributor] Function " << AssociatedFunction->getName()
3483         << " has no internal linkage, hence not all call sites are known\n");
3484     return false;
3485   }
3486 
3487   for (const Use &U : AssociatedFunction->uses()) {
3488     Instruction *I = dyn_cast<Instruction>(U.getUser());
3489     // TODO: Deal with abstract call sites here.
3490     if (!I)
3491       return false;
3492 
3493     Function *Caller = I->getFunction();
3494 
3495     const auto &LivenessAA = getAAFor<AAIsDead>(
3496         QueryingAA, IRPosition::function(*Caller), /* TrackDependence */ false);
3497 
3498     // Skip dead calls.
3499     if (LivenessAA.isAssumedDead(I)) {
3500       // We actually used liveness information so we have to record a
3501       // dependence.
3502       recordDependence(LivenessAA, QueryingAA);
3503       continue;
3504     }
3505 
3506     CallSite CS(U.getUser());
3507     if (!CS || !CS.isCallee(&U)) {
3508       if (!RequireAllCallSites)
3509         continue;
3510 
3511       LLVM_DEBUG(dbgs() << "[Attributor] User " << *U.getUser()
3512                         << " is an invalid use of "
3513                         << AssociatedFunction->getName() << "\n");
3514       return false;
3515     }
3516 
3517     if (Pred(CS))
3518       continue;
3519 
3520     LLVM_DEBUG(dbgs() << "[Attributor] Call site callback failed for "
3521                       << *CS.getInstruction() << "\n");
3522     return false;
3523   }
3524 
3525   return true;
3526 }
3527 
3528 bool Attributor::checkForAllReturnedValuesAndReturnInsts(
3529     const function_ref<bool(Value &, const SmallSetVector<ReturnInst *, 4> &)>
3530         &Pred,
3531     const AbstractAttribute &QueryingAA) {
3532 
3533   const IRPosition &IRP = QueryingAA.getIRPosition();
3534   // Since we need to provide return instructions we have to have an exact
3535   // definition.
3536   const Function *AssociatedFunction = IRP.getAssociatedFunction();
3537   if (!AssociatedFunction)
3538     return false;
3539 
3540   // If this is a call site query we use the call site specific return values
3541   // and liveness information.
3542   // TODO: use the function scope once we have call site AAReturnedValues.
3543   const IRPosition &QueryIRP = IRPosition::function(*AssociatedFunction);
3544   const auto &AARetVal = getAAFor<AAReturnedValues>(QueryingAA, QueryIRP);
3545   if (!AARetVal.getState().isValidState())
3546     return false;
3547 
3548   return AARetVal.checkForAllReturnedValuesAndReturnInsts(Pred);
3549 }
3550 
3551 bool Attributor::checkForAllReturnedValues(
3552     const function_ref<bool(Value &)> &Pred,
3553     const AbstractAttribute &QueryingAA) {
3554 
3555   const IRPosition &IRP = QueryingAA.getIRPosition();
3556   const Function *AssociatedFunction = IRP.getAssociatedFunction();
3557   if (!AssociatedFunction)
3558     return false;
3559 
3560   // TODO: use the function scope once we have call site AAReturnedValues.
3561   const IRPosition &QueryIRP = IRPosition::function(*AssociatedFunction);
3562   const auto &AARetVal = getAAFor<AAReturnedValues>(QueryingAA, QueryIRP);
3563   if (!AARetVal.getState().isValidState())
3564     return false;
3565 
3566   return AARetVal.checkForAllReturnedValuesAndReturnInsts(
3567       [&](Value &RV, const SmallSetVector<ReturnInst *, 4> &) {
3568         return Pred(RV);
3569       });
3570 }
3571 
3572 static bool
3573 checkForAllInstructionsImpl(InformationCache::OpcodeInstMapTy &OpcodeInstMap,
3574                             const function_ref<bool(Instruction &)> &Pred,
3575                             const AAIsDead *LivenessAA, bool &AnyDead,
3576                             const ArrayRef<unsigned> &Opcodes) {
3577   for (unsigned Opcode : Opcodes) {
3578     for (Instruction *I : OpcodeInstMap[Opcode]) {
3579       // Skip dead instructions.
3580       if (LivenessAA && LivenessAA->isAssumedDead(I)) {
3581         AnyDead = true;
3582         continue;
3583       }
3584 
3585       if (!Pred(*I))
3586         return false;
3587     }
3588   }
3589   return true;
3590 }
3591 
3592 bool Attributor::checkForAllInstructions(
3593     const llvm::function_ref<bool(Instruction &)> &Pred,
3594     const AbstractAttribute &QueryingAA, const ArrayRef<unsigned> &Opcodes) {
3595 
3596   const IRPosition &IRP = QueryingAA.getIRPosition();
3597   // Since we need to provide instructions we have to have an exact definition.
3598   const Function *AssociatedFunction = IRP.getAssociatedFunction();
3599   if (!AssociatedFunction)
3600     return false;
3601 
3602   // TODO: use the function scope once we have call site AAReturnedValues.
3603   const IRPosition &QueryIRP = IRPosition::function(*AssociatedFunction);
3604   const auto &LivenessAA =
3605       getAAFor<AAIsDead>(QueryingAA, QueryIRP, /* TrackDependence */ false);
3606   bool AnyDead = false;
3607 
3608   auto &OpcodeInstMap =
3609       InfoCache.getOpcodeInstMapForFunction(*AssociatedFunction);
3610   if (!checkForAllInstructionsImpl(OpcodeInstMap, Pred, &LivenessAA, AnyDead, Opcodes))
3611     return false;
3612 
3613   // If we actually used liveness information so we have to record a dependence.
3614   if (AnyDead)
3615     recordDependence(LivenessAA, QueryingAA);
3616 
3617   return true;
3618 }
3619 
3620 bool Attributor::checkForAllReadWriteInstructions(
3621     const llvm::function_ref<bool(Instruction &)> &Pred,
3622     AbstractAttribute &QueryingAA) {
3623 
3624   const Function *AssociatedFunction =
3625       QueryingAA.getIRPosition().getAssociatedFunction();
3626   if (!AssociatedFunction)
3627     return false;
3628 
3629   // TODO: use the function scope once we have call site AAReturnedValues.
3630   const IRPosition &QueryIRP = IRPosition::function(*AssociatedFunction);
3631   const auto &LivenessAA =
3632       getAAFor<AAIsDead>(QueryingAA, QueryIRP, /* TrackDependence */ false);
3633   bool AnyDead = false;
3634 
3635   for (Instruction *I :
3636        InfoCache.getReadOrWriteInstsForFunction(*AssociatedFunction)) {
3637     // Skip dead instructions.
3638     if (LivenessAA.isAssumedDead(I)) {
3639       AnyDead = true;
3640       continue;
3641     }
3642 
3643     if (!Pred(*I))
3644       return false;
3645   }
3646 
3647   // If we actually used liveness information so we have to record a dependence.
3648   if (AnyDead)
3649     recordDependence(LivenessAA, QueryingAA);
3650 
3651   return true;
3652 }
3653 
3654 ChangeStatus Attributor::run(Module &M) {
3655   LLVM_DEBUG(dbgs() << "[Attributor] Identified and initialized "
3656                     << AllAbstractAttributes.size()
3657                     << " abstract attributes.\n");
3658 
3659   // Now that all abstract attributes are collected and initialized we start
3660   // the abstract analysis.
3661 
3662   unsigned IterationCounter = 1;
3663 
3664   SmallVector<AbstractAttribute *, 64> ChangedAAs;
3665   SetVector<AbstractAttribute *> Worklist;
3666   Worklist.insert(AllAbstractAttributes.begin(), AllAbstractAttributes.end());
3667 
3668   bool RecomputeDependences = false;
3669 
3670   do {
3671     // Remember the size to determine new attributes.
3672     size_t NumAAs = AllAbstractAttributes.size();
3673     LLVM_DEBUG(dbgs() << "\n\n[Attributor] #Iteration: " << IterationCounter
3674                       << ", Worklist size: " << Worklist.size() << "\n");
3675 
3676     // If dependences (=QueryMap) are recomputed we have to look at all abstract
3677     // attributes again, regardless of what changed in the last iteration.
3678     if (RecomputeDependences) {
3679       LLVM_DEBUG(
3680           dbgs() << "[Attributor] Run all AAs to recompute dependences\n");
3681       QueryMap.clear();
3682       ChangedAAs.clear();
3683       Worklist.insert(AllAbstractAttributes.begin(),
3684                       AllAbstractAttributes.end());
3685     }
3686 
3687     // Add all abstract attributes that are potentially dependent on one that
3688     // changed to the work list.
3689     for (AbstractAttribute *ChangedAA : ChangedAAs) {
3690       auto &QuerriedAAs = QueryMap[ChangedAA];
3691       Worklist.insert(QuerriedAAs.begin(), QuerriedAAs.end());
3692     }
3693 
3694     LLVM_DEBUG(dbgs() << "[Attributor] #Iteration: " << IterationCounter
3695                       << ", Worklist+Dependent size: " << Worklist.size()
3696                       << "\n");
3697 
3698     // Reset the changed set.
3699     ChangedAAs.clear();
3700 
3701     // Update all abstract attribute in the work list and record the ones that
3702     // changed.
3703     for (AbstractAttribute *AA : Worklist)
3704       if (!isAssumedDead(*AA, nullptr))
3705         if (AA->update(*this) == ChangeStatus::CHANGED)
3706           ChangedAAs.push_back(AA);
3707 
3708     // Check if we recompute the dependences in the next iteration.
3709     RecomputeDependences = (DepRecomputeInterval > 0 &&
3710                             IterationCounter % DepRecomputeInterval == 0);
3711 
3712     // Add attributes to the changed set if they have been created in the last
3713     // iteration.
3714     ChangedAAs.append(AllAbstractAttributes.begin() + NumAAs,
3715                       AllAbstractAttributes.end());
3716 
3717     // Reset the work list and repopulate with the changed abstract attributes.
3718     // Note that dependent ones are added above.
3719     Worklist.clear();
3720     Worklist.insert(ChangedAAs.begin(), ChangedAAs.end());
3721 
3722   } while (!Worklist.empty() && (IterationCounter++ < MaxFixpointIterations ||
3723                                  VerifyMaxFixpointIterations));
3724 
3725   LLVM_DEBUG(dbgs() << "\n[Attributor] Fixpoint iteration done after: "
3726                     << IterationCounter << "/" << MaxFixpointIterations
3727                     << " iterations\n");
3728 
3729   size_t NumFinalAAs = AllAbstractAttributes.size();
3730 
3731   bool FinishedAtFixpoint = Worklist.empty();
3732 
3733   // Reset abstract arguments not settled in a sound fixpoint by now. This
3734   // happens when we stopped the fixpoint iteration early. Note that only the
3735   // ones marked as "changed" *and* the ones transitively depending on them
3736   // need to be reverted to a pessimistic state. Others might not be in a
3737   // fixpoint state but we can use the optimistic results for them anyway.
3738   SmallPtrSet<AbstractAttribute *, 32> Visited;
3739   for (unsigned u = 0; u < ChangedAAs.size(); u++) {
3740     AbstractAttribute *ChangedAA = ChangedAAs[u];
3741     if (!Visited.insert(ChangedAA).second)
3742       continue;
3743 
3744     AbstractState &State = ChangedAA->getState();
3745     if (!State.isAtFixpoint()) {
3746       State.indicatePessimisticFixpoint();
3747 
3748       NumAttributesTimedOut++;
3749     }
3750 
3751     auto &QuerriedAAs = QueryMap[ChangedAA];
3752     ChangedAAs.append(QuerriedAAs.begin(), QuerriedAAs.end());
3753   }
3754 
3755   LLVM_DEBUG({
3756     if (!Visited.empty())
3757       dbgs() << "\n[Attributor] Finalized " << Visited.size()
3758              << " abstract attributes.\n";
3759   });
3760 
3761   unsigned NumManifested = 0;
3762   unsigned NumAtFixpoint = 0;
3763   ChangeStatus ManifestChange = ChangeStatus::UNCHANGED;
3764   for (AbstractAttribute *AA : AllAbstractAttributes) {
3765     AbstractState &State = AA->getState();
3766 
3767     // If there is not already a fixpoint reached, we can now take the
3768     // optimistic state. This is correct because we enforced a pessimistic one
3769     // on abstract attributes that were transitively dependent on a changed one
3770     // already above.
3771     if (!State.isAtFixpoint())
3772       State.indicateOptimisticFixpoint();
3773 
3774     // If the state is invalid, we do not try to manifest it.
3775     if (!State.isValidState())
3776       continue;
3777 
3778     // Skip dead code.
3779     if (isAssumedDead(*AA, nullptr))
3780       continue;
3781     // Manifest the state and record if we changed the IR.
3782     ChangeStatus LocalChange = AA->manifest(*this);
3783     if (LocalChange == ChangeStatus::CHANGED && AreStatisticsEnabled())
3784       AA->trackStatistics();
3785 
3786     ManifestChange = ManifestChange | LocalChange;
3787 
3788     NumAtFixpoint++;
3789     NumManifested += (LocalChange == ChangeStatus::CHANGED);
3790   }
3791 
3792   (void)NumManifested;
3793   (void)NumAtFixpoint;
3794   LLVM_DEBUG(dbgs() << "\n[Attributor] Manifested " << NumManifested
3795                     << " arguments while " << NumAtFixpoint
3796                     << " were in a valid fixpoint state\n");
3797 
3798   // If verification is requested, we finished this run at a fixpoint, and the
3799   // IR was changed, we re-run the whole fixpoint analysis, starting at
3800   // re-initialization of the arguments. This re-run should not result in an IR
3801   // change. Though, the (virtual) state of attributes at the end of the re-run
3802   // might be more optimistic than the known state or the IR state if the better
3803   // state cannot be manifested.
3804   if (VerifyAttributor && FinishedAtFixpoint &&
3805       ManifestChange == ChangeStatus::CHANGED) {
3806     VerifyAttributor = false;
3807     ChangeStatus VerifyStatus = run(M);
3808     if (VerifyStatus != ChangeStatus::UNCHANGED)
3809       llvm_unreachable(
3810           "Attributor verification failed, re-run did result in an IR change "
3811           "even after a fixpoint was reached in the original run. (False "
3812           "positives possible!)");
3813     VerifyAttributor = true;
3814   }
3815 
3816   NumAttributesManifested += NumManifested;
3817   NumAttributesValidFixpoint += NumAtFixpoint;
3818 
3819   (void)NumFinalAAs;
3820   assert(
3821       NumFinalAAs == AllAbstractAttributes.size() &&
3822       "Expected the final number of abstract attributes to remain unchanged!");
3823 
3824   // Delete stuff at the end to avoid invalid references and a nice order.
3825   {
3826     LLVM_DEBUG(dbgs() << "\n[Attributor] Delete at least "
3827                       << ToBeDeletedFunctions.size() << " functions and "
3828                       << ToBeDeletedBlocks.size() << " blocks and "
3829                       << ToBeDeletedInsts.size() << " instructions\n");
3830     for (Instruction *I : ToBeDeletedInsts) {
3831       if (!I->use_empty())
3832         I->replaceAllUsesWith(UndefValue::get(I->getType()));
3833       I->eraseFromParent();
3834     }
3835 
3836     if (unsigned NumDeadBlocks = ToBeDeletedBlocks.size()) {
3837       SmallVector<BasicBlock *, 8> ToBeDeletedBBs;
3838       ToBeDeletedBBs.reserve(NumDeadBlocks);
3839       ToBeDeletedBBs.append(ToBeDeletedBlocks.begin(), ToBeDeletedBlocks.end());
3840       DeleteDeadBlocks(ToBeDeletedBBs);
3841       STATS_DECLTRACK(AAIsDead, BasicBlock,
3842                       "Number of dead basic blocks deleted.");
3843     }
3844 
3845     STATS_DECL(AAIsDead, Function, "Number of dead functions deleted.");
3846     for (Function *Fn : ToBeDeletedFunctions) {
3847       Fn->replaceAllUsesWith(UndefValue::get(Fn->getType()));
3848       Fn->eraseFromParent();
3849       STATS_TRACK(AAIsDead, Function);
3850     }
3851 
3852     // Identify dead internal functions and delete them. This happens outside
3853     // the other fixpoint analysis as we might treat potentially dead functions
3854     // as live to lower the number of iterations. If they happen to be dead, the
3855     // below fixpoint loop will identify and eliminate them.
3856     SmallVector<Function *, 8> InternalFns;
3857     for (Function &F : M)
3858       if (F.hasInternalLinkage())
3859         InternalFns.push_back(&F);
3860 
3861     bool FoundDeadFn = true;
3862     while (FoundDeadFn) {
3863       FoundDeadFn = false;
3864       for (unsigned u = 0, e = InternalFns.size(); u < e; ++u) {
3865         Function *F = InternalFns[u];
3866         if (!F)
3867           continue;
3868 
3869         const auto *LivenessAA =
3870             lookupAAFor<AAIsDead>(IRPosition::function(*F));
3871         if (LivenessAA &&
3872             !checkForAllCallSites([](CallSite CS) { return false; },
3873                                   *LivenessAA, true))
3874           continue;
3875 
3876         STATS_TRACK(AAIsDead, Function);
3877         F->replaceAllUsesWith(UndefValue::get(F->getType()));
3878         F->eraseFromParent();
3879         InternalFns[u] = nullptr;
3880         FoundDeadFn = true;
3881       }
3882     }
3883   }
3884 
3885   if (VerifyMaxFixpointIterations &&
3886       IterationCounter != MaxFixpointIterations) {
3887     errs() << "\n[Attributor] Fixpoint iteration done after: "
3888            << IterationCounter << "/" << MaxFixpointIterations
3889            << " iterations\n";
3890     llvm_unreachable("The fixpoint was not reached with exactly the number of "
3891                      "specified iterations!");
3892   }
3893 
3894   return ManifestChange;
3895 }
3896 
3897 void Attributor::initializeInformationCache(Function &F) {
3898 
3899   // Walk all instructions to find interesting instructions that might be
3900   // queried by abstract attributes during their initialization or update.
3901   // This has to happen before we create attributes.
3902   auto &ReadOrWriteInsts = InfoCache.FuncRWInstsMap[&F];
3903   auto &InstOpcodeMap = InfoCache.FuncInstOpcodeMap[&F];
3904 
3905   for (Instruction &I : instructions(&F)) {
3906     bool IsInterestingOpcode = false;
3907 
3908     // To allow easy access to all instructions in a function with a given
3909     // opcode we store them in the InfoCache. As not all opcodes are interesting
3910     // to concrete attributes we only cache the ones that are as identified in
3911     // the following switch.
3912     // Note: There are no concrete attributes now so this is initially empty.
3913     switch (I.getOpcode()) {
3914     default:
3915       assert((!ImmutableCallSite(&I)) && (!isa<CallBase>(&I)) &&
3916              "New call site/base instruction type needs to be known int the "
3917              "Attributor.");
3918       break;
3919     case Instruction::Load:
3920       // The alignment of a pointer is interesting for loads.
3921     case Instruction::Store:
3922       // The alignment of a pointer is interesting for stores.
3923     case Instruction::Call:
3924     case Instruction::CallBr:
3925     case Instruction::Invoke:
3926     case Instruction::CleanupRet:
3927     case Instruction::CatchSwitch:
3928     case Instruction::Resume:
3929     case Instruction::Ret:
3930       IsInterestingOpcode = true;
3931     }
3932     if (IsInterestingOpcode)
3933       InstOpcodeMap[I.getOpcode()].push_back(&I);
3934     if (I.mayReadOrWriteMemory())
3935       ReadOrWriteInsts.push_back(&I);
3936   }
3937 }
3938 
3939 void Attributor::identifyDefaultAbstractAttributes(Function &F) {
3940   if (!VisitedFunctions.insert(&F).second)
3941     return;
3942 
3943   IRPosition FPos = IRPosition::function(F);
3944 
3945   // Check for dead BasicBlocks in every function.
3946   // We need dead instruction detection because we do not want to deal with
3947   // broken IR in which SSA rules do not apply.
3948   getOrCreateAAFor<AAIsDead>(FPos);
3949 
3950   // Every function might be "will-return".
3951   getOrCreateAAFor<AAWillReturn>(FPos);
3952 
3953   // Every function can be nounwind.
3954   getOrCreateAAFor<AANoUnwind>(FPos);
3955 
3956   // Every function might be marked "nosync"
3957   getOrCreateAAFor<AANoSync>(FPos);
3958 
3959   // Every function might be "no-free".
3960   getOrCreateAAFor<AANoFree>(FPos);
3961 
3962   // Every function might be "no-return".
3963   getOrCreateAAFor<AANoReturn>(FPos);
3964 
3965   // Every function might be "no-recurse".
3966   getOrCreateAAFor<AANoRecurse>(FPos);
3967 
3968   // Every function might be applicable for Heap-To-Stack conversion.
3969   if (EnableHeapToStack)
3970     getOrCreateAAFor<AAHeapToStack>(FPos);
3971 
3972   // Return attributes are only appropriate if the return type is non void.
3973   Type *ReturnType = F.getReturnType();
3974   if (!ReturnType->isVoidTy()) {
3975     // Argument attribute "returned" --- Create only one per function even
3976     // though it is an argument attribute.
3977     getOrCreateAAFor<AAReturnedValues>(FPos);
3978 
3979     IRPosition RetPos = IRPosition::returned(F);
3980 
3981     // Every function might be simplified.
3982     getOrCreateAAFor<AAValueSimplify>(RetPos);
3983 
3984     if (ReturnType->isPointerTy()) {
3985 
3986       // Every function with pointer return type might be marked align.
3987       getOrCreateAAFor<AAAlign>(RetPos);
3988 
3989       // Every function with pointer return type might be marked nonnull.
3990       getOrCreateAAFor<AANonNull>(RetPos);
3991 
3992       // Every function with pointer return type might be marked noalias.
3993       getOrCreateAAFor<AANoAlias>(RetPos);
3994 
3995       // Every function with pointer return type might be marked
3996       // dereferenceable.
3997       getOrCreateAAFor<AADereferenceable>(RetPos);
3998     }
3999   }
4000 
4001   for (Argument &Arg : F.args()) {
4002     IRPosition ArgPos = IRPosition::argument(Arg);
4003 
4004     // Every argument might be simplified.
4005     getOrCreateAAFor<AAValueSimplify>(ArgPos);
4006 
4007     if (Arg.getType()->isPointerTy()) {
4008       // Every argument with pointer type might be marked nonnull.
4009       getOrCreateAAFor<AANonNull>(ArgPos);
4010 
4011       // Every argument with pointer type might be marked noalias.
4012       getOrCreateAAFor<AANoAlias>(ArgPos);
4013 
4014       // Every argument with pointer type might be marked dereferenceable.
4015       getOrCreateAAFor<AADereferenceable>(ArgPos);
4016 
4017       // Every argument with pointer type might be marked align.
4018       getOrCreateAAFor<AAAlign>(ArgPos);
4019 
4020       // Every argument with pointer type might be marked nocapture.
4021       getOrCreateAAFor<AANoCapture>(ArgPos);
4022     }
4023   }
4024 
4025   auto CallSitePred = [&](Instruction &I) -> bool {
4026     CallSite CS(&I);
4027     if (CS.getCalledFunction()) {
4028       for (int i = 0, e = CS.getCalledFunction()->arg_size(); i < e; i++) {
4029 
4030         IRPosition CSArgPos = IRPosition::callsite_argument(CS, i);
4031 
4032         // Call site argument might be simplified.
4033         getOrCreateAAFor<AAValueSimplify>(CSArgPos);
4034 
4035         if (!CS.getArgument(i)->getType()->isPointerTy())
4036           continue;
4037 
4038         // Call site argument attribute "non-null".
4039         getOrCreateAAFor<AANonNull>(CSArgPos);
4040 
4041         // Call site argument attribute "no-alias".
4042         getOrCreateAAFor<AANoAlias>(CSArgPos);
4043 
4044         // Call site argument attribute "dereferenceable".
4045         getOrCreateAAFor<AADereferenceable>(CSArgPos);
4046 
4047         // Call site argument attribute "align".
4048         getOrCreateAAFor<AAAlign>(CSArgPos);
4049       }
4050     }
4051     return true;
4052   };
4053 
4054   auto &OpcodeInstMap = InfoCache.getOpcodeInstMapForFunction(F);
4055   bool Success, AnyDead = false;
4056   Success = checkForAllInstructionsImpl(
4057       OpcodeInstMap, CallSitePred, nullptr, AnyDead,
4058       {(unsigned)Instruction::Invoke, (unsigned)Instruction::CallBr,
4059        (unsigned)Instruction::Call});
4060   (void)Success;
4061   assert(Success && !AnyDead && "Expected the check call to be successful!");
4062 
4063   auto LoadStorePred = [&](Instruction &I) -> bool {
4064     if (isa<LoadInst>(I))
4065       getOrCreateAAFor<AAAlign>(
4066           IRPosition::value(*cast<LoadInst>(I).getPointerOperand()));
4067     else
4068       getOrCreateAAFor<AAAlign>(
4069           IRPosition::value(*cast<StoreInst>(I).getPointerOperand()));
4070     return true;
4071   };
4072   Success = checkForAllInstructionsImpl(
4073       OpcodeInstMap, LoadStorePred, nullptr, AnyDead,
4074       {(unsigned)Instruction::Load, (unsigned)Instruction::Store});
4075   (void)Success;
4076   assert(Success && !AnyDead && "Expected the check call to be successful!");
4077 }
4078 
4079 /// Helpers to ease debugging through output streams and print calls.
4080 ///
4081 ///{
4082 raw_ostream &llvm::operator<<(raw_ostream &OS, ChangeStatus S) {
4083   return OS << (S == ChangeStatus::CHANGED ? "changed" : "unchanged");
4084 }
4085 
4086 raw_ostream &llvm::operator<<(raw_ostream &OS, IRPosition::Kind AP) {
4087   switch (AP) {
4088   case IRPosition::IRP_INVALID:
4089     return OS << "inv";
4090   case IRPosition::IRP_FLOAT:
4091     return OS << "flt";
4092   case IRPosition::IRP_RETURNED:
4093     return OS << "fn_ret";
4094   case IRPosition::IRP_CALL_SITE_RETURNED:
4095     return OS << "cs_ret";
4096   case IRPosition::IRP_FUNCTION:
4097     return OS << "fn";
4098   case IRPosition::IRP_CALL_SITE:
4099     return OS << "cs";
4100   case IRPosition::IRP_ARGUMENT:
4101     return OS << "arg";
4102   case IRPosition::IRP_CALL_SITE_ARGUMENT:
4103     return OS << "cs_arg";
4104   }
4105   llvm_unreachable("Unknown attribute position!");
4106 }
4107 
4108 raw_ostream &llvm::operator<<(raw_ostream &OS, const IRPosition &Pos) {
4109   const Value &AV = Pos.getAssociatedValue();
4110   return OS << "{" << Pos.getPositionKind() << ":" << AV.getName() << " ["
4111             << Pos.getAnchorValue().getName() << "@" << Pos.getArgNo() << "]}";
4112 }
4113 
4114 raw_ostream &llvm::operator<<(raw_ostream &OS, const IntegerState &S) {
4115   return OS << "(" << S.getKnown() << "-" << S.getAssumed() << ")"
4116             << static_cast<const AbstractState &>(S);
4117 }
4118 
4119 raw_ostream &llvm::operator<<(raw_ostream &OS, const AbstractState &S) {
4120   return OS << (!S.isValidState() ? "top" : (S.isAtFixpoint() ? "fix" : ""));
4121 }
4122 
4123 raw_ostream &llvm::operator<<(raw_ostream &OS, const AbstractAttribute &AA) {
4124   AA.print(OS);
4125   return OS;
4126 }
4127 
4128 void AbstractAttribute::print(raw_ostream &OS) const {
4129   OS << "[P: " << getIRPosition() << "][" << getAsStr() << "][S: " << getState()
4130      << "]";
4131 }
4132 ///}
4133 
4134 /// ----------------------------------------------------------------------------
4135 ///                       Pass (Manager) Boilerplate
4136 /// ----------------------------------------------------------------------------
4137 
4138 static bool runAttributorOnModule(Module &M, AnalysisGetter &AG) {
4139   if (DisableAttributor)
4140     return false;
4141 
4142   LLVM_DEBUG(dbgs() << "[Attributor] Run on module with " << M.size()
4143                     << " functions.\n");
4144 
4145   // Create an Attributor and initially empty information cache that is filled
4146   // while we identify default attribute opportunities.
4147   InformationCache InfoCache(M, AG);
4148   Attributor A(InfoCache, DepRecInterval);
4149 
4150   for (Function &F : M)
4151     A.initializeInformationCache(F);
4152 
4153   for (Function &F : M) {
4154     if (F.hasExactDefinition())
4155       NumFnWithExactDefinition++;
4156     else
4157       NumFnWithoutExactDefinition++;
4158 
4159     // For now we ignore naked and optnone functions.
4160     if (F.hasFnAttribute(Attribute::Naked) ||
4161         F.hasFnAttribute(Attribute::OptimizeNone))
4162       continue;
4163 
4164     // We look at internal functions only on-demand but if any use is not a
4165     // direct call, we have to do it eagerly.
4166     if (F.hasInternalLinkage()) {
4167       if (llvm::all_of(F.uses(), [](const Use &U) {
4168             return ImmutableCallSite(U.getUser()) &&
4169                    ImmutableCallSite(U.getUser()).isCallee(&U);
4170           }))
4171         continue;
4172     }
4173 
4174     // Populate the Attributor with abstract attribute opportunities in the
4175     // function and the information cache with IR information.
4176     A.identifyDefaultAbstractAttributes(F);
4177   }
4178 
4179   return A.run(M) == ChangeStatus::CHANGED;
4180 }
4181 
4182 PreservedAnalyses AttributorPass::run(Module &M, ModuleAnalysisManager &AM) {
4183   AnalysisGetter AG(AM);
4184   if (runAttributorOnModule(M, AG)) {
4185     // FIXME: Think about passes we will preserve and add them here.
4186     return PreservedAnalyses::none();
4187   }
4188   return PreservedAnalyses::all();
4189 }
4190 
4191 namespace {
4192 
4193 struct AttributorLegacyPass : public ModulePass {
4194   static char ID;
4195 
4196   AttributorLegacyPass() : ModulePass(ID) {
4197     initializeAttributorLegacyPassPass(*PassRegistry::getPassRegistry());
4198   }
4199 
4200   bool runOnModule(Module &M) override {
4201     if (skipModule(M))
4202       return false;
4203 
4204     AnalysisGetter AG;
4205     return runAttributorOnModule(M, AG);
4206   }
4207 
4208   void getAnalysisUsage(AnalysisUsage &AU) const override {
4209     // FIXME: Think about passes we will preserve and add them here.
4210     AU.addRequired<TargetLibraryInfoWrapperPass>();
4211   }
4212 };
4213 
4214 } // end anonymous namespace
4215 
4216 Pass *llvm::createAttributorLegacyPass() { return new AttributorLegacyPass(); }
4217 
4218 char AttributorLegacyPass::ID = 0;
4219 
4220 const char AAReturnedValues::ID = 0;
4221 const char AANoUnwind::ID = 0;
4222 const char AANoSync::ID = 0;
4223 const char AANoFree::ID = 0;
4224 const char AANonNull::ID = 0;
4225 const char AANoRecurse::ID = 0;
4226 const char AAWillReturn::ID = 0;
4227 const char AANoAlias::ID = 0;
4228 const char AANoReturn::ID = 0;
4229 const char AAIsDead::ID = 0;
4230 const char AADereferenceable::ID = 0;
4231 const char AAAlign::ID = 0;
4232 const char AANoCapture::ID = 0;
4233 const char AAValueSimplify::ID = 0;
4234 const char AAHeapToStack::ID = 0;
4235 
4236 // Macro magic to create the static generator function for attributes that
4237 // follow the naming scheme.
4238 
4239 #define SWITCH_PK_INV(CLASS, PK, POS_NAME)                                     \
4240   case IRPosition::PK:                                                         \
4241     llvm_unreachable("Cannot create " #CLASS " for a " POS_NAME " position!");
4242 
4243 #define SWITCH_PK_CREATE(CLASS, IRP, PK, SUFFIX)                               \
4244   case IRPosition::PK:                                                         \
4245     AA = new CLASS##SUFFIX(IRP);                                               \
4246     break;
4247 
4248 #define CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS)                 \
4249   CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) {      \
4250     CLASS *AA = nullptr;                                                       \
4251     switch (IRP.getPositionKind()) {                                           \
4252       SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid")                             \
4253       SWITCH_PK_INV(CLASS, IRP_FLOAT, "floating")                              \
4254       SWITCH_PK_INV(CLASS, IRP_ARGUMENT, "argument")                           \
4255       SWITCH_PK_INV(CLASS, IRP_RETURNED, "returned")                           \
4256       SWITCH_PK_INV(CLASS, IRP_CALL_SITE_RETURNED, "call site returned")       \
4257       SWITCH_PK_INV(CLASS, IRP_CALL_SITE_ARGUMENT, "call site argument")       \
4258       SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function)                     \
4259       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE, CallSite)                    \
4260     }                                                                          \
4261     return *AA;                                                                \
4262   }
4263 
4264 #define CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS)                    \
4265   CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) {      \
4266     CLASS *AA = nullptr;                                                       \
4267     switch (IRP.getPositionKind()) {                                           \
4268       SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid")                             \
4269       SWITCH_PK_INV(CLASS, IRP_FUNCTION, "function")                           \
4270       SWITCH_PK_INV(CLASS, IRP_CALL_SITE, "call site")                         \
4271       SWITCH_PK_CREATE(CLASS, IRP, IRP_FLOAT, Floating)                        \
4272       SWITCH_PK_CREATE(CLASS, IRP, IRP_ARGUMENT, Argument)                     \
4273       SWITCH_PK_CREATE(CLASS, IRP, IRP_RETURNED, Returned)                     \
4274       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_RETURNED, CallSiteReturned)   \
4275       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_ARGUMENT, CallSiteArgument)   \
4276     }                                                                          \
4277     return *AA;                                                                \
4278   }
4279 
4280 #define CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS)                      \
4281   CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) {      \
4282     CLASS *AA = nullptr;                                                       \
4283     switch (IRP.getPositionKind()) {                                           \
4284       SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid")                             \
4285       SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function)                     \
4286       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE, CallSite)                    \
4287       SWITCH_PK_CREATE(CLASS, IRP, IRP_FLOAT, Floating)                        \
4288       SWITCH_PK_CREATE(CLASS, IRP, IRP_ARGUMENT, Argument)                     \
4289       SWITCH_PK_CREATE(CLASS, IRP, IRP_RETURNED, Returned)                     \
4290       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_RETURNED, CallSiteReturned)   \
4291       SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_ARGUMENT, CallSiteArgument)   \
4292     }                                                                          \
4293     return *AA;                                                                \
4294   }
4295 
4296 #define CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS)            \
4297   CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) {      \
4298     CLASS *AA = nullptr;                                                       \
4299     switch (IRP.getPositionKind()) {                                           \
4300       SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid")                             \
4301       SWITCH_PK_INV(CLASS, IRP_ARGUMENT, "argument")                           \
4302       SWITCH_PK_INV(CLASS, IRP_FLOAT, "floating")                              \
4303       SWITCH_PK_INV(CLASS, IRP_RETURNED, "returned")                           \
4304       SWITCH_PK_INV(CLASS, IRP_CALL_SITE_RETURNED, "call site returned")       \
4305       SWITCH_PK_INV(CLASS, IRP_CALL_SITE_ARGUMENT, "call site argument")       \
4306       SWITCH_PK_INV(CLASS, IRP_CALL_SITE, "call site")                         \
4307       SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function)                     \
4308     }                                                                          \
4309     AA->initialize(A);                                                         \
4310     return *AA;                                                                \
4311   }
4312 
4313 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoUnwind)
4314 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoSync)
4315 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoFree)
4316 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoRecurse)
4317 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAWillReturn)
4318 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoReturn)
4319 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAIsDead)
4320 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAReturnedValues)
4321 
4322 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANonNull)
4323 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoAlias)
4324 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AADereferenceable)
4325 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAAlign)
4326 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoCapture)
4327 
4328 CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAValueSimplify)
4329 
4330 CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAHeapToStack)
4331 
4332 #undef CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION
4333 #undef CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION
4334 #undef CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION
4335 #undef SWITCH_PK_CREATE
4336 #undef SWITCH_PK_INV
4337 
4338 INITIALIZE_PASS_BEGIN(AttributorLegacyPass, "attributor",
4339                       "Deduce and propagate attributes", false, false)
4340 INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
4341 INITIALIZE_PASS_END(AttributorLegacyPass, "attributor",
4342                     "Deduce and propagate attributes", false, false)
4343