Skip to content

Commit 845692a

Browse files
banach-spaceDanielCChen
authored andcommitted
[mlir][vector] Add more tests for ConvertVectorToLLVM (8/n) (llvm#111997)
Adds tests with scalable vectors for the Vector-To-LLVM conversion pass. Covers the following Ops: * `vector.transfer_read`, * `vector.transfer_write`. In addition: * Duplicate tests from "vector-mask-to-llvm.mlir" are removed. * Tests for xfer_read/xfer_write are moved to a newly created test file, "vector-xfer-to-llvm.mlir". This follows an existing pattern among VectorToLLVM conversion tests. * Tests that test both xfer_read and xfer_write have their names updated to capture that (e.g. @transfer_read_1d_mask -> @transfer_read_write_1d_mask) * @transfer_write_1d_scalable_mask and @transfer_read_1d_scalable_mask are re-written as @transfer_read_write_1d_mask_scalable. This is to make it clear that this case is meant to complement @transfer_read_write_1d_mask. * @transfer_write_tensor is updated to also test xfer_read.
1 parent 6f42423 commit 845692a

File tree

3 files changed

+378
-248
lines changed

3 files changed

+378
-248
lines changed

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

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -46,33 +46,3 @@ func.func @genbool_var_1d_scalable(%arg0: index) -> vector<[11]xi1> {
4646
%0 = vector.create_mask %arg0 : vector<[11]xi1>
4747
return %0 : vector<[11]xi1>
4848
}
49-
50-
// CMP32-LABEL: @transfer_read_1d
51-
// CMP32: %[[MEM:.*]]: memref<?xf32>, %[[OFF:.*]]: index) -> vector<16xf32> {
52-
// CMP32: %[[D:.*]] = memref.dim %[[MEM]], %{{.*}} : memref<?xf32>
53-
// CMP32: %[[S:.*]] = arith.subi %[[D]], %[[OFF]] : index
54-
// CMP32: %[[C:.*]] = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]> : vector<16xi32>
55-
// CMP32: %[[B:.*]] = arith.index_cast %[[S]] : index to i32
56-
// CMP32: %[[B0:.*]] = llvm.insertelement %[[B]], %{{.*}} : vector<16xi32>
57-
// CMP32: %[[BV:.*]] = llvm.shufflevector %[[B0]], {{.*}} : vector<16xi32>
58-
// CMP32: %[[M:.*]] = arith.cmpi slt, %[[C]], %[[BV]] : vector<16xi32>
59-
// CMP32: %[[L:.*]] = llvm.intr.masked.load %{{.*}}, %[[M]], %{{.*}}
60-
// CMP32: return %[[L]] : vector<16xf32>
61-
62-
// CMP64-LABEL: @transfer_read_1d(
63-
// CMP64: %[[MEM:.*]]: memref<?xf32>, %[[OFF:.*]]: index) -> vector<16xf32> {
64-
// CMP64: %[[D:.*]] = memref.dim %[[MEM]], %{{.*}} : memref<?xf32>
65-
// CMP64: %[[S:.*]] = arith.subi %[[D]], %[[OFF]] : index
66-
// CMP64: %[[C:.*]] = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]> : vector<16xi64>
67-
// CMP64: %[[B:.*]] = arith.index_cast %[[S]] : index to i64
68-
// CMP64: %[[B0:.*]] = llvm.insertelement %[[B]], %{{.*}} : vector<16xi64>
69-
// CMP64: %[[BV:.*]] = llvm.shufflevector %[[B0]], {{.*}} : vector<16xi64>
70-
// CMP64: %[[M:.*]] = arith.cmpi slt, %[[C]], %[[BV]] : vector<16xi64>
71-
// CMP64: %[[L:.*]] = llvm.intr.masked.load %{{.*}}, %[[M]], %{{.*}}
72-
// CMP64: return %[[L]] : vector<16xf32>
73-
74-
func.func @transfer_read_1d(%A : memref<?xf32>, %i: index) -> vector<16xf32> {
75-
%d = arith.constant -1.0: f32
76-
%f = vector.transfer_read %A[%i], %d {permutation_map = affine_map<(d0) -> (d0)>} : memref<?xf32>, vector<16xf32>
77-
return %f : vector<16xf32>
78-
}

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

Lines changed: 0 additions & 218 deletions
Original file line numberDiff line numberDiff line change
@@ -2685,224 +2685,6 @@ func.func @matrix_ops_index(%A: vector<64xindex>, %B: vector<48xindex>) -> vecto
26852685

26862686
// -----
26872687

2688-
func.func @transfer_read_1d(%A : memref<?xf32>, %base: index) -> vector<17xf32> {
2689-
%f7 = arith.constant 7.0: f32
2690-
%f = vector.transfer_read %A[%base], %f7
2691-
{permutation_map = affine_map<(d0) -> (d0)>} :
2692-
memref<?xf32>, vector<17xf32>
2693-
vector.transfer_write %f, %A[%base]
2694-
{permutation_map = affine_map<(d0) -> (d0)>} :
2695-
vector<17xf32>, memref<?xf32>
2696-
return %f: vector<17xf32>
2697-
}
2698-
// CHECK-LABEL: func @transfer_read_1d
2699-
// CHECK-SAME: %[[MEM:.*]]: memref<?xf32>,
2700-
// CHECK-SAME: %[[BASE:.*]]: index) -> vector<17xf32>
2701-
// CHECK: %[[C7:.*]] = arith.constant 7.0
2702-
//
2703-
// 1. Let dim be the memref dimension, compute the in-bound index (dim - offset)
2704-
// CHECK: %[[C0:.*]] = arith.constant 0 : index
2705-
// CHECK: %[[DIM:.*]] = memref.dim %[[MEM]], %[[C0]] : memref<?xf32>
2706-
// CHECK: %[[BOUND:.*]] = arith.subi %[[DIM]], %[[BASE]] : index
2707-
//
2708-
// 2. Create a vector with linear indices [ 0 .. vector_length - 1 ].
2709-
// CHECK: %[[linearIndex:.*]] = arith.constant dense
2710-
// CHECK-SAME: <[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]> :
2711-
// CHECK-SAME: vector<17xi32>
2712-
//
2713-
// 3. Create bound vector to compute in-bound mask:
2714-
// [ 0 .. vector_length - 1 ] < [ dim - offset .. dim - offset ]
2715-
// CHECK: %[[btrunc:.*]] = arith.index_cast %[[BOUND]] : index to i32
2716-
// CHECK: %[[boundVecInsert:.*]] = llvm.insertelement %[[btrunc]]
2717-
// CHECK: %[[boundVect:.*]] = llvm.shufflevector %[[boundVecInsert]]
2718-
// CHECK: %[[mask:.*]] = arith.cmpi slt, %[[linearIndex]], %[[boundVect]]
2719-
// CHECK-SAME: : vector<17xi32>
2720-
//
2721-
// 4. Create pass-through vector.
2722-
// CHECK: %[[PASS_THROUGH:.*]] = arith.constant dense<7.{{.*}}> : vector<17xf32>
2723-
//
2724-
// 5. Bitcast to vector form.
2725-
// CHECK: %[[gep:.*]] = llvm.getelementptr %{{.*}} :
2726-
// CHECK-SAME: (!llvm.ptr, i64) -> !llvm.ptr, f32
2727-
//
2728-
// 6. Rewrite as a masked read.
2729-
// CHECK: %[[loaded:.*]] = llvm.intr.masked.load %[[gep]], %[[mask]],
2730-
// CHECK-SAME: %[[PASS_THROUGH]] {alignment = 4 : i32} :
2731-
// CHECK-SAME: -> vector<17xf32>
2732-
//
2733-
// 1. Let dim be the memref dimension, compute the in-bound index (dim - offset)
2734-
// CHECK: %[[C0_b:.*]] = arith.constant 0 : index
2735-
// CHECK: %[[DIM_b:.*]] = memref.dim %[[MEM]], %[[C0_b]] : memref<?xf32>
2736-
// CHECK: %[[BOUND_b:.*]] = arith.subi %[[DIM_b]], %[[BASE]] : index
2737-
//
2738-
// 2. Create a vector with linear indices [ 0 .. vector_length - 1 ].
2739-
// CHECK: %[[linearIndex_b:.*]] = arith.constant dense
2740-
// CHECK-SAME: <[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]> :
2741-
// CHECK-SAME: vector<17xi32>
2742-
//
2743-
// 3. Create bound vector to compute in-bound mask:
2744-
// [ 0 .. vector_length - 1 ] < [ dim - offset .. dim - offset ]
2745-
// CHECK: %[[btrunc_b:.*]] = arith.index_cast %[[BOUND_b]] : index to i32
2746-
// CHECK: %[[boundVecInsert_b:.*]] = llvm.insertelement %[[btrunc_b]]
2747-
// CHECK: %[[boundVect_b:.*]] = llvm.shufflevector %[[boundVecInsert_b]]
2748-
// CHECK: %[[mask_b:.*]] = arith.cmpi slt, %[[linearIndex_b]],
2749-
// CHECK-SAME: %[[boundVect_b]] : vector<17xi32>
2750-
//
2751-
// 4. Bitcast to vector form.
2752-
// CHECK: %[[gep_b:.*]] = llvm.getelementptr {{.*}} :
2753-
// CHECK-SAME: (!llvm.ptr, i64) -> !llvm.ptr, f32
2754-
//
2755-
// 5. Rewrite as a masked write.
2756-
// CHECK: llvm.intr.masked.store %[[loaded]], %[[gep_b]], %[[mask_b]]
2757-
// CHECK-SAME: {alignment = 4 : i32} :
2758-
// CHECK-SAME: vector<17xf32>, vector<17xi1> into !llvm.ptr
2759-
2760-
// -----
2761-
2762-
func.func @transfer_read_index_1d(%A : memref<?xindex>, %base: index) -> vector<17xindex> {
2763-
%f7 = arith.constant 7: index
2764-
%f = vector.transfer_read %A[%base], %f7
2765-
{permutation_map = affine_map<(d0) -> (d0)>} :
2766-
memref<?xindex>, vector<17xindex>
2767-
vector.transfer_write %f, %A[%base]
2768-
{permutation_map = affine_map<(d0) -> (d0)>} :
2769-
vector<17xindex>, memref<?xindex>
2770-
return %f: vector<17xindex>
2771-
}
2772-
// CHECK-LABEL: func @transfer_read_index_1d
2773-
// CHECK-SAME: %[[BASE:[a-zA-Z0-9]*]]: index) -> vector<17xindex>
2774-
// CHECK: %[[SPLAT:.*]] = arith.constant dense<7> : vector<17xindex>
2775-
// CHECK: %{{.*}} = builtin.unrealized_conversion_cast %[[SPLAT]] : vector<17xindex> to vector<17xi64>
2776-
2777-
// CHECK: %[[loaded:.*]] = llvm.intr.masked.load %{{.*}}, %{{.*}}, %{{.*}} {alignment = 8 : i32} :
2778-
// CHECK-SAME: (!llvm.ptr, vector<17xi1>, vector<17xi64>) -> vector<17xi64>
2779-
2780-
// CHECK: llvm.intr.masked.store %[[loaded]], %{{.*}}, %{{.*}} {alignment = 8 : i32} :
2781-
// CHECK-SAME: vector<17xi64>, vector<17xi1> into !llvm.ptr
2782-
2783-
// -----
2784-
2785-
func.func @transfer_read_2d_to_1d(%A : memref<?x?xf32>, %base0: index, %base1: index) -> vector<17xf32> {
2786-
%f7 = arith.constant 7.0: f32
2787-
%f = vector.transfer_read %A[%base0, %base1], %f7
2788-
{permutation_map = affine_map<(d0, d1) -> (d1)>} :
2789-
memref<?x?xf32>, vector<17xf32>
2790-
return %f: vector<17xf32>
2791-
}
2792-
// CHECK-LABEL: func @transfer_read_2d_to_1d
2793-
// CHECK-SAME: %[[BASE_0:[a-zA-Z0-9]*]]: index, %[[BASE_1:[a-zA-Z0-9]*]]: index) -> vector<17xf32>
2794-
// CHECK: %[[c1:.*]] = arith.constant 1 : index
2795-
// CHECK: %[[DIM:.*]] = memref.dim %{{.*}}, %[[c1]] : memref<?x?xf32>
2796-
//
2797-
// Compute the in-bound index (dim - offset)
2798-
// CHECK: %[[BOUND:.*]] = arith.subi %[[DIM]], %[[BASE_1]] : index
2799-
//
2800-
// Create a vector with linear indices [ 0 .. vector_length - 1 ].
2801-
// CHECK: %[[linearIndex:.*]] = arith.constant dense
2802-
// CHECK-SAME: <[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]> :
2803-
// CHECK-SAME: vector<17xi32>
2804-
//
2805-
// Create bound vector to compute in-bound mask:
2806-
// [ 0 .. vector_length - 1 ] < [ dim - offset .. dim - offset ]
2807-
// CHECK: %[[btrunc:.*]] = arith.index_cast %[[BOUND]] : index to i32
2808-
// CHECK: %[[boundVecInsert:.*]] = llvm.insertelement %[[btrunc]]
2809-
// CHECK: %[[boundVect:.*]] = llvm.shufflevector %[[boundVecInsert]]
2810-
// CHECK: %[[mask:.*]] = arith.cmpi slt, %[[linearIndex]], %[[boundVect]]
2811-
2812-
// -----
2813-
2814-
func.func @transfer_read_1d_non_zero_addrspace(%A : memref<?xf32, 3>, %base: index) -> vector<17xf32> {
2815-
%f7 = arith.constant 7.0: f32
2816-
%f = vector.transfer_read %A[%base], %f7
2817-
{permutation_map = affine_map<(d0) -> (d0)>} :
2818-
memref<?xf32, 3>, vector<17xf32>
2819-
vector.transfer_write %f, %A[%base]
2820-
{permutation_map = affine_map<(d0) -> (d0)>} :
2821-
vector<17xf32>, memref<?xf32, 3>
2822-
return %f: vector<17xf32>
2823-
}
2824-
// CHECK-LABEL: func @transfer_read_1d_non_zero_addrspace
2825-
// CHECK-SAME: %[[BASE:[a-zA-Z0-9]*]]: index) -> vector<17xf32>
2826-
//
2827-
// 1. Check address space for GEP is correct.
2828-
// CHECK: %[[gep:.*]] = llvm.getelementptr {{.*}} :
2829-
// CHECK-SAME: (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, f32
2830-
//
2831-
// 2. Check address space of the memref is correct.
2832-
// CHECK: %[[c0:.*]] = arith.constant 0 : index
2833-
// CHECK: %[[DIM:.*]] = memref.dim %{{.*}}, %[[c0]] : memref<?xf32, 3>
2834-
//
2835-
// 3. Check address space for GEP is correct.
2836-
// CHECK: %[[gep_b:.*]] = llvm.getelementptr {{.*}} :
2837-
// CHECK-SAME: (!llvm.ptr<3>, i64) -> !llvm.ptr<3>, f32
2838-
2839-
// -----
2840-
2841-
func.func @transfer_read_1d_inbounds(%A : memref<?xf32>, %base: index) -> vector<17xf32> {
2842-
%f7 = arith.constant 7.0: f32
2843-
%f = vector.transfer_read %A[%base], %f7 {in_bounds = [true]} :
2844-
memref<?xf32>, vector<17xf32>
2845-
return %f: vector<17xf32>
2846-
}
2847-
// CHECK-LABEL: func @transfer_read_1d_inbounds
2848-
// CHECK-SAME: %[[BASE:[a-zA-Z0-9]*]]: index) -> vector<17xf32>
2849-
//
2850-
// 1. Bitcast to vector form.
2851-
// CHECK: %[[gep:.*]] = llvm.getelementptr {{.*}} :
2852-
// CHECK-SAME: (!llvm.ptr, i64) -> !llvm.ptr, f32
2853-
//
2854-
// 2. Rewrite as a load.
2855-
// CHECK: %[[loaded:.*]] = llvm.load %[[gep]] {alignment = 4 : i64} : !llvm.ptr -> vector<17xf32>
2856-
2857-
// -----
2858-
2859-
// CHECK-LABEL: func @transfer_read_1d_mask
2860-
// CHECK: %[[mask1:.*]] = arith.constant dense<[false, false, true, false, true]>
2861-
// CHECK: %[[cmpi:.*]] = arith.cmpi slt
2862-
// CHECK: %[[mask2:.*]] = arith.andi %[[cmpi]], %[[mask1]]
2863-
// CHECK: %[[r:.*]] = llvm.intr.masked.load %{{.*}}, %[[mask2]]
2864-
// CHECK: return %[[r]]
2865-
func.func @transfer_read_1d_mask(%A : memref<?xf32>, %base : index) -> vector<5xf32> {
2866-
%m = arith.constant dense<[0, 0, 1, 0, 1]> : vector<5xi1>
2867-
%f7 = arith.constant 7.0: f32
2868-
%f = vector.transfer_read %A[%base], %f7, %m : memref<?xf32>, vector<5xf32>
2869-
return %f: vector<5xf32>
2870-
}
2871-
2872-
// -----
2873-
2874-
// CHECK-LABEL: func @transfer_read_1d_scalable_mask
2875-
// CHECK: %[[passtru:.*]] = arith.constant dense<0.000000e+00> : vector<[4]xf32>
2876-
// CHECK: %[[r:.*]] = llvm.intr.masked.load %{{.*}}, %{{.*}}, %[[passtru]] {alignment = 4 : i32} : (!llvm.ptr, vector<[4]xi1>, vector<[4]xf32>) -> vector<[4]xf32>
2877-
// CHECK: return %[[r]] : vector<[4]xf32>
2878-
func.func @transfer_read_1d_scalable_mask(%arg0: memref<1x?xf32>, %mask: vector<[4]xi1>) -> vector<[4]xf32> {
2879-
%c0 = arith.constant 0 : index
2880-
%pad = arith.constant 0.0 : f32
2881-
%vec = vector.transfer_read %arg0[%c0, %c0], %pad, %mask {in_bounds = [true]} : memref<1x?xf32>, vector<[4]xf32>
2882-
return %vec : vector<[4]xf32>
2883-
}
2884-
2885-
// -----
2886-
// CHECK-LABEL: func @transfer_write_1d_scalable_mask
2887-
// CHECK: llvm.intr.masked.store %{{.*}}, %{{.*}}, %{{.*}} {alignment = 4 : i32} : vector<[4]xf32>, vector<[4]xi1> into !llvm.ptr
2888-
func.func @transfer_write_1d_scalable_mask(%arg0: memref<1x?xf32>, %vec: vector<[4]xf32>, %mask: vector<[4]xi1>) {
2889-
%c0 = arith.constant 0 : index
2890-
vector.transfer_write %vec, %arg0[%c0, %c0], %mask {in_bounds = [true]} : vector<[4]xf32>, memref<1x?xf32>
2891-
return
2892-
}
2893-
2894-
// -----
2895-
2896-
// CHECK-LABEL: func @transfer_write_tensor
2897-
// CHECK: vector.transfer_write
2898-
func.func @transfer_write_tensor(%arg0: vector<4xf32>,%arg1: tensor<?xf32>) -> tensor<?xf32> {
2899-
%c0 = arith.constant 0 : index
2900-
%0 = vector.transfer_write %arg0, %arg1[%c0] : vector<4xf32>, tensor<?xf32>
2901-
return %0 : tensor<?xf32>
2902-
}
2903-
2904-
// -----
2905-
29062688
func.func @genbool_0d_f() -> vector<i1> {
29072689
%0 = vector.constant_mask [0] : vector<i1>
29082690
return %0 : vector<i1>

0 commit comments

Comments
 (0)