Intel SPMD Program Compiler  1.12.0
Classes | Namespaces | Macros | Functions | Variables
llvmutil.h File Reference

Header file with declarations for various LLVM utility stuff. More...

#include "ispc_version.h"
#include <llvm/IR/Constants.h>
#include <llvm/IR/DerivedTypes.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Type.h>
Include dependency graph for llvmutil.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  LLVMTypes
 

Namespaces

 llvm
 

Macros

#define PTYPE(p)   (llvm::cast<llvm::SequentialType>((p)->getType()->getScalarType())->getElementType())
 

Functions

void InitLLVMUtil (llvm::LLVMContext *ctx, Target &target)
 
llvm::ConstantInt * LLVMInt8 (int8_t i)
 
llvm::ConstantInt * LLVMUInt8 (uint8_t i)
 
llvm::ConstantInt * LLVMInt16 (int16_t i)
 
llvm::ConstantInt * LLVMUInt16 (uint16_t i)
 
llvm::ConstantInt * LLVMInt32 (int32_t i)
 
llvm::ConstantInt * LLVMUInt32 (uint32_t i)
 
llvm::ConstantInt * LLVMInt64 (int64_t i)
 
llvm::ConstantInt * LLVMUInt64 (uint64_t i)
 
llvm::Constant * LLVMFloat (float f)
 
llvm::Constant * LLVMDouble (double f)
 
llvm::Constant * LLVMBoolVector (bool v)
 
llvm::Constant * LLVMInt8Vector (int8_t i)
 
llvm::Constant * LLVMUInt8Vector (uint8_t i)
 
llvm::Constant * LLVMInt16Vector (int16_t i)
 
llvm::Constant * LLVMUInt16Vector (uint16_t i)
 
llvm::Constant * LLVMInt32Vector (int32_t i)
 
llvm::Constant * LLVMUInt32Vector (uint32_t i)
 
llvm::Constant * LLVMInt64Vector (int64_t i)
 
llvm::Constant * LLVMUInt64Vector (uint64_t i)
 
llvm::Constant * LLVMFloatVector (float f)
 
llvm::Constant * LLVMDoubleVector (double f)
 
llvm::Constant * LLVMIntAsType (int64_t, llvm::Type *t)
 
llvm::Constant * LLVMUIntAsType (uint64_t, llvm::Type *t)
 
llvm::Constant * LLVMBoolVector (const bool *v)
 
llvm::Constant * LLVMInt8Vector (const int8_t *i)
 
llvm::Constant * LLVMUInt8Vector (const uint8_t *i)
 
llvm::Constant * LLVMInt16Vector (const int16_t *i)
 
llvm::Constant * LLVMUInt16Vector (const uint16_t *i)
 
llvm::Constant * LLVMInt32Vector (const int32_t *i)
 
llvm::Constant * LLVMUInt32Vector (const uint32_t *i)
 
llvm::Constant * LLVMInt64Vector (const int64_t *i)
 
llvm::Constant * LLVMUInt64Vector (const uint64_t *i)
 
llvm::Constant * LLVMFloatVector (const float *f)
 
llvm::Constant * LLVMDoubleVector (const double *f)
 
bool LLVMVectorValuesAllEqual (llvm::Value *v, llvm::Value **splat=NULL)
 
bool LLVMVectorIsLinear (llvm::Value *v, int stride)
 
bool LLVMExtractVectorInts (llvm::Value *v, int64_t ret[], int *nElts)
 
llvm::Value * LLVMFlattenInsertChain (llvm::Value *inst, int vectorWidth, bool compare=true, bool undef=true, bool searchFirstUndef=false)
 
void LLVMDumpValue (llvm::Value *v)
 
llvm::Value * LLVMExtractFirstVectorElement (llvm::Value *v)
 
llvm::Value * LLVMConcatVectors (llvm::Value *v1, llvm::Value *v2, llvm::Instruction *insertBefore)
 
llvm::Value * LLVMShuffleVectors (llvm::Value *v1, llvm::Value *v2, int32_t shuf[], int shufSize, llvm::Instruction *insertBefore)
 
const char * LLVMGetName (llvm::Value *v, const char *)
 
const char * LLVMGetName (const char *op, llvm::Value *v1, llvm::Value *v2)
 

Variables

llvm::Constant * LLVMTrue
 
llvm::Constant * LLVMFalse
 
llvm::Constant * LLVMMaskAllOn
 
llvm::Constant * LLVMMaskAllOff
 

Detailed Description

