Ensure SplitEdge to return the new block between the two given blocks
[llvm-project.git] / mlir / test / Dialect / SPIRV / group-ops.mlir
blob55a07270a348f510beace0316d0fe18b1eda6261
1 // RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s
3 //===----------------------------------------------------------------------===//
4 // spv.SubgroupBallotKHR
5 //===----------------------------------------------------------------------===//
7 func @subgroup_ballot(%predicate: i1) -> vector<4xi32> {
8   // CHECK: %{{.*}} = spv.SubgroupBallotKHR %{{.*}} : vector<4xi32>
9   %0 = spv.SubgroupBallotKHR %predicate: vector<4xi32>
10   return %0: vector<4xi32>
13 // -----
15 //===----------------------------------------------------------------------===//
16 // spv.GroupBroadcast
17 //===----------------------------------------------------------------------===//
19 func @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
25 // -----
27 func @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
33 // -----
35 func @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>
41 // -----
43 func @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
49 // -----
51 func @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
57 // -----
59 func @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
65 // -----
67 //===----------------------------------------------------------------------===//
68 // spv.SubgroupBlockReadINTEL
69 //===----------------------------------------------------------------------===//
71 func @subgroup_block_read_intel(%ptr : !spv.ptr<i32, StorageBuffer>) -> i32 {
72   // CHECK: spv.SubgroupBlockReadINTEL %{{.*}} : i32
73   %0 = spv.SubgroupBlockReadINTEL "StorageBuffer" %ptr : i32
74   return %0: i32
77 // -----
79 func @subgroup_block_read_intel_vector(%ptr : !spv.ptr<i32, StorageBuffer>) -> vector<3xi32> {
80   // CHECK: spv.SubgroupBlockReadINTEL %{{.*}} : vector<3xi32>
81   %0 = spv.SubgroupBlockReadINTEL "StorageBuffer" %ptr : vector<3xi32>
82   return %0: vector<3xi32>
85 // -----
87 //===----------------------------------------------------------------------===//
88 // spv.SubgroupBlockWriteINTEL
89 //===----------------------------------------------------------------------===//
91 func @subgroup_block_write_intel(%ptr : !spv.ptr<i32, StorageBuffer>, %value: i32) -> () {
92   // CHECK: spv.SubgroupBlockWriteINTEL %{{.*}}, %{{.*}} : i32
93   spv.SubgroupBlockWriteINTEL "StorageBuffer" %ptr, %value : i32
94   return
97 // -----
99 func @subgroup_block_write_intel_vector(%ptr : !spv.ptr<i32, StorageBuffer>, %value: vector<3xi32>) -> () {
100   // CHECK: spv.SubgroupBlockWriteINTEL %{{.*}}, %{{.*}} : vector<3xi32>
101   spv.SubgroupBlockWriteINTEL "StorageBuffer" %ptr, %value : vector<3xi32>
102   return