20#ifndef LLVMEXPR_IRGENERATORBASE_HPP
21#define LLVMEXPR_IRGENERATORBASE_HPP
31#include "VapourSynth4.h"
32#include "llvm/IR/IRBuilder.h"
33#include "llvm/IR/Intrinsics.h"
34#include "llvm/IR/LLVMContext.h"
35#include "llvm/IR/MDBuilder.h"
36#include "llvm/IR/Module.h"
41 const std::vector<Token>& tokens_in,
const VSVideoInfo* out_vi,
42 const std::vector<const VSVideoInfo*>& in_vi,
int width_in,
43 int height_in,
bool mirror,
44 const std::map<std::pair<int, std::string>,
int>& p_map,
46 llvm::LLVMContext& context_ref, llvm::Module& module_ref,
48 std::string func_name_in,
int approx_math_in);
63 const VSVideoInfo*
vo;
64 const std::vector<const VSVideoInfo*>&
vi;
69 const std::map<std::pair<int, std::string>,
int>&
prop_map;
101 const std::string& name);
103 template <
typename... Args>
107 void assumeAligned(llvm::Value* ptr_value,
unsigned alignment);
109 template <
typename MemInstT>
113 llvm::Value*
getFinalCoord(llvm::Value* coord, llvm::Value* max_dim,
117 llvm::Value* x,
int rel_x,
119 bool no_x_bounds_check);
130 llvm::Value* y_fp,
bool no_x_bounds_check);
133 std::vector<llvm::Value*>& rpn_stack,
134 llvm::Type* float_ty, llvm::Type* i32_ty,
135 bool use_approx_math);
138 std::vector<llvm::Value*>& rpn_stack,
139 llvm::Value* x, llvm::Value* y,
140 llvm::Value* x_fp, llvm::Value* y_fp,
141 bool no_x_bounds_check) = 0;
147template <
typename... Args>
151 static_assert(
sizeof...(Args) >= 1,
"At least one argument required");
152 llvm::SmallVector<llvm::Value*, 4> arg_vec{args...};
153 auto* callee = llvm::Intrinsic::getOrInsertDeclaration(
154 &
module, intrinsic_id, {arg_vec[0]->getType()});
155 auto* call =
builder.CreateCall(callee, arg_vec);
156 call->setFastMathFlags(
builder.getFastMathFlags());
160template <
typename MemInstT>
163 inst->setAlignment(llvm::Align(alignment));
164 inst->setMetadata(llvm::LLVMContext::MD_alias_scope,
166 inst->setMetadata(llvm::LLVMContext::MD_noalias,
llvm::Value * createIntrinsicCall(llvm::Intrinsic::ID intrinsic_id, Args... args)
const std::map< std::pair< int, std::string >, int > & prop_map
llvm::Value * getFinalCoord(llvm::Value *coord, llvm::Value *max_dim, bool use_mirror)
virtual void defineFunctionSignature()=0
llvm::IRBuilder & builder
IRGeneratorBase & operator=(const IRGeneratorBase &)=delete
llvm::LLVMContext & context
llvm::Value * generatePixelLoad(int clip_idx, llvm::Value *x, llvm::Value *y, bool mirror)
virtual bool processModeSpecificToken(const Token &token, std::vector< llvm::Value * > &rpn_stack, llvm::Value *x, llvm::Value *y, llvm::Value *x_fp, llvm::Value *y_fp, bool no_x_bounds_check)=0
const std::vector< const VSVideoInfo * > & vi
void generateIRFromTokens(llvm::Value *x, llvm::Value *y, llvm::Value *x_fp, llvm::Value *y_fp, bool no_x_bounds_check)
std::vector< llvm::MDNode * > alias_scopes
const std::vector< Token > & tokens
IRGeneratorBase(const std::vector< Token > &tokens_in, const VSVideoInfo *out_vi, const std::vector< const VSVideoInfo * > &in_vi, int width_in, int height_in, bool mirror, const std::map< std::pair< int, std::string >, int > &p_map, const analysis::ExpressionAnalysisResults &analysis_results_in, llvm::LLVMContext &context_ref, llvm::Module &module_ref, llvm::IRBuilder<> &builder_ref, MathLibraryManager &math_mgr, std::string func_name_in, int approx_math_in)
llvm::Value * generateLoadFromRowPtr(llvm::Value *row_ptr, int clip_idx, llvm::Value *x, int rel_x, bool use_mirror, bool no_x_bounds_check)
std::vector< llvm::MDNode * > alias_scope_lists
IRGeneratorBase(const IRGeneratorBase &)=delete
IRGeneratorBase(IRGeneratorBase &&)=delete
IRGeneratorBase & operator=(IRGeneratorBase &&)=delete
void setMemoryInstAttrs(MemInstT *inst, unsigned alignment, int rwptr_index)
llvm::AllocaInst * createAllocaInEntry(llvm::Type *type, const std::string &name)
void assumeAligned(llvm::Value *ptr_value, unsigned alignment)
virtual void generateLoops()=0
virtual ~IRGeneratorBase()=default
std::vector< llvm::Value * > preloaded_base_ptrs
std::vector< llvm::Value * > preloaded_strides
std::map< analysis::RelYAccess, llvm::Value * > row_ptr_cache
llvm::MDNode * alias_scope_domain
std::vector< llvm::MDNode * > noalias_scope_lists
MathLibraryManager & math_manager
void addLoopMetadata(llvm::BranchInst *loop_br)
virtual void finalizeAndStoreResult(llvm::Value *result_val, llvm::Value *x, llvm::Value *y)=0
const analysis::ExpressionAnalysisResults & analysis_results
void generatePixelStore(llvm::Value *value_to_store, llvm::Value *x, llvm::Value *y)
bool processCommonToken(const Token &token, std::vector< llvm::Value * > &rpn_stack, llvm::Type *float_ty, llvm::Type *i32_ty, bool use_approx_math)
llvm::Value * strides_arg