Halide 22.0.0 Halide compiler and libraries

Classes | Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
Halide::Internal::CodeGen_Posix Class Reference

A code generator that emits posix code from a given Halide stmt. More...

`#include <CodeGen_Posix.h>`

Inheritance diagram for Halide::Internal::CodeGen_Posix:

## Classes
struct | Allocation
| A struct describing heap or stack allocations. More...

## Public Member Functions
| CodeGen_Posix (const Target &t)
| Create an posix code generator. More...
Public Member Functions inherited from Halide::Internal::CodeGen_LLVM
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
Public Member Functions inherited from Halide::Internal::IRVisitor
| IRVisitor ()=default
virtual | ~IRVisitor ()=default

## Protected Member Functions
void | visit (const Allocate *) override
| Posix implementation of Allocate. More...
void | visit (const Free *) override
| Generate code for a free node. More...
std::string | get_allocation_name (const std::string &n) override
| 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 Reinterpret *) 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 Store *) override
void | visit (const Block *) 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 | visit (const IntImm *)
| Generate code for various IR nodes. More...
virtual void | visit (const UIntImm *)
virtual void | visit (const FloatImm *)
virtual void | visit (const StringImm *)
virtual void | visit (const Cast *)
virtual void | visit (const Reinterpret *)
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 Let *)
virtual void | visit (const LetStmt *)
virtual void | visit (const AssertStmt *)
virtual void | visit (const ProducerConsumer *)
virtual void | visit (const Store *)
virtual void | visit (const Provide *)
| These IR nodes should have been removed during lowering. More...
virtual void | visit (const Allocate *)
| Generate code for an allocate node. More...
virtual void | visit (const Free *)
| Generate code for a free node. More...
virtual void | visit (const Realize *)
virtual void | visit (const Block *)
virtual void | visit (const Fork *)
virtual void | visit (const IfThenElse *)
virtual void | visit (const Evaluate *)
virtual void | visit (const Call *)
virtual void | visit (const Variable *)
virtual void | visit (const For *)
virtual void | visit (const Acquire *)
virtual void | visit (const Shuffle *)
virtual void | visit (const Prefetch *)
virtual void | visit (const HoistedStorage *)
virtual void | visit (const Atomic *)
virtual void | visit (const VectorReduce *)
Protected Member Functions inherited from Halide::Internal::CodeGen_LLVM
| 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_target () const =0
| What should be passed as -mcpu (warning: implies attrs!), -mattrs, and related for compilation. More...
virtual std::string | mcpu_tune () const =0
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 int | maximum_vector_bits () const
| Used to decide whether to break a vector up into multiple smaller operations. More...
virtual int | target_vscale () const
| For architectures that have vscale vectors, return the constant vscale to use. 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...
void | set_fast_fp_math ()
| Change floating-point math op emission to use fast flags. More...
void | set_strict_fp_math ()
| Change floating-point math op emission to use strict flags. 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 | 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 | 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)
std::string | mangle_llvm_type (llvm::Type *type)
| Return type string for LLVM type using LLVM IR intrinsic type mangling. More...
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 | function_does_not_access_memory (llvm::Function *fn)
| Add the appropriate function attribute to tell LLVM that the function doesn't access memory. 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 Reinterpret *) 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 Store *) override
void | visit (const Block *) 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 llvm::Type * | llvm_type_of (const Type &) const
| Get the llvm type equivalent to the given halide type in the current context. More...
llvm::Type * | llvm_type_of (llvm::LLVMContext *context, Halide::Type t, int effective_vscale) const
| Get the llvm type equivalent to a given halide type. 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 (const llvm::Type *t, int intrin_lanes, const std::string &name, std::vector< llvm::Value * >, bool scalable_vector_result=false, bool is_reduction=false)
llvm::Value * | call_intrin (const llvm::Type *t, int intrin_lanes, llvm::Function *intrin, std::vector< llvm::Value * >, bool is_reduction=false)
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...
llvm::Value * | reverse_vector (llvm::Value *vec)
| Reverse elements in a vector. 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 single vector. More...
bool | is_power_of_two (int x) const
bool | is_scalable_vector (llvm::Value *v) const
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 bool | supports_call_as_float16 (const Call *op) const
| Can we call this operation with float16 type? This is used to avoid "emulated" equivalent code-gen in case target has FP16 feature. More...
llvm::Value * | simple_call_intrin (const std::string &intrin, const std::vector< llvm::Value * > &args, llvm::Type *result_type)
| call_intrin does far too much to be useful and generally breaks things when one has carefully set things up for a specific architecture. More...
llvm::Value * | normalize_fixed_scalable_vector_type (llvm::Type *desired_type, llvm::Value *result)
| Ensure that a vector value is either fixed or vscale depending to match desired_type. More...
llvm::Value * | convert_fixed_or_scalable_vector_type (llvm::Value *arg, llvm::Type *desired_type)
| Convert between two LLVM vectors of potentially different scalable/fixed and size. More...
llvm::Value * | fixed_to_scalable_vector_type (llvm::Value *fixed)
| Convert an LLVM fixed vector value to the corresponding vscale vector value. More...
llvm::Value * | scalable_to_fixed_vector_type (llvm::Value *scalable)
| Convert an LLVM vscale vector value to the corresponding fixed vector value. More...
int | get_vector_num_elements (const llvm::Type *t)
| Get number of vector elements, taking into account scalable vectors. More...
llvm::Type * | get_vector_type (llvm::Type *, int n, VectorTypeConstraint type_constraint=VectorTypeConstraint::None) const
llvm::Constant * | get_splat (int lanes, llvm::Constant *value, VectorTypeConstraint type_constraint=VectorTypeConstraint::None) const
llvm::Value * | match_vector_type_scalable (llvm::Value *value, VectorTypeConstraint constraint)
| Make sure a value type has the same scalable/fixed vector type as a guide. More...
llvm::Value * | match_vector_type_scalable (llvm::Value *value, llvm::Type *guide)
llvm::Value * | match_vector_type_scalable (llvm::Value *value, llvm::Value *guide)
bool | try_vector_predication_comparison (const std::string &name, const Type &result_type, MaskVariant mask, llvm::Value *a, llvm::Value *b, const char *cmp_op)
| Generate a vector predicated comparison intrinsic call if use_llvm_vp_intrinsics is true and result_type is a vector type. More...
bool | try_vector_predication_intrinsic (const std::string &name, VPResultType result_type, int32_t length, MaskVariant mask, std::vector< VPArg > args)
| Generate an intrisic call if use_llvm_vp_intrinsics is true and length is greater than 1. More...
llvm::Value * | codegen_dense_vector_load (const Load *load, llvm::Value *vpred=nullptr, bool slice_to_native=true)
| Generate a basic dense vector load, with an optional predicate and control over whether or not we should slice the load into native vectors. 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 Reinterpret *)
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 Let *)
virtual void | visit (const LetStmt *)
virtual void | visit (const AssertStmt *)
virtual void | visit (const ProducerConsumer *)
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 Fork *)
virtual void | visit (const IfThenElse *)
virtual void | visit (const Evaluate *)
virtual void | visit (const Call *)
virtual void | visit (const Variable *)
virtual void | visit (const For *)
virtual void | visit (const Acquire *)
virtual void | visit (const Shuffle *)
virtual void | visit (const Prefetch *)
virtual void | visit (const HoistedStorage *)
virtual void | visit (const Atomic *)
virtual void | visit (const VectorReduce *)
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 Reinterpret *)
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 Let *)
virtual void | visit (const LetStmt *)
virtual void | visit (const AssertStmt *)
virtual void | visit (const ProducerConsumer *)
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 Fork *)
virtual void | visit (const IfThenElse *)
virtual void | visit (const Evaluate *)
virtual void | visit (const Call *)
virtual void | visit (const Variable *)
virtual void | visit (const For *)
virtual void | visit (const Acquire *)
virtual void | visit (const Shuffle *)
virtual void | visit (const Prefetch *)
virtual void | visit (const HoistedStorage *)
virtual void | visit (const Atomic *)
virtual void | visit (const VectorReduce *)

