1 //===--- Assumptions.h - Assumption handling and organization ---*- 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 // String assumptions that are known to optimization passes should be placed in
10 // the KnownAssumptionStrings set. This can be done in various ways, i.a.,
11 // via a static KnownAssumptionString object.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_IR_ASSUMPTIONS_H
16 #define LLVM_IR_ASSUMPTIONS_H
17 
18 #include "llvm/ADT/DenseSet.h"
19 #include "llvm/ADT/StringRef.h"
20 #include "llvm/ADT/StringSet.h"
21 
22 namespace llvm {
23 
24 class Function;
25 class CallBase;
26 
27 /// The key we use for assumption attributes.
28 constexpr StringRef AssumptionAttrKey = "llvm.assume";
29 
30 /// A set of known assumption strings that are accepted without warning and
31 /// which can be recommended as typo correction.
32 extern StringSet<> KnownAssumptionStrings;
33 
34 /// Helper that allows to insert a new assumption string in the known assumption
35 /// set by creating a (static) object.
36 struct KnownAssumptionString {
37   KnownAssumptionString(const char *AssumptionStr)
38       : AssumptionStr(AssumptionStr) {
39     KnownAssumptionStrings.insert(AssumptionStr);
40   }
41   KnownAssumptionString(StringRef AssumptionStr)
42       : AssumptionStr(AssumptionStr) {
43     KnownAssumptionStrings.insert(AssumptionStr);
44   }
45   operator StringRef() const { return AssumptionStr; }
46 
47 private:
48   StringRef AssumptionStr;
49 };
50 
51 /// Return true if \p F has the assumption \p AssumptionStr attached.
52 bool hasAssumption(const Function &F,
53                    const KnownAssumptionString &AssumptionStr);
54 
55 /// Return true if \p CB or the callee has the assumption \p AssumptionStr
56 /// attached.
57 bool hasAssumption(const CallBase &CB,
58                    const KnownAssumptionString &AssumptionStr);
59 
60 /// Return the set of all assumptions for the function \p F.
61 DenseSet<StringRef> getAssumptions(const Function &F);
62 
63 /// Return the set of all assumptions for the call \p CB.
64 DenseSet<StringRef> getAssumptions(const CallBase &CB);
65 
66 /// Appends the set of assumptions \p Assumptions to \F.
67 bool addAssumptions(Function &F, const DenseSet<StringRef> &Assumptions);
68 
69 /// Appends the set of assumptions \p Assumptions to \CB.
70 bool addAssumptions(CallBase &CB, const DenseSet<StringRef> &Assumptions);
71 
72 } // namespace llvm
73 
74 #endif
75