| ; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-vulkan-unknown %s -o - | FileCheck %s | |
| ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-vulkan-unknown %s -o - -filetype=obj | spirv-val %} | |
| ; Test lowering to spir-v backend for various types and scalar/vector | |
| ; CHECK-DAG: %[[#f16:]] = OpTypeFloat 16 | |
| ; CHECK-DAG: %[[#f32:]] = OpTypeFloat 32 | |
| ; CHECK-DAG: %[[#bool:]] = OpTypeBool | |
| ; CHECK-DAG: %[[#bool4:]] = OpTypeVector %[[#bool]] 4 | |
| ; CHECK-DAG: %[[#uint:]] = OpTypeInt 32 0 | |
| ; CHECK-DAG: %[[#v4_half:]] = OpTypeVector %[[#f16]] 4 | |
| ; CHECK-DAG: %[[#scope:]] = OpConstant %[[#uint]] 3 | |
| ; CHECK-LABEL: Begin function test_float | |
| ; CHECK: %[[#fexpr:]] = OpFunctionParameter %[[#f32]] | |
| define i1 @test_float(float %fexpr) { | |
| entry: | |
| ; CHECK: %[[#fret:]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#scope]] %[[#fexpr]] | |
| %0 = call i1 @llvm.spv.wave.all.equal.f32(float %fexpr) | |
| ret i1 %0 | |
| } | |
| ; CHECK-LABEL: Begin function test_int | |
| ; CHECK: %[[#iexpr:]] = OpFunctionParameter %[[#uint]] | |
| define i1 @test_int(i32 %iexpr) { | |
| entry: | |
| ; CHECK: %[[#iret:]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#scope]] %[[#iexpr]] | |
| %0 = call i1 @llvm.spv.wave.all.equal.i32(i32 %iexpr) | |
| ret i1 %0 | |
| } | |
| ; CHECK-LABEL: Begin function test_vhalf | |
| ; Here there's a vector, so we scalarize and then recombine the | |
| ; result back into one vector | |
| define <4 x i1> @test_vhalf(<4 x half> %vbexpr) { | |
| entry: | |
| ; CHECK: %[[#param:]] = OpFunctionParameter %[[#v4float:]] | |
| ; CHECK: %[[#ext1:]] = OpCompositeExtract %[[#f16]] %[[#param]] 0 | |
| ; CHECK-NEXT: %[[#res1:]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#scope]] %[[#ext1]] | |
| ; CHECK-NEXT: %[[#ext2:]] = OpCompositeExtract %[[#f16]] %[[#param]] 1 | |
| ; CHECK-NEXT: %[[#res2:]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#scope]] %[[#ext2]] | |
| ; CHECK-NEXT: %[[#ext3:]] = OpCompositeExtract %[[#f16]] %[[#param]] 2 | |
| ; CHECK-NEXT: %[[#res3:]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#scope]] %[[#ext3]] | |
| ; CHECK-NEXT: %[[#ext4:]] = OpCompositeExtract %[[#f16]] %[[#param]] 3 | |
| ; CHECK-NEXT: %[[#res4:]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#scope]] %[[#ext4]] | |
| ; CHECK-NEXT: %[[#ret:]] = OpCompositeConstruct %[[#bool4]] %[[#res1:]] %[[#res2:]] %[[#res3:]] %[[#res4:]] | |
| ; CHECK-NEXT: OpReturnValue %[[#ret]] | |
| %0 = call <4 x i1> @llvm.spv.wave.all.equal.v4half(<4 x half> %vbexpr) | |
| ret <4 x i1> %0 | |
| } | |
| declare i1 @llvm.spv.wave.all.equal.f32(float) | |
| declare i1 @llvm.spv.wave.all.equal.i32(i32) | |
| declare <4 x i1> @llvm.spv.wave.all.equal.v4half(<4 x half>) |