1#ifndef PROTEUS_FRONTEND_FUNC_HPP
2#define PROTEUS_FRONTEND_FUNC_HPP
7#include <llvm/IR/IRBuilder.h>
8#include <llvm/IR/Module.h>
22template <
typename BodyLambda>
class ForLoopBuilder;
27template <
typename T>
struct FnSig;
44 IRBuilderBase::InsertPoint
IP;
60 IRBuilderBase::InsertPoint
ContIP)
75 std::to_string(
static_cast<int>(Kind)));
99 static_assert(!std::is_array_v<T>,
"Expected non-array type");
105 template <
typename T>
108 static_assert(std::is_array_v<T>,
"Expected array type");
116 std::make_unique<ArrayVar>(BasePointer, *
this,
ArrTy));
135 template <
typename T>
149 auto &
EntryBB = F->getEntryBlock();
156 auto &Ctx = F->getContext();
166 IRB.CreateStore(
Arg, Alloca);
172 std::make_unique<PointerVar>(Alloca, *
this,
PtrElemTy));
175 Arguments.emplace_back(std::make_unique<ScalarVar>(Alloca, *
this));
179 IRB.ClearInsertionPoint();
197 template <
typename Sig>
198 std::enable_if_t<!std::is_void_v<typename FnSig<Sig>::RetT>,
Var &>
201 template <
typename Sig>
202 std::enable_if_t<std::is_void_v<typename FnSig<Sig>::RetT>,
void>
206 std::enable_if_t<!std::is_void_v<typename FnSig<Sig>::RetT>,
Var &>
210 std::enable_if_t<std::is_void_v<typename FnSig<Sig>::RetT>,
void>
213 template <
typename BuiltinFuncT>
215 using RetT = std::invoke_result_t<BuiltinFuncT &, FuncBase &>;
216 if constexpr (std::is_void_v<RetT>) {
217 std::invoke(std::forward<BuiltinFuncT>(
BuiltinFunc), *
this);
219 return std::invoke(std::forward<BuiltinFuncT>(
BuiltinFunc), *
this);
228 template <
typename BodyLambda = EmptyLambda>
238 void ret(std::optional<std::reference_wrapper<Var>>
OptRet = std::nullopt);
250 template <
typename T>
265 RetT (*CompiledFunc)(
ArgT...) =
nullptr;
268 template <std::size_t...
Is>
auto getArgsImpl(std::index_sequence<Is...>) {
278 auto getArgs() {
return getArgsImpl(std::index_sequence_for<ArgT...>{}); }
char int void ** Args
Definition CompilerInterfaceHost.cpp:21
#define PROTEUS_FATAL_ERROR(x)
Definition Error.h:7
Definition Dispatcher.hpp:54
Definition LoopNest.hpp:22
void declArgs()
Definition Func.hpp:147
Var & atomicMax(Var &Addr, Var &Val)
Definition Func.cpp:285
std::vector< Scope > Scopes
Definition Func.hpp:63
void setName(StringRef NewName)
Definition Func.hpp:242
Var & declVarInternal(StringRef Name, Type *Ty, Type *PointerElemType=nullptr)
Definition Func.cpp:28
void beginIf(Var &CondVar, const char *File=__builtin_FILE(), int Line=__builtin_LINE())
Definition Func.cpp:146
std::deque< std::unique_ptr< Var > > Variables
Definition Func.hpp:47
std::enable_if_t<!std::is_void_v< typename FnSig< Sig >::RetT >, Var & > call(StringRef Name)
Definition JitFrontend.hpp:271
decltype(auto) callBuiltin(BuiltinFuncT &&BuiltinFunc)
Definition Func.hpp:214
auto forLoop(const LoopBoundInfo &Bounds, BodyLambda &&Body={})
Definition Func.hpp:229
Var & defVar(T Val, StringRef Name="var")
Definition Func.hpp:120
std::deque< std::unique_ptr< Var > > RuntimeConstants
Definition Func.hpp:48
auto defRuntimeConsts(ArgT &&...Args)
Definition Func.hpp:143
std::deque< std::unique_ptr< Var > > Arguments
Definition Func.hpp:46
void endFunction()
Definition Func.cpp:65
Var & emitAtomic(AtomicRMWInst::BinOp Op, Var &Addr, Var &Val)
Definition Func.cpp:254
void beginFunction(const char *File=__builtin_FILE(), int Line=__builtin_LINE())
Definition Func.cpp:42
Var & atomicSub(Var &Addr, Var &Val)
Definition Func.cpp:278
IRBuilder IRB
Definition Func.hpp:43
Var & defRuntimeConst(T Val, StringRef Name="run.const.var")
Definition Func.hpp:136
Function * getFunction()
Definition Func.cpp:78
ScopeKind
Definition Func.hpp:52
void endIf()
Definition Func.cpp:180
Var & getArg(unsigned int ArgNo)
Definition Func.cpp:85
std::string Name
Definition Func.hpp:50
FunctionCallee FC
Definition Func.hpp:42
Var & defVar(const Var &Val, StringRef Name="var")
Definition Func.hpp:127
auto buildLoopNest(LoopBuilders &&...Loops)
Definition Func.hpp:234
IRBuilderBase::InsertPoint IP
Definition Func.hpp:44
JitModule & J
Definition Func.hpp:41
void ret(std::optional< std::reference_wrapper< Var > > OptRet=std::nullopt)
Definition Func.cpp:129
Value * emitArrayCreate(Type *Ty, AddressSpace AT, StringRef Name)
Definition Func.cpp:99
StringRef getName() const
Definition Func.hpp:240
Var & atomicMin(Var &Addr, Var &Val)
Definition Func.cpp:292
void beginFor(Var &IterVar, Var &InitVar, Var &UpperBound, Var &IncVar, const char *File=__builtin_FILE(), int Line=__builtin_LINE())
Definition Func.cpp:196
Var & declVar(size_t NElem, AddressSpace AS=AddressSpace::DEFAULT, StringRef Name="array_var")
Definition Func.hpp:106
Var & atomicAdd(Var &Addr, Var &Val)
Definition Func.cpp:271
void endFor()
Definition Func.cpp:299
std::string toString(ScopeKind Kind)
Definition Func.hpp:65
std::enable_if_t< std::is_arithmetic_v< T >, Var & > convert(Var &V)
Definition Func.hpp:251
IRBuilderBase & getIRBuilder()
Definition Func.cpp:22
AllocaInst * emitAlloca(Type *Ty, StringRef Name, AddressSpace AS=AddressSpace::DEFAULT)
Definition Func.cpp:87
Var & declVar(StringRef Name="var")
Definition Func.hpp:98
Func(JitModule &J, FunctionCallee FC, Dispatcher &Dispatch)
Definition Func.hpp:273
auto getCompiledFunc() const
Definition Func.hpp:280
auto getArgs()
Definition Func.hpp:278
void setCompiledFunc(RetT(*CompiledFuncIn)(ArgT...))
Definition Func.hpp:282
RetT operator()(ArgT... Args)
Definition JitFrontend.hpp:323
Definition JitFrontend.hpp:28
Definition LoopNest.hpp:12
Definition LoopNest.hpp:43
Definition BuiltinsCUDA.cpp:4
AddressSpace
Definition AddressSpace.hpp:6
T getRuntimeConstantValue(void *Arg)
Definition CompilerInterfaceRuntimeConstantInfo.h:114
Value * convert(IRBuilderBase IRB, Value *V, Type *TargetType)
Definition Var.cpp:476
void operator()() const
Definition Func.hpp:36
RetT_ RetT
Definition Func.hpp:30
Scope(const char *File, int Line, ScopeKind Kind, IRBuilderBase::InsertPoint ContIP)
Definition Func.hpp:59
int Line
Definition Func.hpp:55
ScopeKind Kind
Definition Func.hpp:56
std::string File
Definition Func.hpp:54
IRBuilderBase::InsertPoint ContIP
Definition Func.hpp:57
Definition TypeMap.hpp:13