1*aab25f20SAdam Yang; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-vulkan-unknown %s -o - | FileCheck %s 2*aab25f20SAdam Yang; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-vulkan-unknown %s -o - -filetype=obj | spirv-val %} 3*aab25f20SAdam Yang 4*aab25f20SAdam Yang; Test lowering to spir-v backend for various types and scalar/vector 5*aab25f20SAdam Yang 6*aab25f20SAdam Yang; CHECK: OpCapability GroupNonUniformArithmetic 7*aab25f20SAdam Yang 8*aab25f20SAdam Yang; CHECK-DAG: %[[#f16:]] = OpTypeFloat 16 9*aab25f20SAdam Yang; CHECK-DAG: %[[#f32:]] = OpTypeFloat 32 10*aab25f20SAdam Yang; CHECK-DAG: %[[#uint:]] = OpTypeInt 32 0 11*aab25f20SAdam Yang; CHECK-DAG: %[[#v4_half:]] = OpTypeVector %[[#f16]] 4 12*aab25f20SAdam Yang; CHECK-DAG: %[[#scope:]] = OpConstant %[[#uint]] 3 13*aab25f20SAdam Yang 14*aab25f20SAdam Yang; CHECK-LABEL: Begin function test_float 15*aab25f20SAdam Yang; CHECK: %[[#fexpr:]] = OpFunctionParameter %[[#f32]] 16*aab25f20SAdam Yangdefine float @test_float(float %fexpr) { 17*aab25f20SAdam Yangentry: 18*aab25f20SAdam Yang; CHECK: %[[#fret:]] = OpGroupNonUniformFMax %[[#f32]] %[[#scope]] Reduce %[[#fexpr]] 19*aab25f20SAdam Yang %0 = call float @llvm.spv.wave.reduce.max.f32(float %fexpr) 20*aab25f20SAdam Yang ret float %0 21*aab25f20SAdam Yang} 22*aab25f20SAdam Yang 23*aab25f20SAdam Yang; CHECK-LABEL: Begin function test_int_signed 24*aab25f20SAdam Yang; CHECK: %[[#iexpr:]] = OpFunctionParameter %[[#uint]] 25*aab25f20SAdam Yangdefine i32 @test_int_signed(i32 %iexpr) { 26*aab25f20SAdam Yangentry: 27*aab25f20SAdam Yang; CHECK: %[[#iret:]] = OpGroupNonUniformSMax %[[#uint]] %[[#scope]] Reduce %[[#iexpr]] 28*aab25f20SAdam Yang %0 = call i32 @llvm.spv.wave.reduce.max.i32(i32 %iexpr) 29*aab25f20SAdam Yang ret i32 %0 30*aab25f20SAdam Yang} 31*aab25f20SAdam Yang 32*aab25f20SAdam Yang; CHECK-LABEL: Begin function test_int_unsigned 33*aab25f20SAdam Yang; CHECK: %[[#iexpr:]] = OpFunctionParameter %[[#uint]] 34*aab25f20SAdam Yangdefine i32 @test_int_unsigned(i32 %iexpr) { 35*aab25f20SAdam Yangentry: 36*aab25f20SAdam Yang; CHECK: %[[#iret:]] = OpGroupNonUniformUMax %[[#uint]] %[[#scope]] Reduce %[[#iexpr]] 37*aab25f20SAdam Yang %0 = call i32 @llvm.spv.wave.reduce.umax.i32(i32 %iexpr) 38*aab25f20SAdam Yang ret i32 %0 39*aab25f20SAdam Yang} 40*aab25f20SAdam Yang 41*aab25f20SAdam Yang; CHECK-LABEL: Begin function test_vhalf 42*aab25f20SAdam Yang; CHECK: %[[#vbexpr:]] = OpFunctionParameter %[[#v4_half]] 43*aab25f20SAdam Yangdefine <4 x half> @test_vhalf(<4 x half> %vbexpr) { 44*aab25f20SAdam Yangentry: 45*aab25f20SAdam Yang; CHECK: %[[#vhalfret:]] = OpGroupNonUniformFMax %[[#v4_half]] %[[#scope]] Reduce %[[#vbexpr]] 46*aab25f20SAdam Yang %0 = call <4 x half> @llvm.spv.wave.reduce.max.v4half(<4 x half> %vbexpr) 47*aab25f20SAdam Yang ret <4 x half> %0 48*aab25f20SAdam Yang} 49*aab25f20SAdam Yang 50*aab25f20SAdam Yangdeclare float @llvm.spv.wave.reduce.max.f32(float) 51*aab25f20SAdam Yangdeclare i32 @llvm.spv.wave.reduce.max.i32(i32) 52*aab25f20SAdam Yangdeclare <4 x half> @llvm.spv.wave.reduce.max.v4half(<4 x half>) 53*aab25f20SAdam Yang 54*aab25f20SAdam Yangdeclare float @llvm.spv.wave.reduce.umax.f32(float) 55*aab25f20SAdam Yangdeclare i32 @llvm.spv.wave.reduce.umax.i32(i32) 56*aab25f20SAdam Yangdeclare <4 x half> @llvm.spv.wave.reduce.umax.v4half(<4 x half>) 57*aab25f20SAdam Yang 58