Header file with declarations for various LLVM utility stuff.

Definition in file llvmutil.h.

Macro Definition Documentation

◆ PTYPE

#define PTYPE (   p)    (llvm::cast<llvm::SequentialType>((p)->getType()->getScalarType())->getElementType())

Function Documentation

◆ InitLLVMUtil()

void InitLLVMUtil ( llvm::LLVMContext *  ctx,
Target target 
)

◆ LLVMBoolVector() [1/2]

llvm::Constant* LLVMBoolVector ( bool  v)

◆ LLVMBoolVector() [2/2]

llvm::Constant* LLVMBoolVector ( const bool *  v)

◆ LLVMConcatVectors()

llvm::Value* LLVMConcatVectors ( llvm::Value *  v1,
llvm::Value *  v2,
llvm::Instruction *  insertBefore 
)

This function takes two vectors, expected to be the same length, and returns a new vector of twice the length that represents concatenating the two of them.

Given two vectors of the same type, concatenate them into a vector that has twice as many elements, where the first half has the elements from the first vector and the second half has the elements from the second vector.

Definition at line 1483 of file llvmutil.cpp.

References Assert, ISPC_MAX_NVEC, and LLVMShuffleVectors().

Referenced by lAssembleResultVectors().

◆ LLVMDouble()

llvm::Constant* LLVMDouble ( double  f)

Returns an LLVM double constant of the given value

Definition at line 246 of file llvmutil.cpp.

References Globals::ctx, and g.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), lLLVMConstantValue(), LLVMDoubleVector(), and lTypeConvAtomic().

◆ LLVMDoubleVector() [1/2]

llvm::Constant* LLVMDoubleVector ( double  f)

Returns an LLVM double vector constant of the given value smeared across all elements

Definition at line 353 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMDouble(), and Globals::target.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), lLLVMConstantValue(), and lTypeConvAtomic().

◆ LLVMDoubleVector() [2/2]

llvm::Constant* LLVMDoubleVector ( const double *  f)

Returns an LLVM double vector based on the given array of values. The array should have g->target.vectorWidth elements.

Definition at line 361 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMDouble(), and Globals::target.

◆ LLVMDumpValue()

void LLVMDumpValue ( llvm::Value *  v)

This is a utility routine for debugging that dumps out the given LLVM value as well as (recursively) all of the other values that it depends on.

Definition at line 1362 of file llvmutil.cpp.

References lDumpValue().

Referenced by lGetBasePtrAndOffsets(), LLVMVectorIsLinear(), LLVMVectorValuesAllEqual(), lVectorShiftRightAllEqual(), and GatherCoalescePass::runOnBasicBlock().

◆ LLVMExtractFirstVectorElement()

llvm::Value* LLVMExtractFirstVectorElement ( llvm::Value *  v)

Given a vector-typed value, this function returns the value of its first element. Rather than just doing the straightforward thing of using a single extractelement instruction to do this, this function tries to rewrite the computation for the first element in scalar form; this is generally more efficient than computing the entire vector's worth of values just to extract the first element, in cases where only the first element's value is needed.

Definition at line 1472 of file llvmutil.cpp.

References lExtractFirstVectorElement().

Referenced by lComputeBasePtr(), and lComputeCommonPointer().

◆ LLVMExtractVectorInts()

bool LLVMExtractVectorInts ( llvm::Value *  v,
int64_t  ret[],
int *  nElts 
)