## Protected Attributes
Scope< Allocation > | allocations
| The allocations currently in scope. More...
Protected Attributes inherited from Halide::Internal::CodeGen_LLVM
std::unique_ptr< llvm::Module > | module
llvm::Function * | function = nullptr
llvm::LLVMContext * | context = nullptr
std::unique_ptr< llvm::IRBuilder< llvm::ConstantFolder, llvm::IRBuilderDefaultInserter > > | builder
llvm::Value * | value = nullptr
llvm::MDNode * | very_likely_branch = nullptr
llvm::MDNode * | fast_fp_math_md = nullptr
llvm::MDNode * | strict_fp_math_md = nullptr
std::vector< LoweredArgument > | current_function_args
bool | in_strict_float = false
bool | any_strict_float = false
Halide::Target | target
| The target we're generating code for. More...
llvm::Type * | void_t = nullptr
| Some useful llvm types. More...
llvm::Type * | i1_t = nullptr
llvm::Type * | i8_t = nullptr
llvm::Type * | i16_t = nullptr
llvm::Type * | i32_t = nullptr
llvm::Type * | i64_t = nullptr
llvm::Type * | f16_t = nullptr
llvm::Type * | f32_t = nullptr
llvm::Type * | f64_t = nullptr
llvm::PointerType * | ptr_t = nullptr
llvm::StructType * | halide_buffer_t_type = nullptr
llvm::StructType * | type_t_type
llvm::StructType * | dimension_t_type
llvm::StructType * | metadata_t_type = nullptr
llvm::StructType * | argument_t_type = nullptr
llvm::StructType * | scalar_value_t_type = nullptr
llvm::StructType * | device_interface_t_type = nullptr
llvm::StructType * | pseudostack_slot_t_type = nullptr
llvm::StructType * | semaphore_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_
size_t | requested_alloca_total = 0
| A (very) conservative guess at the size of all alloca() storage requested (including alignment padding). 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 = false
| 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 = false
| Emit atomic store instructions? More...
bool | use_llvm_vp_intrinsics = false
| Controls use of vector predicated intrinsics for vector operations. More...
std::map< WarningKind, std::string > | onetime_warnings

