[ARM] MVE compare vector splat combine
[llvm-complete.git] / lib / Transforms / IPO / Attributor.cpp
blobfabe1441ff58468b50fc8245fd90fdcc9891e8f7
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.
14 //===----------------------------------------------------------------------===//
16 #include "llvm/Transforms/IPO/Attributor.h"
18 #include "llvm/ADT/DepthFirstIterator.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/ADT/SetVector.h"
21 #include "llvm/ADT/SmallPtrSet.h"
22 #include "llvm/ADT/SmallVector.h"
23 #include "llvm/ADT/Statistic.h"
24 #include "llvm/Analysis/CaptureTracking.h"
25 #include "llvm/Analysis/GlobalsModRef.h"
26 #include "llvm/Analysis/Loads.h"
27 #include "llvm/Analysis/ValueTracking.h"
28 #include "llvm/IR/Argument.h"
29 #include "llvm/IR/Attributes.h"
30 #include "llvm/IR/CFG.h"
31 #include "llvm/IR/InstIterator.h"
32 #include "llvm/IR/IntrinsicInst.h"
33 #include "llvm/Support/CommandLine.h"
34 #include "llvm/Support/Debug.h"
35 #include "llvm/Support/raw_ostream.h"
36 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
37 #include "llvm/Transforms/Utils/Local.h"
39 #include <cassert>
41 using namespace llvm;
43 #define DEBUG_TYPE "attributor"
45 STATISTIC(NumFnWithExactDefinition,
46 "Number of function with exact definitions");
47 STATISTIC(NumFnWithoutExactDefinition,
48 "Number of function without exact definitions");
49 STATISTIC(NumAttributesTimedOut,
50 "Number of abstract attributes timed out before fixpoint");
51 STATISTIC(NumAttributesValidFixpoint,
52 "Number of abstract attributes in a valid fixpoint state");
53 STATISTIC(NumAttributesManifested,
54 "Number of abstract attributes manifested in IR");
55 STATISTIC(NumFnNoUnwind, "Number of functions marked nounwind");
57 STATISTIC(NumFnUniqueReturned, "Number of function with unique return");
58 STATISTIC(NumFnKnownReturns, "Number of function with known return values");
59 STATISTIC(NumFnArgumentReturned,
60 "Number of function arguments marked returned");
61 STATISTIC(NumFnNoSync, "Number of functions marked nosync");
62 STATISTIC(NumFnNoFree, "Number of functions marked nofree");
63 STATISTIC(NumFnReturnedNonNull,
64 "Number of function return values marked nonnull");
65 STATISTIC(NumFnArgumentNonNull, "Number of function arguments marked nonnull");
66 STATISTIC(NumCSArgumentNonNull, "Number of call site arguments marked nonnull");
67 STATISTIC(NumFnWillReturn, "Number of functions marked willreturn");
68 STATISTIC(NumFnArgumentNoAlias, "Number of function arguments marked noalias");
69 STATISTIC(NumFnReturnedDereferenceable,
70 "Number of function return values marked dereferenceable");
71 STATISTIC(NumFnArgumentDereferenceable,
72 "Number of function arguments marked dereferenceable");
73 STATISTIC(NumCSArgumentDereferenceable,
74 "Number of call site arguments marked dereferenceable");
76 // TODO: Determine a good default value.
78 // In the LLVM-TS and SPEC2006, 32 seems to not induce compile time overheads
79 // (when run with the first 5 abstract attributes). The results also indicate
80 // that we never reach 32 iterations but always find a fixpoint sooner.
82 // This will become more evolved once we perform two interleaved fixpoint
83 // iterations: bottom-up and top-down.
84 static cl::opt<unsigned>
85 MaxFixpointIterations("attributor-max-iterations", cl::Hidden,
86 cl::desc("Maximal number of fixpoint iterations."),
87 cl::init(32));
89 static cl::opt<bool> DisableAttributor(
90 "attributor-disable", cl::Hidden,
91 cl::desc("Disable the attributor inter-procedural deduction pass."),
92 cl::init(true));
94 static cl::opt<bool> VerifyAttributor(
95 "attributor-verify", cl::Hidden,
96 cl::desc("Verify the Attributor deduction and "
97 "manifestation of attributes -- may issue false-positive errors"),
98 cl::init(false));
100 /// Logic operators for the change status enum class.
102 ///{
103 ChangeStatus llvm::operator|(ChangeStatus l, ChangeStatus r) {
104 return l == ChangeStatus::CHANGED ? l : r;
106 ChangeStatus llvm::operator&(ChangeStatus l, ChangeStatus r) {
107 return l == ChangeStatus::UNCHANGED ? l : r;
109 ///}
111 /// Helper to adjust the statistics.
112 static void bookkeeping(AbstractAttribute::ManifestPosition MP,
113 const Attribute &Attr) {
114 if (!AreStatisticsEnabled())
115 return;
117 switch (Attr.getKindAsEnum()) {
118 case Attribute::Dereferenceable:
119 switch (MP) {
120 case AbstractAttribute::MP_RETURNED:
121 NumFnReturnedDereferenceable++;
122 break;
123 case AbstractAttribute::MP_ARGUMENT:
124 NumFnArgumentDereferenceable++;
125 break;
126 case AbstractAttribute::MP_CALL_SITE_ARGUMENT:
127 NumCSArgumentDereferenceable++;
128 break;
129 default:
130 break;
132 break;
133 case Attribute::NoUnwind:
134 NumFnNoUnwind++;
135 return;
136 case Attribute::Returned:
137 NumFnArgumentReturned++;
138 return;
139 case Attribute::NoSync:
140 NumFnNoSync++;
141 break;
142 case Attribute::NoFree:
143 NumFnNoFree++;
144 break;
145 case Attribute::NonNull:
146 switch (MP) {
147 case AbstractAttribute::MP_RETURNED:
148 NumFnReturnedNonNull++;
149 break;
150 case AbstractAttribute::MP_ARGUMENT:
151 NumFnArgumentNonNull++;
152 break;
153 case AbstractAttribute::MP_CALL_SITE_ARGUMENT:
154 NumCSArgumentNonNull++;
155 break;
156 default:
157 break;
159 break;
160 case Attribute::WillReturn:
161 NumFnWillReturn++;
162 break;
163 case Attribute::NoAlias:
164 NumFnArgumentNoAlias++;
165 return;
166 default:
167 return;
171 template <typename StateTy>
172 using followValueCB_t = std::function<bool(Value *, StateTy &State)>;
173 template <typename StateTy>
174 using visitValueCB_t = std::function<void(Value *, StateTy &State)>;
176 /// Recursively visit all values that might become \p InitV at some point. This
177 /// will be done by looking through cast instructions, selects, phis, and calls
178 /// with the "returned" attribute. The callback \p FollowValueCB is asked before
179 /// a potential origin value is looked at. If no \p FollowValueCB is passed, a
180 /// default one is used that will make sure we visit every value only once. Once
181 /// we cannot look through the value any further, the callback \p VisitValueCB
182 /// is invoked and passed the current value and the \p State. To limit how much
183 /// effort is invested, we will never visit more than \p MaxValues values.
184 template <typename StateTy>
185 static bool genericValueTraversal(
186 Value *InitV, StateTy &State, visitValueCB_t<StateTy> &VisitValueCB,
187 followValueCB_t<StateTy> *FollowValueCB = nullptr, int MaxValues = 8) {
189 SmallPtrSet<Value *, 16> Visited;
190 followValueCB_t<bool> DefaultFollowValueCB = [&](Value *Val, bool &) {
191 return Visited.insert(Val).second;
194 if (!FollowValueCB)
195 FollowValueCB = &DefaultFollowValueCB;
197 SmallVector<Value *, 16> Worklist;
198 Worklist.push_back(InitV);
200 int Iteration = 0;
201 do {
202 Value *V = Worklist.pop_back_val();
204 // Check if we should process the current value. To prevent endless
205 // recursion keep a record of the values we followed!
206 if (!(*FollowValueCB)(V, State))
207 continue;
209 // Make sure we limit the compile time for complex expressions.
210 if (Iteration++ >= MaxValues)
211 return false;
213 // Explicitly look through calls with a "returned" attribute if we do
214 // not have a pointer as stripPointerCasts only works on them.
215 if (V->getType()->isPointerTy()) {
216 V = V->stripPointerCasts();
217 } else {
218 CallSite CS(V);
219 if (CS && CS.getCalledFunction()) {
220 Value *NewV = nullptr;
221 for (Argument &Arg : CS.getCalledFunction()->args())
222 if (Arg.hasReturnedAttr()) {
223 NewV = CS.getArgOperand(Arg.getArgNo());
224 break;
226 if (NewV) {
227 Worklist.push_back(NewV);
228 continue;
233 // Look through select instructions, visit both potential values.
234 if (auto *SI = dyn_cast<SelectInst>(V)) {
235 Worklist.push_back(SI->getTrueValue());
236 Worklist.push_back(SI->getFalseValue());
237 continue;
240 // Look through phi nodes, visit all operands.
241 if (auto *PHI = dyn_cast<PHINode>(V)) {
242 Worklist.append(PHI->op_begin(), PHI->op_end());
243 continue;
246 // Once a leaf is reached we inform the user through the callback.
247 VisitValueCB(V, State);
248 } while (!Worklist.empty());
250 // All values have been visited.
251 return true;
254 /// Helper to identify the correct offset into an attribute list.
255 static unsigned getAttrIndex(AbstractAttribute::ManifestPosition MP,
256 unsigned ArgNo = 0) {
257 switch (MP) {
258 case AbstractAttribute::MP_ARGUMENT:
259 case AbstractAttribute::MP_CALL_SITE_ARGUMENT:
260 return ArgNo + AttributeList::FirstArgIndex;
261 case AbstractAttribute::MP_FUNCTION:
262 return AttributeList::FunctionIndex;
263 case AbstractAttribute::MP_RETURNED:
264 return AttributeList::ReturnIndex;
266 llvm_unreachable("Unknown manifest position!");
269 /// Return true if \p New is equal or worse than \p Old.
270 static bool isEqualOrWorse(const Attribute &New, const Attribute &Old) {
271 if (!Old.isIntAttribute())
272 return true;
274 return Old.getValueAsInt() >= New.getValueAsInt();
277 /// Return true if the information provided by \p Attr was added to the
278 /// attribute list \p Attrs. This is only the case if it was not already present
279 /// in \p Attrs at the position describe by \p MP and \p ArgNo.
280 static bool addIfNotExistent(LLVMContext &Ctx, const Attribute &Attr,
281 AttributeList &Attrs,
282 AbstractAttribute::ManifestPosition MP,
283 unsigned ArgNo = 0) {
284 unsigned AttrIdx = getAttrIndex(MP, ArgNo);
286 if (Attr.isEnumAttribute()) {
287 Attribute::AttrKind Kind = Attr.getKindAsEnum();
288 if (Attrs.hasAttribute(AttrIdx, Kind))
289 if (isEqualOrWorse(Attr, Attrs.getAttribute(AttrIdx, Kind)))
290 return false;
291 Attrs = Attrs.addAttribute(Ctx, AttrIdx, Attr);
292 return true;
294 if (Attr.isStringAttribute()) {
295 StringRef Kind = Attr.getKindAsString();
296 if (Attrs.hasAttribute(AttrIdx, Kind))
297 if (isEqualOrWorse(Attr, Attrs.getAttribute(AttrIdx, Kind)))
298 return false;
299 Attrs = Attrs.addAttribute(Ctx, AttrIdx, Attr);
300 return true;
302 if (Attr.isIntAttribute()) {
303 Attribute::AttrKind Kind = Attr.getKindAsEnum();
304 if (Attrs.hasAttribute(AttrIdx, Kind))
305 if (isEqualOrWorse(Attr, Attrs.getAttribute(AttrIdx, Kind)))
306 return false;
307 Attrs = Attrs.removeAttribute(Ctx, AttrIdx, Kind);
308 Attrs = Attrs.addAttribute(Ctx, AttrIdx, Attr);
309 return true;
312 llvm_unreachable("Expected enum or string attribute!");
315 ChangeStatus AbstractAttribute::update(Attributor &A) {
316 ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
317 if (getState().isAtFixpoint())
318 return HasChanged;
320 LLVM_DEBUG(dbgs() << "[Attributor] Update: " << *this << "\n");
322 HasChanged = updateImpl(A);
324 LLVM_DEBUG(dbgs() << "[Attributor] Update " << HasChanged << " " << *this
325 << "\n");
327 return HasChanged;
330 ChangeStatus AbstractAttribute::manifest(Attributor &A) {
331 assert(getState().isValidState() &&
332 "Attempted to manifest an invalid state!");
333 assert(getAssociatedValue() &&
334 "Attempted to manifest an attribute without associated value!");
336 ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
337 SmallVector<Attribute, 4> DeducedAttrs;
338 getDeducedAttributes(DeducedAttrs);
340 Function &ScopeFn = getAnchorScope();
341 LLVMContext &Ctx = ScopeFn.getContext();
342 ManifestPosition MP = getManifestPosition();
344 AttributeList Attrs;
345 SmallVector<unsigned, 4> ArgNos;
347 // In the following some generic code that will manifest attributes in
348 // DeducedAttrs if they improve the current IR. Due to the different
349 // annotation positions we use the underlying AttributeList interface.
350 // Note that MP_CALL_SITE_ARGUMENT can annotate multiple locations.
352 switch (MP) {
353 case MP_ARGUMENT:
354 ArgNos.push_back(cast<Argument>(getAssociatedValue())->getArgNo());
355 Attrs = ScopeFn.getAttributes();
356 break;
357 case MP_FUNCTION:
358 case MP_RETURNED:
359 ArgNos.push_back(0);
360 Attrs = ScopeFn.getAttributes();
361 break;
362 case MP_CALL_SITE_ARGUMENT: {
363 CallSite CS(&getAnchoredValue());
364 for (unsigned u = 0, e = CS.getNumArgOperands(); u != e; u++)
365 if (CS.getArgOperand(u) == getAssociatedValue())
366 ArgNos.push_back(u);
367 Attrs = CS.getAttributes();
371 for (const Attribute &Attr : DeducedAttrs) {
372 for (unsigned ArgNo : ArgNos) {
373 if (!addIfNotExistent(Ctx, Attr, Attrs, MP, ArgNo))
374 continue;
376 HasChanged = ChangeStatus::CHANGED;
377 bookkeeping(MP, Attr);
381 if (HasChanged == ChangeStatus::UNCHANGED)
382 return HasChanged;
384 switch (MP) {
385 case MP_ARGUMENT:
386 case MP_FUNCTION:
387 case MP_RETURNED:
388 ScopeFn.setAttributes(Attrs);
389 break;
390 case MP_CALL_SITE_ARGUMENT:
391 CallSite(&getAnchoredValue()).setAttributes(Attrs);
394 return HasChanged;
397 Function &AbstractAttribute::getAnchorScope() {
398 Value &V = getAnchoredValue();
399 if (isa<Function>(V))
400 return cast<Function>(V);
401 if (isa<Argument>(V))
402 return *cast<Argument>(V).getParent();
403 if (isa<Instruction>(V))
404 return *cast<Instruction>(V).getFunction();
405 llvm_unreachable("No scope for anchored value found!");
408 const Function &AbstractAttribute::getAnchorScope() const {
409 return const_cast<AbstractAttribute *>(this)->getAnchorScope();
412 // Helper function that returns argument index of value.
413 // If the value is not an argument, this returns -1.
414 static int getArgNo(Value &V) {
415 if (auto *Arg = dyn_cast<Argument>(&V))
416 return Arg->getArgNo();
417 return -1;
420 /// -----------------------NoUnwind Function Attribute--------------------------
422 struct AANoUnwindFunction : AANoUnwind, BooleanState {
424 AANoUnwindFunction(Function &F, InformationCache &InfoCache)
425 : AANoUnwind(F, InfoCache) {}
427 /// See AbstractAttribute::getState()
428 /// {
429 AbstractState &getState() override { return *this; }
430 const AbstractState &getState() const override { return *this; }
431 /// }
433 /// See AbstractAttribute::getManifestPosition().
434 ManifestPosition getManifestPosition() const override { return MP_FUNCTION; }
436 const std::string getAsStr() const override {
437 return getAssumed() ? "nounwind" : "may-unwind";
440 /// See AbstractAttribute::updateImpl(...).
441 ChangeStatus updateImpl(Attributor &A) override;
443 /// See AANoUnwind::isAssumedNoUnwind().
444 bool isAssumedNoUnwind() const override { return getAssumed(); }
446 /// See AANoUnwind::isKnownNoUnwind().
447 bool isKnownNoUnwind() const override { return getKnown(); }
450 ChangeStatus AANoUnwindFunction::updateImpl(Attributor &A) {
451 Function &F = getAnchorScope();
453 // The map from instruction opcodes to those instructions in the function.
454 auto &OpcodeInstMap = InfoCache.getOpcodeInstMapForFunction(F);
455 auto Opcodes = {
456 (unsigned)Instruction::Invoke, (unsigned)Instruction::CallBr,
457 (unsigned)Instruction::Call, (unsigned)Instruction::CleanupRet,
458 (unsigned)Instruction::CatchSwitch, (unsigned)Instruction::Resume};
460 for (unsigned Opcode : Opcodes) {
461 for (Instruction *I : OpcodeInstMap[Opcode]) {
462 if (!I->mayThrow())
463 continue;
465 auto *NoUnwindAA = A.getAAFor<AANoUnwind>(*this, *I);
467 if (!NoUnwindAA || !NoUnwindAA->isAssumedNoUnwind()) {
468 indicatePessimisticFixpoint();
469 return ChangeStatus::CHANGED;
473 return ChangeStatus::UNCHANGED;
476 /// --------------------- Function Return Values -------------------------------
478 /// "Attribute" that collects all potential returned values and the return
479 /// instructions that they arise from.
481 /// If there is a unique returned value R, the manifest method will:
482 /// - mark R with the "returned" attribute, if R is an argument.
483 class AAReturnedValuesImpl final : public AAReturnedValues, AbstractState {
485 /// Mapping of values potentially returned by the associated function to the
486 /// return instructions that might return them.
487 DenseMap<Value *, SmallPtrSet<ReturnInst *, 2>> ReturnedValues;
489 /// State flags
491 ///{
492 bool IsFixed;
493 bool IsValidState;
494 bool HasOverdefinedReturnedCalls;
495 ///}
497 /// Collect values that could become \p V in the set \p Values, each mapped to
498 /// \p ReturnInsts.
499 void collectValuesRecursively(
500 Attributor &A, Value *V, SmallPtrSetImpl<ReturnInst *> &ReturnInsts,
501 DenseMap<Value *, SmallPtrSet<ReturnInst *, 2>> &Values) {
503 visitValueCB_t<bool> VisitValueCB = [&](Value *Val, bool &) {
504 assert(!isa<Instruction>(Val) ||
505 &getAnchorScope() == cast<Instruction>(Val)->getFunction());
506 Values[Val].insert(ReturnInsts.begin(), ReturnInsts.end());
509 bool UnusedBool;
510 bool Success = genericValueTraversal(V, UnusedBool, VisitValueCB);
512 // If we did abort the above traversal we haven't see all the values.
513 // Consequently, we cannot know if the information we would derive is
514 // accurate so we give up early.
515 if (!Success)
516 indicatePessimisticFixpoint();
519 public:
520 /// See AbstractAttribute::AbstractAttribute(...).
521 AAReturnedValuesImpl(Function &F, InformationCache &InfoCache)
522 : AAReturnedValues(F, InfoCache) {
523 // We do not have an associated argument yet.
524 AssociatedVal = nullptr;
527 /// See AbstractAttribute::initialize(...).
528 void initialize(Attributor &A) override {
529 // Reset the state.
530 AssociatedVal = nullptr;
531 IsFixed = false;
532 IsValidState = true;
533 HasOverdefinedReturnedCalls = false;
534 ReturnedValues.clear();
536 Function &F = cast<Function>(getAnchoredValue());
538 // The map from instruction opcodes to those instructions in the function.
539 auto &OpcodeInstMap = InfoCache.getOpcodeInstMapForFunction(F);
541 // Look through all arguments, if one is marked as returned we are done.
542 for (Argument &Arg : F.args()) {
543 if (Arg.hasReturnedAttr()) {
545 auto &ReturnInstSet = ReturnedValues[&Arg];
546 for (Instruction *RI : OpcodeInstMap[Instruction::Ret])
547 ReturnInstSet.insert(cast<ReturnInst>(RI));
549 indicateOptimisticFixpoint();
550 return;
554 // If no argument was marked as returned we look at all return instructions
555 // and collect potentially returned values.
556 for (Instruction *RI : OpcodeInstMap[Instruction::Ret]) {
557 SmallPtrSet<ReturnInst *, 1> RISet({cast<ReturnInst>(RI)});
558 collectValuesRecursively(A, cast<ReturnInst>(RI)->getReturnValue(), RISet,
559 ReturnedValues);
563 /// See AbstractAttribute::manifest(...).
564 ChangeStatus manifest(Attributor &A) override;
566 /// See AbstractAttribute::getState(...).
567 AbstractState &getState() override { return *this; }
569 /// See AbstractAttribute::getState(...).
570 const AbstractState &getState() const override { return *this; }
572 /// See AbstractAttribute::getManifestPosition().
573 ManifestPosition getManifestPosition() const override { return MP_ARGUMENT; }
575 /// See AbstractAttribute::updateImpl(Attributor &A).
576 ChangeStatus updateImpl(Attributor &A) override;
578 /// Return the number of potential return values, -1 if unknown.
579 size_t getNumReturnValues() const {
580 return isValidState() ? ReturnedValues.size() : -1;
583 /// Return an assumed unique return value if a single candidate is found. If
584 /// there cannot be one, return a nullptr. If it is not clear yet, return the
585 /// Optional::NoneType.
586 Optional<Value *> getAssumedUniqueReturnValue() const;
588 /// See AbstractState::checkForallReturnedValues(...).
589 bool
590 checkForallReturnedValues(std::function<bool(Value &)> &Pred) const override;
592 /// Pretty print the attribute similar to the IR representation.
593 const std::string getAsStr() const override;
595 /// See AbstractState::isAtFixpoint().
596 bool isAtFixpoint() const override { return IsFixed; }
598 /// See AbstractState::isValidState().
599 bool isValidState() const override { return IsValidState; }
601 /// See AbstractState::indicateOptimisticFixpoint(...).
602 void indicateOptimisticFixpoint() override {
603 IsFixed = true;
604 IsValidState &= true;
606 void indicatePessimisticFixpoint() override {
607 IsFixed = true;
608 IsValidState = false;
612 ChangeStatus AAReturnedValuesImpl::manifest(Attributor &A) {
613 ChangeStatus Changed = ChangeStatus::UNCHANGED;
615 // Bookkeeping.
616 assert(isValidState());
617 NumFnKnownReturns++;
619 // Check if we have an assumed unique return value that we could manifest.
620 Optional<Value *> UniqueRV = getAssumedUniqueReturnValue();
622 if (!UniqueRV.hasValue() || !UniqueRV.getValue())
623 return Changed;
625 // Bookkeeping.
626 NumFnUniqueReturned++;
628 // If the assumed unique return value is an argument, annotate it.
629 if (auto *UniqueRVArg = dyn_cast<Argument>(UniqueRV.getValue())) {
630 AssociatedVal = UniqueRVArg;
631 Changed = AbstractAttribute::manifest(A) | Changed;
634 return Changed;
637 const std::string AAReturnedValuesImpl::getAsStr() const {
638 return (isAtFixpoint() ? "returns(#" : "may-return(#") +
639 (isValidState() ? std::to_string(getNumReturnValues()) : "?") + ")";
642 Optional<Value *> AAReturnedValuesImpl::getAssumedUniqueReturnValue() const {
643 // If checkForallReturnedValues provides a unique value, ignoring potential
644 // undef values that can also be present, it is assumed to be the actual
645 // return value and forwarded to the caller of this method. If there are
646 // multiple, a nullptr is returned indicating there cannot be a unique
647 // returned value.
648 Optional<Value *> UniqueRV;
650 std::function<bool(Value &)> Pred = [&](Value &RV) -> bool {
651 // If we found a second returned value and neither the current nor the saved
652 // one is an undef, there is no unique returned value. Undefs are special
653 // since we can pretend they have any value.
654 if (UniqueRV.hasValue() && UniqueRV != &RV &&
655 !(isa<UndefValue>(RV) || isa<UndefValue>(UniqueRV.getValue()))) {
656 UniqueRV = nullptr;
657 return false;
660 // Do not overwrite a value with an undef.
661 if (!UniqueRV.hasValue() || !isa<UndefValue>(RV))
662 UniqueRV = &RV;
664 return true;
667 if (!checkForallReturnedValues(Pred))
668 UniqueRV = nullptr;
670 return UniqueRV;
673 bool AAReturnedValuesImpl::checkForallReturnedValues(
674 std::function<bool(Value &)> &Pred) const {
675 if (!isValidState())
676 return false;
678 // Check all returned values but ignore call sites as long as we have not
679 // encountered an overdefined one during an update.
680 for (auto &It : ReturnedValues) {
681 Value *RV = It.first;
683 ImmutableCallSite ICS(RV);
684 if (ICS && !HasOverdefinedReturnedCalls)
685 continue;
687 if (!Pred(*RV))
688 return false;
691 return true;
694 ChangeStatus AAReturnedValuesImpl::updateImpl(Attributor &A) {
696 // Check if we know of any values returned by the associated function,
697 // if not, we are done.
698 if (getNumReturnValues() == 0) {
699 indicateOptimisticFixpoint();
700 return ChangeStatus::UNCHANGED;
703 // Check if any of the returned values is a call site we can refine.
704 decltype(ReturnedValues) AddRVs;
705 bool HasCallSite = false;
707 // Look at all returned call sites.
708 for (auto &It : ReturnedValues) {
709 SmallPtrSet<ReturnInst *, 2> &ReturnInsts = It.second;
710 Value *RV = It.first;
711 LLVM_DEBUG(dbgs() << "[AAReturnedValues] Potentially returned value " << *RV
712 << "\n");
714 // Only call sites can change during an update, ignore the rest.
715 CallSite RetCS(RV);
716 if (!RetCS)
717 continue;
719 // For now, any call site we see will prevent us from directly fixing the
720 // state. However, if the information on the callees is fixed, the call
721 // sites will be removed and we will fix the information for this state.
722 HasCallSite = true;
724 // Try to find a assumed unique return value for the called function.
725 auto *RetCSAA = A.getAAFor<AAReturnedValuesImpl>(*this, *RV);
726 if (!RetCSAA) {
727 HasOverdefinedReturnedCalls = true;
728 LLVM_DEBUG(dbgs() << "[AAReturnedValues] Returned call site (" << *RV
729 << ") with " << (RetCSAA ? "invalid" : "no")
730 << " associated state\n");
731 continue;
734 // Try to find a assumed unique return value for the called function.
735 Optional<Value *> AssumedUniqueRV = RetCSAA->getAssumedUniqueReturnValue();
737 // If no assumed unique return value was found due to the lack of
738 // candidates, we may need to resolve more calls (through more update
739 // iterations) or the called function will not return. Either way, we simply
740 // stick with the call sites as return values. Because there were not
741 // multiple possibilities, we do not treat it as overdefined.
742 if (!AssumedUniqueRV.hasValue())
743 continue;
745 // If multiple, non-refinable values were found, there cannot be a unique
746 // return value for the called function. The returned call is overdefined!
747 if (!AssumedUniqueRV.getValue()) {
748 HasOverdefinedReturnedCalls = true;
749 LLVM_DEBUG(dbgs() << "[AAReturnedValues] Returned call site has multiple "
750 "potentially returned values\n");
751 continue;
754 LLVM_DEBUG({
755 bool UniqueRVIsKnown = RetCSAA->isAtFixpoint();
756 dbgs() << "[AAReturnedValues] Returned call site "
757 << (UniqueRVIsKnown ? "known" : "assumed")
758 << " unique return value: " << *AssumedUniqueRV << "\n";
761 // The assumed unique return value.
762 Value *AssumedRetVal = AssumedUniqueRV.getValue();
764 // If the assumed unique return value is an argument, lookup the matching
765 // call site operand and recursively collect new returned values.
766 // If it is not an argument, it is just put into the set of returned values
767 // as we would have already looked through casts, phis, and similar values.
768 if (Argument *AssumedRetArg = dyn_cast<Argument>(AssumedRetVal))
769 collectValuesRecursively(A,
770 RetCS.getArgOperand(AssumedRetArg->getArgNo()),
771 ReturnInsts, AddRVs);
772 else
773 AddRVs[AssumedRetVal].insert(ReturnInsts.begin(), ReturnInsts.end());
776 // Keep track of any change to trigger updates on dependent attributes.
777 ChangeStatus Changed = ChangeStatus::UNCHANGED;
779 for (auto &It : AddRVs) {
780 assert(!It.second.empty() && "Entry does not add anything.");
781 auto &ReturnInsts = ReturnedValues[It.first];
782 for (ReturnInst *RI : It.second)
783 if (ReturnInsts.insert(RI).second) {
784 LLVM_DEBUG(dbgs() << "[AAReturnedValues] Add new returned value "
785 << *It.first << " => " << *RI << "\n");
786 Changed = ChangeStatus::CHANGED;
790 // If there is no call site in the returned values we are done.
791 if (!HasCallSite) {
792 indicateOptimisticFixpoint();
793 return ChangeStatus::CHANGED;
796 return Changed;
799 /// ------------------------ NoSync Function Attribute -------------------------
801 struct AANoSyncFunction : AANoSync, BooleanState {
803 AANoSyncFunction(Function &F, InformationCache &InfoCache)
804 : AANoSync(F, InfoCache) {}
806 /// See AbstractAttribute::getState()
807 /// {
808 AbstractState &getState() override { return *this; }
809 const AbstractState &getState() const override { return *this; }
810 /// }
812 /// See AbstractAttribute::getManifestPosition().
813 ManifestPosition getManifestPosition() const override { return MP_FUNCTION; }
815 const std::string getAsStr() const override {
816 return getAssumed() ? "nosync" : "may-sync";
819 /// See AbstractAttribute::updateImpl(...).
820 ChangeStatus updateImpl(Attributor &A) override;
822 /// See AANoSync::isAssumedNoSync()
823 bool isAssumedNoSync() const override { return getAssumed(); }
825 /// See AANoSync::isKnownNoSync()
826 bool isKnownNoSync() const override { return getKnown(); }
828 /// Helper function used to determine whether an instruction is non-relaxed
829 /// atomic. In other words, if an atomic instruction does not have unordered
830 /// or monotonic ordering
831 static bool isNonRelaxedAtomic(Instruction *I);
833 /// Helper function used to determine whether an instruction is volatile.
834 static bool isVolatile(Instruction *I);
836 /// Helper function uset to check if intrinsic is volatile (memcpy, memmove,
837 /// memset).
838 static bool isNoSyncIntrinsic(Instruction *I);
841 bool AANoSyncFunction::isNonRelaxedAtomic(Instruction *I) {
842 if (!I->isAtomic())
843 return false;
845 AtomicOrdering Ordering;
846 switch (I->getOpcode()) {
847 case Instruction::AtomicRMW:
848 Ordering = cast<AtomicRMWInst>(I)->getOrdering();
849 break;
850 case Instruction::Store:
851 Ordering = cast<StoreInst>(I)->getOrdering();
852 break;
853 case Instruction::Load:
854 Ordering = cast<LoadInst>(I)->getOrdering();
855 break;
856 case Instruction::Fence: {
857 auto *FI = cast<FenceInst>(I);
858 if (FI->getSyncScopeID() == SyncScope::SingleThread)
859 return false;
860 Ordering = FI->getOrdering();
861 break;
863 case Instruction::AtomicCmpXchg: {
864 AtomicOrdering Success = cast<AtomicCmpXchgInst>(I)->getSuccessOrdering();
865 AtomicOrdering Failure = cast<AtomicCmpXchgInst>(I)->getFailureOrdering();
866 // Only if both are relaxed, than it can be treated as relaxed.
867 // Otherwise it is non-relaxed.
868 if (Success != AtomicOrdering::Unordered &&
869 Success != AtomicOrdering::Monotonic)
870 return true;
871 if (Failure != AtomicOrdering::Unordered &&
872 Failure != AtomicOrdering::Monotonic)
873 return true;
874 return false;
876 default:
877 llvm_unreachable(
878 "New atomic operations need to be known in the attributor.");
881 // Relaxed.
882 if (Ordering == AtomicOrdering::Unordered ||
883 Ordering == AtomicOrdering::Monotonic)
884 return false;
885 return true;
888 /// Checks if an intrinsic is nosync. Currently only checks mem* intrinsics.
889 /// FIXME: We should ipmrove the handling of intrinsics.
890 bool AANoSyncFunction::isNoSyncIntrinsic(Instruction *I) {
891 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
892 switch (II->getIntrinsicID()) {
893 /// Element wise atomic memory intrinsics are can only be unordered,
894 /// therefore nosync.
895 case Intrinsic::memset_element_unordered_atomic:
896 case Intrinsic::memmove_element_unordered_atomic:
897 case Intrinsic::memcpy_element_unordered_atomic:
898 return true;
899 case Intrinsic::memset:
900 case Intrinsic::memmove:
901 case Intrinsic::memcpy:
902 if (!cast<MemIntrinsic>(II)->isVolatile())
903 return true;
904 return false;
905 default:
906 return false;
909 return false;
912 bool AANoSyncFunction::isVolatile(Instruction *I) {
913 assert(!ImmutableCallSite(I) && !isa<CallBase>(I) &&
914 "Calls should not be checked here");
916 switch (I->getOpcode()) {
917 case Instruction::AtomicRMW:
918 return cast<AtomicRMWInst>(I)->isVolatile();
919 case Instruction::Store:
920 return cast<StoreInst>(I)->isVolatile();
921 case Instruction::Load:
922 return cast<LoadInst>(I)->isVolatile();
923 case Instruction::AtomicCmpXchg:
924 return cast<AtomicCmpXchgInst>(I)->isVolatile();
925 default:
926 return false;
930 ChangeStatus AANoSyncFunction::updateImpl(Attributor &A) {
931 Function &F = getAnchorScope();
933 /// We are looking for volatile instructions or Non-Relaxed atomics.
934 /// FIXME: We should ipmrove the handling of intrinsics.
935 for (Instruction *I : InfoCache.getReadOrWriteInstsForFunction(F)) {
936 ImmutableCallSite ICS(I);
937 auto *NoSyncAA = A.getAAFor<AANoSyncFunction>(*this, *I);
939 if (isa<IntrinsicInst>(I) && isNoSyncIntrinsic(I))
940 continue;
942 if (ICS && (!NoSyncAA || !NoSyncAA->isAssumedNoSync()) &&
943 !ICS.hasFnAttr(Attribute::NoSync)) {
944 indicatePessimisticFixpoint();
945 return ChangeStatus::CHANGED;
948 if (ICS)
949 continue;
951 if (!isVolatile(I) && !isNonRelaxedAtomic(I))
952 continue;
954 indicatePessimisticFixpoint();
955 return ChangeStatus::CHANGED;
958 auto &OpcodeInstMap = InfoCache.getOpcodeInstMapForFunction(F);
959 auto Opcodes = {(unsigned)Instruction::Invoke, (unsigned)Instruction::CallBr,
960 (unsigned)Instruction::Call};
962 for (unsigned Opcode : Opcodes) {
963 for (Instruction *I : OpcodeInstMap[Opcode]) {
964 // At this point we handled all read/write effects and they are all
965 // nosync, so they can be skipped.
966 if (I->mayReadOrWriteMemory())
967 continue;
969 ImmutableCallSite ICS(I);
971 // non-convergent and readnone imply nosync.
972 if (!ICS.isConvergent())
973 continue;
975 indicatePessimisticFixpoint();
976 return ChangeStatus::CHANGED;
980 return ChangeStatus::UNCHANGED;
983 /// ------------------------ No-Free Attributes ----------------------------
985 struct AANoFreeFunction : AbstractAttribute, BooleanState {
987 /// See AbstractAttribute::AbstractAttribute(...).
988 AANoFreeFunction(Function &F, InformationCache &InfoCache)
989 : AbstractAttribute(F, InfoCache) {}
991 /// See AbstractAttribute::getState()
992 ///{
993 AbstractState &getState() override { return *this; }
994 const AbstractState &getState() const override { return *this; }
995 ///}
997 /// See AbstractAttribute::getManifestPosition().
998 ManifestPosition getManifestPosition() const override { return MP_FUNCTION; }
1000 /// See AbstractAttribute::getAsStr().
1001 const std::string getAsStr() const override {
1002 return getAssumed() ? "nofree" : "may-free";
1005 /// See AbstractAttribute::updateImpl(...).
1006 ChangeStatus updateImpl(Attributor &A) override;
1008 /// See AbstractAttribute::getAttrKind().
1009 Attribute::AttrKind getAttrKind() const override { return ID; }
1011 /// Return true if "nofree" is assumed.
1012 bool isAssumedNoFree() const { return getAssumed(); }
1014 /// Return true if "nofree" is known.
1015 bool isKnownNoFree() const { return getKnown(); }
1017 /// The identifier used by the Attributor for this class of attributes.
1018 static constexpr Attribute::AttrKind ID = Attribute::NoFree;
1021 ChangeStatus AANoFreeFunction::updateImpl(Attributor &A) {
1022 Function &F = getAnchorScope();
1024 // The map from instruction opcodes to those instructions in the function.
1025 auto &OpcodeInstMap = InfoCache.getOpcodeInstMapForFunction(F);
1027 for (unsigned Opcode :
1028 {(unsigned)Instruction::Invoke, (unsigned)Instruction::CallBr,
1029 (unsigned)Instruction::Call}) {
1030 for (Instruction *I : OpcodeInstMap[Opcode]) {
1032 auto ICS = ImmutableCallSite(I);
1033 auto *NoFreeAA = A.getAAFor<AANoFreeFunction>(*this, *I);
1035 if ((!NoFreeAA || !NoFreeAA->isAssumedNoFree()) &&
1036 !ICS.hasFnAttr(Attribute::NoFree)) {
1037 indicatePessimisticFixpoint();
1038 return ChangeStatus::CHANGED;
1042 return ChangeStatus::UNCHANGED;
1045 /// ------------------------ NonNull Argument Attribute ------------------------
1046 struct AANonNullImpl : AANonNull, BooleanState {
1048 AANonNullImpl(Value &V, InformationCache &InfoCache)
1049 : AANonNull(V, InfoCache) {}
1051 AANonNullImpl(Value *AssociatedVal, Value &AnchoredValue,
1052 InformationCache &InfoCache)
1053 : AANonNull(AssociatedVal, AnchoredValue, InfoCache) {}
1055 /// See AbstractAttribute::getState()
1056 /// {
1057 AbstractState &getState() override { return *this; }
1058 const AbstractState &getState() const override { return *this; }
1059 /// }
1061 /// See AbstractAttribute::getAsStr().
1062 const std::string getAsStr() const override {
1063 return getAssumed() ? "nonnull" : "may-null";
1066 /// See AANonNull::isAssumedNonNull().
1067 bool isAssumedNonNull() const override { return getAssumed(); }
1069 /// See AANonNull::isKnownNonNull().
1070 bool isKnownNonNull() const override { return getKnown(); }
1072 /// Generate a predicate that checks if a given value is assumed nonnull.
1073 /// The generated function returns true if a value satisfies any of
1074 /// following conditions.
1075 /// (i) A value is known nonZero(=nonnull).
1076 /// (ii) A value is associated with AANonNull and its isAssumedNonNull() is
1077 /// true.
1078 std::function<bool(Value &)> generatePredicate(Attributor &);
1081 std::function<bool(Value &)> AANonNullImpl::generatePredicate(Attributor &A) {
1082 // FIXME: The `AAReturnedValues` should provide the predicate with the
1083 // `ReturnInst` vector as well such that we can use the control flow sensitive
1084 // version of `isKnownNonZero`. This should fix `test11` in
1085 // `test/Transforms/FunctionAttrs/nonnull.ll`
1087 std::function<bool(Value &)> Pred = [&](Value &RV) -> bool {
1088 if (isKnownNonZero(&RV, getAnchorScope().getParent()->getDataLayout()))
1089 return true;
1091 auto *NonNullAA = A.getAAFor<AANonNull>(*this, RV);
1093 ImmutableCallSite ICS(&RV);
1095 if ((!NonNullAA || !NonNullAA->isAssumedNonNull()) &&
1096 (!ICS || !ICS.hasRetAttr(Attribute::NonNull)))
1097 return false;
1099 return true;
1102 return Pred;
1105 /// NonNull attribute for function return value.
1106 struct AANonNullReturned : AANonNullImpl {
1108 AANonNullReturned(Function &F, InformationCache &InfoCache)
1109 : AANonNullImpl(F, InfoCache) {}
1111 /// See AbstractAttribute::getManifestPosition().
1112 ManifestPosition getManifestPosition() const override { return MP_RETURNED; }
1114 /// See AbstractAttriubute::initialize(...).
1115 void initialize(Attributor &A) override {
1116 Function &F = getAnchorScope();
1118 // Already nonnull.
1119 if (F.getAttributes().hasAttribute(AttributeList::ReturnIndex,
1120 Attribute::NonNull) ||
1121 F.getAttributes().hasAttribute(AttributeList::ReturnIndex,
1122 Attribute::Dereferenceable))
1123 indicateOptimisticFixpoint();
1126 /// See AbstractAttribute::updateImpl(...).
1127 ChangeStatus updateImpl(Attributor &A) override;
1130 ChangeStatus AANonNullReturned::updateImpl(Attributor &A) {
1131 Function &F = getAnchorScope();
1133 auto *AARetVal = A.getAAFor<AAReturnedValues>(*this, F);
1134 if (!AARetVal) {
1135 indicatePessimisticFixpoint();
1136 return ChangeStatus::CHANGED;
1139 std::function<bool(Value &)> Pred = this->generatePredicate(A);
1140 if (!AARetVal->checkForallReturnedValues(Pred)) {
1141 indicatePessimisticFixpoint();
1142 return ChangeStatus::CHANGED;
1144 return ChangeStatus::UNCHANGED;
1147 /// NonNull attribute for function argument.
1148 struct AANonNullArgument : AANonNullImpl {
1150 AANonNullArgument(Argument &A, InformationCache &InfoCache)
1151 : AANonNullImpl(A, InfoCache) {}
1153 /// See AbstractAttribute::getManifestPosition().
1154 ManifestPosition getManifestPosition() const override { return MP_ARGUMENT; }
1156 /// See AbstractAttriubute::initialize(...).
1157 void initialize(Attributor &A) override {
1158 Argument *Arg = cast<Argument>(getAssociatedValue());
1159 if (Arg->hasNonNullAttr())
1160 indicateOptimisticFixpoint();
1163 /// See AbstractAttribute::updateImpl(...).
1164 ChangeStatus updateImpl(Attributor &A) override;
1167 /// NonNull attribute for a call site argument.
1168 struct AANonNullCallSiteArgument : AANonNullImpl {
1170 /// See AANonNullImpl::AANonNullImpl(...).
1171 AANonNullCallSiteArgument(CallSite CS, unsigned ArgNo,
1172 InformationCache &InfoCache)
1173 : AANonNullImpl(CS.getArgOperand(ArgNo), *CS.getInstruction(), InfoCache),
1174 ArgNo(ArgNo) {}
1176 /// See AbstractAttribute::initialize(...).
1177 void initialize(Attributor &A) override {
1178 CallSite CS(&getAnchoredValue());
1179 if (CS.paramHasAttr(ArgNo, getAttrKind()) ||
1180 CS.paramHasAttr(ArgNo, Attribute::Dereferenceable) ||
1181 isKnownNonZero(getAssociatedValue(),
1182 getAnchorScope().getParent()->getDataLayout()))
1183 indicateOptimisticFixpoint();
1186 /// See AbstractAttribute::updateImpl(Attributor &A).
1187 ChangeStatus updateImpl(Attributor &A) override;
1189 /// See AbstractAttribute::getManifestPosition().
1190 ManifestPosition getManifestPosition() const override {
1191 return MP_CALL_SITE_ARGUMENT;
1194 // Return argument index of associated value.
1195 int getArgNo() const { return ArgNo; }
1197 private:
1198 unsigned ArgNo;
1200 ChangeStatus AANonNullArgument::updateImpl(Attributor &A) {
1201 Function &F = getAnchorScope();
1202 Argument &Arg = cast<Argument>(getAnchoredValue());
1204 unsigned ArgNo = Arg.getArgNo();
1206 // Callback function
1207 std::function<bool(CallSite)> CallSiteCheck = [&](CallSite CS) {
1208 assert(CS && "Sanity check: Call site was not initialized properly!");
1210 auto *NonNullAA = A.getAAFor<AANonNull>(*this, *CS.getInstruction(), ArgNo);
1212 // Check that NonNullAA is AANonNullCallSiteArgument.
1213 if (NonNullAA) {
1214 ImmutableCallSite ICS(&NonNullAA->getAnchoredValue());
1215 if (ICS && CS.getInstruction() == ICS.getInstruction())
1216 return NonNullAA->isAssumedNonNull();
1217 return false;
1220 if (CS.paramHasAttr(ArgNo, Attribute::NonNull))
1221 return true;
1223 Value *V = CS.getArgOperand(ArgNo);
1224 if (isKnownNonZero(V, getAnchorScope().getParent()->getDataLayout()))
1225 return true;
1227 return false;
1229 if (!A.checkForAllCallSites(F, CallSiteCheck, true)) {
1230 indicatePessimisticFixpoint();
1231 return ChangeStatus::CHANGED;
1233 return ChangeStatus::UNCHANGED;
1236 ChangeStatus AANonNullCallSiteArgument::updateImpl(Attributor &A) {
1237 // NOTE: Never look at the argument of the callee in this method.
1238 // If we do this, "nonnull" is always deduced because of the assumption.
1240 Value &V = *getAssociatedValue();
1242 auto *NonNullAA = A.getAAFor<AANonNull>(*this, V);
1244 if (!NonNullAA || !NonNullAA->isAssumedNonNull()) {
1245 indicatePessimisticFixpoint();
1246 return ChangeStatus::CHANGED;
1249 return ChangeStatus::UNCHANGED;
1252 /// ------------------------ Will-Return Attributes ----------------------------
1254 struct AAWillReturnImpl : public AAWillReturn, BooleanState {
1256 /// See AbstractAttribute::AbstractAttribute(...).
1257 AAWillReturnImpl(Function &F, InformationCache &InfoCache)
1258 : AAWillReturn(F, InfoCache) {}
1260 /// See AAWillReturn::isKnownWillReturn().
1261 bool isKnownWillReturn() const override { return getKnown(); }
1263 /// See AAWillReturn::isAssumedWillReturn().
1264 bool isAssumedWillReturn() const override { return getAssumed(); }
1266 /// See AbstractAttribute::getState(...).
1267 AbstractState &getState() override { return *this; }
1269 /// See AbstractAttribute::getState(...).
1270 const AbstractState &getState() const override { return *this; }
1272 /// See AbstractAttribute::getAsStr()
1273 const std::string getAsStr() const override {
1274 return getAssumed() ? "willreturn" : "may-noreturn";
1278 struct AAWillReturnFunction final : AAWillReturnImpl {
1280 /// See AbstractAttribute::AbstractAttribute(...).
1281 AAWillReturnFunction(Function &F, InformationCache &InfoCache)
1282 : AAWillReturnImpl(F, InfoCache) {}
1284 /// See AbstractAttribute::getManifestPosition().
1285 ManifestPosition getManifestPosition() const override { return MP_FUNCTION; }
1287 /// See AbstractAttribute::initialize(...).
1288 void initialize(Attributor &A) override;
1290 /// See AbstractAttribute::updateImpl(...).
1291 ChangeStatus updateImpl(Attributor &A) override;
1294 // Helper function that checks whether a function has any cycle.
1295 // TODO: Replace with more efficent code
1296 bool containsCycle(Function &F) {
1297 SmallPtrSet<BasicBlock *, 32> Visited;
1299 // Traverse BB by dfs and check whether successor is already visited.
1300 for (BasicBlock *BB : depth_first(&F)) {
1301 Visited.insert(BB);
1302 for (auto *SuccBB : successors(BB)) {
1303 if (Visited.count(SuccBB))
1304 return true;
1307 return false;
1310 // Helper function that checks the function have a loop which might become an
1311 // endless loop
1312 // FIXME: Any cycle is regarded as endless loop for now.
1313 // We have to allow some patterns.
1314 bool containsPossiblyEndlessLoop(Function &F) { return containsCycle(F); }
1316 void AAWillReturnFunction::initialize(Attributor &A) {
1317 Function &F = getAnchorScope();
1319 if (containsPossiblyEndlessLoop(F))
1320 indicatePessimisticFixpoint();
1323 ChangeStatus AAWillReturnFunction::updateImpl(Attributor &A) {
1324 Function &F = getAnchorScope();
1326 // The map from instruction opcodes to those instructions in the function.
1327 auto &OpcodeInstMap = InfoCache.getOpcodeInstMapForFunction(F);
1329 for (unsigned Opcode :
1330 {(unsigned)Instruction::Invoke, (unsigned)Instruction::CallBr,
1331 (unsigned)Instruction::Call}) {
1332 for (Instruction *I : OpcodeInstMap[Opcode]) {
1333 auto ICS = ImmutableCallSite(I);
1335 if (ICS.hasFnAttr(Attribute::WillReturn))
1336 continue;
1338 auto *WillReturnAA = A.getAAFor<AAWillReturn>(*this, *I);
1339 if (!WillReturnAA || !WillReturnAA->isAssumedWillReturn()) {
1340 indicatePessimisticFixpoint();
1341 return ChangeStatus::CHANGED;
1344 auto *NoRecurseAA = A.getAAFor<AANoRecurse>(*this, *I);
1346 // FIXME: (i) Prohibit any recursion for now.
1347 // (ii) AANoRecurse isn't implemented yet so currently any call is
1348 // regarded as having recursion.
1349 // Code below should be
1350 // if ((!NoRecurseAA || !NoRecurseAA->isAssumedNoRecurse()) &&
1351 if (!NoRecurseAA && !ICS.hasFnAttr(Attribute::NoRecurse)) {
1352 indicatePessimisticFixpoint();
1353 return ChangeStatus::CHANGED;
1358 return ChangeStatus::UNCHANGED;
1361 /// ------------------------ NoAlias Argument Attribute ------------------------
1363 struct AANoAliasImpl : AANoAlias, BooleanState {
1365 AANoAliasImpl(Value &V, InformationCache &InfoCache)
1366 : AANoAlias(V, InfoCache) {}
1368 /// See AbstractAttribute::getState()
1369 /// {
1370 AbstractState &getState() override { return *this; }
1371 const AbstractState &getState() const override { return *this; }
1372 /// }
1374 const std::string getAsStr() const override {
1375 return getAssumed() ? "noalias" : "may-alias";
1378 /// See AANoAlias::isAssumedNoAlias().
1379 bool isAssumedNoAlias() const override { return getAssumed(); }
1381 /// See AANoAlias::isKnowndNoAlias().
1382 bool isKnownNoAlias() const override { return getKnown(); }
1385 /// NoAlias attribute for function return value.
1386 struct AANoAliasReturned : AANoAliasImpl {
1388 AANoAliasReturned(Function &F, InformationCache &InfoCache)
1389 : AANoAliasImpl(F, InfoCache) {}
1391 /// See AbstractAttribute::getManifestPosition().
1392 virtual ManifestPosition getManifestPosition() const override {
1393 return MP_RETURNED;
1396 /// See AbstractAttriubute::initialize(...).
1397 void initialize(Attributor &A) override {
1398 Function &F = getAnchorScope();
1400 // Already noalias.
1401 if (F.returnDoesNotAlias()) {
1402 indicateOptimisticFixpoint();
1403 return;
1407 /// See AbstractAttribute::updateImpl(...).
1408 virtual ChangeStatus updateImpl(Attributor &A) override;
1411 ChangeStatus AANoAliasReturned::updateImpl(Attributor &A) {
1412 Function &F = getAnchorScope();
1414 auto *AARetValImpl = A.getAAFor<AAReturnedValuesImpl>(*this, F);
1415 if (!AARetValImpl) {
1416 indicatePessimisticFixpoint();
1417 return ChangeStatus::CHANGED;
1420 std::function<bool(Value &)> Pred = [&](Value &RV) -> bool {
1421 if (Constant *C = dyn_cast<Constant>(&RV))
1422 if (C->isNullValue() || isa<UndefValue>(C))
1423 return true;
1425 /// For now, we can only deduce noalias if we have call sites.
1426 /// FIXME: add more support.
1427 ImmutableCallSite ICS(&RV);
1428 if (!ICS)
1429 return false;
1431 auto *NoAliasAA = A.getAAFor<AANoAlias>(*this, RV);
1433 if (!ICS.returnDoesNotAlias() &&
1434 (!NoAliasAA || !NoAliasAA->isAssumedNoAlias()))
1435 return false;
1437 /// FIXME: We can improve capture check in two ways:
1438 /// 1. Use the AANoCapture facilities.
1439 /// 2. Use the location of return insts for escape queries.
1440 if (PointerMayBeCaptured(&RV, /* ReturnCaptures */ false,
1441 /* StoreCaptures */ true))
1442 return false;
1444 return true;
1447 if (!AARetValImpl->checkForallReturnedValues(Pred)) {
1448 indicatePessimisticFixpoint();
1449 return ChangeStatus::CHANGED;
1452 return ChangeStatus::UNCHANGED;
1455 /// -------------------AAIsDead Function Attribute-----------------------
1457 struct AAIsDeadFunction : AAIsDead, BooleanState {
1459 AAIsDeadFunction(Function &F, InformationCache &InfoCache)
1460 : AAIsDead(F, InfoCache) {}
1462 /// See AbstractAttribute::getState()
1463 /// {
1464 AbstractState &getState() override { return *this; }
1465 const AbstractState &getState() const override { return *this; }
1466 /// }
1468 /// See AbstractAttribute::getManifestPosition().
1469 ManifestPosition getManifestPosition() const override { return MP_FUNCTION; }
1471 void initialize(Attributor &A) override {
1472 Function &F = getAnchorScope();
1474 ToBeExploredPaths.insert(&(F.getEntryBlock().front()));
1475 AssumedLiveBlocks.insert(&(F.getEntryBlock()));
1476 for (size_t i = 0; i < ToBeExploredPaths.size(); ++i)
1477 explorePath(A, ToBeExploredPaths[i]);
1480 /// Explores new instructions starting from \p I. If instruction is dead, stop
1481 /// and return true if it discovered a new instruction.
1482 bool explorePath(Attributor &A, Instruction *I);
1484 const std::string getAsStr() const override {
1485 return "LiveBBs(" + std::to_string(AssumedLiveBlocks.size()) + "/" +
1486 std::to_string(getAnchorScope().size()) + ")";
1489 /// See AbstractAttribute::manifest(...).
1490 ChangeStatus manifest(Attributor &A) override {
1491 assert(getState().isValidState() &&
1492 "Attempted to manifest an invalid state!");
1494 ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
1496 for (Instruction *I : NoReturnCalls) {
1497 BasicBlock *BB = I->getParent();
1499 /// Invoke is replaced with a call and unreachable is placed after it.
1500 if (auto *II = dyn_cast<InvokeInst>(I)) {
1501 changeToCall(II);
1502 changeToUnreachable(BB->getTerminator(), /* UseLLVMTrap */ false);
1503 LLVM_DEBUG(dbgs() << "[AAIsDead] Replaced invoke with call inst\n");
1504 continue;
1507 SplitBlock(BB, I->getNextNode());
1508 changeToUnreachable(BB->getTerminator(), /* UseLLVMTrap */ false);
1509 HasChanged = ChangeStatus::CHANGED;
1512 return HasChanged;
1515 /// See AbstractAttribute::updateImpl(...).
1516 ChangeStatus updateImpl(Attributor &A) override;
1518 /// See AAIsDead::isAssumedDead().
1519 bool isAssumedDead(BasicBlock *BB) const override {
1520 if (!getAssumed())
1521 return false;
1522 return !AssumedLiveBlocks.count(BB);
1525 /// See AAIsDead::isKnownDead().
1526 bool isKnownDead(BasicBlock *BB) const override {
1527 if (!getKnown())
1528 return false;
1529 return !AssumedLiveBlocks.count(BB);
1532 /// Collection of to be explored paths.
1533 SmallSetVector<Instruction *, 8> ToBeExploredPaths;
1535 /// Collection of all assumed live BasicBlocks.
1536 DenseSet<BasicBlock *> AssumedLiveBlocks;
1538 /// Collection of calls with noreturn attribute, assumed or knwon.
1539 SmallSetVector<Instruction *, 4> NoReturnCalls;
1542 bool AAIsDeadFunction::explorePath(Attributor &A, Instruction *I) {
1543 BasicBlock *BB = I->getParent();
1545 while (I) {
1546 ImmutableCallSite ICS(I);
1548 if (ICS) {
1549 auto *NoReturnAA = A.getAAFor<AANoReturn>(*this, *I);
1551 if (NoReturnAA && NoReturnAA->isAssumedNoReturn()) {
1552 if (!NoReturnCalls.insert(I))
1553 // If I is already in the NoReturnCalls set, then it stayed noreturn
1554 // and we didn't discover any new instructions.
1555 return false;
1557 // Discovered new noreturn call, return true to indicate that I is not
1558 // noreturn anymore and should be deleted from NoReturnCalls.
1559 return true;
1562 if (ICS.hasFnAttr(Attribute::NoReturn)) {
1563 if (!NoReturnCalls.insert(I))
1564 return false;
1566 return true;
1570 I = I->getNextNode();
1573 // get new paths (reachable blocks).
1574 for (BasicBlock *SuccBB : successors(BB)) {
1575 Instruction *Inst = &(SuccBB->front());
1576 AssumedLiveBlocks.insert(SuccBB);
1577 ToBeExploredPaths.insert(Inst);
1580 return true;
1583 ChangeStatus AAIsDeadFunction::updateImpl(Attributor &A) {
1584 // Temporary collection to iterate over existing noreturn instructions. This
1585 // will alow easier modification of NoReturnCalls collection
1586 SmallVector<Instruction *, 8> NoReturnChanged;
1587 ChangeStatus Status = ChangeStatus::UNCHANGED;
1589 for (Instruction *I : NoReturnCalls)
1590 NoReturnChanged.push_back(I);
1592 for (Instruction *I : NoReturnChanged) {
1593 size_t Size = ToBeExploredPaths.size();
1595 // Still noreturn.
1596 if (!explorePath(A, I))
1597 continue;
1599 NoReturnCalls.remove(I);
1601 // No new paths.
1602 if (Size == ToBeExploredPaths.size())
1603 continue;
1605 // At least one new path.
1606 Status = ChangeStatus::CHANGED;
1608 // explore new paths.
1609 while (Size != ToBeExploredPaths.size())
1610 explorePath(A, ToBeExploredPaths[Size++]);
1613 LLVM_DEBUG(
1614 dbgs() << "[AAIsDead] AssumedLiveBlocks: " << AssumedLiveBlocks.size()
1615 << "Total number of blocks: " << getAnchorScope().size() << "\n");
1617 return Status;
1620 /// -------------------- Dereferenceable Argument Attribute --------------------
1622 struct DerefState : AbstractState {
1624 /// State representing for dereferenceable bytes.
1625 IntegerState DerefBytesState;
1627 /// State representing that whether the value is nonnull or global.
1628 IntegerState NonNullGlobalState;
1630 /// Bits encoding for NonNullGlobalState.
1631 enum {
1632 DEREF_NONNULL = 1 << 0,
1633 DEREF_GLOBAL = 1 << 1,
1636 /// See AbstractState::isValidState()
1637 bool isValidState() const override { return DerefBytesState.isValidState(); }
1639 // See AbstractState::isAtFixpoint()
1640 bool isAtFixpoint() const override {
1641 return DerefBytesState.isAtFixpoint() && NonNullGlobalState.isAtFixpoint();
1644 /// See AbstractState::indicateOptimisticFixpoint(...)
1645 void indicateOptimisticFixpoint() override {
1646 DerefBytesState.indicateOptimisticFixpoint();
1647 NonNullGlobalState.indicateOptimisticFixpoint();
1650 /// See AbstractState::indicatePessimisticFixpoint(...)
1651 void indicatePessimisticFixpoint() override {
1652 DerefBytesState.indicatePessimisticFixpoint();
1653 NonNullGlobalState.indicatePessimisticFixpoint();
1656 /// Update known dereferenceable bytes.
1657 void takeKnownDerefBytesMaximum(uint64_t Bytes) {
1658 DerefBytesState.takeKnownMaximum(Bytes);
1661 /// Update assumed dereferenceable bytes.
1662 void takeAssumedDerefBytesMinimum(uint64_t Bytes) {
1663 DerefBytesState.takeAssumedMinimum(Bytes);
1666 /// Update assumed NonNullGlobalState
1667 void updateAssumedNonNullGlobalState(bool IsNonNull, bool IsGlobal) {
1668 if (!IsNonNull)
1669 NonNullGlobalState.removeAssumedBits(DEREF_NONNULL);
1670 if (!IsGlobal)
1671 NonNullGlobalState.removeAssumedBits(DEREF_GLOBAL);
1674 /// Equality for DerefState.
1675 bool operator==(const DerefState &R) {
1676 return this->DerefBytesState == R.DerefBytesState &&
1677 this->NonNullGlobalState == R.NonNullGlobalState;
1680 struct AADereferenceableImpl : AADereferenceable, DerefState {
1682 AADereferenceableImpl(Value &V, InformationCache &InfoCache)
1683 : AADereferenceable(V, InfoCache) {}
1685 AADereferenceableImpl(Value *AssociatedVal, Value &AnchoredValue,
1686 InformationCache &InfoCache)
1687 : AADereferenceable(AssociatedVal, AnchoredValue, InfoCache) {}
1689 /// See AbstractAttribute::getState()
1690 /// {
1691 AbstractState &getState() override { return *this; }
1692 const AbstractState &getState() const override { return *this; }
1693 /// }
1695 /// See AADereferenceable::getAssumedDereferenceableBytes().
1696 uint32_t getAssumedDereferenceableBytes() const override {
1697 return DerefBytesState.getAssumed();
1700 /// See AADereferenceable::getKnownDereferenceableBytes().
1701 uint32_t getKnownDereferenceableBytes() const override {
1702 return DerefBytesState.getKnown();
1705 // Helper function for syncing nonnull state.
1706 void syncNonNull(const AANonNull *NonNullAA) {
1707 if (!NonNullAA) {
1708 NonNullGlobalState.removeAssumedBits(DEREF_NONNULL);
1709 return;
1712 if (NonNullAA->isKnownNonNull())
1713 NonNullGlobalState.addKnownBits(DEREF_NONNULL);
1715 if (!NonNullAA->isAssumedNonNull())
1716 NonNullGlobalState.removeAssumedBits(DEREF_NONNULL);
1719 /// See AADereferenceable::isAssumedGlobal().
1720 bool isAssumedGlobal() const override {
1721 return NonNullGlobalState.isAssumed(DEREF_GLOBAL);
1724 /// See AADereferenceable::isKnownGlobal().
1725 bool isKnownGlobal() const override {
1726 return NonNullGlobalState.isKnown(DEREF_GLOBAL);
1729 /// See AADereferenceable::isAssumedNonNull().
1730 bool isAssumedNonNull() const override {
1731 return NonNullGlobalState.isAssumed(DEREF_NONNULL);
1734 /// See AADereferenceable::isKnownNonNull().
1735 bool isKnownNonNull() const override {
1736 return NonNullGlobalState.isKnown(DEREF_NONNULL);
1739 void getDeducedAttributes(SmallVectorImpl<Attribute> &Attrs) const override {
1740 LLVMContext &Ctx = AnchoredVal.getContext();
1742 // TODO: Add *_globally support
1743 if (isAssumedNonNull())
1744 Attrs.emplace_back(Attribute::getWithDereferenceableBytes(
1745 Ctx, getAssumedDereferenceableBytes()));
1746 else
1747 Attrs.emplace_back(Attribute::getWithDereferenceableOrNullBytes(
1748 Ctx, getAssumedDereferenceableBytes()));
1750 uint64_t computeAssumedDerefenceableBytes(Attributor &A, Value &V,
1751 bool &IsNonNull, bool &IsGlobal);
1753 void initialize(Attributor &A) override {
1754 Function &F = getAnchorScope();
1755 unsigned AttrIdx =
1756 getAttrIndex(getManifestPosition(), getArgNo(getAnchoredValue()));
1758 for (Attribute::AttrKind AK :
1759 {Attribute::Dereferenceable, Attribute::DereferenceableOrNull})
1760 if (F.getAttributes().hasAttribute(AttrIdx, AK))
1761 takeKnownDerefBytesMaximum(F.getAttribute(AttrIdx, AK).getValueAsInt());
1764 /// See AbstractAttribute::getAsStr().
1765 const std::string getAsStr() const override {
1766 if (!getAssumedDereferenceableBytes())
1767 return "unknown-dereferenceable";
1768 return std::string("dereferenceable") +
1769 (isAssumedNonNull() ? "" : "_or_null") +
1770 (isAssumedGlobal() ? "_globally" : "") + "<" +
1771 std::to_string(getKnownDereferenceableBytes()) + "-" +
1772 std::to_string(getAssumedDereferenceableBytes()) + ">";
1776 struct AADereferenceableReturned : AADereferenceableImpl {
1777 AADereferenceableReturned(Function &F, InformationCache &InfoCache)
1778 : AADereferenceableImpl(F, InfoCache) {}
1780 /// See AbstractAttribute::getManifestPosition().
1781 ManifestPosition getManifestPosition() const override { return MP_RETURNED; }
1783 /// See AbstractAttribute::updateImpl(...).
1784 ChangeStatus updateImpl(Attributor &A) override;
1787 // Helper function that returns dereferenceable bytes.
1788 static uint64_t calcDifferenceIfBaseIsNonNull(int64_t DerefBytes,
1789 int64_t Offset, bool IsNonNull) {
1790 if (!IsNonNull)
1791 return 0;
1792 return std::max((int64_t)0, DerefBytes - Offset);
1795 uint64_t AADereferenceableImpl::computeAssumedDerefenceableBytes(
1796 Attributor &A, Value &V, bool &IsNonNull, bool &IsGlobal) {
1797 // TODO: Tracking the globally flag.
1798 IsGlobal = false;
1800 // First, we try to get information about V from Attributor.
1801 if (auto *DerefAA = A.getAAFor<AADereferenceable>(*this, V)) {
1802 IsNonNull &= DerefAA->isAssumedNonNull();
1803 return DerefAA->getAssumedDereferenceableBytes();
1806 // Otherwise, we try to compute assumed bytes from base pointer.
1807 const DataLayout &DL = getAnchorScope().getParent()->getDataLayout();
1808 unsigned IdxWidth =
1809 DL.getIndexSizeInBits(V.getType()->getPointerAddressSpace());
1810 APInt Offset(IdxWidth, 0);
1811 Value *Base = V.stripAndAccumulateInBoundsConstantOffsets(DL, Offset);
1813 if (auto *BaseDerefAA = A.getAAFor<AADereferenceable>(*this, *Base)) {
1814 IsNonNull &= Offset != 0;
1815 return calcDifferenceIfBaseIsNonNull(
1816 BaseDerefAA->getAssumedDereferenceableBytes(), Offset.getSExtValue(),
1817 Offset != 0 || BaseDerefAA->isAssumedNonNull());
1820 // Then, use IR information.
1822 if (isDereferenceablePointer(Base, Base->getType(), DL))
1823 return calcDifferenceIfBaseIsNonNull(
1824 DL.getTypeStoreSize(Base->getType()->getPointerElementType()),
1825 Offset.getSExtValue(),
1826 !NullPointerIsDefined(&getAnchorScope(),
1827 V.getType()->getPointerAddressSpace()));
1829 IsNonNull = false;
1830 return 0;
1832 ChangeStatus AADereferenceableReturned::updateImpl(Attributor &A) {
1833 Function &F = getAnchorScope();
1834 auto BeforeState = static_cast<DerefState>(*this);
1836 syncNonNull(A.getAAFor<AANonNull>(*this, F));
1838 auto *AARetVal = A.getAAFor<AAReturnedValues>(*this, F);
1839 if (!AARetVal) {
1840 indicatePessimisticFixpoint();
1841 return ChangeStatus::CHANGED;
1844 bool IsNonNull = isAssumedNonNull();
1845 bool IsGlobal = isAssumedGlobal();
1847 std::function<bool(Value &)> Pred = [&](Value &RV) -> bool {
1848 takeAssumedDerefBytesMinimum(
1849 computeAssumedDerefenceableBytes(A, RV, IsNonNull, IsGlobal));
1850 return isValidState();
1853 if (AARetVal->checkForallReturnedValues(Pred)) {
1854 updateAssumedNonNullGlobalState(IsNonNull, IsGlobal);
1855 return BeforeState == static_cast<DerefState>(*this)
1856 ? ChangeStatus::UNCHANGED
1857 : ChangeStatus::CHANGED;
1859 indicatePessimisticFixpoint();
1860 return ChangeStatus::CHANGED;
1863 struct AADereferenceableArgument : AADereferenceableImpl {
1864 AADereferenceableArgument(Argument &A, InformationCache &InfoCache)
1865 : AADereferenceableImpl(A, InfoCache) {}
1867 /// See AbstractAttribute::getManifestPosition().
1868 ManifestPosition getManifestPosition() const override { return MP_ARGUMENT; }
1870 /// See AbstractAttribute::updateImpl(...).
1871 ChangeStatus updateImpl(Attributor &A) override;
1874 ChangeStatus AADereferenceableArgument::updateImpl(Attributor &A) {
1875 Function &F = getAnchorScope();
1876 Argument &Arg = cast<Argument>(getAnchoredValue());
1878 auto BeforeState = static_cast<DerefState>(*this);
1880 unsigned ArgNo = Arg.getArgNo();
1882 syncNonNull(A.getAAFor<AANonNull>(*this, F, ArgNo));
1884 bool IsNonNull = isAssumedNonNull();
1885 bool IsGlobal = isAssumedGlobal();
1887 // Callback function
1888 std::function<bool(CallSite)> CallSiteCheck = [&](CallSite CS) -> bool {
1889 assert(CS && "Sanity check: Call site was not initialized properly!");
1891 // Check that DereferenceableAA is AADereferenceableCallSiteArgument.
1892 if (auto *DereferenceableAA =
1893 A.getAAFor<AADereferenceable>(*this, *CS.getInstruction(), ArgNo)) {
1894 ImmutableCallSite ICS(&DereferenceableAA->getAnchoredValue());
1895 if (ICS && CS.getInstruction() == ICS.getInstruction()) {
1896 takeAssumedDerefBytesMinimum(
1897 DereferenceableAA->getAssumedDereferenceableBytes());
1898 IsNonNull &= DereferenceableAA->isAssumedNonNull();
1899 IsGlobal &= DereferenceableAA->isAssumedGlobal();
1900 return isValidState();
1904 takeAssumedDerefBytesMinimum(computeAssumedDerefenceableBytes(
1905 A, *CS.getArgOperand(ArgNo), IsNonNull, IsGlobal));
1907 return isValidState();
1910 if (!A.checkForAllCallSites(F, CallSiteCheck, true)) {
1911 indicatePessimisticFixpoint();
1912 return ChangeStatus::CHANGED;
1915 updateAssumedNonNullGlobalState(IsNonNull, IsGlobal);
1917 return BeforeState == static_cast<DerefState>(*this) ? ChangeStatus::UNCHANGED
1918 : ChangeStatus::CHANGED;
1921 /// Dereferenceable attribute for a call site argument.
1922 struct AADereferenceableCallSiteArgument : AADereferenceableImpl {
1924 /// See AADereferenceableImpl::AADereferenceableImpl(...).
1925 AADereferenceableCallSiteArgument(CallSite CS, unsigned ArgNo,
1926 InformationCache &InfoCache)
1927 : AADereferenceableImpl(CS.getArgOperand(ArgNo), *CS.getInstruction(),
1928 InfoCache),
1929 ArgNo(ArgNo) {}
1931 /// See AbstractAttribute::initialize(...).
1932 void initialize(Attributor &A) override {
1933 CallSite CS(&getAnchoredValue());
1934 if (CS.paramHasAttr(ArgNo, Attribute::Dereferenceable))
1935 takeKnownDerefBytesMaximum(CS.getDereferenceableBytes(ArgNo));
1937 if (CS.paramHasAttr(ArgNo, Attribute::DereferenceableOrNull))
1938 takeKnownDerefBytesMaximum(CS.getDereferenceableOrNullBytes(ArgNo));
1941 /// See AbstractAttribute::updateImpl(Attributor &A).
1942 ChangeStatus updateImpl(Attributor &A) override;
1944 /// See AbstractAttribute::getManifestPosition().
1945 ManifestPosition getManifestPosition() const override {
1946 return MP_CALL_SITE_ARGUMENT;
1949 // Return argument index of associated value.
1950 int getArgNo() const { return ArgNo; }
1952 private:
1953 unsigned ArgNo;
1956 ChangeStatus AADereferenceableCallSiteArgument::updateImpl(Attributor &A) {
1957 // NOTE: Never look at the argument of the callee in this method.
1958 // If we do this, "dereferenceable" is always deduced because of the
1959 // assumption.
1961 Value &V = *getAssociatedValue();
1963 auto BeforeState = static_cast<DerefState>(*this);
1965 syncNonNull(A.getAAFor<AANonNull>(*this, getAnchoredValue(), ArgNo));
1966 bool IsNonNull = isAssumedNonNull();
1967 bool IsGlobal = isKnownGlobal();
1969 takeAssumedDerefBytesMinimum(
1970 computeAssumedDerefenceableBytes(A, V, IsNonNull, IsGlobal));
1971 updateAssumedNonNullGlobalState(IsNonNull, IsGlobal);
1973 return BeforeState == static_cast<DerefState>(*this) ? ChangeStatus::UNCHANGED
1974 : ChangeStatus::CHANGED;
1977 /// ----------------------------------------------------------------------------
1978 /// Attributor
1979 /// ----------------------------------------------------------------------------
1981 bool Attributor::checkForAllCallSites(Function &F,
1982 std::function<bool(CallSite)> &Pred,
1983 bool RequireAllCallSites) {
1984 // We can try to determine information from
1985 // the call sites. However, this is only possible all call sites are known,
1986 // hence the function has internal linkage.
1987 if (RequireAllCallSites && !F.hasInternalLinkage()) {
1988 LLVM_DEBUG(
1989 dbgs()
1990 << "Attributor: Function " << F.getName()
1991 << " has no internal linkage, hence not all call sites are known\n");
1992 return false;
1995 for (const Use &U : F.uses()) {
1997 CallSite CS(U.getUser());
1998 if (!CS || !CS.isCallee(&U) || !CS.getCaller()->hasExactDefinition()) {
1999 if (!RequireAllCallSites)
2000 continue;
2002 LLVM_DEBUG(dbgs() << "Attributor: User " << *U.getUser()
2003 << " is an invalid use of " << F.getName() << "\n");
2004 return false;
2007 if (Pred(CS))
2008 continue;
2010 LLVM_DEBUG(dbgs() << "Attributor: Call site callback failed for "
2011 << *CS.getInstruction() << "\n");
2012 return false;
2015 return true;
2018 ChangeStatus Attributor::run() {
2019 // Initialize all abstract attributes.
2020 for (AbstractAttribute *AA : AllAbstractAttributes)
2021 AA->initialize(*this);
2023 LLVM_DEBUG(dbgs() << "[Attributor] Identified and initialized "
2024 << AllAbstractAttributes.size()
2025 << " abstract attributes.\n");
2027 // Now that all abstract attributes are collected and initialized we start
2028 // the abstract analysis.
2030 unsigned IterationCounter = 1;
2032 SmallVector<AbstractAttribute *, 64> ChangedAAs;
2033 SetVector<AbstractAttribute *> Worklist;
2034 Worklist.insert(AllAbstractAttributes.begin(), AllAbstractAttributes.end());
2036 do {
2037 LLVM_DEBUG(dbgs() << "\n\n[Attributor] #Iteration: " << IterationCounter
2038 << ", Worklist size: " << Worklist.size() << "\n");
2040 // Add all abstract attributes that are potentially dependent on one that
2041 // changed to the work list.
2042 for (AbstractAttribute *ChangedAA : ChangedAAs) {
2043 auto &QuerriedAAs = QueryMap[ChangedAA];
2044 Worklist.insert(QuerriedAAs.begin(), QuerriedAAs.end());
2047 // Reset the changed set.
2048 ChangedAAs.clear();
2050 // Update all abstract attribute in the work list and record the ones that
2051 // changed.
2052 for (AbstractAttribute *AA : Worklist)
2053 if (AA->update(*this) == ChangeStatus::CHANGED)
2054 ChangedAAs.push_back(AA);
2056 // Reset the work list and repopulate with the changed abstract attributes.
2057 // Note that dependent ones are added above.
2058 Worklist.clear();
2059 Worklist.insert(ChangedAAs.begin(), ChangedAAs.end());
2061 } while (!Worklist.empty() && ++IterationCounter < MaxFixpointIterations);
2063 LLVM_DEBUG(dbgs() << "\n[Attributor] Fixpoint iteration done after: "
2064 << IterationCounter << "/" << MaxFixpointIterations
2065 << " iterations\n");
2067 bool FinishedAtFixpoint = Worklist.empty();
2069 // Reset abstract arguments not settled in a sound fixpoint by now. This
2070 // happens when we stopped the fixpoint iteration early. Note that only the
2071 // ones marked as "changed" *and* the ones transitively depending on them
2072 // need to be reverted to a pessimistic state. Others might not be in a
2073 // fixpoint state but we can use the optimistic results for them anyway.
2074 SmallPtrSet<AbstractAttribute *, 32> Visited;
2075 for (unsigned u = 0; u < ChangedAAs.size(); u++) {
2076 AbstractAttribute *ChangedAA = ChangedAAs[u];
2077 if (!Visited.insert(ChangedAA).second)
2078 continue;
2080 AbstractState &State = ChangedAA->getState();
2081 if (!State.isAtFixpoint()) {
2082 State.indicatePessimisticFixpoint();
2084 NumAttributesTimedOut++;
2087 auto &QuerriedAAs = QueryMap[ChangedAA];
2088 ChangedAAs.append(QuerriedAAs.begin(), QuerriedAAs.end());
2091 LLVM_DEBUG({
2092 if (!Visited.empty())
2093 dbgs() << "\n[Attributor] Finalized " << Visited.size()
2094 << " abstract attributes.\n";
2097 unsigned NumManifested = 0;
2098 unsigned NumAtFixpoint = 0;
2099 ChangeStatus ManifestChange = ChangeStatus::UNCHANGED;
2100 for (AbstractAttribute *AA : AllAbstractAttributes) {
2101 AbstractState &State = AA->getState();
2103 // If there is not already a fixpoint reached, we can now take the
2104 // optimistic state. This is correct because we enforced a pessimistic one
2105 // on abstract attributes that were transitively dependent on a changed one
2106 // already above.
2107 if (!State.isAtFixpoint())
2108 State.indicateOptimisticFixpoint();
2110 // If the state is invalid, we do not try to manifest it.
2111 if (!State.isValidState())
2112 continue;
2114 // Manifest the state and record if we changed the IR.
2115 ChangeStatus LocalChange = AA->manifest(*this);
2116 ManifestChange = ManifestChange | LocalChange;
2118 NumAtFixpoint++;
2119 NumManifested += (LocalChange == ChangeStatus::CHANGED);
2122 (void)NumManifested;
2123 (void)NumAtFixpoint;
2124 LLVM_DEBUG(dbgs() << "\n[Attributor] Manifested " << NumManifested
2125 << " arguments while " << NumAtFixpoint
2126 << " were in a valid fixpoint state\n");
2128 // If verification is requested, we finished this run at a fixpoint, and the
2129 // IR was changed, we re-run the whole fixpoint analysis, starting at
2130 // re-initialization of the arguments. This re-run should not result in an IR
2131 // change. Though, the (virtual) state of attributes at the end of the re-run
2132 // might be more optimistic than the known state or the IR state if the better
2133 // state cannot be manifested.
2134 if (VerifyAttributor && FinishedAtFixpoint &&
2135 ManifestChange == ChangeStatus::CHANGED) {
2136 VerifyAttributor = false;
2137 ChangeStatus VerifyStatus = run();
2138 if (VerifyStatus != ChangeStatus::UNCHANGED)
2139 llvm_unreachable(
2140 "Attributor verification failed, re-run did result in an IR change "
2141 "even after a fixpoint was reached in the original run. (False "
2142 "positives possible!)");
2143 VerifyAttributor = true;
2146 NumAttributesManifested += NumManifested;
2147 NumAttributesValidFixpoint += NumAtFixpoint;
2149 return ManifestChange;
2152 void Attributor::identifyDefaultAbstractAttributes(
2153 Function &F, InformationCache &InfoCache,
2154 DenseSet</* Attribute::AttrKind */ unsigned> *Whitelist) {
2156 // Every function can be nounwind.
2157 registerAA(*new AANoUnwindFunction(F, InfoCache));
2159 // Every function might be marked "nosync"
2160 registerAA(*new AANoSyncFunction(F, InfoCache));
2162 // Every function might be "no-free".
2163 registerAA(*new AANoFreeFunction(F, InfoCache));
2165 // Return attributes are only appropriate if the return type is non void.
2166 Type *ReturnType = F.getReturnType();
2167 if (!ReturnType->isVoidTy()) {
2168 // Argument attribute "returned" --- Create only one per function even
2169 // though it is an argument attribute.
2170 if (!Whitelist || Whitelist->count(AAReturnedValues::ID))
2171 registerAA(*new AAReturnedValuesImpl(F, InfoCache));
2173 if (ReturnType->isPointerTy()) {
2174 // Every function with pointer return type might be marked nonnull.
2175 if (!Whitelist || Whitelist->count(AANonNullReturned::ID))
2176 registerAA(*new AANonNullReturned(F, InfoCache));
2178 // Every function with pointer return type might be marked noalias.
2179 if (!Whitelist || Whitelist->count(AANoAliasReturned::ID))
2180 registerAA(*new AANoAliasReturned(F, InfoCache));
2182 // Every function with pointer return type might be marked
2183 // dereferenceable.
2184 if (ReturnType->isPointerTy() &&
2185 (!Whitelist || Whitelist->count(AADereferenceableReturned::ID)))
2186 registerAA(*new AADereferenceableReturned(F, InfoCache));
2190 for (Argument &Arg : F.args()) {
2191 if (Arg.getType()->isPointerTy()) {
2192 // Every argument with pointer type might be marked nonnull.
2193 if (!Whitelist || Whitelist->count(AANonNullArgument::ID))
2194 registerAA(*new AANonNullArgument(Arg, InfoCache));
2196 // Every argument with pointer type might be marked dereferenceable.
2197 if (!Whitelist || Whitelist->count(AADereferenceableArgument::ID))
2198 registerAA(*new AADereferenceableArgument(Arg, InfoCache));
2202 // Every function might be "will-return".
2203 registerAA(*new AAWillReturnFunction(F, InfoCache));
2205 // Check for dead BasicBlocks in every function.
2206 registerAA(*new AAIsDeadFunction(F, InfoCache));
2208 // Walk all instructions to find more attribute opportunities and also
2209 // interesting instructions that might be queried by abstract attributes
2210 // during their initialization or update.
2211 auto &ReadOrWriteInsts = InfoCache.FuncRWInstsMap[&F];
2212 auto &InstOpcodeMap = InfoCache.FuncInstOpcodeMap[&F];
2214 for (Instruction &I : instructions(&F)) {
2215 bool IsInterestingOpcode = false;
2217 // To allow easy access to all instructions in a function with a given
2218 // opcode we store them in the InfoCache. As not all opcodes are interesting
2219 // to concrete attributes we only cache the ones that are as identified in
2220 // the following switch.
2221 // Note: There are no concrete attributes now so this is initially empty.
2222 switch (I.getOpcode()) {
2223 default:
2224 assert((!ImmutableCallSite(&I)) && (!isa<CallBase>(&I)) &&
2225 "New call site/base instruction type needs to be known int the "
2226 "attributor.");
2227 break;
2228 case Instruction::Call:
2229 case Instruction::CallBr:
2230 case Instruction::Invoke:
2231 case Instruction::CleanupRet:
2232 case Instruction::CatchSwitch:
2233 case Instruction::Resume:
2234 case Instruction::Ret:
2235 IsInterestingOpcode = true;
2237 if (IsInterestingOpcode)
2238 InstOpcodeMap[I.getOpcode()].push_back(&I);
2239 if (I.mayReadOrWriteMemory())
2240 ReadOrWriteInsts.push_back(&I);
2242 CallSite CS(&I);
2243 if (CS && CS.getCalledFunction()) {
2244 for (int i = 0, e = CS.getCalledFunction()->arg_size(); i < e; i++) {
2245 if (!CS.getArgument(i)->getType()->isPointerTy())
2246 continue;
2248 // Call site argument attribute "non-null".
2249 if (!Whitelist || Whitelist->count(AANonNullCallSiteArgument::ID))
2250 registerAA(*new AANonNullCallSiteArgument(CS, i, InfoCache), i);
2252 // Call site argument attribute "dereferenceable".
2253 if (!Whitelist ||
2254 Whitelist->count(AADereferenceableCallSiteArgument::ID))
2255 registerAA(*new AADereferenceableCallSiteArgument(CS, i, InfoCache),
2262 /// Helpers to ease debugging through output streams and print calls.
2264 ///{
2265 raw_ostream &llvm::operator<<(raw_ostream &OS, ChangeStatus S) {
2266 return OS << (S == ChangeStatus::CHANGED ? "changed" : "unchanged");
2269 raw_ostream &llvm::operator<<(raw_ostream &OS,
2270 AbstractAttribute::ManifestPosition AP) {
2271 switch (AP) {
2272 case AbstractAttribute::MP_ARGUMENT:
2273 return OS << "arg";
2274 case AbstractAttribute::MP_CALL_SITE_ARGUMENT:
2275 return OS << "cs_arg";
2276 case AbstractAttribute::MP_FUNCTION:
2277 return OS << "fn";
2278 case AbstractAttribute::MP_RETURNED:
2279 return OS << "fn_ret";
2281 llvm_unreachable("Unknown attribute position!");
2284 raw_ostream &llvm::operator<<(raw_ostream &OS, const AbstractState &S) {
2285 return OS << (!S.isValidState() ? "top" : (S.isAtFixpoint() ? "fix" : ""));
2288 raw_ostream &llvm::operator<<(raw_ostream &OS, const AbstractAttribute &AA) {
2289 AA.print(OS);
2290 return OS;
2293 void AbstractAttribute::print(raw_ostream &OS) const {
2294 OS << "[" << getManifestPosition() << "][" << getAsStr() << "]["
2295 << AnchoredVal.getName() << "]";
2297 ///}
2299 /// ----------------------------------------------------------------------------
2300 /// Pass (Manager) Boilerplate
2301 /// ----------------------------------------------------------------------------
2303 static bool runAttributorOnModule(Module &M) {
2304 if (DisableAttributor)
2305 return false;
2307 LLVM_DEBUG(dbgs() << "[Attributor] Run on module with " << M.size()
2308 << " functions.\n");
2310 // Create an Attributor and initially empty information cache that is filled
2311 // while we identify default attribute opportunities.
2312 Attributor A;
2313 InformationCache InfoCache;
2315 for (Function &F : M) {
2316 // TODO: Not all attributes require an exact definition. Find a way to
2317 // enable deduction for some but not all attributes in case the
2318 // definition might be changed at runtime, see also
2319 // http://lists.llvm.org/pipermail/llvm-dev/2018-February/121275.html.
2320 // TODO: We could always determine abstract attributes and if sufficient
2321 // information was found we could duplicate the functions that do not
2322 // have an exact definition.
2323 if (!F.hasExactDefinition()) {
2324 NumFnWithoutExactDefinition++;
2325 continue;
2328 // For now we ignore naked and optnone functions.
2329 if (F.hasFnAttribute(Attribute::Naked) ||
2330 F.hasFnAttribute(Attribute::OptimizeNone))
2331 continue;
2333 NumFnWithExactDefinition++;
2335 // Populate the Attributor with abstract attribute opportunities in the
2336 // function and the information cache with IR information.
2337 A.identifyDefaultAbstractAttributes(F, InfoCache);
2340 return A.run() == ChangeStatus::CHANGED;
2343 PreservedAnalyses AttributorPass::run(Module &M, ModuleAnalysisManager &AM) {
2344 if (runAttributorOnModule(M)) {
2345 // FIXME: Think about passes we will preserve and add them here.
2346 return PreservedAnalyses::none();
2348 return PreservedAnalyses::all();
2351 namespace {
2353 struct AttributorLegacyPass : public ModulePass {
2354 static char ID;
2356 AttributorLegacyPass() : ModulePass(ID) {
2357 initializeAttributorLegacyPassPass(*PassRegistry::getPassRegistry());
2360 bool runOnModule(Module &M) override {
2361 if (skipModule(M))
2362 return false;
2363 return runAttributorOnModule(M);
2366 void getAnalysisUsage(AnalysisUsage &AU) const override {
2367 // FIXME: Think about passes we will preserve and add them here.
2368 AU.setPreservesCFG();
2372 } // end anonymous namespace
2374 Pass *llvm::createAttributorLegacyPass() { return new AttributorLegacyPass(); }
2376 char AttributorLegacyPass::ID = 0;
2377 INITIALIZE_PASS_BEGIN(AttributorLegacyPass, "attributor",
2378 "Deduce and propagate attributes", false, false)
2379 INITIALIZE_PASS_END(AttributorLegacyPass, "attributor",
2380 "Deduce and propagate attributes", false, false)