; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} ; Test that addrspacecast(null) is simplified to null of the target address ; space type in all contexts: composite constants, instruction operands, and ; global initializers. %struct = type { i32, ptr addrspace(4) } @gv = internal addrspace(1) constant %struct { i32 42, ptr addrspace(4) addrspacecast (ptr null to ptr addrspace(4)) }, align 8 ; CHECK-DAG: %[[#INT:]] = OpTypeInt 32 0 ; CHECK-DAG: %[[#CHAR:]] = OpTypeInt 8 0 ; CHECK-DAG: %[[#GENPTR:]] = OpTypePointer Generic %[[#CHAR]] ; CHECK-DAG: %[[#CWGPTR:]] = OpTypePointer CrossWorkgroup %[[#CHAR]] ; CHECK-DAG: %[[#STRUCT:]] = OpTypeStruct %[[#INT]] %[[#GENPTR]] ; CHECK-DAG: %[[#CONST:]] = OpConstant %[[#INT]] 42 ; CHECK-DAG: %[[#NULL:]] = OpConstantNull %[[#GENPTR]] ; CHECK-DAG: %[[#CWGNULL:]] = OpConstantNull %[[#CWGPTR]] ; CHECK-DAG: %[[#BOOL:]] = OpTypeBool ; Composite constant: addrspacecast(null) in struct member should become ; OpConstantNull of the pointer type. ; CHECK-DAG: OpConstantComposite %[[#STRUCT]] %[[#CONST]] %[[#NULL]] define spir_kernel void @test(ptr addrspace(1) %out) { entry: ret void } ; Instruction operand: addrspacecast(null) in icmp should become ; OpConstantNull of the pointer type, not a cast from integer-typed null. ; CHECK: %[[#]] = OpPtrEqual %[[#BOOL]] %[[#CWGNULL]] %[[#]] define spir_kernel void @test_icmp(ptr addrspace(1) %arg, ptr addrspace(1) %out) { entry: %cmp = icmp eq ptr addrspace(1) addrspacecast (ptr null to ptr addrspace(1)), %arg %zext = zext i1 %cmp to i32 store i32 %zext, ptr addrspace(1) %out ret void }