AMDGPU/SI: Remove assert from AMDGPUOpenCLImageTypeLowering pass
authorTom Stellard <thomas.stellard@amd.com>
Thu, 1 Oct 2015 21:16:05 +0000 (21:16 +0000)
committerTom Stellard <thomas.stellard@amd.com>
Thu, 1 Oct 2015 21:16:05 +0000 (21:16 +0000)
Summary:
Instead of asserting when the kernel metadata is different than we expect,
we should just skip lowering that function.  This fixes assertion
failures with OpenCL argument metadata from older LLVM releases.

Reviewers: arsenm

Subscribers: arsenm, llvm-commits

Differential Revision: http://reviews.llvm.org/D13356

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@249073 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AMDGPU/AMDGPUOpenCLImageTypeLoweringPass.cpp
test/CodeGen/AMDGPU/opencl-image-metadata.ll [new file with mode: 0644]

index 40b7936d66303c4bd07cc241a94d73d256ca6640..554bf1da81f5274b9fd4753e7b8bf659c72a308d 100644 (file)
@@ -94,8 +94,12 @@ GetFunctionFromMDNode(MDNode *Node) {
       return nullptr;
     if (!ArgNode->getOperand(0))
       return nullptr;
-    assert(cast<MDString>(ArgNode->getOperand(0))->getString() ==
-           KernelArgMDNodeNames[i] && "Wrong kernel arg metadata name");
+
+    // FIXME: It should be possible to do image lowering when some metadata
+    // args missing or not in the expected order.
+    MDString *StringNode = dyn_cast<MDString>(ArgNode->getOperand(0));
+    if (!StringNode || StringNode->getString() != KernelArgMDNodeNames[i])
+      return nullptr;
   }
 
   return F;
diff --git a/test/CodeGen/AMDGPU/opencl-image-metadata.ll b/test/CodeGen/AMDGPU/opencl-image-metadata.ll
new file mode 100644 (file)
index 0000000..bc467e4
--- /dev/null
@@ -0,0 +1,24 @@
+; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck --check-prefix=EG --check-prefix=FUNC %s
+; RUN: llc < %s -march=amdgcn -mcpu=SI -verify-machineinstrs | FileCheck --check-prefix=SI --check-prefix=FUNC %s
+
+; Make sure the OpenCL Image lowering pass doesn't crash when argument metadata
+; is not in expected order.
+
+; EG: CF_END
+; SI: s_endpgm
+define void @kernel(i32 addrspace(1)* %out) {
+entry:
+  store i32 0, i32 addrspace(1)* %out
+  ret void
+}
+
+attributes #3 = { nounwind }
+
+!opencl.kernels = !{!0}
+
+!0 = !{void (i32 addrspace(1)*)* @kernel, !1, !2, !3, !4, !5}
+!1 = !{!"kernel_arg_addr_space", i32 0}
+!2 = !{!"kernel_arg_access_qual", !"none"}
+!3 = !{!"kernel_arg_type", !"int*"}
+!4 = !{!"kernel_arg_type_qual", !""}
+!5 = !{!"kernel_arg_name", !""}