diff options
Diffstat (limited to 'src/gallium/drivers/radeon/R600KernelParameters.cpp')
-rw-r--r-- | src/gallium/drivers/radeon/R600KernelParameters.cpp | 496 |
1 files changed, 206 insertions, 290 deletions
diff --git a/src/gallium/drivers/radeon/R600KernelParameters.cpp b/src/gallium/drivers/radeon/R600KernelParameters.cpp index e810023b651..e86ebbcabcf 100644 --- a/src/gallium/drivers/radeon/R600KernelParameters.cpp +++ b/src/gallium/drivers/radeon/R600KernelParameters.cpp @@ -36,49 +36,47 @@ namespace { #define CONSTANT_CACHE_SIZE_DW 127 -class R600KernelParameters : public FunctionPass -{ - const TargetData * TD; +class R600KernelParameters : public FunctionPass { + const TargetData *TD; LLVMContext* Context; - Module *mod; + Module *Mod; - struct param - { - param() : val(NULL), ptr_val(NULL), offset_in_dw(0), size_in_dw(0), - indirect(true), specialID(0) {} + struct Param { + Param() : Val(NULL), PtrVal(NULL), OffsetInDW(0), SizeInDW(0), + IsIndirect(true), SpecialID(0) {} - Value* val; - Value* ptr_val; - int offset_in_dw; - int size_in_dw; + Value* Val; + Value* PtrVal; + int OffsetInDW; + int SizeInDW; - bool indirect; + bool IsIndirect; - std::string specialType; - int specialID; + std::string SpecialType; + int SpecialID; - int end() { return offset_in_dw + size_in_dw; } + int End() { return OffsetInDW + SizeInDW; } // The first 9 dwords are reserved for the grid sizes. - int get_rat_offset() { return 9 + offset_in_dw; } + int getRatOffset() { return 9 + OffsetInDW; } }; - std::vector<param> params; + std::vector<Param> Params; - bool isOpenCLKernel(const Function* fun); + bool IsOpenCLKernel(const Function *Fun); int getLastSpecialID(const std::string& TypeName); int getListSize(); - void AddParam(Argument* arg); - int calculateArgumentSize(Argument* arg); - void RunAna(Function* fun); - void Replace(Function* fun); - bool isIndirect(Value* val, std::set<Value*>& visited); - void Propagate(Function* fun); - void Propagate(Value* v, const Twine& name, bool indirect = true); - Value* ConstantRead(Function* fun, param& p); - Value* handleSpecial(Function* fun, param& p); - bool isSpecialType(Type*); - std::string getSpecialTypeName(Type*); + void AddParam(Argument *Arg); + int CalculateArgumentSize(Argument *Arg); + void RunAna(Function *Fun); + void Replace(Function *Fun); + bool IsIndirect(Value *Val, std::set<Value*> &Visited); + void Propagate(Function* Fun); + void Propagate(Value *V, const Twine &Name, bool IsIndirect = true); + Value* ConstantRead(Function *Fun, Param &P); + Value* handleSpecial(Function *Fun, Param &P); + bool IsSpecialType(Type *T); + std::string getSpecialTypeName(Type *T); public: static char ID; R600KernelParameters() : FunctionPass(ID) {}; @@ -95,27 +93,22 @@ char R600KernelParameters::ID = 0; static RegisterPass<R600KernelParameters> X("kerparam", "OpenCL Kernel Parameter conversion", false, false); -bool R600KernelParameters::isOpenCLKernel(const Function* fun) -{ - Module *mod = const_cast<Function*>(fun)->getParent(); - NamedMDNode * md = mod->getOrInsertNamedMetadata("opencl.kernels"); +bool R600KernelParameters::IsOpenCLKernel(const Function* Fun) { + Module *Mod = const_cast<Function*>(Fun)->getParent(); + NamedMDNode * MD = Mod->getOrInsertNamedMetadata("opencl.kernels"); - if (!md or !md->getNumOperands()) - { + if (!MD or !MD->getNumOperands()) { return false; } - for (int i = 0; i < int(md->getNumOperands()); i++) - { - if (!md->getOperand(i) or !md->getOperand(i)->getOperand(0)) - { + for (int i = 0; i < int(MD->getNumOperands()); i++) { + if (!MD->getOperand(i) or !MD->getOperand(i)->getOperand(0)) { continue; } - - assert(md->getOperand(i)->getNumOperands() == 1); - if (md->getOperand(i)->getOperand(0)->getName() == fun->getName()) - { + assert(MD->getOperand(i)->getNumOperands() == 1); + + if (MD->getOperand(i)->getOperand(0)->getName() == Fun->getName()) { return true; } } @@ -123,76 +116,61 @@ bool R600KernelParameters::isOpenCLKernel(const Function* fun) return false; } -int R600KernelParameters::getLastSpecialID(const std::string& TypeName) -{ - int lastID = -1; +int R600KernelParameters::getLastSpecialID(const std::string &TypeName) { + int LastID = -1; - for (std::vector<param>::iterator i = params.begin(); i != params.end(); i++) - { - if (i->specialType == TypeName) - { - lastID = i->specialID; + for (std::vector<Param>::iterator i = Params.begin(); i != Params.end(); i++) { + if (i->SpecialType == TypeName) { + LastID = i->SpecialID; } } - return lastID; + return LastID; } -int R600KernelParameters::getListSize() -{ - if (params.size() == 0) - { +int R600KernelParameters::getListSize() { + if (Params.size() == 0) { return 0; } - return params.back().end(); + return Params.back().End(); } -bool R600KernelParameters::isIndirect(Value* val, std::set<Value*>& visited) -{ +bool R600KernelParameters::IsIndirect(Value *Val, std::set<Value*> &Visited) { //XXX Direct parameters are not supported yet, so return true here. return true; #if 0 - if (isa<LoadInst>(val)) - { + if (isa<LoadInst>(Val)) { return false; } - if (isa<IntegerType>(val->getType())) - { + if (isa<IntegerType>(Val->getType())) { assert(0 and "Internal error"); return false; } - if (visited.count(val)) - { + if (Visited.count(Val)) { return false; } - visited.insert(val); + Visited.insert(Val); - if (isa<GetElementPtrInst>(val)) - { - GetElementPtrInst* GEP = dyn_cast<GetElementPtrInst>(val); - GetElementPtrInst::op_iterator i = GEP->op_begin(); + if (isa<getElementPtrInst>(Val)) { + getElementPtrInst* GEP = dyn_cast<getElementPtrInst>(Val); + getElementPtrInst::op_iterator I = GEP->op_begin(); - for (i++; i != GEP->op_end(); i++) - { - if (!isa<Constant>(*i)) - { + for (++I; I != GEP->op_end(); ++I) { + if (!isa<Constant>(*I)) { return true; } } } - for (Value::use_iterator i = val->use_begin(); i != val->use_end(); i++) - { - Value* v2 = dyn_cast<Value>(*i); + for (Value::use_iterator I = Val->use_begin(); i != Val->use_end(); ++I) { + Value* V2 = dyn_cast<Value>(*I); - if (v2) - { - if (isIndirect(v2, visited)) - { + if (V2) { + if (IsIndirect(V2, Visited)) { return true; } } @@ -202,293 +180,242 @@ bool R600KernelParameters::isIndirect(Value* val, std::set<Value*>& visited) #endif } -void R600KernelParameters::AddParam(Argument* arg) -{ - param p; +void R600KernelParameters::AddParam(Argument *Arg) { + Param P; - p.val = dyn_cast<Value>(arg); - p.offset_in_dw = getListSize(); - p.size_in_dw = calculateArgumentSize(arg); + P.Val = dyn_cast<Value>(Arg); + P.OffsetInDW = getListSize(); + P.SizeInDW = CalculateArgumentSize(Arg); - if (isa<PointerType>(arg->getType()) and arg->hasByValAttr()) - { - std::set<Value*> visited; - p.indirect = isIndirect(p.val, visited); + if (isa<PointerType>(Arg->getType()) and Arg->hasByValAttr()) { + std::set<Value*> Visited; + P.IsIndirect = IsIndirect(P.Val, Visited); } - params.push_back(p); + Params.push_back(P); } -int R600KernelParameters::calculateArgumentSize(Argument* arg) -{ - Type* t = arg->getType(); +int R600KernelParameters::CalculateArgumentSize(Argument *Arg) { + Type* T = Arg->getType(); - if (arg->hasByValAttr() and dyn_cast<PointerType>(t)) - { - t = dyn_cast<PointerType>(t)->getElementType(); + if (Arg->hasByValAttr() and dyn_cast<PointerType>(T)) { + T = dyn_cast<PointerType>(T)->getElementType(); } - int store_size_in_dw = (TD->getTypeStoreSize(t) + 3)/4; + int StoreSizeInDW = (TD->getTypeStoreSize(T) + 3)/4; - assert(store_size_in_dw); + assert(StoreSizeInDW); - return store_size_in_dw; + return StoreSizeInDW; } -void R600KernelParameters::RunAna(Function* fun) -{ - assert(isOpenCLKernel(fun)); +void R600KernelParameters::RunAna(Function* Fun) { + assert(IsOpenCLKernel(Fun)); - for (Function::arg_iterator i = fun->arg_begin(); i != fun->arg_end(); i++) - { - AddParam(i); + for (Function::arg_iterator I = Fun->arg_begin(); I != Fun->arg_end(); ++I) { + AddParam(I); } } -void R600KernelParameters::Replace(Function* fun) -{ - for (std::vector<param>::iterator i = params.begin(); i != params.end(); i++) - { - Value *new_val; +void R600KernelParameters::Replace(Function* Fun) { + for (std::vector<Param>::iterator I = Params.begin(); I != Params.end(); ++I) { + Value *NewVal; - if (isSpecialType(i->val->getType())) - { - new_val = handleSpecial(fun, *i); - } - else - { - new_val = ConstantRead(fun, *i); + if (IsSpecialType(I->Val->getType())) { + NewVal = handleSpecial(Fun, *I); + } else { + NewVal = ConstantRead(Fun, *I); } - if (new_val) - { - i->val->replaceAllUsesWith(new_val); + if (NewVal) { + I->Val->replaceAllUsesWith(NewVal); } } } -void R600KernelParameters::Propagate(Function* fun) -{ - for (std::vector<param>::iterator i = params.begin(); i != params.end(); i++) - { - if (i->ptr_val) - { - Propagate(i->ptr_val, i->val->getName(), i->indirect); - } +void R600KernelParameters::Propagate(Function* Fun) { + for (std::vector<Param>::iterator I = Params.begin(); I != Params.end(); ++I) { + if (I->PtrVal) { + Propagate(I->PtrVal, I->Val->getName(), I->IsIndirect); + } } } -void R600KernelParameters::Propagate(Value* v, const Twine& name, bool indirect) -{ - LoadInst* load = dyn_cast<LoadInst>(v); - GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(v); +void R600KernelParameters::Propagate(Value* V, const Twine& Name, bool IsIndirect) { + LoadInst* Load = dyn_cast<LoadInst>(V); + GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(V); - unsigned addrspace; + unsigned Addrspace; - if (indirect) - { - addrspace = AMDILAS::PARAM_I_ADDRESS; - } - else - { - addrspace = AMDILAS::PARAM_D_ADDRESS; + if (IsIndirect) { + Addrspace = AMDILAS::PARAM_I_ADDRESS; + } else { + Addrspace = AMDILAS::PARAM_D_ADDRESS; } - if (GEP and GEP->getType()->getAddressSpace() != addrspace) - { - Value* op = GEP->getPointerOperand(); + if (GEP and GEP->getType()->getAddressSpace() != Addrspace) { + Value *Op = GEP->getPointerOperand(); - if (dyn_cast<PointerType>(op->getType())->getAddressSpace() != addrspace) - { - op = new BitCastInst(op, PointerType::get(dyn_cast<PointerType>( - op->getType())->getElementType(), addrspace), - name, dyn_cast<Instruction>(v)); + if (dyn_cast<PointerType>(Op->getType())->getAddressSpace() != Addrspace) { + Op = new BitCastInst(Op, PointerType::get(dyn_cast<PointerType>( + Op->getType())->getElementType(), Addrspace), + Name, dyn_cast<Instruction>(V)); } - std::vector<Value*> params(GEP->idx_begin(), GEP->idx_end()); + std::vector<Value*> Params(GEP->idx_begin(), GEP->idx_end()); - GetElementPtrInst* GEP2 = GetElementPtrInst::Create(op, params, name, - dyn_cast<Instruction>(v)); + GetElementPtrInst* GEP2 = GetElementPtrInst::Create(Op, Params, Name, + dyn_cast<Instruction>(V)); GEP2->setIsInBounds(GEP->isInBounds()); - v = dyn_cast<Value>(GEP2); + V = dyn_cast<Value>(GEP2); GEP->replaceAllUsesWith(GEP2); GEP->eraseFromParent(); - load = NULL; + Load = NULL; } - if (load) - { + if (Load) { ///normally at this point we have the right address space - if (load->getPointerAddressSpace() != addrspace) - { - Value *orig_ptr = load->getPointerOperand(); - PointerType *orig_ptr_type = dyn_cast<PointerType>(orig_ptr->getType()); + if (Load->getPointerAddressSpace() != Addrspace) { + Value *OrigPtr = Load->getPointerOperand(); + PointerType *OrigPtrType = dyn_cast<PointerType>(OrigPtr->getType()); - Type* new_ptr_type = PointerType::get(orig_ptr_type->getElementType(), - addrspace); + Type* NewPtrType = PointerType::get(OrigPtrType->getElementType(), + Addrspace); - Value* new_ptr = orig_ptr; + Value* NewPtr = OrigPtr; - if (orig_ptr->getType() != new_ptr_type) - { - new_ptr = new BitCastInst(orig_ptr, new_ptr_type, "prop_cast", load); + if (OrigPtr->getType() != NewPtrType) { + NewPtr = new BitCastInst(OrigPtr, NewPtrType, "prop_cast", Load); } - Value* new_load = new LoadInst(new_ptr, name, load); - load->replaceAllUsesWith(new_load); - load->eraseFromParent(); + Value* new_Load = new LoadInst(NewPtr, Name, Load); + Load->replaceAllUsesWith(new_Load); + Load->eraseFromParent(); } return; } - std::vector<User*> users(v->use_begin(), v->use_end()); + std::vector<User*> Users(V->use_begin(), V->use_end()); - for (int i = 0; i < int(users.size()); i++) - { - Value* v2 = dyn_cast<Value>(users[i]); + for (int i = 0; i < int(Users.size()); i++) { + Value* V2 = dyn_cast<Value>(Users[i]); - if (v2) - { - Propagate(v2, name, indirect); + if (V2) { + Propagate(V2, Name, IsIndirect); } } } -Value* R600KernelParameters::ConstantRead(Function* fun, param& p) -{ - assert(fun->front().begin() != fun->front().end()); +Value* R600KernelParameters::ConstantRead(Function *Fun, Param &P) { + assert(Fun->front().begin() != Fun->front().end()); - Instruction *first_inst = fun->front().begin(); - IRBuilder <> builder (first_inst); + Instruction *FirstInst = Fun->front().begin(); + IRBuilder <> Builder (FirstInst); /* First 3 dwords are reserved for the dimmension info */ - if (!p.val->hasNUsesOrMore(1)) - { + if (!P.Val->hasNUsesOrMore(1)) { return NULL; } - unsigned addrspace; + unsigned Addrspace; - if (p.indirect) - { - addrspace = AMDILAS::PARAM_I_ADDRESS; - } - else - { - addrspace = AMDILAS::PARAM_D_ADDRESS; + if (P.IsIndirect) { + Addrspace = AMDILAS::PARAM_I_ADDRESS; + } else { + Addrspace = AMDILAS::PARAM_D_ADDRESS; } - Argument *arg = dyn_cast<Argument>(p.val); - Type * argType = p.val->getType(); - PointerType * argPtrType = dyn_cast<PointerType>(p.val->getType()); + Argument *Arg = dyn_cast<Argument>(P.Val); + Type * ArgType = P.Val->getType(); + PointerType * ArgPtrType = dyn_cast<PointerType>(P.Val->getType()); - if (argPtrType and arg->hasByValAttr()) - { - Value* param_addr_space_ptr = ConstantPointerNull::get( + if (ArgPtrType and Arg->hasByValAttr()) { + Value* ParamAddrSpacePtr = ConstantPointerNull::get( PointerType::get(Type::getInt32Ty(*Context), - addrspace)); - Value* param_ptr = GetElementPtrInst::Create(param_addr_space_ptr, + Addrspace)); + Value* ParamPtr = GetElementPtrInst::Create(ParamAddrSpacePtr, ConstantInt::get(Type::getInt32Ty(*Context), - p.get_rat_offset()), arg->getName(), - first_inst); - param_ptr = new BitCastInst(param_ptr, - PointerType::get(argPtrType->getElementType(), - addrspace), - arg->getName(), first_inst); - p.ptr_val = param_ptr; - return param_ptr; - } - else - { - Value* param_addr_space_ptr = ConstantPointerNull::get(PointerType::get( - argType, addrspace)); - - Value* param_ptr = builder.CreateGEP(param_addr_space_ptr, - ConstantInt::get(Type::getInt32Ty(*Context), p.get_rat_offset()), - arg->getName()); - - Value* param_value = builder.CreateLoad(param_ptr, arg->getName()); - - return param_value; + P.getRatOffset()), Arg->getName(), + FirstInst); + ParamPtr = new BitCastInst(ParamPtr, + PointerType::get(ArgPtrType->getElementType(), + Addrspace), + Arg->getName(), FirstInst); + P.PtrVal = ParamPtr; + return ParamPtr; + } else { + Value *ParamAddrSpacePtr = ConstantPointerNull::get(PointerType::get( + ArgType, Addrspace)); + + Value *ParamPtr = Builder.CreateGEP(ParamAddrSpacePtr, + ConstantInt::get(Type::getInt32Ty(*Context), P.getRatOffset()), + Arg->getName()); + + Value *Param_Value = Builder.CreateLoad(ParamPtr, Arg->getName()); + + return Param_Value; } } -Value* R600KernelParameters::handleSpecial(Function* fun, param& p) -{ - std::string name = getSpecialTypeName(p.val->getType()); +Value* R600KernelParameters::handleSpecial(Function* Fun, Param& P) { + std::string Name = getSpecialTypeName(P.Val->getType()); int ID; - assert(!name.empty()); + assert(!Name.empty()); - if (name == "image2d_t" or name == "image3d_t") - { - int lastID = std::max(getLastSpecialID("image2d_t"), + if (Name == "image2d_t" or Name == "image3d_t") { + int LastID = std::max(getLastSpecialID("image2d_t"), getLastSpecialID("image3d_t")); - if (lastID == -1) - { + if (LastID == -1) { ID = 2; ///ID0 and ID1 are used internally by the driver + } else { + ID = LastID + 1; } - else - { - ID = lastID + 1; - } - } - else if (name == "sampler_t") - { - int lastID = getLastSpecialID("sampler_t"); + } else if (Name == "sampler_t") { + int LastID = getLastSpecialID("sampler_t"); - if (lastID == -1) - { + if (LastID == -1) { ID = 0; + } else { + ID = LastID + 1; } - else - { - ID = lastID + 1; - } - } - else - { + } else { ///TODO: give some error message return NULL; } - p.specialType = name; - p.specialID = ID; + P.SpecialType = Name; + P.SpecialID = ID; - Instruction *first_inst = fun->front().begin(); + Instruction *FirstInst = Fun->front().begin(); return new IntToPtrInst(ConstantInt::get(Type::getInt32Ty(*Context), - p.specialID), p.val->getType(), - "resourceID", first_inst); + P.SpecialID), P.Val->getType(), + "resourceID", FirstInst); } -bool R600KernelParameters::isSpecialType(Type* t) -{ - return !getSpecialTypeName(t).empty(); +bool R600KernelParameters::IsSpecialType(Type* T) { + return !getSpecialTypeName(T).empty(); } -std::string R600KernelParameters::getSpecialTypeName(Type* t) -{ - PointerType *pt = dyn_cast<PointerType>(t); - StructType *st = NULL; +std::string R600KernelParameters::getSpecialTypeName(Type* T) { + PointerType *PT = dyn_cast<PointerType>(T); + StructType *ST = NULL; - if (pt) - { - st = dyn_cast<StructType>(pt->getElementType()); + if (PT) { + ST = dyn_cast<StructType>(PT->getElementType()); } - if (st) - { - std::string prefix = "struct.opencl_builtin_type_"; + if (ST) { + std::string Prefix = "struct.opencl_builtin_type_"; - std::string name = st->getName().str(); + std::string Name = ST->getName().str(); - if (name.substr(0, prefix.length()) == prefix) - { - return name.substr(prefix.length(), name.length()); + if (Name.substr(0, Prefix.length()) == Prefix) { + return Name.substr(Prefix.length(), Name.length()); } } @@ -496,10 +423,8 @@ std::string R600KernelParameters::getSpecialTypeName(Type* t) } -bool R600KernelParameters::runOnFunction (Function &F) -{ - if (!isOpenCLKernel(&F)) - { +bool R600KernelParameters::runOnFunction (Function &F) { + if (!IsOpenCLKernel(&F)) { return false; } @@ -510,37 +435,28 @@ bool R600KernelParameters::runOnFunction (Function &F) return false; } -void R600KernelParameters::getAnalysisUsage(AnalysisUsage &AU) const -{ +void R600KernelParameters::getAnalysisUsage(AnalysisUsage &AU) const { FunctionPass::getAnalysisUsage(AU); AU.setPreservesAll(); } -const char *R600KernelParameters::getPassName() const -{ +const char *R600KernelParameters::getPassName() const { return "OpenCL Kernel parameter conversion to memory"; } -bool R600KernelParameters::doInitialization(Module &M) -{ +bool R600KernelParameters::doInitialization(Module &M) { Context = &M.getContext(); - mod = &M; + Mod = &M; return false; } -bool R600KernelParameters::doFinalization(Module &M) -{ +bool R600KernelParameters::doFinalization(Module &M) { return false; } } // End anonymous namespace -FunctionPass* llvm::createR600KernelParametersPass(const TargetData* TD) -{ - FunctionPass *p = new R600KernelParameters(TD); - - return p; +FunctionPass* llvm::createR600KernelParametersPass(const TargetData* TD) { + return new R600KernelParameters(TD); } - - |