@@ -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 <17 xf32 > {
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 <17 xf32 >
2693- vector.transfer_write %f , %A [%base ]
2694- {permutation_map = affine_map <(d0 ) -> (d0 )>} :
2695- vector <17 xf32 >, memref <?xf32 >
2696- return %f: vector <17 xf32 >
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 <17 xindex > {
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 <17 xindex >
2767- vector.transfer_write %f , %A [%base ]
2768- {permutation_map = affine_map <(d0 ) -> (d0 )>} :
2769- vector <17 xindex >, memref <?xindex >
2770- return %f: vector <17 xindex >
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 <17 xf32 > {
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 <17 xf32 >
2790- return %f: vector <17 xf32 >
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 <17 xf32 > {
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 <17 xf32 >
2819- vector.transfer_write %f , %A [%base ]
2820- {permutation_map = affine_map <(d0 ) -> (d0 )>} :
2821- vector <17 xf32 >, memref <?xf32 , 3 >
2822- return %f: vector <17 xf32 >
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 <17 xf32 > {
2842- %f7 = arith.constant 7.0 : f32
2843- %f = vector.transfer_read %A [%base ], %f7 {in_bounds = [true ]} :
2844- memref <?xf32 >, vector <17 xf32 >
2845- return %f: vector <17 xf32 >
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 <5 xf32 > {
2866- %m = arith.constant dense <[0 , 0 , 1 , 0 , 1 ]> : vector <5 xi1 >
2867- %f7 = arith.constant 7.0 : f32
2868- %f = vector.transfer_read %A [%base ], %f7 , %m : memref <?xf32 >, vector <5 xf32 >
2869- return %f: vector <5 xf32 >
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 <1 x?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 <1 x?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 <1 x?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 <1 x?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 <4 xf32 >,%arg1: tensor <?xf32 >) -> tensor <?xf32 > {
2899- %c0 = arith.constant 0 : index
2900- %0 = vector.transfer_write %arg0 , %arg1 [%c0 ] : vector <4 xf32 >, tensor <?xf32 >
2901- return %0 : tensor <?xf32 >
2902- }
2903-
2904- // -----
2905-
29062688func.func @genbool_0d_f () -> vector <i1 > {
29072689 %0 = vector.constant_mask [0 ] : vector <i1 >
29082690 return %0 : vector <i1 >
0 commit comments