@@ -2685,224 +2685,6 @@ func.func @matrix_ops_index(%A: vector<64xindex>, %B: vector<48xindex>) -> vecto
2685
2685
2686
2686
// -----
2687
2687
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
-
2906
2688
func.func @genbool_0d_f () -> vector <i1 > {
2907
2689
%0 = vector.constant_mask [0 ] : vector <i1 >
2908
2690
return %0 : vector <i1 >
0 commit comments