diff options
| author | Uday Bondhugula <uday@polymagelabs.com> | 2019-12-18 09:59:37 -0800 |
|---|---|---|
| committer | A. Unique TensorFlower <gardener@tensorflow.org> | 2019-12-18 10:00:04 -0800 |
| commit | 47034c4bc509f727051ff172c2bf3367a60e2c01 (patch) | |
| tree | 80c36f8028f7d82b5768e3c46ecc2860e22902f6 /mlir/test/Conversion/StandardToLLVM | |
| parent | 4562e389a43caa2e30ebf277c12743edafe6a0ac (diff) | |
| download | bcm5719-llvm-47034c4bc509f727051ff172c2bf3367a60e2c01.tar.gz bcm5719-llvm-47034c4bc509f727051ff172c2bf3367a60e2c01.zip | |
Introduce prefetch op: affine -> std -> llvm intrinsic
Introduce affine.prefetch: op to prefetch using a multi-dimensional
subscript on a memref; similar to affine.load but has no effect on
semantics, but only on performance.
Provide lowering through std.prefetch, llvm.prefetch and map to llvm's
prefetch instrinsic. All attributes reflected through the lowering -
locality hint, rw, and instr/data cache.
affine.prefetch %0[%i, %j + 5], false, 3, true : memref<400x400xi32>
Signed-off-by: Uday Bondhugula <uday@polymagelabs.com>
Closes tensorflow/mlir#225
COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/225 from bondhugula:prefetch 4c3b4e93bc64d9a5719504e6d6e1657818a2ead0
PiperOrigin-RevId: 286212997
Diffstat (limited to 'mlir/test/Conversion/StandardToLLVM')
| -rw-r--r-- | mlir/test/Conversion/StandardToLLVM/convert-memref-ops.mlir | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/mlir/test/Conversion/StandardToLLVM/convert-memref-ops.mlir b/mlir/test/Conversion/StandardToLLVM/convert-memref-ops.mlir index 6f52c947785..d92ded7f3aa 100644 --- a/mlir/test/Conversion/StandardToLLVM/convert-memref-ops.mlir +++ b/mlir/test/Conversion/StandardToLLVM/convert-memref-ops.mlir @@ -253,6 +253,36 @@ func @dynamic_load(%dynamic : memref<?x?xf32>, %i : index, %j : index) { return } +// CHECK-LABEL: func @prefetch +func @prefetch(%A : memref<?x?xf32>, %i : index, %j : index) { +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, float*, i64, [2 x i64], [2 x i64] }*"> +// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %[[ld]][1] : !llvm<"{ float*, float*, i64, [2 x i64], [2 x i64] }"> +// CHECK-NEXT: %[[off:.*]] = llvm.mlir.constant(0 : index) : !llvm.i64 +// CHECK-NEXT: %[[st0:.*]] = llvm.extractvalue %[[ld]][4, 0] : !llvm<"{ float*, float*, i64, [2 x i64], [2 x i64] }"> +// CHECK-NEXT: %[[offI:.*]] = llvm.mul %[[I]], %[[st0]] : !llvm.i64 +// CHECK-NEXT: %[[off0:.*]] = llvm.add %[[off]], %[[offI]] : !llvm.i64 +// CHECK-NEXT: %[[st1:.*]] = llvm.mlir.constant(1 : index) : !llvm.i64 +// CHECK-NEXT: %[[offJ:.*]] = llvm.mul %[[J]], %[[st1]] : !llvm.i64 +// CHECK-NEXT: %[[off1:.*]] = llvm.add %[[off0]], %[[offJ]] : !llvm.i64 +// CHECK-NEXT: %[[addr:.*]] = llvm.getelementptr %[[ptr]][%[[off1]]] : (!llvm<"float*">, !llvm.i64) -> !llvm<"float*"> +// CHECK-NEXT: [[C1:%.*]] = llvm.mlir.constant(1 : i32) : !llvm.i32 +// CHECK-NEXT: [[C3:%.*]] = llvm.mlir.constant(3 : i32) : !llvm.i32 +// CHECK-NEXT: [[C1_1:%.*]] = llvm.mlir.constant(1 : i32) : !llvm.i32 +// CHECK-NEXT: "llvm.intr.prefetch"(%[[addr]], [[C1]], [[C3]], [[C1_1]]) : (!llvm<"float*">, !llvm.i32, !llvm.i32, !llvm.i32) -> () + prefetch %A[%i, %j], write, locality<3>, data : memref<?x?xf32> +// CHECK: [[C0:%.*]] = llvm.mlir.constant(0 : i32) : !llvm.i32 +// CHECK: [[C0_1:%.*]] = llvm.mlir.constant(0 : i32) : !llvm.i32 +// CHECK: [[C1_2:%.*]] = llvm.mlir.constant(1 : i32) : !llvm.i32 +// CHECK: "llvm.intr.prefetch"(%{{.*}}, [[C0]], [[C0_1]], [[C1_2]]) : (!llvm<"float*">, !llvm.i32, !llvm.i32, !llvm.i32) -> () + prefetch %A[%i, %j], read, locality<0>, data : memref<?x?xf32> +// CHECK: [[C0_2:%.*]] = llvm.mlir.constant(0 : i32) : !llvm.i32 +// CHECK: [[C2:%.*]] = llvm.mlir.constant(2 : i32) : !llvm.i32 +// CHECK: [[C0_3:%.*]] = llvm.mlir.constant(0 : i32) : !llvm.i32 +// CHECK: "llvm.intr.prefetch"(%{{.*}}, [[C0_2]], [[C2]], [[C0_3]]) : (!llvm<"float*">, !llvm.i32, !llvm.i32, !llvm.i32) -> () + prefetch %A[%i, %j], read, locality<2>, instr : memref<?x?xf32> + return +} + // CHECK-LABEL: func @zero_d_store(%arg0: !llvm<"{ float*, float*, i64 }*">, %arg1: !llvm.float) { func @zero_d_store(%arg0: memref<f32>, %arg1: f32) { // CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, float*, i64 }*"> |

