1
- // RUN: mlir-opt %s -test-vector-distribute-patterns | FileCheck %s
1
+ // RUN: mlir-opt %s -test-vector-distribute-patterns=distribution-multiplicity=32 | FileCheck %s
2
2
3
3
// CHECK-LABEL: func @distribute_vector_add
4
4
// CHECK-SAME: (%[[ID:.*]]: index
@@ -14,12 +14,12 @@ func @distribute_vector_add(%id : index, %A: vector<32xf32>, %B: vector<32xf32>)
14
14
15
15
// CHECK-LABEL: func @vector_add_read_write
16
16
// CHECK-SAME: (%[[ID:.*]]: index
17
- // CHECK: %[[EXA:.*]] = vector.transfer_read %{{.*}}[%{{.*}} ], %{{.*}} : memref<32xf32>, vector<1xf32>
18
- // CHECK-NEXT: %[[EXB:.*]] = vector.transfer_read %{{.*}}[%{{.*}} ], %{{.*}} : memref<32xf32>, vector<1xf32>
17
+ // CHECK: %[[EXA:.*]] = vector.transfer_read %{{.*}}[%[[ID]] ], %{{.*}} : memref<32xf32>, vector<1xf32>
18
+ // CHECK-NEXT: %[[EXB:.*]] = vector.transfer_read %{{.*}}[%[[ID]] ], %{{.*}} : memref<32xf32>, vector<1xf32>
19
19
// CHECK-NEXT: %[[ADD1:.*]] = addf %[[EXA]], %[[EXB]] : vector<1xf32>
20
- // CHECK-NEXT: %[[EXC:.*]] = vector.transfer_read %{{.*}}[%{{.*}} ], %{{.*}} : memref<32xf32>, vector<1xf32>
20
+ // CHECK-NEXT: %[[EXC:.*]] = vector.transfer_read %{{.*}}[%[[ID]] ], %{{.*}} : memref<32xf32>, vector<1xf32>
21
21
// CHECK-NEXT: %[[ADD2:.*]] = addf %[[ADD1]], %[[EXC]] : vector<1xf32>
22
- // CHECK-NEXT: vector.transfer_write %[[ADD2]], %{{.*}}[%{{.*}} ] : vector<1xf32>, memref<32xf32>
22
+ // CHECK-NEXT: vector.transfer_write %[[ADD2]], %{{.*}}[%[[ID]] ] : vector<1xf32>, memref<32xf32>
23
23
// CHECK-NEXT: return
24
24
func @vector_add_read_write (%id : index , %A: memref <32 xf32 >, %B: memref <32 xf32 >, %C: memref <32 xf32 >, %D: memref <32 xf32 >) {
25
25
%c0 = constant 0 : index
@@ -32,3 +32,41 @@ func @vector_add_read_write(%id : index, %A: memref<32xf32>, %B: memref<32xf32>,
32
32
vector.transfer_write %d , %D [%c0 ]: vector <32 xf32 >, memref <32 xf32 >
33
33
return
34
34
}
35
+
36
+ // CHECK-LABEL: func @vector_add_cycle
37
+ // CHECK-SAME: (%[[ID:.*]]: index
38
+ // CHECK: %[[EXA:.*]] = vector.transfer_read %{{.*}}[%[[ID]]], %{{.*}} : memref<64xf32>, vector<2xf32>
39
+ // CHECK-NEXT: %[[EXB:.*]] = vector.transfer_read %{{.*}}[%[[ID]]], %{{.*}} : memref<64xf32>, vector<2xf32>
40
+ // CHECK-NEXT: %[[ADD:.*]] = addf %[[EXA]], %[[EXB]] : vector<2xf32>
41
+ // CHECK-NEXT: vector.transfer_write %[[ADD]], %{{.*}}[%[[ID]]] : vector<2xf32>, memref<64xf32>
42
+ // CHECK-NEXT: return
43
+ func @vector_add_cycle (%id : index , %A: memref <64 xf32 >, %B: memref <64 xf32 >, %C: memref <64 xf32 >) {
44
+ %c0 = constant 0 : index
45
+ %cf0 = constant 0.0 : f32
46
+ %a = vector.transfer_read %A [%c0 ], %cf0: memref <64 xf32 >, vector <64 xf32 >
47
+ %b = vector.transfer_read %B [%c0 ], %cf0: memref <64 xf32 >, vector <64 xf32 >
48
+ %acc = addf %a , %b: vector <64 xf32 >
49
+ vector.transfer_write %acc , %C [%c0 ]: vector <64 xf32 >, memref <64 xf32 >
50
+ return
51
+ }
52
+
53
+ // Negative test to make sure nothing is done in case the vector size is not a
54
+ // multiple of multiplicity.
55
+ // CHECK-LABEL: func @vector_negative_test
56
+ // CHECK: %[[C0:.*]] = constant 0 : index
57
+ // CHECK: %[[EXA:.*]] = vector.transfer_read %{{.*}}[%[[C0]]], %{{.*}} : memref<64xf32>, vector<16xf32>
58
+ // CHECK-NEXT: %[[EXB:.*]] = vector.transfer_read %{{.*}}[%[[C0]]], %{{.*}} : memref<64xf32>, vector<16xf32>
59
+ // CHECK-NEXT: %[[ADD:.*]] = addf %[[EXA]], %[[EXB]] : vector<16xf32>
60
+ // CHECK-NEXT: vector.transfer_write %[[ADD]], %{{.*}}[%[[C0]]] {{.*}} : vector<16xf32>, memref<64xf32>
61
+ // CHECK-NEXT: return
62
+ func @vector_negative_test (%id : index , %A: memref <64 xf32 >, %B: memref <64 xf32 >, %C: memref <64 xf32 >) {
63
+ %c0 = constant 0 : index
64
+ %cf0 = constant 0.0 : f32
65
+ %a = vector.transfer_read %A [%c0 ], %cf0: memref <64 xf32 >, vector <16 xf32 >
66
+ %b = vector.transfer_read %B [%c0 ], %cf0: memref <64 xf32 >, vector <16 xf32 >
67
+ %acc = addf %a , %b: vector <16 xf32 >
68
+ vector.transfer_write %acc , %C [%c0 ]: vector <16 xf32 >, memref <64 xf32 >
69
+ return
70
+ }
71
+
72
+
0 commit comments