
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>
313 lines
18 KiB
MLIR
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
|
|
}
|