llvm-project/mlir/test/Conversion/SPIRVToLLVM/group-ops-to-llvm.mlir
Lukas Sommer 6ade03d79d
[mlir][spirv] Add spirv-to-llvm conversion for group operations (#115501)
Lowering for some of the uniform and non-uniform group operations
defined in section 3.52.21 of the SPIR-V specification from SPIR-V
dialect to LLVM dialect.

Similar to #111864, lower the operations to builtin functions understood
by SPIR-V tools.

---------

Signed-off-by: Lukas Sommer <lukas.sommer@codeplay.com>
2024-11-12 10:00:45 +01:00

313 lines
18 KiB
MLIR

// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s
// NOTE: Assertions have been autogenerated by utils/generate-test-checks.py
// CHECK-LABEL: llvm.func spir_funccc @_Z17__spirv_GroupSMaxiij(i32, i32, i32) -> i32 attributes {convergent, no_unwind, will_return}
// CHECK: llvm.func spir_funccc @_Z17__spirv_GroupUMaxiij(i32, i32, i32) -> i32 attributes {convergent, no_unwind, will_return}
// CHECK: llvm.func spir_funccc @_Z17__spirv_GroupFMaxiif(i32, i32, f32) -> f32 attributes {convergent, no_unwind, will_return}
// CHECK: llvm.func spir_funccc @_Z17__spirv_GroupSMiniij(i32, i32, i32) -> i32 attributes {convergent, no_unwind, will_return}
// CHECK: llvm.func spir_funccc @_Z17__spirv_GroupUMiniij(i32, i32, i32) -> i32 attributes {convergent, no_unwind, will_return}
// CHECK: llvm.func spir_funccc @_Z17__spirv_GroupFMiniif(i32, i32, f32) -> f32 attributes {convergent, no_unwind, will_return}
// CHECK: llvm.func spir_funccc @_Z17__spirv_GroupFAddiif(i32, i32, f32) -> f32 attributes {convergent, no_unwind, will_return}
// CHECK: llvm.func spir_funccc @_Z17__spirv_GroupIAddiij(i32, i32, i32) -> i32 attributes {convergent, no_unwind, will_return}
// CHECK-LABEL: llvm.func @group_reduce_iadd(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(0 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupIAddiij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_reduce_iadd(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupIAdd <Workgroup> <Reduce> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @group_reduce_fadd(
// CHECK-SAME: %[[VAL_0:.*]]: f32) -> f32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(0 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupFAddiif(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, f32) -> f32
// CHECK: llvm.return %[[VAL_3]] : f32
// CHECK: }
spirv.func @group_reduce_fadd(%arg0: f32) -> f32 "None" {
%0 = spirv.GroupFAdd <Workgroup> <Reduce> %arg0 : f32
spirv.ReturnValue %0 : f32
}
// CHECK-LABEL: llvm.func @group_reduce_fmin(
// CHECK-SAME: %[[VAL_0:.*]]: f32) -> f32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(0 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupFMiniif(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, f32) -> f32
// CHECK: llvm.return %[[VAL_3]] : f32
// CHECK: }
spirv.func @group_reduce_fmin(%arg0: f32) -> f32 "None" {
%0 = spirv.GroupFMin <Workgroup> <Reduce> %arg0 : f32
spirv.ReturnValue %0 : f32
}
// CHECK-LABEL: llvm.func @group_reduce_umin(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(0 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupUMiniij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_reduce_umin(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupUMin <Workgroup> <Reduce> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @group_reduce_smin(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(0 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupSMiniij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_reduce_smin(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupSMin <Workgroup> <Reduce> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @group_reduce_fmax(
// CHECK-SAME: %[[VAL_0:.*]]: f32) -> f32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(0 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupFMaxiif(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, f32) -> f32
// CHECK: llvm.return %[[VAL_3]] : f32
// CHECK: }
spirv.func @group_reduce_fmax(%arg0: f32) -> f32 "None" {
%0 = spirv.GroupFMax <Workgroup> <Reduce> %arg0 : f32
spirv.ReturnValue %0 : f32
}
// CHECK-LABEL: llvm.func @group_reduce_umax(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(0 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupUMaxiij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_reduce_umax(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupUMax <Workgroup> <Reduce> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @group_reduce_smax(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(0 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupSMaxiij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_reduce_smax(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupSMax <Workgroup> <Reduce> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @group_inclusive_scan_iadd(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupIAddiij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_inclusive_scan_iadd(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupIAdd <Workgroup> <InclusiveScan> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @group_inclusive_scan_fadd(
// CHECK-SAME: %[[VAL_0:.*]]: f32) -> f32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupFAddiif(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, f32) -> f32
// CHECK: llvm.return %[[VAL_3]] : f32
// CHECK: }
spirv.func @group_inclusive_scan_fadd(%arg0: f32) -> f32 "None" {
%0 = spirv.GroupFAdd <Workgroup> <InclusiveScan> %arg0 : f32
spirv.ReturnValue %0 : f32
}
// CHECK-LABEL: llvm.func @group_inclusive_scan_fmin(
// CHECK-SAME: %[[VAL_0:.*]]: f32) -> f32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupFMiniif(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, f32) -> f32
// CHECK: llvm.return %[[VAL_3]] : f32
// CHECK: }
spirv.func @group_inclusive_scan_fmin(%arg0: f32) -> f32 "None" {
%0 = spirv.GroupFMin <Workgroup> <InclusiveScan> %arg0 : f32
spirv.ReturnValue %0 : f32
}
// CHECK-LABEL: llvm.func @group_inclusive_scan_umin(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupUMiniij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_inclusive_scan_umin(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupUMin <Workgroup> <InclusiveScan> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @group_inclusive_scan_smin(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupSMiniij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_inclusive_scan_smin(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupSMin <Workgroup> <InclusiveScan> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @group_inclusive_scan_fmax(
// CHECK-SAME: %[[VAL_0:.*]]: f32) -> f32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupFMaxiif(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, f32) -> f32
// CHECK: llvm.return %[[VAL_3]] : f32
// CHECK: }
spirv.func @group_inclusive_scan_fmax(%arg0: f32) -> f32 "None" {
%0 = spirv.GroupFMax <Workgroup> <InclusiveScan> %arg0 : f32
spirv.ReturnValue %0 : f32
}
// CHECK-LABEL: llvm.func @group_inclusive_scan_umax(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupUMaxiij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_inclusive_scan_umax(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupUMax <Workgroup> <InclusiveScan> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @group_inclusive_scan_smax(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupSMaxiij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_inclusive_scan_smax(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupSMax <Workgroup> <ExclusiveScan> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @group_exclusive_scan_iadd(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupIAddiij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_exclusive_scan_iadd(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupIAdd <Workgroup> <ExclusiveScan> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @group_exclusive_scan_fadd(
// CHECK-SAME: %[[VAL_0:.*]]: f32) -> f32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupFAddiif(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, f32) -> f32
// CHECK: llvm.return %[[VAL_3]] : f32
// CHECK: }
spirv.func @group_exclusive_scan_fadd(%arg0: f32) -> f32 "None" {
%0 = spirv.GroupFAdd <Workgroup> <ExclusiveScan> %arg0 : f32
spirv.ReturnValue %0 : f32
}
// CHECK-LABEL: llvm.func @group_exclusive_scan_fmin(
// CHECK-SAME: %[[VAL_0:.*]]: f32) -> f32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupFMiniif(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, f32) -> f32
// CHECK: llvm.return %[[VAL_3]] : f32
// CHECK: }
spirv.func @group_exclusive_scan_fmin(%arg0: f32) -> f32 "None" {
%0 = spirv.GroupFMin <Workgroup> <ExclusiveScan> %arg0 : f32
spirv.ReturnValue %0 : f32
}
// CHECK-LABEL: llvm.func @group_exclusive_scan_umin(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupUMiniij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_exclusive_scan_umin(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupUMin <Workgroup> <ExclusiveScan> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @group_exclusive_scan_smin(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupSMiniij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_exclusive_scan_smin(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupSMin <Workgroup> <ExclusiveScan> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @group_exclusive_scan_fmax(
// CHECK-SAME: %[[VAL_0:.*]]: f32) -> f32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupFMaxiif(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, f32) -> f32
// CHECK: llvm.return %[[VAL_3]] : f32
// CHECK: }
spirv.func @group_exclusive_scan_fmax(%arg0: f32) -> f32 "None" {
%0 = spirv.GroupFMax <Workgroup> <ExclusiveScan> %arg0 : f32
spirv.ReturnValue %0 : f32
}
// CHECK-LABEL: llvm.func @group_exclusive_scan_umax(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupUMaxiij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_exclusive_scan_umax(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupUMax <Workgroup> <ExclusiveScan> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @group_exclusive_scan_smax(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupSMaxiij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @group_exclusive_scan_smax(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupSMax <Workgroup> <ExclusiveScan> %arg0 : i32
spirv.ReturnValue %0 : i32
}
// CHECK-LABEL: llvm.func @subgroup_exclusive_scan_smax(
// CHECK-SAME: %[[VAL_0:.*]]: i32) -> i32 {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(3 : i32) : i32
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(2 : i32) : i32
// CHECK: %[[VAL_3:.*]] = llvm.call spir_funccc @_Z17__spirv_GroupSMaxiij(%[[VAL_1]], %[[VAL_2]], %[[VAL_0]]) {convergent, no_unwind, will_return} : (i32, i32, i32) -> i32
// CHECK: llvm.return %[[VAL_3]] : i32
// CHECK: }
spirv.func @subgroup_exclusive_scan_smax(%arg0: i32) -> i32 "None" {
%0 = spirv.GroupSMax <Subgroup> <ExclusiveScan> %arg0 : i32
spirv.ReturnValue %0 : i32
}