## Additional Inherited Members
Static Public Member Functions inherited from Halide::Internal::CodeGen_LLVM
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 inherited from Halide::Internal::CodeGen_LLVM
enum | DestructorType { Always , OnError , OnSuccess }
| Some destructors should always be called. More...
enum class | VectorTypeConstraint { None , Fixed , VScale }
| Interface to abstract vector code generation as LLVM is now providing multiple options to express even simple vector operations. More...
enum class | WarningKind { EmulatedFloat16 }
| Warning messages which we want to avoid displaying number of times. More...
using | MaskVariant = std::variant< NoMask, AllEnabledMask, llvm::Value * >
| Predication mask using the above two types for special cases and an llvm::Value for the general one. More...

## Detailed Description

A code generator that emits posix code from a given Halide stmt.

Definition at line 14 of file CodeGen_Posix.h.

## Constructor & Destructor Documentation

## ◆ CodeGen_Posix()

Halide::Internal::CodeGen_Posix::CodeGen_Posix | ( | const Target & | t | ) |

Create an posix code generator.

Processor features can be enabled using the appropriate arguments

## Member Function Documentation

## ◆ visit() [1/95]

void Halide::Internal::CodeGen_Posix::visit | ( | const Allocate * |  | ) |
| override protected virtual

Posix implementation of Allocate.

Small constant-sized allocations go on the stack. The rest go on the heap by calling "halide_malloc" and "halide_free" in the standard library.

Implements Halide::Internal::CodeGen_LLVM.

## ◆ visit() [2/95]

void Halide::Internal::CodeGen_Posix::visit | ( | const Free * |  | ) |
| override protected virtual

Generate code for a free node.

It has no default implementation and must be handled in an architecture-specific way.

Implements Halide::Internal::CodeGen_LLVM.

## ◆ get_allocation_name()

std::string Halide::Internal::CodeGen_Posix::get_allocation_name | ( | const std::string & | n | ) |
| override protected virtual

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 from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [3/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const IntImm * |  | ) |
| override protected virtual

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::CodeGen_LLVM.

