1// RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s
2
3//===----------------------------------------------------------------------===//
4// spv.SubgroupBallotKHR
5//===----------------------------------------------------------------------===//
6
7func @subgroup_ballot(%predicate: i1) -> vector<4xi32> {
8  // CHECK: %{{.*}} = spv.SubgroupBallotKHR %{{.*}} : vector<4xi32>
9  %0 = spv.SubgroupBallotKHR %predicate: vector<4xi32>
10  return %0: vector<4xi32>
11}
12
13// -----
14
15//===----------------------------------------------------------------------===//
16// spv.GroupBroadcast
17//===----------------------------------------------------------------------===//
18
19func @group_broadcast_scalar(%value: f32, %localid: i32 ) -> f32 {
20  // CHECK: spv.GroupBroadcast Workgroup %{{.*}}, %{{.*}} : f32, i32
21  %0 = spv.GroupBroadcast Workgroup %value, %localid : f32, i32
22  return %0: f32
23}
24
25// -----
26
27func @group_broadcast_scalar_vector(%value: f32, %localid: vector<3xi32> ) -> f32 {
28  // CHECK: spv.GroupBroadcast Workgroup %{{.*}}, %{{.*}} : f32, vector<3xi32>
29  %0 = spv.GroupBroadcast Workgroup %value, %localid : f32, vector<3xi32>
30  return %0: f32
31}
32
33// -----
34
35func @group_broadcast_vector(%value: vector<4xf32>, %localid: vector<3xi32> ) -> vector<4xf32> {
36  // CHECK: spv.GroupBroadcast Subgroup %{{.*}}, %{{.*}} : vector<4xf32>, vector<3xi32>
37  %0 = spv.GroupBroadcast Subgroup %value, %localid : vector<4xf32>, vector<3xi32>
38  return %0: vector<4xf32>
39}
40
41// -----
42
43func @group_broadcast_negative_scope(%value: f32, %localid: vector<3xi32> ) -> f32 {
44  // expected-error @+1 {{execution scope must be 'Workgroup' or 'Subgroup'}}
45  %0 = spv.GroupBroadcast Device %value, %localid : f32, vector<3xi32>
46  return %0: f32
47}
48
49// -----
50
51func @group_broadcast_negative_locid_dtype(%value: f32, %localid: vector<3xf32> ) -> f32 {
52  // expected-error @+1 {{operand #1 must be 8/16/32/64-bit integer or vector of 8/16/32/64-bit integer values}}
53  %0 = spv.GroupBroadcast Subgroup %value, %localid : f32, vector<3xf32>
54  return %0: f32
55}
56
57// -----
58
59func @group_broadcast_negative_locid_vec4(%value: f32, %localid: vector<4xi32> ) -> f32 {
60  // expected-error @+1 {{localid is a vector and can be with only  2 or 3 components, actual number is 4}}
61  %0 = spv.GroupBroadcast Subgroup %value, %localid : f32, vector<4xi32>
62  return %0: f32
63}
64
65// -----
66
67//===----------------------------------------------------------------------===//
68// spv.SubgroupBallotKHR
69//===----------------------------------------------------------------------===//
70
71func @subgroup_ballot(%predicate: i1) -> vector<4xi32> {
72  %0 = spv.SubgroupBallotKHR %predicate: vector<4xi32>
73  return %0: vector<4xi32>
74}
75
76// -----
77
78//===----------------------------------------------------------------------===//
79// spv.SubgroupBlockReadINTEL
80//===----------------------------------------------------------------------===//
81
82func @subgroup_block_read_intel(%ptr : !spv.ptr<i32, StorageBuffer>) -> i32 {
83  // CHECK: spv.SubgroupBlockReadINTEL %{{.*}} : i32
84  %0 = spv.SubgroupBlockReadINTEL "StorageBuffer" %ptr : i32
85  return %0: i32
86}
87
88// -----
89
90func @subgroup_block_read_intel_vector(%ptr : !spv.ptr<i32, StorageBuffer>) -> vector<3xi32> {
91  // CHECK: spv.SubgroupBlockReadINTEL %{{.*}} : vector<3xi32>
92  %0 = spv.SubgroupBlockReadINTEL "StorageBuffer" %ptr : vector<3xi32>
93  return %0: vector<3xi32>
94}
95
96// -----
97
98//===----------------------------------------------------------------------===//
99// spv.SubgroupBlockWriteINTEL
100//===----------------------------------------------------------------------===//
101
102func @subgroup_block_write_intel(%ptr : !spv.ptr<i32, StorageBuffer>, %value: i32) -> () {
103  // CHECK: spv.SubgroupBlockWriteINTEL %{{.*}}, %{{.*}} : i32
104  spv.SubgroupBlockWriteINTEL "StorageBuffer" %ptr, %value : i32
105  return
106}
107
108// -----
109
110func @subgroup_block_write_intel_vector(%ptr : !spv.ptr<i32, StorageBuffer>, %value: vector<3xi32>) -> () {
111  // CHECK: spv.SubgroupBlockWriteINTEL %{{.*}}, %{{.*}} : vector<3xi32>
112  spv.SubgroupBlockWriteINTEL "StorageBuffer" %ptr, %value : vector<3xi32>
113  return
114}
115