Halide
12.0.1
Halide compiler and libraries
|
A code generator abstract base class. More...
#include <CodeGen_LLVM.h>
Inherits Halide::Internal::IRVisitor.
Inherited by Halide::Internal::CodeGen_Posix.
Classes | |
struct | Intrinsic |
Description of an intrinsic function overload. More... | |
struct | ParallelTask |
Codegen a call to do_parallel_tasks. More... | |
Public Member Functions | |
~CodeGen_LLVM () override | |
virtual std::unique_ptr< llvm::Module > | compile (const Module &module) |
Takes a halide Module and compiles it to an llvm Module. More... | |
const Target & | get_target () const |
The target we're generating code for. More... | |
void | set_context (llvm::LLVMContext &context) |
Tell the code generator which LLVM context to use. More... | |
size_t | get_requested_alloca_total () const |
![]() | |
IRVisitor ()=default | |
virtual | ~IRVisitor ()=default |
Static Public Member Functions | |
static std::unique_ptr< CodeGen_LLVM > | new_for_target (const Target &target, llvm::LLVMContext &context) |
Create an instance of CodeGen_LLVM suitable for the target. More... | |
static void | initialize_llvm () |
Initialize internal llvm state for the enabled targets. More... | |
static std::unique_ptr< llvm::Module > | compile_trampolines (const Target &target, llvm::LLVMContext &context, const std::string &suffix, const std::vector< std::pair< std::string, ExternSignature >> &externs) |
Protected Types | |
enum | DestructorType { Always , OnError , OnSuccess } |
Some destructors should always be called. More... | |
Protected Member Functions | |
CodeGen_LLVM (const Target &t) | |
virtual void | compile_func (const LoweredFunc &func, const std::string &simple_name, const std::string &extern_name) |
Compile a specific halide declaration into the llvm Module. More... | |
virtual void | compile_buffer (const Buffer<> &buffer) |
virtual void | begin_func (LinkageType linkage, const std::string &simple_name, const std::string &extern_name, const std::vector< LoweredArgument > &args) |
Helper functions for compiling Halide functions to llvm functions. More... | |
virtual void | end_func (const std::vector< LoweredArgument > &args) |
virtual std::string | mcpu () const =0 |
What should be passed as -mcpu, -mattrs, and related for compilation. More... | |
virtual std::string | mattrs () const =0 |
virtual std::string | mabi () const |
virtual bool | use_soft_float_abi () const =0 |
virtual bool | use_pic () const |
virtual bool | promote_indices () const |
Should indexing math be promoted to 64-bit on platforms with 64-bit pointers? More... | |
virtual int | native_vector_bits () const =0 |
What's the natural vector bit-width to use for loads, stores, etc. More... | |
virtual Type | upgrade_type_for_arithmetic (const Type &) const |
Return the type in which arithmetic should be done for the given storage type. More... | |
virtual Type | upgrade_type_for_storage (const Type &) const |
Return the type that a given Halide type should be stored/loaded from memory as. More... | |
virtual Type | upgrade_type_for_argument_passing (const Type &) const |
Return the type that a Halide type should be passed in and out of functions as. More... | |
virtual void | init_context () |
Grab all the context specific internal state. More... | |
virtual void | init_module () |
Initialize the CodeGen_LLVM internal state to compile a fresh module. More... | |
void | add_external_code (const Module &halide_module) |
Add external_code entries to llvm module. More... | |
void | optimize_module () |
Run all of llvm's optimization passes on the module. More... | |
void | sym_push (const std::string &name, llvm::Value *value) |
Add an entry to the symbol table, hiding previous entries with the same name. More... | |
void | sym_pop (const std::string &name) |
Remove an entry for the symbol table, revealing any previous entries with the same name. More... | |
llvm::Value * | sym_get (const std::string &name, bool must_succeed=true) const |
Fetch an entry from the symbol table. More... | |
bool | sym_exists (const std::string &name) const |
Test if an item exists in the symbol table. More... | |
llvm::FunctionType * | signature_to_type (const ExternSignature &signature) |
Given a Halide ExternSignature, return the equivalent llvm::FunctionType. More... | |
llvm::Value * | codegen (const Expr &) |
Emit code that evaluates an expression, and return the llvm representation of the result of the expression. More... | |
void | codegen (const Stmt &) |
Emit code that runs a statement. More... | |
void | scalarize (const Expr &) |
Codegen a vector Expr by codegenning each lane and combining. More... | |
llvm::Value * | register_destructor (llvm::Function *destructor_fn, llvm::Value *obj, DestructorType when) |
void | trigger_destructor (llvm::Function *destructor_fn, llvm::Value *stack_slot) |
Call a destructor early. More... | |
llvm::BasicBlock * | get_destructor_block () |
Retrieves the block containing the error handling code. More... | |
void | create_assertion (llvm::Value *condition, const Expr &message, llvm::Value *error_code=nullptr) |
Codegen an assertion. More... | |
void | codegen_asserts (const std::vector< const AssertStmt * > &asserts) |
Codegen a block of asserts with pure conditions. More... | |
void | get_parallel_tasks (const Stmt &s, std::vector< ParallelTask > &tasks, std::pair< std::string, int > prefix) |
void | do_parallel_tasks (const std::vector< ParallelTask > &tasks) |
void | do_as_parallel_task (const Stmt &s) |
void | return_with_error_code (llvm::Value *error_code) |
Return the the pipeline with the given error code. More... | |
llvm::Constant * | create_string_constant (const std::string &str) |
Put a string constant in the module as a global variable and return a pointer to it. More... | |
llvm::Constant * | create_binary_blob (const std::vector< char > &data, const std::string &name, bool constant=true) |
Put a binary blob in the module as a global variable and return a pointer to it. More... | |
llvm::Value * | create_broadcast (llvm::Value *, int lanes) |
Widen an llvm scalar into an llvm vector with the given number of lanes. More... | |
llvm::Value * | codegen_buffer_pointer (const std::string &buffer, Type type, llvm::Value *index) |
Generate a pointer into a named buffer at a given index, of a given type. More... | |
llvm::Value * | codegen_buffer_pointer (const std::string &buffer, Type type, Expr index) |
llvm::Value * | codegen_buffer_pointer (llvm::Value *base_address, Type type, Expr index) |
llvm::Value * | codegen_buffer_pointer (llvm::Value *base_address, Type type, llvm::Value *index) |
llvm::Value * | make_halide_type_t (const Type &) |
Turn a Halide Type into an llvm::Value representing a constant halide_type_t. More... | |
void | add_tbaa_metadata (llvm::Instruction *inst, std::string buffer, const Expr &index) |
Mark a load or store with type-based-alias-analysis metadata so that llvm knows it can reorder loads and stores across different buffers. More... | |
virtual std::string | get_allocation_name (const std::string &n) |
Get a unique name for the actual block of memory that an allocate node uses. More... | |
void | visit (const IntImm *) override |
Generate code for various IR nodes. More... | |
void | visit (const UIntImm *) override |
void | visit (const FloatImm *) override |
void | visit (const StringImm *) override |
void | visit (const Cast *) override |
void | visit (const Variable *) override |
void | visit (const Add *) override |
void | visit (const Sub *) override |
void | visit (const Mul *) override |
void | visit (const Div *) override |
void | visit (const Mod *) override |
void | visit (const Min *) override |
void | visit (const Max *) override |
void | visit (const EQ *) override |
void | visit (const NE *) override |
void | visit (const LT *) override |
void | visit (const LE *) override |
void | visit (const GT *) override |
void | visit (const GE *) override |
void | visit (const And *) override |
void | visit (const Or *) override |
void | visit (const Not *) override |
void | visit (const Select *) override |
void | visit (const Load *) override |
void | visit (const Ramp *) override |
void | visit (const Broadcast *) override |
void | visit (const Call *) override |
void | visit (const Let *) override |
void | visit (const LetStmt *) override |
void | visit (const AssertStmt *) override |
void | visit (const ProducerConsumer *) override |
void | visit (const For *) override |
void | visit (const Acquire *) override |
void | visit (const Store *) override |
void | visit (const Block *) override |
void | visit (const Fork *) override |
void | visit (const IfThenElse *) override |
void | visit (const Evaluate *) override |
void | visit (const Shuffle *) override |
void | visit (const VectorReduce *) override |
void | visit (const Prefetch *) override |
void | visit (const Atomic *) override |
void | visit (const Allocate *) override=0 |
Generate code for an allocate node. More... | |
void | visit (const Free *) override=0 |
Generate code for a free node. More... | |
void | visit (const Provide *) override |
These IR nodes should have been removed during lowering. More... | |
void | visit (const Realize *) override |
virtual void | prepare_for_early_exit () |
If we have to bail out of a pipeline midway, this should inject the appropriate target-specific cleanup code. More... | |
virtual llvm::Type * | llvm_type_of (const Type &) const |
Get the llvm type equivalent to the given halide type in the current context. More... | |
llvm::Value * | create_alloca_at_entry (llvm::Type *type, int n, bool zero_initialize=false, const std::string &name="") |
Perform an alloca at the function entrypoint. More... | |
llvm::Value * | get_user_context () const |
The user_context argument. More... | |
virtual llvm::Value * | interleave_vectors (const std::vector< llvm::Value * > &) |
Implementation of the intrinsic call to interleave_vectors. More... | |
llvm::Function * | get_llvm_intrin (const Type &ret_type, const std::string &name, const std::vector< Type > &arg_types, bool scalars_are_vectors=false) |
Get an LLVM intrinsic declaration. More... | |
llvm::Function * | get_llvm_intrin (llvm::Type *ret_type, const std::string &name, const std::vector< llvm::Type * > &arg_types) |
llvm::Function * | declare_intrin_overload (const std::string &name, const Type &ret_type, const std::string &impl_name, std::vector< Type > arg_types, bool scalars_are_vectors=false) |
Declare an intrinsic function that participates in overload resolution. More... | |
void | declare_intrin_overload (const std::string &name, const Type &ret_type, llvm::Function *impl, std::vector< Type > arg_types) |
llvm::Value * | call_overloaded_intrin (const Type &result_type, const std::string &name, const std::vector< Expr > &args) |
Call an overloaded intrinsic function. More... | |
llvm::Value * | call_intrin (const Type &t, int intrin_lanes, const std::string &name, std::vector< Expr >) |
Generate a call to a vector intrinsic or runtime inlined function. More... | |
llvm::Value * | call_intrin (const Type &t, int intrin_lanes, llvm::Function *intrin, std::vector< Expr >) |
llvm::Value * | call_intrin (llvm::Type *t, int intrin_lanes, const std::string &name, std::vector< llvm::Value * >) |
llvm::Value * | call_intrin (llvm::Type *t, int intrin_lanes, llvm::Function *intrin, std::vector< llvm::Value * >) |
virtual llvm::Value * | slice_vector (llvm::Value *vec, int start, int extent) |
Take a slice of lanes out of an llvm vector. More... | |
virtual llvm::Value * | concat_vectors (const std::vector< llvm::Value * > &) |
Concatenate a bunch of llvm vectors. More... | |
virtual llvm::Value * | shuffle_vectors (llvm::Value *a, llvm::Value *b, const std::vector< int > &indices) |
Create an LLVM shuffle vectors instruction. More... | |
llvm::Value * | shuffle_vectors (llvm::Value *v, const std::vector< int > &indices) |
Shorthand for shuffling a vector with an undef vector. More... | |
std::pair< llvm::Function *, int > | find_vector_runtime_function (const std::string &name, int lanes) |
Go looking for a vector version of a runtime function. More... | |
virtual bool | supports_atomic_add (const Type &t) const |
virtual void | codegen_vector_reduce (const VectorReduce *op, const Expr &init) |
Compile a horizontal reduction that starts with an explicit initial value. More... | |
virtual void | visit (const IntImm *) |
virtual void | visit (const UIntImm *) |
virtual void | visit (const FloatImm *) |
virtual void | visit (const StringImm *) |
virtual void | visit (const Cast *) |
virtual void | visit (const Variable *) |
virtual void | visit (const Add *) |
virtual void | visit (const Sub *) |
virtual void | visit (const Mul *) |
virtual void | visit (const Div *) |
virtual void | visit (const Mod *) |
virtual void | visit (const Min *) |
virtual void | visit (const Max *) |
virtual void | visit (const EQ *) |
virtual void | visit (const NE *) |
virtual void | visit (const LT *) |
virtual void | visit (const LE *) |
virtual void | visit (const GT *) |
virtual void | visit (const GE *) |
virtual void | visit (const And *) |
virtual void | visit (const Or *) |
virtual void | visit (const Not *) |
virtual void | visit (const Select *) |
virtual void | visit (const Load *) |
virtual void | visit (const Ramp *) |
virtual void | visit (const Broadcast *) |
virtual void | visit (const Call *) |
virtual void | visit (const Let *) |
virtual void | visit (const LetStmt *) |
virtual void | visit (const AssertStmt *) |
virtual void | visit (const ProducerConsumer *) |
virtual void | visit (const For *) |
virtual void | visit (const Store *) |
virtual void | visit (const Provide *) |
virtual void | visit (const Allocate *) |
virtual void | visit (const Free *) |
virtual void | visit (const Realize *) |
virtual void | visit (const Block *) |
virtual void | visit (const IfThenElse *) |
virtual void | visit (const Evaluate *) |
virtual void | visit (const Shuffle *) |
virtual void | visit (const VectorReduce *) |
virtual void | visit (const Prefetch *) |
virtual void | visit (const Fork *) |
virtual void | visit (const Acquire *) |
virtual void | visit (const Atomic *) |
Protected Attributes | |
std::unique_ptr< llvm::Module > | module |
llvm::Function * | function |
llvm::LLVMContext * | context |
llvm::IRBuilder< llvm::ConstantFolder, llvm::IRBuilderDefaultInserter > * | builder |
llvm::Value * | value |
llvm::MDNode * | very_likely_branch |
llvm::MDNode * | default_fp_math_md |
llvm::MDNode * | strict_fp_math_md |
std::vector< LoweredArgument > | current_function_args |
Halide::Target | target |
The target we're generating code for. More... | |
llvm::Type * | void_t |
Some useful llvm types. More... | |
llvm::Type * | i1_t |
llvm::Type * | i8_t |
llvm::Type * | i16_t |
llvm::Type * | i32_t |
llvm::Type * | i64_t |
llvm::Type * | f16_t |
llvm::Type * | f32_t |
llvm::Type * | f64_t |
llvm::StructType * | halide_buffer_t_type |
llvm::StructType * | type_t_type |
llvm::StructType * | dimension_t_type |
llvm::StructType * | metadata_t_type |
llvm::StructType * | argument_t_type |
llvm::StructType * | scalar_value_t_type |
llvm::StructType * | device_interface_t_type |
llvm::StructType * | pseudostack_slot_t_type |
llvm::StructType * | semaphore_t_type |
llvm::StructType * | semaphore_acquire_t_type |
llvm::StructType * | parallel_task_t_type |
Expr | wild_u1x_ |
Some wildcard variables used for peephole optimizations in subclasses. More... | |
Expr | wild_i8x_ |
Expr | wild_u8x_ |
Expr | wild_i16x_ |
Expr | wild_u16x_ |
Expr | wild_i32x_ |
Expr | wild_u32x_ |
Expr | wild_i64x_ |
Expr | wild_u64x_ |
Expr | wild_f32x_ |
Expr | wild_f64x_ |
Expr | wild_u1_ |
Expr | wild_i8_ |
Expr | wild_u8_ |
Expr | wild_i16_ |
Expr | wild_u16_ |
Expr | wild_i32_ |
Expr | wild_u32_ |
Expr | wild_i64_ |
Expr | wild_u64_ |
Expr | wild_f32_ |
Expr | wild_f64_ |
int | task_depth |
size_t | requested_alloca_total = 0 |
A (very) conservative guess at the size of all alloca() storage requested (including alignment padding). More... | |
std::set< std::string > | external_buffer |
Which buffers came in from the outside world (and so we can't guarantee their alignment) More... | |
std::map< std::string, std::vector< Intrinsic > > | intrinsics |
Mapping of intrinsic functions to the various overloads implementing it. More... | |
bool | inside_atomic_mutex_node |
Are we inside an atomic node that uses mutex locks? This is used for detecting deadlocks from nested atomics & illegal vectorization. More... | |
bool | emit_atomic_stores |
Emit atomic store instructions? More... | |
A code generator abstract base class.
Actual code generators (e.g. CodeGen_X86) inherit from this. This class is responsible for taking a Halide Stmt and producing llvm bitcode, machine code in an object file, or machine code accessible through a function pointer.
Definition at line 57 of file CodeGen_LLVM.h.
|
protected |
Some destructors should always be called.
Others should only be called if the pipeline is exiting with an error code.
Enumerator | |
---|---|
Always | |
OnError | |
OnSuccess |
Definition at line 231 of file CodeGen_LLVM.h.
|
override |
|
protected |
|
static |
Create an instance of CodeGen_LLVM suitable for the target.
|
virtual |
|
inline |
The target we're generating code for.
Definition at line 68 of file CodeGen_LLVM.h.
References target.
void Halide::Internal::CodeGen_LLVM::set_context | ( | llvm::LLVMContext & | context | ) |
Tell the code generator which LLVM context to use.
|
static |
Initialize internal llvm state for the enabled targets.
|
static |
|
inline |
Definition at line 84 of file CodeGen_LLVM.h.
References requested_alloca_total.
|
protectedvirtual |
Compile a specific halide declaration into the llvm Module.
|
protectedvirtual |
|
protectedvirtual |
Helper functions for compiling Halide functions to llvm functions.
begin_func performs all the work necessary to begin generating code for a function with a given argument list with the IRBuilder. A call to begin_func should be a followed by a call to end_func with the same arguments, to generate the appropriate cleanup code.
|
protectedvirtual |
|
protectedpure virtual |
What should be passed as -mcpu, -mattrs, and related for compilation.
The architecture-specific code generator should define these.
|
protectedpure virtual |
|
protectedvirtual |
|
protectedpure virtual |
|
protectedvirtual |
|
inlineprotectedvirtual |
Should indexing math be promoted to 64-bit on platforms with 64-bit pointers?
Definition at line 122 of file CodeGen_LLVM.h.
|
protectedpure virtual |
What's the natural vector bit-width to use for loads, stores, etc.
|
protectedvirtual |
Return the type in which arithmetic should be done for the given storage type.
|
protectedvirtual |
Return the type that a given Halide type should be stored/loaded from memory as.
|
protectedvirtual |
Return the type that a Halide type should be passed in and out of functions as.
|
protectedvirtual |
Grab all the context specific internal state.
|
protectedvirtual |
Initialize the CodeGen_LLVM internal state to compile a fresh module.
This allows reuse of one CodeGen_LLVM object to compiled multiple related modules (e.g. multiple device kernels).
|
protected |
Add external_code entries to llvm module.
|
protected |
Run all of llvm's optimization passes on the module.
|
protected |
|
protected |
Remove an entry for the symbol table, revealing any previous entries with the same name.
Call this when values go out of scope.
|
protected |
Fetch an entry from the symbol table.
If the symbol is not found, it either errors out (if the second arg is true), or returns nullptr.
|
protected |
Test if an item exists in the symbol table.
|
protected |
Given a Halide ExternSignature, return the equivalent llvm::FunctionType.
|
protected |
Emit code that evaluates an expression, and return the llvm representation of the result of the expression.
|
protected |
Emit code that runs a statement.
|
protected |
Codegen a vector Expr by codegenning each lane and combining.
|
protected |
|
protected |
Call a destructor early.
Pass in the value returned by register destructor.
|
protected |
Retrieves the block containing the error handling code.
Creates it if it doesn't already exist for this function.
|
protected |
Codegen an assertion.
If false, returns the error code (if not null), or evaluates and returns the message, which must be an Int(32) expression.
|
protected |
Codegen a block of asserts with pure conditions.
|
protected |
|
protected |
|
protected |
|
protected |
Return the the pipeline with the given error code.
Will run the destructor block.
|
protected |
Put a string constant in the module as a global variable and return a pointer to it.
|
protected |
Put a binary blob in the module as a global variable and return a pointer to it.
|
protected |
Widen an llvm scalar into an llvm vector with the given number of lanes.
|
protected |
Generate a pointer into a named buffer at a given index, of a given type.
The index counts according to the scalar type of the type passed in.
|
protected |
|
protected |
|
protected |
|
protected |
Turn a Halide Type into an llvm::Value representing a constant halide_type_t.
|
protected |
Mark a load or store with type-based-alias-analysis metadata so that llvm knows it can reorder loads and stores across different buffers.
|
inlineprotectedvirtual |
Get a unique name for the actual block of memory that an allocate node uses.
Used so that alias analysis understands when multiple Allocate nodes shared the same memory.
Reimplemented in Halide::Internal::CodeGen_Posix.
Definition at line 317 of file CodeGen_LLVM.h.
|
overrideprotectedvirtual |
Generate code for various IR nodes.
These can be overridden by architecture-specific code to perform peephole optimizations. The result of each is stored in value
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedpure virtual |
Generate code for an allocate node.
It has no default implementation - it must be handled in an architecture-specific way.
Reimplemented from Halide::Internal::IRVisitor.
Implemented in Halide::Internal::CodeGen_Posix.
|
overrideprotectedpure virtual |
Generate code for a free node.
It has no default implementation and must be handled in an architecture-specific way.
Reimplemented from Halide::Internal::IRVisitor.
Implemented in Halide::Internal::CodeGen_Posix.
|
overrideprotectedvirtual |
These IR nodes should have been removed during lowering.
CodeGen_LLVM will error out if they are present
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
inlineprotectedvirtual |
If we have to bail out of a pipeline midway, this should inject the appropriate target-specific cleanup code.
Definition at line 390 of file CodeGen_LLVM.h.
|
protectedvirtual |
Get the llvm type equivalent to the given halide type in the current context.
|
protected |
Perform an alloca at the function entrypoint.
Will be cleaned on function exit.
|
protected |
The user_context argument.
May be a constant null if the function is being compiled without a user context.
|
protectedvirtual |
Implementation of the intrinsic call to interleave_vectors.
This implementation allows for interleaving an arbitrary number of vectors.
|
protected |
Get an LLVM intrinsic declaration.
If it doesn't exist, it will be created.
|
protected |
|
protected |
Declare an intrinsic function that participates in overload resolution.
|
protected |
|
protected |
Call an overloaded intrinsic function.
Returns nullptr if no suitable overload is found.
|
protected |
Generate a call to a vector intrinsic or runtime inlined function.
The arguments are sliced up into vectors of the width given by 'intrin_lanes', the intrinsic is called on each piece, then the results (if any) are concatenated back together into the original type 't'. For the version that takes an llvm::Type *, the type may be void, so the vector width of the arguments must be specified explicitly as 'called_lanes'.
|
protected |
|
protected |
|
protected |
|
protectedvirtual |
Take a slice of lanes out of an llvm vector.
Pads with undefs if you ask for more lanes than the vector has.
|
protectedvirtual |
Concatenate a bunch of llvm vectors.
Must be of the same type.
|
protectedvirtual |
Create an LLVM shuffle vectors instruction.
|
protected |
Shorthand for shuffling a vector with an undef vector.
|
protected |
Go looking for a vector version of a runtime function.
Will return the best match. Matches in the following order:
1) The requested vector width.
2) The width which is the smallest power of two greater than or equal to the vector width.
3) All the factors of 2) greater than one, in decreasing order.
4) The smallest power of two not yet tried.
So for a 5-wide vector, it tries: 5, 8, 4, 2, 16.
If there's no match, returns (nullptr, 0).
|
protectedvirtual |
|
protectedvirtual |
Compile a horizontal reduction that starts with an explicit initial value.
There are lots of complex ways to peephole optimize this pattern, especially with the proliferation of dot-product instructions, and they can usefully share logic across backends.
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
Definition at line 141 of file CodeGen_LLVM.h.
|
protected |
Definition at line 142 of file CodeGen_LLVM.h.
|
protected |
Definition at line 143 of file CodeGen_LLVM.h.
|
protected |
Definition at line 144 of file CodeGen_LLVM.h.
|
protected |
Definition at line 145 of file CodeGen_LLVM.h.
|
protected |
Definition at line 146 of file CodeGen_LLVM.h.
|
protected |
Definition at line 147 of file CodeGen_LLVM.h.
|
protected |
Definition at line 148 of file CodeGen_LLVM.h.
|
protected |
Definition at line 149 of file CodeGen_LLVM.h.
|
protected |
The target we're generating code for.
Definition at line 153 of file CodeGen_LLVM.h.
Referenced by get_target().
|
protected |
Some useful llvm types.
Definition at line 191 of file CodeGen_LLVM.h.
|
protected |
Definition at line 191 of file CodeGen_LLVM.h.
|
protected |
Definition at line 191 of file CodeGen_LLVM.h.
|
protected |
Definition at line 191 of file CodeGen_LLVM.h.
|
protected |
Definition at line 191 of file CodeGen_LLVM.h.
|
protected |
Definition at line 191 of file CodeGen_LLVM.h.
|
protected |
Definition at line 191 of file CodeGen_LLVM.h.
|
protected |
Definition at line 191 of file CodeGen_LLVM.h.
|
protected |
Definition at line 191 of file CodeGen_LLVM.h.
|
protected |
Definition at line 192 of file CodeGen_LLVM.h.
|
protected |
Definition at line 193 of file CodeGen_LLVM.h.
|
protected |
Definition at line 194 of file CodeGen_LLVM.h.
|
protected |
Definition at line 195 of file CodeGen_LLVM.h.
|
protected |
Definition at line 196 of file CodeGen_LLVM.h.
|
protected |
Definition at line 197 of file CodeGen_LLVM.h.
|
protected |
Definition at line 198 of file CodeGen_LLVM.h.
|
protected |
Definition at line 199 of file CodeGen_LLVM.h.
|
protected |
Definition at line 200 of file CodeGen_LLVM.h.
|
protected |
Definition at line 201 of file CodeGen_LLVM.h.
|
protected |
Definition at line 202 of file CodeGen_LLVM.h.
|
protected |
Some wildcard variables used for peephole optimizations in subclasses.
Definition at line 209 of file CodeGen_LLVM.h.
|
protected |
Definition at line 209 of file CodeGen_LLVM.h.
|
protected |
Definition at line 209 of file CodeGen_LLVM.h.
|
protected |
Definition at line 209 of file CodeGen_LLVM.h.
|
protected |
Definition at line 209 of file CodeGen_LLVM.h.
|
protected |
Definition at line 210 of file CodeGen_LLVM.h.
|
protected |
Definition at line 210 of file CodeGen_LLVM.h.
|
protected |
Definition at line 210 of file CodeGen_LLVM.h.
|
protected |
Definition at line 210 of file CodeGen_LLVM.h.
|
protected |
Definition at line 211 of file CodeGen_LLVM.h.
|
protected |
Definition at line 211 of file CodeGen_LLVM.h.
|
protected |
Definition at line 214 of file CodeGen_LLVM.h.
|
protected |
Definition at line 214 of file CodeGen_LLVM.h.
|
protected |
Definition at line 214 of file CodeGen_LLVM.h.
|
protected |
Definition at line 214 of file CodeGen_LLVM.h.
|
protected |
Definition at line 214 of file CodeGen_LLVM.h.
|
protected |
Definition at line 215 of file CodeGen_LLVM.h.
|
protected |
Definition at line 215 of file CodeGen_LLVM.h.
|
protected |
Definition at line 215 of file CodeGen_LLVM.h.
|
protected |
Definition at line 215 of file CodeGen_LLVM.h.
|
protected |
Definition at line 216 of file CodeGen_LLVM.h.
|
protected |
Definition at line 216 of file CodeGen_LLVM.h.
|
protected |
Definition at line 278 of file CodeGen_LLVM.h.
|
protected |
A (very) conservative guess at the size of all alloca() storage requested (including alignment padding).
It's currently meant only to be used as a very coarse way to ensure there is enough stack space when testing on the WebAssembly backend.
It is not meant to be a useful proxy for "stack space needed", for a number of reasons:
Definition at line 415 of file CodeGen_LLVM.h.
Referenced by get_requested_alloca_total().
|
protected |
Which buffers came in from the outside world (and so we can't guarantee their alignment)
Definition at line 419 of file CodeGen_LLVM.h.
|
protected |
Mapping of intrinsic functions to the various overloads implementing it.
Definition at line 443 of file CodeGen_LLVM.h.
|
protected |
Are we inside an atomic node that uses mutex locks? This is used for detecting deadlocks from nested atomics & illegal vectorization.
Definition at line 515 of file CodeGen_LLVM.h.
|
protected |
Emit atomic store instructions?
Definition at line 518 of file CodeGen_LLVM.h.