Skip to content

Commit 1ff22f8

Browse files
authored
[mlir][vector] Add more tests for ConvertVectorToLLVM (9/n) (#116795)
Adds tests with scalable vectors for the Vector-To-LLVM conversion pass. Covers the following Ops: * `vector.load`, * `vector.store`. In addition: * For consistency with other tests, renamed test function names (e.g. `@vector_load_op_nontemporal` -> `vector_load_nontemporal`) * Moved `@vector_load_0d` near other test for `vector.load` (as opposed to next to `@vector_store_0d`).
1 parent 37e3966 commit 1ff22f8

File tree

1 file changed

+103
-23
lines changed

1 file changed

+103
-23
lines changed

mlir/test/Conversion/VectorToLLVM/vector-to-llvm.mlir

Lines changed: 103 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2868,12 +2868,12 @@ func.func @flat_transpose_index(%arg0: vector<16xindex>) -> vector<16xindex> {
28682868

28692869
// -----
28702870

2871-
func.func @vector_load_op(%memref : memref<200x100xf32>, %i : index, %j : index) -> vector<8xf32> {
2871+
func.func @vector_load(%memref : memref<200x100xf32>, %i : index, %j : index) -> vector<8xf32> {
28722872
%0 = vector.load %memref[%i, %j] : memref<200x100xf32>, vector<8xf32>
28732873
return %0 : vector<8xf32>
28742874
}
28752875

2876-
// CHECK-LABEL: func @vector_load_op
2876+
// CHECK-LABEL: func @vector_load
28772877
// CHECK: %[[c100:.*]] = llvm.mlir.constant(100 : index) : i64
28782878
// CHECK: %[[mul:.*]] = llvm.mul %{{.*}}, %[[c100]] : i64
28792879
// CHECK: %[[add:.*]] = llvm.add %[[mul]], %{{.*}} : i64
@@ -2882,12 +2882,26 @@ func.func @vector_load_op(%memref : memref<200x100xf32>, %i : index, %j : index)
28822882

28832883
// -----
28842884

2885-
func.func @vector_load_op_nontemporal(%memref : memref<200x100xf32>, %i : index, %j : index) -> vector<8xf32> {
2885+
func.func @vector_load_scalable(%memref : memref<200x100xf32>, %i : index, %j : index) -> vector<[8]xf32> {
2886+
%0 = vector.load %memref[%i, %j] : memref<200x100xf32>, vector<[8]xf32>
2887+
return %0 : vector<[8]xf32>
2888+
}
2889+
2890+
// CHECK-LABEL: func @vector_load_scalable
2891+
// CHECK: %[[c100:.*]] = llvm.mlir.constant(100 : index) : i64
2892+
// CHECK: %[[mul:.*]] = llvm.mul %{{.*}}, %[[c100]] : i64
2893+
// CHECK: %[[add:.*]] = llvm.add %[[mul]], %{{.*}} : i64
2894+
// CHECK: %[[gep:.*]] = llvm.getelementptr %{{.*}}[%[[add]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
2895+
// CHECK: llvm.load %[[gep]] {alignment = 4 : i64} : !llvm.ptr -> vector<[8]xf32>
2896+
2897+
// -----
2898+
2899+
func.func @vector_load_nontemporal(%memref : memref<200x100xf32>, %i : index, %j : index) -> vector<8xf32> {
28862900
%0 = vector.load %memref[%i, %j] {nontemporal = true} : memref<200x100xf32>, vector<8xf32>
28872901
return %0 : vector<8xf32>
28882902
}
28892903

2890-
// CHECK-LABEL: func @vector_load_op_nontemporal
2904+
// CHECK-LABEL: func @vector_load_nontemporal
28912905
// CHECK: %[[c100:.*]] = llvm.mlir.constant(100 : index) : i64
28922906
// CHECK: %[[mul:.*]] = llvm.mul %{{.*}}, %[[c100]] : i64
28932907
// CHECK: %[[add:.*]] = llvm.add %[[mul]], %{{.*}} : i64
@@ -2896,24 +2910,65 @@ func.func @vector_load_op_nontemporal(%memref : memref<200x100xf32>, %i : index,
28962910

28972911
// -----
28982912

2899-
func.func @vector_load_op_index(%memref : memref<200x100xindex>, %i : index, %j : index) -> vector<8xindex> {
2913+
func.func @vector_load_nontemporal_scalable(%memref : memref<200x100xf32>, %i : index, %j : index) -> vector<[8]xf32> {
2914+
%0 = vector.load %memref[%i, %j] {nontemporal = true} : memref<200x100xf32>, vector<[8]xf32>
2915+
return %0 : vector<[8]xf32>
2916+
}
2917+
2918+
// CHECK-LABEL: func @vector_load_nontemporal_scalable
2919+
// CHECK: %[[c100:.*]] = llvm.mlir.constant(100 : index) : i64
2920+
// CHECK: %[[mul:.*]] = llvm.mul %{{.*}}, %[[c100]] : i64
2921+
// CHECK: %[[add:.*]] = llvm.add %[[mul]], %{{.*}} : i64
2922+
// CHECK: %[[gep:.*]] = llvm.getelementptr %{{.*}}[%[[add]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
2923+
// CHECK: llvm.load %[[gep]] {alignment = 4 : i64, nontemporal} : !llvm.ptr -> vector<[8]xf32>
2924+
2925+
// -----
2926+
2927+
func.func @vector_load_index(%memref : memref<200x100xindex>, %i : index, %j : index) -> vector<8xindex> {
29002928
%0 = vector.load %memref[%i, %j] : memref<200x100xindex>, vector<8xindex>
29012929
return %0 : vector<8xindex>
29022930
}
2903-
// CHECK-LABEL: func @vector_load_op_index
2931+
// CHECK-LABEL: func @vector_load_index
29042932
// CHECK: %[[T0:.*]] = llvm.load %{{.*}} {alignment = 8 : i64} : !llvm.ptr -> vector<8xi64>
29052933
// CHECK: %[[T1:.*]] = builtin.unrealized_conversion_cast %[[T0]] : vector<8xi64> to vector<8xindex>
29062934
// CHECK: return %[[T1]] : vector<8xindex>
29072935

29082936
// -----
29092937

2910-
func.func @vector_store_op(%memref : memref<200x100xf32>, %i : index, %j : index) {
2938+
func.func @vector_load_index_scalable(%memref : memref<200x100xindex>, %i : index, %j : index) -> vector<[8]xindex> {
2939+
%0 = vector.load %memref[%i, %j] : memref<200x100xindex>, vector<[8]xindex>
2940+
return %0 : vector<[8]xindex>
2941+
}
2942+
// CHECK-LABEL: func @vector_load_index_scalable
2943+
// CHECK: %[[T0:.*]] = llvm.load %{{.*}} {alignment = 8 : i64} : !llvm.ptr -> vector<[8]xi64>
2944+
// CHECK: %[[T1:.*]] = builtin.unrealized_conversion_cast %[[T0]] : vector<[8]xi64> to vector<[8]xindex>
2945+
// CHECK: return %[[T1]] : vector<[8]xindex>
2946+
2947+
// -----
2948+
2949+
func.func @vector_load_0d(%memref : memref<200x100xf32>, %i : index, %j : index) -> vector<f32> {
2950+
%0 = vector.load %memref[%i, %j] : memref<200x100xf32>, vector<f32>
2951+
return %0 : vector<f32>
2952+
}
2953+
2954+
// CHECK-LABEL: func @vector_load_0d
2955+
// CHECK: %[[load:.*]] = memref.load %{{.*}}[%{{.*}}, %{{.*}}]
2956+
// CHECK: %[[vec:.*]] = llvm.mlir.undef : vector<1xf32>
2957+
// CHECK: %[[c0:.*]] = llvm.mlir.constant(0 : i32) : i32
2958+
// CHECK: %[[inserted:.*]] = llvm.insertelement %[[load]], %[[vec]][%[[c0]] : i32] : vector<1xf32>
2959+
// CHECK: %[[cast:.*]] = builtin.unrealized_conversion_cast %[[inserted]] : vector<1xf32> to vector<f32>
2960+
// CHECK: return %[[cast]] : vector<f32>
2961+
2962+
// -----
2963+
2964+
2965+
func.func @vector_store(%memref : memref<200x100xf32>, %i : index, %j : index) {
29112966
%val = arith.constant dense<11.0> : vector<4xf32>
29122967
vector.store %val, %memref[%i, %j] : memref<200x100xf32>, vector<4xf32>
29132968
return
29142969
}
29152970

2916-
// CHECK-LABEL: func @vector_store_op
2971+
// CHECK-LABEL: func @vector_store
29172972
// CHECK: %[[c100:.*]] = llvm.mlir.constant(100 : index) : i64
29182973
// CHECK: %[[mul:.*]] = llvm.mul %{{.*}}, %[[c100]] : i64
29192974
// CHECK: %[[add:.*]] = llvm.add %[[mul]], %{{.*}} : i64
@@ -2922,13 +2977,28 @@ func.func @vector_store_op(%memref : memref<200x100xf32>, %i : index, %j : index
29222977

29232978
// -----
29242979

2925-
func.func @vector_store_op_nontemporal(%memref : memref<200x100xf32>, %i : index, %j : index) {
2980+
func.func @vector_store_scalable(%memref : memref<200x100xf32>, %i : index, %j : index) {
2981+
%val = arith.constant dense<11.0> : vector<[4]xf32>
2982+
vector.store %val, %memref[%i, %j] : memref<200x100xf32>, vector<[4]xf32>
2983+
return
2984+
}
2985+
2986+
// CHECK-LABEL: func @vector_store_scalable
2987+
// CHECK: %[[c100:.*]] = llvm.mlir.constant(100 : index) : i64
2988+
// CHECK: %[[mul:.*]] = llvm.mul %{{.*}}, %[[c100]] : i64
2989+
// CHECK: %[[add:.*]] = llvm.add %[[mul]], %{{.*}} : i64
2990+
// CHECK: %[[gep:.*]] = llvm.getelementptr %{{.*}}[%[[add]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
2991+
// CHECK: llvm.store %{{.*}}, %[[gep]] {alignment = 4 : i64} : vector<[4]xf32>, !llvm.ptr
2992+
2993+
// -----
2994+
2995+
func.func @vector_store_nontemporal(%memref : memref<200x100xf32>, %i : index, %j : index) {
29262996
%val = arith.constant dense<11.0> : vector<4xf32>
29272997
vector.store %val, %memref[%i, %j] {nontemporal = true} : memref<200x100xf32>, vector<4xf32>
29282998
return
29292999
}
29303000

2931-
// CHECK-LABEL: func @vector_store_op_nontemporal
3001+
// CHECK-LABEL: func @vector_store_nontemporal
29323002
// CHECK: %[[c100:.*]] = llvm.mlir.constant(100 : index) : i64
29333003
// CHECK: %[[mul:.*]] = llvm.mul %{{.*}}, %[[c100]] : i64
29343004
// CHECK: %[[add:.*]] = llvm.add %[[mul]], %{{.*}} : i64
@@ -2937,28 +3007,38 @@ func.func @vector_store_op_nontemporal(%memref : memref<200x100xf32>, %i : index
29373007

29383008
// -----
29393009

2940-
func.func @vector_store_op_index(%memref : memref<200x100xindex>, %i : index, %j : index) {
3010+
func.func @vector_store_nontemporal_scalable(%memref : memref<200x100xf32>, %i : index, %j : index) {
3011+
%val = arith.constant dense<11.0> : vector<[4]xf32>
3012+
vector.store %val, %memref[%i, %j] {nontemporal = true} : memref<200x100xf32>, vector<[4]xf32>
3013+
return
3014+
}
3015+
3016+
// CHECK-LABEL: func @vector_store_nontemporal_scalable
3017+
// CHECK: %[[c100:.*]] = llvm.mlir.constant(100 : index) : i64
3018+
// CHECK: %[[mul:.*]] = llvm.mul %{{.*}}, %[[c100]] : i64
3019+
// CHECK: %[[add:.*]] = llvm.add %[[mul]], %{{.*}} : i64
3020+
// CHECK: %[[gep:.*]] = llvm.getelementptr %{{.*}}[%[[add]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
3021+
// CHECK: llvm.store %{{.*}}, %[[gep]] {alignment = 4 : i64, nontemporal} : vector<[4]xf32>, !llvm.ptr
3022+
3023+
// -----
3024+
3025+
func.func @vector_store_index(%memref : memref<200x100xindex>, %i : index, %j : index) {
29413026
%val = arith.constant dense<11> : vector<4xindex>
29423027
vector.store %val, %memref[%i, %j] : memref<200x100xindex>, vector<4xindex>
29433028
return
29443029
}
2945-
// CHECK-LABEL: func @vector_store_op_index
3030+
// CHECK-LABEL: func @vector_store_index
29463031
// CHECK: llvm.store %{{.*}}, %{{.*}} {alignment = 8 : i64} : vector<4xi64>, !llvm.ptr
29473032

29483033
// -----
29493034

2950-
func.func @vector_load_op_0d(%memref : memref<200x100xf32>, %i : index, %j : index) -> vector<f32> {
2951-
%0 = vector.load %memref[%i, %j] : memref<200x100xf32>, vector<f32>
2952-
return %0 : vector<f32>
3035+
func.func @vector_store_index_scalable(%memref : memref<200x100xindex>, %i : index, %j : index) {
3036+
%val = arith.constant dense<11> : vector<[4]xindex>
3037+
vector.store %val, %memref[%i, %j] : memref<200x100xindex>, vector<[4]xindex>
3038+
return
29533039
}
2954-
2955-
// CHECK-LABEL: func @vector_load_op_0d
2956-
// CHECK: %[[load:.*]] = memref.load %{{.*}}[%{{.*}}, %{{.*}}]
2957-
// CHECK: %[[vec:.*]] = llvm.mlir.undef : vector<1xf32>
2958-
// CHECK: %[[c0:.*]] = llvm.mlir.constant(0 : i32) : i32
2959-
// CHECK: %[[inserted:.*]] = llvm.insertelement %[[load]], %[[vec]][%[[c0]] : i32] : vector<1xf32>
2960-
// CHECK: %[[cast:.*]] = builtin.unrealized_conversion_cast %[[inserted]] : vector<1xf32> to vector<f32>
2961-
// CHECK: return %[[cast]] : vector<f32>
3040+
// CHECK-LABEL: func @vector_store_index_scalable
3041+
// CHECK: llvm.store %{{.*}}, %{{.*}} {alignment = 8 : i64} : vector<[4]xi64>, !llvm.ptr
29623042

29633043
// -----
29643044

0 commit comments

Comments
 (0)