diff options
| author | Nicolas Vasilache <ntv@google.com> | 2019-09-27 09:55:38 -0700 |
|---|---|---|
| committer | A. Unique TensorFlower <gardener@tensorflow.org> | 2019-09-27 09:57:36 -0700 |
| commit | ddf737c5da728f25c5e0413bc737d04b2d92df96 (patch) | |
| tree | 07af0e3ba0f3755d11d329ccde15e8479ca04cd7 /mlir/test/Conversion/StandardToLLVM | |
| parent | 6543e99fe51b9077d8185ba9741770adc5f7cde5 (diff) | |
| download | bcm5719-llvm-ddf737c5da728f25c5e0413bc737d04b2d92df96.tar.gz bcm5719-llvm-ddf737c5da728f25c5e0413bc737d04b2d92df96.zip | |
Promote MemRefDescriptor to a pointer to struct when passing function boundaries in LLVMLowering.
The strided MemRef RFC discusses a normalized descriptor and interaction with library calls (https://groups.google.com/a/tensorflow.org/forum/#!topic/mlir/MaL8m2nXuio).
Lowering of nested LLVM structs as value types does not play nicely with externally compiled C/C++ functions due to ABI issues.
Solving the ABI problem generally is a very complex problem and most likely involves taking
a dependence on clang that we do not want atm.
A simple workaround is to pass pointers to memref descriptors at function boundaries, which this CL implement.
PiperOrigin-RevId: 271591708
Diffstat (limited to 'mlir/test/Conversion/StandardToLLVM')
4 files changed, 130 insertions, 88 deletions
diff --git a/mlir/test/Conversion/StandardToLLVM/convert-argattrs.mlir b/mlir/test/Conversion/StandardToLLVM/convert-argattrs.mlir index 4c4b6209982..60bb3e1b48b 100644 --- a/mlir/test/Conversion/StandardToLLVM/convert-argattrs.mlir +++ b/mlir/test/Conversion/StandardToLLVM/convert-argattrs.mlir @@ -1,8 +1,24 @@ // RUN: mlir-opt -lower-to-llvm %s | FileCheck %s - -// CHECK-LABEL: func @check_attributes(%arg0: !llvm<"{ float*, [2 x i64] }"> {dialect.a = true, dialect.b = 4 : i64}) { +// CHECK-LABEL: func @check_attributes(%arg0: !llvm<"{ float*, [2 x i64] }*"> {dialect.a = true, dialect.b = 4 : i64}) { +// CHECK-NEXT: llvm.load %arg0 : !llvm<"{ float*, [2 x i64] }*"> func @check_attributes(%static: memref<10x20xf32> {dialect.a = true, dialect.b = 4 : i64 }) { + %c0 = constant 0 : index + %0 = load %static[%c0, %c0]: memref<10x20xf32> + return +} + +// CHECK-LABEL: func @external_func(!llvm<"{ float*, [2 x i64] }*">) +// CHECK: func @call_external(%[[arg:.*]]: !llvm<"{ float*, [2 x i64] }*">) { +// CHECK: %[[ld:.*]] = llvm.load %[[arg]] : !llvm<"{ float*, [2 x i64] }*"> +// CHECK: %[[c1:.*]] = llvm.mlir.constant(1 : index) : !llvm.i64 +// CHECK: %[[alloca:.*]] = llvm.alloca %[[c1]] x !llvm<"{ float*, [2 x i64] }"> : (!llvm.i64) -> !llvm<"{ float*, [2 x i64] }*"> +// CHECK: llvm.store %[[ld]], %[[alloca]] : !llvm<"{ float*, [2 x i64] }*"> +// CHECK: call @external_func(%[[alloca]]) : (!llvm<"{ float*, [2 x i64] }*">) -> () +func @external_func(memref<10x20xf32>) + +func @call_external(%static: memref<10x20xf32>) { + call @external_func(%static) : (memref<10x20xf32>) -> () return } diff --git a/mlir/test/Conversion/StandardToLLVM/convert-funcs.mlir b/mlir/test/Conversion/StandardToLLVM/convert-funcs.mlir index f81443a8ecc..eeffb567c52 100644 --- a/mlir/test/Conversion/StandardToLLVM/convert-funcs.mlir +++ b/mlir/test/Conversion/StandardToLLVM/convert-funcs.mlir @@ -1,3 +1,4 @@ +// RUN: mlir-opt -lower-to-llvm %s // RUN: mlir-opt -lower-to-llvm %s | FileCheck %s //CHECK: func @second_order_arg(!llvm<"void ()*">) diff --git a/mlir/test/Conversion/StandardToLLVM/convert-memref-ops.mlir b/mlir/test/Conversion/StandardToLLVM/convert-memref-ops.mlir index 496a1ecae6d..d150dffc0a5 100644 --- a/mlir/test/Conversion/StandardToLLVM/convert-memref-ops.mlir +++ b/mlir/test/Conversion/StandardToLLVM/convert-memref-ops.mlir @@ -1,31 +1,34 @@ +// RUN: mlir-opt -lower-to-llvm %s // RUN: mlir-opt -lower-to-llvm %s | FileCheck %s -// CHECK-LABEL: func @check_arguments(%arg0: !llvm<"{ float*, [2 x i64] }">, %arg1: !llvm<"{ float*, [2 x i64] }">, %arg2: !llvm<"{ float*, [2 x i64] }">) +// CHECK-LABEL: func @check_arguments(%arg0: !llvm<"{ float*, [2 x i64] }*">, %arg1: !llvm<"{ float*, [2 x i64] }*">, %arg2: !llvm<"{ float*, [2 x i64] }*">) func @check_arguments(%static: memref<10x20xf32>, %dynamic : memref<?x?xf32>, %mixed : memref<10x?xf32>) { return } -// CHECK-LABEL: func @check_static_return(%arg0: !llvm<"{ float*, [2 x i64] }">) -> !llvm<"{ float*, [2 x i64] }"> { +// CHECK-LABEL: func @check_static_return(%arg0: !llvm<"{ float*, [2 x i64] }*">) -> !llvm<"{ float*, [2 x i64] }"> { func @check_static_return(%static : memref<32x18xf32>) -> memref<32x18xf32> { -// CHECK-NEXT: llvm.return %arg0 : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: llvm.return %{{.*}} : !llvm<"{ float*, [2 x i64] }"> return %static : memref<32x18xf32> } // CHECK-LABEL: func @zero_d_alloc() -> !llvm<"{ float* }"> { func @zero_d_alloc() -> memref<f32> { -// CHECK-NEXT: %0 = llvm.mlir.constant(1 : index) : !llvm.i64 -// CHECK-NEXT: %1 = llvm.mlir.constant(4 : index) : !llvm.i64 -// CHECK-NEXT: %2 = llvm.mul %0, %1 : !llvm.i64 -// CHECK-NEXT: %3 = llvm.call @malloc(%2) : (!llvm.i64) -> !llvm<"i8*"> -// CHECK-NEXT: %4 = llvm.bitcast %3 : !llvm<"i8*"> to !llvm<"float*"> +// CHECK-NEXT: llvm.mlir.constant(1 : index) : !llvm.i64 +// CHECK-NEXT: llvm.mlir.constant(4 : index) : !llvm.i64 +// CHECK-NEXT: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64 +// CHECK-NEXT: llvm.call @malloc(%{{.*}}) : (!llvm.i64) -> !llvm<"i8*"> +// CHECK-NEXT: llvm.bitcast %{{.*}} : !llvm<"i8*"> to !llvm<"float*"> %0 = alloc() : memref<f32> return %0 : memref<f32> } -// CHECK-LABEL: func @zero_d_dealloc(%arg0: !llvm<"{ float* }">) { +// CHECK-LABEL: func @zero_d_dealloc(%{{.*}}: !llvm<"{ float* }*">) { func @zero_d_dealloc(%arg0: memref<f32>) { -// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %arg0[0 : index] : !llvm<"{ float* }"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float* }*"> +// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %[[ld]][0 : index] : !llvm<"{ float* }"> // CHECK-NEXT: %[[bc:.*]] = llvm.bitcast %[[ptr]] : !llvm<"float*"> to !llvm<"i8*"> // CHECK-NEXT: llvm.call @free(%[[bc]]) : (!llvm<"i8*">) -> () dealloc %arg0 : memref<f32> @@ -50,11 +53,12 @@ func @mixed_alloc(%arg0: index, %arg1: index) -> memref<?x42x?xf32> { return %0 : memref<?x42x?xf32> } -// CHECK-LABEL: func @mixed_dealloc(%arg0: !llvm<"{ float*, [3 x i64] }">) { +// CHECK-LABEL: func @mixed_dealloc(%arg0: !llvm<"{ float*, [3 x i64] }*">) { func @mixed_dealloc(%arg0: memref<?x42x?xf32>) { -// CHECK-NEXT: %0 = llvm.extractvalue %arg0[0 : index] : !llvm<"{ float*, [3 x i64] }"> -// CHECK-NEXT: %1 = llvm.bitcast %0 : !llvm<"float*"> to !llvm<"i8*"> -// CHECK-NEXT: llvm.call @free(%1) : (!llvm<"i8*">) -> () +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [3 x i64] }*"> +// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %[[ld]][0 : index] : !llvm<"{ float*, [3 x i64] }"> +// CHECK-NEXT: %[[ptri8:.*]] = llvm.bitcast %[[ptr]] : !llvm<"float*"> to !llvm<"i8*"> +// CHECK-NEXT: llvm.call @free(%[[ptri8]]) : (!llvm<"i8*">) -> () dealloc %arg0 : memref<?x42x?xf32> // CHECK-NEXT: llvm.return return @@ -75,11 +79,12 @@ func @dynamic_alloc(%arg0: index, %arg1: index) -> memref<?x?xf32> { return %0 : memref<?x?xf32> } -// CHECK-LABEL: func @dynamic_dealloc(%arg0: !llvm<"{ float*, [2 x i64] }">) { +// CHECK-LABEL: func @dynamic_dealloc(%arg0: !llvm<"{ float*, [2 x i64] }*">) { func @dynamic_dealloc(%arg0: memref<?x?xf32>) { -// CHECK-NEXT: %0 = llvm.extractvalue %arg0[0 : index] : !llvm<"{ float*, [2 x i64] }"> -// CHECK-NEXT: %1 = llvm.bitcast %0 : !llvm<"float*"> to !llvm<"i8*"> -// CHECK-NEXT: llvm.call @free(%1) : (!llvm<"i8*">) -> () +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %[[ld]][0 : index] : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[ptri8:.*]] = llvm.bitcast %[[ptr]] : !llvm<"float*"> to !llvm<"i8*"> +// CHECK-NEXT: llvm.call @free(%[[ptri8]]) : (!llvm<"i8*">) -> () dealloc %arg0 : memref<?x?xf32> return } @@ -97,32 +102,35 @@ func @static_alloc() -> memref<32x18xf32> { return %0 : memref<32x18xf32> } -// CHECK-LABEL: func @static_dealloc(%arg0: !llvm<"{ float*, [2 x i64] }">) { +// CHECK-LABEL: func @static_dealloc(%{{.*}}: !llvm<"{ float*, [2 x i64] }*">) { func @static_dealloc(%static: memref<10x8xf32>) { -// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %arg0[0 : index] : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %[[ld]][0 : index] : !llvm<"{ float*, [2 x i64] }"> // CHECK-NEXT: %[[bc:.*]] = llvm.bitcast %[[ptr]] : !llvm<"float*"> to !llvm<"i8*"> // CHECK-NEXT: llvm.call @free(%[[bc]]) : (!llvm<"i8*">) -> () dealloc %static : memref<10x8xf32> return } -// CHECK-LABEL: func @zero_d_load(%arg0: !llvm<"{ float* }">) -> !llvm.float { +// CHECK-LABEL: func @zero_d_load(%{{.*}}: !llvm<"{ float* }*">) -> !llvm.float { func @zero_d_load(%arg0: memref<f32>) -> f32 { -// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %arg0[0 : index] : !llvm<"{ float* }"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float* }*"> +// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %[[ld]][0 : index] : !llvm<"{ float* }"> // CHECK-NEXT: %[[addr:.*]] = llvm.getelementptr %[[ptr]][] : (!llvm<"float*">) -> !llvm<"float*"> -// CHECK-NEXT: %2 = llvm.load %[[addr]] : !llvm<"float*"> +// CHECK-NEXT: %{{.*}} = llvm.load %[[addr]] : !llvm<"float*"> %0 = load %arg0[] : memref<f32> return %0 : f32 } // CHECK-LABEL: func @static_load func @static_load(%static : memref<10x42xf32>, %i : index, %j : index) { -// CHECK-NEXT: %0 = llvm.mlir.constant(10 : index) : !llvm.i64 -// CHECK-NEXT: %1 = llvm.mlir.constant(42 : index) : !llvm.i64 -// CHECK-NEXT: %2 = llvm.mul %arg1, %1 : !llvm.i64 -// CHECK-NEXT: %3 = llvm.add %2, %arg2 : !llvm.i64 -// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %arg0[0 : index] : !llvm<"{ float*, [2 x i64] }"> -// CHECK-NEXT: %[[addr:.*]] = llvm.getelementptr %[[ptr]][%3] : (!llvm<"float*">, !llvm.i64) -> !llvm<"float*"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: llvm.mlir.constant(10 : index) : !llvm.i64 +// CHECK-NEXT: llvm.mlir.constant(42 : index) : !llvm.i64 +// CHECK-NEXT: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64 +// CHECK-NEXT: llvm.add %{{.*}}, %{{.*}} : !llvm.i64 +// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %[[ld]][0 : index] : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[addr:.*]] = llvm.getelementptr %[[ptr]][%{{.*}}] : (!llvm<"float*">, !llvm.i64) -> !llvm<"float*"> // CHECK-NEXT: llvm.load %[[addr]] : !llvm<"float*"> %0 = load %static[%i, %j] : memref<10x42xf32> return @@ -130,33 +138,36 @@ func @static_load(%static : memref<10x42xf32>, %i : index, %j : index) { // CHECK-LABEL: func @mixed_load func @mixed_load(%mixed : memref<42x?xf32>, %i : index, %j : index) { -// CHECK-NEXT: %0 = llvm.mlir.constant(42 : index) : !llvm.i64 -// CHECK-NEXT: %1 = llvm.extractvalue %arg0[1, 1] : !llvm<"{ float*, [2 x i64] }"> -// CHECK-NEXT: %2 = llvm.mul %arg1, %1 : !llvm.i64 -// CHECK-NEXT: %3 = llvm.add %2, %arg2 : !llvm.i64 -// CHECK-NEXT: %4 = llvm.extractvalue %arg0[0 : index] : !llvm<"{ float*, [2 x i64] }"> -// CHECK-NEXT: %5 = llvm.getelementptr %4[%3] : (!llvm<"float*">, !llvm.i64) -> !llvm<"float*"> -// CHECK-NEXT: %6 = llvm.load %5 : !llvm<"float*"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: llvm.mlir.constant(42 : index) : !llvm.i64 +// CHECK-NEXT: llvm.extractvalue %[[ld]][1, 1] : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64 +// CHECK-NEXT: llvm.add %{{.*}}, %{{.*}} : !llvm.i64 +// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %[[ld]][0 : index] : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[addr:.*]] = llvm.getelementptr %[[ptr]][%{{.*}}] : (!llvm<"float*">, !llvm.i64) -> !llvm<"float*"> +// CHECK-NEXT: llvm.load %[[addr]] : !llvm<"float*"> %0 = load %mixed[%i, %j] : memref<42x?xf32> return } // CHECK-LABEL: func @dynamic_load func @dynamic_load(%dynamic : memref<?x?xf32>, %i : index, %j : index) { -// CHECK-NEXT: %0 = llvm.extractvalue %arg0[1, 0] : !llvm<"{ float*, [2 x i64] }"> -// CHECK-NEXT: %1 = llvm.extractvalue %arg0[1, 1] : !llvm<"{ float*, [2 x i64] }"> -// CHECK-NEXT: %2 = llvm.mul %arg1, %1 : !llvm.i64 -// CHECK-NEXT: %3 = llvm.add %2, %arg2 : !llvm.i64 -// CHECK-NEXT: %4 = llvm.extractvalue %arg0[0 : index] : !llvm<"{ float*, [2 x i64] }"> -// CHECK-NEXT: %5 = llvm.getelementptr %4[%3] : (!llvm<"float*">, !llvm.i64) -> !llvm<"float*"> -// CHECK-NEXT: %6 = llvm.load %5 : !llvm<"float*"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: llvm.extractvalue %[[ld]][1, 0] : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: llvm.extractvalue %[[ld]][1, 1] : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64 +// CHECK-NEXT: llvm.add %{{.*}}, %{{.*}} : !llvm.i64 +// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %[[ld]][0 : index] : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[addr:.*]] = llvm.getelementptr %[[ptr]][%{{.*}}] : (!llvm<"float*">, !llvm.i64) -> !llvm<"float*"> +// CHECK-NEXT: llvm.load %[[addr]] : !llvm<"float*"> %0 = load %dynamic[%i, %j] : memref<?x?xf32> return } -// CHECK-LABEL: func @zero_d_store(%arg0: !llvm<"{ float* }">, %arg1: !llvm.float) { +// CHECK-LABEL: func @zero_d_store(%{{.*}}: !llvm<"{ float* }*">, %{{.*}}: !llvm.float) { func @zero_d_store(%arg0: memref<f32>, %arg1: f32) { -// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %arg0[0 : index] : !llvm<"{ float* }"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float* }*"> +// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %[[ld]][0 : index] : !llvm<"{ float* }"> // CHECK-NEXT: %[[addr:.*]] = llvm.getelementptr %[[ptr]][] : (!llvm<"float*">) -> !llvm<"float*"> // CHECK-NEXT: llvm.store %arg1, %[[addr]] : !llvm<"float*"> store %arg1, %arg0[] : memref<f32> @@ -165,118 +176,130 @@ func @zero_d_store(%arg0: memref<f32>, %arg1: f32) { // CHECK-LABEL: func @static_store func @static_store(%static : memref<10x42xf32>, %i : index, %j : index, %val : f32) { -// CHECK-NEXT: %0 = llvm.mlir.constant(10 : index) : !llvm.i64 -// CHECK-NEXT: %1 = llvm.mlir.constant(42 : index) : !llvm.i64 -// CHECK-NEXT: %2 = llvm.mul %arg1, %1 : !llvm.i64 -// CHECK-NEXT: %3 = llvm.add %2, %arg2 : !llvm.i64 -// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %arg0[0 : index] : !llvm<"{ float*, [2 x i64] }"> -// CHECK-NEXT: %[[addr:.*]] = llvm.getelementptr %[[ptr]][%3] : (!llvm<"float*">, !llvm.i64) -> !llvm<"float*"> -// CHECK-NEXT: llvm.store %arg3, %[[addr]] : !llvm<"float*"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: llvm.mlir.constant(10 : index) : !llvm.i64 +// CHECK-NEXT: llvm.mlir.constant(42 : index) : !llvm.i64 +// CHECK-NEXT: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64 +// CHECK-NEXT: llvm.add %{{.*}}, %{{.*}} : !llvm.i64 +// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %[[ld]][0 : index] : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[addr:.*]] = llvm.getelementptr %[[ptr]][%{{.*}}] : (!llvm<"float*">, !llvm.i64) -> !llvm<"float*"> +// CHECK-NEXT: llvm.store %{{.*}}, %[[addr]] : !llvm<"float*"> store %val, %static[%i, %j] : memref<10x42xf32> return } // CHECK-LABEL: func @dynamic_store func @dynamic_store(%dynamic : memref<?x?xf32>, %i : index, %j : index, %val : f32) { -// CHECK-NEXT: %0 = llvm.extractvalue %arg0[1, 0] : !llvm<"{ float*, [2 x i64] }"> -// CHECK-NEXT: %1 = llvm.extractvalue %arg0[1, 1] : !llvm<"{ float*, [2 x i64] }"> -// CHECK-NEXT: %2 = llvm.mul %arg1, %1 : !llvm.i64 -// CHECK-NEXT: %3 = llvm.add %2, %arg2 : !llvm.i64 -// CHECK-NEXT: %4 = llvm.extractvalue %arg0[0 : index] : !llvm<"{ float*, [2 x i64] }"> -// CHECK-NEXT: %5 = llvm.getelementptr %4[%3] : (!llvm<"float*">, !llvm.i64) -> !llvm<"float*"> -// CHECK-NEXT: llvm.store %arg3, %5 : !llvm<"float*"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: llvm.extractvalue %[[ld]][1, 0] : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: llvm.extractvalue %[[ld]][1, 1] : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64 +// CHECK-NEXT: llvm.add %{{.*}}, %{{.*}} : !llvm.i64 +// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %[[ld]][0 : index] : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[addr:.*]] = llvm.getelementptr %[[ptr]][%{{.*}}] : (!llvm<"float*">, !llvm.i64) -> !llvm<"float*"> +// CHECK-NEXT: llvm.store %{{.*}}, %[[addr]] : !llvm<"float*"> store %val, %dynamic[%i, %j] : memref<?x?xf32> return } // CHECK-LABEL: func @mixed_store func @mixed_store(%mixed : memref<42x?xf32>, %i : index, %j : index, %val : f32) { -// CHECK-NEXT: %0 = llvm.mlir.constant(42 : index) : !llvm.i64 -// CHECK-NEXT: %1 = llvm.extractvalue %arg0[1, 1] : !llvm<"{ float*, [2 x i64] }"> -// CHECK-NEXT: %2 = llvm.mul %arg1, %1 : !llvm.i64 -// CHECK-NEXT: %3 = llvm.add %2, %arg2 : !llvm.i64 -// CHECK-NEXT: %4 = llvm.extractvalue %arg0[0 : index] : !llvm<"{ float*, [2 x i64] }"> -// CHECK-NEXT: %5 = llvm.getelementptr %4[%3] : (!llvm<"float*">, !llvm.i64) -> !llvm<"float*"> -// CHECK-NEXT: llvm.store %arg3, %5 : !llvm<"float*"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: llvm.mlir.constant(42 : index) : !llvm.i64 +// CHECK-NEXT: llvm.extractvalue %[[ld]][1, 1] : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64 +// CHECK-NEXT: llvm.add %{{.*}}, %{{.*}} : !llvm.i64 +// CHECK-NEXT: %[[ptr:.*]] = llvm.extractvalue %[[ld]][0 : index] : !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[addr:.*]] = llvm.getelementptr %[[ptr]][%{{.*}}] : (!llvm<"float*">, !llvm.i64) -> !llvm<"float*"> +// CHECK-NEXT: llvm.store %{{.*}}, %[[addr]] : !llvm<"float*"> store %val, %mixed[%i, %j] : memref<42x?xf32> return } // CHECK-LABEL: func @memref_cast_static_to_dynamic func @memref_cast_static_to_dynamic(%static : memref<10x42xf32>) { -// CHECK-NEXT: llvm.bitcast %arg0 : !llvm<"{ float*, [2 x i64] }"> to !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: llvm.bitcast %[[ld]] : !llvm<"{ float*, [2 x i64] }"> to !llvm<"{ float*, [2 x i64] }"> %0 = memref_cast %static : memref<10x42xf32> to memref<?x?xf32> return } // CHECK-LABEL: func @memref_cast_static_to_mixed func @memref_cast_static_to_mixed(%static : memref<10x42xf32>) { -// CHECK-NEXT: llvm.bitcast %arg0 : !llvm<"{ float*, [2 x i64] }"> to !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: llvm.bitcast %[[ld]] : !llvm<"{ float*, [2 x i64] }"> to !llvm<"{ float*, [2 x i64] }"> %0 = memref_cast %static : memref<10x42xf32> to memref<?x42xf32> return } // CHECK-LABEL: func @memref_cast_dynamic_to_static func @memref_cast_dynamic_to_static(%dynamic : memref<?x?xf32>) { -// CHECK-NEXT: llvm.bitcast %arg0 : !llvm<"{ float*, [2 x i64] }"> to !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: llvm.bitcast %[[ld]] : !llvm<"{ float*, [2 x i64] }"> to !llvm<"{ float*, [2 x i64] }"> %0 = memref_cast %dynamic : memref<?x?xf32> to memref<10x12xf32> return } // CHECK-LABEL: func @memref_cast_dynamic_to_mixed func @memref_cast_dynamic_to_mixed(%dynamic : memref<?x?xf32>) { -// CHECK-NEXT: llvm.bitcast %arg0 : !llvm<"{ float*, [2 x i64] }"> to !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: llvm.bitcast %[[ld]] : !llvm<"{ float*, [2 x i64] }"> to !llvm<"{ float*, [2 x i64] }"> %0 = memref_cast %dynamic : memref<?x?xf32> to memref<?x12xf32> return } // CHECK-LABEL: func @memref_cast_mixed_to_dynamic func @memref_cast_mixed_to_dynamic(%mixed : memref<42x?xf32>) { -// CHECK-NEXT: llvm.bitcast %arg0 : !llvm<"{ float*, [2 x i64] }"> to !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: llvm.bitcast %[[ld]] : !llvm<"{ float*, [2 x i64] }"> to !llvm<"{ float*, [2 x i64] }"> %0 = memref_cast %mixed : memref<42x?xf32> to memref<?x?xf32> return } // CHECK-LABEL: func @memref_cast_mixed_to_static func @memref_cast_mixed_to_static(%mixed : memref<42x?xf32>) { -// CHECK-NEXT: llvm.bitcast %arg0 : !llvm<"{ float*, [2 x i64] }"> to !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: llvm.bitcast %[[ld]] : !llvm<"{ float*, [2 x i64] }"> to !llvm<"{ float*, [2 x i64] }"> %0 = memref_cast %mixed : memref<42x?xf32> to memref<42x1xf32> return } // CHECK-LABEL: func @memref_cast_mixed_to_mixed func @memref_cast_mixed_to_mixed(%mixed : memref<42x?xf32>) { -// CHECK-NEXT: llvm.bitcast %arg0 : !llvm<"{ float*, [2 x i64] }"> to !llvm<"{ float*, [2 x i64] }"> +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [2 x i64] }*"> +// CHECK-NEXT: llvm.bitcast %[[ld]] : !llvm<"{ float*, [2 x i64] }"> to !llvm<"{ float*, [2 x i64] }"> %0 = memref_cast %mixed : memref<42x?xf32> to memref<?x1xf32> return } -// CHECK-LABEL: func @mixed_memref_dim(%arg0: !llvm<"{ float*, [5 x i64] }">) +// CHECK-LABEL: func @mixed_memref_dim(%{{.*}}: !llvm<"{ float*, [5 x i64] }*">) func @mixed_memref_dim(%mixed : memref<42x?x?x13x?xf32>) { -// CHECK-NEXT: %0 = llvm.mlir.constant(42 : index) : !llvm.i64 +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [5 x i64] }*"> +// CHECK-NEXT: llvm.mlir.constant(42 : index) : !llvm.i64 %0 = dim %mixed, 0 : memref<42x?x?x13x?xf32> -// CHECK-NEXT: %1 = llvm.extractvalue %arg0[1, 1] : !llvm<"{ float*, [5 x i64] }"> +// CHECK-NEXT: llvm.extractvalue %[[ld]][1, 1] : !llvm<"{ float*, [5 x i64] }"> %1 = dim %mixed, 1 : memref<42x?x?x13x?xf32> -// CHECK-NEXT: %2 = llvm.extractvalue %arg0[1, 2] : !llvm<"{ float*, [5 x i64] }"> +// CHECK-NEXT: llvm.extractvalue %[[ld]][1, 2] : !llvm<"{ float*, [5 x i64] }"> %2 = dim %mixed, 2 : memref<42x?x?x13x?xf32> -// CHECK-NEXT: %3 = llvm.mlir.constant(13 : index) : !llvm.i64 +// CHECK-NEXT: llvm.mlir.constant(13 : index) : !llvm.i64 %3 = dim %mixed, 3 : memref<42x?x?x13x?xf32> -// CHECK-NEXT: %4 = llvm.extractvalue %arg0[1, 4] : !llvm<"{ float*, [5 x i64] }"> +// CHECK-NEXT: llvm.extractvalue %[[ld]][1, 4] : !llvm<"{ float*, [5 x i64] }"> %4 = dim %mixed, 4 : memref<42x?x?x13x?xf32> return } -// CHECK-LABEL: func @static_memref_dim(%arg0: !llvm<"{ float*, [5 x i64] }">) +// CHECK-LABEL: func @static_memref_dim(%{{.*}}: !llvm<"{ float*, [5 x i64] }*">) func @static_memref_dim(%static : memref<42x32x15x13x27xf32>) { -// CHECK-NEXT: %0 = llvm.mlir.constant(42 : index) : !llvm.i64 +// CHECK-NEXT: %[[ld:.*]] = llvm.load %{{.*}} : !llvm<"{ float*, [5 x i64] }*"> +// CHECK-NEXT: llvm.mlir.constant(42 : index) : !llvm.i64 %0 = dim %static, 0 : memref<42x32x15x13x27xf32> -// CHECK-NEXT: %1 = llvm.mlir.constant(32 : index) : !llvm.i64 +// CHECK-NEXT: llvm.mlir.constant(32 : index) : !llvm.i64 %1 = dim %static, 1 : memref<42x32x15x13x27xf32> -// CHECK-NEXT: %2 = llvm.mlir.constant(15 : index) : !llvm.i64 +// CHECK-NEXT: llvm.mlir.constant(15 : index) : !llvm.i64 %2 = dim %static, 2 : memref<42x32x15x13x27xf32> -// CHECK-NEXT: %3 = llvm.mlir.constant(13 : index) : !llvm.i64 +// CHECK-NEXT: llvm.mlir.constant(13 : index) : !llvm.i64 %3 = dim %static, 3 : memref<42x32x15x13x27xf32> -// CHECK-NEXT: %4 = llvm.mlir.constant(27 : index) : !llvm.i64 +// CHECK-NEXT: llvm.mlir.constant(27 : index) : !llvm.i64 %4 = dim %static, 4 : memref<42x32x15x13x27xf32> return } diff --git a/mlir/test/Conversion/StandardToLLVM/standard-to-llvm.mlir b/mlir/test/Conversion/StandardToLLVM/standard-to-llvm.mlir index 3f62fd4056f..7bacabe21ae 100644 --- a/mlir/test/Conversion/StandardToLLVM/standard-to-llvm.mlir +++ b/mlir/test/Conversion/StandardToLLVM/standard-to-llvm.mlir @@ -1,7 +1,9 @@ +// RUN: mlir-opt %s -lower-to-llvm // RUN: mlir-opt %s -lower-to-llvm | FileCheck %s // CHECK-LABEL: func @address_space( -// CHECK: %{{.*}}: !llvm<"{ float addrspace(7)*, [1 x i64] }">) +// CHECK: %{{.*}}: !llvm<"{ float addrspace(7)*, [1 x i64] }*">) +// CHECK: llvm.load %{{.*}} : !llvm<"{ float addrspace(7)*, [1 x i64] }*"> func @address_space(%arg0 : memref<32xf32, (d0) -> (d0), 7>) { %0 = alloc() : memref<32xf32, (d0) -> (d0), 5> %1 = constant 7 : index |

