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>
56 class RSForEachExpandPass : public llvm::ModulePass {
60 llvm::Module *Module;
61 llvm::LLVMContext *Context;
64 * Pointer to LLVM type information for the ForEachStubType and the function
68 llvm::StructType *ForEachStubType;
69 llvm::FunctionType *ExpandedFunctionType;
78 uint32_t getRootSignature(llvm::Function *Function) {
79 const llvm::NamedMDNode *ExportForEachMetadata =
83 llvm::SmallVector<llvm::Type*, 8> RootArgTys;
84 for (llvm::Function::arg_iterator B = Function->arg_begin(),
105 llvm::MDNode *SigNode = ExportForEachMetadata->getOperand(0);
107 llvm::Value *SigVal = SigNode->getOperand(0);
108 if (SigVal->getValueID() == llvm::Value::MDStringVal) {
109 llvm::StringRef SigString =
110 static_cast<llvm::MDString*>(SigVal)->getString();
133 llvm::Value *getStepValue(llvm::DataLayout *DL, llvm::Type *AllocType,
134 llvm::Value *OrigStep) {
138 llvm::PointerType *PT = llvm::dyn_cast<llvm::PointerType>(AllocType);
139 llvm::Type *VoidPtrTy = llvm::Type::getInt8PtrTy(*Context);
141 llvm::Type *ET = PT->getElementType();
143 llvm::Type *Int32Ty = llvm::Type::getInt32Ty(*Context);
144 return llvm::ConstantInt::get(Int32Ty, ETSize);
154 llvm::Type *VoidPtrTy = llvm::Type::getInt8PtrTy(*Context);
155 llvm::Type *Int32Ty = llvm::Type::getInt32Ty(*Context);
173 llvm::SmallVector<llvm::Type*, 16> StructTypes;
183 StructTypes.push_back(llvm::ArrayType::get(Int32Ty, 16)); // uint32_t ar[16]
185 StructTypes.push_back(llvm::PointerType::getUnqual(VoidPtrTy)); // const void **ins
189 llvm::StructType::create(StructTypes, "RsForEachStubParamStruct");
193 llvm::Type *ForEachStubPtrTy = ForEachStubType->getPointerTo();
195 llvm::SmallVector<llvm::Type*, 8> ParamTypes;
202 ExpandedFunctionType = llvm::FunctionType::get(llvm::Type::getVoidTy(*Context),
214 llvm::Function *createEmptyExpandedFunction(llvm::StringRef OldName) {
215 llvm::Function *ExpandedFunction =
216 llvm::Function::Create(ExpandedFunctionType,
217 llvm::GlobalValue::ExternalLinkage,
222 llvm::Function::arg_iterator AI = ExpandedFunction->arg_begin();
230 llvm::BasicBlock *Begin = llvm::BasicBlock::Create(*Context, "Begin",
232 llvm::IRBuilder<> Builder(Begin);
255 llvm::BasicBlock *createLoop(llvm::IRBuilder<> &Builder,
256 llvm::Value *LowerBound,
257 llvm::Value *UpperBound,
258 llvm::PHINode **LoopIV) {
261 llvm::BasicBlock *CondBB, *AfterBB, *HeaderBB;
262 llvm::Value *Cond, *IVNext;
263 llvm::PHINode *IV;
266 AfterBB = llvm::SplitBlock(CondBB, Builder.GetInsertPoint(), this);
267 HeaderBB = llvm::BasicBlock::Create(*Context, "Loop", CondBB->getParent());
308 bool ExpandFunction(llvm::Function *Function, uint32_t Signature) {
321 llvm::DataLayout DL(Module);
323 llvm::Function *ExpandedFunction =
332 llvm::Function::arg_iterator ExpandedFunctionArgIter =
335 llvm::Value *Arg_p = &*(ExpandedFunctionArgIter++);
336 llvm::Value *Arg_x1 = &*(ExpandedFunctionArgIter++);
337 llvm::Value *Arg_x2 = &*(ExpandedFunctionArgIter++);
338 llvm::Value *Arg_instep = &*(ExpandedFunctionArgIter++);
339 llvm::Value *Arg_outstep = &*ExpandedFunctionArgIter;
341 llvm::Value *InStep = NULL;
342 llvm::Value *OutStep = NULL;
345 llvm::IRBuilder<> Builder(ExpandedFunction->getEntryBlock().begin());
349 llvm::Function::arg_iterator FunctionArgIter = Function->arg_begin();
351 llvm::Type *InTy = NULL;
352 llvm::Value *InBasePtr = NULL;
360 llvm::Type *OutTy = NULL;
361 llvm::Value *OutBasePtr = NULL;
369 llvm::Value *UsrData = NULL;
371 llvm::Type *UsrDataTy = (FunctionArgIter++)->getType();
381 llvm::Value *Y = NULL;
389 llvm::PHINode *IV;
393 llvm::SmallVector<llvm::Value*, 8> RootArgs;
395 llvm::Value *InPtr = NULL;
396 llvm::Value *OutPtr = NULL;
407 llvm::Value *OutOffset = Builder.CreateSub(IV, Arg_x1);
414 llvm::Value *InOffset = Builder.CreateSub(IV, Arg_x1);
432 llvm::Value *X = IV;
448 bool ExpandKernel(llvm::Function *Function, uint32_t Signature) {
453 llvm::DataLayout DL(Module);
455 llvm::Function *ExpandedFunction =
465 llvm::Function::arg_iterator ExpandedFunctionArgIter =
468 llvm::Value *Arg_p = &*(ExpandedFunctionArgIter++);
469 llvm::Value *Arg_x1 = &*(ExpandedFunctionArgIter++);
470 llvm::Value *Arg_x2 = &*(ExpandedFunctionArgIter++);
471 llvm::Value *Arg_instep = &*(ExpandedFunctionArgIter++);
472 llvm::Value *Arg_outstep = &*ExpandedFunctionArgIter;
475 llvm::IRBuilder<> Builder(ExpandedFunction->getEntryBlock().begin());
478 llvm::MDNode *TBAARenderScript, *TBAAAllocation, *TBAAPointer;
479 llvm::MDBuilder MDHelper(*Context);
494 llvm::Value *Y = NULL;
508 llvm::Function::arg_iterator ArgIter = Function->arg_begin();
511 llvm::Type *OutTy = NULL;
512 llvm::Value *OutStep = NULL;
513 llvm::LoadInst *OutBasePtr = NULL;
518 llvm::Type *OutBaseTy = Function->getReturnType();
539 llvm::SmallVector<llvm::Type*, 8> InTypes;
540 llvm::SmallVector<llvm::Value*, 8> InSteps;
541 llvm::SmallVector<llvm::LoadInst*, 8> InBasePtrs;
542 llvm::SmallVector<bool, 8> InIsStructPointer;
545 llvm::Type *InType = ArgIter->getType();
563 llvm::Value *InStep = getStepValue(&DL, InType, Arg_instep);
567 llvm::Value *Input = Builder.CreateStructGEP(Arg_p, 0);
568 llvm::LoadInst *InBasePtr = Builder.CreateLoad(Input, "input_base");
579 llvm::Value *InsMember = Builder.CreateStructGEP(Arg_p, 10);
580 llvm::LoadInst *InsBasePtr = Builder.CreateLoad(InsMember,
583 llvm::Value *InStepsMember = Builder.CreateStructGEP(Arg_p, 11);
584 llvm::LoadInst *InStepsBase = Builder.CreateLoad(InStepsMember,
590 llvm::Value *IndexVal = Builder.getInt32(InputIndex);
592 llvm::Value *InStepAddr = Builder.CreateGEP(InStepsBase, IndexVal);
593 llvm::LoadInst *InStepArg = Builder.CreateLoad(InStepAddr,
596 llvm::Type *InType = ArgIter->getType();
614 llvm::Value *InStep = getStepValue(&DL, InType, InStepArg);
618 llvm::Value *InputAddr = Builder.CreateGEP(InsBasePtr, IndexVal);
619 llvm::LoadInst *InBasePtr = Builder.CreateLoad(InputAddr,
632 llvm::PHINode *IV;
636 llvm::SmallVector<llvm::Value*, 8> RootArgs;
651 llvm::Value *OutPtr = NULL;
653 llvm::Value *OutOffset = Builder.CreateSub(IV, Arg_x1);
667 llvm::Value *Offset = Builder.CreateSub(IV, Arg_x1);
670 llvm::Value *InOffset = Builder.CreateMul(Offset, InSteps[Index]);
671 llvm::Value *InPtr = Builder.CreateGEP(InBasePtrs[Index], InOffset);
675 llvm::Value *Input;
681 llvm::LoadInst *InputLoad = Builder.CreateLoad(InPtr, "input");
694 llvm::Value *X = IV;
703 llvm::Value *RetVal = Builder.CreateCall(Function, RootArgs);
706 llvm::StoreInst *Store = Builder.CreateStore(RetVal, OutPtr);
725 bool allocPointersExposed(llvm::Module &Module) {
760 llvm::Function *Function = Module.getFunction(*FI);
779 /// root node. LLVM does assume may-alias for all nodes in unrelated alias
784 void connectRenderScriptTBAAMetadata(llvm::Module &Module) {
785 llvm::MDBuilder MDHelper(*Context);
786 llvm::MDNode *TBAARenderScript =
789 llvm::MDNode *TBAARoot = MDHelper.createTBAARoot("Simple C/C++ TBAA");
790 llvm::MDNode *TBAAMergedRS = MDHelper.createTBAANode("RenderScript",
796 virtual bool runOnModule(llvm::Module &Module) {
817 llvm::Function *kernel = Module.getFunction(name);
821 kernel->setLinkage(llvm::GlobalValue::InternalLinkage);
824 kernel->setLinkage(llvm::GlobalValue::InternalLinkage);
852 llvm::ModulePass *