LLVM 24.0.0git
Attributor.h
Go to the documentation of this file.
1//===- Attributor.h --- Module-wide attribute deduction ---------*- C++ -*-===//
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// Attributor: An inter procedural (abstract) "attribute" deduction framework.
10//
11// The Attributor framework is an inter procedural abstract analysis (fixpoint
12// iteration analysis). The goal is to allow easy deduction of new attributes as
13// well as information exchange between abstract attributes in-flight.
14//
15// The Attributor class is the driver and the link between the various abstract
16// attributes. The Attributor will iterate until a fixpoint state is reached by
17// all abstract attributes in-flight, or until it will enforce a pessimistic fix
18// point because an iteration limit is reached.
19//
20// Abstract attributes, derived from the AbstractAttribute class, actually
21// describe properties of the code. They can correspond to actual LLVM-IR
22// attributes, or they can be more general, ultimately unrelated to LLVM-IR
23// attributes. The latter is useful when an abstract attributes provides
24// information to other abstract attributes in-flight but we might not want to
25// manifest the information. The Attributor allows to query in-flight abstract
26// attributes through the `Attributor::getAAFor` method (see the method
27// description for an example). If the method is used by an abstract attribute
28// P, and it results in an abstract attribute Q, the Attributor will
29// automatically capture a potential dependence from Q to P. This dependence
30// will cause P to be reevaluated whenever Q changes in the future.
31//
32// The Attributor will only reevaluate abstract attributes that might have
33// changed since the last iteration. That means that the Attribute will not
34// revisit all instructions/blocks/functions in the module but only query
35// an update from a subset of the abstract attributes.
36//
37// The update method `AbstractAttribute::updateImpl` is implemented by the
38// specific "abstract attribute" subclasses. The method is invoked whenever the
39// currently assumed state (see the AbstractState class) might not be valid
40// anymore. This can, for example, happen if the state was dependent on another
41// abstract attribute that changed. In every invocation, the update method has
42// to adjust the internal state of an abstract attribute to a point that is
43// justifiable by the underlying IR and the current state of abstract attributes
44// in-flight. Since the IR is given and assumed to be valid, the information
45// derived from it can be assumed to hold. However, information derived from
46// other abstract attributes is conditional on various things. If the justifying
47// state changed, the `updateImpl` has to revisit the situation and potentially
48// find another justification or limit the optimistic assumes made.
49//
50// Change is the key in this framework. Until a state of no-change, thus a
51// fixpoint, is reached, the Attributor will query the abstract attributes
52// in-flight to re-evaluate their state. If the (current) state is too
53// optimistic, hence it cannot be justified anymore through other abstract
54// attributes or the state of the IR, the state of the abstract attribute will
55// have to change. Generally, we assume abstract attribute state to be a finite
56// height lattice and the update function to be monotone. However, these
57// conditions are not enforced because the iteration limit will guarantee
58// termination. If an optimistic fixpoint is reached, or a pessimistic fix
59// point is enforced after a timeout, the abstract attributes are tasked to
60// manifest their result in the IR for passes to come.
61//
62// Attribute manifestation is not mandatory. If desired, there is support to
63// generate a single or multiple LLVM-IR attributes already in the helper struct
64// IRAttribute. In the simplest case, a subclass inherits from IRAttribute with
65// a proper Attribute::AttrKind as template parameter. The Attributor
66// manifestation framework will then create and place a new attribute if it is
67// allowed to do so (based on the abstract state). Other use cases can be
68// achieved by overloading AbstractAttribute or IRAttribute methods.
69//
70//
71// The "mechanics" of adding a new "abstract attribute":
72// - Define a class (transitively) inheriting from AbstractAttribute and one
73// (which could be the same) that (transitively) inherits from AbstractState.
74// For the latter, consider the already available BooleanState and
75// {Inc,Dec,Bit}IntegerState if they fit your needs, e.g., you require only a
76// number tracking or bit-encoding.
77// - Implement all pure methods. Also use overloading if the attribute is not
78// conforming with the "default" behavior: A (set of) LLVM-IR attribute(s) for
79// an argument, call site argument, function return value, or function. See
80// the class and method descriptions for more information on the two
81// "Abstract" classes and their respective methods.
82// - Register opportunities for the new abstract attribute in the
83// `Attributor::identifyDefaultAbstractAttributes` method if it should be
84// counted as a 'default' attribute.
85// - Add sufficient tests.
86// - Add a Statistics object for bookkeeping. If it is a simple (set of)
87// attribute(s) manifested through the Attributor manifestation framework, see
88// the bookkeeping function in Attributor.cpp.
89// - If instructions with a certain opcode are interesting to the attribute, add
90// that opcode to the switch in `Attributor::identifyAbstractAttributes`. This
91// will make it possible to query all those instructions through the
92// `InformationCache::getOpcodeInstMapForFunction` interface and eliminate the
93// need to traverse the IR repeatedly.
94//
95//===----------------------------------------------------------------------===//
96
97#ifndef LLVM_TRANSFORMS_IPO_ATTRIBUTOR_H
98#define LLVM_TRANSFORMS_IPO_ATTRIBUTOR_H
99
100#include "llvm/ADT/DenseSet.h"
101#include "llvm/ADT/GraphTraits.h"
102#include "llvm/ADT/IntervalMap.h"
103#include "llvm/ADT/MapVector.h"
104#include "llvm/ADT/STLExtras.h"
106#include "llvm/ADT/SetVector.h"
107#include "llvm/ADT/SmallSet.h"
108#include "llvm/ADT/iterator.h"
110#include "llvm/Analysis/CFG.h"
120#include "llvm/IR/Attributes.h"
122#include "llvm/IR/Constants.h"
123#include "llvm/IR/GlobalValue.h"
124#include "llvm/IR/InstIterator.h"
125#include "llvm/IR/Instruction.h"
126#include "llvm/IR/Instructions.h"
127#include "llvm/IR/Module.h"
128#include "llvm/IR/PassManager.h"
129#include "llvm/IR/Value.h"
132#include "llvm/Support/Casting.h"
137#include "llvm/Support/ModRef.h"
142
143#include <limits>
144#include <map>
145#include <optional>
146
147namespace llvm {
148
149class DataLayout;
150class LLVMContext;
151class Pass;
152template <typename Fn> class function_ref;
153struct AADepGraphNode;
154struct AADepGraph;
155struct Attributor;
156struct AbstractAttribute;
157struct InformationCache;
158struct AAIsDead;
160struct IRPosition;
161
162class Function;
163
164/// Abstract Attribute helper functions.
165namespace AA {
167
168/// Return true iff \p M target a GPU (and we can use GPU AS reasoning).
169LLVM_ABI bool isGPU(const Module &M);
170
171/// Check if the given address space \p AS corresponds to a GPU shared
172/// address space for the target triple in module \p M.
173LLVM_ABI bool isGPUSharedAddressSpace(const Module &M, unsigned AS);
174
175/// Check if the given address space \p AS corresponds to a GPU constant
176/// address space for the target triple in module \p M.
177LLVM_ABI bool isGPUConstantAddressSpace(const Module &M, unsigned AS);
178
179/// Check if the given address space \p AS corresponds to a GPU local/private
180/// address space for the target triple in module \p M.
181LLVM_ABI bool isGPULocalAddressSpace(const Module &M, unsigned AS);
182
183/// Flags to distinguish intra-procedural queries from *potentially*
184/// inter-procedural queries. Not that information can be valid for both and
185/// therefore both bits might be set.
191
192struct ValueAndContext : public std::pair<Value *, const Instruction *> {
193 using Base = std::pair<Value *, const Instruction *>;
195 ValueAndContext(Value &V, const Instruction *CtxI) : Base(&V, CtxI) {}
196 ValueAndContext(Value &V, const Instruction &CtxI) : Base(&V, &CtxI) {}
197
198 Value *getValue() const { return this->first; }
199 const Instruction *getCtxI() const { return this->second; }
200};
201
202/// Return true if \p I is a `nosync` instruction. Use generic reasoning and
203/// potentially the corresponding AANoSync.
205 const AbstractAttribute &QueryingAA);
206
207/// Return true if \p V is dynamically unique, that is, there are no two
208/// "instances" of \p V at runtime with different values.
209/// Note: If \p ForAnalysisOnly is set we only check that the Attributor will
210/// never use \p V to represent two "instances" not that \p V could not
211/// technically represent them.
213 const AbstractAttribute &QueryingAA,
214 const Value &V, bool ForAnalysisOnly = true);
215
216/// Return true if \p V is a valid value in \p Scope, that is a constant or an
217/// instruction/argument of \p Scope.
218LLVM_ABI bool isValidInScope(const Value &V, const Function *Scope);
219
220/// Return true if the value of \p VAC is a valid at the position of \p VAC,
221/// that is a constant, an argument of the same function, or an instruction in
222/// that function that dominates the position.
223LLVM_ABI bool isValidAtPosition(const ValueAndContext &VAC,
224 InformationCache &InfoCache);
225
226/// Try to convert \p V to type \p Ty without introducing new instructions. If
227/// this is not possible return `nullptr`. Note: this function basically knows
228/// how to cast various constants.
230
231/// Return the combination of \p A and \p B such that the result is a possible
232/// value of both. \p B is potentially casted to match the type \p Ty or the
233/// type of \p A if \p Ty is null.
234///
235/// Examples:
236/// X + none => X
237/// not_none + undef => not_none
238/// V1 + V2 => nullptr
239LLVM_ABI std::optional<Value *>
240combineOptionalValuesInAAValueLatice(const std::optional<Value *> &A,
241 const std::optional<Value *> &B, Type *Ty);
242
243/// Helper to represent an access offset and size, with logic to deal with
244/// uncertainty and check for overlapping accesses.
245struct RangeTy {
247 int64_t Size = Unassigned;
248
249 RangeTy(int64_t Offset, int64_t Size) : Offset(Offset), Size(Size) {}
250 RangeTy() = default;
251 static RangeTy getUnknown() { return RangeTy{Unknown, Unknown}; }
252
253 /// Return true if offset or size are unknown.
256 }
257
258 /// Return true if offset and size are unknown, thus this is the default
259 /// unknown object.
262 }
263
264 /// Return true if the offset and size are unassigned.
265 bool isUnassigned() const {
267 "Inconsistent state!");
268 return Offset == RangeTy::Unassigned;
269 }
270
271 /// Return true if this offset and size pair might describe an address that
272 /// overlaps with \p Range.
273 bool mayOverlap(const RangeTy &Range) const {
274 // Any unknown value and we are giving up -> overlap.
275 if (offsetOrSizeAreUnknown() || Range.offsetOrSizeAreUnknown())
276 return true;
277
278 // Check if one offset point is in the other interval [offset,
279 // offset+size].
280 return Range.Offset + Range.Size > Offset && Range.Offset < Offset + Size;
281 }
282
284 if (R.isUnassigned())
285 return *this;
286 if (isUnassigned())
287 return *this = R;
288 if (Offset == Unknown || R.Offset == Unknown)
289 Offset = Unknown;
290 if (Size == Unknown || R.Size == Unknown)
291 Size = Unknown;
293 return *this;
294 if (Offset == Unknown) {
295 Size = std::max(Size, R.Size);
296 } else if (Size == Unknown) {
297 Offset = std::min(Offset, R.Offset);
298 } else {
299 Offset = std::min(Offset, R.Offset);
300 Size = std::max(Offset + Size, R.Offset + R.Size) - Offset;
301 }
302 return *this;
303 }
304
305 /// Comparison for sorting ranges.
306 ///
307 /// Returns true if the offset of \p L is less than that of \p R. If the two
308 /// offsets are same, compare the sizes instead.
309 inline static bool LessThan(const RangeTy &L, const RangeTy &R) {
310 if (L.Offset < R.Offset)
311 return true;
312 if (L.Offset == R.Offset)
313 return L.Size < R.Size;
314 return false;
315 }
316
317 /// Constants used to represent special offsets or sizes.
318 /// - We cannot assume that Offsets and Size are non-negative.
319 /// - The constants should not clash with DenseMapInfo, such as EmptyKey
320 /// (INT64_MAX).
321 /// We use values "in the middle" of the 64 bit range to represent these
322 /// special cases.
323 static constexpr int64_t Unassigned = std::numeric_limits<int32_t>::min();
324 static constexpr int64_t Unknown = std::numeric_limits<int32_t>::max();
325};
326
328 OS << "[" << R.Offset << ", " << R.Size << "]";
329 return OS;
330}
331
332inline bool operator==(const RangeTy &A, const RangeTy &B) {
333 return A.Offset == B.Offset && A.Size == B.Size;
334}
335
336inline bool operator!=(const RangeTy &A, const RangeTy &B) { return !(A == B); }
337
338/// Return the initial value of \p Obj with type \p Ty if that is a constant.
341 Value &Obj, Type &Ty, const TargetLibraryInfo *TLI,
342 const DataLayout &DL, RangeTy *RangePtr = nullptr);
343
344/// Collect all potential values \p LI could read into \p PotentialValues. That
345/// is, the only values read by \p LI are assumed to be known and all are in
346/// \p PotentialValues. \p PotentialValueOrigins will contain all the
347/// instructions that might have put a potential value into \p PotentialValues.
348/// Dependences onto \p QueryingAA are properly tracked, \p
349/// UsedAssumedInformation will inform the caller if assumed information was
350/// used.
351///
352/// \returns True if the assumed potential copies are all in \p PotentialValues,
353/// false if something went wrong and the copies could not be
354/// determined.
356 Attributor &A, LoadInst &LI, SmallSetVector<Value *, 4> &PotentialValues,
357 SmallSetVector<Instruction *, 4> &PotentialValueOrigins,
358 const AbstractAttribute &QueryingAA, bool &UsedAssumedInformation,
359 bool OnlyExact = false);
360
361/// Collect all potential values of the one stored by \p SI into
362/// \p PotentialCopies. That is, the only copies that were made via the
363/// store are assumed to be known and all are in \p PotentialCopies. Dependences
364/// onto \p QueryingAA are properly tracked, \p UsedAssumedInformation will
365/// inform the caller if assumed information was used.
366///
367/// \returns True if the assumed potential copies are all in \p PotentialCopies,
368/// false if something went wrong and the copies could not be
369/// determined.
372 const AbstractAttribute &QueryingAA, bool &UsedAssumedInformation,
373 bool OnlyExact = false);
374
375/// Return true if \p IRP is readonly. This will query respective AAs that
376/// deduce the information and introduce dependences for \p QueryingAA.
378 const AbstractAttribute &QueryingAA,
379 bool &IsKnown);
380
381/// Return true if \p IRP is readnone. This will query respective AAs that
382/// deduce the information and introduce dependences for \p QueryingAA.
384 const AbstractAttribute &QueryingAA,
385 bool &IsKnown);
386
387/// Return true if \p ToI is potentially reachable from \p FromI without running
388/// into any instruction in \p ExclusionSet The two instructions do not need to
389/// be in the same function. \p GoBackwardsCB can be provided to convey domain
390/// knowledge about the "lifespan" the user is interested in. By default, the
391/// callers of \p FromI are checked as well to determine if \p ToI can be
392/// reached. If the query is not interested in callers beyond a certain point,
393/// e.g., a GPU kernel entry or the function containing an alloca, the
394/// \p GoBackwardsCB should return false.
396 Attributor &A, const Instruction &FromI, const Instruction &ToI,
397 const AbstractAttribute &QueryingAA,
398 const AA::InstExclusionSetTy *ExclusionSet = nullptr,
399 std::function<bool(const Function &F)> GoBackwardsCB = nullptr);
400
401/// Same as above but it is sufficient to reach any instruction in \p ToFn.
403 Attributor &A, const Instruction &FromI, const Function &ToFn,
404 const AbstractAttribute &QueryingAA,
405 const AA::InstExclusionSetTy *ExclusionSet = nullptr,
406 std::function<bool(const Function &F)> GoBackwardsCB = nullptr);
407
408/// Return true if \p Obj is assumed to be a thread local object.
410 const AbstractAttribute &QueryingAA);
411
412/// Return true if \p I is potentially affected by a barrier.
413LLVM_ABI bool
415 const AbstractAttribute &QueryingAA);
416LLVM_ABI bool
418 const AbstractAttribute &QueryingAA,
419 const Instruction *CtxI);
420} // namespace AA
421
422template <>
423struct DenseMapInfo<AA::ValueAndContext>
424 : public DenseMapInfo<AA::ValueAndContext::Base> {
426 static unsigned getHashValue(const AA::ValueAndContext &VAC) {
427 return Base::getHashValue(VAC);
428 }
429
430 static bool isEqual(const AA::ValueAndContext &LHS,
431 const AA::ValueAndContext &RHS) {
432 return Base::isEqual(LHS, RHS);
433 }
434};
435
436template <>
437struct DenseMapInfo<AA::ValueScope> : public DenseMapInfo<unsigned char> {
439 static unsigned getHashValue(const AA::ValueScope &S) {
440 return Base::getHashValue(S);
441 }
442
443 static bool isEqual(const AA::ValueScope &LHS, const AA::ValueScope &RHS) {
444 return Base::isEqual(LHS, RHS);
445 }
446};
447
448template <>
449struct DenseMapInfo<const AA::InstExclusionSetTy *>
450 : public DenseMapInfo<void *> {
451 static unsigned getHashValue(const AA::InstExclusionSetTy *BES) {
452 unsigned H = 0;
453 if (BES)
454 for (const auto *II : *BES)
455 H += DenseMapInfo<const Instruction *>::getHashValue(II);
456 return H;
457 }
458 static bool isEqual(const AA::InstExclusionSetTy *LHS,
460 if (LHS == RHS)
461 return true;
462 auto SizeLHS = LHS ? LHS->size() : 0;
463 auto SizeRHS = RHS ? RHS->size() : 0;
464 if (SizeLHS != SizeRHS)
465 return false;
466 if (SizeRHS == 0)
467 return true;
468 return llvm::set_is_subset(*LHS, *RHS);
469 }
470};
471
472/// The value passed to the line option that defines the maximal initialization
473/// chain length.
475
476///{
481
486
487enum class DepClassTy {
488 REQUIRED, ///< The target cannot be valid if the source is not.
489 OPTIONAL, ///< The target may be valid if the source is not.
490 NONE, ///< Do not track a dependence between source and target.
491};
492///}
493
494/// The data structure for the nodes of a dependency graph
496public:
497 virtual ~AADepGraphNode() = default;
500
501protected:
502 /// Set of dependency graph nodes which should be updated if this one
503 /// is updated. The bit encodes if it is optional.
505
506 static AADepGraphNode *DepGetVal(const DepTy &DT) { return DT.getPointer(); }
509 }
510
511 operator AbstractAttribute *() { return cast<AbstractAttribute>(this); }
512
513public:
517
518 aaiterator begin() { return aaiterator(Deps.begin(), &DepGetValAA); }
519 aaiterator end() { return aaiterator(Deps.end(), &DepGetValAA); }
520 iterator child_begin() { return iterator(Deps.begin(), &DepGetVal); }
521 iterator child_end() { return iterator(Deps.end(), &DepGetVal); }
522
523 void print(raw_ostream &OS) const { print(nullptr, OS); }
524 virtual void print(Attributor *, raw_ostream &OS) const {
525 OS << "AADepNode Impl\n";
526 }
527
528 friend struct Attributor;
529 friend struct AADepGraph;
530};
531
532/// The data structure for the dependency graph
533///
534/// Note that in this graph if there is an edge from A to B (A -> B),
535/// then it means that B depends on A, and when the state of A is
536/// updated, node B should also be updated
538 AADepGraph() = default;
539 ~AADepGraph() = default;
540
542 static AADepGraphNode *DepGetVal(const DepTy &DT) { return DT.getPointer(); }
543 using iterator =
545
546 /// There is no root node for the dependency graph. But the SCCIterator
547 /// requires a single entry point, so we maintain a fake("synthetic") root
548 /// node that depends on every node.
551
552 iterator begin() { return SyntheticRoot.child_begin(); }
553 iterator end() { return SyntheticRoot.child_end(); }
554
555 LLVM_ABI void viewGraph();
556
557 /// Dump graph to file
558 LLVM_ABI void dumpGraph();
559
560 /// Print dependency graph
561 LLVM_ABI void print();
562};
563
564/// Helper to describe and deal with positions in the LLVM-IR.
565///
566/// A position in the IR is described by an anchor value and an "offset" that
567/// could be the argument number, for call sites and arguments, or an indicator
568/// of the "position kind". The kinds, specified in the Kind enum below, include
569/// the locations in the attribute list, i.a., function scope and return value,
570/// as well as a distinction between call sites and functions. Finally, there
571/// are floating values that do not have a corresponding attribute list
572/// position.
574 // NOTE: In the future this definition can be changed to support recursive
575 // functions.
577
578 /// The positions we distinguish in the IR.
579 enum Kind : char {
580 IRP_INVALID, ///< An invalid position.
581 IRP_FLOAT, ///< A position that is not associated with a spot suitable
582 ///< for attributes. This could be any value or instruction.
583 IRP_RETURNED, ///< An attribute for the function return value.
584 IRP_CALL_SITE_RETURNED, ///< An attribute for a call site return value.
585 IRP_FUNCTION, ///< An attribute for a function (scope).
586 IRP_CALL_SITE, ///< An attribute for a call site (function scope).
587 IRP_ARGUMENT, ///< An attribute for a function argument.
588 IRP_CALL_SITE_ARGUMENT, ///< An attribute for a call site argument.
589 };
590
591 /// Default constructor available to create invalid positions implicitly. All
592 /// other positions need to be created explicitly through the appropriate
593 /// static member function.
594 IRPosition() : Enc(nullptr, ENC_VALUE) { verify(); }
595
596 /// Create a position describing the value of \p V.
597 static const IRPosition value(const Value &V,
598 const CallBaseContext *CBContext = nullptr) {
599 if (auto *Arg = dyn_cast<Argument>(&V))
600 return IRPosition::argument(*Arg, CBContext);
601 if (auto *CB = dyn_cast<CallBase>(&V))
603 return IRPosition(const_cast<Value &>(V), IRP_FLOAT, CBContext);
604 }
605
606 /// Create a position describing the instruction \p I. This is different from
607 /// the value version because call sites are treated as intrusctions rather
608 /// than their return value in this function.
609 static const IRPosition inst(const Instruction &I,
610 const CallBaseContext *CBContext = nullptr) {
611 return IRPosition(const_cast<Instruction &>(I), IRP_FLOAT, CBContext);
612 }
613
614 /// Create a position describing the function scope of \p F.
615 /// \p CBContext is used for call base specific analysis.
616 static const IRPosition function(const Function &F,
617 const CallBaseContext *CBContext = nullptr) {
618 return IRPosition(const_cast<Function &>(F), IRP_FUNCTION, CBContext);
619 }
620
621 /// Create a position describing the returned value of \p F.
622 /// \p CBContext is used for call base specific analysis.
623 static const IRPosition returned(const Function &F,
624 const CallBaseContext *CBContext = nullptr) {
625 return IRPosition(const_cast<Function &>(F), IRP_RETURNED, CBContext);
626 }
627
628 /// Create a position describing the argument \p Arg.
629 /// \p CBContext is used for call base specific analysis.
630 static const IRPosition argument(const Argument &Arg,
631 const CallBaseContext *CBContext = nullptr) {
632 return IRPosition(const_cast<Argument &>(Arg), IRP_ARGUMENT, CBContext);
633 }
634
635 /// Create a position describing the function scope of \p CB.
636 static const IRPosition callsite_function(const CallBase &CB) {
637 return IRPosition(const_cast<CallBase &>(CB), IRP_CALL_SITE);
638 }
639
640 /// Create a position describing the returned value of \p CB.
641 static const IRPosition callsite_returned(const CallBase &CB) {
642 return IRPosition(const_cast<CallBase &>(CB), IRP_CALL_SITE_RETURNED);
643 }
644
645 /// Create a position describing the argument of \p CB at position \p ArgNo.
646 static const IRPosition callsite_argument(const CallBase &CB,
647 unsigned ArgNo) {
648 return IRPosition(const_cast<Use &>(CB.getArgOperandUse(ArgNo)),
650 }
651
652 /// Create a position describing the argument of \p ACS at position \p ArgNo.
654 unsigned ArgNo) {
655 if (ACS.getNumArgOperands() <= ArgNo)
656 return IRPosition();
657 int CSArgNo = ACS.getCallArgOperandNo(ArgNo);
658 if (CSArgNo >= 0)
660 cast<CallBase>(*ACS.getInstruction()), CSArgNo);
661 return IRPosition();
662 }
663
664 /// Create a position with function scope matching the "context" of \p IRP.
665 /// If \p IRP is a call site (see isAnyCallSitePosition()) then the result
666 /// will be a call site position, otherwise the function position of the
667 /// associated function.
668 static const IRPosition
670 const CallBaseContext *CBContext = nullptr) {
671 if (IRP.isAnyCallSitePosition()) {
674 }
676 return IRPosition::function(*IRP.getAssociatedFunction(), CBContext);
677 }
678
679 bool operator==(const IRPosition &RHS) const {
680 return Enc == RHS.Enc && RHS.CBContext == CBContext;
681 }
682 bool operator!=(const IRPosition &RHS) const { return !(*this == RHS); }
683
684 /// Return the value this abstract attribute is anchored with.
685 ///
686 /// The anchor value might not be the associated value if the latter is not
687 /// sufficient to determine where arguments will be manifested. This is, so
688 /// far, only the case for call site arguments as the value is not sufficient
689 /// to pinpoint them. Instead, we can use the call site as an anchor.
691 switch (getEncodingBits()) {
692 case ENC_VALUE:
693 case ENC_RETURNED_VALUE:
694 case ENC_FLOATING_FUNCTION:
695 return *getAsValuePtr();
696 case ENC_CALL_SITE_ARGUMENT_USE:
697 return *(getAsUsePtr()->getUser());
698 default:
699 llvm_unreachable("Unkown encoding!");
700 };
701 }
702
703 /// Return the associated function, if any.
705 if (auto *CB = dyn_cast<CallBase>(&getAnchorValue())) {
706 // We reuse the logic that associates callback calles to arguments of a
707 // call site here to identify the callback callee as the associated
708 // function.
709 if (Argument *Arg = getAssociatedArgument())
710 return Arg->getParent();
712 CB->getCalledOperand()->stripPointerCasts());
713 }
714 return getAnchorScope();
715 }
716
717 /// Return the associated argument, if any.
719
720 /// Return true if the position refers to a function interface, that is the
721 /// function scope, the function return, or an argument.
722 bool isFnInterfaceKind() const {
723 switch (getPositionKind()) {
727 return true;
728 default:
729 return false;
730 }
731 }
732
733 /// Return true if this is a function or call site position.
734 bool isFunctionScope() const {
735 switch (getPositionKind()) {
738 return true;
739 default:
740 return false;
741 };
742 }
743
744 /// Return the Function surrounding the anchor value.
746 Value &V = getAnchorValue();
747 if (isa<Function>(V))
748 return &cast<Function>(V);
749 if (isa<Argument>(V))
750 return cast<Argument>(V).getParent();
751 if (isa<Instruction>(V))
752 return cast<Instruction>(V).getFunction();
753 return nullptr;
754 }
755
756 /// Return the context instruction, if any.
758 Value &V = getAnchorValue();
759 if (auto *I = dyn_cast<Instruction>(&V))
760 return I;
761 if (auto *Arg = dyn_cast<Argument>(&V))
762 if (!Arg->getParent()->isDeclaration())
763 return &Arg->getParent()->getEntryBlock().front();
764 if (auto *F = dyn_cast<Function>(&V))
765 if (!F->isDeclaration())
766 return &(F->getEntryBlock().front());
767 return nullptr;
768 }
769
770 /// Return the value this abstract attribute is associated with.
773 return getAnchorValue();
774 assert(isa<CallBase>(&getAnchorValue()) && "Expected a call base!");
776 ->getArgOperand(getCallSiteArgNo());
777 }
778
779 /// Return the type this abstract attribute is associated with.
785
786 /// Return the callee argument number of the associated value if it is an
787 /// argument or call site argument, otherwise a negative value. In contrast to
788 /// `getCallSiteArgNo` this method will always return the "argument number"
789 /// from the perspective of the callee. This may not the same as the call site
790 /// if this is a callback call.
791 int getCalleeArgNo() const {
792 return getArgNo(/* CallbackCalleeArgIfApplicable */ true);
793 }
794
795 /// Return the call site argument number of the associated value if it is an
796 /// argument or call site argument, otherwise a negative value. In contrast to
797 /// `getCalleArgNo` this method will always return the "operand number" from
798 /// the perspective of the call site. This may not the same as the callee
799 /// perspective if this is a callback call.
800 int getCallSiteArgNo() const {
801 return getArgNo(/* CallbackCalleeArgIfApplicable */ false);
802 }
803
804 /// Return the index in the attribute list for this position.
805 unsigned getAttrIdx() const {
806 switch (getPositionKind()) {
809 break;
812 return AttributeList::FunctionIndex;
815 return AttributeList::ReturnIndex;
817 return getCalleeArgNo() + AttributeList::FirstArgIndex;
819 return getCallSiteArgNo() + AttributeList::FirstArgIndex;
820 }
822 "There is no attribute index for a floating or invalid position!");
823 }
824
825 /// Return the value attributes are attached to.
827 if (auto *CB = dyn_cast<CallBase>(&getAnchorValue()))
828 return CB;
829 return getAssociatedFunction();
830 }
831
832 /// Return the attributes associated with this function or call site scope.
834 if (auto *CB = dyn_cast<CallBase>(&getAnchorValue()))
835 return CB->getAttributes();
837 }
838
839 /// Update the attributes associated with this function or call site scope.
840 void setAttrList(const AttributeList &AttrList) const {
841 if (auto *CB = dyn_cast<CallBase>(&getAnchorValue()))
842 return CB->setAttributes(AttrList);
843 return getAssociatedFunction()->setAttributes(AttrList);
844 }
845
846 /// Return the associated position kind.
848 char EncodingBits = getEncodingBits();
849 if (EncodingBits == ENC_CALL_SITE_ARGUMENT_USE)
851 if (EncodingBits == ENC_FLOATING_FUNCTION)
852 return IRP_FLOAT;
853
854 Value *V = getAsValuePtr();
855 if (!V)
856 return IRP_INVALID;
857 if (isa<Argument>(V))
858 return IRP_ARGUMENT;
859 if (isa<Function>(V))
860 return isReturnPosition(EncodingBits) ? IRP_RETURNED : IRP_FUNCTION;
861 if (isa<CallBase>(V))
862 return isReturnPosition(EncodingBits) ? IRP_CALL_SITE_RETURNED
864 return IRP_FLOAT;
865 }
866
868 switch (getPositionKind()) {
872 return true;
873 default:
874 return false;
875 }
876 }
877
878 /// Return true if the position is an argument or call site argument.
879 bool isArgumentPosition() const {
880 switch (getPositionKind()) {
883 return true;
884 default:
885 return false;
886 }
887 }
888
889 /// Return the same position without the call base context.
891 IRPosition Result = *this;
892 Result.CBContext = nullptr;
893 return Result;
894 }
895
896 /// Get the call base context from the position.
897 const CallBaseContext *getCallBaseContext() const { return CBContext; }
898
899 /// Check if the position has any call base context.
900 bool hasCallBaseContext() const { return CBContext != nullptr; }
901
902 /// Conversion into a void * to allow reuse of pointer hashing.
903 operator void *() const { return Enc.getOpaqueValue(); }
904
905private:
906 /// Private constructor for special values only!
907 explicit IRPosition(void *Ptr, const CallBaseContext *CBContext = nullptr)
908 : CBContext(CBContext) {
909 Enc.setFromOpaqueValue(Ptr);
910 }
911
912 /// IRPosition anchored at \p AnchorVal with kind/argument numbet \p PK.
913 explicit IRPosition(Value &AnchorVal, Kind PK,
914 const CallBaseContext *CBContext = nullptr)
915 : CBContext(CBContext) {
916 switch (PK) {
918 llvm_unreachable("Cannot create invalid IRP with an anchor value!");
919 break;
921 // Special case for floating functions.
922 if (isa<Function>(AnchorVal) || isa<CallBase>(AnchorVal))
923 Enc = {&AnchorVal, ENC_FLOATING_FUNCTION};
924 else
925 Enc = {&AnchorVal, ENC_VALUE};
926 break;
929 Enc = {&AnchorVal, ENC_VALUE};
930 break;
933 Enc = {&AnchorVal, ENC_RETURNED_VALUE};
934 break;
936 Enc = {&AnchorVal, ENC_VALUE};
937 break;
940 "Cannot create call site argument IRP with an anchor value!");
941 break;
942 }
943 verify();
944 }
945
946 /// Return the callee argument number of the associated value if it is an
947 /// argument or call site argument. See also `getCalleeArgNo` and
948 /// `getCallSiteArgNo`.
949 int getArgNo(bool CallbackCalleeArgIfApplicable) const {
950 if (CallbackCalleeArgIfApplicable)
951 if (Argument *Arg = getAssociatedArgument())
952 return Arg->getArgNo();
953 switch (getPositionKind()) {
955 return cast<Argument>(getAsValuePtr())->getArgNo();
957 Use &U = *getAsUsePtr();
958 return cast<CallBase>(U.getUser())->getArgOperandNo(&U);
959 }
960 default:
961 return -1;
962 }
963 }
964
965 /// IRPosition for the use \p U. The position kind \p PK needs to be
966 /// IRP_CALL_SITE_ARGUMENT, the anchor value is the user, the associated value
967 /// the used value.
968 explicit IRPosition(Use &U, Kind PK) {
970 "Use constructor is for call site arguments only!");
971 Enc = {&U, ENC_CALL_SITE_ARGUMENT_USE};
972 verify();
973 }
974
975 /// Verify internal invariants.
976 LLVM_ABI void verify();
977
978 /// Return the underlying pointer as Value *, valid for all positions but
979 /// IRP_CALL_SITE_ARGUMENT.
980 Value *getAsValuePtr() const {
981 assert(getEncodingBits() != ENC_CALL_SITE_ARGUMENT_USE &&
982 "Not a value pointer!");
983 return reinterpret_cast<Value *>(Enc.getPointer());
984 }
985
986 /// Return the underlying pointer as Use *, valid only for
987 /// IRP_CALL_SITE_ARGUMENT positions.
988 Use *getAsUsePtr() const {
989 assert(getEncodingBits() == ENC_CALL_SITE_ARGUMENT_USE &&
990 "Not a value pointer!");
991 return reinterpret_cast<Use *>(Enc.getPointer());
992 }
993
994 /// Return true if \p EncodingBits describe a returned or call site returned
995 /// position.
996 static bool isReturnPosition(char EncodingBits) {
997 return EncodingBits == ENC_RETURNED_VALUE;
998 }
999
1000 /// The encoding of the IRPosition is a combination of a pointer and two
1001 /// encoding bits. The values of the encoding bits are defined in the enum
1002 /// below. The pointer is either a Value* (for the first three encoding bit
1003 /// combinations) or Use* (for ENC_CALL_SITE_ARGUMENT_USE).
1004 ///
1005 ///{
1006 enum {
1007 ENC_VALUE = 0b00,
1008 ENC_RETURNED_VALUE = 0b01,
1009 ENC_FLOATING_FUNCTION = 0b10,
1010 ENC_CALL_SITE_ARGUMENT_USE = 0b11,
1011 };
1012
1013 // Reserve the maximal amount of bits so there is no need to mask out the
1014 // remaining ones. We will not encode anything else in the pointer anyway.
1015 static constexpr int NumEncodingBits =
1017 static_assert(NumEncodingBits >= 2, "At least two bits are required!");
1018
1019 /// The pointer with the encoding bits.
1020 PointerIntPair<void *, NumEncodingBits, char> Enc;
1021 ///}
1022
1023 /// Call base context. Used for callsite specific analysis.
1024 const CallBaseContext *CBContext = nullptr;
1025
1026 /// Return the encoding bits.
1027 char getEncodingBits() const { return Enc.getInt(); }
1028};
1029
1030/// Helper that allows IRPosition as a key in a DenseMap.
1031template <> struct DenseMapInfo<IRPosition> {
1032 static unsigned getHashValue(const IRPosition &IRP) {
1033 return (DenseMapInfo<void *>::getHashValue(IRP) << 4) ^
1035 }
1036
1037 static bool isEqual(const IRPosition &a, const IRPosition &b) {
1038 return a == b;
1039 }
1040};
1041
1042/// A visitor class for IR positions.
1043///
1044/// Given a position P, the SubsumingPositionIterator allows to visit "subsuming
1045/// positions" wrt. attributes/information. Thus, if a piece of information
1046/// holds for a subsuming position, it also holds for the position P.
1047///
1048/// The subsuming positions always include the initial position and then,
1049/// depending on the position kind, additionally the following ones:
1050/// - for IRP_RETURNED:
1051/// - the function (IRP_FUNCTION)
1052/// - for IRP_ARGUMENT:
1053/// - the function (IRP_FUNCTION)
1054/// - for IRP_CALL_SITE:
1055/// - the callee (IRP_FUNCTION), if known
1056/// - for IRP_CALL_SITE_RETURNED:
1057/// - the callee (IRP_RETURNED), if known
1058/// - the call site (IRP_FUNCTION)
1059/// - the callee (IRP_FUNCTION), if known
1060/// - for IRP_CALL_SITE_ARGUMENT:
1061/// - the argument of the callee (IRP_ARGUMENT), if known
1062/// - the callee (IRP_FUNCTION), if known
1063/// - the position the call site argument is associated with if it is not
1064/// anchored to the call site, e.g., if it is an argument then the argument
1065/// (IRP_ARGUMENT)
1067 SmallVector<IRPosition, 4> IRPositions;
1068 using iterator = decltype(IRPositions)::iterator;
1069
1070public:
1072 iterator begin() { return IRPositions.begin(); }
1073 iterator end() { return IRPositions.end(); }
1074};
1075
1076/// Wrapper for FunctionAnalysisManager.
1078 // The client may be running the old pass manager, in which case, we need to
1079 // map the requested Analysis to its equivalent wrapper in the old pass
1080 // manager. The scheme implemented here does not require every Analysis to be
1081 // updated. Only those new analyses that the client cares about in the old
1082 // pass manager need to expose a LegacyWrapper type, and that wrapper should
1083 // support a getResult() method that matches the new Analysis.
1084 //
1085 // We need SFINAE to check for the LegacyWrapper, but function templates don't
1086 // allow partial specialization, which is needed in this case. So instead, we
1087 // use a constexpr bool to perform the SFINAE, and then use this information
1088 // inside the function template.
1089 template <typename, typename = void>
1090 static constexpr bool HasLegacyWrapper = false;
1091
1092 template <typename Analysis>
1093 typename Analysis::Result *getAnalysis(const Function &F,
1094 bool RequestCachedOnly = false) {
1095 if (!LegacyPass && !FAM)
1096 return nullptr;
1097 if (FAM) {
1098 if (CachedOnly || RequestCachedOnly)
1099 return FAM->getCachedResult<Analysis>(const_cast<Function &>(F));
1100 return &FAM->getResult<Analysis>(const_cast<Function &>(F));
1101 }
1102 if constexpr (HasLegacyWrapper<Analysis>) {
1103 if (!CachedOnly && !RequestCachedOnly)
1104 return &LegacyPass
1105 ->getAnalysis<typename Analysis::LegacyWrapper>(
1106 const_cast<Function &>(F))
1107 .getResult();
1108 if (auto *P =
1109 LegacyPass
1110 ->getAnalysisIfAvailable<typename Analysis::LegacyWrapper>())
1111 return &P->getResult();
1112 }
1113 return nullptr;
1114 }
1115
1116 /// Invalidates the analyses. Valid only when using the new pass manager.
1118 assert(FAM && "Can only be used from the new PM!");
1119 FAM->clear();
1120 }
1121
1122 AnalysisGetter(FunctionAnalysisManager &FAM, bool CachedOnly = false)
1123 : FAM(&FAM), CachedOnly(CachedOnly) {}
1124 AnalysisGetter(Pass *P, bool CachedOnly = false)
1125 : LegacyPass(P), CachedOnly(CachedOnly) {}
1126 AnalysisGetter() = default;
1127
1128private:
1129 FunctionAnalysisManager *FAM = nullptr;
1130 Pass *LegacyPass = nullptr;
1131
1132 /// If \p CachedOnly is true, no pass is created, just existing results are
1133 /// used. Also available per request.
1134 bool CachedOnly = false;
1135};
1136
1137template <typename Analysis>
1139 Analysis, std::void_t<typename Analysis::LegacyWrapper>> = true;
1140
1141/// Data structure to hold cached (LLVM-IR) information.
1142///
1143/// All attributes are given an InformationCache object at creation time to
1144/// avoid inspection of the IR by all of them individually. This default
1145/// InformationCache will hold information required by 'default' attributes,
1146/// thus the ones deduced when Attributor::identifyDefaultAbstractAttributes(..)
1147/// is called.
1148///
1149/// If custom abstract attributes, registered manually through
1150/// Attributor::registerAA(...), need more information, especially if it is not
1151/// reusable, it is advised to inherit from the InformationCache and cast the
1152/// instance down in the abstract attributes.
1156 bool UseExplorer = true)
1157 : CGSCC(CGSCC), M(M), Allocator(Allocator), AG(AG) {
1158 if (UseExplorer)
1159 Explorer = new (Allocator) MustBeExecutedContextExplorer(
1160 /* ExploreInterBlock */
1161 true, /* ExploreCFGForward */ true,
1162 /* ExploreCFGBackward */ true,
1163 /* LIGetter */
1164 [&](const Function &F) { return AG.getAnalysis<LoopAnalysis>(F); },
1165 /* DTGetter */
1166 [&](const Function &F) {
1167 return AG.getAnalysis<DominatorTreeAnalysis>(F);
1168 },
1169 /* PDTGetter */
1170 [&](const Function &F) {
1171 return AG.getAnalysis<PostDominatorTreeAnalysis>(F);
1172 });
1173 }
1174
1176 // The FunctionInfo objects are allocated via a BumpPtrAllocator, we call
1177 // the destructor manually.
1178 for (auto &It : FuncInfoMap)
1179 It.getSecond()->~FunctionInfo();
1180 // Same is true for the instruction exclusions sets.
1182 for (auto *BES : BESets)
1183 BES->~InstExclusionSetTy();
1184 if (Explorer)
1185 Explorer->~MustBeExecutedContextExplorer();
1186 }
1187
1188 /// Apply \p CB to all uses of \p F. If \p LookThroughConstantExprUses is
1189 /// true, constant expression users are not given to \p CB but their uses are
1190 /// traversed transitively.
1191 template <typename CBTy>
1192 static void foreachUse(Function &F, CBTy CB,
1193 bool LookThroughConstantExprUses = true) {
1194 SmallVector<Use *, 8> Worklist(make_pointer_range(F.uses()));
1195
1196 for (unsigned Idx = 0; Idx < Worklist.size(); ++Idx) {
1197 Use &U = *Worklist[Idx];
1198
1199 // Allow use in constant bitcasts and simply look through them.
1200 if (LookThroughConstantExprUses && isa<ConstantExpr>(U.getUser())) {
1201 for (Use &CEU : cast<ConstantExpr>(U.getUser())->uses())
1202 Worklist.push_back(&CEU);
1203 continue;
1204 }
1205
1206 CB(U);
1207 }
1208 }
1209
1210 /// The CG-SCC the pass is run on, or nullptr if it is a module pass.
1211 const SetVector<Function *> *const CGSCC = nullptr;
1212
1213 /// A vector type to hold instructions.
1215
1216 /// A map type from opcodes to instructions with this opcode.
1218
1219 /// Return the map that relates "interesting" opcodes with all instructions
1220 /// with that opcode in \p F.
1222 return getFunctionInfo(F).OpcodeInstMap;
1223 }
1224
1225 /// Return the instructions in \p F that may read or write memory.
1227 return getFunctionInfo(F).RWInsts;
1228 }
1229
1230 /// Return MustBeExecutedContextExplorer
1234
1235 /// Return TargetLibraryInfo for function \p F.
1239
1240 /// Return true if \p F has the "kernel" function attribute
1241 bool isKernel(const Function &F) {
1242 FunctionInfo &FI = getFunctionInfo(F);
1243 return FI.IsKernel;
1244 }
1245
1246 /// Return true if \p Arg is involved in a must-tail call, thus the argument
1247 /// of the caller or callee.
1249 FunctionInfo &FI = getFunctionInfo(*Arg.getParent());
1250 return FI.CalledViaMustTail || FI.ContainsMustTailCall;
1251 }
1252
1253 bool isOnlyUsedByAssume(const Instruction &I) const {
1254 return AssumeOnlyValues.contains(&I);
1255 }
1256
1257 /// Invalidates the cached analyses. Valid only when using the new pass
1258 /// manager.
1259 void invalidateAnalyses() { AG.invalidateAnalyses(); }
1260
1261 /// Return the analysis result from a pass \p AP for function \p F.
1262 template <typename AP>
1263 typename AP::Result *getAnalysisResultForFunction(const Function &F,
1264 bool CachedOnly = false) {
1265 return AG.getAnalysis<AP>(F, CachedOnly);
1266 }
1267
1268 const Module &getModule() const { return M; }
1269
1270 /// Return datalayout used in the module.
1271 const DataLayout &getDL() const { return M.getDataLayout(); }
1272
1273 /// Return the map conaining all the knowledge we have from `llvm.assume`s.
1274 const RetainedKnowledgeMap &getKnowledgeMap() const { return KnowledgeMap; }
1275
1276 /// Given \p BES, return a uniqued version.
1279 auto It = BESets.find(BES);
1280 if (It != BESets.end())
1281 return *It;
1282 auto *UniqueBES = new (Allocator) AA::InstExclusionSetTy(*BES);
1283 bool Success = BESets.insert(UniqueBES).second;
1284 (void)Success;
1285 assert(Success && "Expected only new entries to be added");
1286 return UniqueBES;
1287 }
1288
1289 /// Return true if the stack (llvm::Alloca) can be accessed by other threads.
1291
1292 /// Return true if the target is a GPU.
1293 bool IsTargetGPU() const { return M.getTargetTriple().isGPU(); }
1294
1295 /// Return all functions that might be called indirectly, only valid for
1296 /// closed world modules (see isClosedWorldModule).
1299
1300 /// Return the flat address space if the associated target has.
1301 LLVM_ABI std::optional<unsigned> getFlatAddressSpace() const;
1302
1303 virtual unsigned getMaxAddrSpace() const { return ~0U; }
1304
1305private:
1306 struct FunctionInfo {
1307 LLVM_ABI ~FunctionInfo();
1308
1309 /// A nested map that remembers all instructions in a function with a
1310 /// certain instruction opcode (Instruction::getOpcode()).
1311 OpcodeInstMapTy OpcodeInstMap;
1312
1313 /// A map from functions to their instructions that may read or write
1314 /// memory.
1315 InstructionVectorTy RWInsts;
1316
1317 /// Function is called by a `musttail` call.
1318 bool CalledViaMustTail;
1319
1320 /// Function contains a `musttail` call.
1321 bool ContainsMustTailCall;
1322
1323 /// Function has the `"kernel"` attribute
1324 bool IsKernel;
1325 };
1326
1327 /// A map type from functions to informatio about it.
1328 DenseMap<const Function *, FunctionInfo *> FuncInfoMap;
1329
1330 /// Return information about the function \p F, potentially by creating it.
1331 FunctionInfo &getFunctionInfo(const Function &F) {
1332 FunctionInfo *&FI = FuncInfoMap[&F];
1333 if (!FI) {
1334 FI = new (Allocator) FunctionInfo();
1335 initializeInformationCache(F, *FI);
1336 }
1337 return *FI;
1338 }
1339
1340 /// Vector of functions that might be callable indirectly, i.a., via a
1341 /// function pointer.
1342 SmallVector<Function *> IndirectlyCallableFunctions;
1343
1344 /// Initialize the function information cache \p FI for the function \p F.
1345 ///
1346 /// This method needs to be called for all function that might be looked at
1347 /// through the information cache interface *prior* to looking at them.
1348 LLVM_ABI void initializeInformationCache(const Function &F, FunctionInfo &FI);
1349
1350 /// The module.
1351 const Module &M;
1352
1353 /// The allocator used to allocate memory, e.g. for `FunctionInfo`s.
1354 BumpPtrAllocator &Allocator;
1355
1356 /// MustBeExecutedContextExplorer
1357 MustBeExecutedContextExplorer *Explorer = nullptr;
1358
1359 /// A map with knowledge retained in `llvm.assume` instructions.
1360 RetainedKnowledgeMap KnowledgeMap;
1361
1362 /// A container for all instructions that are only used by `llvm.assume`.
1363 SetVector<const Instruction *> AssumeOnlyValues;
1364
1365 /// Cache for block sets to allow reuse.
1366 DenseSet<const AA::InstExclusionSetTy *> BESets;
1367
1368 /// Getters for analysis.
1369 AnalysisGetter &AG;
1370
1371 /// Set of inlineable functions
1372 SmallPtrSet<const Function *, 8> InlineableFunctions;
1373
1374 /// Give the Attributor access to the members so
1375 /// Attributor::identifyDefaultAbstractAttributes(...) can initialize them.
1376 friend struct Attributor;
1377};
1378
1379/// Configuration for the Attributor.
1381
1383
1384 /// Is the user of the Attributor a module pass or not. This determines what
1385 /// IR we can look at and modify. If it is a module pass we might deduce facts
1386 /// outside the initial function set and modify functions outside that set,
1387 /// but only as part of the optimization of the functions in the initial
1388 /// function set. For CGSCC passes we can look at the IR of the module slice
1389 /// but never run any deduction, or perform any modification, outside the
1390 /// initial function set (which we assume is the SCC).
1391 bool IsModulePass = true;
1392
1393 /// Flag to determine if we can delete functions or keep dead ones around.
1394 bool DeleteFns = true;
1395
1396 /// Flag to determine if we rewrite function signatures.
1398
1399 /// Flag to determine if we want to initialize all default AAs for an internal
1400 /// function marked live. See also: InitializationCallback>
1402
1403 /// Flag to determine if we should skip all liveness checks early on.
1404 bool UseLiveness = true;
1405
1406 /// Flag to indicate if the entire world is contained in this module, that
1407 /// is, no outside functions exist.
1409
1410 /// Callback function to be invoked on internal functions marked live.
1411 std::function<void(Attributor &A, const Function &F)> InitializationCallback =
1412 nullptr;
1413
1414 /// Callback function to determine if an indirect call targets should be made
1415 /// direct call targets (with an if-cascade).
1416 std::function<bool(Attributor &A, const AbstractAttribute &AA, CallBase &CB,
1417 Function &AssumedCallee, unsigned NumAssumedCallees)>
1419
1420 /// Helper to update an underlying call graph and to delete functions.
1422
1423 /// If not null, a set limiting the attribute opportunities.
1425
1426 /// Maximum number of iterations to run until fixpoint.
1427 std::optional<unsigned> MaxFixpointIterations;
1428
1429 /// A callback function that returns an ORE object from a Function pointer.
1430 ///{
1434 ///}
1435
1436 /// The name of the pass running the attributor, used to emit remarks.
1437 const char *PassName = nullptr;
1438
1439 using IPOAmendableCBTy = std::function<bool(const Function &F)>;
1441};
1442
1443/// A debug counter to limit the number of AAs created.
1444DEBUG_COUNTER(NumAbstractAttributes, "num-abstract-attributes",
1445 "How many AAs should be initialized");
1446
1447/// The fixpoint analysis framework that orchestrates the attribute deduction.
1448///
1449/// The Attributor provides a general abstract analysis framework (guided
1450/// fixpoint iteration) as well as helper functions for the deduction of
1451/// (LLVM-IR) attributes. However, also other code properties can be deduced,
1452/// propagated, and ultimately manifested through the Attributor framework. This
1453/// is particularly useful if these properties interact with attributes and a
1454/// co-scheduled deduction allows to improve the solution. Even if not, thus if
1455/// attributes/properties are completely isolated, they should use the
1456/// Attributor framework to reduce the number of fixpoint iteration frameworks
1457/// in the code base. Note that the Attributor design makes sure that isolated
1458/// attributes are not impacted, in any way, by others derived at the same time
1459/// if there is no cross-reasoning performed.
1460///
1461/// The public facing interface of the Attributor is kept simple and basically
1462/// allows abstract attributes to one thing, query abstract attributes
1463/// in-flight. There are two reasons to do this:
1464/// a) The optimistic state of one abstract attribute can justify an
1465/// optimistic state of another, allowing to framework to end up with an
1466/// optimistic (=best possible) fixpoint instead of one based solely on
1467/// information in the IR.
1468/// b) This avoids reimplementing various kinds of lookups, e.g., to check
1469/// for existing IR attributes, in favor of a single lookups interface
1470/// provided by an abstract attribute subclass.
1471///
1472/// NOTE: The mechanics of adding a new "concrete" abstract attribute are
1473/// described in the file comment.
1475
1476 /// Constructor
1477 ///
1478 /// \param Functions The set of functions we are deriving attributes for.
1479 /// \param InfoCache Cache to hold various information accessible for
1480 /// the abstract attributes.
1481 /// \param Configuration The Attributor configuration which determines what
1482 /// generic features to use.
1484 InformationCache &InfoCache,
1485 AttributorConfig Configuration);
1486
1488
1489 /// Run the analyses until a fixpoint is reached or enforced (timeout).
1490 ///
1491 /// The attributes registered with this Attributor can be used after as long
1492 /// as the Attributor is not destroyed (it owns the attributes now).
1493 ///
1494 /// \Returns CHANGED if the IR was changed, otherwise UNCHANGED.
1496
1497 /// Lookup an abstract attribute of type \p AAType at position \p IRP. While
1498 /// no abstract attribute is found equivalent positions are checked, see
1499 /// SubsumingPositionIterator. Thus, the returned abstract attribute
1500 /// might be anchored at a different position, e.g., the callee if \p IRP is a
1501 /// call base.
1502 ///
1503 /// This method is the only (supported) way an abstract attribute can retrieve
1504 /// information from another abstract attribute. As an example, take an
1505 /// abstract attribute that determines the memory access behavior for a
1506 /// argument (readnone, readonly, ...). It should use `getAAFor` to get the
1507 /// most optimistic information for other abstract attributes in-flight, e.g.
1508 /// the one reasoning about the "captured" state for the argument or the one
1509 /// reasoning on the memory access behavior of the function as a whole.
1510 ///
1511 /// If the DepClass enum is set to `DepClassTy::None` the dependence from
1512 /// \p QueryingAA to the return abstract attribute is not automatically
1513 /// recorded. This should only be used if the caller will record the
1514 /// dependence explicitly if necessary, thus if it the returned abstract
1515 /// attribute is used for reasoning. To record the dependences explicitly use
1516 /// the `Attributor::recordDependence` method.
1517 template <typename AAType>
1518 const AAType *getAAFor(const AbstractAttribute &QueryingAA,
1519 const IRPosition &IRP, DepClassTy DepClass) {
1520 return getOrCreateAAFor<AAType>(IRP, &QueryingAA, DepClass,
1521 /* ForceUpdate */ false);
1522 }
1523
1524 /// The version of getAAFor that allows to omit a querying abstract
1525 /// attribute. Using this after Attributor started running is restricted to
1526 /// only the Attributor itself. Initial seeding of AAs can be done via this
1527 /// function.
1528 /// NOTE: ForceUpdate is ignored in any stage other than the update stage.
1529 template <typename AAType>
1530 const AAType *getOrCreateAAFor(IRPosition IRP,
1531 const AbstractAttribute *QueryingAA,
1532 DepClassTy DepClass, bool ForceUpdate = false,
1533 bool UpdateAfterInit = true) {
1534 if (!shouldPropagateCallBaseContext(IRP))
1535 IRP = IRP.stripCallBaseContext();
1536
1537 if (AAType *AAPtr = lookupAAFor<AAType>(IRP, QueryingAA, DepClass,
1538 /* AllowInvalidState */ true)) {
1539 if (ForceUpdate && Phase == AttributorPhase::UPDATE)
1540 updateAA(*AAPtr);
1541 return AAPtr;
1542 }
1543
1544 bool ShouldUpdateAA;
1545 if (!shouldInitialize<AAType>(IRP, ShouldUpdateAA))
1546 return nullptr;
1547
1548 if (!DebugCounter::shouldExecute(NumAbstractAttributes))
1549 return nullptr;
1550
1551 // No matching attribute found, create one.
1552 // Use the static create method.
1553 auto &AA = AAType::createForPosition(IRP, *this);
1554
1555 // Always register a new attribute to make sure we clean up the allocated
1556 // memory properly.
1557 registerAA(AA);
1558
1559 // If we are currenty seeding attributes, enforce seeding rules.
1560 if (Phase == AttributorPhase::SEEDING && !shouldSeedAttribute(AA)) {
1561 AA.getState().indicatePessimisticFixpoint();
1562 return &AA;
1563 }
1564
1565 // Bootstrap the new attribute with an initial update to propagate
1566 // information, e.g., function -> call site.
1567 {
1568 TimeTraceScope TimeScope("initialize", [&]() {
1569 return AA.getName().str() +
1570 std::to_string(AA.getIRPosition().getPositionKind());
1571 });
1572 ++InitializationChainLength;
1573 AA.initialize(*this);
1574 --InitializationChainLength;
1575 }
1576
1577 if (!ShouldUpdateAA) {
1578 AA.getState().indicatePessimisticFixpoint();
1579 return &AA;
1580 }
1581
1582 // Allow seeded attributes to declare dependencies.
1583 // Remember the seeding state.
1584 if (UpdateAfterInit) {
1585 AttributorPhase OldPhase = Phase;
1586 Phase = AttributorPhase::UPDATE;
1587
1588 updateAA(AA);
1589
1590 Phase = OldPhase;
1591 }
1592
1593 if (QueryingAA && AA.getState().isValidState())
1594 recordDependence(AA, const_cast<AbstractAttribute &>(*QueryingAA),
1595 DepClass);
1596 return &AA;
1597 }
1598
1599 template <typename AAType>
1600 const AAType *getOrCreateAAFor(const IRPosition &IRP) {
1601 return getOrCreateAAFor<AAType>(IRP, /* QueryingAA */ nullptr,
1603 }
1604
1605 /// Return the attribute of \p AAType for \p IRP if existing and valid. This
1606 /// also allows non-AA users lookup.
1607 template <typename AAType>
1608 AAType *lookupAAFor(const IRPosition &IRP,
1609 const AbstractAttribute *QueryingAA = nullptr,
1611 bool AllowInvalidState = false) {
1612 static_assert(std::is_base_of<AbstractAttribute, AAType>::value,
1613 "Cannot query an attribute with a type not derived from "
1614 "'AbstractAttribute'!");
1615 // Lookup the abstract attribute of type AAType. If found, return it after
1616 // registering a dependence of QueryingAA on the one returned attribute.
1617 AbstractAttribute *AAPtr = AAMap.lookup({&AAType::ID, IRP});
1618 if (!AAPtr)
1619 return nullptr;
1620
1621 AAType *AA = static_cast<AAType *>(AAPtr);
1622
1623 // Do not register a dependence on an attribute with an invalid state.
1624 if (DepClass != DepClassTy::NONE && QueryingAA &&
1625 AA->getState().isValidState())
1626 recordDependence(*AA, const_cast<AbstractAttribute &>(*QueryingAA),
1627 DepClass);
1628
1629 // Return nullptr if this attribute has an invalid state.
1630 if (!AllowInvalidState && !AA->getState().isValidState())
1631 return nullptr;
1632 return AA;
1633 }
1634
1635 /// Allows a query AA to request an update if a new query was received.
1637
1638 /// Explicitly record a dependence from \p FromAA to \p ToAA, that is if
1639 /// \p FromAA changes \p ToAA should be updated as well.
1640 ///
1641 /// This method should be used in conjunction with the `getAAFor` method and
1642 /// with the DepClass enum passed to the method set to None. This can
1643 /// be beneficial to avoid false dependences but it requires the users of
1644 /// `getAAFor` to explicitly record true dependences through this method.
1645 /// The \p DepClass flag indicates if the dependence is striclty necessary.
1646 /// That means for required dependences, if \p FromAA changes to an invalid
1647 /// state, \p ToAA can be moved to a pessimistic fixpoint because it required
1648 /// information from \p FromAA but none are available anymore.
1649 LLVM_ABI void recordDependence(const AbstractAttribute &FromAA,
1650 const AbstractAttribute &ToAA,
1651 DepClassTy DepClass);
1652
1653 /// Introduce a new abstract attribute into the fixpoint analysis.
1654 ///
1655 /// Note that ownership of the attribute is given to the Attributor. It will
1656 /// invoke delete for the Attributor on destruction of the Attributor.
1657 ///
1658 /// Attributes are identified by their IR position (AAType::getIRPosition())
1659 /// and the address of their static member (see AAType::ID).
1660 template <typename AAType> AAType &registerAA(AAType &AA) {
1661 static_assert(std::is_base_of<AbstractAttribute, AAType>::value,
1662 "Cannot register an attribute with a type not derived from "
1663 "'AbstractAttribute'!");
1664 // Put the attribute in the lookup map structure and the container we use to
1665 // keep track of all attributes.
1666 const IRPosition &IRP = AA.getIRPosition();
1667 AbstractAttribute *&AAPtr = AAMap[{&AAType::ID, IRP}];
1668
1669 assert(!AAPtr && "Attribute already in map!");
1670 AAPtr = &AA;
1671
1672 // Register AA with the synthetic root only before the manifest stage.
1673 if (isDuringDeduction())
1674 DG.SyntheticRoot.Deps.insert(
1676
1677 return AA;
1678 }
1679
1680 /// Return the internal information cache.
1681 InformationCache &getInfoCache() { return InfoCache; }
1682
1683 /// Return the module.
1684 const Module &getModule() { return InfoCache.getModule(); }
1685
1686 /// Return true if this is a module pass, false otherwise.
1687 bool isModulePass() const { return Configuration.IsModulePass; }
1688
1689 /// Return true if we should specialize the call site \b CB for the potential
1690 /// callee \p Fn.
1692 CallBase &CB, Function &Callee,
1693 unsigned NumAssumedCallees) {
1694 return Configuration.IndirectCalleeSpecializationCallback
1695 ? Configuration.IndirectCalleeSpecializationCallback(
1696 *this, AA, CB, Callee, NumAssumedCallees)
1697 : true;
1698 }
1699
1700 /// Return true if the module contains the whole world, thus, no outside
1701 /// functions exist.
1702 LLVM_ABI bool isClosedWorldModule() const;
1703
1704 /// Return true if we derive attributes for \p Fn
1705 bool isRunOn(Function &Fn) const { return isRunOn(&Fn); }
1706 bool isRunOn(Function *Fn) const {
1707 return Functions.empty() || Functions.count(Fn);
1708 }
1709
1710 template <typename AAType> bool shouldUpdateAA(const IRPosition &IRP) {
1711 // If this is queried in the manifest stage, we force the AA to indicate
1712 // pessimistic fixpoint immediately.
1713 if (!isDuringDeduction())
1714 return false;
1715
1716 Function *AssociatedFn = IRP.getAssociatedFunction();
1717
1718 if (IRP.isAnyCallSitePosition()) {
1719 // Check if we require a callee but there is none.
1720 if (!AssociatedFn && AAType::requiresCalleeForCallBase())
1721 return false;
1722
1723 // Check if we require non-asm but it is inline asm.
1724 if (AAType::requiresNonAsmForCallBase() &&
1725 cast<CallBase>(IRP.getAnchorValue()).isInlineAsm())
1726 return false;
1727 }
1728
1729 // Check if we require a calles but we can't see all.
1730 if (AAType::requiresCallersForArgOrFunction())
1733 if (!AssociatedFn->hasLocalLinkage())
1734 return false;
1735
1736 if (!AAType::isValidIRPositionForUpdate(*this, IRP))
1737 return false;
1738
1739 // We update only AAs associated with functions in the Functions set or
1740 // call sites of them.
1741 return (!AssociatedFn || isModulePass() || isRunOn(AssociatedFn) ||
1742 isRunOn(IRP.getAnchorScope()));
1743 }
1744
1745 template <typename AAType>
1746 bool shouldInitialize(const IRPosition &IRP, bool &ShouldUpdateAA) {
1747 if (!AAType::isValidIRPositionForInit(*this, IRP))
1748 return false;
1749
1750 if (Configuration.Allowed && !Configuration.Allowed->count(&AAType::ID))
1751 return false;
1752
1753 // For now we skip anything in naked and optnone functions.
1754 const Function *AnchorFn = IRP.getAnchorScope();
1755 if (AnchorFn && (AnchorFn->hasFnAttribute(Attribute::Naked) ||
1756 AnchorFn->hasFnAttribute(Attribute::OptimizeNone)))
1757 return false;
1758
1759 // Avoid too many nested initializations to prevent a stack overflow.
1760 if (InitializationChainLength > MaxInitializationChainLength)
1761 return false;
1762
1763 ShouldUpdateAA = shouldUpdateAA<AAType>(IRP);
1764
1765 return !AAType::hasTrivialInitializer() || ShouldUpdateAA;
1766 }
1767
1768 /// Determine opportunities to derive 'default' attributes in \p F and create
1769 /// abstract attribute objects for them.
1770 ///
1771 /// \param F The function that is checked for attribute opportunities.
1772 ///
1773 /// Note that abstract attribute instances are generally created even if the
1774 /// IR already contains the information they would deduce. The most important
1775 /// reason for this is the single interface, the one of the abstract attribute
1776 /// instance, which can be queried without the need to look at the IR in
1777 /// various places.
1779
1780 /// Determine whether the function \p F is IPO amendable
1781 ///
1782 /// If a function is exactly defined or it has alwaysinline attribute
1783 /// and is viable to be inlined, we say it is IPO amendable
1785 return F.hasExactDefinition() || InfoCache.InlineableFunctions.count(&F) ||
1786 (Configuration.IPOAmendableCB && Configuration.IPOAmendableCB(F));
1787 }
1788
1789 /// Return whether attributes can participate in fixed-point deduction.
1790 bool isDuringDeduction() const {
1791 return Phase == AttributorPhase::SEEDING ||
1792 Phase == AttributorPhase::UPDATE;
1793 }
1794
1795 /// Mark the internal function \p F as live.
1796 ///
1797 /// This will trigger the identification and initialization of attributes for
1798 /// \p F.
1800 assert(F.hasLocalLinkage() &&
1801 "Only local linkage is assumed dead initially.");
1802
1803 if (Configuration.DefaultInitializeLiveInternals)
1805 if (Configuration.InitializationCallback)
1806 Configuration.InitializationCallback(*this, F);
1807 }
1808
1809 /// Record that \p U is to be replaces with \p NV after information was
1810 /// manifested. This also triggers deletion of trivially dead istructions.
1812 Value *&V = ToBeChangedUses[&U];
1813 if (V && (V->stripPointerCasts() == NV.stripPointerCasts() ||
1815 return false;
1816 assert((!V || V == &NV || isa<UndefValue>(NV)) &&
1817 "Use was registered twice for replacement with different values!");
1818 V = &NV;
1819 return true;
1820 }
1821
1822 /// Helper function to replace all uses associated with \p IRP with \p NV.
1823 /// Return true if there is any change. The flag \p ChangeDroppable indicates
1824 /// if dropppable uses should be changed too.
1826 bool ChangeDroppable = true) {
1828 auto *CB = cast<CallBase>(IRP.getCtxI());
1830 CB->getArgOperandUse(IRP.getCallSiteArgNo()), NV);
1831 }
1832 Value &V = IRP.getAssociatedValue();
1833 auto &Entry = ToBeChangedValues[&V];
1834 Value *CurNV = get<0>(Entry);
1835 if (CurNV && (CurNV->stripPointerCasts() == NV.stripPointerCasts() ||
1836 isa<UndefValue>(CurNV)))
1837 return false;
1838 assert((!CurNV || CurNV == &NV || isa<UndefValue>(NV)) &&
1839 "Value replacement was registered twice with different values!");
1840 Entry = {&NV, ChangeDroppable};
1841 return true;
1842 }
1843
1844 /// Record that \p I is to be replaced with `unreachable` after information
1845 /// was manifested.
1847 ToBeChangedToUnreachableInsts.insert(I);
1848 }
1849
1850 /// Record that \p II has at least one dead successor block. This information
1851 /// is used, e.g., to replace \p II with a call, after information was
1852 /// manifested.
1854 InvokeWithDeadSuccessor.insert(&II);
1855 }
1856
1857 /// Record that \p I is deleted after information was manifested. This also
1858 /// triggers deletion of trivially dead istructions.
1859 void deleteAfterManifest(Instruction &I) { ToBeDeletedInsts.insert(&I); }
1860
1861 /// Record that \p BB is deleted after information was manifested. This also
1862 /// triggers deletion of trivially dead istructions.
1863 void deleteAfterManifest(BasicBlock &BB) { ToBeDeletedBlocks.insert(&BB); }
1864
1865 // Record that \p BB is added during the manifest of an AA. Added basic blocks
1866 // are preserved in the IR.
1868 ManifestAddedBlocks.insert(&BB);
1869 }
1870
1871 /// Record that \p F is deleted after information was manifested.
1873 if (Configuration.DeleteFns)
1874 ToBeDeletedFunctions.insert(&F);
1875 }
1876
1877 /// Return the attributes of kind \p AK existing in the IR as operand bundles
1878 /// of an llvm.assume.
1879 LLVM_ABI bool getAttrsFromAssumes(const IRPosition &IRP,
1882
1883 /// Return true if any kind in \p AKs existing in the IR at a position that
1884 /// will affect this one. See also getAttrs(...).
1885 /// \param IgnoreSubsumingPositions Flag to determine if subsuming positions,
1886 /// e.g., the function position if this is an
1887 /// argument position, should be ignored.
1888 LLVM_ABI bool
1890 bool IgnoreSubsumingPositions = false,
1891 Attribute::AttrKind ImpliedAttributeKind = Attribute::None);
1892
1893 /// Return the attributes of any kind in \p AKs existing in the IR at a
1894 /// position that will affect this one. While each position can only have a
1895 /// single attribute of any kind in \p AKs, there are "subsuming" positions
1896 /// that could have an attribute as well. This method returns all attributes
1897 /// found in \p Attrs.
1898 /// \param IgnoreSubsumingPositions Flag to determine if subsuming positions,
1899 /// e.g., the function position if this is an
1900 /// argument position, should be ignored.
1901 LLVM_ABI void getAttrs(const IRPosition &IRP,
1904 bool IgnoreSubsumingPositions = false);
1905
1906 /// Remove all \p AttrKinds attached to \p IRP.
1910 ArrayRef<StringRef> Attrs);
1911
1912 /// Attach \p DeducedAttrs to \p IRP, if \p ForceReplace is set we do this
1913 /// even if the same attribute kind was already present.
1915 ArrayRef<Attribute> DeducedAttrs,
1916 bool ForceReplace = false);
1917
1918private:
1919 /// Helper to check \p Attrs for \p AK, if not found, check if \p
1920 /// AAType::isImpliedByIR is true, and if not, create AAType for \p IRP.
1921 /// If \p SkipHasAttrCheck is true, don't check whether the attribute is set
1922 /// first. This should be used if only some values of a complex IR attribute
1923 /// imply the AAType.
1924 template <Attribute::AttrKind AK, typename AAType>
1925 void checkAndQueryIRAttr(const IRPosition &IRP, AttributeSet Attrs,
1926 bool SkipHasAttrCheck = false);
1927
1928 /// Helper to apply \p CB on all attributes of type \p AttrDescs of \p IRP.
1929 template <typename DescTy>
1930 ChangeStatus updateAttrMap(const IRPosition &IRP, ArrayRef<DescTy> AttrDescs,
1931 function_ref<bool(const DescTy &, AttributeSet,
1932 AttributeMask &, AttrBuilder &)>
1933 CB);
1934
1935 /// Mapping from functions/call sites to their attributes.
1937
1938public:
1939 /// If \p IRP is assumed to be a constant, return it, if it is unclear yet,
1940 /// return std::nullopt, otherwise return `nullptr`.
1941 LLVM_ABI std::optional<Constant *>
1943 bool &UsedAssumedInformation);
1944 std::optional<Constant *> getAssumedConstant(const Value &V,
1945 const AbstractAttribute &AA,
1946 bool &UsedAssumedInformation) {
1947 return getAssumedConstant(IRPosition::value(V), AA, UsedAssumedInformation);
1948 }
1949
1950 /// If \p V is assumed simplified, return it, if it is unclear yet,
1951 /// return std::nullopt, otherwise return `nullptr`.
1952 std::optional<Value *> getAssumedSimplified(const IRPosition &IRP,
1953 const AbstractAttribute &AA,
1954 bool &UsedAssumedInformation,
1955 AA::ValueScope S) {
1956 return getAssumedSimplified(IRP, &AA, UsedAssumedInformation, S);
1957 }
1958 std::optional<Value *> getAssumedSimplified(const Value &V,
1959 const AbstractAttribute &AA,
1960 bool &UsedAssumedInformation,
1961 AA::ValueScope S) {
1963 UsedAssumedInformation, S);
1964 }
1965
1966 /// If \p V is assumed simplified, return it, if it is unclear yet,
1967 /// return std::nullopt, otherwise return `nullptr`. Same as the public
1968 /// version except that it can be used without recording dependences on any \p
1969 /// AA.
1970 LLVM_ABI std::optional<Value *>
1972 bool &UsedAssumedInformation, AA::ValueScope S);
1973
1974 /// Try to simplify \p IRP and in the scope \p S. If successful, true is
1975 /// returned and all potential values \p IRP can take are put into \p Values.
1976 /// If the result in \p Values contains select or PHI instructions it means
1977 /// those could not be simplified to a single value. Recursive calls with
1978 /// these instructions will yield their respective potential values. If false
1979 /// is returned no other information is valid.
1980 LLVM_ABI bool
1983 AA::ValueScope S, bool &UsedAssumedInformation,
1984 bool RecurseForSelectAndPHI = true);
1985
1986 /// Register \p CB as a simplification callback.
1987 /// `Attributor::getAssumedSimplified` will use these callbacks before
1988 /// we it will ask `AAValueSimplify`. It is important to ensure this
1989 /// is called before `identifyDefaultAbstractAttributes`, assuming the
1990 /// latter is called at all.
1991 using SimplifictionCallbackTy = std::function<std::optional<Value *>(
1992 const IRPosition &, const AbstractAttribute *, bool &)>;
1994 const SimplifictionCallbackTy &CB) {
1995 SimplificationCallbacks[IRP].emplace_back(CB);
1996 }
1997
1998 /// Return true if there is a simplification callback for \p IRP.
2000 return SimplificationCallbacks.count(IRP);
2001 }
2002
2003 /// Register \p CB as a simplification callback.
2004 /// Similar to \p registerSimplificationCallback, the call back will be called
2005 /// first when we simplify a global variable \p GV.
2007 std::function<std::optional<Constant *>(
2008 const GlobalVariable &, const AbstractAttribute *, bool &)>;
2010 const GlobalVariable &GV,
2012 GlobalVariableSimplificationCallbacks[&GV].emplace_back(CB);
2013 }
2014
2015 /// Return true if there is a simplification callback for \p GV.
2017 return GlobalVariableSimplificationCallbacks.count(&GV);
2018 }
2019
2020 /// Return \p std::nullopt if there is no call back registered for \p GV or
2021 /// the call back is still not sure if \p GV can be simplified. Return \p
2022 /// nullptr if \p GV can't be simplified.
2023 std::optional<Constant *>
2025 const AbstractAttribute *AA,
2026 bool &UsedAssumedInformation) {
2027 assert(GlobalVariableSimplificationCallbacks.contains(&GV));
2028 for (auto &CB : GlobalVariableSimplificationCallbacks.lookup(&GV)) {
2029 auto SimplifiedGV = CB(GV, AA, UsedAssumedInformation);
2030 // For now we assume the call back will not return a std::nullopt.
2031 assert(SimplifiedGV.has_value() && "SimplifiedGV has not value");
2032 return *SimplifiedGV;
2033 }
2034 llvm_unreachable("there must be a callback registered");
2035 }
2036
2038 std::function<bool(Attributor &, const AbstractAttribute *)>;
2040 const VirtualUseCallbackTy &CB) {
2041 VirtualUseCallbacks[&V].emplace_back(CB);
2042 }
2043
2044private:
2045 /// The vector with all simplification callbacks registered by outside AAs.
2047 SimplificationCallbacks;
2048
2049 /// The vector with all simplification callbacks for global variables
2050 /// registered by outside AAs.
2051 DenseMap<const GlobalVariable *,
2053 GlobalVariableSimplificationCallbacks;
2054
2056 VirtualUseCallbacks;
2057
2058public:
2059 /// Translate \p V from the callee context into the call site context.
2060 LLVM_ABI std::optional<Value *>
2061 translateArgumentToCallSiteContent(std::optional<Value *> V, CallBase &CB,
2062 const AbstractAttribute &AA,
2063 bool &UsedAssumedInformation);
2064
2065 /// Return true if \p AA (or its context instruction) is assumed dead.
2066 ///
2067 /// If \p LivenessAA is not provided it is queried.
2069 const AAIsDead *LivenessAA,
2070 bool &UsedAssumedInformation,
2071 bool CheckBBLivenessOnly = false,
2072 DepClassTy DepClass = DepClassTy::OPTIONAL);
2073
2074 /// Return true if \p I is assumed dead.
2075 ///
2076 /// If \p LivenessAA is not provided it is queried.
2077 LLVM_ABI bool isAssumedDead(const Instruction &I,
2078 const AbstractAttribute *QueryingAA,
2079 const AAIsDead *LivenessAA,
2080 bool &UsedAssumedInformation,
2081 bool CheckBBLivenessOnly = false,
2083 bool CheckForDeadStore = false);
2084
2085 /// Return true if \p U is assumed dead.
2086 ///
2087 /// If \p FnLivenessAA is not provided it is queried.
2088 LLVM_ABI bool isAssumedDead(const Use &U, const AbstractAttribute *QueryingAA,
2089 const AAIsDead *FnLivenessAA,
2090 bool &UsedAssumedInformation,
2091 bool CheckBBLivenessOnly = false,
2092 DepClassTy DepClass = DepClassTy::OPTIONAL);
2093
2094 /// Return true if \p IRP is assumed dead.
2095 ///
2096 /// If \p FnLivenessAA is not provided it is queried.
2097 LLVM_ABI bool isAssumedDead(const IRPosition &IRP,
2098 const AbstractAttribute *QueryingAA,
2099 const AAIsDead *FnLivenessAA,
2100 bool &UsedAssumedInformation,
2101 bool CheckBBLivenessOnly = false,
2102 DepClassTy DepClass = DepClassTy::OPTIONAL);
2103
2104 /// Return true if \p BB is assumed dead.
2105 ///
2106 /// If \p LivenessAA is not provided it is queried.
2107 LLVM_ABI bool isAssumedDead(const BasicBlock &BB,
2108 const AbstractAttribute *QueryingAA,
2109 const AAIsDead *FnLivenessAA,
2110 DepClassTy DepClass = DepClassTy::OPTIONAL);
2111
2112 /// Check \p Pred on all potential Callees of \p CB.
2113 ///
2114 /// This method will evaluate \p Pred with all potential callees of \p CB as
2115 /// input and return true if \p Pred does. If some callees might be unknown
2116 /// this function will return false.
2118 function_ref<bool(ArrayRef<const Function *> Callees)> Pred,
2119 const AbstractAttribute &QueryingAA, const CallBase &CB);
2120
2121 /// Check \p Pred on all (transitive) uses of \p V.
2122 ///
2123 /// This method will evaluate \p Pred on all (transitive) uses of the
2124 /// associated value and return true if \p Pred holds every time.
2125 /// If uses are skipped in favor of equivalent ones, e.g., if we look through
2126 /// memory, the \p EquivalentUseCB will be used to give the caller an idea
2127 /// what original used was replaced by a new one (or new ones). The visit is
2128 /// cut short if \p EquivalentUseCB returns false and the function will return
2129 /// false as well.
2131 function_ref<bool(const Use &, bool &)> Pred,
2132 const AbstractAttribute &QueryingAA, const Value &V,
2133 bool CheckBBLivenessOnly = false,
2134 DepClassTy LivenessDepClass = DepClassTy::OPTIONAL,
2135 bool IgnoreDroppableUses = true,
2136 function_ref<bool(const Use &OldU, const Use &NewU)> EquivalentUseCB =
2137 nullptr);
2138
2139 /// Emit a remark generically.
2140 ///
2141 /// This template function can be used to generically emit a remark. The
2142 /// RemarkKind should be one of the following:
2143 /// - OptimizationRemark to indicate a successful optimization attempt
2144 /// - OptimizationRemarkMissed to report a failed optimization attempt
2145 /// - OptimizationRemarkAnalysis to provide additional information about an
2146 /// optimization attempt
2147 ///
2148 /// The remark is built using a callback function \p RemarkCB that takes a
2149 /// RemarkKind as input and returns a RemarkKind.
2150 template <typename RemarkKind, typename RemarkCallBack>
2152 RemarkCallBack &&RemarkCB) const {
2153 if (!Configuration.OREGetter)
2154 return;
2155
2156 Function *F = I->getFunction();
2157 auto &ORE = Configuration.OREGetter(F);
2158
2159 if (RemarkName.starts_with("OMP"))
2160 ORE.emit([&]() {
2161 return RemarkCB(RemarkKind(Configuration.PassName, RemarkName, I))
2162 << " [" << RemarkName << "]";
2163 });
2164 else
2165 ORE.emit([&]() {
2166 return RemarkCB(RemarkKind(Configuration.PassName, RemarkName, I));
2167 });
2168 }
2169
2170 /// Emit a remark on a function.
2171 template <typename RemarkKind, typename RemarkCallBack>
2172 void emitRemark(Function *F, StringRef RemarkName,
2173 RemarkCallBack &&RemarkCB) const {
2174 if (!Configuration.OREGetter)
2175 return;
2176
2177 auto &ORE = Configuration.OREGetter(F);
2178
2179 if (RemarkName.starts_with("OMP"))
2180 ORE.emit([&]() {
2181 return RemarkCB(RemarkKind(Configuration.PassName, RemarkName, F))
2182 << " [" << RemarkName << "]";
2183 });
2184 else
2185 ORE.emit([&]() {
2186 return RemarkCB(RemarkKind(Configuration.PassName, RemarkName, F));
2187 });
2188 }
2189
2190 /// Helper struct used in the communication between an abstract attribute (AA)
2191 /// that wants to change the signature of a function and the Attributor which
2192 /// applies the changes. The struct is partially initialized with the
2193 /// information from the AA (see the constructor). All other members are
2194 /// provided by the Attributor prior to invoking any callbacks.
2195 struct ArgumentReplacementInfo {
2196 /// Callee repair callback type
2197 ///
2198 /// The function repair callback is invoked once to rewire the replacement
2199 /// arguments in the body of the new function. The argument replacement info
2200 /// is passed, as build from the registerFunctionSignatureRewrite call, as
2201 /// well as the replacement function and an iteratore to the first
2202 /// replacement argument.
2203 using CalleeRepairCBTy = std::function<void(
2204 const ArgumentReplacementInfo &, Function &, Function::arg_iterator)>;
2205
2206 /// Abstract call site (ACS) repair callback type
2207 ///
2208 /// The abstract call site repair callback is invoked once on every abstract
2209 /// call site of the replaced function (\see ReplacedFn). The callback needs
2210 /// to provide the operands for the call to the new replacement function.
2211 /// The number and type of the operands appended to the provided vector
2212 /// (second argument) is defined by the number and types determined through
2213 /// the replacement type vector (\see ReplacementTypes). The first argument
2214 /// is the ArgumentReplacementInfo object registered with the Attributor
2215 /// through the registerFunctionSignatureRewrite call.
2217 std::function<void(const ArgumentReplacementInfo &, AbstractCallSite,
2219
2220 /// Simple getters, see the corresponding members for details.
2221 ///{
2222
2223 Attributor &getAttributor() const { return A; }
2224 const Function &getReplacedFn() const { return ReplacedFn; }
2225 const Argument &getReplacedArg() const { return ReplacedArg; }
2226 unsigned getNumReplacementArgs() const { return ReplacementTypes.size(); }
2227
2228 ///}
2229
2230 private:
2231 /// Constructor that takes the argument to be replaced, the types of
2232 /// the replacement arguments, as well as callbacks to repair the call sites
2233 /// and new function after the replacement happened.
2235 ArrayRef<Type *> ReplacementTypes,
2236 CalleeRepairCBTy &&CalleeRepairCB,
2237 ACSRepairCBTy &&ACSRepairCB)
2238 : A(A), ReplacedFn(*Arg.getParent()), ReplacedArg(Arg),
2239 ReplacementTypes(ReplacementTypes),
2240 CalleeRepairCB(std::move(CalleeRepairCB)),
2241 ACSRepairCB(std::move(ACSRepairCB)) {}
2242
2243 /// Reference to the attributor to allow access from the callbacks.
2244 Attributor &A;
2245
2246 /// The "old" function replaced by ReplacementFn.
2247 const Function &ReplacedFn;
2248
2249 /// The "old" argument replaced by new ones defined via ReplacementTypes.
2250 const Argument &ReplacedArg;
2251
2252 /// The types of the arguments replacing ReplacedArg.
2253 const SmallVector<Type *, 8> ReplacementTypes;
2254
2255 /// Callee repair callback, see CalleeRepairCBTy.
2256 const CalleeRepairCBTy CalleeRepairCB;
2257
2258 /// Abstract call site (ACS) repair callback, see ACSRepairCBTy.
2259 const ACSRepairCBTy ACSRepairCB;
2260
2261 /// Allow access to the private members from the Attributor.
2262 friend struct Attributor;
2263 };
2264
2265 /// Check if we can rewrite a function signature.
2266 ///
2267 /// The argument \p Arg is replaced with new ones defined by the number,
2268 /// order, and types in \p ReplacementTypes.
2269 ///
2270 /// \returns True, if the replacement can be registered, via
2271 /// registerFunctionSignatureRewrite, false otherwise.
2272 LLVM_ABI bool
2274 ArrayRef<Type *> ReplacementTypes);
2275
2276 /// Register a rewrite for a function signature.
2277 ///
2278 /// The argument \p Arg is replaced with new ones defined by the number,
2279 /// order, and types in \p ReplacementTypes. The rewiring at the call sites is
2280 /// done through \p ACSRepairCB and at the callee site through
2281 /// \p CalleeRepairCB.
2282 ///
2283 /// \returns True, if the replacement was registered, false otherwise.
2285 Argument &Arg, ArrayRef<Type *> ReplacementTypes,
2288
2289 /// Check \p Pred on all function call sites.
2290 ///
2291 /// This method will evaluate \p Pred on call sites and return
2292 /// true if \p Pred holds in every call sites. However, this is only possible
2293 /// all call sites are known, hence the function has internal linkage.
2294 /// If true is returned, \p UsedAssumedInformation is set if assumed
2295 /// information was used to skip or simplify potential call sites.
2297 const AbstractAttribute &QueryingAA,
2298 bool RequireAllCallSites,
2299 bool &UsedAssumedInformation);
2300
2301 /// Check \p Pred on all call sites of \p Fn.
2302 ///
2303 /// This method will evaluate \p Pred on call sites and return
2304 /// true if \p Pred holds in every call sites. However, this is only possible
2305 /// all call sites are known, hence the function has internal linkage.
2306 /// If true is returned, \p UsedAssumedInformation is set if assumed
2307 /// information was used to skip or simplify potential call sites.
2309 const Function &Fn,
2310 bool RequireAllCallSites,
2311 const AbstractAttribute *QueryingAA,
2312 bool &UsedAssumedInformation,
2313 bool CheckPotentiallyDead = false);
2314
2315 /// Check \p Pred on all values potentially returned by the function
2316 /// associated with \p QueryingAA.
2317 ///
2318 /// This is the context insensitive version of the method above.
2319 LLVM_ABI bool
2321 const AbstractAttribute &QueryingAA,
2323 bool RecurseForSelectAndPHI = true);
2324
2325 /// Check \p Pred on all instructions in \p Fn with an opcode present in
2326 /// \p Opcodes.
2327 ///
2328 /// This method will evaluate \p Pred on all instructions with an opcode
2329 /// present in \p Opcode and return true if \p Pred holds on all of them.
2331 const Function *Fn,
2332 const AbstractAttribute *QueryingAA,
2333 ArrayRef<unsigned> Opcodes,
2334 bool &UsedAssumedInformation,
2335 bool CheckBBLivenessOnly = false,
2336 bool CheckPotentiallyDead = false);
2337
2338 /// Check \p Pred on all instructions with an opcode present in \p Opcodes.
2339 ///
2340 /// This method will evaluate \p Pred on all instructions with an opcode
2341 /// present in \p Opcode and return true if \p Pred holds on all of them.
2343 const AbstractAttribute &QueryingAA,
2344 ArrayRef<unsigned> Opcodes,
2345 bool &UsedAssumedInformation,
2346 bool CheckBBLivenessOnly = false,
2347 bool CheckPotentiallyDead = false);
2348
2349 /// Check \p Pred on all call-like instructions (=CallBased derived).
2350 ///
2351 /// See checkForAllCallLikeInstructions(...) for more information.
2353 const AbstractAttribute &QueryingAA,
2354 bool &UsedAssumedInformation,
2355 bool CheckBBLivenessOnly = false,
2356 bool CheckPotentiallyDead = false) {
2358 Pred, QueryingAA,
2359 {(unsigned)Instruction::Invoke, (unsigned)Instruction::CallBr,
2360 (unsigned)Instruction::Call},
2361 UsedAssumedInformation, CheckBBLivenessOnly, CheckPotentiallyDead);
2362 }
2363
2364 /// Check \p Pred on all Read/Write instructions.
2365 ///
2366 /// This method will evaluate \p Pred on all instructions that read or write
2367 /// to memory present in the information cache and return true if \p Pred
2368 /// holds on all of them.
2369 LLVM_ABI bool
2371 AbstractAttribute &QueryingAA,
2372 bool &UsedAssumedInformation);
2373
2374 /// Create a shallow wrapper for \p F such that \p F has internal linkage
2375 /// afterwards. It also sets the original \p F 's name to anonymous
2376 ///
2377 /// A wrapper is a function with the same type (and attributes) as \p F
2378 /// that will only call \p F and return the result, if any.
2379 ///
2380 /// Assuming the declaration of looks like:
2381 /// rty F(aty0 arg0, ..., atyN argN);
2382 ///
2383 /// The wrapper will then look as follows:
2384 /// rty wrapper(aty0 arg0, ..., atyN argN) {
2385 /// return F(arg0, ..., argN);
2386 /// }
2387 ///
2389
2390 /// Returns true if the function \p F can be internalized. i.e. it has a
2391 /// compatible linkage.
2392 LLVM_ABI static bool isInternalizable(Function &F);
2393
2394 /// Make another copy of the function \p F such that the copied version has
2395 /// internal linkage afterwards and can be analysed. Then we replace all uses
2396 /// of the original function to the copied one
2397 ///
2398 /// Only non-locally linked functions that have `linkonce_odr` or `weak_odr`
2399 /// linkage can be internalized because these linkages guarantee that other
2400 /// definitions with the same name have the same semantics as this one.
2401 ///
2402 /// This will only be run if the `attributor-allow-deep-wrappers` option is
2403 /// set, or if the function is called with \p Force set to true.
2404 ///
2405 /// If the function \p F failed to be internalized the return value will be a
2406 /// null pointer.
2408 bool Force = false);
2409
2410 /// Make copies of each function in the set \p FnSet such that the copied
2411 /// version has internal linkage afterwards and can be analysed. Then we
2412 /// replace all uses of the original function to the copied one. The map
2413 /// \p FnMap contains a mapping of functions to their internalized versions.
2414 ///
2415 /// Only non-locally linked functions that have `linkonce_odr` or `weak_odr`
2416 /// linkage can be internalized because these linkages guarantee that other
2417 /// definitions with the same name have the same semantics as this one.
2418 ///
2419 /// This version will internalize all the functions in the set \p FnSet at
2420 /// once and then replace the uses. This prevents internalized functions being
2421 /// called by external functions when there is an internalized version in the
2422 /// module.
2423 LLVM_ABI static bool
2426
2427 /// Return the data layout associated with the anchor scope.
2428 const DataLayout &getDataLayout() const { return InfoCache.getDL(); }
2429
2430 /// The allocator used to allocate memory, e.g. for `AbstractAttribute`s.
2432
2434 return CGModifiedFunctions;
2435 }
2436
2437private:
2438 /// This method will do fixpoint iteration until fixpoint or the
2439 /// maximum iteration count is reached.
2440 ///
2441 /// If the maximum iteration count is reached, This method will
2442 /// indicate pessimistic fixpoint on attributes that transitively depend
2443 /// on attributes that were scheduled for an update.
2444 void runTillFixpoint();
2445
2446 /// Gets called after scheduling, manifests attributes to the LLVM IR.
2447 ChangeStatus manifestAttributes();
2448
2449 /// Gets called after attributes have been manifested, cleans up the IR.
2450 /// Deletes dead functions, blocks and instructions.
2451 /// Rewrites function signitures and updates the call graph.
2452 ChangeStatus cleanupIR();
2453
2454 /// Identify internal functions that are effectively dead, thus not reachable
2455 /// from a live entry point. The functions are added to ToBeDeletedFunctions.
2456 void identifyDeadInternalFunctions();
2457
2458 /// Run `::update` on \p AA and track the dependences queried while doing so.
2459 /// Also adjust the state if we know further updates are not necessary.
2461
2462 /// Remember the dependences on the top of the dependence stack such that they
2463 /// may trigger further updates. (\see DependenceStack)
2464 void rememberDependences();
2465
2466 /// Determine if CallBase context in \p IRP should be propagated.
2467 LLVM_ABI bool shouldPropagateCallBaseContext(const IRPosition &IRP);
2468
2469 /// Apply all requested function signature rewrites
2470 /// (\see registerFunctionSignatureRewrite) and return Changed if the module
2471 /// was altered.
2473 rewriteFunctionSignatures(SmallSetVector<Function *, 8> &ModifiedFns);
2474
2475 /// Check if the Attribute \p AA should be seeded.
2476 /// See getOrCreateAAFor.
2477 LLVM_ABI bool shouldSeedAttribute(AbstractAttribute &AA);
2478
2479 /// A nested map to lookup abstract attributes based on the argument position
2480 /// on the outer level, and the addresses of the static member (AAType::ID) on
2481 /// the inner level.
2482 ///{
2483 using AAMapKeyTy = std::pair<const char *, IRPosition>;
2485 ///}
2486
2487 /// Map to remember all requested signature changes (= argument replacements).
2488 /// A MapVector so the functions are rewritten in a deterministic order.
2491 ArgumentReplacementMap;
2492
2493 /// The set of functions we are deriving attributes for.
2494 SetVector<Function *> &Functions;
2495
2496 /// The information cache that holds pre-processed (LLVM-IR) information.
2497 InformationCache &InfoCache;
2498
2499 /// Abstract Attribute dependency graph
2500 AADepGraph DG;
2501
2502 /// Set of functions for which we modified the content such that it might
2503 /// impact the call graph.
2504 SmallSetVector<Function *, 8> CGModifiedFunctions;
2505
2506 /// Information about a dependence. If FromAA is changed ToAA needs to be
2507 /// updated as well.
2508 struct DepInfo {
2509 const AbstractAttribute *FromAA;
2510 const AbstractAttribute *ToAA;
2511 DepClassTy DepClass;
2512 };
2513
2514 /// The dependence stack is used to track dependences during an
2515 /// `AbstractAttribute::update` call. As `AbstractAttribute::update` can be
2516 /// recursive we might have multiple vectors of dependences in here. The stack
2517 /// size, should be adjusted according to the expected recursion depth and the
2518 /// inner dependence vector size to the expected number of dependences per
2519 /// abstract attribute. Since the inner vectors are actually allocated on the
2520 /// stack we can be generous with their size.
2521 using DependenceVector = SmallVector<DepInfo, 8>;
2523
2524 /// A set to remember the functions we already assume to be live and visited.
2525 DenseSet<const Function *> VisitedFunctions;
2526
2527 /// Uses we replace with a new value after manifest is done. We will remove
2528 /// then trivially dead instructions as well.
2529 SmallMapVector<Use *, Value *, 32> ToBeChangedUses;
2530
2531 /// Values we replace with a new value after manifest is done. We will remove
2532 /// then trivially dead instructions as well.
2533 SmallMapVector<Value *, PointerIntPair<Value *, 1, bool>, 32>
2534 ToBeChangedValues;
2535
2536 /// Instructions we replace with `unreachable` insts after manifest is done.
2537 SmallSetVector<WeakVH, 16> ToBeChangedToUnreachableInsts;
2538
2539 /// Invoke instructions with at least a single dead successor block.
2540 SmallSetVector<WeakVH, 16> InvokeWithDeadSuccessor;
2541
2542 /// A flag that indicates which stage of the process we are in. Initially, the
2543 /// phase is SEEDING. Phase is changed in `Attributor::run()`
2544 enum class AttributorPhase {
2545 SEEDING,
2546 UPDATE,
2547 MANIFEST,
2548 CLEANUP,
2549 } Phase = AttributorPhase::SEEDING;
2550
2551 /// The current initialization chain length. Tracked to avoid stack overflows.
2552 unsigned InitializationChainLength = 0;
2553
2554 /// Functions, blocks, and instructions we delete after manifest is done.
2555 ///
2556 ///{
2557 SmallPtrSet<BasicBlock *, 8> ManifestAddedBlocks;
2558 SmallSetVector<Function *, 8> ToBeDeletedFunctions;
2559 SmallSetVector<BasicBlock *, 8> ToBeDeletedBlocks;
2560 SmallSetVector<WeakVH, 8> ToBeDeletedInsts;
2561 ///}
2562
2563 /// Container with all the query AAs that requested an update via
2564 /// registerForUpdate.
2565 SmallSetVector<AbstractAttribute *, 16> QueryAAsAwaitingUpdate;
2566
2567 /// User provided configuration for this Attributor instance.
2568 const AttributorConfig Configuration;
2569
2570 friend AADepGraph;
2571 friend AttributorCallGraph;
2572};
2573
2574/// An interface to query the internal state of an abstract attribute.
2575///
2576/// The abstract state is a minimal interface that allows the Attributor to
2577/// communicate with the abstract attributes about their internal state without
2578/// enforcing or exposing implementation details, e.g., the (existence of an)
2579/// underlying lattice.
2580///
2581/// It is sufficient to be able to query if a state is (1) valid or invalid, (2)
2582/// at a fixpoint, and to indicate to the state that (3) an optimistic fixpoint
2583/// was reached or (4) a pessimistic fixpoint was enforced.
2584///
2585/// All methods need to be implemented by the subclass. For the common use case,
2586/// a single boolean state or a bit-encoded state, the BooleanState and
2587/// {Inc,Dec,Bit}IntegerState classes are already provided. An abstract
2588/// attribute can inherit from them to get the abstract state interface and
2589/// additional methods to directly modify the state based if needed. See the
2590/// class comments for help.
2592 virtual ~AbstractState() = default;
2593
2594 /// Return if this abstract state is in a valid state. If false, no
2595 /// information provided should be used.
2596 virtual bool isValidState() const = 0;
2597
2598 /// Return if this abstract state is fixed, thus does not need to be updated
2599 /// if information changes as it cannot change itself.
2600 virtual bool isAtFixpoint() const = 0;
2601
2602 /// Indicate that the abstract state should converge to the optimistic state.
2603 ///
2604 /// This will usually make the optimistically assumed state the known to be
2605 /// true state.
2606 ///
2607 /// \returns ChangeStatus::UNCHANGED as the assumed value should not change.
2609
2610 /// Indicate that the abstract state should converge to the pessimistic state.
2611 ///
2612 /// This will usually revert the optimistically assumed state to the known to
2613 /// be true state.
2614 ///
2615 /// \returns ChangeStatus::CHANGED as the assumed value may change.
2617};
2618
2619/// Simple state with integers encoding.
2620///
2621/// The interface ensures that the assumed bits are always a subset of the known
2622/// bits. Users can only add known bits and, except through adding known bits,
2623/// they can only remove assumed bits. This should guarantee monotonicity and
2624/// thereby the existence of a fixpoint (if used correctly). The fixpoint is
2625/// reached when the assumed and known state/bits are equal. Users can
2626/// force/inidicate a fixpoint. If an optimistic one is indicated, the known
2627/// state will catch up with the assumed one, for a pessimistic fixpoint it is
2628/// the other way around.
2629template <typename base_ty, base_ty BestState, base_ty WorstState>
2631 using base_t = base_ty;
2632
2633 IntegerStateBase() = default;
2635
2636 /// Return the best possible representable state.
2637 static constexpr base_t getBestState() { return BestState; }
2638 static constexpr base_t getBestState(const IntegerStateBase &) {
2639 return getBestState();
2640 }
2641
2642 /// Return the worst possible representable state.
2643 static constexpr base_t getWorstState() { return WorstState; }
2644 static constexpr base_t getWorstState(const IntegerStateBase &) {
2645 return getWorstState();
2646 }
2647
2648 /// See AbstractState::isValidState()
2649 /// NOTE: For now we simply pretend that the worst possible state is invalid.
2650 bool isValidState() const override { return Assumed != getWorstState(); }
2651
2652 /// See AbstractState::isAtFixpoint()
2653 bool isAtFixpoint() const override { return Assumed == Known; }
2654
2655 /// See AbstractState::indicateOptimisticFixpoint(...)
2660
2661 /// See AbstractState::indicatePessimisticFixpoint(...)
2666
2667 /// Return the known state encoding
2668 base_t getKnown() const { return Known; }
2669
2670 /// Return the assumed state encoding.
2671 base_t getAssumed() const { return Assumed; }
2672
2673 /// Equality for IntegerStateBase.
2674 bool
2676 return this->getAssumed() == R.getAssumed() &&
2677 this->getKnown() == R.getKnown();
2678 }
2679
2680 /// Inequality for IntegerStateBase.
2681 bool
2683 return !(*this == R);
2684 }
2685
2686 /// "Clamp" this state with \p R. The result is subtype dependent but it is
2687 /// intended that only information assumed in both states will be assumed in
2688 /// this one afterwards.
2692
2693 /// "Clamp" this state with \p R. The result is subtype dependent but it is
2694 /// intended that information known in either state will be known in
2695 /// this one afterwards.
2699
2701 joinOR(R.getAssumed(), R.getKnown());
2702 }
2703
2705 joinAND(R.getAssumed(), R.getKnown());
2706 }
2707
2708protected:
2709 /// Handle a new assumed value \p Value. Subtype dependent.
2711
2712 /// Handle a new known value \p Value. Subtype dependent.
2714
2715 /// Handle a value \p Value. Subtype dependent.
2716 virtual void joinOR(base_t AssumedValue, base_t KnownValue) = 0;
2717
2718 /// Handle a new assumed value \p Value. Subtype dependent.
2719 virtual void joinAND(base_t AssumedValue, base_t KnownValue) = 0;
2720
2721 /// The known state encoding in an integer of type base_t.
2723
2724 /// The assumed state encoding in an integer of type base_t.
2726};
2727
2728/// Specialization of the integer state for a bit-wise encoding.
2729template <typename base_ty = uint32_t, base_ty BestState = ~base_ty(0),
2730 base_ty WorstState = 0>
2732 : public IntegerStateBase<base_ty, BestState, WorstState> {
2734 using base_t = base_ty;
2735 BitIntegerState() = default;
2737
2738 /// Return true if the bits set in \p BitsEncoding are "known bits".
2739 bool isKnown(base_t BitsEncoding = BestState) const {
2740 return (this->Known & BitsEncoding) == BitsEncoding;
2741 }
2742
2743 /// Return true if the bits set in \p BitsEncoding are "assumed bits".
2744 bool isAssumed(base_t BitsEncoding = BestState) const {
2745 return (this->Assumed & BitsEncoding) == BitsEncoding;
2746 }
2747
2748 /// Add the bits in \p BitsEncoding to the "known bits".
2750 // Make sure we never miss any "known bits".
2751 this->Assumed |= Bits;
2752 this->Known |= Bits;
2753 return *this;
2754 }
2755
2756 /// Remove the bits in \p BitsEncoding from the "assumed bits" if not known.
2758 return intersectAssumedBits(~BitsEncoding);
2759 }
2760
2761 /// Remove the bits in \p BitsEncoding from the "known bits".
2763 this->Known = (this->Known & ~BitsEncoding);
2764 return *this;
2765 }
2766
2767 /// Keep only "assumed bits" also set in \p BitsEncoding but all known ones.
2769 // Make sure we never lose any "known bits".
2770 this->Assumed = (this->Assumed & BitsEncoding) | this->Known;
2771 return *this;
2772 }
2773
2774private:
2775 void handleNewAssumedValue(base_t Value) override {
2777 }
2778 void handleNewKnownValue(base_t Value) override { addKnownBits(Value); }
2779 void joinOR(base_t AssumedValue, base_t KnownValue) override {
2780 this->Known |= KnownValue;
2781 this->Assumed |= AssumedValue;
2782 }
2783 void joinAND(base_t AssumedValue, base_t KnownValue) override {
2784 this->Known &= KnownValue;
2785 this->Assumed &= AssumedValue;
2786 }
2787};
2788
2789/// Specialization of the integer state for an increasing value, hence ~0u is
2790/// the best state and 0 the worst.
2791template <typename base_ty = uint32_t, base_ty BestState = ~base_ty(0),
2792 base_ty WorstState = 0>
2794 : public IntegerStateBase<base_ty, BestState, WorstState> {
2796 using base_t = base_ty;
2797
2800
2801 /// Return the best possible representable state.
2802 static constexpr base_t getBestState() { return BestState; }
2803 static constexpr base_t
2807
2808 /// Take minimum of assumed and \p Value.
2810 // Make sure we never lose "known value".
2811 this->Assumed = std::max(std::min(this->Assumed, Value), this->Known);
2812 return *this;
2813 }
2814
2815 /// Take maximum of known and \p Value.
2817 // Make sure we never lose "known value".
2818 this->Assumed = std::max(Value, this->Assumed);
2819 this->Known = std::max(Value, this->Known);
2820 return *this;
2821 }
2822
2823private:
2824 void handleNewAssumedValue(base_t Value) override {
2826 }
2827 void handleNewKnownValue(base_t Value) override { takeKnownMaximum(Value); }
2828 void joinOR(base_t AssumedValue, base_t KnownValue) override {
2829 this->Known = std::max(this->Known, KnownValue);
2830 this->Assumed = std::max(this->Assumed, AssumedValue);
2831 }
2832 void joinAND(base_t AssumedValue, base_t KnownValue) override {
2833 this->Known = std::min(this->Known, KnownValue);
2834 this->Assumed = std::min(this->Assumed, AssumedValue);
2835 }
2836};
2837
2838/// Specialization of the integer state for a decreasing value, hence 0 is the
2839/// best state and ~0u the worst.
2840template <typename base_ty = uint32_t>
2841struct DecIntegerState : public IntegerStateBase<base_ty, 0, ~base_ty(0)> {
2842 using base_t = base_ty;
2843
2844 /// Take maximum of assumed and \p Value.
2846 // Make sure we never lose "known value".
2847 this->Assumed = std::min(std::max(this->Assumed, Value), this->Known);
2848 return *this;
2849 }
2850
2851 /// Take minimum of known and \p Value.
2853 // Make sure we never lose "known value".
2854 this->Assumed = std::min(Value, this->Assumed);
2855 this->Known = std::min(Value, this->Known);
2856 return *this;
2857 }
2858
2859private:
2860 void handleNewAssumedValue(base_t Value) override {
2862 }
2863 void handleNewKnownValue(base_t Value) override { takeKnownMinimum(Value); }
2864 void joinOR(base_t AssumedValue, base_t KnownValue) override {
2865 this->Assumed = std::min(this->Assumed, KnownValue);
2866 this->Assumed = std::min(this->Assumed, AssumedValue);
2867 }
2868 void joinAND(base_t AssumedValue, base_t KnownValue) override {
2869 this->Assumed = std::max(this->Assumed, KnownValue);
2870 this->Assumed = std::max(this->Assumed, AssumedValue);
2871 }
2872};
2873
2874/// Simple wrapper for a single bit (boolean) state.
2875struct BooleanState : public IntegerStateBase<bool, true, false> {
2878
2879 BooleanState() = default;
2881
2882 /// Set the known and asssumed value to \p Value.
2883 void setKnown(bool Value) {
2884 Known |= Value;
2885 Assumed |= Value;
2886 }
2887
2888 /// Return true if the state is assumed to hold.
2889 bool isAssumed() const { return getAssumed(); }
2890
2891 /// Return true if the state is known to hold.
2892 bool isKnown() const { return getKnown(); }
2893
2894private:
2895 void handleNewAssumedValue(base_t Value) override {
2896 if (!Value)
2897 Assumed = Known;
2898 }
2899 void handleNewKnownValue(base_t Value) override {
2900 if (Value)
2901 Known = (Assumed = Value);
2902 }
2903 void joinOR(base_t AssumedValue, base_t KnownValue) override {
2904 Known |= KnownValue;
2905 Assumed |= AssumedValue;
2906 }
2907 void joinAND(base_t AssumedValue, base_t KnownValue) override {
2908 Known &= KnownValue;
2909 Assumed &= AssumedValue;
2910 }
2911};
2912
2913/// State for an integer range.
2915
2916 /// Bitwidth of the associated value.
2918
2919 /// State representing assumed range, initially set to empty.
2921
2922 /// State representing known range, initially set to [-inf, inf].
2924
2928
2932
2933 /// Return the worst possible representable state.
2935 return ConstantRange::getFull(BitWidth);
2936 }
2937
2938 /// Return the best possible representable state.
2940 return ConstantRange::getEmpty(BitWidth);
2941 }
2943 return getBestState(IRS.getBitWidth());
2944 }
2945
2946 /// Return associated values' bit width.
2947 uint32_t getBitWidth() const { return BitWidth; }
2948
2949 /// See AbstractState::isValidState()
2950 bool isValidState() const override {
2951 return BitWidth > 0 && !Assumed.isFullSet();
2952 }
2953
2954 /// See AbstractState::isAtFixpoint()
2955 bool isAtFixpoint() const override { return Assumed == Known; }
2956
2957 /// See AbstractState::indicateOptimisticFixpoint(...)
2962
2963 /// See AbstractState::indicatePessimisticFixpoint(...)
2968
2969 /// Return the known state encoding
2970 ConstantRange getKnown() const { return Known; }
2971
2972 /// Return the assumed state encoding.
2974
2975 /// Unite assumed range with the passed state.
2977 // Don't lose a known range.
2978 Assumed = Assumed.unionWith(R).intersectWith(Known);
2979 }
2980
2981 /// See IntegerRangeState::unionAssumed(..).
2983 unionAssumed(R.getAssumed());
2984 }
2985
2986 /// Intersect known range with the passed state.
2988 Assumed = Assumed.intersectWith(R);
2989 Known = Known.intersectWith(R);
2990 }
2991
2992 /// See IntegerRangeState::intersectKnown(..).
2994 intersectKnown(R.getKnown());
2995 }
2996
2997 /// Equality for IntegerRangeState.
2998 bool operator==(const IntegerRangeState &R) const {
2999 return getAssumed() == R.getAssumed() && getKnown() == R.getKnown();
3000 }
3001
3002 /// "Clamp" this state with \p R. The result is subtype dependent but it is
3003 /// intended that only information assumed in both states will be assumed in
3004 /// this one afterwards.
3006 // NOTE: `^=` operator seems like `intersect` but in this case, we need to
3007 // take `union`.
3008 unionAssumed(R);
3009 return *this;
3010 }
3011
3013 // NOTE: `&=` operator seems like `intersect` but in this case, we need to
3014 // take `union`.
3015 Known = Known.unionWith(R.getKnown());
3016 Assumed = Assumed.unionWith(R.getAssumed());
3017 return *this;
3018 }
3019};
3020
3021/// Simple state for a set.
3022///
3023/// This represents a state containing a set of values. The interface supports
3024/// modelling sets that contain all possible elements. The state's internal
3025/// value is modified using union or intersection operations.
3026template <typename BaseTy> struct SetState : public AbstractState {
3027 /// A wrapper around a set that has semantics for handling unions and
3028 /// intersections with a "universal" set that contains all elements.
3030 /// Creates a universal set with no concrete elements or an empty set.
3031 SetContents(bool Universal) : Universal(Universal) {}
3032
3033 /// Creates a non-universal set with concrete values.
3034 SetContents(const DenseSet<BaseTy> &Assumptions)
3035 : Universal(false), Set(Assumptions) {}
3036
3037 SetContents(bool Universal, const DenseSet<BaseTy> &Assumptions)
3038 : Universal(Universal), Set(Assumptions) {}
3039
3040 const DenseSet<BaseTy> &getSet() const { return Set; }
3041
3042 bool isUniversal() const { return Universal; }
3043
3044 bool empty() const { return Set.empty() && !Universal; }
3045
3046 /// Finds A := A ^ B where A or B could be the "Universal" set which
3047 /// contains every possible attribute. Returns true if changes were made.
3049 bool IsUniversal = Universal;
3050 unsigned Size = Set.size();
3051
3052 // A := A ^ U = A
3053 if (RHS.isUniversal())
3054 return false;
3055
3056 // A := U ^ B = B
3057 if (Universal)
3058 Set = RHS.getSet();
3059 else
3060 set_intersect(Set, RHS.getSet());
3061
3062 Universal &= RHS.isUniversal();
3063 return IsUniversal != Universal || Size != Set.size();
3064 }
3065
3066 /// Finds A := A u B where A or B could be the "Universal" set which
3067 /// contains every possible attribute. returns true if changes were made.
3068 bool getUnion(const SetContents &RHS) {
3069 bool IsUniversal = Universal;
3070 unsigned Size = Set.size();
3071
3072 // A := A u U = U = U u B
3073 if (!RHS.isUniversal() && !Universal)
3074 set_union(Set, RHS.getSet());
3075
3076 Universal |= RHS.isUniversal();
3077 return IsUniversal != Universal || Size != Set.size();
3078 }
3079
3080 private:
3081 /// Indicates if this set is "universal", containing every possible element.
3082 bool Universal;
3083
3084 /// The set of currently active assumptions.
3085 DenseSet<BaseTy> Set;
3086 };
3087
3088 SetState() : Known(false), Assumed(true), IsAtFixedpoint(false) {}
3089
3090 /// Initializes the known state with an initial set and initializes the
3091 /// assumed state as universal.
3093 : Known(Known), Assumed(true), IsAtFixedpoint(false) {}
3094
3095 /// See AbstractState::isValidState()
3096 bool isValidState() const override { return !Assumed.empty(); }
3097
3098 /// See AbstractState::isAtFixpoint()
3099 bool isAtFixpoint() const override { return IsAtFixedpoint; }
3100
3101 /// See AbstractState::indicateOptimisticFixpoint(...)
3103 IsAtFixedpoint = true;
3104 Known = Assumed;
3106 }
3107
3108 /// See AbstractState::indicatePessimisticFixpoint(...)
3110 IsAtFixedpoint = true;
3111 Assumed = Known;
3112 return ChangeStatus::CHANGED;
3113 }
3114
3115 /// Return the known state encoding.
3116 const SetContents &getKnown() const { return Known; }
3117
3118 /// Return the assumed state encoding.
3119 const SetContents &getAssumed() const { return Assumed; }
3120
3121 /// Returns if the set state contains the element.
3122 bool setContains(const BaseTy &Elem) const {
3123 return Assumed.getSet().contains(Elem) || Known.getSet().contains(Elem);
3124 }
3125
3126 /// Performs the set intersection between this set and \p RHS. Returns true if
3127 /// changes were made.
3129 bool IsUniversal = Assumed.isUniversal();
3130 unsigned SizeBefore = Assumed.getSet().size();
3131
3132 // Get intersection and make sure that the known set is still a proper
3133 // subset of the assumed set. A := K u (A ^ R).
3134 Assumed.getIntersection(RHS);
3135 Assumed.getUnion(Known);
3136
3137 return SizeBefore != Assumed.getSet().size() ||
3138 IsUniversal != Assumed.isUniversal();
3139 }
3140
3141 /// Performs the set union between this set and \p RHS. Returns true if
3142 /// changes were made.
3143 bool getUnion(const SetContents &RHS) { return Assumed.getUnion(RHS); }
3144
3145private:
3146 /// The set of values known for this state.
3147 SetContents Known;
3148
3149 /// The set of assumed values for this state.
3150 SetContents Assumed;
3151
3152 bool IsAtFixedpoint;
3153};
3154
3155/// Helper to tie a abstract state implementation to an abstract attribute.
3156template <typename StateTy, typename BaseType, class... Ts>
3157struct StateWrapper : public BaseType, public StateTy {
3158 /// Provide static access to the type of the state.
3160
3161 StateWrapper(const IRPosition &IRP, Ts... Args)
3162 : BaseType(IRP), StateTy(Args...) {}
3163
3164 /// See AbstractAttribute::getState(...).
3165 StateType &getState() override { return *this; }
3166
3167 /// See AbstractAttribute::getState(...).
3168 const StateType &getState() const override { return *this; }
3169};
3170
3171/// Helper class that provides common functionality to manifest IR attributes.
3172template <Attribute::AttrKind AK, typename BaseType, typename AAType>
3173struct IRAttribute : public BaseType {
3174 IRAttribute(const IRPosition &IRP) : BaseType(IRP) {}
3175
3176 /// Most boolean IRAttribute AAs don't do anything non-trivial
3177 /// in their initializers while non-boolean ones often do. Subclasses can
3178 /// change this.
3180
3181 /// Compile time access to the IR attribute kind.
3183
3184 /// Return true if the IR attribute(s) associated with this AA are implied for
3185 /// an undef value.
3186 static bool isImpliedByUndef() { return true; }
3187
3188 /// Return true if the IR attribute(s) associated with this AA are implied for
3189 /// an poison value.
3190 static bool isImpliedByPoison() { return true; }
3191
3192 static bool isImpliedByIR(Attributor &A, const IRPosition &IRP,
3193 Attribute::AttrKind ImpliedAttributeKind = AK,
3194 bool IgnoreSubsumingPositions = false) {
3195 if (AAType::isImpliedByUndef() && isa<UndefValue>(IRP.getAssociatedValue()))
3196 return true;
3197 if (AAType::isImpliedByPoison() &&
3199 return true;
3200 return A.hasAttr(IRP, {ImpliedAttributeKind}, IgnoreSubsumingPositions,
3201 ImpliedAttributeKind);
3202 }
3203
3204 /// See AbstractAttribute::manifest(...).
3206 if (isa<UndefValue>(this->getIRPosition().getAssociatedValue()))
3208 SmallVector<Attribute, 4> DeducedAttrs;
3209 getDeducedAttributes(A, this->getAnchorValue().getContext(), DeducedAttrs);
3210 if (DeducedAttrs.empty())
3212 return A.manifestAttrs(this->getIRPosition(), DeducedAttrs);
3213 }
3214
3215 /// Return the kind that identifies the abstract attribute implementation.
3216 Attribute::AttrKind getAttrKind() const { return AK; }
3217
3218 /// Return the deduced attributes in \p Attrs.
3220 SmallVectorImpl<Attribute> &Attrs) const {
3221 Attrs.emplace_back(Attribute::get(Ctx, getAttrKind()));
3222 }
3223};
3224
3225/// Base struct for all "concrete attribute" deductions.
3226///
3227/// The abstract attribute is a minimal interface that allows the Attributor to
3228/// orchestrate the abstract/fixpoint analysis. The design allows to hide away
3229/// implementation choices made for the subclasses but also to structure their
3230/// implementation and simplify the use of other abstract attributes in-flight.
3231///
3232/// To allow easy creation of new attributes, most methods have default
3233/// implementations. The ones that do not are generally straight forward, except
3234/// `AbstractAttribute::updateImpl` which is the location of most reasoning
3235/// associated with the abstract attribute. The update is invoked by the
3236/// Attributor in case the situation used to justify the current optimistic
3237/// state might have changed. The Attributor determines this automatically
3238/// by monitoring the `Attributor::getAAFor` calls made by abstract attributes.
3239///
3240/// The `updateImpl` method should inspect the IR and other abstract attributes
3241/// in-flight to justify the best possible (=optimistic) state. The actual
3242/// implementation is, similar to the underlying abstract state encoding, not
3243/// exposed. In the most common case, the `updateImpl` will go through a list of
3244/// reasons why its optimistic state is valid given the current information. If
3245/// any combination of them holds and is sufficient to justify the current
3246/// optimistic state, the method shall return UNCHAGED. If not, the optimistic
3247/// state is adjusted to the situation and the method shall return CHANGED.
3248///
3249/// If the manifestation of the "concrete attribute" deduced by the subclass
3250/// differs from the "default" behavior, which is a (set of) LLVM-IR
3251/// attribute(s) for an argument, call site argument, function return value, or
3252/// function, the `AbstractAttribute::manifest` method should be overloaded.
3253///
3254/// NOTE: If the state obtained via getState() is INVALID, thus if
3255/// AbstractAttribute::getState().isValidState() returns false, no
3256/// information provided by the methods of this class should be used.
3257/// NOTE: The Attributor currently has certain limitations to what we can do.
3258/// As a general rule of thumb, "concrete" abstract attributes should *for
3259/// now* only perform "backward" information propagation. That means
3260/// optimistic information obtained through abstract attributes should
3261/// only be used at positions that precede the origin of the information
3262/// with regards to the program flow. More practically, information can
3263/// *now* be propagated from instructions to their enclosing function, but
3264/// *not* from call sites to the called function. The mechanisms to allow
3265/// both directions will be added in the future.
3266/// NOTE: The mechanics of adding a new "concrete" abstract attribute are
3267/// described in the file comment.
3270
3272
3273 /// Virtual destructor.
3274 ~AbstractAttribute() override = default;
3275
3276 /// Compile time access to the IR attribute kind.
3278
3279 /// This function is used to identify if an \p DGN is of type
3280 /// AbstractAttribute so that the dyn_cast and cast can use such information
3281 /// to cast an AADepGraphNode to an AbstractAttribute.
3282 ///
3283 /// We eagerly return true here because all AADepGraphNodes except for the
3284 /// Synthethis Node are of type AbstractAttribute
3285 static bool classof(const AADepGraphNode *DGN) { return true; }
3286
3287 /// Return false if this AA does anything non-trivial (hence not done by
3288 /// default) in its initializer.
3289 static bool hasTrivialInitializer() { return false; }
3290
3291 /// Return true if this AA requires a "callee" (or an associted function) for
3292 /// a call site positon. Default is optimistic to minimize AAs.
3293 static bool requiresCalleeForCallBase() { return false; }
3294
3295 /// Return true if this AA requires non-asm "callee" for a call site positon.
3296 static bool requiresNonAsmForCallBase() { return true; }
3297
3298 /// Return true if this AA requires all callees for an argument or function
3299 /// positon.
3300 static bool requiresCallersForArgOrFunction() { return false; }
3301
3302 /// Return false if an AA should not be created for \p IRP.
3304 return true;
3305 }
3306
3307 /// Return false if an AA should not be updated for \p IRP.
3309 Function *AssociatedFn = IRP.getAssociatedFunction();
3310 bool IsFnInterface = IRP.isFnInterfaceKind();
3311 assert((!IsFnInterface || AssociatedFn) &&
3312 "Function interface without a function?");
3313
3314 // TODO: Not all attributes require an exact definition. Find a way to
3315 // enable deduction for some but not all attributes in case the
3316 // definition might be changed at runtime, see also
3317 // http://lists.llvm.org/pipermail/llvm-dev/2018-February/121275.html.
3318 // TODO: We could always determine abstract attributes and if sufficient
3319 // information was found we could duplicate the functions that do not
3320 // have an exact definition.
3321 return !IsFnInterface || A.isFunctionIPOAmendable(*AssociatedFn);
3322 }
3323
3324 /// Initialize the state with the information in the Attributor \p A.
3325 ///
3326 /// This function is called by the Attributor once all abstract attributes
3327 /// have been identified. It can and shall be used for task like:
3328 /// - identify existing knowledge in the IR and use it for the "known state"
3329 /// - perform any work that is not going to change over time, e.g., determine
3330 /// a subset of the IR, or attributes in-flight, that have to be looked at
3331 /// in the `updateImpl` method.
3332 virtual void initialize(Attributor &A) {}
3333
3334 /// A query AA is always scheduled as long as we do updates because it does
3335 /// lazy computation that cannot be determined to be done from the outside.
3336 /// However, while query AAs will not be fixed if they do not have outstanding
3337 /// dependences, we will only schedule them like other AAs. If a query AA that
3338 /// received a new query it needs to request an update via
3339 /// `Attributor::requestUpdateForAA`.
3340 virtual bool isQueryAA() const { return false; }
3341
3342 /// Return the internal abstract state for inspection.
3343 virtual StateType &getState() = 0;
3344 virtual const StateType &getState() const = 0;
3345
3346 /// Return an IR position, see struct IRPosition.
3347 const IRPosition &getIRPosition() const { return *this; };
3348 IRPosition &getIRPosition() { return *this; };
3349
3350 /// Helper functions, for debug purposes only.
3351 ///{
3352 void print(raw_ostream &OS) const { print(nullptr, OS); }
3353 void print(Attributor *, raw_ostream &OS) const override;
3354 virtual void printWithDeps(raw_ostream &OS) const;
3355 void dump() const { this->print(dbgs()); }
3356
3357 /// This function should return the "summarized" assumed state as string.
3358 virtual const std::string getAsStr(Attributor *A) const = 0;
3359
3360 /// This function should return the name of the AbstractAttribute
3361 virtual StringRef getName() const = 0;
3362
3363 /// This function should return the address of the ID of the AbstractAttribute
3364 virtual const char *getIdAddr() const = 0;
3365 ///}
3366
3367 /// Allow the Attributor access to the protected methods.
3368 friend struct Attributor;
3369
3370protected:
3371 /// Hook for the Attributor to trigger an update of the internal state.
3372 ///
3373 /// If this attribute is already fixed, this method will return UNCHANGED,
3374 /// otherwise it delegates to `AbstractAttribute::updateImpl`.
3375 ///
3376 /// \Return CHANGED if the internal state changed, otherwise UNCHANGED.
3378
3379 /// Hook for the Attributor to trigger the manifestation of the information
3380 /// represented by the abstract attribute in the LLVM-IR.
3381 ///
3382 /// \Return CHANGED if the IR was altered, otherwise UNCHANGED.
3386
3387 /// Hook to enable custom statistic tracking, called after manifest that
3388 /// resulted in a change if statistics are enabled.
3389 ///
3390 /// We require subclasses to provide an implementation so we remember to
3391 /// add statistics for them.
3392 virtual void trackStatistics() const = 0;
3393
3394 /// The actual update/transfer function which has to be implemented by the
3395 /// derived classes.
3396 ///
3397 /// If it is called, the environment has changed and we have to determine if
3398 /// the current information is still valid or adjust it otherwise.
3399 ///
3400 /// \Return CHANGED if the internal state changed, otherwise UNCHANGED.
3402};
3403
3404/// Forward declarations of output streams for debug purposes.
3405///
3406///{
3412template <typename base_ty, base_ty BestState, base_ty WorstState>
3416 return OS << "(" << S.getKnown() << "-" << S.getAssumed() << ")"
3417 << static_cast<const AbstractState &>(S);
3418}
3419LLVM_ABI raw_ostream &operator<<(raw_ostream &OS,
3420 const IntegerRangeState &State);
3421///}
3422
3431
3432/// A more lightweight version of the Attributor which only runs attribute
3433/// inference but no simplifications.
3434struct AttributorLightPass : public OptionalPassInfoMixin<AttributorLightPass> {
3436};
3437
3438/// A more lightweight version of the Attributor which only runs attribute
3439/// inference but no simplifications.
3441 : public OptionalPassInfoMixin<AttributorLightCGSCCPass> {
3444 CGSCCUpdateResult &UR);
3445};
3446
3447/// Helper function to clamp a state \p S of type \p StateType with the
3448/// information in \p R and indicate/return if \p S did change (as-in update is
3449/// required to be run again).
3450template <typename StateType>
3451ChangeStatus clampStateAndIndicateChange(StateType &S, const StateType &R) {
3452 auto Assumed = S.getAssumed();
3453 S ^= R;
3454 return Assumed == S.getAssumed() ? ChangeStatus::UNCHANGED
3456}
3457
3458/// ----------------------------------------------------------------------------
3459/// Abstract Attribute Classes
3460/// ----------------------------------------------------------------------------
3461
3463 : public IRAttribute<Attribute::NoUnwind,
3464 StateWrapper<BooleanState, AbstractAttribute>,
3465 AANoUnwind> {
3467
3468 /// Returns true if nounwind is assumed.
3469 bool isAssumedNoUnwind() const { return getAssumed(); }
3470
3471 /// Returns true if nounwind is known.
3472 bool isKnownNoUnwind() const { return getKnown(); }
3473
3474 /// Create an abstract attribute view for the position \p IRP.
3476 Attributor &A);
3477
3478 /// See AbstractAttribute::getName()
3479 StringRef getName() const override { return "AANoUnwind"; }
3480
3481 /// See AbstractAttribute::getIdAddr()
3482 const char *getIdAddr() const override { return &ID; }
3483
3484 /// This function should return true if the type of the \p AA is AANoUnwind
3485 static bool classof(const AbstractAttribute *AA) {
3486 return (AA->getIdAddr() == &ID);
3487 }
3488
3489 /// Unique ID (due to the unique address)
3490 LLVM_ABI static const char ID;
3491};
3492
3494 : public IRAttribute<Attribute::NoSync,
3495 StateWrapper<BooleanState, AbstractAttribute>,
3496 AANoSync> {
3498
3499 static bool isImpliedByIR(Attributor &A, const IRPosition &IRP,
3500 Attribute::AttrKind ImpliedAttributeKind,
3501 bool IgnoreSubsumingPositions = false) {
3502 // Note: This is also run for non-IPO amendable functions.
3503 assert(ImpliedAttributeKind == Attribute::NoSync);
3504 if (A.hasAttr(IRP, {Attribute::NoSync}, IgnoreSubsumingPositions,
3505 Attribute::NoSync))
3506 return true;
3507
3508 // Check for readonly + non-convergent.
3509 // TODO: We should be able to use hasAttr for Attributes, not only
3510 // AttrKinds.
3512 if (!F || F->isConvergent())
3513 return false;
3514
3516 A.getAttrs(IRP, {Attribute::Memory}, Attrs, IgnoreSubsumingPositions);
3517
3519 for (const Attribute &Attr : Attrs)
3520 ME &= Attr.getMemoryEffects();
3521
3522 if (!ME.onlyReadsMemory())
3523 return false;
3524
3525 A.manifestAttrs(IRP, Attribute::get(F->getContext(), Attribute::NoSync));
3526 return true;
3527 }
3528
3529 /// See AbstractAttribute::isValidIRPositionForInit
3531 if (!IRP.isFunctionScope() &&
3533 return false;
3534 return IRAttribute::isValidIRPositionForInit(A, IRP);
3535 }
3536
3537 /// Returns true if "nosync" is assumed.
3538 bool isAssumedNoSync() const { return getAssumed(); }
3539
3540 /// Returns true if "nosync" is known.
3541 bool isKnownNoSync() const { return getKnown(); }
3542
3543 /// Helper function used to determine whether an instruction is non-relaxed
3544 /// atomic. In other words, if an atomic instruction does not have unordered
3545 /// or monotonic ordering
3546 LLVM_ABI static bool isNonRelaxedAtomic(const Instruction *I);
3547
3548 /// Helper function to determine if \p CB is an aligned (GPU) barrier. Aligned
3549 /// barriers have to be executed by all threads. The flag \p ExecutedAligned
3550 /// indicates if the call is executed by all threads in a (thread) block in an
3551 /// aligned way. If that is the case, non-aligned barriers are effectively
3552 /// aligned barriers.
3553 LLVM_ABI static bool isAlignedBarrier(const CallBase &CB,
3554 bool ExecutedAligned);
3555
3556 /// Create an abstract attribute view for the position \p IRP.
3558 Attributor &A);
3559
3560 /// See AbstractAttribute::getName()
3561 StringRef getName() const override { return "AANoSync"; }
3562
3563 /// See AbstractAttribute::getIdAddr()
3564 const char *getIdAddr() const override { return &ID; }
3565
3566 /// This function should return true if the type of the \p AA is AANoSync
3567 static bool classof(const AbstractAttribute *AA) {
3568 return (AA->getIdAddr() == &ID);
3569 }
3570
3571 /// Unique ID (due to the unique address)
3572 LLVM_ABI static const char ID;
3573};
3574
3575/// An abstract interface for all nonnull attributes.
3577 : public IRAttribute<Attribute::MustProgress,
3578 StateWrapper<BooleanState, AbstractAttribute>,
3579 AAMustProgress> {
3581
3582 static bool isImpliedByIR(Attributor &A, const IRPosition &IRP,
3583 Attribute::AttrKind ImpliedAttributeKind,
3584 bool IgnoreSubsumingPositions = false) {
3585 // Note: This is also run for non-IPO amendable functions.
3586 assert(ImpliedAttributeKind == Attribute::MustProgress);
3587 return A.hasAttr(IRP, {Attribute::MustProgress, Attribute::WillReturn},
3588 IgnoreSubsumingPositions, Attribute::MustProgress);
3589 }
3590
3591 /// Return true if we assume that the underlying value is nonnull.
3592 bool isAssumedMustProgress() const { return getAssumed(); }
3593
3594 /// Return true if we know that underlying value is nonnull.
3595 bool isKnownMustProgress() const { return getKnown(); }
3596
3597 /// Create an abstract attribute view for the position \p IRP.
3599 Attributor &A);
3600
3601 /// See AbstractAttribute::getName()
3602 StringRef getName() const override { return "AAMustProgress"; }
3603
3604 /// See AbstractAttribute::getIdAddr()
3605 const char *getIdAddr() const override { return &ID; }
3606
3607 /// This function should return true if the type of the \p AA is
3608 /// AAMustProgress
3609 static bool classof(const AbstractAttribute *AA) {
3610 return (AA->getIdAddr() == &ID);
3611 }
3612
3613 /// Unique ID (due to the unique address)
3614 LLVM_ABI static const char ID;
3615};
3616
3617/// An abstract interface for all nonnull attributes.
3619 : public IRAttribute<Attribute::NonNull,
3620 StateWrapper<BooleanState, AbstractAttribute>,
3621 AANonNull> {
3623
3624 /// See AbstractAttribute::hasTrivialInitializer.
3625 static bool hasTrivialInitializer() { return false; }
3626
3627 /// See IRAttribute::isImpliedByUndef.
3628 /// Undef is not necessarily nonnull as nonnull + noundef would cause poison.
3629 /// Poison implies nonnull though.
3630 static bool isImpliedByUndef() { return false; }
3631
3632 /// See AbstractAttribute::isValidIRPositionForInit
3635 return false;
3636 return IRAttribute::isValidIRPositionForInit(A, IRP);
3637 }
3638
3639 /// See AbstractAttribute::isImpliedByIR(...).
3640 LLVM_ABI static bool isImpliedByIR(Attributor &A, const IRPosition &IRP,
3641 Attribute::AttrKind ImpliedAttributeKind,
3642 bool IgnoreSubsumingPositions = false);
3643
3644 /// Return true if we assume that the underlying value is nonnull.
3645 bool isAssumedNonNull() const { return getAssumed(); }
3646
3647 /// Return true if we know that underlying value is nonnull.
3648 bool isKnownNonNull() const { return getKnown(); }
3649
3650 /// Create an abstract attribute view for the position \p IRP.
3652 Attributor &A);
3653
3654 /// See AbstractAttribute::getName()
3655 StringRef getName() const override { return "AANonNull"; }
3656
3657 /// See AbstractAttribute::getIdAddr()
3658 const char *getIdAddr() const override { return &ID; }
3659
3660 /// This function should return true if the type of the \p AA is AANonNull
3661 static bool classof(const AbstractAttribute *AA) {
3662 return (AA->getIdAddr() == &ID);
3663 }
3664
3665 /// Unique ID (due to the unique address)
3666 LLVM_ABI static const char ID;
3667};
3668
3669/// An abstract attribute for norecurse.
3671 : public IRAttribute<Attribute::NoRecurse,
3672 StateWrapper<BooleanState, AbstractAttribute>,
3673 AANoRecurse> {
3675
3676 /// Return true if "norecurse" is assumed.
3677 bool isAssumedNoRecurse() const { return getAssumed(); }
3678
3679 /// Return true if "norecurse" is known.
3680 bool isKnownNoRecurse() const { return getKnown(); }
3681
3682 /// Create an abstract attribute view for the position \p IRP.
3684 Attributor &A);
3685
3686 /// See AbstractAttribute::getName()
3687 StringRef getName() const override { return "AANoRecurse"; }
3688
3689 /// See AbstractAttribute::getIdAddr()
3690 const char *getIdAddr() const override { return &ID; }
3691
3692 /// This function should return true if the type of the \p AA is AANoRecurse
3693 static bool classof(const AbstractAttribute *AA) {
3694 return (AA->getIdAddr() == &ID);
3695 }
3696
3697 /// Unique ID (due to the unique address)
3698 LLVM_ABI static const char ID;
3699};
3700
3701/// An abstract attribute for willreturn.
3703 : public IRAttribute<Attribute::WillReturn,
3704 StateWrapper<BooleanState, AbstractAttribute>,
3705 AAWillReturn> {
3707
3708 static bool isImpliedByIR(Attributor &A, const IRPosition &IRP,
3709 Attribute::AttrKind ImpliedAttributeKind,
3710 bool IgnoreSubsumingPositions = false) {
3711 // Note: This is also run for non-IPO amendable functions.
3712 assert(ImpliedAttributeKind == Attribute::WillReturn);
3713 if (IRAttribute::isImpliedByIR(A, IRP, ImpliedAttributeKind,
3714 IgnoreSubsumingPositions))
3715 return true;
3717 return false;
3718 A.manifestAttrs(IRP, Attribute::get(IRP.getAnchorValue().getContext(),
3719 Attribute::WillReturn));
3720 return true;
3721 }
3722
3723 /// Check for `mustprogress` and `readonly` as they imply `willreturn`.
3725 const IRPosition &IRP) {
3726 // Check for `mustprogress` in the scope and the associated function which
3727 // might be different if this is a call site.
3728 if (!A.hasAttr(IRP, {Attribute::MustProgress}))
3729 return false;
3730
3732 A.getAttrs(IRP, {Attribute::Memory}, Attrs,
3733 /* IgnoreSubsumingPositions */ false);
3734
3736 for (const Attribute &Attr : Attrs)
3737 ME &= Attr.getMemoryEffects();
3738 return ME.onlyReadsMemory();
3739 }
3740
3741 /// Return true if "willreturn" is assumed.
3742 bool isAssumedWillReturn() const { return getAssumed(); }
3743
3744 /// Return true if "willreturn" is known.
3745 bool isKnownWillReturn() const { return getKnown(); }
3746
3747 /// Create an abstract attribute view for the position \p IRP.
3749 Attributor &A);
3750
3751 /// See AbstractAttribute::getName()
3752 StringRef getName() const override { return "AAWillReturn"; }
3753
3754 /// See AbstractAttribute::getIdAddr()
3755 const char *getIdAddr() const override { return &ID; }
3756
3757 /// This function should return true if the type of the \p AA is AAWillReturn
3758 static bool classof(const AbstractAttribute *AA) {
3759 return (AA->getIdAddr() == &ID);
3760 }
3761
3762 /// Unique ID (due to the unique address)
3763 LLVM_ABI static const char ID;
3764};
3765
3766/// An abstract attribute for undefined behavior.
3768 : public StateWrapper<BooleanState, AbstractAttribute> {
3771
3772 /// Return true if "undefined behavior" is assumed for a specific instruction.
3773 virtual bool isAssumedToCauseUB(Instruction *I) const = 0;
3774
3775 /// Return true if "undefined behavior" is known for a specific instruction.
3776 virtual bool isKnownToCauseUB(Instruction *I) const = 0;
3777
3778 /// Create an abstract attribute view for the position \p IRP.
3780 Attributor &A);
3781
3782 /// See AbstractAttribute::getName()
3783 StringRef getName() const override { return "AAUndefinedBehavior"; }
3784
3785 /// See AbstractAttribute::getIdAddr()
3786 const char *getIdAddr() const override { return &ID; }
3787
3788 /// This function should return true if the type of the \p AA is
3789 /// AAUndefineBehavior
3790 static bool classof(const AbstractAttribute *AA) {
3791 return (AA->getIdAddr() == &ID);
3792 }
3793
3794 /// Unique ID (due to the unique address)
3795 LLVM_ABI static const char ID;
3796};
3797
3798/// An abstract interface to determine reachability of point A to B.
3800 : public StateWrapper<BooleanState, AbstractAttribute> {
3803
3804 /// Returns true if 'From' instruction is assumed to reach, 'To' instruction.
3805 /// Users should provide two positions they are interested in, and the class
3806 /// determines (and caches) reachability.
3808 Attributor &A, const Instruction &From, const Instruction &To,
3809 const AA::InstExclusionSetTy *ExclusionSet = nullptr) const = 0;
3810
3811 /// Create an abstract attribute view for the position \p IRP.
3814
3815 /// See AbstractAttribute::getName()
3816 StringRef getName() const override { return "AAIntraFnReachability"; }
3817
3818 /// See AbstractAttribute::getIdAddr()
3819 const char *getIdAddr() const override { return &ID; }
3820
3821 /// This function should return true if the type of the \p AA is
3822 /// AAIntraFnReachability
3823 static bool classof(const AbstractAttribute *AA) {
3824 return (AA->getIdAddr() == &ID);
3825 }
3826
3827 /// Unique ID (due to the unique address)
3828 LLVM_ABI static const char ID;
3829};
3830
3831/// An abstract interface for all noalias attributes.
3833 : public IRAttribute<Attribute::NoAlias,
3834 StateWrapper<BooleanState, AbstractAttribute>,
3835 AANoAlias> {
3837
3838 /// See AbstractAttribute::isValidIRPositionForInit
3840 if (!IRP.getAssociatedType()->isPointerTy())
3841 return false;
3842 return IRAttribute::isValidIRPositionForInit(A, IRP);
3843 }
3844
3845 /// See IRAttribute::isImpliedByIR
3846 LLVM_ABI static bool isImpliedByIR(Attributor &A, const IRPosition &IRP,
3847 Attribute::AttrKind ImpliedAttributeKind,
3848 bool IgnoreSubsumingPositions = false);
3849
3850 /// See AbstractAttribute::requiresCallersForArgOrFunction
3851 static bool requiresCallersForArgOrFunction() { return true; }
3852
3853 /// Return true if we assume that the underlying value is alias.
3854 bool isAssumedNoAlias() const { return getAssumed(); }
3855
3856 /// Return true if we know that underlying value is noalias.
3857 bool isKnownNoAlias() const { return getKnown(); }
3858
3859 /// Create an abstract attribute view for the position \p IRP.
3861 Attributor &A);
3862
3863 /// See AbstractAttribute::getName()
3864 StringRef getName() const override { return "AANoAlias"; }
3865
3866 /// See AbstractAttribute::getIdAddr()
3867 const char *getIdAddr() const override { return &ID; }
3868
3869 /// This function should return true if the type of the \p AA is AANoAlias
3870 static bool classof(const AbstractAttribute *AA) {
3871 return (AA->getIdAddr() == &ID);
3872 }
3873
3874 /// Unique ID (due to the unique address)
3875 LLVM_ABI static const char ID;
3876};
3877
3878/// An AbstractAttribute for nofree.
3880 : public IRAttribute<Attribute::NoFree,
3881 StateWrapper<BooleanState, AbstractAttribute>,
3882 AANoFree> {
3884
3885 /// See IRAttribute::isImpliedByIR
3886 static bool isImpliedByIR(Attributor &A, const IRPosition &IRP,
3887 Attribute::AttrKind ImpliedAttributeKind,
3888 bool IgnoreSubsumingPositions = false) {
3889 // Note: This is also run for non-IPO amendable functions.
3890 assert(ImpliedAttributeKind == Attribute::NoFree);
3891 return A.hasAttr(
3892 IRP, {Attribute::ReadNone, Attribute::ReadOnly, Attribute::NoFree},
3893 IgnoreSubsumingPositions, Attribute::NoFree);
3894 }
3895
3896 /// See AbstractAttribute::isValidIRPositionForInit
3898 if (!IRP.isFunctionScope() &&
3900 return false;
3901 return IRAttribute::isValidIRPositionForInit(A, IRP);
3902 }
3903
3904 /// Return true if "nofree" is assumed.
3905 bool isAssumedNoFree() const { return getAssumed(); }
3906
3907 /// Return true if "nofree" is known.
3908 bool isKnownNoFree() const { return getKnown(); }
3909
3910 /// Create an abstract attribute view for the position \p IRP.
3912 Attributor &A);
3913
3914 /// See AbstractAttribute::getName()
3915 StringRef getName() const override { return "AANoFree"; }
3916
3917 /// See AbstractAttribute::getIdAddr()
3918 const char *getIdAddr() const override { return &ID; }
3919
3920 /// This function should return true if the type of the \p AA is AANoFree
3921 static bool classof(const AbstractAttribute *AA) {
3922 return (AA->getIdAddr() == &ID);
3923 }
3924
3925 /// Unique ID (due to the unique address)
3926 LLVM_ABI static const char ID;
3927};
3928
3929/// An AbstractAttribute for noreturn.
3931 : public IRAttribute<Attribute::NoReturn,
3932 StateWrapper<BooleanState, AbstractAttribute>,
3933 AANoReturn> {
3935
3936 /// Return true if the underlying object is assumed to never return.
3937 bool isAssumedNoReturn() const { return getAssumed(); }
3938
3939 /// Return true if the underlying object is known to never return.
3940 bool isKnownNoReturn() const { return getKnown(); }
3941
3942 /// Create an abstract attribute view for the position \p IRP.
3944 Attributor &A);
3945
3946 /// See AbstractAttribute::getName()
3947 StringRef getName() const override { return "AANoReturn"; }
3948
3949 /// See AbstractAttribute::getIdAddr()
3950 const char *getIdAddr() const override { return &ID; }
3951
3952 /// This function should return true if the type of the \p AA is AANoReturn
3953 static bool classof(const AbstractAttribute *AA) {
3954 return (AA->getIdAddr() == &ID);
3955 }
3956
3957 /// Unique ID (due to the unique address)
3958 LLVM_ABI static const char ID;
3959};
3960
3961/// An abstract interface for liveness abstract attribute.
3963 : public StateWrapper<BitIntegerState<uint8_t, 3, 0>, AbstractAttribute> {
3965 AAIsDead(const IRPosition &IRP, Attributor &A) : Base(IRP) {}
3966
3967 /// See AbstractAttribute::isValidIRPositionForInit
3970 return isa<Function>(IRP.getAnchorValue()) &&
3971 !cast<Function>(IRP.getAnchorValue()).isDeclaration();
3972 return true;
3973 }
3974
3975 /// State encoding bits. A set bit in the state means the property holds.
3976 enum {
3979
3981 };
3982 static_assert(IS_DEAD == getBestState(), "Unexpected BEST_STATE value");
3983
3984protected:
3985 /// The query functions are protected such that other attributes need to go
3986 /// through the Attributor interfaces: `Attributor::isAssumedDead(...)`
3987
3988 /// Returns true if the underlying value is assumed dead.
3989 virtual bool isAssumedDead() const = 0;
3990
3991 /// Returns true if the underlying value is known dead.
3992 virtual bool isKnownDead() const = 0;
3993
3994 /// Returns true if \p BB is known dead.
3995 virtual bool isKnownDead(const BasicBlock *BB) const = 0;
3996
3997 /// Returns true if \p I is assumed dead.
3998 virtual bool isAssumedDead(const Instruction *I) const = 0;
3999
4000 /// Returns true if \p I is known dead.
4001 virtual bool isKnownDead(const Instruction *I) const = 0;
4002
4003 /// Return true if the underlying value is a store that is known to be
4004 /// removable. This is different from dead stores as the removable store
4005 /// can have an effect on live values, especially loads, but that effect
4006 /// is propagated which allows us to remove the store in turn.
4007 virtual bool isRemovableStore() const { return false; }
4008
4009public:
4010 /// Create an abstract attribute view for the position \p IRP.
4012 Attributor &A);
4013
4014 /// Determine if \p F might catch asynchronous exceptions.
4016 return F.hasPersonalityFn() && !canSimplifyInvokeNoUnwind(&F);
4017 }
4018
4019 /// Returns true if \p BB is assumed dead.
4020 virtual bool isAssumedDead(const BasicBlock *BB) const = 0;
4021
4022 /// Return if the edge from \p From BB to \p To BB is assumed dead.
4023 /// This is specifically useful in AAReachability.
4024 virtual bool isEdgeDead(const BasicBlock *From, const BasicBlock *To) const {
4025 return false;
4026 }
4027
4028 /// See AbstractAttribute::getName()
4029 StringRef getName() const override { return "AAIsDead"; }
4030
4031 /// See AbstractAttribute::getIdAddr()
4032 const char *getIdAddr() const override { return &ID; }
4033
4034 /// This function should return true if the type of the \p AA is AAIsDead
4035 static bool classof(const AbstractAttribute *AA) {
4036 return (AA->getIdAddr() == &ID);
4037 }
4038
4039 /// Unique ID (due to the unique address)
4040 LLVM_ABI static const char ID;
4041
4042 friend struct Attributor;
4043};
4044
4045/// State for dereferenceable attribute
4047
4048 static DerefState getBestState() { return DerefState(); }
4049 static DerefState getBestState(const DerefState &) { return getBestState(); }
4050
4051 /// Return the worst possible representable state.
4053 DerefState DS;
4054 DS.indicatePessimisticFixpoint();
4055 return DS;
4056 }
4058 return getWorstState();
4059 }
4060
4061 /// State representing for dereferenceable bytes.
4063
4064 /// Map representing for accessed memory offsets and sizes.
4065 /// A key is Offset and a value is size.
4066 /// If there is a load/store instruction something like,
4067 /// p[offset] = v;
4068 /// (offset, sizeof(v)) will be inserted to this map.
4069 /// std::map is used because we want to iterate keys in ascending order.
4070 std::map<int64_t, uint64_t> AccessedBytesMap;
4071
4072 /// Helper function to calculate dereferenceable bytes from current known
4073 /// bytes and accessed bytes.
4074 ///
4075 /// int f(int *A){
4076 /// *A = 0;
4077 /// *(A+2) = 2;
4078 /// *(A+1) = 1;
4079 /// *(A+10) = 10;
4080 /// }
4081 /// ```
4082 /// In that case, AccessedBytesMap is `{0:4, 4:4, 8:4, 40:4}`.
4083 /// AccessedBytesMap is std::map so it is iterated in accending order on
4084 /// key(Offset). So KnownBytes will be updated like this:
4085 ///
4086 /// |Access | KnownBytes
4087 /// |(0, 4)| 0 -> 4
4088 /// |(4, 4)| 4 -> 8
4089 /// |(8, 4)| 8 -> 12
4090 /// |(40, 4) | 12 (break)
4091 void computeKnownDerefBytesFromAccessedMap() {
4092 int64_t KnownBytes = DerefBytesState.getKnown();
4093 for (auto &Access : AccessedBytesMap) {
4094 if (KnownBytes < Access.first)
4095 break;
4096 KnownBytes = std::max(KnownBytes, Access.first + (int64_t)Access.second);
4097 }
4098
4099 DerefBytesState.takeKnownMaximum(KnownBytes);
4100 }
4101
4102 /// State representing that whether the value is globaly dereferenceable.
4103 BooleanState GlobalState;
4104
4105 /// See AbstractState::isValidState()
4106 bool isValidState() const override { return DerefBytesState.isValidState(); }
4107
4108 /// See AbstractState::isAtFixpoint()
4109 bool isAtFixpoint() const override {
4110 return !isValidState() ||
4111 (DerefBytesState.isAtFixpoint() && GlobalState.isAtFixpoint());
4112 }
4113
4114 /// See AbstractState::indicateOptimisticFixpoint(...)
4116 DerefBytesState.indicateOptimisticFixpoint();
4117 GlobalState.indicateOptimisticFixpoint();
4119 }
4120
4121 /// See AbstractState::indicatePessimisticFixpoint(...)
4123 DerefBytesState.indicatePessimisticFixpoint();
4124 GlobalState.indicatePessimisticFixpoint();
4125 return ChangeStatus::CHANGED;
4126 }
4127
4128 /// Update known dereferenceable bytes.
4129 void takeKnownDerefBytesMaximum(uint64_t Bytes) {
4130 DerefBytesState.takeKnownMaximum(Bytes);
4131
4132 // Known bytes might increase.
4133 computeKnownDerefBytesFromAccessedMap();
4134 }
4135
4136 /// Update assumed dereferenceable bytes.
4137 void takeAssumedDerefBytesMinimum(uint64_t Bytes) {
4138 DerefBytesState.takeAssumedMinimum(Bytes);
4139 }
4140
4141 /// Add accessed bytes to the map.
4142 void addAccessedBytes(int64_t Offset, uint64_t Size) {
4143 uint64_t &AccessedBytes = AccessedBytesMap[Offset];
4144 AccessedBytes = std::max(AccessedBytes, Size);
4145
4146 // Known bytes might increase.
4147 computeKnownDerefBytesFromAccessedMap();
4148 }
4149
4150 /// Equality for DerefState.
4151 bool operator==(const DerefState &R) const {
4152 return this->DerefBytesState == R.DerefBytesState &&
4153 this->GlobalState == R.GlobalState;
4154 }
4155
4156 /// Inequality for DerefState.
4157 bool operator!=(const DerefState &R) const { return !(*this == R); }
4158
4159 /// See IntegerStateBase::operator^=
4160 DerefState operator^=(const DerefState &R) {
4161 DerefBytesState ^= R.DerefBytesState;
4162 GlobalState ^= R.GlobalState;
4163 return *this;
4164 }
4165
4166 /// See IntegerStateBase::operator+=
4167 DerefState operator+=(const DerefState &R) {
4168 DerefBytesState += R.DerefBytesState;
4169 GlobalState += R.GlobalState;
4170 return *this;
4171 }
4172
4173 /// See IntegerStateBase::operator&=
4174 DerefState operator&=(const DerefState &R) {
4175 DerefBytesState &= R.DerefBytesState;
4176 GlobalState &= R.GlobalState;
4177 return *this;
4178 }
4179
4180 /// See IntegerStateBase::operator|=
4181 DerefState operator|=(const DerefState &R) {
4182 DerefBytesState |= R.DerefBytesState;
4183 GlobalState |= R.GlobalState;
4184 return *this;
4185 }
4186};
4187
4188/// An abstract interface for all dereferenceable attribute.
4190 : public IRAttribute<Attribute::Dereferenceable,
4191 StateWrapper<DerefState, AbstractAttribute>,
4192 AADereferenceable> {
4194
4195 /// See AbstractAttribute::isValidIRPositionForInit
4197 if (!IRP.getAssociatedType()->isPointerTy())
4198 return false;
4199 return IRAttribute::isValidIRPositionForInit(A, IRP);
4200 }
4201
4202 /// Return true if we assume that underlying value is
4203 /// dereferenceable(_or_null) globally.
4204 bool isAssumedGlobal() const { return GlobalState.getAssumed(); }
4205
4206 /// Return true if we know that underlying value is
4207 /// dereferenceable(_or_null) globally.
4208 bool isKnownGlobal() const { return GlobalState.getKnown(); }
4209
4210 /// Return assumed dereferenceable bytes.
4212 return DerefBytesState.getAssumed();
4213 }
4214
4215 /// Return known dereferenceable bytes.
4217 return DerefBytesState.getKnown();
4218 }
4219
4220 /// Create an abstract attribute view for the position \p IRP.
4222 Attributor &A);
4223
4224 /// See AbstractAttribute::getName()
4225 StringRef getName() const override { return "AADereferenceable"; }
4226
4227 /// See AbstractAttribute::getIdAddr()
4228 const char *getIdAddr() const override { return &ID; }
4229
4230 /// This function should return true if the type of the \p AA is
4231 /// AADereferenceable
4232 static bool classof(const AbstractAttribute *AA) {
4233 return (AA->getIdAddr() == &ID);
4234 }
4235
4236 /// Unique ID (due to the unique address)
4237 LLVM_ABI static const char ID;
4238};
4239
4242/// An abstract interface for all align attributes.
4244 : public IRAttribute<Attribute::Alignment,
4245 StateWrapper<AAAlignmentStateType, AbstractAttribute>,
4246 AAAlign> {
4248
4249 /// See AbstractAttribute::isValidIRPositionForInit
4252 return false;
4253 return IRAttribute::isValidIRPositionForInit(A, IRP);
4254 }
4255
4256 /// Return assumed alignment.
4257 Align getAssumedAlign() const { return Align(getAssumed()); }
4258
4259 /// Return known alignment.
4260 Align getKnownAlign() const { return Align(getKnown()); }
4261
4262 /// See AbstractAttribute::getName()
4263 StringRef getName() const override { return "AAAlign"; }
4264
4265 /// See AbstractAttribute::getIdAddr()
4266 const char *getIdAddr() const override { return &ID; }
4267
4268 /// This function should return true if the type of the \p AA is AAAlign
4269 static bool classof(const AbstractAttribute *AA) {
4270 return (AA->getIdAddr() == &ID);
4271 }
4272
4273 /// Create an abstract attribute view for the position \p IRP.
4275 Attributor &A);
4276
4277 /// Unique ID (due to the unique address)
4278 LLVM_ABI static const char ID;
4279};
4280
4281/// An abstract interface to track if a value leaves it's defining function
4282/// instance.
4283/// TODO: We should make it a ternary AA tracking uniqueness, and uniqueness
4284/// wrt. the Attributor analysis separately.
4285struct AAInstanceInfo : public StateWrapper<BooleanState, AbstractAttribute> {
4288
4289 /// Return true if we assume that the underlying value is unique in its scope
4290 /// wrt. the Attributor analysis. That means it might not be unique but we can
4291 /// still use pointer equality without risking to represent two instances with
4292 /// one `llvm::Value`.
4293 bool isAssumedUniqueForAnalysis() const { return isAssumed(); }
4294
4295 /// Create an abstract attribute view for the position \p IRP.
4297 Attributor &A);
4298
4299 /// See AbstractAttribute::getName()
4300 StringRef getName() const override { return "AAInstanceInfo"; }
4301
4302 /// See AbstractAttribute::getIdAddr()
4303 const char *getIdAddr() const override { return &ID; }
4304
4305 /// This function should return true if the type of the \p AA is
4306 /// AAInstanceInfo
4307 static bool classof(const AbstractAttribute *AA) {
4308 return (AA->getIdAddr() == &ID);
4309 }
4310
4311 /// Unique ID (due to the unique address)
4312 LLVM_ABI static const char ID;
4313};
4314
4315/// An abstract interface for all nocapture attributes.
4317 : public IRAttribute<
4318 Attribute::Captures,
4319 StateWrapper<BitIntegerState<uint16_t, 7, 0>, AbstractAttribute>,
4320 AANoCapture> {
4322
4323 /// See IRAttribute::isImpliedByIR
4324 LLVM_ABI static bool isImpliedByIR(Attributor &A, const IRPosition &IRP,
4325 Attribute::AttrKind ImpliedAttributeKind,
4326 bool IgnoreSubsumingPositions = false);
4327
4328 /// Update \p State according to the capture capabilities of \p F for position
4329 /// \p IRP.
4330 LLVM_ABI static void
4332 BitIntegerState &State);
4333
4334 /// See AbstractAttribute::isValidIRPositionForInit
4336 if (!IRP.getAssociatedType()->isPointerTy())
4337 return false;
4338 return IRAttribute::isValidIRPositionForInit(A, IRP);
4339 }
4340
4341 /// State encoding bits. A set bit in the state means the property holds.
4342 /// NO_CAPTURE is the best possible state, 0 the worst possible state.
4343 enum {
4347
4348 /// If we do not capture the value in memory or through integers we can only
4349 /// communicate it back as a derived pointer.
4351
4352 /// If we do not capture the value in memory, through integers, or as a
4353 /// derived pointer we know it is not captured.
4356 };
4357
4358 /// Return true if we know that the underlying value is not captured in its
4359 /// respective scope.
4360 bool isKnownNoCapture() const { return isKnown(NO_CAPTURE); }
4361
4362 /// Return true if we assume that the underlying value is not captured in its
4363 /// respective scope.
4364 bool isAssumedNoCapture() const { return isAssumed(NO_CAPTURE); }
4365
4366 /// Return true if we know that the underlying value is not captured in its
4367 /// respective scope but we allow it to escape through a "return".
4371
4372 /// Return true if we assume that the underlying value is not captured in its
4373 /// respective scope but we allow it to escape through a "return".
4377
4378 /// Create an abstract attribute view for the position \p IRP.
4380 Attributor &A);
4381
4382 /// See AbstractAttribute::getName()
4383 StringRef getName() const override { return "AANoCapture"; }
4384
4385 /// See AbstractAttribute::getIdAddr()
4386 const char *getIdAddr() const override { return &ID; }
4387
4388 /// This function should return true if the type of the \p AA is AANoCapture
4389 static bool classof(const AbstractAttribute *AA) {
4390 return (AA->getIdAddr() == &ID);
4391 }
4392
4393 /// Unique ID (due to the unique address)
4394 LLVM_ABI static const char ID;
4395};
4396
4398
4400
4405 return getBestState(VS.Ty);
4406 }
4407
4408 /// Return the worst possible representable state.
4411 DS.indicatePessimisticFixpoint();
4412 return DS;
4413 }
4416 return getWorstState(VS.Ty);
4417 }
4418
4419 /// See AbstractState::isValidState(...)
4420 bool isValidState() const override { return BS.isValidState(); }
4421
4422 /// See AbstractState::isAtFixpoint(...)
4423 bool isAtFixpoint() const override { return BS.isAtFixpoint(); }
4424
4425 /// Return the assumed state encoding.
4427 const ValueSimplifyStateType &getAssumed() const { return *this; }
4428
4429 /// See AbstractState::indicatePessimisticFixpoint(...)
4431 return BS.indicatePessimisticFixpoint();
4432 }
4433
4434 /// See AbstractState::indicateOptimisticFixpoint(...)
4436 return BS.indicateOptimisticFixpoint();
4437 }
4438
4439 /// "Clamp" this state with \p PVS.
4441 BS ^= VS.BS;
4442 unionAssumed(VS.SimplifiedAssociatedValue);
4443 return *this;
4444 }
4445
4447 if (isValidState() != RHS.isValidState())
4448 return false;
4449 if (!isValidState() && !RHS.isValidState())
4450 return true;
4451 return SimplifiedAssociatedValue == RHS.SimplifiedAssociatedValue;
4452 }
4453
4454protected:
4455 /// The type of the original value.
4457
4458 /// Merge \p Other into the currently assumed simplified value
4459 LLVM_ABI bool unionAssumed(std::optional<Value *> Other);
4460
4461 /// Helper to track validity and fixpoint
4463
4464 /// An assumed simplified value. Initially, it is set to std::nullopt, which
4465 /// means that the value is not clear under current assumption. If in the
4466 /// pessimistic state, getAssumedSimplifiedValue doesn't return this value but
4467 /// returns orignal associated value.
4468 std::optional<Value *> SimplifiedAssociatedValue;
4469};
4470
4471/// An abstract interface for value simplify abstract attribute.
4473 : public StateWrapper<ValueSimplifyStateType, AbstractAttribute, Type *> {
4476 : Base(IRP, IRP.getAssociatedType()) {}
4477
4478 /// Create an abstract attribute view for the position \p IRP.
4480 Attributor &A);
4481
4482 /// See AbstractAttribute::getName()
4483 StringRef getName() const override { return "AAValueSimplify"; }
4484
4485 /// See AbstractAttribute::getIdAddr()
4486 const char *getIdAddr() const override { return &ID; }
4487
4488 /// This function should return true if the type of the \p AA is
4489 /// AAValueSimplify
4490 static bool classof(const AbstractAttribute *AA) {
4491 return (AA->getIdAddr() == &ID);
4492 }
4493
4494 /// Unique ID (due to the unique address)
4495 LLVM_ABI static const char ID;
4496
4497private:
4498 /// Return an assumed simplified value if a single candidate is found. If
4499 /// there cannot be one, return original value. If it is not clear yet, return
4500 /// std::nullopt.
4501 ///
4502 /// Use `Attributor::getAssumedSimplified` for value simplification.
4503 virtual std::optional<Value *>
4504 getAssumedSimplifiedValue(Attributor &A) const = 0;
4505
4506 friend struct Attributor;
4507};
4508
4509struct AAHeapToStack : public StateWrapper<BooleanState, AbstractAttribute> {
4511 AAHeapToStack(const IRPosition &IRP, Attributor &A) : Base(IRP) {}
4512
4513 /// Returns true if HeapToStack conversion is assumed to be possible.
4514 virtual bool isAssumedHeapToStack(const CallBase &CB) const = 0;
4515
4516 /// Returns true if HeapToStack conversion is assumed and the CB is a
4517 /// callsite to a free operation to be removed.
4518 virtual bool isAssumedHeapToStackRemovedFree(CallBase &CB) const = 0;
4519
4520 /// Create an abstract attribute view for the position \p IRP.
4522 Attributor &A);
4523
4524 /// See AbstractAttribute::getName()
4525 StringRef getName() const override { return "AAHeapToStack"; }
4526
4527 /// See AbstractAttribute::getIdAddr()
4528 const char *getIdAddr() const override { return &ID; }
4529
4530 /// This function should return true if the type of the \p AA is AAHeapToStack
4531 static bool classof(const AbstractAttribute *AA) {
4532 return (AA->getIdAddr() == &ID);
4533 }
4534
4535 /// Unique ID (due to the unique address)
4536 LLVM_ABI static const char ID;
4537};
4538
4539/// An abstract interface for privatizability.
4540///
4541/// A pointer is privatizable if it can be replaced by a new, private one.
4542/// Privatizing pointer reduces the use count, interaction between unrelated
4543/// code parts.
4544///
4545/// In order for a pointer to be privatizable its value cannot be observed
4546/// (=nocapture), it is (for now) not written (=readonly & noalias), we know
4547/// what values are necessary to make the private copy look like the original
4548/// one, and the values we need can be loaded (=dereferenceable).
4550 : public StateWrapper<BooleanState, AbstractAttribute> {
4553
4554 /// See AbstractAttribute::isValidIRPositionForInit
4557 return false;
4559 }
4560
4561 /// Returns true if pointer privatization is assumed to be possible.
4562 bool isAssumedPrivatizablePtr() const { return getAssumed(); }
4563
4564 /// See AbstractAttribute::requiresCallersForArgOrFunction
4565 static bool requiresCallersForArgOrFunction() { return true; }
4566
4567 /// Return the type we can choose for a private copy of the underlying
4568 /// value. std::nullopt means it is not clear yet, nullptr means there is
4569 /// none.
4570 virtual std::optional<Type *> getPrivatizableType() const = 0;
4571
4572 /// Create an abstract attribute view for the position \p IRP.
4574 Attributor &A);
4575
4576 /// See AbstractAttribute::getName()
4577 StringRef getName() const override { return "AAPrivatizablePtr"; }
4578
4579 /// See AbstractAttribute::getIdAddr()
4580 const char *getIdAddr() const override { return &ID; }
4581
4582 /// This function should return true if the type of the \p AA is
4583 /// AAPricatizablePtr
4584 static bool classof(const AbstractAttribute *AA) {
4585 return (AA->getIdAddr() == &ID);
4586 }
4587
4588 /// Unique ID (due to the unique address)
4589 LLVM_ABI static const char ID;
4590};
4591
4592/// An abstract interface for memory access kind related attributes
4593/// (readnone/readonly/writeonly).
4595 : public IRAttribute<
4596 Attribute::None,
4597 StateWrapper<BitIntegerState<uint8_t, 3>, AbstractAttribute>,
4598 AAMemoryBehavior> {
4600
4601 /// See AbstractAttribute::hasTrivialInitializer.
4602 static bool hasTrivialInitializer() { return false; }
4603
4604 /// See AbstractAttribute::isValidIRPositionForInit
4606 if (!IRP.isFunctionScope() && !IRP.getAssociatedType()->isPointerTy())
4607 return false;
4608 return IRAttribute::isValidIRPositionForInit(A, IRP);
4609 }
4610
4611 /// State encoding bits. A set bit in the state means the property holds.
4612 /// BEST_STATE is the best possible state, 0 the worst possible state.
4613 enum {
4614 NO_READS = 1 << 0,
4615 NO_WRITES = 1 << 1,
4617
4619 };
4620 static_assert(BEST_STATE == getBestState(), "Unexpected BEST_STATE value");
4621
4622 /// Return true if we know that the underlying value is not read or accessed
4623 /// in its respective scope.
4624 bool isKnownReadNone() const { return isKnown(NO_ACCESSES); }
4625
4626 /// Return true if we assume that the underlying value is not read or accessed
4627 /// in its respective scope.
4628 bool isAssumedReadNone() const { return isAssumed(NO_ACCESSES); }
4629
4630 /// Return true if we know that the underlying value is not accessed
4631 /// (=written) in its respective scope.
4632 bool isKnownReadOnly() const { return isKnown(NO_WRITES); }
4633
4634 /// Return true if we assume that the underlying value is not accessed
4635 /// (=written) in its respective scope.
4636 bool isAssumedReadOnly() const { return isAssumed(NO_WRITES); }
4637
4638 /// Return true if we know that the underlying value is not read in its
4639 /// respective scope.
4640 bool isKnownWriteOnly() const { return isKnown(NO_READS); }
4641
4642 /// Return true if we assume that the underlying value is not read in its
4643 /// respective scope.
4644 bool isAssumedWriteOnly() const { return isAssumed(NO_READS); }
4645
4646 /// Create an abstract attribute view for the position \p IRP.
4648 Attributor &A);
4649
4650 /// See AbstractAttribute::getName()
4651 StringRef getName() const override { return "AAMemoryBehavior"; }
4652
4653 /// See AbstractAttribute::getIdAddr()
4654 const char *getIdAddr() const override { return &ID; }
4655
4656 /// This function should return true if the type of the \p AA is
4657 /// AAMemoryBehavior
4658 static bool classof(const AbstractAttribute *AA) {
4659 return (AA->getIdAddr() == &ID);
4660 }
4661
4662 /// Unique ID (due to the unique address)
4663 LLVM_ABI static const char ID;
4664};
4665
4666/// An abstract interface for all memory location attributes
4667/// (readnone/argmemonly/inaccessiblememonly/inaccessibleorargmemonly).
4669 : public IRAttribute<
4670 Attribute::None,
4671 StateWrapper<BitIntegerState<uint32_t, 511>, AbstractAttribute>,
4672 AAMemoryLocation> {
4673 using MemoryLocationsKind = StateType::base_t;
4674
4676
4677 /// See AbstractAttribute::requiresCalleeForCallBase.
4678 static bool requiresCalleeForCallBase() { return true; }
4679
4680 /// See AbstractAttribute::hasTrivialInitializer.
4681 static bool hasTrivialInitializer() { return false; }
4682
4683 /// See AbstractAttribute::isValidIRPositionForInit
4685 if (!IRP.isFunctionScope() &&
4687 return false;
4688 return IRAttribute::isValidIRPositionForInit(A, IRP);
4689 }
4690
4691 /// Encoding of different locations that could be accessed by a memory
4692 /// access.
4693 enum {
4707
4708 // Helper bit to track if we gave up or not.
4710
4712 };
4713 static_assert(BEST_STATE == getBestState(), "Unexpected BEST_STATE value");
4714
4715 /// Return true if we know that the associated functions has no observable
4716 /// accesses.
4717 bool isKnownReadNone() const { return isKnown(NO_LOCATIONS); }
4718
4719 /// Return true if we assume that the associated functions has no observable
4720 /// accesses.
4721 bool isAssumedReadNone() const {
4723 }
4724
4725 /// Return true if we know that the associated functions has at most
4726 /// local/stack accesses.
4727 bool isKnowStackOnly() const {
4728 return isKnown(inverseLocation(NO_LOCAL_MEM, true, true));
4729 }
4730
4731 /// Return true if we assume that the associated functions has at most
4732 /// local/stack accesses.
4733 bool isAssumedStackOnly() const {
4734 return isAssumed(inverseLocation(NO_LOCAL_MEM, true, true));
4735 }
4736
4737 /// Return true if we know that the underlying value will only access
4738 /// inaccesible memory only (see Attribute::InaccessibleMemOnly).
4740 return isKnown(inverseLocation(NO_INACCESSIBLE_MEM, true, true));
4741 }
4742
4743 /// Return true if we assume that the underlying value will only access
4744 /// inaccesible memory only (see Attribute::InaccessibleMemOnly).
4746 return isAssumed(inverseLocation(NO_INACCESSIBLE_MEM, true, true));
4747 }
4748
4749 /// Return true if we know that the underlying value will only access
4750 /// argument pointees (see Attribute::ArgMemOnly).
4751 bool isKnownArgMemOnly() const {
4752 return isKnown(inverseLocation(NO_ARGUMENT_MEM, true, true));
4753 }
4754
4755 /// Return true if we assume that the underlying value will only access
4756 /// argument pointees (see Attribute::ArgMemOnly).
4757 bool isAssumedArgMemOnly() const {
4758 return isAssumed(inverseLocation(NO_ARGUMENT_MEM, true, true));
4759 }
4760
4761 /// Return true if we know that the underlying value will only access
4762 /// inaccesible memory or argument pointees (see
4763 /// Attribute::InaccessibleOrArgMemOnly).
4765 return isKnown(
4767 }
4768
4769 /// Return true if we assume that the underlying value will only access
4770 /// inaccesible memory or argument pointees (see
4771 /// Attribute::InaccessibleOrArgMemOnly).
4776
4777 /// Return true if the underlying value may access memory through arguement
4778 /// pointers of the associated function, if any.
4779 bool mayAccessArgMem() const { return !isAssumed(NO_ARGUMENT_MEM); }
4780
4781 /// Return true if only the memory locations specififed by \p MLK are assumed
4782 /// to be accessed by the associated function.
4784 return isAssumed(MLK);
4785 }
4786
4787 /// Return the locations that are assumed to be not accessed by the associated
4788 /// function, if any.
4792
4793 /// Return the inverse of location \p Loc, thus for NO_XXX the return
4794 /// describes ONLY_XXX. The flags \p AndLocalMem and \p AndConstMem determine
4795 /// if local (=stack) and constant memory are allowed as well. Most of the
4796 /// time we do want them to be included, e.g., argmemonly allows accesses via
4797 /// argument pointers or local or constant memory accesses.
4798 static MemoryLocationsKind
4799 inverseLocation(MemoryLocationsKind Loc, bool AndLocalMem, bool AndConstMem) {
4800 return NO_LOCATIONS & ~(Loc | (AndLocalMem ? NO_LOCAL_MEM : 0) |
4801 (AndConstMem ? NO_CONST_MEM : 0));
4802 };
4803
4804 /// Return the locations encoded by \p MLK as a readable string.
4806
4807 /// Simple enum to distinguish read/write/read-write accesses.
4809 NONE = 0,
4810 READ = 1 << 0,
4811 WRITE = 1 << 1,
4813 };
4814
4815 /// Check \p Pred on all accesses to the memory kinds specified by \p MLK.
4816 ///
4817 /// This method will evaluate \p Pred on all accesses (access instruction +
4818 /// underlying accessed memory pointer) and it will return true if \p Pred
4819 /// holds every time.
4821 function_ref<bool(const Instruction *, const Value *, AccessKind,
4823 Pred,
4824 MemoryLocationsKind MLK) const = 0;
4825
4826 /// Create an abstract attribute view for the position \p IRP.
4828 Attributor &A);
4829
4830 /// See AbstractState::getAsStr(Attributor).
4831 const std::string getAsStr(Attributor *A) const override {
4833 }
4834
4835 /// See AbstractAttribute::getName()
4836 StringRef getName() const override { return "AAMemoryLocation"; }
4837
4838 /// See AbstractAttribute::getIdAddr()
4839 const char *getIdAddr() const override { return &ID; }
4840
4841 /// This function should return true if the type of the \p AA is
4842 /// AAMemoryLocation
4843 static bool classof(const AbstractAttribute *AA) {
4844 return (AA->getIdAddr() == &ID);
4845 }
4846
4847 /// Unique ID (due to the unique address)
4848 LLVM_ABI static const char ID;
4849};
4850
4851/// An abstract interface for range value analysis.
4853 : public StateWrapper<IntegerRangeState, AbstractAttribute, uint32_t> {
4856 : Base(IRP, IRP.getAssociatedType()->getIntegerBitWidth()) {}
4857
4858 /// See AbstractAttribute::isValidIRPositionForInit
4860 if (!IRP.getAssociatedType()->isIntegerTy())
4861 return false;
4863 }
4864
4865 /// See AbstractAttribute::requiresCallersForArgOrFunction
4866 static bool requiresCallersForArgOrFunction() { return true; }
4867
4868 /// See AbstractAttribute::getState(...).
4869 IntegerRangeState &getState() override { return *this; }
4870 const IntegerRangeState &getState() const override { return *this; }
4871
4872 /// Create an abstract attribute view for the position \p IRP.
4874 Attributor &A);
4875
4876 /// Return an assumed range for the associated value a program point \p CtxI.
4877 /// If \p I is nullptr, simply return an assumed range.
4878 virtual ConstantRange
4880 const Instruction *CtxI = nullptr) const = 0;
4881
4882 /// Return an assumed constant for the associated value a program point \p
4883 /// CtxI.
4884 std::optional<Constant *>
4885 getAssumedConstant(Attributor &A, const Instruction *CtxI = nullptr) const {
4886 ConstantRange RangeV = getAssumedConstantRange(A, CtxI);
4887 if (auto *C = RangeV.getSingleElement()) {
4890 AA::getWithType(*ConstantInt::get(Ty->getContext(), *C), *Ty));
4891 }
4892 if (RangeV.isEmptySet())
4893 return std::nullopt;
4894 return nullptr;
4895 }
4896
4897 /// See AbstractAttribute::getName()
4898 StringRef getName() const override { return "AAValueConstantRange"; }
4899
4900 /// See AbstractAttribute::getIdAddr()
4901 const char *getIdAddr() const override { return &ID; }
4902
4903 /// This function should return true if the type of the \p AA is
4904 /// AAValueConstantRange
4905 static bool classof(const AbstractAttribute *AA) {
4906 return (AA->getIdAddr() == &ID);
4907 }
4908
4909 /// Unique ID (due to the unique address)
4910 LLVM_ABI static const char ID;
4911};
4912
4913/// A class for a set state.
4914/// The assumed boolean state indicates whether the corresponding set is full
4915/// set or not. If the assumed state is false, this is the worst state. The
4916/// worst state (invalid state) of set of potential values is when the set
4917/// contains every possible value (i.e. we cannot in any way limit the value
4918/// that the target position can take). That never happens naturally, we only
4919/// force it. As for the conditions under which we force it, see
4920/// AAPotentialConstantValues.
4921template <typename MemberTy> struct PotentialValuesState : AbstractState {
4923
4924 PotentialValuesState() : IsValidState(true), UndefIsContained(false) {}
4925
4927 : IsValidState(IsValid), UndefIsContained(false) {}
4928
4929 /// See AbstractState::isValidState(...)
4930 bool isValidState() const override { return IsValidState.isValidState(); }
4931
4932 /// See AbstractState::isAtFixpoint(...)
4933 bool isAtFixpoint() const override { return IsValidState.isAtFixpoint(); }
4934
4935 /// See AbstractState::indicatePessimisticFixpoint(...)
4937 return IsValidState.indicatePessimisticFixpoint();
4938 }
4939
4940 /// See AbstractState::indicateOptimisticFixpoint(...)
4942 return IsValidState.indicateOptimisticFixpoint();
4943 }
4944
4945 /// Return the assumed state
4947 const PotentialValuesState &getAssumed() const { return *this; }
4948
4949 /// Return this set. We should check whether this set is valid or not by
4950 /// isValidState() before calling this function.
4951 const SetTy &getAssumedSet() const {
4952 assert(isValidState() && "This set shoud not be used when it is invalid!");
4953 return Set;
4954 }
4955
4956 /// Returns whether this state contains an undef value or not.
4957 bool undefIsContained() const {
4958 assert(isValidState() && "This flag shoud not be used when it is invalid!");
4959 return UndefIsContained;
4960 }
4961
4963 if (isValidState() != RHS.isValidState())
4964 return false;
4965 if (!isValidState() && !RHS.isValidState())
4966 return true;
4967 if (undefIsContained() != RHS.undefIsContained())
4968 return false;
4969 return Set == RHS.getAssumedSet();
4970 }
4971
4972 /// Maximum number of potential values to be tracked.
4973 /// This is set by -attributor-max-potential-values command line option
4974 static unsigned MaxPotentialValues;
4975
4976 /// Return empty set as the best state of potential values.
4978 return PotentialValuesState(true);
4979 }
4980
4982 return getBestState();
4983 }
4984
4985 /// Return full set as the worst state of potential values.
4987 return PotentialValuesState(false);
4988 }
4989
4990 /// Union assumed set with the passed value.
4991 void unionAssumed(const MemberTy &C) { insert(C); }
4992
4993 /// Union assumed set with assumed set of the passed state \p PVS.
4994 void unionAssumed(const PotentialValuesState &PVS) { unionWith(PVS); }
4995
4996 /// Union assumed set with an undef value.
4997 void unionAssumedWithUndef() { unionWithUndef(); }
4998
4999 /// "Clamp" this state with \p PVS.
5001 IsValidState ^= PVS.IsValidState;
5002 unionAssumed(PVS);
5003 return *this;
5004 }
5005
5007 IsValidState &= PVS.IsValidState;
5008 unionAssumed(PVS);
5009 return *this;
5010 }
5011
5012protected:
5014 assert(isValidState() && "This set shoud not be used when it is invalid!");
5015 return Set;
5016 }
5017
5018private:
5019 /// Check the size of this set, and invalidate when the size is no
5020 /// less than \p MaxPotentialValues threshold.
5021 void checkAndInvalidate() {
5022 if (Set.size() >= MaxPotentialValues)
5024 else
5025 reduceUndefValue();
5026 }
5027
5028 /// If this state contains both undef and not undef, we can reduce
5029 /// undef to the not undef value.
5030 void reduceUndefValue() { UndefIsContained = UndefIsContained & Set.empty(); }
5031
5032 /// Insert an element into this set.
5033 void insert(const MemberTy &C) {
5034 if (!isValidState())
5035 return;
5036 Set.insert(C);
5037 checkAndInvalidate();
5038 }
5039
5040 /// Take union with R.
5041 void unionWith(const PotentialValuesState &R) {
5042 /// If this is a full set, do nothing.
5043 if (!isValidState())
5044 return;
5045 /// If R is full set, change L to a full set.
5046 if (!R.isValidState()) {
5048 return;
5049 }
5050 Set.insert_range(R.Set);
5051 UndefIsContained |= R.undefIsContained();
5052 checkAndInvalidate();
5053 }
5054
5055 /// Take union with an undef value.
5056 void unionWithUndef() {
5057 UndefIsContained = true;
5058 reduceUndefValue();
5059 }
5060
5061 /// A helper state which indicate whether this state is valid or not.
5062 BooleanState IsValidState;
5063
5064 /// Container for potential values
5065 SetTy Set;
5066
5067 /// Flag for undef value
5068 bool UndefIsContained;
5069};
5070
5075
5076 bool operator==(const DenormalState Other) const {
5077 return Mode == Other.Mode && ModeF32 == Other.ModeF32;
5078 }
5079
5080 bool operator!=(const DenormalState Other) const {
5081 return Mode != Other.Mode || ModeF32 != Other.ModeF32;
5082 }
5083
5084 bool isValid() const { return Mode.isValid() && ModeF32.isValid(); }
5085
5089 if (Caller == Callee)
5090 return Caller;
5091 if (Callee == DenormalMode::Dynamic)
5092 return Caller;
5093 if (Caller == DenormalMode::Dynamic)
5094 return Callee;
5095 return DenormalMode::Invalid;
5096 }
5097
5099 return DenormalMode{unionDenormalKind(Callee.Output, Caller.Output),
5100 unionDenormalKind(Callee.Input, Caller.Input)};
5101 }
5102
5104 DenormalState Callee(*this);
5105 Callee.Mode = unionAssumed(Callee.Mode, Caller.Mode);
5106 Callee.ModeF32 = unionAssumed(Callee.ModeF32, Caller.ModeF32);
5107 return Callee;
5108 }
5109 };
5110
5112
5113 /// Explicitly track whether we've hit a fixed point.
5114 bool IsAtFixedpoint = false;
5115
5117
5118 DenormalState getKnown() const { return Known; }
5119
5120 // There's only really known or unknown, there's no speculatively assumable
5121 // state.
5122 DenormalState getAssumed() const { return Known; }
5123
5124 bool isValidState() const override { return Known.isValid(); }
5125
5126 /// Return true if there are no dynamic components to the denormal mode worth
5127 /// specializing.
5128 bool isModeFixed() const {
5129 return Known.Mode.Input != DenormalMode::Dynamic &&
5130 Known.Mode.Output != DenormalMode::Dynamic &&
5131 Known.ModeF32.Input != DenormalMode::Dynamic &&
5132 Known.ModeF32.Output != DenormalMode::Dynamic;
5133 }
5134
5135 bool isAtFixpoint() const override { return IsAtFixedpoint; }
5136
5142
5146
5150
5152 Known = Known.unionWith(Caller.getKnown());
5153 return *this;
5154 }
5155};
5156
5160
5164 const PotentialLLVMValuesState &R);
5165
5166/// An abstract interface for potential values analysis.
5167///
5168/// This AA collects potential values for each IR position.
5169/// An assumed set of potential values is initialized with the empty set (the
5170/// best state) and it will grow monotonically as we find more potential values
5171/// for this position.
5172/// The set might be forced to the worst state, that is, to contain every
5173/// possible value for this position in 2 cases.
5174/// 1. We surpassed the \p MaxPotentialValues threshold. This includes the
5175/// case that this position is affected (e.g. because of an operation) by a
5176/// Value that is in the worst state.
5177/// 2. We tried to initialize on a Value that we cannot handle (e.g. an
5178/// operator we do not currently handle).
5179///
5180/// For non constant integers see AAPotentialValues.
5182 : public StateWrapper<PotentialConstantIntValuesState, AbstractAttribute> {
5185
5186 /// See AbstractAttribute::isValidIRPositionForInit
5188 if (!IRP.getAssociatedType()->isIntegerTy())
5189 return false;
5191 }
5192
5193 /// See AbstractAttribute::requiresCallersForArgOrFunction
5194 static bool requiresCallersForArgOrFunction() { return true; }
5195
5196 /// See AbstractAttribute::getState(...).
5197 PotentialConstantIntValuesState &getState() override { return *this; }
5199 return *this;
5200 }
5201
5202 /// Create an abstract attribute view for the position \p IRP.
5205
5206 /// Return assumed constant for the associated value
5207 std::optional<Constant *>
5208 getAssumedConstant(Attributor &A, const Instruction *CtxI = nullptr) const {
5209 if (!isValidState())
5210 return nullptr;
5211 if (getAssumedSet().size() == 1) {
5214 *ConstantInt::get(Ty->getContext(), *(getAssumedSet().begin())),
5215 *Ty));
5216 }
5217 if (getAssumedSet().size() == 0) {
5218 if (undefIsContained())
5220 return std::nullopt;
5221 }
5222
5223 return nullptr;
5224 }
5225
5226 /// Return the minimum trailing zeros of potential constants
5228 if (!isValidState() || getAssumedSet().empty())
5229 return 0;
5230 unsigned TrailingZeros = getAssumedSet().begin()->getBitWidth() + 1;
5231 for (const APInt &It : getAssumedSet()) {
5232 if (It.countTrailingZeros() < TrailingZeros)
5233 TrailingZeros = It.countTrailingZeros();
5234 }
5235 if (TrailingZeros > getAssumedSet().begin()->getBitWidth())
5236 return 0;
5237 return TrailingZeros;
5238 }
5239 /// See AbstractAttribute::getName()
5240 StringRef getName() const override { return "AAPotentialConstantValues"; }
5241
5242 /// See AbstractAttribute::getIdAddr()
5243 const char *getIdAddr() const override { return &ID; }
5244
5245 /// This function should return true if the type of the \p AA is
5246 /// AAPotentialConstantValues
5247 static bool classof(const AbstractAttribute *AA) {
5248 return (AA->getIdAddr() == &ID);
5249 }
5250
5251 /// Unique ID (due to the unique address)
5252 LLVM_ABI static const char ID;
5253};
5254
5256 : public StateWrapper<PotentialLLVMValuesState, AbstractAttribute> {
5259
5260 /// See AbstractAttribute::requiresCallersForArgOrFunction
5261 static bool requiresCallersForArgOrFunction() { return true; }
5262
5263 /// See AbstractAttribute::getState(...).
5264 PotentialLLVMValuesState &getState() override { return *this; }
5265 const PotentialLLVMValuesState &getState() const override { return *this; }
5266
5267 /// Create an abstract attribute view for the position \p IRP.
5269 Attributor &A);
5270
5271 /// Extract the single value in \p Values if any.
5272 LLVM_ABI static Value *
5274 const IRPosition &IRP,
5276
5277 /// See AbstractAttribute::getName()
5278 StringRef getName() const override { return "AAPotentialValues"; }
5279
5280 /// See AbstractAttribute::getIdAddr()
5281 const char *getIdAddr() const override { return &ID; }
5282
5283 /// This function should return true if the type of the \p AA is
5284 /// AAPotentialValues
5285 static bool classof(const AbstractAttribute *AA) {
5286 return (AA->getIdAddr() == &ID);
5287 }
5288
5289 /// Unique ID (due to the unique address)
5290 LLVM_ABI static const char ID;
5291
5292private:
5293 virtual bool getAssumedSimplifiedValues(
5295 AA::ValueScope, bool RecurseForSelectAndPHI = false) const = 0;
5296
5297 friend struct Attributor;
5298};
5299
5300/// An abstract interface for all noundef attributes.
5302 : public IRAttribute<Attribute::NoUndef,
5303 StateWrapper<BooleanState, AbstractAttribute>,
5304 AANoUndef> {
5306
5307 /// See IRAttribute::isImpliedByUndef
5308 static bool isImpliedByUndef() { return false; }
5309
5310 /// See IRAttribute::isImpliedByPoison
5311 static bool isImpliedByPoison() { return false; }
5312
5313 /// See IRAttribute::isImpliedByIR
5314 LLVM_ABI static bool isImpliedByIR(Attributor &A, const IRPosition &IRP,
5315 Attribute::AttrKind ImpliedAttributeKind,
5316 bool IgnoreSubsumingPositions = false);
5317
5318 /// Return true if we assume that the underlying value is noundef.
5319 bool isAssumedNoUndef() const { return getAssumed(); }
5320
5321 /// Return true if we know that underlying value is noundef.
5322 bool isKnownNoUndef() const { return getKnown(); }
5323
5324 /// Create an abstract attribute view for the position \p IRP.
5326 Attributor &A);
5327
5328 /// See AbstractAttribute::getName()
5329 StringRef getName() const override { return "AANoUndef"; }
5330
5331 /// See AbstractAttribute::getIdAddr()
5332 const char *getIdAddr() const override { return &ID; }
5333
5334 /// This function should return true if the type of the \p AA is AANoUndef
5335 static bool classof(const AbstractAttribute *AA) {
5336 return (AA->getIdAddr() == &ID);
5337 }
5338
5339 /// Unique ID (due to the unique address)
5340 LLVM_ABI static const char ID;
5341};
5342
5344 : public IRAttribute<
5345 Attribute::NoFPClass,
5346 StateWrapper<BitIntegerState<uint32_t, fcAllFlags, fcNone>,
5347 AbstractAttribute>,
5348 AANoFPClass> {
5351
5353
5354 /// See AbstractAttribute::isValidIRPositionForInit
5356 return AttributeFuncs::isNoFPClassCompatibleType(IRP.getAssociatedType());
5357 }
5358
5359 /// Return the underlying assumed nofpclass.
5361 return static_cast<FPClassTest>(getAssumed());
5362 }
5363 /// Return the underlying known nofpclass.
5365 return static_cast<FPClassTest>(getKnown());
5366 }
5367
5368 /// Create an abstract attribute view for the position \p IRP.
5370 Attributor &A);
5371
5372 /// See AbstractAttribute::getName()
5373 StringRef getName() const override { return "AANoFPClass"; }
5374
5375 /// See AbstractAttribute::getIdAddr()
5376 const char *getIdAddr() const override { return &ID; }
5377
5378 /// This function should return true if the type of the \p AA is AANoFPClass
5379 static bool classof(const AbstractAttribute *AA) {
5380 return (AA->getIdAddr() == &ID);
5381 }
5382
5383 /// Unique ID (due to the unique address)
5384 LLVM_ABI static const char ID;
5385};
5386
5387struct AACallGraphNode;
5388struct AACallEdges;
5389
5390/// An Iterator for call edges, creates AACallEdges attributes in a lazy way.
5391/// This iterator becomes invalid if the underlying edge list changes.
5392/// So This shouldn't outlive a iteration of Attributor.
5393class AACallEdgeIterator
5394 : public iterator_adaptor_base<AACallEdgeIterator,
5395 SetVector<Function *>::iterator> {
5396 AACallEdgeIterator(Attributor &A, SetVector<Function *>::iterator Begin)
5397 : iterator_adaptor_base(Begin), A(A) {}
5398
5399public:
5401
5402private:
5403 Attributor &A;
5404 friend AACallEdges;
5405 friend AttributorCallGraph;
5406};
5407
5410 virtual ~AACallGraphNode() = default;
5411
5414
5415 /// Iterator range for exploring the call graph.
5420
5421protected:
5422 /// Reference to Attributor needed for GraphTraits implementation.
5424};
5425
5426/// An abstract state for querying live call edges.
5427/// This interface uses the Attributor's optimistic liveness
5428/// information to compute the edges that are alive.
5429struct AACallEdges : public StateWrapper<BooleanState, AbstractAttribute>,
5432
5434 : Base(IRP), AACallGraphNode(A) {}
5435
5436 /// See AbstractAttribute::requiresNonAsmForCallBase.
5437 static bool requiresNonAsmForCallBase() { return false; }
5438
5439 /// Get the optimistic edges.
5440 virtual const SetVector<Function *> &getOptimisticEdges() const = 0;
5441
5442 /// Is there any call with a unknown callee.
5443 virtual bool hasUnknownCallee() const = 0;
5444
5445 /// Is there any call with a unknown callee, excluding any inline asm.
5446 virtual bool hasNonAsmUnknownCallee() const = 0;
5447
5448 /// Iterator for exploring the call graph.
5452
5453 /// Iterator for exploring the call graph.
5457
5458 /// Create an abstract attribute view for the position \p IRP.
5460 Attributor &A);
5461
5462 /// See AbstractAttribute::getName()
5463 StringRef getName() const override { return "AACallEdges"; }
5464
5465 /// See AbstractAttribute::getIdAddr()
5466 const char *getIdAddr() const override { return &ID; }
5467
5468 /// This function should return true if the type of the \p AA is AACallEdges.
5469 static bool classof(const AbstractAttribute *AA) {
5470 return (AA->getIdAddr() == &ID);
5471 }
5472
5473 /// Unique ID (due to the unique address)
5474 LLVM_ABI static const char ID;
5475};
5476
5477// Synthetic root node for the Attributor's internal call graph.
5480 ~AttributorCallGraph() override = default;
5481
5483 return AACallEdgeIterator(A, A.Functions.begin());
5484 }
5485
5487 return AACallEdgeIterator(A, A.Functions.end());
5488 }
5489
5490 /// Force populate the entire call graph.
5491 void populateAll() const {
5492 for (const AACallGraphNode *AA : optimisticEdgesRange()) {
5493 // Nothing else to do here.
5494 (void)AA;
5495 }
5496 }
5497
5498 LLVM_ABI void print();
5499};
5500
5501template <> struct GraphTraits<AACallGraphNode *> {
5504
5506 return Node->optimisticEdgesBegin();
5507 }
5508
5510 return Node->optimisticEdgesEnd();
5511 }
5512};
5513
5514template <>
5518
5520 return static_cast<AACallGraphNode *>(G);
5521 }
5522
5524 return G->optimisticEdgesBegin();
5525 }
5526
5528 return G->optimisticEdgesEnd();
5529 }
5530};
5531
5532template <>
5535
5537 const AttributorCallGraph *Graph) {
5538 const AACallEdges *AACE = static_cast<const AACallEdges *>(Node);
5539 return AACE->getAssociatedFunction()->getName().str();
5540 }
5541
5543 const AttributorCallGraph *Graph) {
5544 // Hide the synth root.
5545 return static_cast<const AACallGraphNode *>(Graph) == Node;
5546 }
5547};
5548
5550 : public StateWrapper<BooleanState, AbstractAttribute> {
5553
5554 /// Summary about the execution domain of a block or instruction.
5579
5580 /// Create an abstract attribute view for the position \p IRP.
5582 Attributor &A);
5583
5584 /// See AbstractAttribute::getName().
5585 StringRef getName() const override { return "AAExecutionDomain"; }
5586
5587 /// See AbstractAttribute::getIdAddr().
5588 const char *getIdAddr() const override { return &ID; }
5589
5590 /// Check if an instruction is executed only by the initial thread.
5592 return isExecutedByInitialThreadOnly(*I.getParent());
5593 }
5594
5595 /// Check if a basic block is executed only by the initial thread.
5596 virtual bool isExecutedByInitialThreadOnly(const BasicBlock &) const = 0;
5597
5598 /// Check if the instruction \p I is executed in an aligned region, that is,
5599 /// the synchronizing effects before and after \p I are both aligned barriers.
5600 /// This effectively means all threads execute \p I together.
5602 const Instruction &I) const = 0;
5603
5605 /// Return the execution domain with which the call \p CB is entered and the
5606 /// one with which it is left.
5607 virtual std::pair<ExecutionDomainTy, ExecutionDomainTy>
5608 getExecutionDomain(const CallBase &CB) const = 0;
5610
5611 /// Helper function to determine if \p FI is a no-op given the information
5612 /// about its execution from \p ExecDomainAA.
5613 virtual bool isNoOpFence(const FenceInst &FI) const = 0;
5614
5615 /// This function should return true if the type of the \p AA is
5616 /// AAExecutionDomain.
5617 static bool classof(const AbstractAttribute *AA) {
5618 return (AA->getIdAddr() == &ID);
5619 }
5620
5621 /// Unique ID (due to the unique address)
5622 LLVM_ABI static const char ID;
5623};
5624
5625/// An abstract Attribute for computing reachability between functions.
5627 : public StateWrapper<BooleanState, AbstractAttribute> {
5629
5631
5632 /// If the function represented by this possition can reach \p Fn.
5633 bool canReach(Attributor &A, const Function &Fn) const {
5634 Function *Scope = getAnchorScope();
5635 if (!Scope || Scope->isDeclaration())
5636 return true;
5637 return instructionCanReach(A, Scope->getEntryBlock().front(), Fn);
5638 }
5639
5640 /// Can \p Inst reach \p Fn.
5641 /// See also AA::isPotentiallyReachable.
5643 Attributor &A, const Instruction &Inst, const Function &Fn,
5644 const AA::InstExclusionSetTy *ExclusionSet = nullptr) const = 0;
5645
5646 /// Create an abstract attribute view for the position \p IRP.
5649
5650 /// See AbstractAttribute::getName()
5651 StringRef getName() const override { return "AAInterFnReachability"; }
5652
5653 /// See AbstractAttribute::getIdAddr()
5654 const char *getIdAddr() const override { return &ID; }
5655
5656 /// This function should return true if the type of the \p AA is AACallEdges.
5657 static bool classof(const AbstractAttribute *AA) {
5658 return (AA->getIdAddr() == &ID);
5659 }
5660
5661 /// Unique ID (due to the unique address)
5662 LLVM_ABI static const char ID;
5663};
5664
5665/// An abstract Attribute for determining the necessity of the convergent
5666/// attribute.
5667struct AANonConvergent : public StateWrapper<BooleanState, AbstractAttribute> {
5669
5671
5672 /// Create an abstract attribute view for the position \p IRP.
5674 Attributor &A);
5675
5676 /// Return true if "non-convergent" is assumed.
5677 bool isAssumedNotConvergent() const { return getAssumed(); }
5678
5679 /// Return true if "non-convergent" is known.
5680 bool isKnownNotConvergent() const { return getKnown(); }
5681
5682 /// See AbstractAttribute::getName()
5683 StringRef getName() const override { return "AANonConvergent"; }
5684
5685 /// See AbstractAttribute::getIdAddr()
5686 const char *getIdAddr() const override { return &ID; }
5687
5688 /// This function should return true if the type of the \p AA is
5689 /// AANonConvergent.
5690 static bool classof(const AbstractAttribute *AA) {
5691 return (AA->getIdAddr() == &ID);
5692 }
5693
5694 /// Unique ID (due to the unique address)
5695 LLVM_ABI static const char ID;
5696};
5697
5698/// An abstract interface for struct information.
5701
5702 /// See AbstractAttribute::isValidIRPositionForInit
5705 return false;
5707 }
5708
5710 // First two bits to distinguish may and must accesses.
5711 AK_MUST = 1 << 0,
5712 AK_MAY = 1 << 1,
5713
5714 // Then two bits for read and write. These are not exclusive.
5715 AK_R = 1 << 2,
5716 AK_W = 1 << 3,
5718
5719 // One special case for assumptions about memory content. These
5720 // are neither reads nor writes. They are however always modeled
5721 // as read to avoid using them for write removal.
5723
5724 // Helper for easy access.
5731 };
5732
5733 /// A helper containing a list of offsets computed for a Use. Ideally this
5734 /// list should be strictly ascending, but we ensure that only when we
5735 /// actually translate the list of offsets to a RangeList.
5736 struct OffsetInfo {
5740
5741 const_iterator begin() const { return Offsets.begin(); }
5742 const_iterator end() const { return Offsets.end(); }
5743
5744 bool operator==(const OffsetInfo &RHS) const {
5745 return Offsets == RHS.Offsets;
5746 }
5747
5748 bool operator!=(const OffsetInfo &RHS) const { return !(*this == RHS); }
5749
5750 bool insert(int64_t Offset) { return Offsets.insert(Offset).second; }
5751 bool isUnassigned() const { return Offsets.size() == 0; }
5752
5753 bool isUnknown() const {
5754 if (isUnassigned())
5755 return false;
5756 if (Offsets.size() == 1)
5757 return *Offsets.begin() == AA::RangeTy::Unknown;
5758 return false;
5759 }
5760
5761 void setUnknown() {
5762 Offsets.clear();
5764 }
5765
5766 void addToAll(int64_t Inc) {
5767 VecTy NewOffsets;
5768 for (auto &Offset : Offsets)
5769 NewOffsets.insert(Offset + Inc);
5770 Offsets = std::move(NewOffsets);
5771 }
5772
5773 /// Copy offsets from \p R into the current list.
5774 ///
5775 /// Ideally all lists should be strictly ascending, but we defer that to the
5776 /// actual use of the list. So we just blindly append here.
5777 bool merge(const OffsetInfo &R) { return set_union(Offsets, R.Offsets); }
5778 };
5779
5780 /// A container for a list of ranges.
5781 struct RangeList {
5782 // The set of ranges rarely contains more than one element, and is unlikely
5783 // to contain more than say four elements. So we find the middle-ground with
5784 // a sorted vector. This avoids hard-coding a rarely used number like "four"
5785 // into every instance of a SmallSet.
5791
5792 RangeList(const RangeTy &R) { Ranges.push_back(R); }
5794 Ranges.reserve(Offsets.size());
5795 for (unsigned i = 0, e = Offsets.size(); i != e; ++i) {
5796 assert(((i + 1 == e) || Offsets[i] < Offsets[i + 1]) &&
5797 "Expected strictly ascending offsets.");
5798 Ranges.emplace_back(Offsets[i], Size);
5799 }
5800 }
5801 RangeList() = default;
5802
5803 iterator begin() { return Ranges.begin(); }
5804 iterator end() { return Ranges.end(); }
5805 const_iterator begin() const { return Ranges.begin(); }
5806 const_iterator end() const { return Ranges.end(); }
5807
5808 // Helpers required for std::set_difference
5810 void push_back(const RangeTy &R) {
5811 assert((Ranges.empty() || RangeTy::LessThan(Ranges.back(), R)) &&
5812 "Ensure the last element is the greatest.");
5813 Ranges.push_back(R);
5814 }
5815
5816 /// Copy ranges from \p L that are not in \p R, into \p D.
5817 static void set_difference(const RangeList &L, const RangeList &R,
5818 RangeList &D) {
5819 std::set_difference(L.begin(), L.end(), R.begin(), R.end(),
5820 std::back_inserter(D), RangeTy::LessThan);
5821 }
5822
5823 unsigned size() const { return Ranges.size(); }
5824
5825 bool operator==(const RangeList &OI) const { return Ranges == OI.Ranges; }
5826
5827 /// Merge the ranges in \p RHS into the current ranges.
5828 /// - Merging a list of unknown ranges makes the current list unknown.
5829 /// - Ranges with the same offset are merged according to RangeTy::operator&
5830 /// \return true if the current RangeList changed.
5831 bool merge(const RangeList &RHS) {
5832 if (isUnknown())
5833 return false;
5834 if (RHS.isUnknown()) {
5835 setUnknown();
5836 return true;
5837 }
5838
5839 if (Ranges.empty()) {
5840 Ranges = RHS.Ranges;
5841 return true;
5842 }
5843
5844 bool Changed = false;
5845 auto LPos = Ranges.begin();
5846 for (auto &R : RHS.Ranges) {
5847 auto Result = insert(LPos, R);
5848 if (isUnknown())
5849 return true;
5850 LPos = Result.first;
5851 Changed |= Result.second;
5852 }
5853 return Changed;
5854 }
5855
5856 /// Insert \p R at the given iterator \p Pos, and merge if necessary.
5857 ///
5858 /// This assumes that all ranges before \p Pos are LessThan \p R, and
5859 /// then maintains the sorted order for the suffix list.
5860 ///
5861 /// \return The place of insertion and true iff anything changed.
5862 std::pair<iterator, bool> insert(iterator Pos, const RangeTy &R) {
5863 if (isUnknown())
5864 return std::make_pair(Ranges.begin(), false);
5865 if (R.offsetOrSizeAreUnknown()) {
5866 return std::make_pair(setUnknown(), true);
5867 }
5868
5869 // Maintain this as a sorted vector of unique entries.
5870 auto LB = std::lower_bound(Pos, Ranges.end(), R, RangeTy::LessThan);
5871 if (LB == Ranges.end() || LB->Offset != R.Offset)
5872 return std::make_pair(Ranges.insert(LB, R), true);
5873 bool Changed = *LB != R;
5874 *LB &= R;
5875 if (LB->offsetOrSizeAreUnknown())
5876 return std::make_pair(setUnknown(), true);
5877 return std::make_pair(LB, Changed);
5878 }
5879
5880 /// Add the increment \p Inc to the offset of every range.
5881 void addToAllOffsets(int64_t Inc) {
5882 assert(!isUnassigned() &&
5883 "Cannot increment if the offset is not yet computed!");
5884 if (isUnknown())
5885 return;
5886 for (auto &R : Ranges) {
5887 R.Offset += Inc;
5888 }
5889 }
5890
5891 /// Return true iff the list contains an unknown range.
5892 bool isUnknown() const {
5893 if (isUnassigned())
5894 return false;
5895 if (Ranges.front().offsetOrSizeAreUnknown()) {
5896 assert(Ranges.size() == 1 && "Unknown is a singleton range.");
5897 return true;
5898 }
5899 return false;
5900 }
5901
5902 /// Discard all ranges and insert a single unknown range.
5904 Ranges.clear();
5905 Ranges.push_back(RangeTy::getUnknown());
5906 return Ranges.begin();
5907 }
5908
5909 /// Return true if no ranges have been inserted.
5910 bool isUnassigned() const { return Ranges.size() == 0; }
5911 };
5912
5913 /// An access description.
5914 struct Access {
5915 Access(Instruction *I, int64_t Offset, int64_t Size,
5916 std::optional<Value *> Content, AccessKind Kind, Type *Ty)
5917 : LocalI(I), RemoteI(I), Content(Content), Ranges(Offset, Size),
5918 Kind(Kind), Ty(Ty) {
5919 verify();
5920 }
5921 Access(Instruction *LocalI, Instruction *RemoteI, const RangeList &Ranges,
5922 std::optional<Value *> Content, AccessKind K, Type *Ty)
5923 : LocalI(LocalI), RemoteI(RemoteI), Content(Content), Ranges(Ranges),
5924 Kind(K), Ty(Ty) {
5925 if (Ranges.size() > 1) {
5926 Kind = AccessKind(Kind | AK_MAY);
5927 Kind = AccessKind(Kind & ~AK_MUST);
5928 }
5929 verify();
5930 }
5931 Access(Instruction *LocalI, Instruction *RemoteI, int64_t Offset,
5932 int64_t Size, std::optional<Value *> Content, AccessKind Kind,
5933 Type *Ty)
5934 : LocalI(LocalI), RemoteI(RemoteI), Content(Content),
5935 Ranges(Offset, Size), Kind(Kind), Ty(Ty) {
5936 verify();
5937 }
5938 Access(const Access &Other) = default;
5939
5940 Access &operator=(const Access &Other) = default;
5941 bool operator==(const Access &R) const {
5942 return LocalI == R.LocalI && RemoteI == R.RemoteI && Ranges == R.Ranges &&
5943 Content == R.Content && Kind == R.Kind;
5944 }
5945 bool operator!=(const Access &R) const { return !(*this == R); }
5946
5948 assert(RemoteI == R.RemoteI && "Expected same instruction!");
5949 assert(LocalI == R.LocalI && "Expected same instruction!");
5950
5951 // Note that every Access object corresponds to a unique Value, and only
5952 // accesses to the same Value are merged. Hence we assume that all ranges
5953 // are the same size. If ranges can be different size, then the contents
5954 // must be dropped.
5955 Ranges.merge(R.Ranges);
5956 Content =
5957 AA::combineOptionalValuesInAAValueLatice(Content, R.Content, Ty);
5958
5959 // Combine the access kind, which results in a bitwise union.
5960 // If there is more than one range, then this must be a MAY.
5961 // If we combine a may and a must access we clear the must bit.
5962 Kind = AccessKind(Kind | R.Kind);
5963 if ((Kind & AK_MAY) || Ranges.size() > 1) {
5964 Kind = AccessKind(Kind | AK_MAY);
5965 Kind = AccessKind(Kind & ~AK_MUST);
5966 }
5967 verify();
5968 return *this;
5969 }
5970
5971 void verify() {
5972 assert(isMustAccess() + isMayAccess() == 1 &&
5973 "Expect must or may access, not both.");
5974 assert(isAssumption() + isWrite() <= 1 &&
5975 "Expect assumption access or write access, never both.");
5976 assert((isMayAccess() || Ranges.size() == 1) &&
5977 "Cannot be a must access if there are multiple ranges.");
5978 }
5979
5980 /// Return the access kind.
5981 AccessKind getKind() const { return Kind; }
5982
5983 /// Return true if this is a read access.
5984 bool isRead() const { return Kind & AK_R; }
5985
5986 /// Return true if this is a write access.
5987 bool isWrite() const { return Kind & AK_W; }
5988
5989 /// Return true if this is a write access.
5990 bool isWriteOrAssumption() const { return isWrite() || isAssumption(); }
5991
5992 /// Return true if this is an assumption access.
5993 bool isAssumption() const { return Kind == AK_ASSUMPTION; }
5994
5995 bool isMustAccess() const {
5996 bool MustAccess = Kind & AK_MUST;
5997 assert((!MustAccess || Ranges.size() < 2) &&
5998 "Cannot be a must access if there are multiple ranges.");
5999 return MustAccess;
6000 }
6001
6002 bool isMayAccess() const {
6003 bool MayAccess = Kind & AK_MAY;
6004 assert((MayAccess || Ranges.size() < 2) &&
6005 "Cannot be a must access if there are multiple ranges.");
6006 return MayAccess;
6007 }
6008
6009 /// Return the instruction that causes the access with respect to the local
6010 /// scope of the associated attribute.
6011 Instruction *getLocalInst() const { return LocalI; }
6012
6013 /// Return the actual instruction that causes the access.
6014 Instruction *getRemoteInst() const { return RemoteI; }
6015
6016 /// Return true if the value written is not known yet.
6017 bool isWrittenValueYetUndetermined() const { return !Content; }
6018
6019 /// Return true if the value written cannot be determined at all.
6021 return Content.has_value() && !*Content;
6022 }
6023
6024 /// Return the type associated with the access, if known.
6025 Type *getType() const { return Ty; }
6026
6027 /// Return the value writen, if any.
6030 "Value needs to be determined before accessing it.");
6031 return *Content;
6032 }
6033
6034 /// Return the written value which can be `llvm::null` if it is not yet
6035 /// determined.
6036 std::optional<Value *> getContent() const { return Content; }
6037
6038 const RangeList &getRanges() const { return Ranges; }
6039
6041 const_iterator begin() const { return Ranges.begin(); }
6042 const_iterator end() const { return Ranges.end(); }
6043
6044 private:
6045 /// The instruction responsible for the access with respect to the local
6046 /// scope of the associated attribute.
6047 Instruction *LocalI;
6048
6049 /// The instruction responsible for the access.
6050 Instruction *RemoteI;
6051
6052 /// The value written, if any. `std::nullopt` means "not known yet",
6053 /// `nullptr` cannot be determined.
6054 std::optional<Value *> Content;
6055
6056 /// Set of potential ranges accessed from the base pointer.
6057 RangeList Ranges;
6058
6059 /// The access kind, e.g., READ, as bitset (could be more than one).
6061
6062 /// The type of the content, thus the type read/written, can be null if not
6063 /// available.
6064 Type *Ty;
6065 };
6066
6067 /// Create an abstract attribute view for the position \p IRP.
6069 Attributor &A);
6070
6071 /// See AbstractAttribute::getName()
6072 StringRef getName() const override { return "AAPointerInfo"; }
6073
6074 /// See AbstractAttribute::getIdAddr()
6075 const char *getIdAddr() const override { return &ID; }
6076
6078 using const_bin_iterator = OffsetBinsTy::const_iterator;
6079 virtual const_bin_iterator begin() const = 0;
6080 virtual const_bin_iterator end() const = 0;
6081 virtual int64_t numOffsetBins() const = 0;
6082 virtual bool reachesReturn() const = 0;
6083 virtual void addReturnedOffsetsTo(OffsetInfo &) const = 0;
6084
6085 /// Call \p CB on all accesses that might interfere with \p Range and return
6086 /// true if all such accesses were known and the callback returned true for
6087 /// all of them, false otherwise. An access interferes with an offset-size
6088 /// pair if it might read or write that memory region.
6090 AA::RangeTy Range, function_ref<bool(const Access &, bool)> CB) const = 0;
6091
6092 /// Call \p CB on all accesses that might interfere with \p I and
6093 /// return true if all such accesses were known and the callback returned true
6094 /// for all of them, false otherwise. In contrast to forallInterferingAccesses
6095 /// this function will perform reasoning to exclude write accesses that cannot
6096 /// affect the load even if they on the surface look as if they would. The
6097 /// flag \p HasBeenWrittenTo will be set to true if we know that \p I does not
6098 /// read the initial value of the underlying memory. If \p SkipCB is given and
6099 /// returns false for a potentially interfering access, that access is not
6100 /// checked for actual interference.
6102 Attributor &A, const AbstractAttribute &QueryingAA, Instruction &I,
6103 bool FindInterferingWrites, bool FindInterferingReads,
6104 function_ref<bool(const Access &, bool)> CB, bool &HasBeenWrittenTo,
6106 function_ref<bool(const Access &)> SkipCB = nullptr) const = 0;
6107
6108 /// This function should return true if the type of the \p AA is AAPointerInfo
6109 static bool classof(const AbstractAttribute *AA) {
6110 return (AA->getIdAddr() == &ID);
6111 }
6112
6113 /// Unique ID (due to the unique address)
6114 LLVM_ABI static const char ID;
6115};
6116
6118
6119/// An abstract attribute for getting assumption information.
6121 : public StateWrapper<SetState<StringRef>, AbstractAttribute,
6122 DenseSet<StringRef>> {
6123 using Base =
6125
6127 const DenseSet<StringRef> &Known)
6128 : Base(IRP, Known) {}
6129
6130 /// Returns true if the assumption set contains the assumption \p Assumption.
6131 virtual bool hasAssumption(const StringRef Assumption) const = 0;
6132
6133 /// Create an abstract attribute view for the position \p IRP.
6135 Attributor &A);
6136
6137 /// See AbstractAttribute::getName()
6138 StringRef getName() const override { return "AAAssumptionInfo"; }
6139
6140 /// See AbstractAttribute::getIdAddr()
6141 const char *getIdAddr() const override { return &ID; }
6142
6143 /// This function should return true if the type of the \p AA is
6144 /// AAAssumptionInfo
6145 static bool classof(const AbstractAttribute *AA) {
6146 return (AA->getIdAddr() == &ID);
6147 }
6148
6149 /// Unique ID (due to the unique address)
6150 LLVM_ABI static const char ID;
6151};
6152
6153/// An abstract attribute for getting all assumption underlying objects.
6156
6157 /// See AbstractAttribute::isValidIRPositionForInit
6160 return false;
6162 }
6163
6164 /// See AbstractAttribute::requiresCallersForArgOrFunction
6165 static bool requiresCallersForArgOrFunction() { return true; }
6166
6167 /// Create an abstract attribute biew for the position \p IRP.
6169 Attributor &A);
6170
6171 /// See AbstractAttribute::getName()
6172 StringRef getName() const override { return "AAUnderlyingObjects"; }
6173
6174 /// See AbstractAttribute::getIdAddr()
6175 const char *getIdAddr() const override { return &ID; }
6176
6177 /// This function should return true if the type of the \p AA is
6178 /// AAUnderlyingObjects.
6179 static bool classof(const AbstractAttribute *AA) {
6180 return (AA->getIdAddr() == &ID);
6181 }
6182
6183 /// Unique ID (due to the unique address)
6184 LLVM_ABI static const char ID;
6185
6186 /// Check \p Pred on all underlying objects in \p Scope collected so far.
6187 ///
6188 /// This method will evaluate \p Pred on all underlying objects in \p Scope
6189 /// collected so far and return true if \p Pred holds on all of them.
6190 virtual bool
6192 AA::ValueScope Scope = AA::Interprocedural) const = 0;
6193};
6194
6195/// An abstract interface for identifying pointers from which loads can be
6196/// marked invariant.
6199
6200 /// See AbstractAttribute::isValidIRPositionForInit
6202 if (!IRP.getAssociatedType()->isPointerTy())
6203 return false;
6204
6206 }
6207
6208 /// Create an abstract attribute view for the position \p IRP.
6211
6212 /// Return true if the pointer's contents are known to remain invariant.
6213 virtual bool isKnownInvariant() const = 0;
6214 virtual bool isKnownLocallyInvariant() const = 0;
6215
6216 /// Return true if the pointer's contents are assumed to remain invariant.
6217 virtual bool isAssumedInvariant() const = 0;
6218 virtual bool isAssumedLocallyInvariant() const = 0;
6219
6220 /// See AbstractAttribute::getName().
6221 StringRef getName() const override { return "AAInvariantLoadPointer"; }
6222
6223 /// See AbstractAttribute::getIdAddr().
6224 const char *getIdAddr() const override { return &ID; }
6225
6226 /// This function should return true if the type of the \p AA is
6227 /// AAInvariantLoadPointer
6228 static bool classof(const AbstractAttribute *AA) {
6229 return (AA->getIdAddr() == &ID);
6230 }
6231
6232 /// Unique ID (due to the unique address).
6233 LLVM_ABI static const char ID;
6234};
6235
6236/// An abstract interface for address space information.
6237struct AAAddressSpace : public StateWrapper<BooleanState, AbstractAttribute> {
6240
6241 /// See AbstractAttribute::isValidIRPositionForInit
6244 return false;
6246 }
6247
6248 /// See AbstractAttribute::requiresCallersForArgOrFunction
6249 static bool requiresCallersForArgOrFunction() { return true; }
6250
6251 /// Return the address space of the associated value. \p NoAddressSpace is
6252 /// returned if the associated value is dead. This functions is not supposed
6253 /// to be called if the AA is invalid.
6254 virtual uint32_t getAddressSpace() const = 0;
6255
6256 /// Create an abstract attribute view for the position \p IRP.
6258 Attributor &A);
6259
6260 /// See AbstractAttribute::getName()
6261 StringRef getName() const override { return "AAAddressSpace"; }
6262
6263 /// See AbstractAttribute::getIdAddr()
6264 const char *getIdAddr() const override { return &ID; }
6265
6266 /// This function should return true if the type of the \p AA is
6267 /// AAAssumptionInfo
6268 static bool classof(const AbstractAttribute *AA) {
6269 return (AA->getIdAddr() == &ID);
6270 }
6271
6272 /// Unique ID (due to the unique address)
6273 LLVM_ABI static const char ID;
6274
6275protected:
6276 // Invalid address space which indicates the associated value is dead.
6277 static const uint32_t InvalidAddressSpace = ~0U;
6278};
6279
6280/// An abstract interface for potential address space information.
6282 : public StateWrapper<BooleanState, AbstractAttribute> {
6287
6288 /// See AbstractAttribute::isValidIRPositionForInit
6291 return false;
6293 }
6294
6295 /// See AbstractAttribute::requiresCallersForArgOrFunction
6296 static bool requiresCallersForArgOrFunction() { return true; }
6297
6298 /// Create an abstract attribute view for the position \p IRP.
6300 Attributor &A);
6301 /// See AbstractAttribute::getName()
6302 StringRef getName() const override { return "AANoAliasAddrSpace"; }
6303
6304 /// See AbstractAttribute::getIdAddr()
6305 const char *getIdAddr() const override { return &ID; }
6306
6307 /// This function should return true if the type of the \p AA is
6308 /// AAAssumptionInfo
6309 static bool classof(const AbstractAttribute *AA) {
6310 return (AA->getIdAddr() == &ID);
6311 }
6312
6313 /// Unique ID (due to the unique address)
6314 LLVM_ABI static const char ID;
6315
6316protected:
6319};
6320
6321struct AAAllocationInfo : public StateWrapper<BooleanState, AbstractAttribute> {
6324
6325 /// See AbstractAttribute::isValidIRPositionForInit
6328 return false;
6330 }
6331
6332 /// Create an abstract attribute view for the position \p IRP.
6334 Attributor &A);
6335
6336 virtual std::optional<TypeSize> getAllocatedSize() const = 0;
6337
6338 /// See AbstractAttribute::getName()
6339 StringRef getName() const override { return "AAAllocationInfo"; }
6340
6341 /// See AbstractAttribute::getIdAddr()
6342 const char *getIdAddr() const override { return &ID; }
6343
6344 /// This function should return true if the type of the \p AA is
6345 /// AAAllocationInfo
6346 static bool classof(const AbstractAttribute *AA) {
6347 return (AA->getIdAddr() == &ID);
6348 }
6349
6350 constexpr static const std::optional<TypeSize> HasNoAllocationSize =
6351 std::make_optional<TypeSize>(-1, true);
6352
6353 LLVM_ABI static const char ID;
6354};
6355
6356/// An abstract interface for llvm::GlobalValue information interference.
6358 : public StateWrapper<BooleanState, AbstractAttribute> {
6361
6362 /// See AbstractAttribute::isValidIRPositionForInit
6365 return false;
6366 auto *GV = dyn_cast<GlobalValue>(&IRP.getAnchorValue());
6367 if (!GV)
6368 return false;
6369 return GV->hasLocalLinkage();
6370 }
6371
6372 /// Create an abstract attribute view for the position \p IRP.
6374 Attributor &A);
6375
6376 /// Return true iff \p U is a potential use of the associated global value.
6377 virtual bool isPotentialUse(const Use &U) const = 0;
6378
6379 /// See AbstractAttribute::getName()
6380 StringRef getName() const override { return "AAGlobalValueInfo"; }
6381
6382 /// See AbstractAttribute::getIdAddr()
6383 const char *getIdAddr() const override { return &ID; }
6384
6385 /// This function should return true if the type of the \p AA is
6386 /// AAGlobalValueInfo
6387 static bool classof(const AbstractAttribute *AA) {
6388 return (AA->getIdAddr() == &ID);
6389 }
6390
6391 /// Unique ID (due to the unique address)
6392 LLVM_ABI static const char ID;
6393};
6394
6395/// An abstract interface for indirect call information interference.
6397 : public StateWrapper<BooleanState, AbstractAttribute> {
6400
6401 /// See AbstractAttribute::isValidIRPositionForInit
6404 return false;
6405 auto *CB = cast<CallBase>(IRP.getCtxI());
6406 return CB->getOpcode() == Instruction::Call && CB->isIndirectCall() &&
6407 !CB->isMustTailCall();
6408 }
6409
6410 /// Create an abstract attribute view for the position \p IRP.
6412 Attributor &A);
6413
6414 /// Call \CB on each potential callee value and return true if all were known
6415 /// and \p CB returned true on all of them. Otherwise, return false.
6416 virtual bool foreachCallee(function_ref<bool(Function *)> CB) const = 0;
6417
6418 /// See AbstractAttribute::getName()
6419 StringRef getName() const override { return "AAIndirectCallInfo"; }
6420
6421 /// See AbstractAttribute::getIdAddr()
6422 const char *getIdAddr() const override { return &ID; }
6423
6424 /// This function should return true if the type of the \p AA is
6425 /// AAIndirectCallInfo
6426 /// This function should return true if the type of the \p AA is
6427 /// AADenormalFPMath.
6428 static bool classof(const AbstractAttribute *AA) {
6429 return (AA->getIdAddr() == &ID);
6430 }
6431
6432 /// Unique ID (due to the unique address)
6433 LLVM_ABI static const char ID;
6434};
6435
6436/// An abstract Attribute for specializing "dynamic" components of
6437/// denormal_fpenv to a known denormal mode.
6439 : public StateWrapper<DenormalFPMathState, AbstractAttribute> {
6441
6443
6444 /// Create an abstract attribute view for the position \p IRP.
6446 Attributor &A);
6447
6448 /// See AbstractAttribute::getName()
6449 StringRef getName() const override { return "AADenormalFPMath"; }
6450
6451 /// See AbstractAttribute::getIdAddr()
6452 const char *getIdAddr() const override { return &ID; }
6453
6454 /// This function should return true if the type of the \p AA is
6455 /// AADenormalFPMath.
6456 static bool classof(const AbstractAttribute *AA) {
6457 return (AA->getIdAddr() == &ID);
6458 }
6459
6460 /// Unique ID (due to the unique address)
6461 LLVM_ABI static const char ID;
6462};
6463
6464/// Run options, used by the pass manager.
6475
6476namespace AA {
6477/// Helper to avoid creating an AA for IR Attributes that might already be set.
6478template <Attribute::AttrKind AK, typename AAType = AbstractAttribute>
6480 const IRPosition &IRP, DepClassTy DepClass, bool &IsKnown,
6481 bool IgnoreSubsumingPositions = false,
6482 const AAType **AAPtr = nullptr) {
6483 IsKnown = false;
6484 switch (AK) {
6485#define CASE(ATTRNAME, AANAME, ...) \
6486 case Attribute::ATTRNAME: { \
6487 if (AANAME::isImpliedByIR(A, IRP, AK, IgnoreSubsumingPositions)) \
6488 return IsKnown = true; \
6489 if (!QueryingAA) \
6490 return false; \
6491 const auto *AA = A.getAAFor<AANAME>(*QueryingAA, IRP, DepClass); \
6492 if (AAPtr) \
6493 *AAPtr = reinterpret_cast<const AAType *>(AA); \
6494 if (!AA || !AA->isAssumed(__VA_ARGS__)) \
6495 return false; \
6496 IsKnown = AA->isKnown(__VA_ARGS__); \
6497 return true; \
6498 }
6499 CASE(NoUnwind, AANoUnwind, );
6500 CASE(WillReturn, AAWillReturn, );
6501 CASE(NoFree, AANoFree, );
6502 CASE(Captures, AANoCapture, );
6503 CASE(NoRecurse, AANoRecurse, );
6504 CASE(NoReturn, AANoReturn, );
6505 CASE(NoSync, AANoSync, );
6506 CASE(NoAlias, AANoAlias, );
6507 CASE(NonNull, AANonNull, );
6508 CASE(MustProgress, AAMustProgress, );
6509 CASE(NoUndef, AANoUndef, );
6513#undef CASE
6514 default:
6515 llvm_unreachable("hasAssumedIRAttr not available for this attribute kind");
6516 };
6517}
6518} // namespace AA
6519
6520} // end namespace llvm
6521
6522#endif // LLVM_TRANSFORMS_IPO_ATTRIBUTOR_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
unsigned uint64_t
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file defines the BumpPtrAllocator interface.
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
This file contains the simple types necessary to represent the attributes associated with functions a...
static cl::opt< unsigned, true > MaxPotentialValues("attributor-max-potential-values", cl::Hidden, cl::desc("Maximum number of potential values to be " "tracked for each position."), cl::location(llvm::PotentialConstantIntValuesState::MaxPotentialValues), cl::init(7))
#define CASE(ATTRNAME, AANAME,...)
static const Function * getParent(const Value *V)
block Block Frequency Analysis
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This header provides classes for managing passes over SCCs of the call graph.
This file provides interfaces used to manipulate a call graph, regardless if it is a "old style" Call...
#define LLVM_ABI
Definition Compiler.h:215
This file contains the declarations for the subclasses of Constant, which represent the different fla...
DXIL Resource Access
This file provides an implementation of debug counters.
#define DEBUG_COUNTER(VARNAME, COUNTERNAME, DESC)
This file defines the DenseSet and SmallDenseSet classes.
This file defines the little GraphTraits<X> template class that should be specialized by classes that...
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
This file implements a coalescing interval map for small objects.
Implements a lazy call graph analysis and related passes for the new pass manager.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
#define H(x, y, z)
Definition MD5.cpp:56
This file implements a map that provides insertion order iteration.
This file provides utility analysis objects describing memory locations.
Contains a collection of routines for determining if a given instruction is guaranteed to execute if ...
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
#define P(N)
ppc ctr loops verify
Basic Register Allocator
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
This file contains some templates that are useful if you are working with the STL at all.
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file defines generic set operations that may be used on set's of different types,...
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallSet class.
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
Value * RHS
Value * LHS
An Iterator for call edges, creates AACallEdges attributes in a lazy way.
LLVM_ABI AACallGraphNode * operator*() const
Class for arbitrary precision integers.
Definition APInt.h:78
CallBase * getInstruction() const
Return the underlying instruction.
int getCallArgOperandNo(Argument &Arg) const
Return the operand index of the underlying instruction associated with Arg.
unsigned getNumArgOperands() const
Return the number of parameters of the callee.
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
const Function * getParent() const
Definition Argument.h:44
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
This represents the llvm.assume intrinsic.
This class stores enough information to efficiently remove some attributes from an existing AttrBuild...
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:410
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:106
static LLVM_ABI Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
Definition Attributes.h:125
@ None
No attributes have been set.
Definition Attributes.h:127
static bool isEnumAttrKind(AttrKind Kind)
Definition Attributes.h:139
LLVM Basic Block Representation.
Definition BasicBlock.h:62
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
const Use & getArgOperandUse(unsigned i) const
Wrappers for getting the Use of a call argument.
Wrapper to unify "old style" CallGraph and "new style" LazyCallGraph.
This class represents a range of values.
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
static bool shouldExecute(CounterInfo &Counter)
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
Analysis pass which computes a DominatorTree.
Definition Dominators.h:241
An instruction for ordering other memory operations.
Argument * arg_iterator
Definition Function.h:73
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:329
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
Definition Function.h:332
Type * getReturnType() const
Returns the type of the ret val.
Definition Function.h:217
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:734
bool hasLocalLinkage() const
typename Sizer::Allocator Allocator
Invoke instruction.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:71
An SCC of the call graph.
A lazily constructed view of the call graph of a module.
An instruction for reading from memory.
Analysis pass that exposes the LoopInfo for a function.
Definition LoopInfo.h:594
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:38
bool onlyReadsMemory() const
Whether this function only (at most) reads memory.
Definition ModRef.h:249
static MemoryEffectsBase unknown()
Definition ModRef.h:123
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
The optimization diagnostic interface.
Pass interface - Implemented by all 'passes'.
Definition Pass.h:99
PointerIntPair - This class implements a pair of a pointer and small integer.
PointerTy getPointer() const
void setFromOpaqueValue(void *Val) &
Analysis pass which computes a PostDominatorTree.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
A vector that has set insertion semantics.
Definition SetVector.h:57
size_type size() const
Determine the number of elements in the SetVector.
Definition SetVector.h:103
typename vector_type::const_iterator iterator
Definition SetVector.h:72
bool empty() const
Determine if the SetVector is empty or not.
Definition SetVector.h:100
iterator begin()
Get an iterator to the beginning of the SetVector.
Definition SetVector.h:112
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
iterator find(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:345
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition SmallSet.h:134
SmallSetIterator< int64_t, N, std::less< int64_t > > const_iterator
Definition SmallSet.h:150
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
Definition SmallSet.h:184
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
std::string str() const
Get the contents as an std::string.
Definition StringRef.h:222
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition StringRef.h:258
LLVM_ABI SubsumingPositionIterator(const IRPosition &IRP)
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
The TimeTraceScope is a helper class to call the begin and end functions of the time trace profiler.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:277
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition Type.h:280
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:252
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:712
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
An efficient, type-erasing, non-owning reference to a callable.
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Abstract Attribute helper functions.
Definition Attributor.h:165
LLVM_ABI bool isAssumedReadNone(Attributor &A, const IRPosition &IRP, const AbstractAttribute &QueryingAA, bool &IsKnown)
Return true if IRP is readnone.
LLVM_ABI bool isAssumedReadOnly(Attributor &A, const IRPosition &IRP, const AbstractAttribute &QueryingAA, bool &IsKnown)
Return true if IRP is readonly.
raw_ostream & operator<<(raw_ostream &OS, const RangeTy &R)
Definition Attributor.h:327
LLVM_ABI std::optional< Value * > combineOptionalValuesInAAValueLatice(const std::optional< Value * > &A, const std::optional< Value * > &B, Type *Ty)
Return the combination of A and B such that the result is a possible value of both.
LLVM_ABI bool isValidAtPosition(const ValueAndContext &VAC, InformationCache &InfoCache)
Return true if the value of VAC is a valid at the position of VAC, that is a constant,...
LLVM_ABI bool isAssumedThreadLocalObject(Attributor &A, Value &Obj, const AbstractAttribute &QueryingAA)
Return true if Obj is assumed to be a thread local object.
LLVM_ABI bool isGPUConstantAddressSpace(const Module &M, unsigned AS)
Check if the given address space AS corresponds to a GPU constant address space for the target triple...
LLVM_ABI bool isDynamicallyUnique(Attributor &A, const AbstractAttribute &QueryingAA, const Value &V, bool ForAnalysisOnly=true)
Return true if V is dynamically unique, that is, there are no two "instances" of V at runtime with di...
LLVM_ABI bool getPotentialCopiesOfStoredValue(Attributor &A, StoreInst &SI, SmallSetVector< Value *, 4 > &PotentialCopies, const AbstractAttribute &QueryingAA, bool &UsedAssumedInformation, bool OnlyExact=false)
Collect all potential values of the one stored by SI into PotentialCopies.
LLVM_ABI bool isGPUSharedAddressSpace(const Module &M, unsigned AS)
Check if the given address space AS corresponds to a GPU shared address space for the target triple i...
bool operator!=(const RangeTy &A, const RangeTy &B)
Definition Attributor.h:336
LLVM_ABI bool isGPULocalAddressSpace(const Module &M, unsigned AS)
Check if the given address space AS corresponds to a GPU local/private address space for the target t...
LLVM_ABI bool isPotentiallyAffectedByBarrier(Attributor &A, const Instruction &I, const AbstractAttribute &QueryingAA)
Return true if I is potentially affected by a barrier.
SmallPtrSet< Instruction *, 4 > InstExclusionSetTy
Definition Attributor.h:166
LLVM_ABI bool isGPU(const Module &M)
Return true iff M target a GPU (and we can use GPU AS reasoning).
LLVM_ABI Constant * getInitialValueForObj(Attributor &A, const AbstractAttribute &QueryingAA, Value &Obj, Type &Ty, const TargetLibraryInfo *TLI, const DataLayout &DL, RangeTy *RangePtr=nullptr)
Return the initial value of Obj with type Ty if that is a constant.
bool operator==(const RangeTy &A, const RangeTy &B)
Definition Attributor.h:332
ValueScope
Flags to distinguish intra-procedural queries from potentially inter-procedural queries.
Definition Attributor.h:186
@ Intraprocedural
Definition Attributor.h:187
@ Interprocedural
Definition Attributor.h:188
LLVM_ABI bool isValidInScope(const Value &V, const Function *Scope)
Return true if V is a valid value in Scope, that is a constant or an instruction/argument of Scope.
LLVM_ABI bool isPotentiallyReachable(Attributor &A, const Instruction &FromI, const Instruction &ToI, const AbstractAttribute &QueryingAA, const AA::InstExclusionSetTy *ExclusionSet=nullptr, std::function< bool(const Function &F)> GoBackwardsCB=nullptr)
Return true if ToI is potentially reachable from FromI without running into any instruction in Exclus...
LLVM_ABI bool isNoSyncInst(Attributor &A, const Instruction &I, const AbstractAttribute &QueryingAA)
Return true if I is a nosync instruction.
bool hasAssumedIRAttr(Attributor &A, const AbstractAttribute *QueryingAA, const IRPosition &IRP, DepClassTy DepClass, bool &IsKnown, bool IgnoreSubsumingPositions=false, const AAType **AAPtr=nullptr)
Helper to avoid creating an AA for IR Attributes that might already be set.
LLVM_ABI bool getPotentiallyLoadedValues(Attributor &A, LoadInst &LI, SmallSetVector< Value *, 4 > &PotentialValues, SmallSetVector< Instruction *, 4 > &PotentialValueOrigins, const AbstractAttribute &QueryingAA, bool &UsedAssumedInformation, bool OnlyExact=false)
Collect all potential values LI could read into PotentialValues.
LLVM_ABI Value * getWithType(Value &V, Type &Ty)
Try to convert V to type Ty without introducing new instructions.
E & operator^=(E &LHS, E RHS)
NodeAddr< UseNode * > Use
Definition RDFGraph.h:385
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
bool isEqual(const GCNRPTracker::LiveRegSet &S1, const GCNRPTracker::LiveRegSet &S2)
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1685
LLVM_ABI unsigned MaxInitializationChainLength
The value passed to the line option that defines the maximal initialization chain length.
RelativeUniformCounterPtr Values
Definition InstrProf.h:91
APInt operator&(APInt a, const APInt &b)
Definition APInt.h:2149
@ Known
Known to have no common set bits.
void set_intersect(S1Ty &S1, const S2Ty &S2)
set_intersect(A, B) - Compute A := A ^ B Identical to set_intersection, except that it works on set<>...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
bool operator!=(uint64_t V1, const APInt &V2)
Definition APInt.h:2139
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt & operator+=(DynamicAPInt &A, int64_t B)
bool set_is_subset(const S1Ty &S1, const S2Ty &S2)
set_is_subset(A, B) - Return true iff A in B
auto cast_or_null(const Y &Val)
Definition Casting.h:714
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
Definition ModRef.h:356
bool isa_and_nonnull(const Y &Val)
Definition Casting.h:676
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
AttributorRunOption
Run options, used by the pass manager.
@ CGSCC_LIGHT
@ MODULE_LIGHT
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
AnalysisManager< LazyCallGraph::SCC, LazyCallGraph & > CGSCCAnalysisManager
The CGSCC analysis manager.
LLVM_ABI bool canSimplifyInvokeNoUnwind(const Function *F)
DenseMap< RetainedKnowledgeKey, Assume2KnowledgeMap > RetainedKnowledgeMap
PotentialValuesState< std::pair< AA::ValueAndContext, AA::ValueScope > > PotentialLLVMValuesState
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
bool set_union(S1Ty &S1, const S2Ty &S2)
set_union(A, B) - Compute A := A u B, return whether A changed.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
@ Success
The lock was released successfully.
iterator_range(Container &&) -> iterator_range< llvm::detail::IterOfRange< Container > >
@ Other
Any other memory.
Definition ModRef.h:68
PotentialValuesState< APInt > PotentialConstantIntValuesState
bool operator&=(SparseBitVector< ElementSize > *LHS, const SparseBitVector< ElementSize > &RHS)
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
ChangeStatus clampStateAndIndicateChange(StateType &S, const StateType &R)
Helper function to clamp a state S of type StateType with the information in R and indicate/return if...
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1933
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
Definition iterator.h:368
ChangeStatus
{
Definition Attributor.h:477
bool operator|=(SparseBitVector< ElementSize > &LHS, const SparseBitVector< ElementSize > *RHS)
@ OPTIONAL
The target may be valid if the source is not.
Definition Attributor.h:489
@ NONE
Do not track a dependence between source and target.
Definition Attributor.h:490
@ REQUIRED
The target cannot be valid if the source is not.
Definition Attributor.h:488
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
APInt operator|(APInt a, const APInt &b)
Definition APInt.h:2169
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:391
IncIntegerState< uint64_t, Value::MaximumAlignment, 1 > AAAlignmentStateType
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
static LLVM_ABI AAAddressSpace & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static bool requiresCallersForArgOrFunction()
See AbstractAttribute::requiresCallersForArgOrFunction.
StringRef getName() const override
See AbstractAttribute::getName()
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAAssumptionInfo.
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
virtual uint32_t getAddressSpace() const =0
Return the address space of the associated value.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
AAAddressSpace(const IRPosition &IRP, Attributor &A)
static const uint32_t InvalidAddressSpace
AAAlign(const IRPosition &IRP, Attributor &A)
static LLVM_ABI AAAlign & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
Align getAssumedAlign() const
Return assumed alignment.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAAlign.
Align getKnownAlign() const
Return known alignment.
StringRef getName() const override
See AbstractAttribute::getName()
static LLVM_ABI const char ID
virtual std::optional< TypeSize > getAllocatedSize() const =0
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static LLVM_ABI AAAllocationInfo & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
StringRef getName() const override
See AbstractAttribute::getName()
AAAllocationInfo(const IRPosition &IRP, Attributor &A)
static constexpr const std::optional< TypeSize > HasNoAllocationSize
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAAllocationInfo.
AAAssumptionInfo(const IRPosition &IRP, Attributor &A, const DenseSet< StringRef > &Known)
static LLVM_ABI const char ID
Unique ID (due to the unique address)
StringRef getName() const override
See AbstractAttribute::getName()
static LLVM_ABI AAAssumptionInfo & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
StateWrapper< SetState< StringRef >, AbstractAttribute, DenseSet< StringRef > > Base
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAAssumptionInfo.
virtual bool hasAssumption(const StringRef Assumption) const =0
Returns true if the assumption set contains the assumption Assumption.
An abstract state for querying live call edges.
AACallEdges(const IRPosition &IRP, Attributor &A)
virtual const SetVector< Function * > & getOptimisticEdges() const =0
Get the optimistic edges.
static bool requiresNonAsmForCallBase()
See AbstractAttribute::requiresNonAsmForCallBase.
StateWrapper< BooleanState, AbstractAttribute > Base
AACallEdgeIterator optimisticEdgesBegin() const override
Iterator for exploring the call graph.
virtual bool hasUnknownCallee() const =0
Is there any call with a unknown callee.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
StringRef getName() const override
See AbstractAttribute::getName()
virtual bool hasNonAsmUnknownCallee() const =0
Is there any call with a unknown callee, excluding any inline asm.
AACallEdgeIterator optimisticEdgesEnd() const override
Iterator for exploring the call graph.
static LLVM_ABI AACallEdges & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AACallEdges.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
iterator_range< AACallEdgeIterator > optimisticEdgesRange() const
Iterator range for exploring the call graph.
virtual AACallEdgeIterator optimisticEdgesBegin() const =0
AACallGraphNode(Attributor &A)
virtual AACallEdgeIterator optimisticEdgesEnd() const =0
virtual ~AACallGraphNode()=default
Attributor & A
Reference to Attributor needed for GraphTraits implementation.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
StringRef getName() const override
See AbstractAttribute::getName()
AADenormalFPMath(const IRPosition &IRP, Attributor &A)
static LLVM_ABI const char ID
Unique ID (due to the unique address)
StateWrapper< DenormalFPMathState, AbstractAttribute > Base
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AADenormalFPMath.
static LLVM_ABI AADenormalFPMath & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static AbstractAttribute * DepGetValAA(const DepTy &DT)
Definition Attributor.h:507
friend struct Attributor
Definition Attributor.h:528
mapped_iterator< DepSetTy::iterator, decltype(&DepGetVal)> iterator
Definition Attributor.h:514
mapped_iterator< DepSetTy::iterator, decltype(&DepGetValAA)> aaiterator
Definition Attributor.h:515
virtual ~AADepGraphNode()=default
SmallSetVector< DepTy, 2 > DepSetTy
Definition Attributor.h:499
static AADepGraphNode * DepGetVal(const DepTy &DT)
Definition Attributor.h:506
iterator child_begin()
Definition Attributor.h:520
DepSetTy Deps
Set of dependency graph nodes which should be updated if this one is updated.
Definition Attributor.h:504
friend struct AADepGraph
Definition Attributor.h:529
virtual void print(Attributor *, raw_ostream &OS) const
Definition Attributor.h:524
aaiterator begin()
Definition Attributor.h:518
PointerIntPair< AADepGraphNode *, 1 > DepTy
Definition Attributor.h:498
void print(raw_ostream &OS) const
Definition Attributor.h:523
The data structure for the dependency graph.
Definition Attributor.h:537
~AADepGraph()=default
iterator begin()
Definition Attributor.h:552
mapped_iterator< AADepGraphNode::DepSetTy::iterator, decltype(&DepGetVal)> iterator
Definition Attributor.h:543
LLVM_ABI void viewGraph()
AADepGraphNode SyntheticRoot
There is no root node for the dependency graph.
Definition Attributor.h:549
LLVM_ABI void print()
Print dependency graph.
static AADepGraphNode * DepGetVal(const DepTy &DT)
Definition Attributor.h:542
iterator end()
Definition Attributor.h:553
LLVM_ABI void dumpGraph()
Dump graph to file.
AADepGraphNode * GetEntryNode()
Definition Attributor.h:550
AADepGraph()=default
AADepGraphNode::DepTy DepTy
Definition Attributor.h:541
uint32_t getKnownDereferenceableBytes() const
Return known dereferenceable bytes.
bool isAssumedGlobal() const
Return true if we assume that underlying value is dereferenceable(_or_null) globally.
bool isKnownGlobal() const
Return true if we know that underlying value is dereferenceable(_or_null) globally.
AADereferenceable(const IRPosition &IRP, Attributor &A)
uint32_t getAssumedDereferenceableBytes() const
Return assumed dereferenceable bytes.
StringRef getName() const override
See AbstractAttribute::getName()
static LLVM_ABI const char ID
Unique ID (due to the unique address)
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AADereferenceable.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
static LLVM_ABI AADereferenceable & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
Summary about the execution domain of a block or instruction.
void addAssumeInst(Attributor &A, AssumeInst &AI)
SmallPtrSet< AssumeInst *, 4 > AssumesSetTy
void addAlignedBarrier(Attributor &A, CallBase &CB)
SmallPtrSet< CallBase *, 2 > BarriersSetTy
virtual bool isExecutedByInitialThreadOnly(const BasicBlock &) const =0
Check if a basic block is executed only by the initial thread.
StateWrapper< BooleanState, AbstractAttribute > Base
bool isExecutedByInitialThreadOnly(const Instruction &I) const
Check if an instruction is executed only by the initial thread.
static LLVM_ABI AAExecutionDomain & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAExecutionDomain.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr().
virtual ExecutionDomainTy getFunctionExecutionDomain() const =0
virtual ExecutionDomainTy getExecutionDomain(const BasicBlock &) const =0
virtual bool isExecutedInAlignedRegion(Attributor &A, const Instruction &I) const =0
Check if the instruction I is executed in an aligned region, that is, the synchronizing effects befor...
AAExecutionDomain(const IRPosition &IRP, Attributor &A)
virtual bool isNoOpFence(const FenceInst &FI) const =0
Helper function to determine if FI is a no-op given the information about its execution from ExecDoma...
StringRef getName() const override
See AbstractAttribute::getName().
virtual std::pair< ExecutionDomainTy, ExecutionDomainTy > getExecutionDomain(const CallBase &CB) const =0
Return the execution domain with which the call CB is entered and the one with which it is left.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAGlobalValueInfo.
AAGlobalValueInfo(const IRPosition &IRP, Attributor &A)
StringRef getName() const override
See AbstractAttribute::getName()
static LLVM_ABI AAGlobalValueInfo & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static LLVM_ABI const char ID
Unique ID (due to the unique address)
virtual bool isPotentialUse(const Use &U) const =0
Return true iff U is a potential use of the associated global value.
StringRef getName() const override
See AbstractAttribute::getName()
StateWrapper< BooleanState, AbstractAttribute > Base
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAHeapToStack.
virtual bool isAssumedHeapToStack(const CallBase &CB) const =0
Returns true if HeapToStack conversion is assumed to be possible.
virtual bool isAssumedHeapToStackRemovedFree(CallBase &CB) const =0
Returns true if HeapToStack conversion is assumed and the CB is a callsite to a free operation to be ...
static LLVM_ABI const char ID
Unique ID (due to the unique address)
static LLVM_ABI AAHeapToStack & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
AAHeapToStack(const IRPosition &IRP, Attributor &A)
StringRef getName() const override
See AbstractAttribute::getName()
virtual bool foreachCallee(function_ref< bool(Function *)> CB) const =0
Call \CB on each potential callee value and return true if all were known and CB returned true on all...
AAIndirectCallInfo(const IRPosition &IRP, Attributor &A)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAIndirectCallInfo This function should ret...
static LLVM_ABI const char ID
Unique ID (due to the unique address)
static LLVM_ABI AAIndirectCallInfo & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
StringRef getName() const override
See AbstractAttribute::getName()
AAInstanceInfo(const IRPosition &IRP, Attributor &A)
bool isAssumedUniqueForAnalysis() const
Return true if we assume that the underlying value is unique in its scope wrt.
static LLVM_ABI AAInstanceInfo & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAInstanceInfo.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AACallEdges.
static LLVM_ABI AAInterFnReachability & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
bool canReach(Attributor &A, const Function &Fn) const
If the function represented by this possition can reach Fn.
StringRef getName() const override
See AbstractAttribute::getName()
virtual bool instructionCanReach(Attributor &A, const Instruction &Inst, const Function &Fn, const AA::InstExclusionSetTy *ExclusionSet=nullptr) const =0
Can Inst reach Fn.
AAInterFnReachability(const IRPosition &IRP, Attributor &A)
StateWrapper< BooleanState, AbstractAttribute > Base
static LLVM_ABI AAIntraFnReachability & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAIntraFnReachability.
AAIntraFnReachability(const IRPosition &IRP, Attributor &A)
StringRef getName() const override
See AbstractAttribute::getName()
static LLVM_ABI const char ID
Unique ID (due to the unique address)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
virtual bool isAssumedReachable(Attributor &A, const Instruction &From, const Instruction &To, const AA::InstExclusionSetTy *ExclusionSet=nullptr) const =0
Returns true if 'From' instruction is assumed to reach, 'To' instruction.
StateWrapper< BooleanState, AbstractAttribute > Base
An abstract interface for identifying pointers from which loads can be marked invariant.
virtual bool isAssumedInvariant() const =0
Return true if the pointer's contents are assumed to remain invariant.
static LLVM_ABI AAInvariantLoadPointer & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
virtual bool isAssumedLocallyInvariant() const =0
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAInvariantLoadPointer.
static LLVM_ABI const char ID
Unique ID (due to the unique address).
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr().
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
StringRef getName() const override
See AbstractAttribute::getName().
virtual bool isKnownInvariant() const =0
Return true if the pointer's contents are known to remain invariant.
AAInvariantLoadPointer(const IRPosition &IRP)
virtual bool isKnownLocallyInvariant() const =0
An abstract interface for liveness abstract attribute.
friend struct Attributor
virtual bool isKnownDead(const BasicBlock *BB) const =0
Returns true if BB is known dead.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAIsDead.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
virtual bool isKnownDead() const =0
Returns true if the underlying value is known dead.
virtual bool isEdgeDead(const BasicBlock *From, const BasicBlock *To) const
Return if the edge from From BB to To BB is assumed dead.
virtual bool isAssumedDead(const Instruction *I) const =0
Returns true if I is assumed dead.
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
StringRef getName() const override
See AbstractAttribute::getName()
virtual bool isAssumedDead() const =0
The query functions are protected such that other attributes need to go through the Attributor interf...
virtual bool isRemovableStore() const
Return true if the underlying value is a store that is known to be removable.
virtual bool isAssumedDead(const BasicBlock *BB) const =0
Returns true if BB is assumed dead.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
StateWrapper< BitIntegerState< uint8_t, 3, 0 >, AbstractAttribute > Base
static LLVM_ABI AAIsDead & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static bool mayCatchAsynchronousExceptions(const Function &F)
Determine if F might catch asynchronous exceptions.
AAIsDead(const IRPosition &IRP, Attributor &A)
virtual bool isKnownDead(const Instruction *I) const =0
Returns true if I is known dead.
An abstract interface for memory access kind related attributes (readnone/readonly/writeonly).
StringRef getName() const override
See AbstractAttribute::getName()
bool isAssumedReadOnly() const
Return true if we assume that the underlying value is not accessed (=written) in its respective scope...
static LLVM_ABI AAMemoryBehavior & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static bool hasTrivialInitializer()
See AbstractAttribute::hasTrivialInitializer.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAMemoryBehavior.
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
bool isKnownReadNone() const
Return true if we know that the underlying value is not read or accessed in its respective scope.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
bool isKnownWriteOnly() const
Return true if we know that the underlying value is not read in its respective scope.
bool isAssumedReadNone() const
Return true if we assume that the underlying value is not read or accessed in its respective scope.
bool isAssumedWriteOnly() const
Return true if we assume that the underlying value is not read in its respective scope.
AAMemoryBehavior(const IRPosition &IRP, Attributor &A)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
bool isKnownReadOnly() const
Return true if we know that the underlying value is not accessed (=written) in its respective scope.
StringRef getName() const override
See AbstractAttribute::getName()
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
bool isAssumedStackOnly() const
Return true if we assume that the associated functions has at most local/stack accesses.
static LLVM_ABI std::string getMemoryLocationsAsStr(MemoryLocationsKind MLK)
Return the locations encoded by MLK as a readable string.
bool isKnownArgMemOnly() const
Return true if we know that the underlying value will only access argument pointees (see Attribute::A...
bool isKnownInaccessibleOrArgMemOnly() const
Return true if we know that the underlying value will only access inaccesible memory or argument poin...
static LLVM_ABI const char ID
Unique ID (due to the unique address)
AAMemoryLocation(const IRPosition &IRP, Attributor &A)
bool isKnownReadNone() const
Return true if we know that the associated functions has no observable accesses.
bool isAssumedSpecifiedMemOnly(MemoryLocationsKind MLK) const
Return true if only the memory locations specififed by MLK are assumed to be accessed by the associat...
bool isAssumedInaccessibleMemOnly() const
Return true if we assume that the underlying value will only access inaccesible memory only (see Attr...
bool isKnownInaccessibleMemOnly() const
Return true if we know that the underlying value will only access inaccesible memory only (see Attrib...
static LLVM_ABI AAMemoryLocation & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
bool isAssumedInaccessibleOrArgMemOnly() const
Return true if we assume that the underlying value will only access inaccesible memory or argument po...
bool isKnowStackOnly() const
Return true if we know that the associated functions has at most local/stack accesses.
static bool requiresCalleeForCallBase()
See AbstractAttribute::requiresCalleeForCallBase.
AccessKind
Simple enum to distinguish read/write/read-write accesses.
StateType::base_t MemoryLocationsKind
MemoryLocationsKind getAssumedNotAccessedLocation() const
Return the locations that are assumed to be not accessed by the associated function,...
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAMemoryLocation.
static bool hasTrivialInitializer()
See AbstractAttribute::hasTrivialInitializer.
bool isAssumedReadNone() const
Return true if we assume that the associated functions has no observable accesses.
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
virtual bool checkForAllAccessesToMemoryKind(function_ref< bool(const Instruction *, const Value *, AccessKind, MemoryLocationsKind)> Pred, MemoryLocationsKind MLK) const =0
Check Pred on all accesses to the memory kinds specified by MLK.
const std::string getAsStr(Attributor *A) const override
See AbstractState::getAsStr(Attributor).
bool mayAccessArgMem() const
Return true if the underlying value may access memory through arguement pointers of the associated fu...
bool isAssumedArgMemOnly() const
Return true if we assume that the underlying value will only access argument pointees (see Attribute:...
static MemoryLocationsKind inverseLocation(MemoryLocationsKind Loc, bool AndLocalMem, bool AndConstMem)
Return the inverse of location Loc, thus for NO_XXX the return describes ONLY_XXX.
An abstract interface for all nonnull attributes.
StringRef getName() const override
See AbstractAttribute::getName()
bool isKnownMustProgress() const
Return true if we know that underlying value is nonnull.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAMustProgress.
bool isAssumedMustProgress() const
Return true if we assume that the underlying value is nonnull.
static bool isImpliedByIR(Attributor &A, const IRPosition &IRP, Attribute::AttrKind ImpliedAttributeKind, bool IgnoreSubsumingPositions=false)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static LLVM_ABI AAMustProgress & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
AAMustProgress(const IRPosition &IRP, Attributor &A)
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAAssumptionInfo.
static bool requiresCallersForArgOrFunction()
See AbstractAttribute::requiresCallersForArgOrFunction.
IntervalMap< unsigned, bool > RangeMap
static LLVM_ABI AANoAliasAddrSpace & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
AANoAliasAddrSpace(const IRPosition &IRP, Attributor &A)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
StateWrapper< BooleanState, AbstractAttribute > Base
RangeMap::Allocator Allocator
StringRef getName() const override
See AbstractAttribute::getName()
An abstract interface for all noalias attributes.
static LLVM_ABI bool isImpliedByIR(Attributor &A, const IRPosition &IRP, Attribute::AttrKind ImpliedAttributeKind, bool IgnoreSubsumingPositions=false)
See IRAttribute::isImpliedByIR.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AANoAlias.
StringRef getName() const override
See AbstractAttribute::getName()
static bool requiresCallersForArgOrFunction()
See AbstractAttribute::requiresCallersForArgOrFunction.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
bool isKnownNoAlias() const
Return true if we know that underlying value is noalias.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
bool isAssumedNoAlias() const
Return true if we assume that the underlying value is alias.
static LLVM_ABI AANoAlias & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
AANoAlias(const IRPosition &IRP, Attributor &A)
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
An abstract interface for all nocapture attributes.
static LLVM_ABI AANoCapture & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
@ NO_CAPTURE_MAYBE_RETURNED
If we do not capture the value in memory or through integers we can only communicate it back as a der...
@ NO_CAPTURE
If we do not capture the value in memory, through integers, or as a derived pointer we know it is not...
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
AANoCapture(const IRPosition &IRP, Attributor &A)
StringRef getName() const override
See AbstractAttribute::getName()
static LLVM_ABI const char ID
Unique ID (due to the unique address)
bool isAssumedNoCaptureMaybeReturned() const
Return true if we assume that the underlying value is not captured in its respective scope but we all...
bool isKnownNoCapture() const
Return true if we know that the underlying value is not captured in its respective scope.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AANoCapture.
bool isKnownNoCaptureMaybeReturned() const
Return true if we know that the underlying value is not captured in its respective scope but we allow...
static LLVM_ABI bool isImpliedByIR(Attributor &A, const IRPosition &IRP, Attribute::AttrKind ImpliedAttributeKind, bool IgnoreSubsumingPositions=false)
See IRAttribute::isImpliedByIR.
bool isAssumedNoCapture() const
Return true if we assume that the underlying value is not captured in its respective scope.
static LLVM_ABI void determineFunctionCaptureCapabilities(const IRPosition &IRP, const Function &F, BitIntegerState &State)
Update State according to the capture capabilities of F for position IRP.
FPClassTest getAssumedNoFPClass() const
Return the underlying assumed nofpclass.
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
AANoFPClass(const IRPosition &IRP, Attributor &A)
StringRef getName() const override
See AbstractAttribute::getName()
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AANoFPClass.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
FPClassTest getKnownNoFPClass() const
Return the underlying known nofpclass.
StateWrapper< BitIntegerState< uint32_t, fcAllFlags, fcNone >, AbstractAttribute > Base
static LLVM_ABI AANoFPClass & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
An AbstractAttribute for nofree.
bool isKnownNoFree() const
Return true if "nofree" is known.
static LLVM_ABI AANoFree & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
AANoFree(const IRPosition &IRP, Attributor &A)
static bool isImpliedByIR(Attributor &A, const IRPosition &IRP, Attribute::AttrKind ImpliedAttributeKind, bool IgnoreSubsumingPositions=false)
See IRAttribute::isImpliedByIR.
bool isAssumedNoFree() const
Return true if "nofree" is assumed.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AANoFree.
StringRef getName() const override
See AbstractAttribute::getName()
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
An abstract attribute for norecurse.
StringRef getName() const override
See AbstractAttribute::getName()
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AANoRecurse.
AANoRecurse(const IRPosition &IRP, Attributor &A)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
bool isAssumedNoRecurse() const
Return true if "norecurse" is assumed.
static LLVM_ABI AANoRecurse & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
bool isKnownNoRecurse() const
Return true if "norecurse" is known.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
An AbstractAttribute for noreturn.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AANoReturn.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
bool isAssumedNoReturn() const
Return true if the underlying object is assumed to never return.
static LLVM_ABI AANoReturn & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
StringRef getName() const override
See AbstractAttribute::getName()
AANoReturn(const IRPosition &IRP, Attributor &A)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
bool isKnownNoReturn() const
Return true if the underlying object is known to never return.
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
AANoSync(const IRPosition &IRP, Attributor &A)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
StringRef getName() const override
See AbstractAttribute::getName()
static bool isImpliedByIR(Attributor &A, const IRPosition &IRP, Attribute::AttrKind ImpliedAttributeKind, bool IgnoreSubsumingPositions=false)
static LLVM_ABI const char ID
Unique ID (due to the unique address)
static LLVM_ABI bool isAlignedBarrier(const CallBase &CB, bool ExecutedAligned)
Helper function to determine if CB is an aligned (GPU) barrier.
bool isAssumedNoSync() const
Returns true if "nosync" is assumed.
static LLVM_ABI bool isNonRelaxedAtomic(const Instruction *I)
Helper function used to determine whether an instruction is non-relaxed atomic.
bool isKnownNoSync() const
Returns true if "nosync" is known.
static LLVM_ABI AANoSync & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AANoSync.
An abstract interface for all noundef attributes.
bool isKnownNoUndef() const
Return true if we know that underlying value is noundef.
static bool isImpliedByUndef()
See IRAttribute::isImpliedByUndef.
StringRef getName() const override
See AbstractAttribute::getName()
bool isAssumedNoUndef() const
Return true if we assume that the underlying value is noundef.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AANoUndef.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static LLVM_ABI AANoUndef & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
AANoUndef(const IRPosition &IRP, Attributor &A)
static LLVM_ABI const char ID
Unique ID (due to the unique address)
static bool isImpliedByPoison()
See IRAttribute::isImpliedByPoison.
static LLVM_ABI bool isImpliedByIR(Attributor &A, const IRPosition &IRP, Attribute::AttrKind ImpliedAttributeKind, bool IgnoreSubsumingPositions=false)
See IRAttribute::isImpliedByIR.
AANoUnwind(const IRPosition &IRP, Attributor &A)
bool isAssumedNoUnwind() const
Returns true if nounwind is assumed.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AANoUnwind.
StringRef getName() const override
See AbstractAttribute::getName()
static LLVM_ABI AANoUnwind & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
bool isKnownNoUnwind() const
Returns true if nounwind is known.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static LLVM_ABI const char ID
Unique ID (due to the unique address)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
StateWrapper< BooleanState, AbstractAttribute > Base
static LLVM_ABI AANonConvergent & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
StringRef getName() const override
See AbstractAttribute::getName()
bool isAssumedNotConvergent() const
Return true if "non-convergent" is assumed.
bool isKnownNotConvergent() const
Return true if "non-convergent" is known.
AANonConvergent(const IRPosition &IRP, Attributor &A)
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AANonConvergent.
An abstract interface for all nonnull attributes.
static bool isImpliedByUndef()
See IRAttribute::isImpliedByUndef.
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AANonNull.
static LLVM_ABI AANonNull & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
AANonNull(const IRPosition &IRP, Attributor &A)
StringRef getName() const override
See AbstractAttribute::getName()
static LLVM_ABI bool isImpliedByIR(Attributor &A, const IRPosition &IRP, Attribute::AttrKind ImpliedAttributeKind, bool IgnoreSubsumingPositions=false)
See AbstractAttribute::isImpliedByIR(...).
bool isAssumedNonNull() const
Return true if we assume that the underlying value is nonnull.
bool isKnownNonNull() const
Return true if we know that underlying value is nonnull.
static bool hasTrivialInitializer()
See AbstractAttribute::hasTrivialInitializer.
An access description.
bool isWrittenValueUnknown() const
Return true if the value written cannot be determined at all.
const_iterator end() const
bool operator!=(const Access &R) const
std::optional< Value * > getContent() const
Return the written value which can be llvm::null if it is not yet determined.
Access & operator=(const Access &Other)=default
bool isAssumption() const
Return true if this is an assumption access.
const RangeList & getRanges() const
bool isWriteOrAssumption() const
Return true if this is a write access.
bool isRead() const
Return true if this is a read access.
bool isWrite() const
Return true if this is a write access.
Value * getWrittenValue() const
Return the value writen, if any.
Instruction * getLocalInst() const
Return the instruction that causes the access with respect to the local scope of the associated attri...
Access(Instruction *LocalI, Instruction *RemoteI, const RangeList &Ranges, std::optional< Value * > Content, AccessKind K, Type *Ty)
Access(Instruction *LocalI, Instruction *RemoteI, int64_t Offset, int64_t Size, std::optional< Value * > Content, AccessKind Kind, Type *Ty)
Access(Instruction *I, int64_t Offset, int64_t Size, std::optional< Value * > Content, AccessKind Kind, Type *Ty)
Access(const Access &Other)=default
Type * getType() const
Return the type associated with the access, if known.
Access & operator&=(const Access &R)
const_iterator begin() const
RangeList::const_iterator const_iterator
Instruction * getRemoteInst() const
Return the actual instruction that causes the access.
bool operator==(const Access &R) const
bool isWrittenValueYetUndetermined() const
Return true if the value written is not known yet.
AccessKind getKind() const
Return the access kind.
A helper containing a list of offsets computed for a Use.
SmallSet< int64_t, 4 > VecTy
VecTy::const_iterator const_iterator
bool operator==(const OffsetInfo &RHS) const
bool insert(int64_t Offset)
bool operator!=(const OffsetInfo &RHS) const
const_iterator begin() const
const_iterator end() const
bool merge(const OffsetInfo &R)
Copy offsets from R into the current list.
A container for a list of ranges.
const_iterator end() const
SmallVector< RangeTy > VecTy
void addToAllOffsets(int64_t Inc)
Add the increment Inc to the offset of every range.
bool operator==(const RangeList &OI) const
RangeList(ArrayRef< int64_t > Offsets, int64_t Size)
std::pair< iterator, bool > insert(iterator Pos, const RangeTy &R)
Insert R at the given iterator Pos, and merge if necessary.
bool isUnknown() const
Return true iff the list contains an unknown range.
VecTy::const_iterator const_iterator
const_iterator begin() const
bool isUnassigned() const
Return true if no ranges have been inserted.
static void set_difference(const RangeList &L, const RangeList &R, RangeList &D)
Copy ranges from L that are not in R, into D.
bool merge(const RangeList &RHS)
Merge the ranges in RHS into the current ranges.
iterator setUnknown()
Discard all ranges and insert a single unknown range.
void push_back(const RangeTy &R)
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
virtual bool reachesReturn() const =0
StringRef getName() const override
See AbstractAttribute::getName()
virtual bool forallInterferingAccesses(Attributor &A, const AbstractAttribute &QueryingAA, Instruction &I, bool FindInterferingWrites, bool FindInterferingReads, function_ref< bool(const Access &, bool)> CB, bool &HasBeenWrittenTo, AA::RangeTy &Range, function_ref< bool(const Access &)> SkipCB=nullptr) const =0
Call CB on all accesses that might interfere with I and return true if all such accesses were known a...
virtual void addReturnedOffsetsTo(OffsetInfo &) const =0
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAPointerInfo.
OffsetBinsTy::const_iterator const_bin_iterator
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
virtual const_bin_iterator begin() const =0
DenseMap< AA::RangeTy, SmallSet< unsigned, 4 > > OffsetBinsTy
virtual bool forallInterferingAccesses(AA::RangeTy Range, function_ref< bool(const Access &, bool)> CB) const =0
Call CB on all accesses that might interfere with Range and return true if all such accesses were kno...
virtual const_bin_iterator end() const =0
static LLVM_ABI const char ID
Unique ID (due to the unique address)
static LLVM_ABI AAPointerInfo & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
AAPointerInfo(const IRPosition &IRP)
virtual int64_t numOffsetBins() const =0
An abstract interface for potential values analysis.
PotentialConstantIntValuesState & getState() override
See AbstractAttribute::getState(...).
const PotentialConstantIntValuesState & getState() const override
AAPotentialConstantValues(const IRPosition &IRP, Attributor &A)
static LLVM_ABI const char ID
Unique ID (due to the unique address)
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAPotentialConstantValues.
static bool requiresCallersForArgOrFunction()
See AbstractAttribute::requiresCallersForArgOrFunction.
unsigned getAssumedMinTrailingZeros() const
Return the minimum trailing zeros of potential constants.
std::optional< Constant * > getAssumedConstant(Attributor &A, const Instruction *CtxI=nullptr) const
Return assumed constant for the associated value.
StateWrapper< PotentialConstantIntValuesState, AbstractAttribute > Base
static LLVM_ABI AAPotentialConstantValues & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
StringRef getName() const override
See AbstractAttribute::getName()
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
friend struct Attributor
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAPotentialValues.
PotentialLLVMValuesState & getState() override
See AbstractAttribute::getState(...).
AAPotentialValues(const IRPosition &IRP, Attributor &A)
static LLVM_ABI AAPotentialValues & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
static bool requiresCallersForArgOrFunction()
See AbstractAttribute::requiresCallersForArgOrFunction.
StateWrapper< PotentialLLVMValuesState, AbstractAttribute > Base
const PotentialLLVMValuesState & getState() const override
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static LLVM_ABI const char ID
Unique ID (due to the unique address)
StringRef getName() const override
See AbstractAttribute::getName()
static LLVM_ABI Value * getSingleValue(Attributor &A, const AbstractAttribute &AA, const IRPosition &IRP, SmallVectorImpl< AA::ValueAndContext > &Values)
Extract the single value in Values if any.
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
bool isAssumedPrivatizablePtr() const
Returns true if pointer privatization is assumed to be possible.
virtual std::optional< Type * > getPrivatizableType() const =0
Return the type we can choose for a private copy of the underlying value.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
StringRef getName() const override
See AbstractAttribute::getName()
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAPricatizablePtr.
static bool requiresCallersForArgOrFunction()
See AbstractAttribute::requiresCallersForArgOrFunction.
static LLVM_ABI AAPrivatizablePtr & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
AAPrivatizablePtr(const IRPosition &IRP, Attributor &A)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
StateWrapper< BooleanState, AbstractAttribute > Base
static LLVM_ABI AAUndefinedBehavior & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static LLVM_ABI const char ID
Unique ID (due to the unique address)
virtual bool isAssumedToCauseUB(Instruction *I) const =0
Return true if "undefined behavior" is assumed for a specific instruction.
StateWrapper< BooleanState, AbstractAttribute > Base
AAUndefinedBehavior(const IRPosition &IRP, Attributor &A)
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAUndefineBehavior.
StringRef getName() const override
See AbstractAttribute::getName()
virtual bool isKnownToCauseUB(Instruction *I) const =0
Return true if "undefined behavior" is known for a specific instruction.
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
virtual bool forallUnderlyingObjects(function_ref< bool(Value &)> Pred, AA::ValueScope Scope=AA::Interprocedural) const =0
Check Pred on all underlying objects in Scope collected so far.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAUnderlyingObjects.
static LLVM_ABI AAUnderlyingObjects & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute biew for the position IRP.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
AAUnderlyingObjects(const IRPosition &IRP)
static bool requiresCallersForArgOrFunction()
See AbstractAttribute::requiresCallersForArgOrFunction.
StringRef getName() const override
See AbstractAttribute::getName()
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
See AbstractAttribute::isValidIRPositionForInit.
StringRef getName() const override
See AbstractAttribute::getName()
std::optional< Constant * > getAssumedConstant(Attributor &A, const Instruction *CtxI=nullptr) const
Return an assumed constant for the associated value a program point CtxI.
virtual ConstantRange getAssumedConstantRange(Attributor &A, const Instruction *CtxI=nullptr) const =0
Return an assumed range for the associated value a program point CtxI.
static LLVM_ABI const char ID
Unique ID (due to the unique address)
static bool requiresCallersForArgOrFunction()
See AbstractAttribute::requiresCallersForArgOrFunction.
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAValueConstantRange.
AAValueConstantRange(const IRPosition &IRP, Attributor &A)
static LLVM_ABI AAValueConstantRange & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
StateWrapper< IntegerRangeState, AbstractAttribute, uint32_t > Base
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
IntegerRangeState & getState() override
See AbstractAttribute::getState(...).
const IntegerRangeState & getState() const override
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAValueSimplify.
friend struct Attributor
StringRef getName() const override
See AbstractAttribute::getName()
StateWrapper< ValueSimplifyStateType, AbstractAttribute, Type * > Base
static LLVM_ABI const char ID
Unique ID (due to the unique address)
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static LLVM_ABI AAValueSimplify & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
AAValueSimplify(const IRPosition &IRP, Attributor &A)
An abstract attribute for willreturn.
bool isKnownWillReturn() const
Return true if "willreturn" is known.
const char * getIdAddr() const override
See AbstractAttribute::getIdAddr()
static LLVM_ABI const char ID
Unique ID (due to the unique address)
static LLVM_ABI AAWillReturn & createForPosition(const IRPosition &IRP, Attributor &A)
Create an abstract attribute view for the position IRP.
StringRef getName() const override
See AbstractAttribute::getName()
static bool classof(const AbstractAttribute *AA)
This function should return true if the type of the AA is AAWillReturn.
AAWillReturn(const IRPosition &IRP, Attributor &A)
static bool isImpliedByMustprogressAndReadonly(Attributor &A, const IRPosition &IRP)
Check for mustprogress and readonly as they imply willreturn.
static bool isImpliedByIR(Attributor &A, const IRPosition &IRP, Attribute::AttrKind ImpliedAttributeKind, bool IgnoreSubsumingPositions=false)
bool isAssumedWillReturn() const
Return true if "willreturn" is assumed.
Helper to represent an access offset and size, with logic to deal with uncertainty and check for over...
Definition Attributor.h:245
bool offsetAndSizeAreUnknown() const
Return true if offset and size are unknown, thus this is the default unknown object.
Definition Attributor.h:260
static constexpr int64_t Unknown
Definition Attributor.h:324
bool offsetOrSizeAreUnknown() const
Return true if offset or size are unknown.
Definition Attributor.h:254
static constexpr int64_t Unassigned
Constants used to represent special offsets or sizes.
Definition Attributor.h:323
RangeTy & operator&=(const RangeTy &R)
Definition Attributor.h:283
static RangeTy getUnknown()
Definition Attributor.h:251
bool isUnassigned() const
Return true if the offset and size are unassigned.
Definition Attributor.h:265
static bool LessThan(const RangeTy &L, const RangeTy &R)
Comparison for sorting ranges.
Definition Attributor.h:309
bool mayOverlap(const RangeTy &Range) const
Return true if this offset and size pair might describe an address that overlaps with Range.
Definition Attributor.h:273
RangeTy(int64_t Offset, int64_t Size)
Definition Attributor.h:249
Value * getValue() const
Definition Attributor.h:198
std::pair< Value *, const Instruction * > Base
Definition Attributor.h:193
ValueAndContext(Value &V, const Instruction *CtxI)
Definition Attributor.h:195
const Instruction * getCtxI() const
Definition Attributor.h:199
ValueAndContext(Value &V, const Instruction &CtxI)
Definition Attributor.h:196
ValueAndContext(const Base &B)
Definition Attributor.h:194
Base struct for all "concrete attribute" deductions.
ChangeStatus update(Attributor &A)
Hook for the Attributor to trigger an update of the internal state.
friend struct Attributor
}
static bool isValidIRPositionForInit(Attributor &A, const IRPosition &IRP)
Return false if an AA should not be created for IRP.
virtual ChangeStatus manifest(Attributor &A)
Hook for the Attributor to trigger the manifestation of the information represented by the abstract a...
static bool classof(const AADepGraphNode *DGN)
This function is used to identify if an DGN is of type AbstractAttribute so that the dyn_cast and cas...
static bool requiresCalleeForCallBase()
Return true if this AA requires a "callee" (or an associted function) for a call site positon.
void print(raw_ostream &OS) const
Helper functions, for debug purposes only.
IRPosition & getIRPosition()
virtual StateType & getState()=0
Return the internal abstract state for inspection.
virtual void initialize(Attributor &A)
Initialize the state with the information in the Attributor A.
static bool isValidIRPositionForUpdate(Attributor &A, const IRPosition &IRP)
Return false if an AA should not be updated for IRP.
AbstractState StateType
virtual const std::string getAsStr(Attributor *A) const =0
This function should return the "summarized" assumed state as string.
~AbstractAttribute() override=default
Virtual destructor.
static constexpr Attribute::AttrKind IRAttributeKind
Compile time access to the IR attribute kind.
virtual bool isQueryAA() const
A query AA is always scheduled as long as we do updates because it does lazy computation that cannot ...
virtual const StateType & getState() const =0
AbstractAttribute(const IRPosition &IRP)
static bool requiresNonAsmForCallBase()
Return true if this AA requires non-asm "callee" for a call site positon.
virtual ChangeStatus updateImpl(Attributor &A)=0
The actual update/transfer function which has to be implemented by the derived classes.
virtual void trackStatistics() const =0
Hook to enable custom statistic tracking, called after manifest that resulted in a change if statisti...
static bool requiresCallersForArgOrFunction()
Return true if this AA requires all callees for an argument or function positon.
virtual StringRef getName() const =0
This function should return the name of the AbstractAttribute.
const IRPosition & getIRPosition() const
Return an IR position, see struct IRPosition.
virtual const char * getIdAddr() const =0
This function should return the address of the ID of the AbstractAttribute.
static bool hasTrivialInitializer()
Return false if this AA does anything non-trivial (hence not done by default) in its initializer.
An interface to query the internal state of an abstract attribute.
virtual ~AbstractState()=default
virtual ChangeStatus indicatePessimisticFixpoint()=0
Indicate that the abstract state should converge to the pessimistic state.
virtual bool isAtFixpoint() const =0
Return if this abstract state is fixed, thus does not need to be updated if information changes as it...
virtual bool isValidState() const =0
Return if this abstract state is in a valid state.
virtual ChangeStatus indicateOptimisticFixpoint()=0
Indicate that the abstract state should converge to the optimistic state.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Wrapper for FunctionAnalysisManager.
AnalysisGetter()=default
static constexpr bool HasLegacyWrapper
Analysis::Result * getAnalysis(const Function &F, bool RequestCachedOnly=false)
AnalysisGetter(FunctionAnalysisManager &FAM, bool CachedOnly=false)
void invalidateAnalyses()
Invalidates the analyses. Valid only when using the new pass manager.
AnalysisGetter(Pass *P, bool CachedOnly=false)
LLVM_ABI PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &AM, LazyCallGraph &CG, CGSCCUpdateResult &UR)
~AttributorCallGraph() override=default
AACallEdgeIterator optimisticEdgesEnd() const override
AttributorCallGraph(Attributor &A)
AACallEdgeIterator optimisticEdgesBegin() const override
void populateAll() const
Force populate the entire call graph.
Configuration for the Attributor.
bool UseLiveness
Flag to determine if we should skip all liveness checks early on.
std::function< void(Attributor &A, const Function &F)> InitializationCallback
Callback function to be invoked on internal functions marked live.
std::optional< unsigned > MaxFixpointIterations
Maximum number of iterations to run until fixpoint.
DenseSet< const char * > * Allowed
If not null, a set limiting the attribute opportunities.
bool RewriteSignatures
Flag to determine if we rewrite function signatures.
const char * PassName
}
OptimizationRemarkGetter OREGetter
bool DeleteFns
Flag to determine if we can delete functions or keep dead ones around.
std::function< bool(const Function &F)> IPOAmendableCBTy
bool IsClosedWorldModule
Flag to indicate if the entire world is contained in this module, that is, no outside functions exist...
function_ref< OptimizationRemarkEmitter &(Function *)> OptimizationRemarkGetter
A callback function that returns an ORE object from a Function pointer.
CallGraphUpdater & CGUpdater
Helper to update an underlying call graph and to delete functions.
IPOAmendableCBTy IPOAmendableCB
bool IsModulePass
Is the user of the Attributor a module pass or not.
std::function< bool(Attributor &A, const AbstractAttribute &AA, CallBase &CB, Function &AssumedCallee, unsigned NumAssumedCallees)> IndirectCalleeSpecializationCallback
Callback function to determine if an indirect call targets should be made direct call targets (with a...
bool DefaultInitializeLiveInternals
Flag to determine if we want to initialize all default AAs for an internal function marked live.
AttributorConfig(CallGraphUpdater &CGUpdater)
A more lightweight version of the Attributor which only runs attribute inference but no simplificatio...
LLVM_ABI PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &AM, LazyCallGraph &CG, CGSCCUpdateResult &UR)
A more lightweight version of the Attributor which only runs attribute inference but no simplificatio...
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
Helper struct used in the communication between an abstract attribute (AA) that wants to change the s...
friend struct Attributor
Allow access to the private members from the Attributor.
std::function< void( const ArgumentReplacementInfo &, Function &, Function::arg_iterator)> CalleeRepairCBTy
Callee repair callback type.
const Argument & getReplacedArg() const
Attributor & getAttributor() const
Simple getters, see the corresponding members for details.
const Function & getReplacedFn() const
std::function< void(const ArgumentReplacementInfo &, AbstractCallSite, SmallVectorImpl< Value * > &)> ACSRepairCBTy
Abstract call site (ACS) repair callback type.
The fixpoint analysis framework that orchestrates the attribute deduction.
LLVM_ABI bool registerFunctionSignatureRewrite(Argument &Arg, ArrayRef< Type * > ReplacementTypes, ArgumentReplacementInfo::CalleeRepairCBTy &&CalleeRepairCB, ArgumentReplacementInfo::ACSRepairCBTy &&ACSRepairCB)
Register a rewrite for a function signature.
AAType & registerAA(AAType &AA)
Introduce a new abstract attribute into the fixpoint analysis.
LLVM_ABI ~Attributor()
LLVM_ABI bool checkForAllCallees(function_ref< bool(ArrayRef< const Function * > Callees)> Pred, const AbstractAttribute &QueryingAA, const CallBase &CB)
Check Pred on all potential Callees of CB.
bool isModulePass() const
Return true if this is a module pass, false otherwise.
void registerInvokeWithDeadSuccessor(InvokeInst &II)
Record that II has at least one dead successor block.
void registerSimplificationCallback(const IRPosition &IRP, const SimplifictionCallbackTy &CB)
bool changeAfterManifest(const IRPosition IRP, Value &NV, bool ChangeDroppable=true)
Helper function to replace all uses associated with IRP with NV.
LLVM_ABI bool isValidFunctionSignatureRewrite(Argument &Arg, ArrayRef< Type * > ReplacementTypes)
Check if we can rewrite a function signature.
static LLVM_ABI bool isInternalizable(Function &F)
Returns true if the function F can be internalized.
LLVM_ABI ChangeStatus removeAttrs(const IRPosition &IRP, ArrayRef< Attribute::AttrKind > AttrKinds)
Remove all AttrKinds attached to IRP.
void emitRemark(Instruction *I, StringRef RemarkName, RemarkCallBack &&RemarkCB) const
Emit a remark generically.
bool isRunOn(Function &Fn) const
Return true if we derive attributes for Fn.
LLVM_ABI bool isAssumedDead(const AbstractAttribute &AA, const AAIsDead *LivenessAA, bool &UsedAssumedInformation, bool CheckBBLivenessOnly=false, DepClassTy DepClass=DepClassTy::OPTIONAL)
Return true if AA (or its context instruction) is assumed dead.
LLVM_ABI bool checkForAllInstructions(function_ref< bool(Instruction &)> Pred, const Function *Fn, const AbstractAttribute *QueryingAA, ArrayRef< unsigned > Opcodes, bool &UsedAssumedInformation, bool CheckBBLivenessOnly=false, bool CheckPotentiallyDead=false)
Check Pred on all instructions in Fn with an opcode present in Opcodes.
LLVM_ABI void recordDependence(const AbstractAttribute &FromAA, const AbstractAttribute &ToAA, DepClassTy DepClass)
Explicitly record a dependence from FromAA to ToAA, that is if FromAA changes ToAA should be updated ...
static LLVM_ABI void createShallowWrapper(Function &F)
Create a shallow wrapper for F such that F has internal linkage afterwards.
bool isRunOn(Function *Fn) const
bool isDuringDeduction() const
Return whether attributes can participate in fixed-point deduction.
const AAType * getAAFor(const AbstractAttribute &QueryingAA, const IRPosition &IRP, DepClassTy DepClass)
Lookup an abstract attribute of type AAType at position IRP.
std::function< std::optional< Value * >( const IRPosition &, const AbstractAttribute *, bool &)> SimplifictionCallbackTy
Register CB as a simplification callback.
std::optional< Constant * > getAssumedInitializerFromCallBack(const GlobalVariable &GV, const AbstractAttribute *AA, bool &UsedAssumedInformation)
Return std::nullopt if there is no call back registered for GV or the call back is still not sure if ...
void deleteAfterManifest(Function &F)
Record that F is deleted after information was manifested.
std::optional< Value * > getAssumedSimplified(const IRPosition &IRP, const AbstractAttribute &AA, bool &UsedAssumedInformation, AA::ValueScope S)
If V is assumed simplified, return it, if it is unclear yet, return std::nullopt, otherwise return nu...
void emitRemark(Function *F, StringRef RemarkName, RemarkCallBack &&RemarkCB) const
Emit a remark on a function.
static LLVM_ABI Function * internalizeFunction(Function &F, bool Force=false)
Make another copy of the function F such that the copied version has internal linkage afterwards and ...
bool isFunctionIPOAmendable(const Function &F)
Determine whether the function F is IPO amendable.
const AAType * getOrCreateAAFor(IRPosition IRP, const AbstractAttribute *QueryingAA, DepClassTy DepClass, bool ForceUpdate=false, bool UpdateAfterInit=true)
The version of getAAFor that allows to omit a querying abstract attribute.
const SmallSetVector< Function *, 8 > & getModifiedFunctions()
LLVM_ABI bool checkForAllReadWriteInstructions(function_ref< bool(Instruction &)> Pred, AbstractAttribute &QueryingAA, bool &UsedAssumedInformation)
Check Pred on all Read/Write instructions.
void changeToUnreachableAfterManifest(Instruction *I)
Record that I is to be replaced with unreachable after information was manifested.
bool hasGlobalVariableSimplificationCallback(const GlobalVariable &GV)
Return true if there is a simplification callback for GV.
std::optional< Constant * > getAssumedConstant(const Value &V, const AbstractAttribute &AA, bool &UsedAssumedInformation)
LLVM_ABI bool checkForAllReturnedValues(function_ref< bool(Value &)> Pred, const AbstractAttribute &QueryingAA, AA::ValueScope S=AA::ValueScope::Intraprocedural, bool RecurseForSelectAndPHI=true)
Check Pred on all values potentially returned by the function associated with QueryingAA.
bool hasSimplificationCallback(const IRPosition &IRP)
Return true if there is a simplification callback for IRP.
std::function< std::optional< Constant * >( const GlobalVariable &, const AbstractAttribute *, bool &)> GlobalVariableSimplifictionCallbackTy
Register CB as a simplification callback.
LLVM_ABI bool isClosedWorldModule() const
Return true if the module contains the whole world, thus, no outside functions exist.
LLVM_ABI std::optional< Constant * > getAssumedConstant(const IRPosition &IRP, const AbstractAttribute &AA, bool &UsedAssumedInformation)
If IRP is assumed to be a constant, return it, if it is unclear yet, return std::nullopt,...
const AAType * getOrCreateAAFor(const IRPosition &IRP)
LLVM_ABI Attributor(SetVector< Function * > &Functions, InformationCache &InfoCache, AttributorConfig Configuration)
Constructor.
void registerGlobalVariableSimplificationCallback(const GlobalVariable &GV, const GlobalVariableSimplifictionCallbackTy &CB)
const DataLayout & getDataLayout() const
Return the data layout associated with the anchor scope.
LLVM_ABI void getAttrs(const IRPosition &IRP, ArrayRef< Attribute::AttrKind > AKs, SmallVectorImpl< Attribute > &Attrs, bool IgnoreSubsumingPositions=false)
Return the attributes of any kind in AKs existing in the IR at a position that will affect this one.
InformationCache & getInfoCache()
Return the internal information cache.
bool changeUseAfterManifest(Use &U, Value &NV)
Record that U is to be replaces with NV after information was manifested.
LLVM_ABI std::optional< Value * > translateArgumentToCallSiteContent(std::optional< Value * > V, CallBase &CB, const AbstractAttribute &AA, bool &UsedAssumedInformation)
Translate V from the callee context into the call site context.
AAType * lookupAAFor(const IRPosition &IRP, const AbstractAttribute *QueryingAA=nullptr, DepClassTy DepClass=DepClassTy::OPTIONAL, bool AllowInvalidState=false)
Return the attribute of AAType for IRP if existing and valid.
void markLiveInternalFunction(const Function &F)
Mark the internal function F as live.
void registerManifestAddedBasicBlock(BasicBlock &BB)
void registerVirtualUseCallback(const Value &V, const VirtualUseCallbackTy &CB)
LLVM_ABI bool checkForAllUses(function_ref< bool(const Use &, bool &)> Pred, const AbstractAttribute &QueryingAA, const Value &V, bool CheckBBLivenessOnly=false, DepClassTy LivenessDepClass=DepClassTy::OPTIONAL, bool IgnoreDroppableUses=true, function_ref< bool(const Use &OldU, const Use &NewU)> EquivalentUseCB=nullptr)
Check Pred on all (transitive) uses of V.
LLVM_ABI ChangeStatus manifestAttrs(const IRPosition &IRP, ArrayRef< Attribute > DeducedAttrs, bool ForceReplace=false)
Attach DeducedAttrs to IRP, if ForceReplace is set we do this even if the same attribute kind was alr...
LLVM_ABI bool hasAttr(const IRPosition &IRP, ArrayRef< Attribute::AttrKind > AKs, bool IgnoreSubsumingPositions=false, Attribute::AttrKind ImpliedAttributeKind=Attribute::None)
Return true if any kind in AKs existing in the IR at a position that will affect this one.
LLVM_ABI void registerForUpdate(AbstractAttribute &AA)
Allows a query AA to request an update if a new query was received.
const Module & getModule()
Return the module.
void deleteAfterManifest(Instruction &I)
Record that I is deleted after information was manifested.
std::function< bool(Attributor &, const AbstractAttribute *)> VirtualUseCallbackTy
void deleteAfterManifest(BasicBlock &BB)
Record that BB is deleted after information was manifested.
LLVM_ABI void identifyDefaultAbstractAttributes(Function &F)
Determine opportunities to derive 'default' attributes in F and create abstract attribute objects for...
bool shouldInitialize(const IRPosition &IRP, bool &ShouldUpdateAA)
LLVM_ABI bool getAssumedSimplifiedValues(const IRPosition &IRP, const AbstractAttribute *AA, SmallVectorImpl< AA::ValueAndContext > &Values, AA::ValueScope S, bool &UsedAssumedInformation, bool RecurseForSelectAndPHI=true)
Try to simplify IRP and in the scope S.
BumpPtrAllocator & Allocator
The allocator used to allocate memory, e.g. for AbstractAttributes.
bool checkForAllCallLikeInstructions(function_ref< bool(Instruction &)> Pred, const AbstractAttribute &QueryingAA, bool &UsedAssumedInformation, bool CheckBBLivenessOnly=false, bool CheckPotentiallyDead=false)
Check Pred on all call-like instructions (=CallBased derived).
bool shouldSpecializeCallSiteForCallee(const AbstractAttribute &AA, CallBase &CB, Function &Callee, unsigned NumAssumedCallees)
Return true if we should specialize the call site CB for the potential callee Fn.
LLVM_ABI ChangeStatus run()
Run the analyses until a fixpoint is reached or enforced (timeout).
static LLVM_ABI bool internalizeFunctions(SmallPtrSetImpl< Function * > &FnSet, DenseMap< Function *, Function * > &FnMap)
Make copies of each function in the set FnSet such that the copied version has internal linkage after...
std::optional< Value * > getAssumedSimplified(const Value &V, const AbstractAttribute &AA, bool &UsedAssumedInformation, AA::ValueScope S)
bool shouldUpdateAA(const IRPosition &IRP)
LLVM_ABI bool checkForAllCallSites(function_ref< bool(AbstractCallSite)> Pred, const AbstractAttribute &QueryingAA, bool RequireAllCallSites, bool &UsedAssumedInformation)
Check Pred on all function call sites.
LLVM_ABI bool getAttrsFromAssumes(const IRPosition &IRP, Attribute::AttrKind AK, SmallVectorImpl< Attribute > &Attrs)
Return the attributes of kind AK existing in the IR as operand bundles of an llvm....
Specialization of the integer state for a bit-wise encoding.
BitIntegerState & removeKnownBits(base_t BitsEncoding)
Remove the bits in BitsEncoding from the "known bits".
bool isAssumed(base_t BitsEncoding=BestState) const
Return true if the bits set in BitsEncoding are "assumed bits".
IntegerStateBase< base_ty, BestState, WorstState > super
BitIntegerState(base_t Assumed)
BitIntegerState & removeAssumedBits(base_t BitsEncoding)
Remove the bits in BitsEncoding from the "assumed bits" if not known.
BitIntegerState & intersectAssumedBits(base_t BitsEncoding)
Keep only "assumed bits" also set in BitsEncoding but all known ones.
bool isKnown(base_t BitsEncoding=BestState) const
Return true if the bits set in BitsEncoding are "known bits".
BitIntegerState & addKnownBits(base_t Bits)
Add the bits in BitsEncoding to the "known bits".
Simple wrapper for a single bit (boolean) state.
IntegerStateBase< bool, true, false > super
bool isKnown() const
Return true if the state is known to hold.
void setKnown(bool Value)
Set the known and asssumed value to Value.
IntegerStateBase::base_t base_t
BooleanState(base_t Assumed)
BooleanState()=default
bool isAssumed() const
Return true if the state is assumed to hold.
Support structure for SCC passes to communicate updates the call graph back to the CGSCC pass manager...
static bool isNodeHidden(const AACallGraphNode *Node, const AttributorCallGraph *Graph)
std::string getNodeLabel(const AACallGraphNode *Node, const AttributorCallGraph *Graph)
Specialization of the integer state for a decreasing value, hence 0 is the best state and ~0u the wor...
DecIntegerState & takeKnownMinimum(base_t Value)
Take minimum of known and Value.
DecIntegerState & takeAssumedMaximum(base_t Value)
Take maximum of assumed and Value.
static DenormalMode unionAssumed(DenormalMode Callee, DenormalMode Caller)
DenormalState unionWith(DenormalState Caller) const
bool operator!=(const DenormalState Other) const
bool operator==(const DenormalState Other) const
static DenormalMode::DenormalModeKind unionDenormalKind(DenormalMode::DenormalModeKind Callee, DenormalMode::DenormalModeKind Caller)
bool IsAtFixedpoint
Explicitly track whether we've hit a fixed point.
ChangeStatus indicateOptimisticFixpoint() override
Indicate that the abstract state should converge to the optimistic state.
DenormalState getKnown() const
DenormalState getAssumed() const
bool isValidState() const override
Return if this abstract state is in a valid state.
ChangeStatus indicatePessimisticFixpoint() override
Indicate that the abstract state should converge to the pessimistic state.
DenormalFPMathState operator^=(const DenormalFPMathState &Caller)
ChangeStatus indicateFixpoint()
bool isModeFixed() const
Return true if there are no dynamic components to the denormal mode worth specializing.
bool isAtFixpoint() const override
Return if this abstract state is fixed, thus does not need to be updated if information changes as it...
Represent subnormal handling kind for floating point instruction inputs and outputs.
DenormalModeKind
Represent handled modes for denormal (aka subnormal) modes in the floating point environment.
@ Dynamic
Denormals have unknown treatment.
static constexpr DenormalMode getInvalid()
static bool isEqual(const AA::ValueAndContext &LHS, const AA::ValueAndContext &RHS)
Definition Attributor.h:430
static unsigned getHashValue(const AA::ValueAndContext &VAC)
Definition Attributor.h:426
DenseMapInfo< AA::ValueAndContext::Base > Base
Definition Attributor.h:425
static bool isEqual(const AA::ValueScope &LHS, const AA::ValueScope &RHS)
Definition Attributor.h:443
DenseMapInfo< unsigned char > Base
Definition Attributor.h:438
static unsigned getHashValue(const AA::ValueScope &S)
Definition Attributor.h:439
static bool isEqual(const IRPosition &a, const IRPosition &b)
static unsigned getHashValue(const IRPosition &IRP)
An information struct used to provide DenseMap with the various necessary components for a given valu...
State for dereferenceable attribute.
IncIntegerState DerefBytesState
State representing for dereferenceable bytes.
static DerefState getBestState(const DerefState &)
static DerefState getWorstState()
Return the worst possible representable state.
static DerefState getBestState()
static DerefState getWorstState(const DerefState &)
std::map< int64_t, uint64_t > AccessedBytesMap
Map representing for accessed memory offsets and sizes.
static AACallEdgeIterator child_end(AACallGraphNode *Node)
static AACallEdgeIterator child_begin(AACallGraphNode *Node)
static AACallGraphNode * getEntryNode(AttributorCallGraph *G)
static AACallEdgeIterator nodes_begin(const AttributorCallGraph *G)
static AACallEdgeIterator nodes_end(const AttributorCallGraph *G)
Attribute::AttrKind getAttrKind() const
Return the kind that identifies the abstract attribute implementation.
static constexpr Attribute::AttrKind IRAttributeKind
Compile time access to the IR attribute kind.
static bool hasTrivialInitializer()
Most boolean IRAttribute AAs don't do anything non-trivial in their initializers while non-boolean on...
static bool isImpliedByUndef()
Return true if the IR attribute(s) associated with this AA are implied for an undef value.
ChangeStatus manifest(Attributor &A) override
See AbstractAttribute::manifest(...).
static bool isImpliedByPoison()
Return true if the IR attribute(s) associated with this AA are implied for an poison value.
static bool isImpliedByIR(Attributor &A, const IRPosition &IRP, Attribute::AttrKind ImpliedAttributeKind=AK, bool IgnoreSubsumingPositions=false)
IRAttribute(const IRPosition &IRP)
virtual void getDeducedAttributes(Attributor &A, LLVMContext &Ctx, SmallVectorImpl< Attribute > &Attrs) const
Return the deduced attributes in Attrs.
Helper to describe and deal with positions in the LLVM-IR.
Definition Attributor.h:573
Function * getAssociatedFunction() const
Return the associated function, if any.
Definition Attributor.h:704
void setAttrList(const AttributeList &AttrList) const
Update the attributes associated with this function or call site scope.
Definition Attributor.h:840
unsigned getAttrIdx() const
Return the index in the attribute list for this position.
Definition Attributor.h:805
bool hasCallBaseContext() const
Check if the position has any call base context.
Definition Attributor.h:900
static const IRPosition callsite_returned(const CallBase &CB)
Create a position describing the returned value of CB.
Definition Attributor.h:641
static const IRPosition returned(const Function &F, const CallBaseContext *CBContext=nullptr)
Create a position describing the returned value of F.
Definition Attributor.h:623
LLVM_ABI Argument * getAssociatedArgument() const
Return the associated argument, if any.
bool isAnyCallSitePosition() const
Definition Attributor.h:867
bool operator!=(const IRPosition &RHS) const
Definition Attributor.h:682
static const IRPosition value(const Value &V, const CallBaseContext *CBContext=nullptr)
Create a position describing the value of V.
Definition Attributor.h:597
CallBase CallBaseContext
Definition Attributor.h:576
AttributeList getAttrList() const
Return the attributes associated with this function or call site scope.
Definition Attributor.h:833
int getCalleeArgNo() const
Return the callee argument number of the associated value if it is an argument or call site argument,...
Definition Attributor.h:791
static const IRPosition inst(const Instruction &I, const CallBaseContext *CBContext=nullptr)
Create a position describing the instruction I.
Definition Attributor.h:609
static const IRPosition callsite_argument(const CallBase &CB, unsigned ArgNo)
Create a position describing the argument of CB at position ArgNo.
Definition Attributor.h:646
Kind
The positions we distinguish in the IR.
Definition Attributor.h:579
@ IRP_ARGUMENT
An attribute for a function argument.
Definition Attributor.h:587
@ IRP_RETURNED
An attribute for the function return value.
Definition Attributor.h:583
@ IRP_CALL_SITE
An attribute for a call site (function scope).
Definition Attributor.h:586
@ IRP_CALL_SITE_RETURNED
An attribute for a call site return value.
Definition Attributor.h:584
@ IRP_FUNCTION
An attribute for a function (scope).
Definition Attributor.h:585
@ IRP_FLOAT
A position that is not associated with a spot suitable for attributes.
Definition Attributor.h:581
@ IRP_CALL_SITE_ARGUMENT
An attribute for a call site argument.
Definition Attributor.h:588
@ IRP_INVALID
An invalid position.
Definition Attributor.h:580
Instruction * getCtxI() const
Return the context instruction, if any.
Definition Attributor.h:757
static const IRPosition argument(const Argument &Arg, const CallBaseContext *CBContext=nullptr)
Create a position describing the argument Arg.
Definition Attributor.h:630
Type * getAssociatedType() const
Return the type this abstract attribute is associated with.
Definition Attributor.h:780
bool isFunctionScope() const
Return true if this is a function or call site position.
Definition Attributor.h:734
bool operator==(const IRPosition &RHS) const
Definition Attributor.h:679
static const IRPosition callsite_argument(AbstractCallSite ACS, unsigned ArgNo)
Create a position describing the argument of ACS at position ArgNo.
Definition Attributor.h:653
static const IRPosition function(const Function &F, const CallBaseContext *CBContext=nullptr)
Create a position describing the function scope of F.
Definition Attributor.h:616
const CallBaseContext * getCallBaseContext() const
Get the call base context from the position.
Definition Attributor.h:897
Value & getAssociatedValue() const
Return the value this abstract attribute is associated with.
Definition Attributor.h:771
Value & getAnchorValue() const
Return the value this abstract attribute is anchored with.
Definition Attributor.h:690
Value * getAttrListAnchor() const
Return the value attributes are attached to.
Definition Attributor.h:826
int getCallSiteArgNo() const
Return the call site argument number of the associated value if it is an argument or call site argume...
Definition Attributor.h:800
bool isFnInterfaceKind() const
Return true if the position refers to a function interface, that is the function scope,...
Definition Attributor.h:722
static const IRPosition function_scope(const IRPosition &IRP, const CallBaseContext *CBContext=nullptr)
Create a position with function scope matching the "context" of IRP.
Definition Attributor.h:669
IRPosition stripCallBaseContext() const
Return the same position without the call base context.
Definition Attributor.h:890
Kind getPositionKind() const
Return the associated position kind.
Definition Attributor.h:847
bool isArgumentPosition() const
Return true if the position is an argument or call site argument.
Definition Attributor.h:879
static const IRPosition callsite_function(const CallBase &CB)
Create a position describing the function scope of CB.
Definition Attributor.h:636
IRPosition()
Default constructor available to create invalid positions implicitly.
Definition Attributor.h:594
Function * getAnchorScope() const
Return the Function surrounding the anchor value.
Definition Attributor.h:745
Specialization of the integer state for an increasing value, hence ~0u is the best state and 0 the wo...
IntegerStateBase< base_ty, BestState, WorstState > super
static constexpr base_t getBestState(const IncIntegerState< base_ty, BestState, WorstState > &)
IncIntegerState(base_t Assumed)
static constexpr base_t getBestState()
Return the best possible representable state.
IncIntegerState & takeAssumedMinimum(base_t Value)
Take minimum of assumed and Value.
IncIntegerState & takeKnownMaximum(base_t Value)
Take maximum of known and Value.
Data structure to hold cached (LLVM-IR) information.
bool IsTargetGPU() const
Return true if the target is a GPU.
friend struct Attributor
Give the Attributor access to the members so Attributor::identifyDefaultAbstractAttributes(....
const SetVector< Function * > *const CGSCC
The CG-SCC the pass is run on, or nullptr if it is a module pass.
bool stackIsAccessibleByOtherThreads()
Return true if the stack (llvm::Alloca) can be accessed by other threads.
bool isInvolvedInMustTailCall(const Argument &Arg)
Return true if Arg is involved in a must-tail call, thus the argument of the caller or callee.
MustBeExecutedContextExplorer * getMustBeExecutedContextExplorer()
Return MustBeExecutedContextExplorer.
void invalidateAnalyses()
Invalidates the cached analyses.
virtual unsigned getMaxAddrSpace() const
const AA::InstExclusionSetTy * getOrCreateUniqueBlockExecutionSet(const AA::InstExclusionSetTy *BES)
Given BES, return a uniqued version.
static void foreachUse(Function &F, CBTy CB, bool LookThroughConstantExprUses=true)
Apply CB to all uses of F.
TargetLibraryInfo * getTargetLibraryInfoForFunction(const Function &F)
Return TargetLibraryInfo for function F.
InformationCache(const Module &M, AnalysisGetter &AG, BumpPtrAllocator &Allocator, SetVector< Function * > *CGSCC, bool UseExplorer=true)
const Module & getModule() const
const DataLayout & getDL() const
Return datalayout used in the module.
LLVM_ABI std::optional< unsigned > getFlatAddressSpace() const
Return the flat address space if the associated target has.
OpcodeInstMapTy & getOpcodeInstMapForFunction(const Function &F)
Return the map that relates "interesting" opcodes with all instructions with that opcode in F.
DenseMap< unsigned, InstructionVectorTy * > OpcodeInstMapTy
A map type from opcodes to instructions with this opcode.
const RetainedKnowledgeMap & getKnowledgeMap() const
Return the map conaining all the knowledge we have from llvm.assumes.
LLVM_ABI ArrayRef< Function * > getIndirectlyCallableFunctions(Attributor &A) const
Return all functions that might be called indirectly, only valid for closed world modules (see isClos...
SmallVector< Instruction *, 8 > InstructionVectorTy
A vector type to hold instructions.
InstructionVectorTy & getReadOrWriteInstsForFunction(const Function &F)
Return the instructions in F that may read or write memory.
bool isOnlyUsedByAssume(const Instruction &I) const
bool isKernel(const Function &F)
Return true if F has the "kernel" function attribute.
AP::Result * getAnalysisResultForFunction(const Function &F, bool CachedOnly=false)
Return the analysis result from a pass AP for function F.
State for an integer range.
IntegerRangeState operator^=(const IntegerRangeState &R)
"Clamp" this state with R.
IntegerRangeState operator&=(const IntegerRangeState &R)
bool isAtFixpoint() const override
See AbstractState::isAtFixpoint()
void unionAssumed(const IntegerRangeState &R)
See IntegerRangeState::unionAssumed(..).
ConstantRange Assumed
State representing assumed range, initially set to empty.
IntegerRangeState(const ConstantRange &CR)
IntegerRangeState(uint32_t BitWidth)
bool operator==(const IntegerRangeState &R) const
Equality for IntegerRangeState.
void intersectKnown(const IntegerRangeState &R)
See IntegerRangeState::intersectKnown(..).
static ConstantRange getBestState(const IntegerRangeState &IRS)
bool isValidState() const override
See AbstractState::isValidState()
uint32_t BitWidth
Bitwidth of the associated value.
ConstantRange Known
State representing known range, initially set to [-inf, inf].
void unionAssumed(const ConstantRange &R)
Unite assumed range with the passed state.
ChangeStatus indicatePessimisticFixpoint() override
See AbstractState::indicatePessimisticFixpoint(...)
ConstantRange getKnown() const
Return the known state encoding.
void intersectKnown(const ConstantRange &R)
Intersect known range with the passed state.
ConstantRange getAssumed() const
Return the assumed state encoding.
uint32_t getBitWidth() const
Return associated values' bit width.
ChangeStatus indicateOptimisticFixpoint() override
See AbstractState::indicateOptimisticFixpoint(...)
static ConstantRange getWorstState(uint32_t BitWidth)
Return the worst possible representable state.
static ConstantRange getBestState(uint32_t BitWidth)
Return the best possible representable state.
Simple state with integers encoding.
bool isValidState() const override
See AbstractState::isValidState() NOTE: For now we simply pretend that the worst possible state is in...
virtual void handleNewAssumedValue(base_t Value)=0
Handle a new assumed value Value. Subtype dependent.
bool isAtFixpoint() const override
See AbstractState::isAtFixpoint()
void operator|=(const IntegerStateBase< base_t, BestState, WorstState > &R)
virtual void handleNewKnownValue(base_t Value)=0
Handle a new known value Value. Subtype dependent.
base_t getKnown() const
Return the known state encoding.
ChangeStatus indicateOptimisticFixpoint() override
See AbstractState::indicateOptimisticFixpoint(...)
void operator^=(const IntegerStateBase< base_t, BestState, WorstState > &R)
"Clamp" this state with R.
virtual void joinOR(base_t AssumedValue, base_t KnownValue)=0
Handle a value Value. Subtype dependent.
virtual void joinAND(base_t AssumedValue, base_t KnownValue)=0
Handle a new assumed value Value. Subtype dependent.
IntegerStateBase(base_t Assumed)
void operator+=(const IntegerStateBase< base_t, BestState, WorstState > &R)
"Clamp" this state with R.
base_t getAssumed() const
Return the assumed state encoding.
static constexpr base_t getWorstState()
Return the worst possible representable state.
static constexpr base_t getBestState()
Return the best possible representable state.
ChangeStatus indicatePessimisticFixpoint() override
See AbstractState::indicatePessimisticFixpoint(...)
static constexpr base_t getWorstState(const IntegerStateBase &)
bool operator!=(const IntegerStateBase< base_t, BestState, WorstState > &R) const
Inequality for IntegerStateBase.
bool operator==(const IntegerStateBase< base_t, BestState, WorstState > &R) const
Equality for IntegerStateBase.
void operator&=(const IntegerStateBase< base_t, BestState, WorstState > &R)
static constexpr base_t getBestState(const IntegerStateBase &)
A "must be executed context" for a given program point PP is the set of instructions,...
A CRTP mix-in for passes that can be skipped.
static constexpr int NumLowBitsAvailable
Note, we assume here that void* is related to raw malloc'ed memory and that malloc returns objects at...
A class for a set state.
static PotentialValuesState getBestState(const PotentialValuesState &PVS)
PotentialValuesState & getAssumed()
Return the assumed state.
bool undefIsContained() const
Returns whether this state contains an undef value or not.
bool isAtFixpoint() const override
See AbstractState::isAtFixpoint(...)
void unionAssumed(const MemberTy &C)
Union assumed set with the passed value.
static PotentialValuesState getBestState()
Return empty set as the best state of potential values.
SmallSetVector< MemberTy, 8 > SetTy
ChangeStatus indicatePessimisticFixpoint() override
See AbstractState::indicatePessimisticFixpoint(...)
void unionAssumed(const PotentialValuesState &PVS)
Union assumed set with assumed set of the passed state PVS.
PotentialValuesState(bool IsValid)
bool operator==(const PotentialValuesState &RHS) const
bool isValidState() const override
See AbstractState::isValidState(...)
PotentialValuesState operator&=(const PotentialValuesState &PVS)
static PotentialValuesState getWorstState()
Return full set as the worst state of potential values.
const PotentialValuesState & getAssumed() const
ChangeStatus indicateOptimisticFixpoint() override
See AbstractState::indicateOptimisticFixpoint(...)
PotentialValuesState operator^=(const PotentialValuesState &PVS)
"Clamp" this state with PVS.
void unionAssumedWithUndef()
Union assumed set with an undef value.
const SetTy & getAssumedSet() const
Return this set.
A wrapper around a set that has semantics for handling unions and intersections with a "universal" se...
SetContents(bool Universal)
Creates a universal set with no concrete elements or an empty set.
SetContents(bool Universal, const DenseSet< BaseTy > &Assumptions)
bool getIntersection(const SetContents &RHS)
Finds A := A ^ B where A or B could be the "Universal" set which contains every possible attribute.
bool getUnion(const SetContents &RHS)
Finds A := A u B where A or B could be the "Universal" set which contains every possible attribute.
const DenseSet< BaseTy > & getSet() const
SetContents(const DenseSet< BaseTy > &Assumptions)
Creates a non-universal set with concrete values.
bool setContains(const BaseTy &Elem) const
Returns if the set state contains the element.
bool getIntersection(const SetContents &RHS)
Performs the set intersection between this set and RHS.
bool isValidState() const override
See AbstractState::isValidState()
bool isAtFixpoint() const override
See AbstractState::isAtFixpoint()
const SetContents & getAssumed() const
Return the assumed state encoding.
const SetContents & getKnown() const
Return the known state encoding.
ChangeStatus indicateOptimisticFixpoint() override
See AbstractState::indicateOptimisticFixpoint(...)
bool getUnion(const SetContents &RHS)
Performs the set union between this set and RHS.
SetState(const DenseSet< BaseTy > &Known)
Initializes the known state with an initial set and initializes the assumed state as universal.
ChangeStatus indicatePessimisticFixpoint() override
See AbstractState::indicatePessimisticFixpoint(...)
Helper to tie a abstract state implementation to an abstract attribute.
StateType & getState() override
See AbstractAttribute::getState(...).
StateTy StateType
Provide static access to the type of the state.
StateWrapper(const IRPosition &IRP, Ts... Args)
const StateType & getState() const override
See AbstractAttribute::getState(...).
static ValueSimplifyStateType getWorstState(Type *Ty)
Return the worst possible representable state.
static ValueSimplifyStateType getBestState(const ValueSimplifyStateType &VS)
LLVM_ABI bool unionAssumed(std::optional< Value * > Other)
Merge Other into the currently assumed simplified value.
ChangeStatus indicateOptimisticFixpoint() override
See AbstractState::indicateOptimisticFixpoint(...)
ValueSimplifyStateType operator^=(const ValueSimplifyStateType &VS)
"Clamp" this state with PVS.
ChangeStatus indicatePessimisticFixpoint() override
See AbstractState::indicatePessimisticFixpoint(...)
static ValueSimplifyStateType getBestState(Type *Ty)
bool isAtFixpoint() const override
See AbstractState::isAtFixpoint(...)
bool isValidState() const override
See AbstractState::isValidState(...)
std::optional< Value * > SimplifiedAssociatedValue
An assumed simplified value.
static ValueSimplifyStateType getWorstState(const ValueSimplifyStateType &VS)
BooleanState BS
Helper to track validity and fixpoint.
Type * Ty
The type of the original value.
bool operator==(const ValueSimplifyStateType &RHS) const
ValueSimplifyStateType getAssumed()
Return the assumed state encoding.
const ValueSimplifyStateType & getAssumed() const