Given a vector-typed value v, if the vector is a vector with constant element values, this function extracts those element values into the ret[] array and returns the number of elements (i.e. the vector type's width) in *nElts. It returns true if successful and false if the given vector is not in fact a vector of constants.

Definition at line 690 of file llvmutil.cpp.

References Assert, and lVectorValuesAllEqual().

Referenced by lAllDivBaseEqual(), lCheckAndForLinear(), lExtractConstOffsets(), lVectorIs32BitInts(), and lVectorShiftRightAllEqual().

◆ LLVMFlattenInsertChain()

llvm::Value* LLVMFlattenInsertChain ( llvm::Value *  inst,
int  vectorWidth,
bool  compare = true,
bool  undef = true,
bool  searchFirstUndef = false 
)

This function takes chains of InsertElement instructions along the lines of:

v0 = insertelement undef, value_0, i32 index_0 v1 = insertelement v1, value_1, i32 index_1 ... vn = insertelement vn-1, value_n-1, i32 index_n-1

and initializes the provided elements array such that the i'th llvm::Value * in the array is the element that was inserted into the i'th element of the vector.

When the chain of insertelement instruction comes to an end, the only base case that this function handles is the initial value being a constant vector. For anything more complex (e.g. some other arbitrary value, it doesn't try to extract element values into the returned array.

This also handles one of two common broadcast patterns:

  1. broadcast_init.0 = insertelement <4 x i32> undef, i32 val, i32 0 broadcast.1 = shufflevector <4 x i32> smear.0, <4 x i32> undef, <4 x i32> zeroinitializer
  2. gep_ptr2int_broadcast_init = insertelement <8 x i64> undef, i64 gep_ptr2int, i32 0 %0 = add <8 x i64> gep_ptr2int_broadcast_init, <i64 4, i64 undef, i64 undef, i64 undef, i64 undef, i64 undef, i64 undef, i64 undef> gep_offset = shufflevector <8 x i64> %0, <8 x i64> undef, <8 x i32> zeroinitializer Function returns: Compare all elements and return one of them if all are equal, otherwise NULL. If searchFirstUndef argument is true, look for the vector with the first not-undef element, like: <i64 4, i64 undef, i64 undef, i64 undef, i64 undef, i64 undef, i64 undef, i64 undef> If compare argument is false, don't do compare and return first element instead. If undef argument is true, ignore undef elements (but all undef yields NULL anyway).

Definition at line 565 of file llvmutil.cpp.

References Assert, lGetIntValue(), lIsFirstElementConstVector(), and lValuesAreEqual().

Referenced by lExtractFirstVectorElement(), lGetBasePointer(), lIsExactMultiple(), and lVectorValuesAllEqual().

◆ LLVMFloat()

llvm::Constant* LLVMFloat ( float  f)

Returns an LLVM float constant of the given value

Definition at line 244 of file llvmutil.cpp.

References Globals::ctx, and g.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), lLLVMConstantValue(), LLVMFloatVector(), and lTypeConvAtomic().

◆ LLVMFloatVector() [1/2]

llvm::Constant* LLVMFloatVector ( float  f)

Returns an LLVM float vector constant of the given value smeared across all elements

Definition at line 338 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMFloat(), and Globals::target.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), lLLVMConstantValue(), and lTypeConvAtomic().

◆ LLVMFloatVector() [2/2]

llvm::Constant* LLVMFloatVector ( const float *  f)

Returns an LLVM float vector based on the given array of values. The array should have g->target.vectorWidth elements.

Definition at line 346 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMFloat(), and Globals::target.

◆ LLVMGetName() [1/2]

const char* LLVMGetName ( llvm::Value *  v,
const char *   
)

◆ LLVMGetName() [2/2]

const char* LLVMGetName ( const char *  op,
llvm::Value *  v1,
llvm::Value *  v2 
)

Definition at line 1526 of file llvmutil.cpp.

◆ LLVMInt16()

llvm::ConstantInt* LLVMInt16 ( int16_t  i)

Returns an LLVM i16 constant of the given value

Definition at line 220 of file llvmutil.cpp.

References Globals::ctx, and g.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), lLLVMConstantValue(), LLVMInt16Vector(), and lTypeConvAtomic().

◆ LLVMInt16Vector() [1/2]

llvm::Constant* LLVMInt16Vector ( int16_t  i)

Returns an LLVM i16 vector constant of the given value smeared across all elements

Definition at line 278 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMInt16(), and Globals::target.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), lLLVMConstantValue(), and lTypeConvAtomic().

◆ LLVMInt16Vector() [2/2]

llvm::Constant* LLVMInt16Vector ( const int16_t *  i)

Returns an LLVM i16 vector based on the given array of values. The array should have g->target.vectorWidth elements.

Definition at line 286 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMInt16(), and Globals::target.

◆ LLVMInt32()

llvm::ConstantInt* LLVMInt32 ( int32_t  i)

◆ LLVMInt32Vector() [1/2]

llvm::Constant* LLVMInt32Vector ( int32_t  i)

◆ LLVMInt32Vector() [2/2]

llvm::Constant* LLVMInt32Vector ( const int32_t *  i)

Returns an LLVM i32 vector based on the given array of values. The array should have g->target.vectorWidth elements.

Definition at line 316 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMInt32(), and Globals::target.

◆ LLVMInt64()

llvm::ConstantInt* LLVMInt64 ( int64_t  i)

◆ LLVMInt64Vector() [1/2]

llvm::Constant* LLVMInt64Vector ( int64_t  i)

◆ LLVMInt64Vector() [2/2]

