149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===-- NVPTXUtilities - Utilities -----------------------------*- C++ -*-====//
249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//                     The LLVM Compiler Infrastructure
449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file is distributed under the University of Illinois Open Source
649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// License. See LICENSE.TXT for details.
749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===//
949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
1049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file contains the declaration of the NVVM specific utility functions.
1149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
1249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===//
1349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#ifndef NVPTXUTILITIES_H
1549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define NVPTXUTILITIES_H
1649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h"
180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalVariable.h"
190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/IntrinsicInst.h"
200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Value.h"
2149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include <cstdarg>
2249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include <set>
2349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include <string>
2449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include <vector>
2549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
263639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskinamespace llvm {
2749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
2849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define NVCL_IMAGE2D_READONLY_FUNCNAME "__is_image2D_readonly"
2949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define NVCL_IMAGE3D_READONLY_FUNCNAME "__is_image3D_readonly"
3049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid clearAnnotationCache(const llvm::Module *);
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
3349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool findOneNVVMAnnotation(const llvm::GlobalValue *, std::string, unsigned &);
3449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool findAllNVVMAnnotation(const llvm::GlobalValue *, std::string,
3549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                           std::vector<unsigned> &);
3649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
3749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool isTexture(const llvm::Value &);
3849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool isSurface(const llvm::Value &);
3949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool isSampler(const llvm::Value &);
4049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool isImage(const llvm::Value &);
4149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool isImageReadOnly(const llvm::Value &);
4249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool isImageWriteOnly(const llvm::Value &);
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesbool isImageReadWrite(const llvm::Value &);
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesbool isManaged(const llvm::Value &);
4549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
4649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskistd::string getTextureName(const llvm::Value &);
4749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskistd::string getSurfaceName(const llvm::Value &);
4849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskistd::string getSamplerName(const llvm::Value &);
4949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
5049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool getMaxNTIDx(const llvm::Function &, unsigned &);
5149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool getMaxNTIDy(const llvm::Function &, unsigned &);
5249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool getMaxNTIDz(const llvm::Function &, unsigned &);
5349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
5449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool getReqNTIDx(const llvm::Function &, unsigned &);
5549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool getReqNTIDy(const llvm::Function &, unsigned &);
5649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool getReqNTIDz(const llvm::Function &, unsigned &);
5749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
5849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool getMinCTASm(const llvm::Function &, unsigned &);
5949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool isKernelFunction(const llvm::Function &);
6049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
6149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool getAlign(const llvm::Function &, unsigned index, unsigned &);
6249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool getAlign(const llvm::CallInst &, unsigned index, unsigned &);
6349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
6449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool isBarrierIntrinsic(llvm::Intrinsic::ID);
6549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
6649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// make_vector - Helper function which is useful for building temporary vectors
6749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// to pass into type construction of CallInst ctors.  This turns a null
6849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski/// terminated list of pointers (or other value types) into a real live vector.
6949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski///
703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskitemplate <typename T> inline std::vector<T> make_vector(T A, ...) {
7149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  va_list Args;
7249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  va_start(Args, A);
7349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  std::vector<T> Result;
7449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  Result.push_back(A);
7549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  while (T Val = va_arg(Args, T))
7649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski    Result.push_back(Val);
7749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  va_end(Args);
7849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  return Result;
7949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
8049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
8149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool isMemorySpaceTransferIntrinsic(Intrinsic::ID id);
8249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiconst Value *skipPointerTransfer(const Value *V, bool ignore_GEP_indices);
833639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskiconst Value *
843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskiskipPointerTransfer(const Value *V, std::set<const Value *> &processed);
8549683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiBasicBlock *getParentBlock(Value *v);
8649683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiFunction *getParentFunction(Value *v);
8749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskivoid dumpBlock(Value *v, char *blockName);
8849683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiInstruction *getInst(Value *base, char *instName);
8949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskivoid dumpInst(Value *base, char *instName);
9049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskivoid dumpInstRec(Value *v, std::set<Instruction *> *visited);
9149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskivoid dumpInstRec(Value *v);
9249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskivoid dumpParent(Value *v);
9349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
9449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
9549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
9649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#endif
97