R600KernelParameters.cpp revision a75c6163e605f35b14f26930dd9227e4f337ec9e
1a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===-- R600KernelParameters.cpp - TODO: Add brief description -------===// 2a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 3a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// The LLVM Compiler Infrastructure 4a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 5a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// This file is distributed under the University of Illinois Open Source 6a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// License. See LICENSE.TXT for details. 7a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 8a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===----------------------------------------------------------------------===// 9a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 10a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// TODO: Add full description 11a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 12a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===----------------------------------------------------------------------===// 13a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 14a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include <llvm-c/Core.h> 15a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "R600KernelParameters.h" 16a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "R600OpenCLUtils.h" 17a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "llvm/Constants.h" 18a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "llvm/Intrinsics.h" 19a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "llvm/Support/IRBuilder.h" 20a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "llvm/Support/TypeBuilder.h" 21a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// #include "llvm/CodeGen/Function.h" 22a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 23a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardnamespace AMDILAS { 24a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardenum AddressSpaces { 25a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard PRIVATE_ADDRESS = 0, // Address space for private memory. 26a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard GLOBAL_ADDRESS = 1, // Address space for global memory (RAT0, VTX0). 27a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard CONSTANT_ADDRESS = 2, // Address space for constant memory. 28a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard LOCAL_ADDRESS = 3, // Address space for local memory. 29a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard REGION_ADDRESS = 4, // Address space for region memory. 30a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard ADDRESS_NONE = 5, // Address space for unknown memory. 31a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard PARAM_D_ADDRESS = 6, // Address space for direct addressible parameter memory (CONST0) 32a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard PARAM_I_ADDRESS = 7, // Address space for indirect addressible parameter memory (VTX1) 33a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard LAST_ADDRESS = 8 34a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}; 35a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 36a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 37a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 38a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include <map> 39a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include <set> 40a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 41a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardusing namespace llvm; 42a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardusing namespace std; 43a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 44a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#define CONSTANT_CACHE_SIZE_DW 127 45a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 46a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardclass R600KernelParameters : public llvm::FunctionPass 47a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 48a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard const llvm::TargetData * TD; 49a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard LLVMContext* Context; 50a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Module *mod; 51a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 52a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard struct param 53a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 54a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard param() : val(NULL), ptr_val(NULL), offset_in_dw(0), size_in_dw(0), indirect(false), specialID(0) {} 55a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 56a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard llvm::Value* val; 57a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard llvm::Value* ptr_val; 58a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard int offset_in_dw; 59a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard int size_in_dw; 60a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 61a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard bool indirect; 62a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 63a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard string specialType; 64a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard int specialID; 65a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 66a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard int end() { return offset_in_dw + size_in_dw; } 67a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard /* The first 9 dwords are reserved for the grid sizes. */ 68a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard int get_rat_offset() { return 9 + offset_in_dw; } 69a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard }; 70a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 71a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard std::vector<param> params; 72a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 73a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard int getLastSpecialID(const string& TypeName); 74a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 75a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard int getListSize(); 76a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard void AddParam(llvm::Argument* arg); 77a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard int calculateArgumentSize(llvm::Argument* arg); 78a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard void RunAna(llvm::Function* fun); 79a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard void Replace(llvm::Function* fun); 80a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard bool isIndirect(Value* val, set<Value*>& visited); 81a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard void Propagate(llvm::Function* fun); 82a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard void Propagate(llvm::Value* v, const llvm::Twine& name, bool indirect = false); 83a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Value* ConstantRead(Function* fun, param& p); 84a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Value* handleSpecial(Function* fun, param& p); 85a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard bool isSpecialType(Type*); 86a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard string getSpecialTypeName(Type*); 87a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardpublic: 88a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard static char ID; 89a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard R600KernelParameters() : FunctionPass(ID) {}; 90a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard R600KernelParameters(const llvm::TargetData* TD) : FunctionPass(ID), TD(TD) {} 91a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// bool runOnFunction (llvm::Function &F); 92a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard bool runOnFunction (llvm::Function &F); 93a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard void getAnalysisUsage(AnalysisUsage &AU) const; 94a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard const char *getPassName() const; 95a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard bool doInitialization(Module &M); 96a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard bool doFinalization(Module &M); 97a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}; 98a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 99a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardchar R600KernelParameters::ID = 0; 100a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 101a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic RegisterPass<R600KernelParameters> X("kerparam", "OpenCL Kernel Parameter conversion", false, false); 102a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 103a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardint R600KernelParameters::getLastSpecialID(const string& TypeName) 104a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 105a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard int lastID = -1; 106a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 107a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard for (vector<param>::iterator i = params.begin(); i != params.end(); i++) 108a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 109a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (i->specialType == TypeName) 110a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 111a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard lastID = i->specialID; 112a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 113a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 114a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 115a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return lastID; 116a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 117a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 118a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardint R600KernelParameters::getListSize() 119a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 120a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (params.size() == 0) 121a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 122a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return 0; 123a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 124a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 125a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return params.back().end(); 126a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 127a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 128a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool R600KernelParameters::isIndirect(Value* val, set<Value*>& visited) 129a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 130a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (isa<LoadInst>(val)) 131a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 132a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return false; 133a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 134a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 135a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (isa<IntegerType>(val->getType())) 136a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 137a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard assert(0 and "Internal error"); 138a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return false; 139a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 140a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 141a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (visited.count(val)) 142a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 143a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return false; 144a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 145a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 146a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard visited.insert(val); 147a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 148a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (isa<GetElementPtrInst>(val)) 149a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 150a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard GetElementPtrInst* GEP = dyn_cast<GetElementPtrInst>(val); 151a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard GetElementPtrInst::op_iterator i = GEP->op_begin(); 152a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 153a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard for (i++; i != GEP->op_end(); i++) 154a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 155a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (!isa<Constant>(*i)) 156a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 157a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return true; 158a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 159a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 160a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 161a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 162a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard for (Value::use_iterator i = val->use_begin(); i != val->use_end(); i++) 163a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 164a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Value* v2 = dyn_cast<Value>(*i); 165a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 166a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (v2) 167a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 168a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (isIndirect(v2, visited)) 169a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 170a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return true; 171a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 172a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 173a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 174a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 175a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return false; 176a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 177a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 178a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardvoid R600KernelParameters::AddParam(llvm::Argument* arg) 179a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 180a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard param p; 181a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 182a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard p.val = dyn_cast<Value>(arg); 183a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard p.offset_in_dw = getListSize(); 184a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard p.size_in_dw = calculateArgumentSize(arg); 185a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 186a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (isa<PointerType>(arg->getType()) and arg->hasByValAttr()) 187a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 188a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard set<Value*> visited; 189a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard p.indirect = isIndirect(p.val, visited); 190a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 191a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 192a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard params.push_back(p); 193a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 194a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 195a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardint R600KernelParameters::calculateArgumentSize(llvm::Argument* arg) 196a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 197a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Type* t = arg->getType(); 198a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 199a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (arg->hasByValAttr() and dyn_cast<PointerType>(t)) 200a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 201a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard t = dyn_cast<PointerType>(t)->getElementType(); 202a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 203a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 204a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard int store_size_in_dw = (TD->getTypeStoreSize(t) + 3)/4; 205a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 206a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard assert(store_size_in_dw); 207a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 208a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return store_size_in_dw; 209a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 210a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 211a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 212a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardvoid R600KernelParameters::RunAna(llvm::Function* fun) 213a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 214a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard assert(isOpenCLKernel(fun)); 215a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 216a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard for (Function::arg_iterator i = fun->arg_begin(); i != fun->arg_end(); i++) 217a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 218a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard AddParam(i); 219a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 220a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 221a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 222a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 223a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardvoid R600KernelParameters::Replace(llvm::Function* fun) 224a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 225a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard for (std::vector<param>::iterator i = params.begin(); i != params.end(); i++) 226a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 227a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Value *new_val; 228a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 229a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (isSpecialType(i->val->getType())) 230a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 231a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard new_val = handleSpecial(fun, *i); 232a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 233a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard else 234a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 235a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard new_val = ConstantRead(fun, *i); 236a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 237a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (new_val) 238a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 239a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard i->val->replaceAllUsesWith(new_val); 240a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 241a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 242a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 243a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 244a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardvoid R600KernelParameters::Propagate(llvm::Function* fun) 245a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 246a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard for (std::vector<param>::iterator i = params.begin(); i != params.end(); i++) 247a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 248a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (i->ptr_val) 249a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 250a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Propagate(i->ptr_val, i->val->getName(), i->indirect); 251a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 252a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 253a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 254a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 255a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardvoid R600KernelParameters::Propagate(Value* v, const Twine& name, bool indirect) 256a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 257a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard LoadInst* load = dyn_cast<LoadInst>(v); 258a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(v); 259a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 260a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard unsigned addrspace; 261a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 262a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (indirect) 263a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 264a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard addrspace = AMDILAS::PARAM_I_ADDRESS; 265a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 266a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard else 267a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 268a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard addrspace = AMDILAS::PARAM_D_ADDRESS; 269a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 270a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 271a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (GEP and GEP->getType()->getAddressSpace() != addrspace) 272a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 273a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Value* op = GEP->getPointerOperand(); 274a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 275a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (dyn_cast<PointerType>(op->getType())->getAddressSpace() != addrspace) 276a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 277a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard op = new BitCastInst(op, PointerType::get(dyn_cast<PointerType>(op->getType())->getElementType(), addrspace), name, dyn_cast<Instruction>(v)); 278a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 279a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 280a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard vector<Value*> params(GEP->idx_begin(), GEP->idx_end()); 281a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 282a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard GetElementPtrInst* GEP2 = GetElementPtrInst::Create(op, params, name, dyn_cast<Instruction>(v)); 283a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard GEP2->setIsInBounds(GEP->isInBounds()); 284a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard v = dyn_cast<Value>(GEP2); 285a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard GEP->replaceAllUsesWith(GEP2); 286a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard GEP->eraseFromParent(); 287a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard load = NULL; 288a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 289a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 290a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (load) 291a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 292a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (load->getPointerAddressSpace() != addrspace) ///normally at this point we have the right address space 293a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 294a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Value *orig_ptr = load->getPointerOperand(); 295a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard PointerType *orig_ptr_type = dyn_cast<PointerType>(orig_ptr->getType()); 296a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 297a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Type* new_ptr_type = PointerType::get(orig_ptr_type->getElementType(), addrspace); 298a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 299a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Value* new_ptr = orig_ptr; 300a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 301a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (orig_ptr->getType() != new_ptr_type) 302a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 303a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard new_ptr = new BitCastInst(orig_ptr, new_ptr_type, "prop_cast", load); 304a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 305a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 306a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Value* new_load = new LoadInst(new_ptr, name, load); 307a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard load->replaceAllUsesWith(new_load); 308a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard load->eraseFromParent(); 309a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 310a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 311a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return; 312a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 313a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 314a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard vector<User*> users(v->use_begin(), v->use_end()); 315a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 316a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard for (int i = 0; i < int(users.size()); i++) 317a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 318a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Value* v2 = dyn_cast<Value>(users[i]); 319a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 320a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (v2) 321a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 322a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Propagate(v2, name, indirect); 323a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 324a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 325a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 326a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 327a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardValue* R600KernelParameters::ConstantRead(Function* fun, param& p) 328a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 329a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard assert(fun->front().begin() != fun->front().end()); 330a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 331a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Instruction *first_inst = fun->front().begin(); 332a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard IRBuilder <> builder (first_inst); 333a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard/* First 3 dwords are reserved for the dimmension info */ 334a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 335a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (!p.val->hasNUsesOrMore(1)) 336a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 337a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return NULL; 338a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 339a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard unsigned addrspace; 340a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 341a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (p.indirect) 342a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 343a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard addrspace = AMDILAS::PARAM_I_ADDRESS; 344a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 345a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard else 346a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 347a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard addrspace = AMDILAS::PARAM_D_ADDRESS; 348a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 349a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 350a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Argument *arg = dyn_cast<Argument>(p.val); 351a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Type * argType = p.val->getType(); 352a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard PointerType * argPtrType = dyn_cast<PointerType>(p.val->getType()); 353a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 354a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (argPtrType and arg->hasByValAttr()) 355a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 356a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Value* param_addr_space_ptr = ConstantPointerNull::get(PointerType::get(Type::getInt32Ty(*Context), addrspace)); 357a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Value* param_ptr = GetElementPtrInst::Create(param_addr_space_ptr, ConstantInt::get(Type::getInt32Ty(*Context), p.get_rat_offset()), arg->getName(), first_inst); 358a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard param_ptr = new BitCastInst(param_ptr, PointerType::get(argPtrType->getElementType(), addrspace), arg->getName(), first_inst); 359a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard p.ptr_val = param_ptr; 360a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return param_ptr; 361a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 362a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard else 363a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 364a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Value* param_addr_space_ptr = ConstantPointerNull::get(PointerType::get(argType, addrspace)); 365a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 366a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Value* param_ptr = builder.CreateGEP(param_addr_space_ptr, 367a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard ConstantInt::get(Type::getInt32Ty(*Context), p.get_rat_offset()), arg->getName()); 368a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 369a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Value* param_value = builder.CreateLoad(param_ptr, arg->getName()); 370a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 371a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return param_value; 372a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 373a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 374a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 375a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardValue* R600KernelParameters::handleSpecial(Function* fun, param& p) 376a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 377a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard string name = getSpecialTypeName(p.val->getType()); 378a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard int ID; 379a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 380a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard assert(!name.empty()); 381a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 382a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (name == "image2d_t" or name == "image3d_t") 383a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 384a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard int lastID = max(getLastSpecialID("image2d_t"), getLastSpecialID("image3d_t")); 385a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 386a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (lastID == -1) 387a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 388a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard ID = 2; ///ID0 and ID1 are used internally by the driver 389a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 390a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard else 391a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 392a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard ID = lastID + 1; 393a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 394a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 395a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard else if (name == "sampler_t") 396a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 397a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard int lastID = getLastSpecialID("sampler_t"); 398a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 399a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (lastID == -1) 400a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 401a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard ID = 0; 402a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 403a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard else 404a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 405a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard ID = lastID + 1; 406a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 407a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 408a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard else 409a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 410a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard ///TODO: give some error message 411a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return NULL; 412a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 413a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 414a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard p.specialType = name; 415a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard p.specialID = ID; 416a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 417a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Instruction *first_inst = fun->front().begin(); 418a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 419a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return new IntToPtrInst(ConstantInt::get(Type::getInt32Ty(*Context), p.specialID), p.val->getType(), "resourceID", first_inst); 420a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 421a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 422a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 423a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool R600KernelParameters::isSpecialType(Type* t) 424a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 425a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return !getSpecialTypeName(t).empty(); 426a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 427a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 428a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstring R600KernelParameters::getSpecialTypeName(Type* t) 429a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 430a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard PointerType *pt = dyn_cast<PointerType>(t); 431a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard StructType *st = NULL; 432a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 433a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (pt) 434a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 435a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard st = dyn_cast<StructType>(pt->getElementType()); 436a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 437a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 438a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (st) 439a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 440a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard string prefix = "struct.opencl_builtin_type_"; 441a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 442a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard string name = st->getName().str(); 443a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 444a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (name.substr(0, prefix.length()) == prefix) 445a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 446a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return name.substr(prefix.length(), name.length()); 447a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 448a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 449a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 450a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return ""; 451a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 452a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 453a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 454a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool R600KernelParameters::runOnFunction (Function &F) 455a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 456a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if (!isOpenCLKernel(&F)) 457a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard { 458a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return false; 459a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 460a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 461a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// F.dump(); 462a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 463a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard RunAna(&F); 464a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Replace(&F); 465a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Propagate(&F); 466a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 467a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard mod->dump(); 468a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return false; 469a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 470a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 471a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardvoid R600KernelParameters::getAnalysisUsage(AnalysisUsage &AU) const 472a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 473a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// AU.addRequired<FunctionAnalysis>(); 474a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard FunctionPass::getAnalysisUsage(AU); 475a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard AU.setPreservesAll(); 476a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 477a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 478a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardconst char *R600KernelParameters::getPassName() const 479a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 480a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return "OpenCL Kernel parameter conversion to memory"; 481a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 482a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 483a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool R600KernelParameters::doInitialization(Module &M) 484a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 485a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard Context = &M.getContext(); 486a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard mod = &M; 487a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 488a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return false; 489a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 490a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 491a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardbool R600KernelParameters::doFinalization(Module &M) 492a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 493a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return false; 494a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 495a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 496a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardllvm::FunctionPass* createR600KernelParametersPass(const llvm::TargetData* TD) 497a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 498a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard FunctionPass *p = new R600KernelParameters(TD); 499a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 500a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return p; 501a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 502a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 503a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 504