llvm::Constant* LLVMInt64Vector ( const int64_t *  i)

Returns an LLVM i64 vector based on the given array of values. The array should have g->target.vectorWidth elements.

Definition at line 376 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMInt64(), and Globals::target.

◆ LLVMInt8()

llvm::ConstantInt* LLVMInt8 ( int8_t  i)

Returns an LLVM i8 constant of the given value

Definition at line 212 of file llvmutil.cpp.

References Globals::ctx, and g.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), lLLVMConstantValue(), LLVMInt8Vector(), lTypeConvAtomic(), and lUpdateVaryingCounter().

◆ LLVMInt8Vector() [1/2]

llvm::Constant* LLVMInt8Vector ( int8_t  i)

Returns an LLVM i8 vector constant of the given value smeared across all elements

Definition at line 248 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMInt8(), and Globals::target.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), lLLVMConstantValue(), and lTypeConvAtomic().

◆ LLVMInt8Vector() [2/2]

llvm::Constant* LLVMInt8Vector ( const int8_t *  i)

Returns an LLVM i8 vector based on the given array of values. The array should have g->target.vectorWidth elements.

Definition at line 256 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMInt8(), and Globals::target.

◆ LLVMIntAsType()

llvm::Constant* LLVMIntAsType ( int64_t  ,
llvm::Type *  t 
)

Returns a constant integer or vector (according to the given type) of the given signed integer value.

Definition at line 441 of file llvmutil.cpp.

Referenced by lComputeSliceIndex(), lEmitBinaryPointerArith(), lGSBaseOffsetsGetMoreConst(), and lGSToGSBaseOffsets().

◆ LLVMShuffleVectors()

llvm::Value* LLVMShuffleVectors ( llvm::Value *  v1,
llvm::Value *  v2,
int32_t  shuf[],
int  shufSize,
llvm::Instruction *  insertBefore 
)

This is a utility function for vector shuffling; it takes two vectors v1 and v2, and a compile-time constant set of integer permutations in shuf[] and returns a new vector of length shufSize that represents the corresponding shufflevector operation.

Shuffle two vectors together with a ShuffleVectorInst, returning a vector with shufSize elements, where the shuf[] array offsets are used to determine which element from the two given vectors is used for each result element.

Definition at line 1502 of file llvmutil.cpp.

References LLVMTypes::Int32Type, and LLVMInt32().

Referenced by lApplyLoad4(), lAssemble4Vector(), LLVMConcatVectors(), and lSplit8WideLoads().

◆ LLVMUInt16()

llvm::ConstantInt* LLVMUInt16 ( uint16_t  i)

Returns an LLVM i16 constant of the given value

Definition at line 224 of file llvmutil.cpp.

References Globals::ctx, and g.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), lLLVMConstantValue(), and LLVMUInt16Vector().

◆ LLVMUInt16Vector() [1/2]

llvm::Constant* LLVMUInt16Vector ( uint16_t  i)

Returns an LLVM i16 vector constant of the given value smeared across all elements

Definition at line 293 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMUInt16(), and Globals::target.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), and lLLVMConstantValue().

◆ LLVMUInt16Vector() [2/2]

llvm::Constant* LLVMUInt16Vector ( const uint16_t *  i)

Returns an LLVM i16 vector based on the given array of values. The array should have g->target.vectorWidth elements.

Definition at line 301 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMUInt16(), and Globals::target.

◆ LLVMUInt32()

llvm::ConstantInt* LLVMUInt32 ( uint32_t  i)

Returns an LLVM i32 constant of the given value

Definition at line 232 of file llvmutil.cpp.

References Globals::ctx, and g.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), lLLVMConstantValue(), and LLVMUInt32Vector().

◆ LLVMUInt32Vector() [1/2]

llvm::Constant* LLVMUInt32Vector ( uint32_t  i)

Returns an LLVM i32 vector constant of the given value smeared across all elements

Definition at line 323 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMUInt32(), and Globals::target.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), and lLLVMConstantValue().

◆ LLVMUInt32Vector() [2/2]

llvm::Constant* LLVMUInt32Vector ( const uint32_t *  i)

Returns an LLVM i32 vector based on the given array of values. The array should have g->target.vectorWidth elements.

Definition at line 331 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMUInt32(), and Globals::target.

◆ LLVMUInt64()

llvm::ConstantInt* LLVMUInt64 ( uint64_t  i)

Returns an LLVM i64 constant of the given value

Definition at line 240 of file llvmutil.cpp.

