blob: c2a830502d7ed097abce28a5a2c8205e554e9d1d [file] [edit]
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
; Test that G_PTRMASK is correctly lowered to SPIR-V for 32-bit targets.
; Result = Ptr & Mask
; This should generate: OpConvertPtrToU -> OpBitwiseAnd -> OpConvertUToPtr
; CHECK-LABEL: Begin function test_ptrmask_i32
; CHECK: %[[#PTR_PARAM:]] = OpFunctionParameter
; CHECK: %[[#MASK_PARAM:]] = OpFunctionParameter
; CHECK: %[[#OUT_PARAM:]] = OpFunctionParameter
; CHECK: %[[#PTR_AS_INT:]] = OpConvertPtrToU %[[#]] %[[#PTR_PARAM]]
; CHECK-NEXT: %[[#MASKED_INT:]] = OpBitwiseAnd %[[#]] %[[#PTR_AS_INT]] %[[#MASK_PARAM]]
; CHECK-NEXT: %[[#MASKED_PTR:]] = OpConvertUToPtr %[[#]] %[[#MASKED_INT]]
; CHECK-NEXT: OpStore %[[#OUT_PARAM]] %[[#MASKED_PTR]] Aligned 4
define spir_kernel void @test_ptrmask_i32(ptr addrspace(1) %ptr, i32 %mask, ptr addrspace(1) %out) {
entry:
%masked_ptr = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) %ptr, i32 %mask)
store ptr addrspace(1) %masked_ptr, ptr addrspace(1) %out, align 4
ret void
}
declare ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1), i32)