43 #include <llvm/IR/DIBuilder.h> 44 #include <llvm/IR/DebugInfo.h> 45 #include <llvm/IR/InstrTypes.h> 46 #include <llvm/IR/Instructions.h> 118 void BranchIfMaskAny(llvm::BasicBlock *btrue, llvm::BasicBlock *bfalse);
122 void BranchIfMaskAll(llvm::BasicBlock *btrue, llvm::BasicBlock *bfalse);
171 void Break(
bool doCoherenceCheck);
178 void Continue(
bool doCoherenceCheck);
198 void StartSwitch(
bool isUniform, llvm::BasicBlock *bbAfterSwitch);
217 const std::vector<std::pair<int, llvm::BasicBlock *>> &
caseBlocks,
218 const std::map<llvm::BasicBlock *, llvm::BasicBlock *> &
nextBlocks);
273 llvm::Value *
Any(llvm::Value *mask);
277 llvm::Value *
All(llvm::Value *mask);
281 llvm::Value *
None(llvm::Value *mask);
286 llvm::Value *
LaneMask(llvm::Value *mask);
290 llvm::Value *
MasksAllEqual(llvm::Value *mask1, llvm::Value *mask2);
333 void AddDebugPos(llvm::Value *instruction,
const SourcePos *pos = NULL, llvm::DIScope *scope = NULL);
378 llvm::Value *
BinaryOperator(llvm::Instruction::BinaryOps inst, llvm::Value *v0, llvm::Value *v1,
379 const char *name = NULL);
383 llvm::Value *
NotOperator(llvm::Value *v,
const char *name = NULL);
388 llvm::Value *
CmpInst(llvm::Instruction::OtherOps inst, llvm::CmpInst::Predicate pred, llvm::Value *v0,
389 llvm::Value *v1,
const char *name = NULL);
393 llvm::Value *
SmearUniform(llvm::Value *value,
const char *name = NULL);
395 llvm::Value *
BitCastInst(llvm::Value *value, llvm::Type *type,
const char *name = NULL);
396 llvm::Value *
PtrToIntInst(llvm::Value *value,
const char *name = NULL);
397 llvm::Value *
PtrToIntInst(llvm::Value *value, llvm::Type *type,
const char *name = NULL);
398 llvm::Value *
IntToPtrInst(llvm::Value *value, llvm::Type *type,
const char *name = NULL);
400 llvm::Instruction *
TruncInst(llvm::Value *value, llvm::Type *type,
const char *name = NULL);
401 llvm::Instruction *
CastInst(llvm::Instruction::CastOps op, llvm::Value *value, llvm::Type *type,
402 const char *name = NULL);
403 llvm::Instruction *
FPCastInst(llvm::Value *value, llvm::Type *type,
const char *name = NULL);
404 llvm::Instruction *
SExtInst(llvm::Value *value, llvm::Type *type,
const char *name = NULL);
405 llvm::Instruction *
ZExtInst(llvm::Value *value, llvm::Type *type,
const char *name = NULL);
425 const char *name = NULL);
426 llvm::Value *
GetElementPtrInst(llvm::Value *basePtr, llvm::Value *index0, llvm::Value *index1,
const Type *ptrType,
427 const char *name = NULL);
435 llvm::Value *
AddElementOffset(llvm::Value *basePtr,
int elementNum,
const Type *ptrType,
const char *name = NULL,
441 llvm::Value *
SwitchBoolSize(llvm::Value *value, llvm::Type *fromType, llvm::Type *toType,
const char *name = NULL);
447 llvm::Value *
LoadInst(llvm::Value *ptr, llvm::Value *mask,
const Type *ptrType,
const char *name = NULL,
448 bool one_elem =
false);
454 llvm::Value *
LoadInst(llvm::Value *ptr,
const Type *type = NULL,
const char *name = NULL);
462 llvm::Value *
AllocaInst(llvm::Type *llvmType,
const char *name = NULL,
int align = 0,
bool atEntryBlock =
true);
473 llvm::Value *
AllocaInst(
const Type *ptrType,
const char *name = NULL,
int align = 0,
bool atEntryBlock =
true);
479 void StoreInst(llvm::Value *value, llvm::Value *ptr,
const Type *ptrType = NULL);
485 void StoreInst(llvm::Value *value, llvm::Value *ptr, llvm::Value *storeMask,
const Type *valueType,
486 const Type *ptrType);
491 void MemcpyInst(llvm::Value *dest, llvm::Value *src, llvm::Value *count, llvm::Value *align = NULL);
494 void BranchInst(llvm::BasicBlock *trueBlock, llvm::BasicBlock *falseBlock, llvm::Value *test);
499 llvm::Value *
ExtractInst(llvm::Value *v,
int elt,
const char *name = NULL);
504 llvm::Value *
InsertInst(llvm::Value *v, llvm::Value *eltVal,
int elt,
const char *name = NULL);
507 llvm::Value *
ShuffleInst(llvm::Value *v1, llvm::Value *v2, llvm::Value *mask,
const char *name = NULL);
512 llvm::Value *
BroadcastValue(llvm::Value *v, llvm::Type *vecType,
const char *name = NULL);
514 llvm::PHINode *
PhiNode(llvm::Type *type,
int count,
const char *name = NULL);
515 llvm::Instruction *
SelectInst(llvm::Value *test, llvm::Value *val0, llvm::Value *val1,
const char *name = NULL);
521 llvm::Value *
CallInst(llvm::Value *func,
const FunctionType *funcType,
const std::vector<llvm::Value *> &args,
522 const char *name = NULL);
526 llvm::Value *
CallInst(llvm::Value *func,
const FunctionType *funcType, llvm::Value *arg,
const char *name = NULL);
530 llvm::Value *
CallInst(llvm::Value *func,
const FunctionType *funcType, llvm::Value *arg0, llvm::Value *arg1,
531 const char *name = NULL);
535 llvm::Value *
LaunchInst(llvm::Value *callee, std::vector<llvm::Value *> &argVals, llvm::Value *launchCount[3]);
617 const std::vector<std::pair<int, llvm::BasicBlock *>> *
caseBlocks;
626 const std::map<llvm::BasicBlock *, llvm::BasicBlock *> *
nextBlocks;
677 std::map<std::string, llvm::BasicBlock *>
labelMap;
687 llvm::Value *
applyVaryingGEP(llvm::Value *basePtr, llvm::Value *index,
const Type *ptrType);
696 void scatter(llvm::Value *value, llvm::Value *ptr,
const Type *valueType,
const Type *ptrType, llvm::Value *mask);
697 void maskedStore(llvm::Value *value, llvm::Value *ptr,
const Type *ptrType, llvm::Value *mask);
698 void storeUniformToSOA(llvm::Value *value, llvm::Value *ptr, llvm::Value *mask,
const Type *valueType,
702 llvm::Value *
gather(llvm::Value *ptr,
const PointerType *ptrType, llvm::Value *mask,
const char *name);
const Function * GetFunction() const
llvm::Value * Any(llvm::Value *mask)
llvm::Value * pointerVectorToVoidPointers(llvm::Value *value)
void InitializeLabelMap(Stmt *code)
llvm::Value * PtrToIntInst(llvm::Value *value, const char *name=NULL)
void jumpIfAllLoopLanesAreDone(llvm::BasicBlock *target)
std::vector< CFInfo * > controlFlowInfo
llvm::Value * AddElementOffset(llvm::Value *basePtr, int elementNum, const Type *ptrType, const char *name=NULL, const PointerType **resultPtrType=NULL)
void BranchIfMaskNone(llvm::BasicBlock *btrue, llvm::BasicBlock *bfalse)
bool InForeachLoop() const
void StartSwitch(bool isUniform, llvm::BasicBlock *bbAfterSwitch)
llvm::Value * ShuffleInst(llvm::Value *v1, llvm::Value *v2, llvm::Value *mask, const char *name=NULL)
llvm::Value * ProgramIndexVector(bool is32bits=true)
void SetInternalMask(llvm::Value *val)
void StartLoop(llvm::BasicBlock *breakTarget, llvm::BasicBlock *continueTarget, bool uniformControlFlow)
llvm::Instruction * FPCastInst(llvm::Value *value, llvm::Type *type, const char *name=NULL)
void EmitVariableDebugInfo(Symbol *sym)
void SetInternalMaskAnd(llvm::Value *oldMask, llvm::Value *val)
llvm::Value * functionMaskValue
void BranchInst(llvm::BasicBlock *block)
void maskedStore(llvm::Value *value, llvm::Value *ptr, const Type *ptrType, llvm::Value *mask)
llvm::Instruction * ZExtInst(llvm::Value *value, llvm::Type *type, const char *name=NULL)
Interface class for statements in the ispc language.
FunctionEmitContext(Function *function, Symbol *funSym, llvm::Function *llvmFunction, SourcePos firstStmtPos)
llvm::Value * NotOperator(llvm::Value *v, const char *name=NULL)
llvm::Value * LoadInst(llvm::Value *ptr, llvm::Value *mask, const Type *ptrType, const char *name=NULL, bool one_elem=false)
void BranchIfMaskAll(llvm::BasicBlock *btrue, llvm::BasicBlock *bfalse)
std::vector< std::string > GetLabels()
llvm::Instruction * TruncInst(llvm::Value *value, llvm::Type *type, const char *name=NULL)
llvm::Value * AllocaInst(llvm::Type *llvmType, const char *name=NULL, int align=0, bool atEntryBlock=true)
llvm::BasicBlock * allocaBlock
std::vector< llvm::DIScope * > debugScopes
llvm::Value * CmpInst(llvm::Instruction::OtherOps inst, llvm::CmpInst::Predicate pred, llvm::Value *v0, llvm::Value *v1, const char *name=NULL)
void StartVaryingIf(llvm::Value *oldMask)
llvm::Value * LaunchInst(llvm::Value *callee, std::vector< llvm::Value *> &argVals, llvm::Value *launchCount[3])
void SetContinueTarget(llvm::BasicBlock *bb)
llvm::Value * launchGroupHandlePtr
bool ifsInCFAllUniform(int cfType) const
void addSwitchMaskCheck(llvm::Value *mask)
void StartForeach(ForeachType ft)
llvm::Value * breakLanesPtr
llvm::Value * emitGatherCallback(llvm::Value *lvalue, llvm::Value *retPtr)
void Continue(bool doCoherenceCheck)
llvm::Value * GetFullMask()
int VaryingCFDepth() const
void AddInstrumentationPoint(const char *note)
llvm::Value * MakeSlicePointer(llvm::Value *ptr, llvm::Value *offset)
llvm::Value * gather(llvm::Value *ptr, const PointerType *ptrType, llvm::Value *mask, const char *name)
llvm::Value * SwitchBoolSize(llvm::Value *value, llvm::Type *fromType, llvm::Type *toType, const char *name=NULL)
void restoreMaskGivenReturns(llvm::Value *oldMask)
Type implementation for pointers to other types.
void BranchIfMaskAny(llvm::BasicBlock *btrue, llvm::BasicBlock *bfalse)
void RestoreContinuedLanes()
llvm::Value * returnValuePtr
llvm::Value * loadUniformFromSOA(llvm::Value *ptr, llvm::Value *mask, const PointerType *ptrType, const char *name)
llvm::BasicBlock * GetCurrentBasicBlock()
void Break(bool doCoherenceCheck)
llvm::Value * CallInst(llvm::Value *func, const FunctionType *funcType, const std::vector< llvm::Value *> &args, const char *name=NULL)
llvm::BasicBlock * CreateBasicBlock(const char *name)
const std::map< llvm::BasicBlock *, llvm::BasicBlock * > * nextBlocks
llvm::Value * BroadcastValue(llvm::Value *v, llvm::Type *vecType, const char *name=NULL)
static void addGSMetadata(llvm::Value *inst, SourcePos pos)
llvm::Value * internalMaskPointer
llvm::BasicBlock * defaultBlock
void StoreInst(llvm::Value *value, llvm::Value *ptr, const Type *ptrType=NULL)
void EmitCaseLabel(int value, bool checkMask, SourcePos pos)
bool switchConditionWasUniform
llvm::Value * GetFunctionMask()
void AddDebugPos(llvm::Value *instruction, const SourcePos *pos=NULL, llvm::DIScope *scope=NULL)
SourcePos GetDebugPos() const
Abstract base class for nodes in the abstract syntax tree (AST).
llvm::Value * GetElementPtrInst(llvm::Value *basePtr, llvm::Value *index, const Type *ptrType, const char *name=NULL)
void CurrentLanesReturned(Expr *value, bool doCoherenceCheck)
llvm::BasicBlock * continueTarget
llvm::Value * LaneMask(llvm::Value *mask)
void MemcpyInst(llvm::Value *dest, llvm::Value *src, llvm::Value *count, llvm::Value *align=NULL)
llvm::PHINode * PhiNode(llvm::Type *type, int count, const char *name=NULL)
llvm::Value * addVaryingOffsetsIfNeeded(llvm::Value *ptr, const Type *ptrType)
llvm::Value * getMaskAtSwitchEntry()
void MatchIntegerTypes(llvm::Value **v0, llvm::Value **v1)
void SetBlockEntryMask(llvm::Value *mask)
Representation of a range of positions in a source file.
llvm::Value * continueLanesPtr
llvm::Value * None(llvm::Value *mask)
llvm::Instruction * SExtInst(llvm::Value *value, llvm::Type *type, const char *name=NULL)
int disableGSWarningCount
void SwitchInst(llvm::Value *expr, llvm::BasicBlock *defaultBlock, const std::vector< std::pair< int, llvm::BasicBlock *>> &caseBlocks, const std::map< llvm::BasicBlock *, llvm::BasicBlock *> &nextBlocks)
llvm::Function * llvmFunction
llvm::Value * GetStringPtr(const std::string &str)
void storeUniformToSOA(llvm::Value *value, llvm::Value *ptr, llvm::Value *mask, const Type *valueType, const PointerType *ptrType)
llvm::Value * InsertInst(llvm::Value *v, llvm::Value *eltVal, int elt, const char *name=NULL)
llvm::Value * fullMaskPointer
void DisableGatherScatterWarnings()
llvm::Value * returnedLanesPtr
void SetDebugPos(SourcePos pos)
llvm::Value * GetFullMaskPointer()
llvm::DISubprogram * diSubprogram
llvm::Value * GetInternalMask()
llvm::Value * BitCastInst(llvm::Value *value, llvm::Type *type, const char *name=NULL)
void SetInternalMaskAndNot(llvm::Value *oldMask, llvm::Value *test)
Type representing a function (return type + argument types)
Representation of a program symbol.
llvm::Value * ExtractInst(llvm::Value *v, int elt, const char *name=NULL)
void EnableGatherScatterWarnings()
Interface class that defines the type abstraction.
static bool initLabelBBlocks(ASTNode *node, void *data)
const std::vector< std::pair< int, llvm::BasicBlock * > > * caseBlocks
void SetCurrentBasicBlock(llvm::BasicBlock *bblock)
void EmitDefaultLabel(bool checkMask, SourcePos pos)
llvm::Instruction * SelectInst(llvm::Value *test, llvm::Value *val0, llvm::Value *val1, const char *name=NULL)
void EmitFunctionParameterDebugInfo(Symbol *sym, int parameterNum)
llvm::Value * blockEntryMask
Expr is the abstract base class that defines the interface that all expression types must implement...
llvm::Value * IntToPtrInst(llvm::Value *value, llvm::Type *type, const char *name=NULL)
llvm::Value * MasksAllEqual(llvm::Value *mask1, llvm::Value *mask2)
llvm::Value * All(llvm::Value *mask)
bool inSwitchStatement() const
llvm::DIScope * GetDIScope() const
llvm::Value * SmearUniform(llvm::Value *value, const char *name=NULL)
Main ispc.header file. Defines Target, Globals and Opt classes.
llvm::BasicBlock * breakTarget
void scatter(llvm::Value *value, llvm::Value *ptr, const Type *valueType, const Type *ptrType, llvm::Value *mask)
llvm::Instruction * CastInst(llvm::Instruction::CastOps op, llvm::Value *value, llvm::Type *type, const char *name=NULL)
llvm::Instruction * ReturnInst()
llvm::Value * applyVaryingGEP(llvm::Value *basePtr, llvm::Value *index, const Type *ptrType)
llvm::Value * BinaryOperator(llvm::Instruction::BinaryOps inst, llvm::Value *v0, llvm::Value *v1, const char *name=NULL)
llvm::BasicBlock * GetLabeledBasicBlock(const std::string &label)
void SetFunctionMask(llvm::Value *val)
std::map< std::string, llvm::BasicBlock * > labelMap
llvm::BasicBlock * bblock
llvm::Value * I1VecToBoolVec(llvm::Value *b)