Proteus
Programmable JIT compilation and optimization for C/C++ using LLVM
Loading...
Searching...
No Matches
Var.hpp
Go to the documentation of this file.
1#ifndef PROTEUS_FRONTEND_VAR_HPP
2#define PROTEUS_FRONTEND_VAR_HPP
3
4#include <llvm/IR/IRBuilder.h>
5#include <llvm/IR/Module.h>
6
7namespace proteus {
8
9class FuncBase;
10
11using namespace llvm;
12
14
15template <typename T> struct VarT {};
16
17struct Var {
20
22
23 virtual ~Var() = default;
24
26 Var(FuncBase &Fn);
27
28 // Disable copying/moving to prevent object slicing and enforce reference
29 // semantics.
30 Var(const Var &) = delete;
31 Var(Var &&) = delete;
32
33 virtual StringRef getName() const = 0;
34
35 // Value accessors
36 virtual Value *getValue() const = 0;
37 virtual Type *getValueType() const = 0;
38
39 virtual void storeValue(Value *Val) = 0;
40
41 // Pointer-only hooks
42 virtual Value *getPointerValue() const = 0;
43 virtual void storePointer(Value *Ptr) = 0;
44
45 virtual AllocaInst *getAlloca() const;
46
47 virtual VarKind kind() const;
48
49 virtual Var &index(size_t I) = 0;
50 virtual Var &index(const Var &I) = 0;
51
52 // Declare member Operators.
53 Var &operator+(const Var &Other) const;
54 Var &operator-(const Var &Other) const;
55 Var &operator*(const Var &Other) const;
56 Var &operator/(const Var &Other) const;
57 Var &operator%(const Var &Other) const;
58
59 template <typename T>
60 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
61 operator+(const T &ConstValue) const;
62
63 template <typename T>
64 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
65 operator-(const T &ConstValue) const;
66
67 template <typename T>
68 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
69 operator*(const T &ConstValue) const;
70
71 template <typename T>
72 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
73 operator/(const T &ConstValue) const;
74
75 template <typename T>
76 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
77 operator%(const T &ConstValue) const;
78
84
85 template <typename T>
86 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
87 operator+=(const T &ConstValue);
88
89 template <typename T>
90 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
91 operator-=(const T &ConstValue);
92
93 template <typename T>
94 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
95 operator*=(const T &ConstValue);
96
97 template <typename T>
98 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
99 operator/=(const T &ConstValue);
100
101 template <typename T>
102 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
103 operator%=(const T &ConstValue);
104
105 Var &operator>(const Var &Other) const;
106 Var &operator<(const Var &Other) const;
107 Var &operator>=(const Var &Other) const;
108 Var &operator<=(const Var &Other) const;
109 Var &operator==(const Var &Other) const;
110 Var &operator!=(const Var &Other) const;
111
112 template <typename T>
113 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
114 operator>(const T &ConstValue) const;
115
116 template <typename T>
117 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
118 operator>=(const T &ConstValue) const;
119
120 template <typename T>
121 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
122 operator<(const T &ConstValue) const;
123
124 template <typename T>
125 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
126 operator<=(const T &ConstValue) const;
127
128 template <typename T>
129 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
130 operator==(const T &ConstValue) const;
131
132 template <typename T>
133 std::enable_if_t<std::is_arithmetic_v<T>, Var &>
134 operator!=(const T &ConstValue) const;
135
136 Var &operator=(const Var &Other);
137
138 template <typename T, typename = std::enable_if<std::is_arithmetic_v<T>>>
139 Var &operator=(const T &ConstValue);
140
141 Var &operator[](size_t I);
142 Var &operator[](const Var &I);
143};
144
145// Declare non-member operators.
146template <typename T>
147std::enable_if_t<std::is_arithmetic_v<T>, Var &> operator+(const T &ConstValue,
148 const Var &Other);
149template <typename T>
150std::enable_if_t<std::is_arithmetic_v<T>, Var &> operator-(const T &ConstValue,
151 const Var &Other);
152template <typename T>
153std::enable_if_t<std::is_arithmetic_v<T>, Var &> operator*(const T &ConstValue,
154 const Var &Other);
155template <typename T>
156std::enable_if_t<std::is_arithmetic_v<T>, Var &> operator/(const T &ConstValue,
157 const Var &Other);
158template <typename T>
159std::enable_if_t<std::is_arithmetic_v<T>, Var &> operator%(const T &ConstValue,
160 const Var &Other);
161
162// Declare usual arithmetic conversion helper functions.
163Value *convert(IRBuilderBase IRB, Value *V, Type *TargetType);
164Type *getCommonType(const DataLayout &DL, Type *T1, Type *T2);
165
166// Declare intrinsic math functions.
167Var &powf(const Var &L, const Var &R);
168Var &sqrtf(const Var &R);
169Var &min(const Var &L, const Var &R);
170
172 // ScalarVar: wraps an alloca of a scalar value.
173 // Backing slot for the scalar value.
174 AllocaInst *Slot = nullptr;
175
176 explicit ScalarVar(AllocaInst *Slot, FuncBase &Fn);
177
178 StringRef getName() const override;
179 Type *getValueType() const override;
180 Value *getValue() const override;
181 void storeValue(Value *Val) override;
182 // Scalar does not support pointer semantics or indexing
183 Value *getPointerValue() const override;
184 void storePointer(Value *Ptr) override;
185 Var &index(size_t I) override;
186 Var &index(const Var &I) override;
187 VarKind kind() const override;
188 AllocaInst *getAlloca() const override;
189};
191 Type *PointerElemTy = nullptr;
192
193 explicit PointerVar(AllocaInst *PtrSlot, FuncBase &Fn, Type *ElemTy);
194
195 StringRef getName() const override;
196 Type *getValueType() const override;
197 Value *getValue() const override;
198 void storeValue(Value *Val) override;
199
200 Value *getPointerValue() const override;
201 void storePointer(Value *Ptr) override;
202
203 VarKind kind() const override;
204 AllocaInst *getAlloca() const override;
205
206 Var &index(size_t I) override;
207 Var &index(const Var &I) override;
208};
210 // Holds a pointer to an array aggregate and its type.
211 Value *BasePointer = nullptr;
212 ArrayType *ArrayTy = nullptr;
213
214 explicit ArrayVar(Value *BasePointer, FuncBase &Fn, ArrayType *ArrayTy);
215
216 StringRef getName() const override;
217 Type *getValueType() const override;
218 Value *getValue() const override;
219 void storeValue(Value *Val) override;
220 Value *getPointerValue() const override;
221 void storePointer(Value *Ptr) override;
222 VarKind kind() const override;
223
224 Var &index(size_t I) override;
225 Var &index(const Var &I) override;
226};
227
228} // namespace proteus
229
230#endif // PROTEUS_FRONTEND_VAR_HPP
Definition Func.hpp:39
Definition Helpers.h:138
Definition BuiltinsCUDA.cpp:4
Type * getCommonType(const DataLayout &DL, Type *T1, Type *T2)
Get the common type following C++ usual arithmetic conversions.
Definition Var.cpp:507
std::enable_if_t< std::is_arithmetic_v< T >, Var & > operator/(const T &ConstValue, const Var &V)
Definition Var.cpp:457
Var & powf(const Var &L, const Var &R)
Definition Var.cpp:528
Var & sqrtf(const Var &R)
Definition Var.cpp:551
VarKind
Definition Var.hpp:13
std::enable_if_t< std::is_arithmetic_v< T >, Var & > operator*(const T &ConstValue, const Var &V)
Definition Var.cpp:447
T getRuntimeConstantValue(void *Arg)
Definition CompilerInterfaceRuntimeConstantInfo.h:114
Var & min(const Var &L, const Var &R)
Definition Var.cpp:573
std::enable_if_t< std::is_arithmetic_v< T >, Var & > operator-(const T &ConstValue, const Var &V)
Definition Var.cpp:437
Value * convert(IRBuilderBase IRB, Value *V, Type *TargetType)
Definition Var.cpp:476
std::enable_if_t< std::is_arithmetic_v< T >, Var & > operator%(const T &ConstValue, const Var &V)
Definition Var.cpp:467
std::enable_if_t< std::is_arithmetic_v< T >, Var & > operator+(const T &ConstValue, const Var &V)
Definition Var.cpp:427
Definition Var.hpp:209
StringRef getName() const override
Definition Var.cpp:830
void storePointer(Value *Ptr) override
Definition Var.cpp:849
Value * getValue() const override
Definition Var.cpp:834
Type * getValueType() const override
Definition Var.cpp:832
VarKind kind() const override
End of comparison operators.
Definition Var.cpp:853
Var & index(size_t I) override
Definition Var.cpp:855
void storeValue(Value *Val) override
Definition Var.cpp:839
Value * getPointerValue() const override
Definition Var.cpp:845
Value * BasePointer
Definition Var.hpp:211
ArrayType * ArrayTy
Definition Var.hpp:212
Definition Var.hpp:190
void storeValue(Value *Val) override
Definition Var.cpp:779
Var & index(size_t I) override
Definition Var.cpp:797
Value * getValue() const override
Definition Var.cpp:773
AllocaInst * getAlloca() const override
Definition Var.cpp:795
StringRef getName() const override
Definition Var.cpp:756
Type * getValueType() const override
Definition Var.cpp:758
VarKind kind() const override
End of comparison operators.
Definition Var.cpp:793
Type * PointerElemTy
Definition Var.hpp:191
void storePointer(Value *Ptr) override
Definition Var.cpp:768
Value * getPointerValue() const override
Definition Var.cpp:760
Definition Var.hpp:171
Value * getPointerValue() const override
Definition Var.cpp:735
StringRef getName() const override
Definition Var.cpp:717
AllocaInst * Slot
Definition Var.hpp:174
Type * getValueType() const override
Definition Var.cpp:719
void storePointer(Value *Ptr) override
Definition Var.cpp:739
AllocaInst * getAlloca() const override
Definition Var.cpp:733
Var & index(size_t I) override
Definition Var.cpp:743
VarKind kind() const override
End of comparison operators.
Definition Var.cpp:731
Value * getValue() const override
Definition Var.cpp:721
void storeValue(Value *Val) override
Definition Var.cpp:726
Definition Var.hpp:15
Definition Var.hpp:17
Var & operator-(const Var &Other) const
Definition Var.cpp:85
VarKind Kind
Definition Var.hpp:21
Var & operator*=(Var &Other)
Definition Var.cpp:153
Var & operator/=(Var &Other)
Definition Var.cpp:173
virtual Var & index(const Var &I)=0
Var & operator%(const Var &Other) const
Definition Var.cpp:106
Var & operator!=(const Var &Other) const
Definition Var.cpp:344
Var(const Var &)=delete
Var & operator=(const Var &Other)
Definition Var.cpp:258
Var(Var &&)=delete
Var & operator<=(const Var &Other) const
Definition Var.cpp:320
Var & operator<(const Var &Other) const
Definition Var.cpp:308
virtual Value * getValue() const =0
Var & operator+=(Var &Other)
Definition Var.cpp:113
Var & operator+(const Var &Other) const
Definition Var.cpp:78
AllocaInst * Alloca
Definition Var.hpp:18
virtual Value * getPointerValue() const =0
Var & operator-=(Var &Other)
Definition Var.cpp:133
Var & operator[](size_t I)
Definition Var.cpp:420
FuncBase & Fn
Definition Var.hpp:19
Var & operator==(const Var &Other) const
Definition Var.cpp:332
virtual ~Var()=default
virtual StringRef getName() const =0
Var & operator*(const Var &Other) const
Definition Var.cpp:92
virtual AllocaInst * getAlloca() const
Definition Var.cpp:76
Var & operator>(const Var &Other) const
Define comparison operators.
Definition Var.cpp:284
Var & operator%=(Var &Other)
Definition Var.cpp:193
virtual Type * getValueType() const =0
Var & operator/(const Var &Other) const
Definition Var.cpp:99
Var & operator>=(const Var &Other) const
Definition Var.cpp:296
virtual VarKind kind() const
End of comparison operators.
Definition Var.cpp:418
virtual Var & index(size_t I)=0
virtual void storePointer(Value *Ptr)=0
virtual void storeValue(Value *Val)=0