References Globals::ctx, and g.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), lLLVMConstantValue(), and LLVMUInt64Vector().

◆ LLVMUInt64Vector() [1/2]

llvm::Constant* LLVMUInt64Vector ( uint64_t  i)

Returns an LLVM i64 vector constant of the given value smeared across all elements

Definition at line 383 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMUInt64(), and Globals::target.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), and lLLVMConstantValue().

◆ LLVMUInt64Vector() [2/2]

llvm::Constant* LLVMUInt64Vector ( const uint64_t *  i)

Returns an LLVM i64 vector based on the given array of values. The array should have g->target.vectorWidth elements.

Definition at line 391 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMUInt64(), and Globals::target.

◆ LLVMUInt8()

llvm::ConstantInt* LLVMUInt8 ( uint8_t  i)

Returns an LLVM i8 constant of the given value

Definition at line 216 of file llvmutil.cpp.

References Globals::ctx, and g.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), lLLVMConstantValue(), and LLVMUInt8Vector().

◆ LLVMUInt8Vector() [1/2]

llvm::Constant* LLVMUInt8Vector ( uint8_t  i)

Returns an LLVM i8 vector constant of the given value smeared across all elements

Definition at line 263 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMUInt8(), and Globals::target.

Referenced by ConstExpr::GetConstant(), ConstExpr::GetValue(), and lLLVMConstantValue().

◆ LLVMUInt8Vector() [2/2]

llvm::Constant* LLVMUInt8Vector ( const uint8_t *  i)

Returns an LLVM i8 vector based on the given array of values. The array should have g->target.vectorWidth elements.

Definition at line 271 of file llvmutil.cpp.

References g, Target::getVectorWidth(), LLVMUInt8(), and Globals::target.

◆ LLVMUIntAsType()

llvm::Constant* LLVMUIntAsType ( uint64_t  ,
llvm::Type *  t 
)

Returns a constant integer or vector (according to the given type) of the given unsigned integer value.

Definition at line 454 of file llvmutil.cpp.

◆ LLVMVectorIsLinear()

bool LLVMVectorIsLinear ( llvm::Value *  v,
int  stride 
)

Given vector of integer-typed values, this function returns true if it can determine that the elements of the vector have a step of 'stride' between their values and false otherwise. This function tries to handle as many possibilities as possible, including things like all elements equal to some non-constant value plus an integer offset, etc. Needless to say (the halting problem and all that), it may return false for some vectors that are in fact linear.

Given vector of integer-typed values, see if the elements of the array have a step of 'stride' between their values. This function tries to handle as many possibilities as possible, including things like all elements equal to some non-constant value plus an integer offset, etc.

Definition at line 1326 of file llvmutil.cpp.

References Assert, Debug(), Globals::debugPrint, g, LLVMDumpValue(), and lVectorIsLinear().

Referenced by lGSToLoadStore().

◆ LLVMVectorValuesAllEqual()

bool LLVMVectorValuesAllEqual ( llvm::Value *  v,
llvm::Value **  splat 
)

Tests to see if all of the elements of the vector in the 'v' parameter are equal. Like lValuesAreEqual(), this is a conservative test and may return false for arrays where the values are actually all equal.

Tests to see if all of the elements of the vector in the 'v' parameter are equal. This is a conservative test and may return false for arrays where the values are actually all equal.

Definition at line 1061 of file llvmutil.cpp.

References Assert, Debug(), Globals::debugPrint, g, LLVMDumpValue(), lVectorIsLinear(), and lVectorValuesAllEqual().

Referenced by isFPIntBitCast(), lExtractOffsetVector248Scale(), lGSToLoadStore(), lIsExactMultiple(), and GatherCoalescePass::runOnBasicBlock().

Variable Documentation

◆ LLVMFalse

llvm::Constant * LLVMFalse

◆ LLVMMaskAllOff

llvm::Constant* LLVMMaskAllOff

◆ LLVMMaskAllOn

llvm::Constant* LLVMMaskAllOn

◆ LLVMTrue

llvm::Constant* LLVMTrue

These variables hold the corresponding LLVM constant values as a convenience to code elsewhere in the system.

Definition at line 90 of file llvmutil.cpp.

Referenced by ForStmt::EmitCode(), ForeachStmt::EmitCode(), ConstExpr::GetConstant(), ConstExpr::GetValue(), InitLLVMUtil(), lEmitLogicalOp(), lLLVMConstantValue(), LLVMBoolVector(), and IsCompileTimeConstantPass::runOnBasicBlock().