// 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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %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 %arg0 : i32 spirv.ReturnValue %0 : i32 }