| ; 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 | |
| } |