## ◆ visit() [4/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const UIntImm * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [5/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const FloatImm * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [6/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const StringImm * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [7/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Cast * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [8/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Reinterpret * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [9/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Variable * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [10/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Add * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [11/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Sub * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [12/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Mul * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [13/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Div * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [14/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Mod * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [15/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Min * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [16/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Max * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [17/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const EQ * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [18/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const NE * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [19/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const LT * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [20/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const LE * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [21/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const GT * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [22/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const GE * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [23/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const And * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [24/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Or * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [25/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Not * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [26/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Select * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [27/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Load * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [28/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Ramp * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [29/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Broadcast * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [30/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Call * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [31/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Let * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [32/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const LetStmt * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [33/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const AssertStmt * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [34/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const ProducerConsumer * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [35/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const For * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [36/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Store * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [37/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Block * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [38/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const IfThenElse * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [39/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Evaluate * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [40/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Shuffle * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [41/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const VectorReduce * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [42/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Prefetch * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [43/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Atomic * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [44/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Allocate * |  | ) |
| override protected virtual

Generate code for an allocate node.

It has no default implementation - it must be handled in an architecture-specific way.

Implements Halide::Internal::CodeGen_LLVM.

## ◆ visit() [45/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Free * |  | ) |
| override protected virtual

Generate code for a free node.

It has no default implementation and must be handled in an architecture-specific way.

Implements Halide::Internal::CodeGen_LLVM.

## ◆ visit() [46/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Provide * |  | ) |
| override protected virtual

These IR nodes should have been removed during lowering.

CodeGen_LLVM will error out if they are present

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [47/95]

void Halide::Internal::CodeGen_LLVM::visit | ( | const Realize * |  | ) |
| override protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [48/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const IntImm * |  | ) |
| protected virtual

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::CodeGen_LLVM.

## ◆ visit() [49/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const UIntImm * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [50/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const FloatImm * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [51/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const StringImm * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [52/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Cast * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [53/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Reinterpret * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [54/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Add * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [55/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Sub * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [56/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Mul * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [57/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Div * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [58/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Mod * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [59/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Min * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [60/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Max * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [61/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const EQ * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [62/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const NE * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [63/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const LT * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [64/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const LE * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [65/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const GT * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [66/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const GE * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [67/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const And * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [68/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Or * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [69/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Not * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [70/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Select * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [71/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Load * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [72/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Ramp * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [73/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Broadcast * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [74/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Let * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [75/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const LetStmt * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [76/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const AssertStmt * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [77/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const ProducerConsumer * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [78/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Store * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [79/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Provide * |  | ) |
| protected virtual

These IR nodes should have been removed during lowering.

CodeGen_LLVM will error out if they are present

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [80/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Allocate * |  | ) |
| protected virtual

Generate code for an allocate node.

It has no default implementation - it must be handled in an architecture-specific way.

Implements Halide::Internal::CodeGen_LLVM.

## ◆ visit() [81/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Free * |  | ) |
| protected virtual

Generate code for a free node.

It has no default implementation and must be handled in an architecture-specific way.

Implements Halide::Internal::CodeGen_LLVM.

## ◆ visit() [82/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Realize * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [83/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Block * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [84/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Fork * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [85/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const IfThenElse * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [86/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Evaluate * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [87/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Call * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [88/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Variable * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [89/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const For * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [90/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Acquire * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [91/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Shuffle * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [92/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Prefetch * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [93/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const HoistedStorage * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [94/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const Atomic * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## ◆ visit() [95/95]

virtual void Halide::Internal::IRVisitor::visit | ( | const VectorReduce * |  | ) |
| protected virtual

Reimplemented from Halide::Internal::CodeGen_LLVM.

## Member Data Documentation

## ◆ allocations

Scope<Allocation> Halide::Internal::CodeGen_Posix::allocations
| protected

The allocations currently in scope.

The stack gets pushed when we enter a new function.

Definition at line 65 of file CodeGen_Posix.h.

The documentation for this class was generated from the following file:

- src/CodeGen_Posix.h