11 #ifndef OPENVDB_AX_CODEGEN_LEGACY_IR_HAS_BEEN_INCLUDED 12 #define OPENVDB_AX_CODEGEN_LEGACY_IR_HAS_BEEN_INCLUDED 14 #include <llvm/Config/llvm-config.h> 16 #if LLVM_VERSION_MAJOR <= 15 20 #include <openvdb/version.h> 22 #include <llvm/IR/IRBuilder.h> 32 inline auto ir_load(llvm::IRBuilder<>& B, llvm::Value* ptr,
const char*
Name =
"")
36 return B.CreateLoad(ptr->getType()->getPointerElementType(), ptr,
Name);
40 inline auto ir_gep(llvm::IRBuilder<>& B,
41 llvm::Value* ptr, llvm::ArrayRef<llvm::Value*> IdxList,
const char*
Name =
"")
46 return B.CreateGEP(ptr->getType()->getScalarType()->getPointerElementType(),
53 llvm::Value* ptr, uint64_t Idx0, uint64_t Idx1,
const char*
Name =
"")
58 return B.CreateConstGEP2_64(
59 ptr->getType()->getScalarType()->getPointerElementType(), ptr, Idx0,
65 llvm::Value* ptr, uint64_t Idx0, uint64_t Idx1,
const char*
Name =
"")
70 return B.CreateConstInBoundsGEP2_64(
71 ptr->getType()->getScalarType()->getPointerElementType(), ptr, Idx0,
85 llvm::Type* elementType = type;
86 while (elementType->isPointerTy()) {
87 elementType = elementType->getContainedType(0);
104 llvm::Type* targetElementType,
105 llvm::IRBuilder<>& builder)
107 OPENVDB_ASSERT(targetElementType && (targetElementType->isIntegerTy() ||
108 targetElementType->isFloatingPointTy()) &&
109 "Target element type is not a scalar type");
110 OPENVDB_ASSERT(ptrToArray && ptrToArray->getType()->isPointerTy() &&
111 "Input to arrayCast is not a pointer type.");
113 llvm::Type* arrayType = ptrToArray->getType()->getContainedType(0);
114 OPENVDB_ASSERT(arrayType && llvm::isa<llvm::ArrayType>(arrayType));
117 llvm::Type* sourceElementType = arrayType->getArrayElementType();
118 OPENVDB_ASSERT(sourceElementType && (sourceElementType->isIntegerTy() ||
119 sourceElementType->isFloatingPointTy()) &&
120 "Source element type is not a scalar type");
122 if (sourceElementType == targetElementType)
return ptrToArray;
126 const size_t elementSize = arrayType->getArrayNumElements();
127 llvm::Value* targetArray =
129 llvm::ArrayType::get(targetElementType, elementSize));
131 for (
size_t i = 0; i < elementSize; ++i) {
132 llvm::Value* target = builder.CreateConstGEP2_64(targetArray->getType()->getScalarType()->getPointerElementType(), targetArray, 0, i);
133 llvm::Value* source = builder.CreateConstGEP2_64(ptrToArray->getType()->getScalarType()->getPointerElementType(), ptrToArray, 0, i);
134 source = builder.CreateLoad(source->getType()->getPointerElementType(), source);
135 source = llvmCastFunction(builder, source, targetElementType);
136 builder.CreateStore(source, target);
153 llvm::IRBuilder<>& builder)
155 return builder.CreateConstGEP2_64(ptrToArray->getType()->getScalarType()->getPointerElementType(), ptrToArray, 0, index);
171 std::vector<llvm::Value*>& values,
172 llvm::IRBuilder<>& builder,
173 const bool loadElements =
false)
175 const size_t elements =
176 ptrToArray->getType()->getContainedType(0)->getArrayNumElements();
178 values.reserve(elements);
179 for (
size_t i = 0; i < elements; ++i) {
180 llvm::Value* value = builder.CreateConstGEP2_64(ptrToArray->getType()->getScalarType()->getPointerElementType(), ptrToArray, 0, i);
181 if (loadElements) value = builder.CreateLoad(value->getType()->getPointerElementType(), value);
182 values.push_back(value);
199 llvm::Value*& value1,
200 llvm::Value*& value2,
201 llvm::Value*& value3,
202 llvm::IRBuilder<>& builder)
204 OPENVDB_ASSERT(ptrToArray && ptrToArray->getType()->isPointerTy() &&
205 "Input to array3Unpack is not a pointer type.");
207 value1 = builder.CreateConstGEP2_64(ptrToArray->getType()->getScalarType()->getPointerElementType(), ptrToArray, 0, 0);
208 value2 = builder.CreateConstGEP2_64(ptrToArray->getType()->getScalarType()->getPointerElementType(), ptrToArray, 0, 1);
209 value3 = builder.CreateConstGEP2_64(ptrToArray->getType()->getScalarType()->getPointerElementType(), ptrToArray, 0, 2);
227 llvm::IRBuilder<>& builder)
229 llvm::Type* type =
typePrecedence(value1->getType(), value2->getType());
236 llvm::Type* vectorType = llvm::ArrayType::get(type, 3);
239 llvm::Value* e1 = builder.CreateConstGEP2_64(vector->getType()->getScalarType()->getPointerElementType(), vector, 0, 0);
240 llvm::Value* e2 = builder.CreateConstGEP2_64(vector->getType()->getScalarType()->getPointerElementType(), vector, 0, 1);
241 llvm::Value* e3 = builder.CreateConstGEP2_64(vector->getType()->getScalarType()->getPointerElementType(), vector, 0, 2);
243 builder.CreateStore(value1, e1);
244 builder.CreateStore(value2, e2);
245 builder.CreateStore(value3, e3);
261 llvm::IRBuilder<>& builder,
262 const size_t size = 3)
265 value->getType()->isFloatingPointTy()) &&
266 "value type is not a scalar type");
268 llvm::Type* type = value->getType();
271 llvm::ArrayType::get(type, size));
273 for (
size_t i = 0; i < size; ++i) {
274 llvm::Value* element = builder.CreateConstGEP2_64(array->getType()->getScalarType()->getPointerElementType(), array, 0, i);
275 builder.CreateStore(value, element);
290 llvm::IRBuilder<>& builder)
292 llvm::Type* type = values.front()->getType();
294 llvm::ArrayType::get(type, values.size()));
297 for (llvm::Value*
const& value : values) {
298 llvm::Value* element = builder.CreateConstGEP2_64(array->getType()->getScalarType()->getPointerElementType(), array, 0, idx++);
299 builder.CreateStore(value, element);
317 llvm::IRBuilder<>& builder)
322 for (llvm::Value*
const& value : values) {
328 for (llvm::Value*& value : values) {
338 llvm::IRBuilder<>& builder,
339 const size_t dim = 3)
342 scalar->getType()->isFloatingPointTy()) &&
343 "value type is not a scalar type");
345 llvm::Type* type = scalar->getType();
348 llvm::ArrayType::get(type, dim*dim));
351 for (
size_t i = 0; i < dim*dim; ++i) {
352 llvm::Value* m = ((i % (dim+1) == 0) ? scalar : zero);
353 llvm::Value* element = builder.CreateConstGEP2_64(array->getType()->getScalarType()->getPointerElementType(), array, 0, i);
354 builder.CreateStore(m, element);
365 #endif // LLVM_VERSION_MAJOR <= 15 367 #endif // OPENVDB_AX_CODEGEN_LEGACY_IR_HAS_BEEN_INCLUDED
llvm::Value * arrayIndexUnpack(llvm::Value *ptrToArray, const int16_t index, llvm::IRBuilder<> &builder)
Unpack a particular element of an array and return a pointer to that element The provided llvm Value ...
Definition: LegacyIR.h:151
llvm::Value * arrayPack(const std::vector< llvm::Value * > &values, llvm::IRBuilder<> &builder)
Pack a vector of loaded llvm scalar values into a new array of equal size and return a pointer to the...
Definition: LegacyIR.h:289
void array3Unpack(llvm::Value *ptrToArray, llvm::Value *&value1, llvm::Value *&value2, llvm::Value *&value3, llvm::IRBuilder<> &builder)
Unpack the first three elements of an array. The provided llvm Value is expected to be a pointer to a...
Definition: LegacyIR.h:198
std::function< llvm::Value *(llvm::IRBuilder<> &, llvm::Value *, llvm::Type *)> CastFunction
Definition: Utils.h:38
LLVM type mapping from pod types.
Definition: Types.h:67
Consolidated llvm types for most supported types.
llvm::Value * scalarToMatrix(llvm::Value *scalar, llvm::IRBuilder<> &builder, const size_t dim=3)
Definition: LegacyIR.h:337
auto ir_gep(llvm::IRBuilder<> &B, llvm::Value *ptr, llvm::ArrayRef< llvm::Value * > IdxList, const char *Name="")
Definition: LegacyIR.h:40
llvm::Type * getBaseContainedType(llvm::Type *const type)
Return the base llvm value which is being pointed to through any number of layered pointers...
Definition: LegacyIR.h:83
llvm::Value * arrayCast(llvm::Value *ptrToArray, llvm::Type *targetElementType, llvm::IRBuilder<> &builder)
Casts an array to another array of equal size but of a different element type. Both source and target...
Definition: LegacyIR.h:103
#define OPENVDB_ASSERT(X)
Definition: Assert.h:41
llvm::Value * insertStaticAlloca(llvm::IRBuilder<> &B, llvm::Type *type, llvm::Value *size=nullptr)
Insert a stack allocation at the beginning of the current function of the provided type and size...
Definition: Utils.h:117
llvm::Value * array3Pack(llvm::Value *value1, llvm::Value *value2, llvm::Value *value3, llvm::IRBuilder<> &builder)
Pack three values into a new array and return a pointer to the newly allocated array. If the values are of a mismatching type, the highets order type is uses, as defined by typePrecedence. All llvm values are expected to a be a loaded scalar type.
Definition: LegacyIR.h:224
Definition: Exceptions.h:13
auto ir_constinboundsgep2_64(llvm::IRBuilder<> &B, llvm::Value *ptr, uint64_t Idx0, uint64_t Idx1, const char *Name="")
Definition: LegacyIR.h:64
auto ir_constgep2_64(llvm::IRBuilder<> &B, llvm::Value *ptr, uint64_t Idx0, uint64_t Idx1, const char *Name="")
Definition: LegacyIR.h:52
llvm::Constant * llvmConstant(const T t, llvm::Type *type)
Returns an llvm Constant holding a scalar value.
Definition: Types.h:360
llvm::Value * arithmeticConversion(llvm::Value *value, llvm::Type *targetType, llvm::IRBuilder<> &builder)
Casts a scalar llvm Value to a target scalar llvm Type. Returns the cast scalar value of type targetT...
Definition: Utils.h:484
llvm::Value * arrayPackCast(std::vector< llvm::Value * > &values, llvm::IRBuilder<> &builder)
Pack a vector of loaded llvm scalar values into a new array of equal size and return a pointer to the...
Definition: LegacyIR.h:316
auto ir_load(llvm::IRBuilder<> &B, llvm::Value *ptr, const char *Name="")
Definition: LegacyIR.h:32
CastFunction llvmArithmeticConversion(const llvm::Type *const sourceType, const llvm::Type *const targetType, const std::string &twine="")
Returns a CastFunction which represents the corresponding instruction to convert a source llvm Type t...
Definition: Utils.h:220
std::string Name
Definition: Name.h:19
Utility code generation methods for performing various llvm operations.
llvm::Type * typePrecedence(llvm::Type *const typeA, llvm::Type *const typeB)
Returns the highest order type from two LLVM Scalar types.
Definition: Utils.h:173
void arrayUnpack(llvm::Value *ptrToArray, std::vector< llvm::Value * > &values, llvm::IRBuilder<> &builder, const bool loadElements=false)
Unpack an array type into llvm Values which represent all its elements The provided llvm Value is exp...
Definition: LegacyIR.h:170
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:121
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:218