Home | History | Annotate | Download | only in Renderscript

Lines Matching full:llvm

22 #include <llvm/IR/DerivedTypes.h>
23 #include <llvm/IR/Function.h>
24 #include <llvm/IR/Instructions.h>
25 #include <llvm/IR/IRBuilder.h>
26 #include <llvm/IR/MDBuilder.h>
27 #include <llvm/IR/Module.h>
28 #include <llvm/Pass.h>
29 #include <llvm/Support/raw_ostream.h>
30 #include <llvm/IR/DataLayout.h>
31 #include <llvm/IR/Function.h>
32 #include <llvm/IR/Type.h>
33 #include <llvm/Transforms/Utils/BasicBlockUtils.h>
53 class RSForEachExpandPass : public llvm::ModulePass {
57 llvm::Module *M;
58 llvm::LLVMContext *C;
65 uint32_t getRootSignature(llvm::Function *F) {
66 const llvm::NamedMDNode *ExportForEachMetadata =
70 llvm::SmallVector<llvm::Type*, 8> RootArgTys;
71 for (llvm::Function::arg_iterator B = F->arg_begin(),
92 llvm::MDNode *SigNode = ExportForEachMetadata->getOperand(0);
94 llvm::Value *SigVal = SigNode->getOperand(0);
95 if (SigVal->getValueID() == llvm::Value::MDStringVal) {
96 llvm::StringRef SigString =
97 static_cast<llvm::MDString*>(SigVal)->getString();
120 llvm::Value *getStepValue(llvm::DataLayout *DL, llvm::Type *T,
121 llvm::Value *OrigStep) {
125 llvm::PointerType *PT = llvm::dyn_cast<llvm::PointerType>(T);
126 llvm::Type *VoidPtrTy = llvm::Type::getInt8PtrTy(*C);
128 llvm::Type *ET = PT->getElementType();
130 llvm::Type *Int32Ty = llvm::Type::getInt32Ty(*C);
131 return llvm::ConstantInt::get(Int32Ty, ETSize);
142 llvm::Type *getForeachStubTy() {
143 llvm::Type *VoidPtrTy = llvm::Type::getInt8PtrTy(*C);
144 llvm::Type *Int32Ty = llvm::Type::getInt32Ty(*C);
145 llvm::Type *SizeTy = Int32Ty;
161 llvm::SmallVector<llvm::Type*, 9> StructTys;
171 StructTys.push_back(llvm::ArrayType::get(Int32Ty, 16)); // uint32_t ar[16]
173 return llvm::StructType::create(StructTys, "RsForEachStubParamStruct");
183 llvm::Function *createEmptyExpandedFunction(llvm::StringRef OldName) {
184 llvm::Type *ForEachStubPtrTy = getForeachStubTy()->getPointerTo();
185 llvm::Type *Int32Ty = llvm::Type::getInt32Ty(*C);
187 llvm::SmallVector<llvm::Type*, 8> ParamTys;
194 llvm::FunctionType *FT =
195 llvm::FunctionType::get(llvm::Type::getVoidTy(*C), ParamTys, false);
196 llvm::Function *F =
197 llvm::Function::Create(FT, llvm::GlobalValue::ExternalLinkage,
200 llvm::Function::arg_iterator AI = F->arg_begin();
215 llvm::BasicBlock *Begin = llvm::BasicBlock::Create(*C, "Begin", F);
216 llvm::IRBuilder<> Builder(Begin);
239 llvm::BasicBlock *createLoop(llvm::IRBuilder<> &Builder,
240 llvm::Value *LowerBound,
241 llvm::Value *UpperBound,
242 llvm::PHINode **LoopIV) {
245 llvm::BasicBlock *CondBB, *AfterBB, *HeaderBB;
246 llvm::Value *Cond, *IVNext;
247 llvm::PHINode *IV;
250 AfterBB = llvm::SplitBlock(CondBB, Builder.GetInsertPoint(), this);
251 HeaderBB = llvm::BasicBlock::Create(*C, "Loop", CondBB->getParent());
292 bool ExpandFunction(llvm::Function *F, uint32_t Signature) {
304 llvm::DataLayout DL(M);
306 llvm::Function *ExpandedFunc = createEmptyExpandedFunction(F->getName());
309 llvm::SmallVector<llvm::Argument*, 8> ArgVec;
310 for (llvm::Function::arg_iterator B = ExpandedFunc->arg_begin(),
322 llvm::Value *Arg_p = ArgVec[0];
323 llvm::Value *Arg_x1 = ArgVec[1];
324 llvm::Value *Arg_x2 = ArgVec[2];
325 llvm::Value *Arg_instep = ArgVec[3];
326 llvm::Value *Arg_outstep = ArgVec[4];
328 llvm::Value *InStep = NULL;
329 llvm::Value *OutStep = NULL;
332 llvm::IRBuilder<> Builder(ExpandedFunc->getEntryBlock().begin());
336 llvm::Function::arg_iterator Args = F->arg_begin();
338 llvm::Type *InTy = NULL;
339 llvm::Value *InBasePtr = NULL;
348 llvm::Type *OutTy = NULL;
349 llvm::Value *OutBasePtr = NULL;
358 llvm::Value *UsrData = NULL;
360 llvm::Type *UsrDataTy = Args->getType();
371 llvm::Value *Y = NULL;
379 llvm::PHINode *IV;
383 llvm::SmallVector<llvm::Value*, 8> RootArgs;
385 llvm::Value *InPtr = NULL;
386 llvm::Value *OutPtr = NULL;
397 llvm::Value *OutOffset = Builder.CreateSub(IV, Arg_x1);
403 llvm::Value *InOffset = Builder.CreateSub(IV, Arg_x1);
421 llvm::Value *X = IV;
437 bool ExpandKernel(llvm::Function *F, uint32_t Signature) {
442 llvm::DataLayout DL(M);
444 llvm::Function *ExpandedFunc = createEmptyExpandedFunction(F->getName());
447 llvm::SmallVector<llvm::Argument*, 8> ArgVec;
448 for (llvm::Function::arg_iterator B = ExpandedFunc->arg_begin(),
460 llvm::Value *Arg_p = ArgVec[0];
461 llvm::Value *Arg_x1 = ArgVec[1];
462 llvm::Value *Arg_x2 = ArgVec[2];
463 llvm::Value *Arg_instep = ArgVec[3];
464 llvm::Value *Arg_outstep = ArgVec[4];
466 llvm::Value *InStep = NULL;
467 llvm::Value *OutStep = NULL;
470 llvm::IRBuilder<> Builder(ExpandedFunc->getEntryBlock().begin());
473 llvm::MDNode *TBAARenderScript, *TBAAAllocation, *TBAAPointer;
475 llvm::MDBuilder MDHelper(*C);
482 llvm::Function::arg_iterator Args = F->arg_begin();
484 llvm::Type *OutTy = NULL;
486 llvm::LoadInst *OutBasePtr = NULL;
488 llvm::Type *OutBaseTy = F->getReturnType();
503 llvm::Type *InBaseTy = NULL;
504 llvm::Type *InTy = NULL;
505 llvm::LoadInst *InBasePtr = NULL;
524 llvm::Value *Y = NULL;
532 llvm::PHINode *IV;
536 llvm::SmallVector<llvm::Value*, 8> RootArgs;
538 llvm::Value *InPtr = NULL;
539 llvm::Value *OutPtr = NULL;
550 llvm::Value *OutOffset = Builder.CreateSub(IV, Arg_x1);
556 llvm::Value *InOffset = Builder.CreateSub(IV, Arg_x1);
567 llvm::LoadInst *In = Builder.CreateLoad(InPtr, "In");
572 llvm::Value *X = IV;
581 llvm::Value *RetVal = Builder.CreateCall(F, RootArgs);
584 llvm::StoreInst *Store = Builder.CreateStore(RetVal, OutPtr);
601 bool allocPointersExposed(llvm::Module &M) {
638 llvm::Function *F = M.getFunction(*FI);
657 /// root node. LLVM does assume may-alias for all nodes in unrelated alias
662 void connectRenderScriptTBAAMetadata(llvm::Module &M) {
663 llvm::MDBuilder MDHelper(*C);
664 llvm::MDNode *TBAARenderScript = MDHelper.createTBAARoot("RenderScript TBAA");
666 llvm::MDNode *TBAARoot = MDHelper.createTBAARoot("Simple C/C++ TBAA");
667 llvm::MDNode *TBAAMergedRS = MDHelper.createTBAANode("RenderScript", TBAARoot);
672 virtual bool runOnModule(llvm::Module &M) {
684 llvm::Function *kernel = M.getFunction(name);
688 kernel->setLinkage(llvm::GlobalValue::InternalLinkage);
691 kernel->setLinkage(llvm::GlobalValue::InternalLinkage);
719 llvm::ModulePass *