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