Index: lib/Target/AMDGPU/AMDGPUOpenCLImageTypeLoweringPass.cpp =================================================================== --- lib/Target/AMDGPU/AMDGPUOpenCLImageTypeLoweringPass.cpp +++ lib/Target/AMDGPU/AMDGPUOpenCLImageTypeLoweringPass.cpp @@ -94,8 +94,12 @@ return nullptr; if (!ArgNode->getOperand(0)) return nullptr; - assert(cast(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(ArgNode->getOperand(0)); + if (!StringNode || StringNode->getString() != KernelArgMDNodeNames[i]) + return nullptr; } return F; Index: test/CodeGen/AMDGPU/opencl-image-metadata.ll =================================================================== --- /dev/null +++ test/CodeGen/AMDGPU/opencl-image-metadata.ll @@ -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", !""}