#ifndef TAS_UTIL_H #define TAS_UTIL_H #include #include #include #include #include #include #include #include #include namespace tas { class TasException { public: llvm::Function * F_state; TasException(llvm::Function * F_) : F_state(F_) {} void dump() { F_state->print(llvm::errs()); } }; enum class AnnotationType { UNKNOWN, EXPENSIVE_PTR, BATCH_ARG }; void getAnnotatedFnList(llvm::Module * M, std::map & FnList); void setAnnotationInFunctionObject(llvm::Module * M); void cloneLoopBasicBlocks(llvm::Function * F, llvm::Loop * L, llvm::ValueToValueMapTy & VMap); void insertLLVMPrefetchIntrinsic(llvm::Function * F, llvm::Instruction * I); void replaceUsesWithinBB(llvm::Value * From, llvm::Value * To, llvm::BasicBlock * BB); unsigned getTypeSizeInBits(llvm::Type * Ty); llvm::SmallVector detectExpPtrVars(llvm::Function * F); llvm::SmallVector detectExpPtrUses(llvm::SmallVectorImpl & AnnotatedVars); void detectBatchParameters(llvm::Function * F, llvm::SmallPtrSet & BatchParameters); llvm::Instruction * findBatchBeginMarkerInstruction(llvm::Function * F); llvm::Value * createArray(llvm::Function * F, llvm::Type * Ty, unsigned size); template llvm::Instruction * findValueFirstUseInInstruction(llvm::Value * V); unsigned getGEPIndex(const llvm::GetElementPtrInst * GEP); llvm::StoreInst * findFirstUseInStoreInst(llvm::Value * V); void setSuccessor(llvm::BasicBlock * BB, llvm::BasicBlock * SuccBB, unsigned Idx = 0); void cloneBasicBlocksInto(llvm::Function * From, llvm::Function * To); void getReturnBlocks(llvm::Function * F, llvm::SmallVectorImpl & Returns); void getReturnInstList(llvm::Function * F, llvm::SmallVectorImpl & Result); std::string writeToBitCodeFile(llvm::Module & M); std::string writeToAsmFile(llvm::Module & M); llvm::Value * addIncrementIndexOp(llvm::AllocaInst * IdxPtr, llvm::Instruction * InsertBefore); void printRegeionInfo(llvm::Function * F); std::pair unifyFunctionExitNodes(llvm::Function & F); template auto findLastUseOfValueInInstType(llvm::Value * V) { auto FU = find_if(V->users(), [&] (const auto * U) { return llvm::isa(U)?true:false; }); return llvm::cast(*FU); } template auto findFirstUseOfValueInInstType(llvm::Value * V) { const InstType * LU = nullptr; for_each(V->users(), [&] (const auto * U) { if (llvm::isa(U)) LU = llvm::cast(U); }); return LU; } llvm::AllocaInst * getLoopIndexVar(llvm::Loop * L); const llvm::LoadInst * findEarliestPointerDerefInstruction(llvm::Value * V); void visitSuccessor(llvm::SmallVectorImpl & Blocks, llvm::BasicBlock * CurBlock, llvm::BasicBlock * EndBlock); llvm::AllocaInst * getLoopTripCount(llvm::Loop * L0); llvm::BasicBlock * getPreLoopBlock(llvm::Loop * L); } // namespace tas #endif