Handle opaque pointers in image specialization (#863)

Contributes to #816

* Image specialization now handles both transparent and opaque pointers
  * Much of the code can be removed after moving fully to opaque
    pointers
  * Doesn't use InferTypes because the pass's traversal is necessary and would
    simply be repeated
  * Specialized builtin functions are now remangled from an updated type instead of having a
    suffix tacked on
* Fixed some image query functions to support mangled struct names
* Fixed some builtin demangling
* Changed how opaque pointers is disabled
  * added a new command line option to control it
  * sets the code gen option
  * remove the command line parsing
diff --git a/lib/Builtins.cpp b/lib/Builtins.cpp
index 5c00059..5871d7d 100644
--- a/lib/Builtins.cpp
+++ b/lib/Builtins.cpp
@@ -233,11 +233,13 @@
   while (pos < mangled_name_len) {
     ParamTypeInfo type_info;
     if (mangled_name[pos] == 'S') {
-      // handle duplicate param_type
-      if (mangled_name[pos + 1] != '_') {
+      // handle duplicate param_type. Comes in two flavours:
+      // S_ and S#_.
+      char p1 = mangled_name[pos + 1];
+      if (p1 != '_' && (mangled_name[pos + 2] != '_')) {
         return false;
       }
-      pos += 2;
+      pos += p1 == '_' ? 2 : 3;
       if (params_.empty()) {
         return false;
       }
diff --git a/lib/Compiler.cpp b/lib/Compiler.cpp
index ff81dd8..6229e9f 100644
--- a/lib/Compiler.cpp
+++ b/lib/Compiler.cpp
@@ -157,6 +157,10 @@
         "Emit LLVM IR to the given file after parsing and stop compilation."),
     llvm::cl::value_desc("filename"));
 
+static llvm::cl::opt<bool> OpaquePointers("enable-opaque-pointers",
+                                          llvm::cl::desc("Use opaque pointers"),
+                                          llvm::cl::init(false));
+
 namespace {
 struct OpenCLBuiltinMemoryBuffer final : public llvm::MemoryBuffer {
   OpenCLBuiltinMemoryBuffer(const void *data, uint64_t data_length) {
@@ -465,6 +469,7 @@
   instance.getCodeGenOpts().SimplifyLibCalls = false;
   instance.getCodeGenOpts().EmitOpenCLArgMetadata = false;
   instance.getCodeGenOpts().DisableO0ImplyOptNone = true;
+  instance.getCodeGenOpts().OpaquePointers = OpaquePointers;
   instance.getDiagnosticOpts().IgnoreWarnings = IgnoreWarnings;
 
   instance.getLangOpts().SinglePrecisionConstants =
@@ -834,21 +839,16 @@
   // ParseCommandLineOptions with the specific options.
   bool has_pre = false;
   bool has_load_pre = false;
-  bool has_opaque_pointers = false;
   const std::string pre = "-enable-pre";
   const std::string load_pre = "-enable-load-pre";
-  const std::string opaque = "-opaque-pointers";
   for (int i = 1; i < argc; ++i) {
     std::string option(argv[i]);
     auto pre_pos = option.find(pre);
     auto load_pos = option.find(load_pre);
-    auto opaque_pos = option.find(opaque);
     if (pre_pos == 0 || (pre_pos == 1 && option[0] == '-')) {
       has_pre = true;
     } else if (load_pos == 0 || (load_pos == 1 && option[0] == '-')) {
       has_load_pre = true;
-    } else if (opaque_pos == 0 || (opaque_pos == 1 && option[0] == '-')) {
-      has_opaque_pointers = true;
     }
   }
 
@@ -864,10 +864,6 @@
   if (!has_load_pre) {
     llvmArgv[llvmArgc++] = "-enable-load-pre=0";
   }
-  // TODO(#816): remove this after final transition.
-  if (!has_opaque_pointers) {
-    llvmArgv[llvmArgc++] = "-opaque-pointers=0";
-  }
 
   llvm::cl::ResetAllOptionOccurrences();
   llvm::cl::ParseCommandLineOptions(llvmArgc, llvmArgv);
diff --git a/lib/SpecializeImageTypes.cpp b/lib/SpecializeImageTypes.cpp
index c80e8dc..04356ca 100644
--- a/lib/SpecializeImageTypes.cpp
+++ b/lib/SpecializeImageTypes.cpp
@@ -44,40 +44,39 @@
 
   for (auto f : kernels) {
     for (auto &Arg : f->args()) {
-      if (IsImageType(Arg.getType())) {
-        Type *new_type = RemapType(&Arg);
-        if (!new_type) {
-          // No specializing information found, assume the image is sampled with
-          // a float type.
-          std::string name =
-              cast<StructType>(Arg.getType()->getPointerElementType())
-                  ->getName()
-                  .str();
+      ResultType res;
+      llvm::Type *new_ty = nullptr;
+      std::tie(res, new_ty) = RemapType(&Arg);
+      if (res != ResultType::kNotImage) {
+        if (res == kNotSpecialized) {
+          // Argument is an image, but not specializing information was found.
+          // Assume the image is sampled with a float type.
+          std::string name = cast<StructType>(new_ty)->getName().str();
           name += ".float";
-          const auto pos = name.find("_wo_t");
-          if (!IsStorageImageType(Arg.getType())) {
+          if (name.find("_ro") != std::string::npos) {
             name += ".sampled";
-          } else if (clspv::Option::Language() >=
-                         clspv::Option::SourceLanguage::OpenCL_C_20 &&
-                     pos != std::string::npos) {
-            // In OpenCL 2.0 (or later), treat write_only images as read_write
-            // images. This prevents the compiler from generating duplicate
-            // image types (invalid SPIR-V).
-            name = name.substr(0, pos) + "_rw_t" + name.substr(pos + 5);
+          } else if (Option::Language() >= Option::SourceLanguage::OpenCL_C_20) {
+            // Treat write-only images as read-write images in OpenCL 2.0 or
+            // later to avoid duplicate image types getting generated in the
+            // SPIR.V.
+            auto pos = name.find("_wo");
+            if (pos != std::string::npos) {
+              name = name.substr(0, pos) + "_rw" + name.substr(pos + 3);
+            }
           }
-          StructType *new_struct =
-              StructType::getTypeByName(M.getContext(), name);
-          if (!new_struct)
-            new_struct = StructType::create(Arg.getContext(), name);
-          new_type = PointerType::get(new_struct,
-                                      Arg.getType()->getPointerAddressSpace());
+          StructType *new_struct = StructType::getTypeByName(M.getContext(), name);
+          if (!new_struct) {
+            new_struct = StructType::create(M.getContext(), name);
+          }
+          new_ty = new_struct;
         }
-        specialized_images_.insert(new_type);
-        SpecializeArg(f, &Arg, new_type);
+        specialized_images_.insert(new_ty);
+        SpecializeArg(f, &Arg, new_ty);
       }
     }
   }
 
+  // TODO(#816): unnecessary after transition.
   // Keep functions in the same relative order.
   std::vector<Function *> to_rewrite;
   for (auto &F : M) {
@@ -91,38 +90,98 @@
   return PA;
 }
 
-Type *SpecializeImageTypesPass::RemapType(Argument *arg) {
+std::pair<SpecializeImageTypesPass::ResultType, Type *>
+SpecializeImageTypesPass::RemapType(Argument *arg) {
+  ResultType final_res = ResultType::kNotImage;
+  Type *new_ty = nullptr;
   for (auto &U : arg->uses()) {
-    if (auto new_type = RemapUse(U.getUser(), U.getOperandNo())) {
-      return new_type;
+    ResultType res;
+    Type *ty = nullptr;
+    std::tie(res, ty) = RemapUse(U.getUser(), U.getOperandNo());
+    if (res == ResultType::kSpecialized) {
+      return std::make_pair(res, ty);
+    } else if (res == ResultType::kNotSpecialized && final_res == ResultType::kNotImage) {
+      new_ty = ty;
+      final_res = res;
     }
   }
 
-  return nullptr;
+  // TODO(#816): remove after final transition
+  if (final_res == ResultType::kNotImage) {
+    if (arg->getType()->isPointerTy() && !arg->getType()->isOpaquePointerTy()) {
+      auto *ele_ty =
+          cast<PointerType>(arg->getType())->getNonOpaquePointerElementType();
+      StructType *struct_ty = dyn_cast<StructType>(ele_ty);
+      if (IsImageType(struct_ty)) {
+        return std::make_pair(ResultType::kNotSpecialized, struct_ty);
+      }
+    }
+  }
+
+  return std::make_pair(final_res, new_ty);
 }
 
-Type *SpecializeImageTypesPass::RemapUse(Value *value, unsigned operand_no) {
+std::pair<SpecializeImageTypesPass::ResultType, Type *>
+SpecializeImageTypesPass::RemapUse(Value *value, unsigned operand_no) {
   if (CallInst *call = dyn_cast<CallInst>(value)) {
-    auto called = call->getCalledFunction();
-    auto func_info = Builtins::Lookup(called);
-    switch (func_info.getType()) {
+    auto *called = call->getCalledFunction();
+    auto info = Builtins::Lookup(called);
+    if (!BUILTIN_IN_GROUP(info.getType(), Image)) {
+      // Not an image builtin so see if we can specialize the type by
+      // traversing the called function.
+      ResultType final_res = ResultType::kNotImage;
+      Type *new_ty = nullptr;
+      if (!called->isDeclaration()) {
+        for (auto &U : called->getArg(operand_no)->uses()) {
+          ResultType res = ResultType::kNotImage;
+          Type *ty = nullptr;
+          std::tie(res, ty) = RemapUse(U.getUser(), U.getOperandNo());
+          if (res == ResultType::kSpecialized) {
+            return std::make_pair(res, ty);
+          } else if (res == kNotSpecialized && final_res == kNotImage) {
+            final_res = res;
+            new_ty = ty;
+          }
+        }
+      }
+      return std::make_pair(final_res, new_ty);
+    }
+    if (operand_no != 0) {
+      // All image builtins take the image as the first operand, so this is not
+      // an image type.
+      return std::make_pair(ResultType::kNotImage, nullptr);
+    }
+
+    // This user is an image type. Check if we've specialized it already. If
+    // not, see if it can be specialized by this builtin.
+    std::string name;
+    auto *operand = call->getArgOperand(operand_no);
+    // TODO(#816): remove after final transition.
+    if (!operand->getType()->isOpaquePointerTy()) {
+      auto *ele_ty = dyn_cast<PointerType>(operand->getType())
+                         ->getNonOpaquePointerElementType();
+      name = dyn_cast<StructType>(ele_ty)->getName().str();
+    } else {
+      auto param = info.getParameter(operand_no);
+      assert(param.type_id == Type::StructTyID);
+      name = param.name;
+    }
+
+    auto *struct_ty =
+      StructType::getTypeByName(call->getContext(), name);
+
+    if (specialized_images_.count(struct_ty))
+      return std::make_pair(ResultType::kSpecialized, struct_ty);
+
+    switch (info.getType()) {
+    // Specializable cases: reads and writes.
     case Builtins::kReadImagef:
     case Builtins::kReadImagei:
     case Builtins::kReadImageui:
     case Builtins::kWriteImagef:
     case Builtins::kWriteImagei:
     case Builtins::kWriteImageui: {
-      // Specialize the image type based on it's usage in the builtin.
-      Value *image = call->getOperand(0);
-      Type *imageTy = image->getType();
-
-      // Check if this type is already specialized.
-      if (specialized_images_.count(imageTy))
-        return imageTy;
-
-      std::string name =
-          cast<StructType>(imageTy->getPointerElementType())->getName().str();
-      switch (func_info.getType()) {
+      switch (info.getType()) {
       case Builtins::kReadImagef:
       case Builtins::kWriteImagef:
         name += ".float";
@@ -139,47 +198,47 @@
         break;
       }
 
-      // Read only images are translated as sampled images.
-      const auto pos = name.find("_wo_t");
-      if (!IsStorageImageType(imageTy)) {
+      const auto wo_pos = name.find("_wo");
+      const auto ro_pos = name.find("_ro");
+      if (ro_pos != std::string::npos) {
         name += ".sampled";
-      } else if (clspv::Option::Language() >=
-                     clspv::Option::SourceLanguage::OpenCL_C_20 &&
-                 pos != std::string::npos) {
+      } else if (Option::Language() >= Option::SourceLanguage::OpenCL_C_20 &&
+                 wo_pos != std::string::npos) {
         // In OpenCL 2.0 (or later), treat write_only images as read_write
         // images. This prevents the compiler from generating duplicate image
         // types (invalid SPIR-V).
-        name = name.substr(0, pos) + "_rw_t" + name.substr(pos + 5);
+        name = name.substr(0, wo_pos) + "_rw" + name.substr(wo_pos + 3);
       }
 
-      StructType *new_struct =
-          StructType::getTypeByName(call->getContext(), name);
-      if (!new_struct) {
-        new_struct = StructType::create(call->getContext(), name);
+      struct_ty = StructType::getTypeByName(call->getContext(), name);
+      if (!struct_ty) {
+        struct_ty = StructType::create(call->getContext(), name);
       }
-      PointerType *new_pointer =
-          PointerType::get(new_struct, imageTy->getPointerAddressSpace());
-      return new_pointer;
+      return std::make_pair(ResultType::kSpecialized, struct_ty);
     }
+    // Non-specializable cases: queries.
     default:
-      if (!called->isDeclaration()) {
-        for (auto &U : called->getArg(operand_no)->uses()) {
-          if (auto new_type = RemapUse(U.getUser(), U.getOperandNo())) {
-            return new_type;
-          }
-        }
-      }
+      return std::make_pair(ResultType::kNotSpecialized, struct_ty);
       break;
     }
-  } else if (IsImageType(value->getType())) {
+  } else if (value->getType()->isPointerTy()) {
+    // This can occur for instructions such as address space cast.
+    ResultType final_res = ResultType::kNotImage;
+    Type *new_ty = nullptr;
     for (auto &U : value->uses()) {
-      if (auto new_type = RemapUse(U.getUser(), U.getOperandNo())) {
-        return new_type;
+      ResultType res = ResultType::kNotImage;
+      Type *ty = nullptr;
+      std::tie(res, ty) = RemapUse(U.getUser(), U.getOperandNo());
+      if (res == ResultType::kSpecialized) {
+        return std::make_pair(res, ty);
+      } else if (res == kNotSpecialized && final_res == kNotImage) {
+        final_res = res;
+        new_ty = ty;
       }
     }
   }
 
-  return nullptr;
+  return std::make_pair(ResultType::kNotImage, nullptr);
 }
 
 void SpecializeImageTypesPass::SpecializeArg(Function *f, Argument *arg,
@@ -188,8 +247,12 @@
   if (where != remapped_args_.end())
     return;
 
+  // TODO(#816): remove after transition.
+  const bool transparent = !arg->getType()->isOpaquePointerTy();
   remapped_args_[arg] = new_type;
-  functions_to_modify_.insert(f);
+  if (transparent) functions_to_modify_.insert(f);
+
+  auto *struct_ty = cast<StructType>(new_type);
 
   // Fix all uses of |arg|.
   std::vector<Value *> stack;
@@ -198,17 +261,23 @@
     Value *value = stack.back();
     stack.pop_back();
 
-    if (value->getType() == new_type)
+    if (transparent &&
+        cast<PointerType>(value->getType())->getNonOpaquePointerElementType() ==
+            new_type) {
       continue;
+    }
 
     auto old_type = value->getType();
-    value->mutateType(new_type);
+    if (transparent) {
+      value->mutateType(
+          PointerType::get(new_type, old_type->getPointerAddressSpace()));
+    }
     for (auto &u : value->uses()) {
       if (auto call = dyn_cast<CallInst>(u.getUser())) {
         auto called = call->getCalledFunction();
         auto &func_info = Builtins::Lookup(called);
         if (BUILTIN_IN_GROUP(func_info.getType(), Image)) {
-          auto new_func = ReplaceImageBuiltin(called, new_type);
+          auto new_func = ReplaceImageBuiltin(called, func_info, struct_ty);
           call->setCalledFunction(new_func);
           if (called->getNumUses() == 0)
             called->eraseFromParent();
@@ -227,27 +296,34 @@
 }
 
 Function *SpecializeImageTypesPass::ReplaceImageBuiltin(Function *f,
-                                                        Type *type) {
-  std::string name = f->getName().str();
-  name += ".";
-  name += cast<StructType>(type->getPointerElementType())->getName();
-  if (auto replaced = f->getParent()->getFunction(name))
-    return replaced;
+                                                        Builtins::FunctionInfo info,
+                                                        StructType *type) {
+  // Update the parameter name and produce a new mangling of the function to
+  // match.
+  auto &image_param = info.getParameter(0);
+  image_param.name = type->getName().str();
+  std::string new_name = Builtins::GetMangledFunctionName(info);
 
-  // Change the image argument to the specialized type.
-  SmallVector<Type *, 4> paramTys;
-  for (auto &Arg : f->args()) {
-    if (IsImageType(Arg.getType()))
-      paramTys.push_back(type);
-    else
-      paramTys.push_back(Arg.getType());
+  // TODO(#816): remove after transition
+  Function *new_func = nullptr;
+  if (f->getArg(0)->getType()->isOpaquePointerTy()) {
+    auto callee = f->getParent()->getOrInsertFunction(
+        new_name, f->getFunctionType(), f->getAttributes());
+    new_func = cast<Function>(callee.getCallee());
+  } else {
+    SmallVector<Type *, 4> param_tys;
+    for (auto &Arg : f->args()) {
+      param_tys.push_back(Arg.getType());
+    }
+    param_tys[0] = PointerType::get(type, param_tys[0]->getPointerAddressSpace());
+
+    auto func_ty =
+        FunctionType::get(f->getReturnType(), param_tys, f->isVarArg());
+    auto callee =
+        f->getParent()->getOrInsertFunction(new_name, func_ty, f->getAttributes());
+    new_func = cast<Function>(callee.getCallee());
   }
 
-  auto func_type =
-      FunctionType::get(f->getReturnType(), paramTys, f->isVarArg());
-  auto callee =
-      f->getParent()->getOrInsertFunction(name, func_type, f->getAttributes());
-  auto new_func = cast<Function>(callee.getCallee());
   new_func->setCallingConv(f->getCallingConv());
   new_func->copyMetadata(f, 0);
   return new_func;
@@ -262,7 +338,8 @@
     if (where == remapped_args_.end())
       arg_types.push_back(arg.getType());
     else
-      arg_types.push_back(where->second);
+      arg_types.push_back(PointerType::get(
+          where->second, arg.getType()->getPointerAddressSpace()));
   }
 
   auto func_type =
diff --git a/lib/SpecializeImageTypes.h b/lib/SpecializeImageTypes.h
index 1286449..a8836cd 100644
--- a/lib/SpecializeImageTypes.h
+++ b/lib/SpecializeImageTypes.h
@@ -12,9 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include <utility>
+
 #include "llvm/IR/Module.h"
 #include "llvm/IR/PassManager.h"
 
+#include "Builtins.h"
+
 #ifndef _CLSPV_LIB_SPECIALIZE_IMAGE_TYPES_PASS_H
 #define _CLSPV_LIB_SPECIALIZE_IMAGE_TYPES_PASS_H
 
@@ -23,12 +27,15 @@
     : llvm::PassInfoMixin<SpecializeImageTypesPass> {
   llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &);
 
+  enum ResultType { kNotImage, kNotSpecialized, kSpecialized };
+
 private:
   // Returns the specialized image type for |arg|.
-  llvm::Type *RemapType(llvm::Argument *arg);
+  std::pair<ResultType, llvm::Type *> RemapType(llvm::Argument *arg);
 
   // Returns the specialized image type for operand |operand_no| in |value|.
-  llvm::Type *RemapUse(llvm::Value *value, unsigned operand_no);
+  std::pair<ResultType, llvm::Type *> RemapUse(llvm::Value *value,
+                                               unsigned operand_no);
 
   // Specializes |arg| as |new_type|. Recursively updates the use chain.
   void SpecializeArg(llvm::Function *f, llvm::Argument *arg,
@@ -36,7 +43,9 @@
 
   // Returns a replacement image builtin function for the specialized type
   // |type|.
-  llvm::Function *ReplaceImageBuiltin(llvm::Function *f, llvm::Type *type);
+  llvm::Function *ReplaceImageBuiltin(llvm::Function *f,
+                                      Builtins::FunctionInfo info,
+                                      llvm::StructType *type);
 
   // Rewrites |f| using the |remapped_args_| to determine to updated types.
   void RewriteFunction(llvm::Function *f);
diff --git a/lib/Types.cpp b/lib/Types.cpp
index a35e5c9..a0bf3a1 100644
--- a/lib/Types.cpp
+++ b/lib/Types.cpp
@@ -323,7 +323,11 @@
         if (STy->getName().startswith("opencl.image1d_array_ro_t") ||
             STy->getName().startswith("opencl.image1d_array_wo_t") ||
             STy->getName().startswith("opencl.image2d_array_ro_t") ||
-            STy->getName().startswith("opencl.image2d_array_wo_t")) {
+            STy->getName().startswith("opencl.image2d_array_wo_t") ||
+            STy->getName().startswith("ocl_image1d_array_ro") ||
+            STy->getName().startswith("ocl_image1d_array_wo") ||
+            STy->getName().startswith("ocl_image2d_array_ro") ||
+            STy->getName().startswith("ocl_image2d_array_wo")) {
           isArrayImageType = true;
         }
       }
@@ -355,8 +359,8 @@
   Type *ty = nullptr;
   if (IsImageType(type, &ty)) {
     if (auto struct_ty = dyn_cast_or_null<StructType>(ty)) {
-      if (struct_ty->getName().contains("_wo_t") ||
-          struct_ty->getName().contains("_rw_t")) {
+      if (struct_ty->getName().contains("_wo") ||
+          struct_ty->getName().contains("_rw")) {
         return true;
       }
     }
diff --git a/lib/Types.h b/lib/Types.h
index b1b67c2..54586bc 100644
--- a/lib/Types.h
+++ b/lib/Types.h
@@ -27,6 +27,7 @@
 //
 // If the type of |v\ is an opaque pointer, this function traverses the uses of
 // |v| to determine the appropriate type.
+// Returns nullptr if a type cannot be inferred.
 llvm::Type *InferType(llvm::Value *v, llvm::LLVMContext &context,
                       llvm::DenseMap<llvm::Value *, llvm::Type *> *cache);
 
diff --git a/test/AllocateDescriptors/spec_images_no_sharing.ll b/test/AllocateDescriptors/spec_images_no_sharing.ll
new file mode 100644
index 0000000..c03cf1d
--- /dev/null
+++ b/test/AllocateDescriptors/spec_images_no_sharing.ll
@@ -0,0 +1,31 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types,allocate-descriptors
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: @foo
+; CHECK: [[res:%[a-zA-Z0-9_.]+]] = call ptr addrspace(1) @_Z14clspv.resource.0(i32 0, i32 0, i32 7, i32 0, i32 0, i32 0, %ocl_image1d_wo.float zeroinitializer)
+; CHECK: (ptr addrspace(1) [[res]],
+; CHECK: @bar
+; CHECK: [[res:%[a-zA-Z0-9_.]+]] = call ptr addrspace(1) @_Z14clspv.resource.1(i32 0, i32 0, i32 7, i32 0, i32 1, i32 0, %ocl_image1d_wo.int zeroinitializer)
+; CHECK: (ptr addrspace(1) [[res]],
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_kernel void @foo(ptr addrspace(1) %t) !clspv.pod_args_impl !7 {
+entry:
+  call spir_func void @_Z12write_imagef14ocl_image1d_woiDv4_f(ptr addrspace(1) %t, i32 0, <4 x float> zeroinitializer)
+  ret void
+}
+
+declare spir_func void @_Z12write_imagef14ocl_image1d_woiDv4_f(ptr addrspace(1), i32, <4 x float>)
+
+define dso_local spir_kernel void @bar(ptr addrspace(1) %t) !clspv.pod_args_impl !7 {
+entry:
+  call spir_func void @_Z12write_imagei14ocl_image1d_woiDv4_i(ptr addrspace(1) %t, i32 0, <4 x i32> zeroinitializer)
+  ret void
+}
+
+declare spir_func void @_Z12write_imagei14ocl_image1d_woiDv4_i(ptr addrspace(1), i32, <4 x i32>)
+
+!7 = !{i32 2}
+
diff --git a/test/AllocateDescriptors/spec_images_sharing.ll b/test/AllocateDescriptors/spec_images_sharing.ll
new file mode 100644
index 0000000..1e652aa
--- /dev/null
+++ b/test/AllocateDescriptors/spec_images_sharing.ll
@@ -0,0 +1,29 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types,allocate-descriptors
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: @foo
+; CHECK: [[res:%[a-zA-Z0-9_.]+]] = call ptr addrspace(1) @_Z14clspv.resource.0(i32 0, i32 0, i32 7, i32 0, i32 0, i32 0, %ocl_image1d_wo.float zeroinitializer)
+; CHECK: (ptr addrspace(1) [[res]],
+; CHECK: @bar
+; CHECK: [[res:%[a-zA-Z0-9_.]+]] = call ptr addrspace(1) @_Z14clspv.resource.0(i32 0, i32 0, i32 7, i32 0, i32 0, i32 0, %ocl_image1d_wo.float zeroinitializer)
+; CHECK: (ptr addrspace(1) [[res]],
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_kernel void @foo(ptr addrspace(1) %t) !clspv.pod_args_impl !7 {
+entry:
+  call spir_func void @_Z12write_imagef14ocl_image1d_woiDv4_f(ptr addrspace(1) %t, i32 0, <4 x float> zeroinitializer)
+  ret void
+}
+
+declare spir_func void @_Z12write_imagef14ocl_image1d_woiDv4_f(ptr addrspace(1), i32, <4 x float>)
+
+define dso_local spir_kernel void @bar(ptr addrspace(1) %t) !clspv.pod_args_impl !7 {
+entry:
+  call spir_func void @_Z12write_imagef14ocl_image1d_woiDv4_f(ptr addrspace(1) %t, i32 0, <4 x float> zeroinitializer)
+  ret void
+}
+
+!7 = !{i32 2}
+
diff --git a/test/AllocateDescriptors/traverse_pointer_insdtruction.ll b/test/AllocateDescriptors/traverse_pointer_instruction.ll
similarity index 100%
rename from test/AllocateDescriptors/traverse_pointer_insdtruction.ll
rename to test/AllocateDescriptors/traverse_pointer_instruction.ll
diff --git a/test/LLVMIntrinsics/unreachable.ll b/test/LLVMIntrinsics/unreachable.ll
index 521687e..5c02dc0 100644
--- a/test/LLVMIntrinsics/unreachable.ll
+++ b/test/LLVMIntrinsics/unreachable.ll
@@ -1,4 +1,4 @@
-; RUN: clspv -x ir %s -o %t.spv
+; RUN: clspv -x ir %s -o %t.spv -opaque-pointers=0
 ; RUN: spirv-val --target-env vulkan1.0 %t.spv
 ; RUN: spirv-dis %t.spv -o - | FileCheck %s
 
diff --git a/test/SpecializeImageTypes/image1d_array_float_get_image_width.ll b/test/SpecializeImageTypes/image1d_array_float_get_image_width.ll
index 3f0a7a4..81a6884 100644
--- a/test/SpecializeImageTypes/image1d_array_float_get_image_width.ll
+++ b/test/SpecializeImageTypes/image1d_array_float_get_image_width.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_array_wo_t.float]] = type opaque
-; CHECK-DAG: declare spir_func void @_Z12write_imagef20ocl_image1d_array_woDv2_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x float>) [[ATTRS1:#[0-9]+]]
-; CHECK-DAG: declare spir_func i32 @_Z15get_image_width20ocl_image1d_array_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
+; CHECK-DAG: declare spir_func void @_Z12write_imagef31[[IMAGE]]Dv2_iDv4_f(%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x float>) [[ATTRS1:#[0-9]+]]
+; CHECK-DAG: declare spir_func i32 @_Z15get_image_width31[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef20ocl_image1d_array_woDv2_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z15get_image_width20ocl_image1d_array_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
+; CHECK: call spir_func void @_Z12write_imagef31[[IMAGE]]Dv2_iDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z15get_image_width31[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
 ; CHECK-DAG: attributes [[ATTRS1]] = { convergent nounwind }
 ; CHECK-DAG: attributes [[ATTRS2]] = { convergent nobuiltin nounwind readonly }
 
diff --git a/test/SpecializeImageTypes/image1d_array_float_sampled_get_image_width.ll b/test/SpecializeImageTypes/image1d_array_float_sampled_get_image_width.ll
index 4190bce..bee0eb2 100644
--- a/test/SpecializeImageTypes/image1d_array_float_sampled_get_image_width.ll
+++ b/test/SpecializeImageTypes/image1d_array_float_sampled_get_image_width.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_array_ro_t.float.sampled]] = type opaque
-; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef20ocl_image1d_array_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS1:#[0-9]+]]
-; CHECK-DAG: declare spir_func i32 @_Z15get_image_width20ocl_image1d_array_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
+; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef39[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS1:#[0-9]+]]
+; CHECK-DAG: declare spir_func i32 @_Z15get_image_width39[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef20ocl_image1d_array_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z15get_image_width20ocl_image1d_array_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef39[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z15get_image_width39[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
 ; CHECK-DAG: attributes [[ATTRS1]] = { convergent nounwind }
 ; CHECK-DAG: attributes [[ATTRS2]] = { nounwind }
 
diff --git a/test/SpecializeImageTypes/image1d_buffer_float_get_image_width.ll b/test/SpecializeImageTypes/image1d_buffer_float_get_image_width.ll
index cda4854..ecd4a81 100644
--- a/test/SpecializeImageTypes/image1d_buffer_float_get_image_width.ll
+++ b/test/SpecializeImageTypes/image1d_buffer_float_get_image_width.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_buffer_wo_t.float]] = type opaque
-; CHECK-DAG: declare spir_func void @_Z12write_imagef21ocl_image1d_buffer_woiDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, i32, <4 x float>) [[ATTRS1:#[0-9]+]]
-; CHECK-DAG: declare spir_func i32 @_Z15get_image_width21ocl_image1d_buffer_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
+; CHECK-DAG: declare spir_func void @_Z12write_imagef32[[IMAGE]]iDv4_f(%[[IMAGE]] addrspace(1)*, i32, <4 x float>) [[ATTRS1:#[0-9]+]]
+; CHECK-DAG: declare spir_func i32 @_Z15get_image_width32[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef21ocl_image1d_buffer_woiDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z15get_image_width21ocl_image1d_buffer_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
+; CHECK: call spir_func void @_Z12write_imagef32[[IMAGE]]iDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z15get_image_width32[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
 ; CHECK-DAG: attributes [[ATTRS1]] = { convergent nounwind }
 ; CHECK-DAG: attributes [[ATTRS2]] = { convergent nobuiltin nounwind readonly }
 
diff --git a/test/SpecializeImageTypes/image1d_float_get_image_width.ll b/test/SpecializeImageTypes/image1d_float_get_image_width.ll
index 045df52..d8ce07b 100644
--- a/test/SpecializeImageTypes/image1d_float_get_image_width.ll
+++ b/test/SpecializeImageTypes/image1d_float_get_image_width.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_wo_t.float]] = type opaque
-; CHECK-DAG: declare spir_func void @_Z12write_imagef14ocl_image1d_woiDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, i32, <4 x float>) [[ATTRS1:#[0-9]+]]
-; CHECK-DAG: declare spir_func i32 @_Z15get_image_width14ocl_image1d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
+; CHECK-DAG: declare spir_func void @_Z12write_imagef25[[IMAGE]]iDv4_f(%[[IMAGE]] addrspace(1)*, i32, <4 x float>) [[ATTRS1:#[0-9]+]]
+; CHECK-DAG: declare spir_func i32 @_Z15get_image_width25[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef14ocl_image1d_woiDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z15get_image_width14ocl_image1d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
+; CHECK: call spir_func void @_Z12write_imagef25[[IMAGE]]iDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z15get_image_width25[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
 ; CHECK-DAG: attributes [[ATTRS1]] = { convergent nounwind }
 ; CHECK-DAG: attributes [[ATTRS2]] = { convergent nobuiltin nounwind readonly }
 
diff --git a/test/SpecializeImageTypes/image1d_float_sampled_get_image_width.ll b/test/SpecializeImageTypes/image1d_float_sampled_get_image_width.ll
index 8fad62a..fa36899 100644
--- a/test/SpecializeImageTypes/image1d_float_sampled_get_image_width.ll
+++ b/test/SpecializeImageTypes/image1d_float_sampled_get_image_width.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_ro_t.float.sampled]] = type opaque
-; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef14ocl_image1d_ro11ocl_samplerf.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, float) [[ATTRS1:#[0-9]+]]
-; CHECK-DAG: declare spir_func i32 @_Z15get_image_width14ocl_image1d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
+; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerf(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, float) [[ATTRS1:#[0-9]+]]
+; CHECK-DAG: declare spir_func i32 @_Z15get_image_width33[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image1d_ro11ocl_samplerf.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z15get_image_width14ocl_image1d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerf(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z15get_image_width33[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
 ; CHECK-DAG: attributes [[ATTRS1]] = { convergent nounwind }
 ; CHECK-DAG: attributes [[ATTRS2]] = { nounwind }
 
diff --git a/test/SpecializeImageTypes/image2d_array_float_get_image_height.ll b/test/SpecializeImageTypes/image2d_array_float_get_image_height.ll
index c7dd964..4437fe3 100644
--- a/test/SpecializeImageTypes/image2d_array_float_get_image_height.ll
+++ b/test/SpecializeImageTypes/image2d_array_float_get_image_height.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_wo_t.float]] = type opaque
-; CHECK-DAG: declare spir_func void @_Z12write_imagef20ocl_image2d_array_woDv4_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x float>) [[ATTRS1:#[0-9]+]]
-; CHECK-DAG: declare spir_func i32 @_Z16get_image_height20ocl_image2d_array_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
+; CHECK-DAG: declare spir_func void @_Z12write_imagef31[[IMAGE]]Dv4_iDv4_f(%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x float>) [[ATTRS1:#[0-9]+]]
+; CHECK-DAG: declare spir_func i32 @_Z16get_image_height31[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef20ocl_image2d_array_woDv4_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z16get_image_height20ocl_image2d_array_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
+; CHECK: call spir_func void @_Z12write_imagef31[[IMAGE]]Dv4_iDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z16get_image_height31[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
 ; CHECK-DAG: attributes [[ATTRS1]] = { convergent nounwind }
 ; CHECK-DAG: attributes [[ATTRS2]] = { convergent nobuiltin nounwind readonly }
 
diff --git a/test/SpecializeImageTypes/image2d_array_float_get_image_width.ll b/test/SpecializeImageTypes/image2d_array_float_get_image_width.ll
index 7b4d069..36201ec 100644
--- a/test/SpecializeImageTypes/image2d_array_float_get_image_width.ll
+++ b/test/SpecializeImageTypes/image2d_array_float_get_image_width.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_wo_t.float]] = type opaque
-; CHECK-DAG: declare spir_func void @_Z12write_imagef20ocl_image2d_array_woDv4_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x float>) [[ATTRS1:#[0-9]+]]
-; CHECK-DAG: declare spir_func i32 @_Z15get_image_width20ocl_image2d_array_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
+; CHECK-DAG: declare spir_func void @_Z12write_imagef31[[IMAGE]]Dv4_iDv4_f(%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x float>) [[ATTRS1:#[0-9]+]]
+; CHECK-DAG: declare spir_func i32 @_Z15get_image_width31[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef20ocl_image2d_array_woDv4_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z15get_image_width20ocl_image2d_array_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
+; CHECK: call spir_func void @_Z12write_imagef31[[IMAGE]]Dv4_iDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z15get_image_width31[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
 ; CHECK-DAG: attributes [[ATTRS1]] = { convergent nounwind }
 ; CHECK-DAG: attributes [[ATTRS2]] = { convergent nobuiltin nounwind readonly }
 
diff --git a/test/SpecializeImageTypes/image2d_array_float_sampled_get_image_height.ll b/test/SpecializeImageTypes/image2d_array_float_sampled_get_image_height.ll
index 221f0f6..7d33f1d 100644
--- a/test/SpecializeImageTypes/image2d_array_float_sampled_get_image_height.ll
+++ b/test/SpecializeImageTypes/image2d_array_float_sampled_get_image_height.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_ro_t.float.sampled]] = type opaque
-; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef20ocl_image2d_array_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS1:#[0-9]+]]
-; CHECK-DAG: declare spir_func i32 @_Z16get_image_height20ocl_image2d_array_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
+; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef39[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS1:#[0-9]+]]
+; CHECK-DAG: declare spir_func i32 @_Z16get_image_height39[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef20ocl_image2d_array_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z16get_image_height20ocl_image2d_array_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef39[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z16get_image_height39[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
 ; CHECK-DAG: attributes [[ATTRS1]] = { convergent nounwind }
 ; CHECK-DAG: attributes [[ATTRS2]] = { nounwind }
 
diff --git a/test/SpecializeImageTypes/image2d_array_float_sampled_get_image_width.ll b/test/SpecializeImageTypes/image2d_array_float_sampled_get_image_width.ll
index 21c1e61..b6134fd 100644
--- a/test/SpecializeImageTypes/image2d_array_float_sampled_get_image_width.ll
+++ b/test/SpecializeImageTypes/image2d_array_float_sampled_get_image_width.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_ro_t.float.sampled]] = type opaque
-; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef20ocl_image2d_array_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS1:#[0-9]+]]
-; CHECK-DAG: declare spir_func i32 @_Z15get_image_width20ocl_image2d_array_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
+; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef39[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS1:#[0-9]+]]
+; CHECK-DAG: declare spir_func i32 @_Z15get_image_width39[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef20ocl_image2d_array_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z15get_image_width20ocl_image2d_array_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef39[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z15get_image_width39[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
 ; CHECK-DAG: attributes [[ATTRS1]] = { convergent nounwind }
 ; CHECK-DAG: attributes [[ATTRS2]] = { nounwind }
 
diff --git a/test/SpecializeImageTypes/image2d_array_int_get_image_dim.ll b/test/SpecializeImageTypes/image2d_array_int_get_image_dim.ll
index 13e5e7b..9c826e4 100644
--- a/test/SpecializeImageTypes/image2d_array_int_get_image_dim.ll
+++ b/test/SpecializeImageTypes/image2d_array_int_get_image_dim.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_wo_t.int]] = type opaque
-; CHECK: declare spir_func <2 x i32> @_Z13get_image_dim20ocl_image2d_array_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
-; CHECK: declare spir_func void @_Z12write_imagei20ocl_image2d_array_woDv4_iS0_.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x i32>) [[ATTRS]]
+; CHECK: declare spir_func <2 x i32> @_Z13get_image_dim29[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagei29[[IMAGE]]Dv4_iDv4_i(%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x i32>) [[ATTRS]]
 ; CHECK: define spir_kernel void @write_int
-; CHECK: call spir_func void @_Z12write_imagei20ocl_image2d_array_woDv4_iS0_.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func <2 x i32> @_Z13get_image_dim20ocl_image2d_array_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagei29[[IMAGE]]Dv4_iDv4_i(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <2 x i32> @_Z13get_image_dim29[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/image2d_array_int_sampled_get_image_dim.ll b/test/SpecializeImageTypes/image2d_array_int_sampled_get_image_dim.ll
index d9aecf2..18bbd0f 100644
--- a/test/SpecializeImageTypes/image2d_array_int_sampled_get_image_dim.ll
+++ b/test/SpecializeImageTypes/image2d_array_int_sampled_get_image_dim.ll
@@ -2,10 +2,10 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_ro_t.int.sampled]] = type opaque
-; CHECK: declare spir_func <2 x i32> @_Z13get_image_dim20ocl_image2d_array_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei20ocl_image2d_array_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS]]
+; CHECK: declare spir_func <2 x i32> @_Z13get_image_dim37[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei37[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <2 x i32> @_Z13get_image_dim20ocl_image2d_array_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <2 x i32> @_Z13get_image_dim37[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/image2d_float_get_image_height.ll b/test/SpecializeImageTypes/image2d_float_get_image_height.ll
index 3078d33..bc550f8 100644
--- a/test/SpecializeImageTypes/image2d_float_get_image_height.ll
+++ b/test/SpecializeImageTypes/image2d_float_get_image_height.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_wo_t.float]] = type opaque
-; CHECK-DAG: declare spir_func void @_Z12write_imagef14ocl_image2d_woDv2_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x float>) [[ATTRS1:#[0-9]+]]
-; CHECK-DAG: declare spir_func i32 @_Z16get_image_height14ocl_image2d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
+; CHECK-DAG: declare spir_func void @_Z12write_imagef25[[IMAGE]]Dv2_iDv4_f(%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x float>) [[ATTRS1:#[0-9]+]]
+; CHECK-DAG: declare spir_func i32 @_Z16get_image_height25[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef14ocl_image2d_woDv2_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z16get_image_height14ocl_image2d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
+; CHECK: call spir_func void @_Z12write_imagef25[[IMAGE]]Dv2_iDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z16get_image_height25[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
 ; CHECK-DAG: attributes [[ATTRS1]] = { convergent nounwind }
 ; CHECK-DAG: attributes [[ATTRS2]] = { convergent nobuiltin nounwind readonly }
 
diff --git a/test/SpecializeImageTypes/image2d_float_get_image_width.ll b/test/SpecializeImageTypes/image2d_float_get_image_width.ll
index fcfb6f1..59b9dbb 100644
--- a/test/SpecializeImageTypes/image2d_float_get_image_width.ll
+++ b/test/SpecializeImageTypes/image2d_float_get_image_width.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_wo_t.float]] = type opaque
-; CHECK-DAG: declare spir_func void @_Z12write_imagef14ocl_image2d_woDv2_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x float>) [[ATTRS1:#[0-9]+]]
-; CHECK-DAG: declare spir_func i32 @_Z15get_image_width14ocl_image2d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
+; CHECK-DAG: declare spir_func void @_Z12write_imagef25[[IMAGE]]Dv2_iDv4_f(%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x float>) [[ATTRS1:#[0-9]+]]
+; CHECK-DAG: declare spir_func i32 @_Z15get_image_width25[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef14ocl_image2d_woDv2_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z15get_image_width14ocl_image2d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
+; CHECK: call spir_func void @_Z12write_imagef25[[IMAGE]]Dv2_iDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z15get_image_width25[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
 ; CHECK-DAG: attributes [[ATTRS1]] = { convergent nounwind }
 ; CHECK-DAG: attributes [[ATTRS2]] = { convergent nobuiltin nounwind readonly }
 
diff --git a/test/SpecializeImageTypes/image2d_float_sampled_get_image_height.ll b/test/SpecializeImageTypes/image2d_float_sampled_get_image_height.ll
index 02d4ece..7d03a15 100644
--- a/test/SpecializeImageTypes/image2d_float_sampled_get_image_height.ll
+++ b/test/SpecializeImageTypes/image2d_float_sampled_get_image_height.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_ro_t.float.sampled]] = type opaque
-; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS1:#[0-9]+]]
-; CHECK-DAG: declare spir_func i32 @_Z16get_image_height14ocl_image2d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
+; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS1:#[0-9]+]]
+; CHECK-DAG: declare spir_func i32 @_Z16get_image_height33[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z16get_image_height14ocl_image2d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z16get_image_height33[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
 ; CHECK-DAG: attributes [[ATTRS1]] = { convergent nounwind }
 ; CHECK-DAG: attributes [[ATTRS2]] = { nounwind }
 
diff --git a/test/SpecializeImageTypes/image2d_float_sampled_get_image_width.ll b/test/SpecializeImageTypes/image2d_float_sampled_get_image_width.ll
index da0dde0..3de4db7 100644
--- a/test/SpecializeImageTypes/image2d_float_sampled_get_image_width.ll
+++ b/test/SpecializeImageTypes/image2d_float_sampled_get_image_width.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_ro_t.float.sampled]] = type opaque
-; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS1:#[0-9]+]]
-; CHECK-DAG: declare spir_func i32 @_Z15get_image_width14ocl_image2d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
+; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS1:#[0-9]+]]
+; CHECK-DAG: declare spir_func i32 @_Z15get_image_width33[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS2:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z15get_image_width14ocl_image2d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z15get_image_width33[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
 ; CHECK-DAG: attributes [[ATTRS1]] = { convergent nounwind }
 ; CHECK-DAG: attributes [[ATTRS2]] = { nounwind }
 
diff --git a/test/SpecializeImageTypes/image2d_int_get_image_dim.ll b/test/SpecializeImageTypes/image2d_int_get_image_dim.ll
index 3968649..421f3fe 100644
--- a/test/SpecializeImageTypes/image2d_int_get_image_dim.ll
+++ b/test/SpecializeImageTypes/image2d_int_get_image_dim.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_wo_t.int]] = type opaque
-; CHECK: declare spir_func <2 x i32> @_Z13get_image_dim14ocl_image2d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
-; CHECK: declare spir_func void @_Z12write_imagei14ocl_image2d_woDv2_iDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x i32>) [[ATTRS]]
+; CHECK: declare spir_func <2 x i32> @_Z13get_image_dim23[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagei23[[IMAGE]]Dv2_iDv4_i(%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x i32>) [[ATTRS]]
 ; CHECK: define spir_kernel void @write_int
-; CHECK: call spir_func void @_Z12write_imagei14ocl_image2d_woDv2_iDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func <2 x i32> @_Z13get_image_dim14ocl_image2d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagei23[[IMAGE]]Dv2_iDv4_i(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <2 x i32> @_Z13get_image_dim23[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/image2d_int_sampled_get_image_dim.ll b/test/SpecializeImageTypes/image2d_int_sampled_get_image_dim.ll
index 77a4e3e..e6c075f 100644
--- a/test/SpecializeImageTypes/image2d_int_sampled_get_image_dim.ll
+++ b/test/SpecializeImageTypes/image2d_int_sampled_get_image_dim.ll
@@ -2,10 +2,10 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_ro_t.int.sampled]] = type opaque
-; CHECK: declare spir_func <2 x i32> @_Z13get_image_dim14ocl_image2d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS]]
+; CHECK: declare spir_func <2 x i32> @_Z13get_image_dim31[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <2 x i32> @_Z13get_image_dim14ocl_image2d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <2 x i32> @_Z13get_image_dim31[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/image3d_float_get_image_depth.ll b/test/SpecializeImageTypes/image3d_float_get_image_depth.ll
index acb242d..d874274 100644
--- a/test/SpecializeImageTypes/image3d_float_get_image_depth.ll
+++ b/test/SpecializeImageTypes/image3d_float_get_image_depth.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_wo_t.float]] = type opaque
-; CHECK: declare spir_func i32 @_Z15get_image_depth14ocl_image3d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
-; CHECK: declare spir_func void @_Z12write_imagef14ocl_image3d_woDv4_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x float>) [[ATTRS]]
+; CHECK: declare spir_func i32 @_Z15get_image_depth25[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagef25[[IMAGE]]Dv4_iDv4_f(%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x float>) [[ATTRS]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef14ocl_image3d_woDv4_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z15get_image_depth14ocl_image3d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
+; CHECK: call spir_func void @_Z12write_imagef25[[IMAGE]]Dv4_iDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z15get_image_depth25[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/image3d_float_get_image_height.ll b/test/SpecializeImageTypes/image3d_float_get_image_height.ll
index 046c907..85e3045 100644
--- a/test/SpecializeImageTypes/image3d_float_get_image_height.ll
+++ b/test/SpecializeImageTypes/image3d_float_get_image_height.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_wo_t.float]] = type opaque
-; CHECK: declare spir_func i32 @_Z16get_image_height14ocl_image3d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
-; CHECK: declare spir_func void @_Z12write_imagef14ocl_image3d_woDv4_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x float>) [[ATTRS]]
+; CHECK: declare spir_func i32 @_Z16get_image_height25[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagef25[[IMAGE]]Dv4_iDv4_f(%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x float>) [[ATTRS]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef14ocl_image3d_woDv4_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z16get_image_height14ocl_image3d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
+; CHECK: call spir_func void @_Z12write_imagef25[[IMAGE]]Dv4_iDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z16get_image_height25[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/image3d_float_get_image_width.ll b/test/SpecializeImageTypes/image3d_float_get_image_width.ll
index 1b0813f..9588cc3 100644
--- a/test/SpecializeImageTypes/image3d_float_get_image_width.ll
+++ b/test/SpecializeImageTypes/image3d_float_get_image_width.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_wo_t.float]] = type opaque
-; CHECK: declare spir_func i32 @_Z15get_image_width14ocl_image3d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
-; CHECK: declare spir_func void @_Z12write_imagef14ocl_image3d_woDv4_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x float>) [[ATTRS]]
+; CHECK: declare spir_func i32 @_Z15get_image_width25[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagef25[[IMAGE]]Dv4_iDv4_f(%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x float>) [[ATTRS]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef14ocl_image3d_woDv4_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z15get_image_width14ocl_image3d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
+; CHECK: call spir_func void @_Z12write_imagef25[[IMAGE]]Dv4_iDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z15get_image_width25[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/image3d_float_sampled_get_image_depth.ll b/test/SpecializeImageTypes/image3d_float_sampled_get_image_depth.ll
index 42c7a1a..85f4c80 100644
--- a/test/SpecializeImageTypes/image3d_float_sampled_get_image_depth.ll
+++ b/test/SpecializeImageTypes/image3d_float_sampled_get_image_depth.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func i32 @_Z15get_image_depth14ocl_image3d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef14ocl_image3d_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func i32 @_Z15get_image_depth33[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image3d_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z15get_image_depth14ocl_image3d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z15get_image_depth33[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/image3d_float_sampled_get_image_height.ll b/test/SpecializeImageTypes/image3d_float_sampled_get_image_height.ll
index 1ffc69b..e5397f4 100644
--- a/test/SpecializeImageTypes/image3d_float_sampled_get_image_height.ll
+++ b/test/SpecializeImageTypes/image3d_float_sampled_get_image_height.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func i32 @_Z16get_image_height14ocl_image3d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef14ocl_image3d_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func i32 @_Z16get_image_height33[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image3d_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z16get_image_height14ocl_image3d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z16get_image_height33[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/image3d_float_sampled_get_image_width.ll b/test/SpecializeImageTypes/image3d_float_sampled_get_image_width.ll
index 5539d46..9b471ff 100644
--- a/test/SpecializeImageTypes/image3d_float_sampled_get_image_width.ll
+++ b/test/SpecializeImageTypes/image3d_float_sampled_get_image_width.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func i32 @_Z15get_image_width14ocl_image3d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef14ocl_image3d_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func i32 @_Z15get_image_width33[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image3d_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func i32 @_Z15get_image_width14ocl_image3d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func i32 @_Z15get_image_width33[[IMAGE]](%[[IMAGE]] addrspace(1)* %image)
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/image3d_int_get_image_dim.ll b/test/SpecializeImageTypes/image3d_int_get_image_dim.ll
index ffd5f3c..9aea48a 100644
--- a/test/SpecializeImageTypes/image3d_int_get_image_dim.ll
+++ b/test/SpecializeImageTypes/image3d_int_get_image_dim.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_wo_t.int]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z13get_image_dim14ocl_image3d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
-; CHECK: declare spir_func void @_Z12write_imagei14ocl_image3d_woDv4_iS0_.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x i32>) [[ATTRS]]
+; CHECK: declare spir_func <4 x i32> @_Z13get_image_dim23[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagei23[[IMAGE]]Dv4_iDv4_i(%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x i32>) [[ATTRS]]
 ; CHECK: define spir_kernel void @write_int
-; CHECK: call spir_func void @_Z12write_imagei14ocl_image3d_woDv4_iS0_.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func <4 x i32> @_Z13get_image_dim14ocl_image3d_wo.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagei23[[IMAGE]]Dv4_iDv4_i(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z13get_image_dim23[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/image3d_int_sampled_get_image_dim.ll b/test/SpecializeImageTypes/image3d_int_sampled_get_image_dim.ll
index 87b9442..2dd52bd 100644
--- a/test/SpecializeImageTypes/image3d_int_sampled_get_image_dim.ll
+++ b/test/SpecializeImageTypes/image3d_int_sampled_get_image_dim.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_ro_t.int.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z13get_image_dim14ocl_image3d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei14ocl_image3d_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS]]
+; CHECK: declare spir_func <4 x i32> @_Z13get_image_dim31[[IMAGE]](%[[IMAGE]] addrspace(1)*) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <4 x i32> @_Z11read_imagei14ocl_image3d_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
-; CHECK: call spir_func <4 x i32> @_Z13get_image_dim14ocl_image3d_ro.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z13get_image_dim31[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/multiple_image_args_subfuction.ll b/test/SpecializeImageTypes/multiple_image_args_subfuction.ll
index a1c192f..a5f6430 100644
--- a/test/SpecializeImageTypes/multiple_image_args_subfuction.ll
+++ b/test/SpecializeImageTypes/multiple_image_args_subfuction.ll
@@ -3,13 +3,13 @@
 
 ; CHECK-DAG: %[[RO_IM:opencl.image2d_ro_t.float.sampled]] = type opaque
 ; CHECK-DAG: %[[WO_IM:opencl.image2d_wo_t.int]] = type opaque
-; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[RO_IM]](%[[RO_IM]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>)
-; CHECK-DAG: declare spir_func void @_Z12write_imagei14ocl_image2d_woDv2_iDv4_i.[[WO_IM]](%[[WO_IM]] addrspace(1)*, <2 x i32>, <4 x i32>)
+; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef33[[RO_IM]]11ocl_samplerDv2_f(%[[RO_IM]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>)
+; CHECK-DAG: declare spir_func void @_Z12write_imagei23[[WO_IM]]Dv2_iDv4_i(%[[WO_IM]] addrspace(1)*, <2 x i32>, <4 x i32>)
 ; CHECK: define spir_kernel void @read_float
 ; CHECK: call spir_func void @foo(%[[RO_IM]] addrspace(1)* %ro, %[[WO_IM]] addrspace(1)* %wo
 ; CHECK: define spir_func void @foo
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[RO_IM]](%[[RO_IM]] addrspace(1)* %ro
-; CHECK: call spir_func void @_Z12write_imagei14ocl_image2d_woDv2_iDv4_i.[[WO_IM]](%[[WO_IM]] addrspace(1)* %wo
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[RO_IM]]11ocl_samplerDv2_f(%[[RO_IM]] addrspace(1)* %ro
+; CHECK: call spir_func void @_Z12write_imagei23[[WO_IM]]Dv2_iDv4_i(%[[WO_IM]] addrspace(1)* %wo
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
 target triple = "spir-unknown-unknown"
diff --git a/test/SpecializeImageTypes/multiple_image_kernel_args.ll b/test/SpecializeImageTypes/multiple_image_kernel_args.ll
index 072a16e..37cc2c6 100644
--- a/test/SpecializeImageTypes/multiple_image_kernel_args.ll
+++ b/test/SpecializeImageTypes/multiple_image_kernel_args.ll
@@ -3,11 +3,11 @@
 
 ; CHECK-DAG: %[[RO_IM:opencl.image2d_ro_t.float.sampled]] = type opaque
 ; CHECK-DAG: %[[WO_IM:opencl.image2d_wo_t.int]] = type opaque
-; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[RO_IM]](%[[RO_IM]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>)
-; CHECK-DAG: declare spir_func void @_Z12write_imagei14ocl_image2d_woDv2_iDv4_i.[[WO_IM]](%[[WO_IM]] addrspace(1)*, <2 x i32>, <4 x i32>)
+; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef33[[RO_IM]]11ocl_samplerDv2_f(%[[RO_IM]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>)
+; CHECK-DAG: declare spir_func void @_Z12write_imagei23[[WO_IM]]Dv2_iDv4_i(%[[WO_IM]] addrspace(1)*, <2 x i32>, <4 x i32>)
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[RO_IM]](%[[RO_IM]] addrspace(1)* %ro
-; CHECK: call spir_func void @_Z12write_imagei14ocl_image2d_woDv2_iDv4_i.[[WO_IM]](%[[WO_IM]] addrspace(1)* %wo
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[RO_IM]]11ocl_samplerDv2_f(%[[RO_IM]] addrspace(1)* %ro
+; CHECK: call spir_func void @_Z12write_imagei23[[WO_IM]]Dv2_iDv4_i(%[[WO_IM]] addrspace(1)* %wo
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
 target triple = "spir-unknown-unknown"
diff --git a/test/SpecializeImageTypes/multiple_image_kernel_args_different_subfunctions.ll b/test/SpecializeImageTypes/multiple_image_kernel_args_different_subfunctions.ll
index 6a7e6b5..cf3c036 100644
--- a/test/SpecializeImageTypes/multiple_image_kernel_args_different_subfunctions.ll
+++ b/test/SpecializeImageTypes/multiple_image_kernel_args_different_subfunctions.ll
@@ -3,15 +3,15 @@
 
 ; CHECK-DAG: %[[RO_IM:opencl.image2d_ro_t.float.sampled]] = type opaque
 ; CHECK-DAG: %[[WO_IM:opencl.image2d_wo_t.int]] = type opaque
-; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[RO_IM]](%[[RO_IM]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>)
-; CHECK-DAG: declare spir_func void @_Z12write_imagei14ocl_image2d_woDv2_iDv4_i.[[WO_IM]](%[[WO_IM]] addrspace(1)*, <2 x i32>, <4 x i32>)
+; CHECK-DAG: declare spir_func <4 x float> @_Z11read_imagef33[[RO_IM]]11ocl_samplerDv2_f(%[[RO_IM]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>)
+; CHECK-DAG: declare spir_func void @_Z12write_imagei23[[WO_IM]]Dv2_iDv4_i(%[[WO_IM]] addrspace(1)*, <2 x i32>, <4 x i32>)
 ; CHECK: define spir_kernel void @k1
 ; CHECK: call spir_func <4 x float> @foo(%[[RO_IM]] addrspace(1)* %ro,
 ; CHECK: call spir_func void @bar(%[[WO_IM]] addrspace(1)* %wo,
 ; CHECK-DAG: define spir_func <4 x float> @foo
-; CHECK-DAG: call spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[RO_IM]](%[[RO_IM]] addrspace(1)* %ro
+; CHECK-DAG: call spir_func <4 x float> @_Z11read_imagef33[[RO_IM]]11ocl_samplerDv2_f(%[[RO_IM]] addrspace(1)* %ro
 ; CHECK-DAG: define spir_func void @bar
-; CHECK-DAG: call spir_func void @_Z12write_imagei14ocl_image2d_woDv2_iDv4_i.[[WO_IM]](%[[WO_IM]] addrspace(1)* %wo
+; CHECK-DAG: call spir_func void @_Z12write_imagei23[[WO_IM]]Dv2_iDv4_i(%[[WO_IM]] addrspace(1)* %wo
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
 target triple = "spir-unknown-unknown"
diff --git a/test/SpecializeImageTypes/opaque_image1d_array_int.ll b/test/SpecializeImageTypes/opaque_image1d_array_int.ll
new file mode 100644
index 0000000..54eaeb7
--- /dev/null
+++ b/test/SpecializeImageTypes/opaque_image1d_array_int.ll
@@ -0,0 +1,25 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types --cl-std=CL2.0
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei32ocl_image1d_array_ro.int.sampled11ocl_samplerDv2_f(ptr addrspace(1) %t_in1,
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei24ocl_image1d_array_rw.intDv2_i(ptr addrspace(1) %t_in2,
+; CHECK: call spir_func void @_Z12write_imagei24ocl_image1d_array_rw.intDv2_iDv4_i(ptr addrspace(1) %t_out,
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_kernel void @test(ptr addrspace(1) %t_in1, ptr addrspace(1) %t_in2, ptr addrspace(1) %t_out, ptr addrspace(2) %s, <2 x float> %m, <2 x i32> %n) !clspv.pod_args_impl !7 {
+entry:
+  %call = call spir_func <4 x i32> @_Z11read_imagei20ocl_image1d_array_ro11ocl_samplerDv2_f(ptr addrspace(1) %t_in1, ptr addrspace(2) %s, <2 x float> %m)
+  %call1 = call spir_func <4 x i32> @_Z11read_imagei20ocl_image1d_array_rwDv2_i(ptr addrspace(1) %t_in2, <2 x i32> %n)
+  %add = add <4 x i32> %call, %call1
+  call spir_func void @_Z12write_imagei20ocl_image1d_array_woDv2_iDv4_i(ptr addrspace(1) %t_out, <2 x i32> %n, <4 x i32> %add)
+  ret void
+}
+
+declare spir_func <4 x i32> @_Z11read_imagei20ocl_image1d_array_ro11ocl_samplerDv2_f(ptr addrspace(1), ptr addrspace(2), <2 x float>)
+declare spir_func <4 x i32> @_Z11read_imagei20ocl_image1d_array_rwDv2_i(ptr addrspace(1), <2 x i32>)
+declare spir_func void @_Z12write_imagei20ocl_image1d_array_woDv2_iDv4_i(ptr addrspace(1), <2 x i32>, <4 x i32>)
+
+!7 = !{i32 2}
+
diff --git a/test/SpecializeImageTypes/opaque_image1d_buffer_float.ll b/test/SpecializeImageTypes/opaque_image1d_buffer_float.ll
new file mode 100644
index 0000000..5fb52fd
--- /dev/null
+++ b/test/SpecializeImageTypes/opaque_image1d_buffer_float.ll
@@ -0,0 +1,25 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: call spir_func <4 x float> @_Z11read_imagef35ocl_image1d_buffer_ro.float.sampled11ocl_samplerf(ptr addrspace(1) %t_in1,
+; CHECK: call spir_func <4 x float> @_Z11read_imagef35ocl_image1d_buffer_ro.float.sampledi(ptr addrspace(1) %t_in2,
+; CHECK: call spir_func void @_Z12write_imagef27ocl_image1d_buffer_wo.floatiDv4_f(ptr addrspace(1) %t_out,
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_kernel void @test(ptr addrspace(1) %t_in1, ptr addrspace(1) %t_in2, ptr addrspace(1) %t_out, float %m, i32 %n, ptr addrspace(2) %s) !clspv.pod_args_impl !7 {
+entry:
+  %call = call spir_func <4 x float> @_Z11read_imagef21ocl_image1d_buffer_ro11ocl_samplerf(ptr addrspace(1) %t_in1, ptr addrspace(2) %s, float %m)
+  %call1 = call spir_func <4 x float> @_Z11read_imagef21ocl_image1d_buffer_roi(ptr addrspace(1) %t_in2, i32 %n)
+  %add = fadd <4 x float> %call, %call1
+  call spir_func void @_Z12write_imagef21ocl_image1d_buffer_woiDv4_f(ptr addrspace(1) %t_out, i32 %n, <4 x float> %add)
+  ret void
+}
+
+declare spir_func <4 x float> @_Z11read_imagef21ocl_image1d_buffer_ro11ocl_samplerf(ptr addrspace(1), ptr addrspace(2), float)
+declare spir_func <4 x float> @_Z11read_imagef21ocl_image1d_buffer_roi(ptr addrspace(1), i32)
+declare spir_func void @_Z12write_imagef21ocl_image1d_buffer_woiDv4_f(ptr addrspace(1), i32, <4 x float>)
+
+!7 = !{i32 2}
+
diff --git a/test/SpecializeImageTypes/opaque_image1d_float.ll b/test/SpecializeImageTypes/opaque_image1d_float.ll
new file mode 100644
index 0000000..c8c6869
--- /dev/null
+++ b/test/SpecializeImageTypes/opaque_image1d_float.ll
@@ -0,0 +1,25 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: call spir_func <4 x float> @_Z11read_imagef28ocl_image1d_ro.float.sampled11ocl_samplerf(ptr addrspace(1) %t_in1,
+; CHECK: call spir_func <4 x float> @_Z11read_imagef28ocl_image1d_ro.float.sampledi(ptr addrspace(1) %t_in2,
+; CHECK: call spir_func void @_Z12write_imagef20ocl_image1d_wo.floatiDv4_f(ptr addrspace(1) %t_out,
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_kernel void @test(ptr addrspace(1) %t_in1, ptr addrspace(1) %t_in2, ptr addrspace(1) %t_out, float %m, i32 %n, ptr addrspace(2) %s) !clspv.pod_args_impl !7 {
+entry:
+  %call = call spir_func <4 x float> @_Z11read_imagef14ocl_image1d_ro11ocl_samplerf(ptr addrspace(1) %t_in1, ptr addrspace(2) %s, float %m)
+  %call1 = call spir_func <4 x float> @_Z11read_imagef14ocl_image1d_roi(ptr addrspace(1) %t_in2, i32 %n)
+  %add = fadd <4 x float> %call, %call1
+  call spir_func void @_Z12write_imagef14ocl_image1d_woiDv4_f(ptr addrspace(1) %t_out, i32 %n, <4 x float> %add)
+  ret void
+}
+
+declare spir_func <4 x float> @_Z11read_imagef14ocl_image1d_ro11ocl_samplerf(ptr addrspace(1), ptr addrspace(2), float)
+declare spir_func <4 x float> @_Z11read_imagef14ocl_image1d_roi(ptr addrspace(1), i32)
+declare spir_func void @_Z12write_imagef14ocl_image1d_woiDv4_f(ptr addrspace(1), i32, <4 x float>)
+
+!7 = !{i32 2}
+
diff --git a/test/SpecializeImageTypes/opaque_image1d_int.ll b/test/SpecializeImageTypes/opaque_image1d_int.ll
new file mode 100644
index 0000000..ce9e888
--- /dev/null
+++ b/test/SpecializeImageTypes/opaque_image1d_int.ll
@@ -0,0 +1,25 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types --cl-std=CL2.0
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei26ocl_image1d_ro.int.sampled11ocl_samplerf(ptr addrspace(1) %t_in1,
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei18ocl_image1d_rw.inti(ptr addrspace(1) %t_in2,
+; CHECK: call spir_func void @_Z12write_imagei18ocl_image1d_rw.intiDv4_i(ptr addrspace(1) %t_out,
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_kernel void @test(ptr addrspace(1) %t_in1, ptr addrspace(1) %t_in2, ptr addrspace(1) %t_out, ptr addrspace(2) %s, float %m, i32 %n) !clspv.pod_args_impl !7 {
+entry:
+  %call = call spir_func <4 x i32> @_Z11read_imagei14ocl_image1d_ro11ocl_samplerf(ptr addrspace(1) %t_in1, ptr addrspace(2) %s, float %m)
+  %call1 = call spir_func <4 x i32> @_Z11read_imagei14ocl_image1d_rwi(ptr addrspace(1) %t_in2, i32 %n)
+  %add = add <4 x i32> %call, %call1
+  call spir_func void @_Z12write_imagei14ocl_image1d_woiDv4_i(ptr addrspace(1) %t_out, i32 %n, <4 x i32> %add)
+  ret void
+}
+
+declare spir_func <4 x i32> @_Z11read_imagei14ocl_image1d_ro11ocl_samplerf(ptr addrspace(1), ptr addrspace(2), float)
+declare spir_func <4 x i32> @_Z11read_imagei14ocl_image1d_rwi(ptr addrspace(1), i32)
+declare spir_func void @_Z12write_imagei14ocl_image1d_woiDv4_i(ptr addrspace(1), i32, <4 x i32>)
+
+!7 = !{i32 2}
+
diff --git a/test/SpecializeImageTypes/opaque_image1d_uint.ll b/test/SpecializeImageTypes/opaque_image1d_uint.ll
new file mode 100644
index 0000000..2009611
--- /dev/null
+++ b/test/SpecializeImageTypes/opaque_image1d_uint.ll
@@ -0,0 +1,25 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types --cl-std=CL2.0
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui27ocl_image1d_ro.uint.sampled11ocl_samplerf(ptr addrspace(1) %t_in1,
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui19ocl_image1d_rw.uinti(ptr addrspace(1) %t_in2,
+; CHECK: call spir_func void @_Z13write_imageui19ocl_image1d_rw.uintiDv4_i(ptr addrspace(1) %t_out,
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_kernel void @test(ptr addrspace(1) %t_in1, ptr addrspace(1) %t_in2, ptr addrspace(1) %t_out, ptr addrspace(2) %s, float %m, i32 %n) !clspv.pod_args_impl !7 {
+entry:
+  %call = call spir_func <4 x i32> @_Z12read_imageui14ocl_image1d_ro11ocl_samplerf(ptr addrspace(1) %t_in1, ptr addrspace(2) %s, float %m)
+  %call1 = call spir_func <4 x i32> @_Z12read_imageui14ocl_image1d_rwi(ptr addrspace(1) %t_in2, i32 %n)
+  %add = add <4 x i32> %call, %call1
+  call spir_func void @_Z13write_imageui14ocl_image1d_woiDv4_i(ptr addrspace(1) %t_out, i32 %n, <4 x i32> %add)
+  ret void
+}
+
+declare spir_func <4 x i32> @_Z12read_imageui14ocl_image1d_ro11ocl_samplerf(ptr addrspace(1), ptr addrspace(2), float)
+declare spir_func <4 x i32> @_Z12read_imageui14ocl_image1d_rwi(ptr addrspace(1), i32)
+declare spir_func void @_Z13write_imageui14ocl_image1d_woiDv4_i(ptr addrspace(1), i32, <4 x i32>)
+
+!7 = !{i32 2}
+
diff --git a/test/SpecializeImageTypes/opaque_image2d_array_uint.ll b/test/SpecializeImageTypes/opaque_image2d_array_uint.ll
new file mode 100644
index 0000000..d11e1bf
--- /dev/null
+++ b/test/SpecializeImageTypes/opaque_image2d_array_uint.ll
@@ -0,0 +1,25 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types --cl-std=CL2.0
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui33ocl_image2d_array_ro.uint.sampled11ocl_samplerDv4_f(ptr addrspace(1) %t_in1,
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui25ocl_image2d_array_rw.uintDv4_i(ptr addrspace(1) %t_in2,
+; CHECK: call spir_func void @_Z13write_imageui25ocl_image2d_array_rw.uintDv4_iDv4_i(ptr addrspace(1) %t_out,
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_kernel void @test(ptr addrspace(1) %t_in1, ptr addrspace(1) %t_in2, ptr addrspace(1) %t_out, ptr addrspace(2) %s, <4 x float> %m, <4 x i32> %n) !clspv.pod_args_impl !7 {
+entry:
+  %call = call spir_func <4 x i32> @_Z12read_imageui20ocl_image2d_array_ro11ocl_samplerDv4_f(ptr addrspace(1) %t_in1, ptr addrspace(2) %s, <4 x float> %m)
+  %call1 = call spir_func <4 x i32> @_Z12read_imageui20ocl_image2d_array_rwDv4_i(ptr addrspace(1) %t_in2, <4 x i32> %n)
+  %add = add <4 x i32> %call, %call1
+  call spir_func void @_Z13write_imageui20ocl_image2d_array_woDv4_iS_(ptr addrspace(1) %t_out, <4 x i32> %n, <4 x i32> %add)
+  ret void
+}
+
+declare spir_func <4 x i32> @_Z12read_imageui20ocl_image2d_array_ro11ocl_samplerDv4_f(ptr addrspace(1), ptr addrspace(2), <4 x float>)
+declare spir_func <4 x i32> @_Z12read_imageui20ocl_image2d_array_rwDv4_i(ptr addrspace(1), <4 x i32>)
+declare spir_func void @_Z13write_imageui20ocl_image2d_array_woDv4_iS_(ptr addrspace(1), <4 x i32>, <4 x i32>)
+
+!7 = !{i32 2}
+
diff --git a/test/SpecializeImageTypes/opaque_image2d_float.ll b/test/SpecializeImageTypes/opaque_image2d_float.ll
new file mode 100644
index 0000000..a3a6eb2
--- /dev/null
+++ b/test/SpecializeImageTypes/opaque_image2d_float.ll
@@ -0,0 +1,25 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: call spir_func <4 x float> @_Z11read_imagef28ocl_image2d_ro.float.sampled11ocl_samplerDv2_f(ptr addrspace(1) %t_in1,
+; CHECK: call spir_func <4 x float> @_Z11read_imagef28ocl_image2d_ro.float.sampledDv2_i(ptr addrspace(1) %t_in2,
+; CHECK: call spir_func void @_Z12write_imagef20ocl_image2d_wo.floatDv2_iDv4_f(ptr addrspace(1) %t_out,
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_kernel void @test(ptr addrspace(1) %t_in1, ptr addrspace(1) %t_in2, ptr addrspace(1) %t_out, <2 x float> %m, <2 x i32> %n, ptr addrspace(2) %s) !clspv.pod_args_impl !7 {
+entry:
+  %call = call spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f(ptr addrspace(1) %t_in1, ptr addrspace(2) %s, <2 x float> %m)
+  %call1 = call spir_func <4 x float> @_Z11read_imagef14ocl_image2d_roDv2_i(ptr addrspace(1) %t_in2, <2 x i32> %n)
+  %add = fadd <4 x float> %call, %call1
+  call spir_func void @_Z12write_imagef14ocl_image2d_woDv2_iDv4_f(ptr addrspace(1) %t_out, <2 x i32> %n, <4 x float> %add)
+  ret void
+}
+
+declare spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f(ptr addrspace(1), ptr addrspace(2), <2 x float>)
+declare spir_func <4 x float> @_Z11read_imagef14ocl_image2d_roDv2_i(ptr addrspace(1), <2 x i32>)
+declare spir_func void @_Z12write_imagef14ocl_image2d_woDv2_iDv4_f(ptr addrspace(1), <2 x i32>, <4 x float>)
+
+!7 = !{i32 2}
+
diff --git a/test/SpecializeImageTypes/opaque_image2d_int.ll b/test/SpecializeImageTypes/opaque_image2d_int.ll
new file mode 100644
index 0000000..614e121
--- /dev/null
+++ b/test/SpecializeImageTypes/opaque_image2d_int.ll
@@ -0,0 +1,25 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types --cl-std=CL2.0
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei26ocl_image2d_ro.int.sampled11ocl_samplerDv2_f(ptr addrspace(1) %t_in1,
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei18ocl_image2d_rw.intDv2_i(ptr addrspace(1) %t_in2,
+; CHECK: call spir_func void @_Z12write_imagei18ocl_image2d_rw.intDv2_iDv4_i(ptr addrspace(1) %t_out,
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_kernel void @test(ptr addrspace(1) %t_in1, ptr addrspace(1) %t_in2, ptr addrspace(1) %t_out, ptr addrspace(2) %s, <2 x float> %m, <2 x i32> %n) !clspv.pod_args_impl !7 {
+entry:
+  %call = call spir_func <4 x i32> @_Z11read_imagei14ocl_image2d_ro11ocl_samplerDv2_f(ptr addrspace(1) %t_in1, ptr addrspace(2) %s, <2 x float> %m)
+  %call1 = call spir_func <4 x i32> @_Z11read_imagei14ocl_image2d_rwDv2_i(ptr addrspace(1) %t_in2, <2 x i32> %n)
+  %add = add <4 x i32> %call, %call1
+  call spir_func void @_Z12write_imagei14ocl_image2d_woDv2_iDv4_i(ptr addrspace(1) %t_out, <2 x i32> %n, <4 x i32> %add)
+  ret void
+}
+
+declare spir_func <4 x i32> @_Z11read_imagei14ocl_image2d_ro11ocl_samplerDv2_f(ptr addrspace(1), ptr addrspace(2), <2 x float>)
+declare spir_func <4 x i32> @_Z11read_imagei14ocl_image2d_rwDv2_i(ptr addrspace(1), <2 x i32>)
+declare spir_func void @_Z12write_imagei14ocl_image2d_woDv2_iDv4_i(ptr addrspace(1), <2 x i32>, <4 x i32>)
+
+!7 = !{i32 2}
+
diff --git a/test/SpecializeImageTypes/opaque_image2d_uint.ll b/test/SpecializeImageTypes/opaque_image2d_uint.ll
new file mode 100644
index 0000000..c0dc2e3
--- /dev/null
+++ b/test/SpecializeImageTypes/opaque_image2d_uint.ll
@@ -0,0 +1,25 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types --cl-std=CL2.0
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui27ocl_image2d_ro.uint.sampled11ocl_samplerDv2_f(ptr addrspace(1) %t_in1,
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui19ocl_image2d_rw.uintDv2_i(ptr addrspace(1) %t_in2,
+; CHECK: call spir_func void @_Z13write_imageui19ocl_image2d_rw.uintDv2_iDv4_i(ptr addrspace(1) %t_out,
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_kernel void @test(ptr addrspace(1) %t_in1, ptr addrspace(1) %t_in2, ptr addrspace(1) %t_out, ptr addrspace(2) %s, <2 x float> %m, <2 x i32> %n) !clspv.pod_args_impl !7 {
+entry:
+  %call = call spir_func <4 x i32> @_Z12read_imageui14ocl_image2d_ro11ocl_samplerDv2_f(ptr addrspace(1) %t_in1, ptr addrspace(2) %s, <2 x float> %m)
+  %call1 = call spir_func <4 x i32> @_Z12read_imageui14ocl_image2d_rwDv2_i(ptr addrspace(1) %t_in2, <2 x i32> %n)
+  %add = add <4 x i32> %call, %call1
+  call spir_func void @_Z13write_imageui14ocl_image2d_woDv2_iDv4_i(ptr addrspace(1) %t_out, <2 x i32> %n, <4 x i32> %add)
+  ret void
+}
+
+declare spir_func <4 x i32> @_Z12read_imageui14ocl_image2d_ro11ocl_samplerDv2_f(ptr addrspace(1), ptr addrspace(2), <2 x float>)
+declare spir_func <4 x i32> @_Z12read_imageui14ocl_image2d_rwDv2_i(ptr addrspace(1), <2 x i32>)
+declare spir_func void @_Z13write_imageui14ocl_image2d_woDv2_iDv4_i(ptr addrspace(1), <2 x i32>, <4 x i32>)
+
+!7 = !{i32 2}
+
diff --git a/test/SpecializeImageTypes/opaque_image3d_float.ll b/test/SpecializeImageTypes/opaque_image3d_float.ll
new file mode 100644
index 0000000..6ca0249
--- /dev/null
+++ b/test/SpecializeImageTypes/opaque_image3d_float.ll
@@ -0,0 +1,25 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: call spir_func <4 x float> @_Z11read_imagef28ocl_image3d_ro.float.sampled11ocl_samplerDv4_f(ptr addrspace(1) %t_in1,
+; CHECK: call spir_func <4 x float> @_Z11read_imagef28ocl_image3d_ro.float.sampledDv4_i(ptr addrspace(1) %t_in2,
+; CHECK: call spir_func void @_Z12write_imagef20ocl_image3d_wo.floatDv4_iDv4_f(ptr addrspace(1) %t_out,
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_kernel void @test(ptr addrspace(1) %t_in1, ptr addrspace(1) %t_in2, ptr addrspace(1) %t_out, <4 x float> %m, <4 x i32> %n, ptr addrspace(2) %s) !clspv.pod_args_impl !7 {
+entry:
+  %call = call spir_func <4 x float> @_Z11read_imagef14ocl_image3d_ro11ocl_samplerDv4_f(ptr addrspace(1) %t_in1, ptr addrspace(2) %s, <4 x float> %m)
+  %call1 = call spir_func <4 x float> @_Z11read_imagef14ocl_image3d_roDv4_i(ptr addrspace(1) %t_in2, <4 x i32> %n)
+  %add = fadd <4 x float> %call, %call1
+  call spir_func void @_Z12write_imagef14ocl_image3d_woDv4_iDv4_f(ptr addrspace(1) %t_out, <4 x i32> %n, <4 x float> %add)
+  ret void
+}
+
+declare spir_func <4 x float> @_Z11read_imagef14ocl_image3d_ro11ocl_samplerDv4_f(ptr addrspace(1), ptr addrspace(2), <4 x float>)
+declare spir_func <4 x float> @_Z11read_imagef14ocl_image3d_roDv4_i(ptr addrspace(1), <4 x i32>)
+declare spir_func void @_Z12write_imagef14ocl_image3d_woDv4_iDv4_f(ptr addrspace(1), <4 x i32>, <4 x float>)
+
+!7 = !{i32 2}
+
diff --git a/test/SpecializeImageTypes/opaque_image3d_int.ll b/test/SpecializeImageTypes/opaque_image3d_int.ll
new file mode 100644
index 0000000..b6c255b
--- /dev/null
+++ b/test/SpecializeImageTypes/opaque_image3d_int.ll
@@ -0,0 +1,25 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types --cl-std=CL2.0
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei26ocl_image3d_ro.int.sampled11ocl_samplerDv4_f(ptr addrspace(1) %t_in1,
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei18ocl_image3d_rw.intDv4_i(ptr addrspace(1) %t_in2,
+; CHECK: call spir_func void @_Z12write_imagei18ocl_image3d_rw.intDv4_iDv4_i(ptr addrspace(1) %t_out,
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_kernel void @test(ptr addrspace(1) %t_in1, ptr addrspace(1) %t_in2, ptr addrspace(1) %t_out, ptr addrspace(2) %s, <4 x float> %m, <4 x i32> %n) !clspv.pod_args_impl !7 {
+entry:
+  %call = call spir_func <4 x i32> @_Z11read_imagei14ocl_image3d_ro11ocl_samplerDv4_f(ptr addrspace(1) %t_in1, ptr addrspace(2) %s, <4 x float> %m)
+  %call1 = call spir_func <4 x i32> @_Z11read_imagei14ocl_image3d_rwDv4_i(ptr addrspace(1) %t_in2, <4 x i32> %n)
+  %add = add <4 x i32> %call, %call1
+  call spir_func void @_Z12write_imagei14ocl_image3d_woDv4_iS0_(ptr addrspace(1) %t_out, <4 x i32> %n, <4 x i32> %add)
+  ret void
+}
+
+declare spir_func <4 x i32> @_Z11read_imagei14ocl_image3d_ro11ocl_samplerDv4_f(ptr addrspace(1), ptr addrspace(2), <4 x float>)
+declare spir_func <4 x i32> @_Z11read_imagei14ocl_image3d_rwDv4_i(ptr addrspace(1), <4 x i32>)
+declare spir_func void @_Z12write_imagei14ocl_image3d_woDv4_iS0_(ptr addrspace(1), <4 x i32>, <4 x i32>)
+
+!7 = !{i32 2}
+
diff --git a/test/SpecializeImageTypes/opaque_image3d_uint.ll b/test/SpecializeImageTypes/opaque_image3d_uint.ll
new file mode 100644
index 0000000..63ae71d
--- /dev/null
+++ b/test/SpecializeImageTypes/opaque_image3d_uint.ll
@@ -0,0 +1,25 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types --cl-std=CL2.0
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui27ocl_image3d_ro.uint.sampled11ocl_samplerDv4_f(ptr addrspace(1) %t_in1,
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui19ocl_image3d_rw.uintDv4_i(ptr addrspace(1) %t_in2,
+; CHECK: call spir_func void @_Z13write_imageui19ocl_image3d_rw.uintDv4_iDv4_i(ptr addrspace(1) %t_out,
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_kernel void @test(ptr addrspace(1) %t_in1, ptr addrspace(1) %t_in2, ptr addrspace(1) %t_out, ptr addrspace(2) %s, <4 x float> %m, <4 x i32> %n) !clspv.pod_args_impl !7 {
+entry:
+  %call = call spir_func <4 x i32> @_Z12read_imageui14ocl_image3d_ro11ocl_samplerDv4_f(ptr addrspace(1) %t_in1, ptr addrspace(2) %s, <4 x float> %m)
+  %call1 = call spir_func <4 x i32> @_Z12read_imageui14ocl_image3d_rwDv4_i(ptr addrspace(1) %t_in2, <4 x i32> %n)
+  %add = add <4 x i32> %call, %call1
+  call spir_func void @_Z13write_imageui14ocl_image3d_woDv4_iS_(ptr addrspace(1) %t_out, <4 x i32> %n, <4 x i32> %add)
+  ret void
+}
+
+declare spir_func <4 x i32> @_Z12read_imageui14ocl_image3d_ro11ocl_samplerDv4_f(ptr addrspace(1), ptr addrspace(2), <4 x float>)
+declare spir_func <4 x i32> @_Z12read_imageui14ocl_image3d_rwDv4_i(ptr addrspace(1), <4 x i32>)
+declare spir_func void @_Z13write_imageui14ocl_image3d_woDv4_iS_(ptr addrspace(1), <4 x i32>, <4 x i32>)
+
+!7 = !{i32 2}
+
diff --git a/test/SpecializeImageTypes/opaque_image_subfunction.ll b/test/SpecializeImageTypes/opaque_image_subfunction.ll
new file mode 100644
index 0000000..a2ac08c
--- /dev/null
+++ b/test/SpecializeImageTypes/opaque_image_subfunction.ll
@@ -0,0 +1,35 @@
+; RUN: clspv-opt %s -o %t.ll -opaque-pointers --passes=specialize-image-types
+; RUN: FileCheck %s < %t.ll
+
+; CHECK: @bar(ptr addrspace(1) %t)
+; CHECK: call spir_func void @_Z12write_imagef20ocl_image2d_wo.floatDv2_iDv4_f(ptr addrspace(1) %t
+; CHECK: @foo(ptr addrspace(1) %t)
+; CHECK: call spir_func void @bar(ptr addrspace(1) %t)
+; CHECK: @test(ptr addrspace(1) %t)
+; CHECK: call spir_func void @foo(ptr addrspace(1) %t)
+
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir-unknown-unknown"
+
+define dso_local spir_func void @bar(ptr addrspace(1) %t) {
+entry:
+  call spir_func void @_Z12write_imagef14ocl_image2d_woDv2_iDv4_f(ptr addrspace(1) %t, <2 x i32> zeroinitializer, <4 x float> zeroinitializer)
+  ret void
+}
+
+declare spir_func void @_Z12write_imagef14ocl_image2d_woDv2_iDv4_f(ptr addrspace(1), <2 x i32>, <4 x float>) #1
+
+define dso_local spir_func void @foo(ptr addrspace(1) %t) {
+entry:
+  call spir_func void @bar(ptr addrspace(1) %t)
+  ret void
+}
+
+define dso_local spir_kernel void @test(ptr addrspace(1) %t) !clspv.pod_args_impl !7 {
+entry:
+  call spir_func void @foo(ptr addrspace(1) %t)
+  ret void
+}
+
+!7 = !{i32 2}
+
diff --git a/test/SpecializeImageTypes/read_image1d_array_float.ll b/test/SpecializeImageTypes/read_image1d_array_float.ll
index 1506282..2abddbd 100644
--- a/test/SpecializeImageTypes/read_image1d_array_float.ll
+++ b/test/SpecializeImageTypes/read_image1d_array_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_array_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef20ocl_image1d_array_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef39[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef20ocl_image1d_array_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef39[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image1d_array_int.ll b/test/SpecializeImageTypes/read_image1d_array_int.ll
index b248d4a..83742d4 100644
--- a/test/SpecializeImageTypes/read_image1d_array_int.ll
+++ b/test/SpecializeImageTypes/read_image1d_array_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_array_ro_t.int.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei20ocl_image1d_array_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei37[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <4 x i32> @_Z11read_imagei20ocl_image1d_array_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei37[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image1d_array_uint.ll b/test/SpecializeImageTypes/read_image1d_array_uint.ll
index d528291..cc3e33c 100644
--- a/test/SpecializeImageTypes/read_image1d_array_uint.ll
+++ b/test/SpecializeImageTypes/read_image1d_array_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_array_ro_t.uint.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z12read_imageui20ocl_image1d_array_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z12read_imageui38[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_uint
-; CHECK: call spir_func <4 x i32> @_Z12read_imageui20ocl_image1d_array_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui38[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image1d_array_unsampled_float.ll b/test/SpecializeImageTypes/read_image1d_array_unsampled_float.ll
index 519c3b5..b05ec77 100644
--- a/test/SpecializeImageTypes/read_image1d_array_unsampled_float.ll
+++ b/test/SpecializeImageTypes/read_image1d_array_unsampled_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_array_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef20ocl_image1d_array_roDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef39[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef20ocl_image1d_array_roDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef39[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image1d_array_unsampled_int.ll b/test/SpecializeImageTypes/read_image1d_array_unsampled_int.ll
index 7aaed4d..18e533a 100644
--- a/test/SpecializeImageTypes/read_image1d_array_unsampled_int.ll
+++ b/test/SpecializeImageTypes/read_image1d_array_unsampled_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_array_ro_t.int.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei20ocl_image1d_array_roDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei37[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <4 x i32> @_Z11read_imagei20ocl_image1d_array_roDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei37[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image1d_array_unsampled_uint.ll b/test/SpecializeImageTypes/read_image1d_array_unsampled_uint.ll
index bc71a31..b93ba00 100644
--- a/test/SpecializeImageTypes/read_image1d_array_unsampled_uint.ll
+++ b/test/SpecializeImageTypes/read_image1d_array_unsampled_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_array_ro_t.uint.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z12read_imageui20ocl_image1d_array_roDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z12read_imageui38[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_uint
-; CHECK: call spir_func <4 x i32> @_Z12read_imageui20ocl_image1d_array_roDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui38[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image1d_buffer_float.ll b/test/SpecializeImageTypes/read_image1d_buffer_float.ll
index abb6db3..2dcea97 100644
--- a/test/SpecializeImageTypes/read_image1d_buffer_float.ll
+++ b/test/SpecializeImageTypes/read_image1d_buffer_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_buffer_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef21ocl_image1d_buffer_roi.[[IMAGE]](%[[IMAGE]] addrspace(1)*, i32) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef40[[IMAGE]]i(%[[IMAGE]] addrspace(1)*, i32) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef21ocl_image1d_buffer_roi.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef40[[IMAGE]]i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image1d_buffer_int.ll b/test/SpecializeImageTypes/read_image1d_buffer_int.ll
index 6c2099e..54e7f22 100644
--- a/test/SpecializeImageTypes/read_image1d_buffer_int.ll
+++ b/test/SpecializeImageTypes/read_image1d_buffer_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_buffer_ro_t.int.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei21ocl_image1d_buffer_roi.[[IMAGE]](%[[IMAGE]] addrspace(1)*, i32) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei38[[IMAGE]]i(%[[IMAGE]] addrspace(1)*, i32) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <4 x i32> @_Z11read_imagei21ocl_image1d_buffer_roi.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei38[[IMAGE]]i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image1d_buffer_uint.ll b/test/SpecializeImageTypes/read_image1d_buffer_uint.ll
index 2cfcf1e..e1fe8ca 100644
--- a/test/SpecializeImageTypes/read_image1d_buffer_uint.ll
+++ b/test/SpecializeImageTypes/read_image1d_buffer_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_buffer_ro_t.uint.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z12read_imageui21ocl_image1d_buffer_roi.[[IMAGE]](%[[IMAGE]] addrspace(1)*, i32) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z12read_imageui39[[IMAGE]]i(%[[IMAGE]] addrspace(1)*, i32) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_uint
-; CHECK: call spir_func <4 x i32> @_Z12read_imageui21ocl_image1d_buffer_roi.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui39[[IMAGE]]i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image1d_float.ll b/test/SpecializeImageTypes/read_image1d_float.ll
index de10ed6..2a029d5 100644
--- a/test/SpecializeImageTypes/read_image1d_float.ll
+++ b/test/SpecializeImageTypes/read_image1d_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef14ocl_image1d_ro11ocl_samplerf.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, float) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerf(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, float) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image1d_ro11ocl_samplerf.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerf(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image1d_int.ll b/test/SpecializeImageTypes/read_image1d_int.ll
index 60d2b24..ce50ad6 100644
--- a/test/SpecializeImageTypes/read_image1d_int.ll
+++ b/test/SpecializeImageTypes/read_image1d_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_ro_t.int.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei14ocl_image1d_ro11ocl_samplerf.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, float) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]11ocl_samplerf(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, float) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <4 x i32> @_Z11read_imagei14ocl_image1d_ro11ocl_samplerf.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]11ocl_samplerf(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image1d_uint.ll b/test/SpecializeImageTypes/read_image1d_uint.ll
index 35f907a..4670b34 100644
--- a/test/SpecializeImageTypes/read_image1d_uint.ll
+++ b/test/SpecializeImageTypes/read_image1d_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_ro_t.uint.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z12read_imageui14ocl_image1d_ro11ocl_samplerf.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, float) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z12read_imageui32[[IMAGE]]11ocl_samplerf(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, float) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_uint
-; CHECK: call spir_func <4 x i32> @_Z12read_imageui14ocl_image1d_ro11ocl_samplerf.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui32[[IMAGE]]11ocl_samplerf(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image1d_unsampled_float.ll b/test/SpecializeImageTypes/read_image1d_unsampled_float.ll
index 595c6ae..13de22a 100644
--- a/test/SpecializeImageTypes/read_image1d_unsampled_float.ll
+++ b/test/SpecializeImageTypes/read_image1d_unsampled_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef14ocl_image1d_roi.[[IMAGE]](%[[IMAGE]] addrspace(1)*, i32) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]i(%[[IMAGE]] addrspace(1)*, i32) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image1d_roi.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image1d_unsampled_int.ll b/test/SpecializeImageTypes/read_image1d_unsampled_int.ll
index 34473d5..4bdbfb9 100644
--- a/test/SpecializeImageTypes/read_image1d_unsampled_int.ll
+++ b/test/SpecializeImageTypes/read_image1d_unsampled_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_ro_t.int.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei14ocl_image1d_roi.[[IMAGE]](%[[IMAGE]] addrspace(1)*, i32) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]i(%[[IMAGE]] addrspace(1)*, i32) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <4 x i32> @_Z11read_imagei14ocl_image1d_roi.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image1d_unsampled_uint.ll b/test/SpecializeImageTypes/read_image1d_unsampled_uint.ll
index 6dec22f..f4f4cdb 100644
--- a/test/SpecializeImageTypes/read_image1d_unsampled_uint.ll
+++ b/test/SpecializeImageTypes/read_image1d_unsampled_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_ro_t.uint.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z12read_imageui14ocl_image1d_roi.[[IMAGE]](%[[IMAGE]] addrspace(1)*, i32) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z12read_imageui32[[IMAGE]]i(%[[IMAGE]] addrspace(1)*, i32) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_uint
-; CHECK: call spir_func <4 x i32> @_Z12read_imageui14ocl_image1d_roi.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui32[[IMAGE]]i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image2d_array_float.ll b/test/SpecializeImageTypes/read_image2d_array_float.ll
index 27bb97a..bc0047d 100644
--- a/test/SpecializeImageTypes/read_image2d_array_float.ll
+++ b/test/SpecializeImageTypes/read_image2d_array_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef20ocl_image2d_array_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef39[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef20ocl_image2d_array_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef39[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image2d_array_int.ll b/test/SpecializeImageTypes/read_image2d_array_int.ll
index 9439455..dfc5ef2 100644
--- a/test/SpecializeImageTypes/read_image2d_array_int.ll
+++ b/test/SpecializeImageTypes/read_image2d_array_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_ro_t.int.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei20ocl_image2d_array_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei37[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <4 x i32> @_Z11read_imagei20ocl_image2d_array_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei37[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image2d_array_uint.ll b/test/SpecializeImageTypes/read_image2d_array_uint.ll
index 7f028f1..4b634ae 100644
--- a/test/SpecializeImageTypes/read_image2d_array_uint.ll
+++ b/test/SpecializeImageTypes/read_image2d_array_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_ro_t.uint.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z12read_imageui20ocl_image2d_array_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z12read_imageui38[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_uint
-; CHECK: call spir_func <4 x i32> @_Z12read_imageui20ocl_image2d_array_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui38[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image2d_array_unsampled_float.ll b/test/SpecializeImageTypes/read_image2d_array_unsampled_float.ll
index 2f74094..0ff79c5 100644
--- a/test/SpecializeImageTypes/read_image2d_array_unsampled_float.ll
+++ b/test/SpecializeImageTypes/read_image2d_array_unsampled_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef20ocl_image2d_array_roDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef39[[IMAGE]]Dv4_i(%[[IMAGE]] addrspace(1)*, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef20ocl_image2d_array_roDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef39[[IMAGE]]Dv4_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image2d_array_unsampled_int.ll b/test/SpecializeImageTypes/read_image2d_array_unsampled_int.ll
index b197b36..94c00fd 100644
--- a/test/SpecializeImageTypes/read_image2d_array_unsampled_int.ll
+++ b/test/SpecializeImageTypes/read_image2d_array_unsampled_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_ro_t.int.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei20ocl_image2d_array_roDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei37[[IMAGE]]Dv4_i(%[[IMAGE]] addrspace(1)*, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <4 x i32> @_Z11read_imagei20ocl_image2d_array_roDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei37[[IMAGE]]Dv4_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image2d_array_unsampled_uint.ll b/test/SpecializeImageTypes/read_image2d_array_unsampled_uint.ll
index 7d78ede..70969cd 100644
--- a/test/SpecializeImageTypes/read_image2d_array_unsampled_uint.ll
+++ b/test/SpecializeImageTypes/read_image2d_array_unsampled_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_ro_t.uint.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z12read_imageui20ocl_image2d_array_roDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z12read_imageui38[[IMAGE]]Dv4_i(%[[IMAGE]] addrspace(1)*, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_uint
-; CHECK: call spir_func <4 x i32> @_Z12read_imageui20ocl_image2d_array_roDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui38[[IMAGE]]Dv4_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image2d_float.ll b/test/SpecializeImageTypes/read_image2d_float.ll
index 18dbe1f..3d75529 100644
--- a/test/SpecializeImageTypes/read_image2d_float.ll
+++ b/test/SpecializeImageTypes/read_image2d_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image2d_float_subfunction.ll b/test/SpecializeImageTypes/read_image2d_float_subfunction.ll
index b93eab5..2631250 100644
--- a/test/SpecializeImageTypes/read_image2d_float_subfunction.ll
+++ b/test/SpecializeImageTypes/read_image2d_float_subfunction.ll
@@ -2,11 +2,11 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>)
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>)
 ; CHECK: define spir_kernel void @read_float
 ; CHECK: call spir_func <4 x float> @bar(%[[IMAGE]] addrspace(1)* %image, <2 x float> %coord
 ; CHECK: define spir_func <4 x float> @bar(%[[IMAGE]] addrspace(1)* %image, <2 x float> %coord
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)* %image
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
 target triple = "spir-unknown-unknown"
diff --git a/test/SpecializeImageTypes/read_image2d_float_subfunction_two_kernels.ll b/test/SpecializeImageTypes/read_image2d_float_subfunction_two_kernels.ll
index 2948768..13c09fc 100644
--- a/test/SpecializeImageTypes/read_image2d_float_subfunction_two_kernels.ll
+++ b/test/SpecializeImageTypes/read_image2d_float_subfunction_two_kernels.ll
@@ -2,13 +2,13 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>)
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>)
 ; CHECK: define spir_kernel void @read_float1
 ; CHECK: call spir_func <4 x float> @bar(%[[IMAGE]] addrspace(1)* %image, <2 x float> %coord
 ; CHECK: define spir_kernel void @read_float2
 ; CHECK: call spir_func <4 x float> @bar(%[[IMAGE]] addrspace(1)* %image, <2 x float> %coord
 ; CHECK: define spir_func <4 x float> @bar(%[[IMAGE]] addrspace(1)* %image, <2 x float> %coord
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)* %image
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
 target triple = "spir-unknown-unknown"
diff --git a/test/SpecializeImageTypes/read_image2d_int.ll b/test/SpecializeImageTypes/read_image2d_int.ll
index 8936eab..e83f25d 100644
--- a/test/SpecializeImageTypes/read_image2d_int.ll
+++ b/test/SpecializeImageTypes/read_image2d_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_ro_t.int.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <4 x i32> @_Z11read_imagei14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image2d_uint.ll b/test/SpecializeImageTypes/read_image2d_uint.ll
index 94f54e6..c75d347 100644
--- a/test/SpecializeImageTypes/read_image2d_uint.ll
+++ b/test/SpecializeImageTypes/read_image2d_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_ro_t.uint.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z12read_imageui14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z12read_imageui32[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <2 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_uint
-; CHECK: call spir_func <4 x i32> @_Z12read_imageui14ocl_image2d_ro11ocl_samplerDv2_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui32[[IMAGE]]11ocl_samplerDv2_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image2d_unsampled_float.ll b/test/SpecializeImageTypes/read_image2d_unsampled_float.ll
index a6e3157..4f42772 100644
--- a/test/SpecializeImageTypes/read_image2d_unsampled_float.ll
+++ b/test/SpecializeImageTypes/read_image2d_unsampled_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef14ocl_image2d_roDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image2d_roDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image2d_unsampled_int.ll b/test/SpecializeImageTypes/read_image2d_unsampled_int.ll
index 2ed70ab..3d48670 100644
--- a/test/SpecializeImageTypes/read_image2d_unsampled_int.ll
+++ b/test/SpecializeImageTypes/read_image2d_unsampled_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_ro_t.int.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei14ocl_image2d_roDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <4 x i32> @_Z11read_imagei14ocl_image2d_roDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image2d_unsampled_uint.ll b/test/SpecializeImageTypes/read_image2d_unsampled_uint.ll
index 25a0546..c3b5608 100644
--- a/test/SpecializeImageTypes/read_image2d_unsampled_uint.ll
+++ b/test/SpecializeImageTypes/read_image2d_unsampled_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_ro_t.uint.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z12read_imageui14ocl_image2d_roDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z12read_imageui32[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_uint
-; CHECK: call spir_func <4 x i32> @_Z12read_imageui14ocl_image2d_roDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui32[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image3d_float.ll b/test/SpecializeImageTypes/read_image3d_float.ll
index ed9b62d..4ff5e3b 100644
--- a/test/SpecializeImageTypes/read_image3d_float.ll
+++ b/test/SpecializeImageTypes/read_image3d_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef14ocl_image3d_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image3d_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image3d_int.ll b/test/SpecializeImageTypes/read_image3d_int.ll
index 52ac6bc..9e26dba 100644
--- a/test/SpecializeImageTypes/read_image3d_int.ll
+++ b/test/SpecializeImageTypes/read_image3d_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_ro_t.int.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei14ocl_image3d_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <4 x i32> @_Z11read_imagei14ocl_image3d_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image3d_uint.ll b/test/SpecializeImageTypes/read_image3d_uint.ll
index c0deec7..1f09793 100644
--- a/test/SpecializeImageTypes/read_image3d_uint.ll
+++ b/test/SpecializeImageTypes/read_image3d_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_ro_t.uint.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z12read_imageui14ocl_image3d_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z12read_imageui32[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)*, %opencl.sampler_t addrspace(2)*, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_uint
-; CHECK: call spir_func <4 x i32> @_Z12read_imageui14ocl_image3d_ro11ocl_samplerDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui32[[IMAGE]]11ocl_samplerDv4_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image3d_unsampled_float.ll b/test/SpecializeImageTypes/read_image3d_unsampled_float.ll
index 5e6bed6..07a0111 100644
--- a/test/SpecializeImageTypes/read_image3d_unsampled_float.ll
+++ b/test/SpecializeImageTypes/read_image3d_unsampled_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_ro_t.float.sampled]] = type opaque
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef14ocl_image3d_roDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]Dv4_i(%[[IMAGE]] addrspace(1)*, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image3d_roDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef33[[IMAGE]]Dv4_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image3d_unsampled_int.ll b/test/SpecializeImageTypes/read_image3d_unsampled_int.ll
index 7347368..2e8d359 100644
--- a/test/SpecializeImageTypes/read_image3d_unsampled_int.ll
+++ b/test/SpecializeImageTypes/read_image3d_unsampled_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_ro_t.int.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei14ocl_image3d_roDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]Dv4_i(%[[IMAGE]] addrspace(1)*, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <4 x i32> @_Z11read_imagei14ocl_image3d_roDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei31[[IMAGE]]Dv4_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/read_image3d_unsampled_uint.ll b/test/SpecializeImageTypes/read_image3d_unsampled_uint.ll
index 9dba343..bb78d87 100644
--- a/test/SpecializeImageTypes/read_image3d_unsampled_uint.ll
+++ b/test/SpecializeImageTypes/read_image3d_unsampled_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_ro_t.uint.sampled]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z12read_imageui14ocl_image3d_roDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z12read_imageui32[[IMAGE]]Dv4_i(%[[IMAGE]] addrspace(1)*, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_uint
-; CHECK: call spir_func <4 x i32> @_Z12read_imageui14ocl_image3d_roDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui32[[IMAGE]]Dv4_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/readwrite_image2d_read_float.ll b/test/SpecializeImageTypes/readwrite_image2d_read_float.ll
index 08185ca..16be8b7 100644
--- a/test/SpecializeImageTypes/readwrite_image2d_read_float.ll
+++ b/test/SpecializeImageTypes/readwrite_image2d_read_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_rw_t.float]] = type opaque
-; CHECK: declare spir_func <4 x float> @_Z11read_imagef14ocl_image2d_rwDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x float> @_Z11read_imagef25[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_float
-; CHECK: call spir_func <4 x float> @_Z11read_imagef14ocl_image2d_rwDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x float> @_Z11read_imagef25[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/readwrite_image2d_read_int.ll b/test/SpecializeImageTypes/readwrite_image2d_read_int.ll
index 5391934..0c94a10 100644
--- a/test/SpecializeImageTypes/readwrite_image2d_read_int.ll
+++ b/test/SpecializeImageTypes/readwrite_image2d_read_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_rw_t.int]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z11read_imagei14ocl_image2d_rwDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z11read_imagei23[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_int
-; CHECK: call spir_func <4 x i32> @_Z11read_imagei14ocl_image2d_rwDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z11read_imagei23[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/readwrite_image2d_read_uint.ll b/test/SpecializeImageTypes/readwrite_image2d_read_uint.ll
index daf1b74..1a41eda 100644
--- a/test/SpecializeImageTypes/readwrite_image2d_read_uint.ll
+++ b/test/SpecializeImageTypes/readwrite_image2d_read_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_rw_t.uint]] = type opaque
-; CHECK: declare spir_func <4 x i32> @_Z12read_imageui14ocl_image2d_rwDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func <4 x i32> @_Z12read_imageui24[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)*, <2 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @read_uint
-; CHECK: call spir_func <4 x i32> @_Z12read_imageui14ocl_image2d_rwDv2_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func <4 x i32> @_Z12read_imageui24[[IMAGE]]Dv2_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/readwrite_image2d_write_float.ll b/test/SpecializeImageTypes/readwrite_image2d_write_float.ll
index d877235..6d2de25 100644
--- a/test/SpecializeImageTypes/readwrite_image2d_write_float.ll
+++ b/test/SpecializeImageTypes/readwrite_image2d_write_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_rw_t.float]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagef14ocl_image2d_rwDv2_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagef25[[IMAGE]]Dv2_iDv4_f(%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef14ocl_image2d_rwDv2_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagef25[[IMAGE]]Dv2_iDv4_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/readwrite_image2d_write_int.ll b/test/SpecializeImageTypes/readwrite_image2d_write_int.ll
index b016914..6c3932e 100644
--- a/test/SpecializeImageTypes/readwrite_image2d_write_int.ll
+++ b/test/SpecializeImageTypes/readwrite_image2d_write_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_rw_t.int]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagei14ocl_image2d_rwDv2_iDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagei23[[IMAGE]]Dv2_iDv4_i(%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_int
-; CHECK: call spir_func void @_Z12write_imagei14ocl_image2d_rwDv2_iDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagei23[[IMAGE]]Dv2_iDv4_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/readwrite_image2d_write_uint.ll b/test/SpecializeImageTypes/readwrite_image2d_write_uint.ll
index 5915240..ee4e5fc 100644
--- a/test/SpecializeImageTypes/readwrite_image2d_write_uint.ll
+++ b/test/SpecializeImageTypes/readwrite_image2d_write_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_rw_t.uint]] = type opaque
-; CHECK: declare spir_func void @_Z13write_imageui14ocl_image2d_rwDv2_iDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z13write_imageui24[[IMAGE]]Dv2_iDv4_i(%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_uint
-; CHECK: call spir_func void @_Z13write_imageui14ocl_image2d_rwDv2_iDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z13write_imageui24[[IMAGE]]Dv2_iDv4_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image1d_array_float.ll b/test/SpecializeImageTypes/write_image1d_array_float.ll
index 506196b..7507b28 100644
--- a/test/SpecializeImageTypes/write_image1d_array_float.ll
+++ b/test/SpecializeImageTypes/write_image1d_array_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_array_wo_t.float]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagef20ocl_image1d_array_woDv2_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagef31[[IMAGE]]Dv2_iDv4_f(%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef20ocl_image1d_array_woDv2_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagef31[[IMAGE]]Dv2_iDv4_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image1d_array_int.ll b/test/SpecializeImageTypes/write_image1d_array_int.ll
index 9fe4c5b..d7decd6 100644
--- a/test/SpecializeImageTypes/write_image1d_array_int.ll
+++ b/test/SpecializeImageTypes/write_image1d_array_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_array_wo_t.int]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagei20ocl_image1d_array_woDv2_iDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagei29[[IMAGE]]Dv2_iDv4_i(%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_int
-; CHECK: call spir_func void @_Z12write_imagei20ocl_image1d_array_woDv2_iDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagei29[[IMAGE]]Dv2_iDv4_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image1d_array_uint.ll b/test/SpecializeImageTypes/write_image1d_array_uint.ll
index 84f0455..0fb1ac5 100644
--- a/test/SpecializeImageTypes/write_image1d_array_uint.ll
+++ b/test/SpecializeImageTypes/write_image1d_array_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_array_wo_t.uint]] = type opaque
-; CHECK: declare spir_func void @_Z13write_imageui20ocl_image1d_array_woDv2_iDv4_j.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z13write_imageui30[[IMAGE]]Dv2_iDv4_j(%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_uint
-; CHECK: call spir_func void @_Z13write_imageui20ocl_image1d_array_woDv2_iDv4_j.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z13write_imageui30[[IMAGE]]Dv2_iDv4_j(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image1d_buffer_float.ll b/test/SpecializeImageTypes/write_image1d_buffer_float.ll
index b5dddb8..3f9419f 100644
--- a/test/SpecializeImageTypes/write_image1d_buffer_float.ll
+++ b/test/SpecializeImageTypes/write_image1d_buffer_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_buffer_wo_t.float]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagef21ocl_image1d_buffer_woiDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, i32, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagef32[[IMAGE]]iDv4_f(%[[IMAGE]] addrspace(1)*, i32, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef21ocl_image1d_buffer_woiDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagef32[[IMAGE]]iDv4_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image1d_buffer_int.ll b/test/SpecializeImageTypes/write_image1d_buffer_int.ll
index 8381e5b..f00412b 100644
--- a/test/SpecializeImageTypes/write_image1d_buffer_int.ll
+++ b/test/SpecializeImageTypes/write_image1d_buffer_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_buffer_wo_t.int]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagei21ocl_image1d_buffer_woiDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, i32, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagei30[[IMAGE]]iDv4_i(%[[IMAGE]] addrspace(1)*, i32, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_int
-; CHECK: call spir_func void @_Z12write_imagei21ocl_image1d_buffer_woiDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagei30[[IMAGE]]iDv4_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image1d_buffer_uint.ll b/test/SpecializeImageTypes/write_image1d_buffer_uint.ll
index 52f7fa0..d180dcd 100644
--- a/test/SpecializeImageTypes/write_image1d_buffer_uint.ll
+++ b/test/SpecializeImageTypes/write_image1d_buffer_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_buffer_wo_t.uint]] = type opaque
-; CHECK: declare spir_func void @_Z13write_imageui21ocl_image1d_buffer_woiDv4_j.[[IMAGE]](%[[IMAGE]] addrspace(1)*, i32, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z13write_imageui31[[IMAGE]]iDv4_j(%[[IMAGE]] addrspace(1)*, i32, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_uint
-; CHECK: call spir_func void @_Z13write_imageui21ocl_image1d_buffer_woiDv4_j.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z13write_imageui31[[IMAGE]]iDv4_j(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image1d_float.ll b/test/SpecializeImageTypes/write_image1d_float.ll
index 57f0ffb..2093bcf 100644
--- a/test/SpecializeImageTypes/write_image1d_float.ll
+++ b/test/SpecializeImageTypes/write_image1d_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_wo_t.float]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagef14ocl_image1d_woiDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, i32, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagef25[[IMAGE]]iDv4_f(%[[IMAGE]] addrspace(1)*, i32, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef14ocl_image1d_woiDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagef25[[IMAGE]]iDv4_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image1d_int.ll b/test/SpecializeImageTypes/write_image1d_int.ll
index 33ba875..b1870f3 100644
--- a/test/SpecializeImageTypes/write_image1d_int.ll
+++ b/test/SpecializeImageTypes/write_image1d_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_wo_t.int]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagei14ocl_image1d_woiDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, i32, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagei23[[IMAGE]]iDv4_i(%[[IMAGE]] addrspace(1)*, i32, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_int
-; CHECK: call spir_func void @_Z12write_imagei14ocl_image1d_woiDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagei23[[IMAGE]]iDv4_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image1d_uint.ll b/test/SpecializeImageTypes/write_image1d_uint.ll
index 7121c84..d01c57c 100644
--- a/test/SpecializeImageTypes/write_image1d_uint.ll
+++ b/test/SpecializeImageTypes/write_image1d_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image1d_wo_t.uint]] = type opaque
-; CHECK: declare spir_func void @_Z13write_imageui14ocl_image1d_woiDv4_j.[[IMAGE]](%[[IMAGE]] addrspace(1)*, i32, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z13write_imageui24[[IMAGE]]iDv4_j(%[[IMAGE]] addrspace(1)*, i32, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_uint
-; CHECK: call spir_func void @_Z13write_imageui14ocl_image1d_woiDv4_j.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z13write_imageui24[[IMAGE]]iDv4_j(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image2d_array_float.ll b/test/SpecializeImageTypes/write_image2d_array_float.ll
index bbc221f..b2fe094 100644
--- a/test/SpecializeImageTypes/write_image2d_array_float.ll
+++ b/test/SpecializeImageTypes/write_image2d_array_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_wo_t.float]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagef20ocl_image2d_array_woDv4_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagef31[[IMAGE]]Dv4_iDv4_f(%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef20ocl_image2d_array_woDv4_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagef31[[IMAGE]]Dv4_iDv4_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image2d_array_int.ll b/test/SpecializeImageTypes/write_image2d_array_int.ll
index 39b71eb..9cdc570 100644
--- a/test/SpecializeImageTypes/write_image2d_array_int.ll
+++ b/test/SpecializeImageTypes/write_image2d_array_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_wo_t.int]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagei20ocl_image2d_array_woDv4_iS0_.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagei29[[IMAGE]]Dv4_iDv4_i(%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_int
-; CHECK: call spir_func void @_Z12write_imagei20ocl_image2d_array_woDv4_iS0_.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagei29[[IMAGE]]Dv4_iDv4_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image2d_array_uint.ll b/test/SpecializeImageTypes/write_image2d_array_uint.ll
index c6e334d..69e5ab7 100644
--- a/test/SpecializeImageTypes/write_image2d_array_uint.ll
+++ b/test/SpecializeImageTypes/write_image2d_array_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_array_wo_t.uint]] = type opaque
-; CHECK: declare spir_func void @_Z13write_imageui20ocl_image2d_array_woDv4_iDv4_j.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z13write_imageui30[[IMAGE]]Dv4_iDv4_j(%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_uint
-; CHECK: call spir_func void @_Z13write_imageui20ocl_image2d_array_woDv4_iDv4_j.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z13write_imageui30[[IMAGE]]Dv4_iDv4_j(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image2d_float.ll b/test/SpecializeImageTypes/write_image2d_float.ll
index 59b096f..e0d6ca5 100644
--- a/test/SpecializeImageTypes/write_image2d_float.ll
+++ b/test/SpecializeImageTypes/write_image2d_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_wo_t.float]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagef14ocl_image2d_woDv2_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagef25[[IMAGE]]Dv2_iDv4_f(%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef14ocl_image2d_woDv2_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagef25[[IMAGE]]Dv2_iDv4_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image2d_int.ll b/test/SpecializeImageTypes/write_image2d_int.ll
index b2ba36a..239c6cd 100644
--- a/test/SpecializeImageTypes/write_image2d_int.ll
+++ b/test/SpecializeImageTypes/write_image2d_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_wo_t.int]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagei14ocl_image2d_woDv2_iDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagei23[[IMAGE]]Dv2_iDv4_i(%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_int
-; CHECK: call spir_func void @_Z12write_imagei14ocl_image2d_woDv2_iDv4_i.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagei23[[IMAGE]]Dv2_iDv4_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image2d_uint.ll b/test/SpecializeImageTypes/write_image2d_uint.ll
index 502e82e..26f491d 100644
--- a/test/SpecializeImageTypes/write_image2d_uint.ll
+++ b/test/SpecializeImageTypes/write_image2d_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_wo_t.uint]] = type opaque
-; CHECK: declare spir_func void @_Z13write_imageui14ocl_image2d_woDv2_iDv4_j.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z13write_imageui24[[IMAGE]]Dv2_iDv4_j(%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_uint
-; CHECK: call spir_func void @_Z13write_imageui14ocl_image2d_woDv2_iDv4_j.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z13write_imageui24[[IMAGE]]Dv2_iDv4_j(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image3d_float.ll b/test/SpecializeImageTypes/write_image3d_float.ll
index 3bff66c..a46d8c5 100644
--- a/test/SpecializeImageTypes/write_image3d_float.ll
+++ b/test/SpecializeImageTypes/write_image3d_float.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_wo_t.float]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagef14ocl_image3d_woDv4_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagef25[[IMAGE]]Dv4_iDv4_f(%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef14ocl_image3d_woDv4_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagef25[[IMAGE]]Dv4_iDv4_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image3d_int.ll b/test/SpecializeImageTypes/write_image3d_int.ll
index 31a431a..4c5dc90 100644
--- a/test/SpecializeImageTypes/write_image3d_int.ll
+++ b/test/SpecializeImageTypes/write_image3d_int.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_wo_t.int]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagei14ocl_image3d_woDv4_iS0_.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagei23[[IMAGE]]Dv4_iDv4_i(%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_int
-; CHECK: call spir_func void @_Z12write_imagei14ocl_image3d_woDv4_iS0_.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagei23[[IMAGE]]Dv4_iDv4_i(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_image3d_uint.ll b/test/SpecializeImageTypes/write_image3d_uint.ll
index 489a54e..caa9d6f 100644
--- a/test/SpecializeImageTypes/write_image3d_uint.ll
+++ b/test/SpecializeImageTypes/write_image3d_uint.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image3d_wo_t.uint]] = type opaque
-; CHECK: declare spir_func void @_Z13write_imageui14ocl_image3d_woDv4_iDv4_j.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z13write_imageui24[[IMAGE]]Dv4_iDv4_j(%[[IMAGE]] addrspace(1)*, <4 x i32>, <4 x i32>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_uint
-; CHECK: call spir_func void @_Z13write_imageui14ocl_image3d_woDv4_iDv4_j.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z13write_imageui24[[IMAGE]]Dv4_iDv4_j(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/SpecializeImageTypes/write_only_image_as_read_write_image_in_cl20.ll b/test/SpecializeImageTypes/write_only_image_as_read_write_image_in_cl20.ll
index 547cfba..58201b3 100644
--- a/test/SpecializeImageTypes/write_only_image_as_read_write_image_in_cl20.ll
+++ b/test/SpecializeImageTypes/write_only_image_as_read_write_image_in_cl20.ll
@@ -2,9 +2,9 @@
 ; RUN: FileCheck %s < %t
 
 ; CHECK: %[[IMAGE:opencl.image2d_rw_t.float]] = type opaque
-; CHECK: declare spir_func void @_Z12write_imagef14ocl_image2d_woDv2_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x float>) [[ATTRS:#[0-9]+]]
+; CHECK: declare spir_func void @_Z12write_imagef25[[IMAGE]]Dv2_iDv4_f(%[[IMAGE]] addrspace(1)*, <2 x i32>, <4 x float>) [[ATTRS:#[0-9]+]]
 ; CHECK: define spir_kernel void @write_float
-; CHECK: call spir_func void @_Z12write_imagef14ocl_image2d_woDv2_iDv4_f.[[IMAGE]](%[[IMAGE]] addrspace(1)* %image
+; CHECK: call spir_func void @_Z12write_imagef25[[IMAGE]]Dv2_iDv4_f(%[[IMAGE]] addrspace(1)* %image
 ; CHECK: attributes [[ATTRS]] = { convergent nounwind }
 
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
diff --git a/test/longvector-metadata.ll b/test/longvector-metadata.ll
index aff17ec..1d3af79 100644
--- a/test/longvector-metadata.ll
+++ b/test/longvector-metadata.ll
@@ -1,6 +1,6 @@
 ; TODO(#816): remove opaque pointers disable
 ; RUN: clspv-opt --passes=long-vector-lowering %s -opaque-pointers=0
-; RUN: clspv -x ir %s -o %t.spv
+; RUN: clspv -x ir %s -o %t.spv --opaque-pointers=0
 target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
 target triple = "spir-unknown-unknown"