Skip to content

Commit 95c2d79

Browse files
author
Simon Camphausen
authored
[mlir][EmitC] memref-to-emitc: insert conversion_casts (#114204)
Add materializations to the conversion pass, such that types of non-converted operands are legalized.
1 parent 4ba623f commit 95c2d79

File tree

2 files changed

+34
-14
lines changed

2 files changed

+34
-14
lines changed

mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitCPass.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,19 @@ struct ConvertMemRefToEmitCPass
4040

4141
populateMemRefToEmitCTypeConversion(converter);
4242

43+
auto materializeAsUnrealizedCast = [](OpBuilder &builder, Type resultType,
44+
ValueRange inputs,
45+
Location loc) -> Value {
46+
if (inputs.size() != 1)
47+
return Value();
48+
49+
return builder.create<UnrealizedConversionCastOp>(loc, resultType, inputs)
50+
.getResult(0);
51+
};
52+
53+
converter.addSourceMaterialization(materializeAsUnrealizedCast);
54+
converter.addTargetMaterialization(materializeAsUnrealizedCast);
55+
4356
RewritePatternSet patterns(&getContext());
4457
populateMemRefToEmitCConversionPatterns(patterns, converter);
4558

mlir/test/Conversion/MemRefToEmitC/memref-to-emitc.mlir

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,35 @@
11
// RUN: mlir-opt -convert-memref-to-emitc %s -split-input-file | FileCheck %s
22

3-
// CHECK-LABEL: memref_store
4-
// CHECK-SAME: %[[v:.*]]: f32, %[[i:.*]]: index, %[[j:.*]]: index
5-
func.func @memref_store(%v : f32, %i: index, %j: index) {
6-
// CHECK-NEXT: %[[ALLOCA:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.array<4x8xf32>
7-
%0 = memref.alloca() : memref<4x8xf32>
3+
// CHECK-LABEL: alloca()
4+
func.func @alloca() {
5+
// CHECK-NEXT: %[[ALLOCA:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.array<2xf32>
6+
%0 = memref.alloca() : memref<2xf32>
7+
return
8+
}
89

9-
// CHECK-NEXT: %[[SUBSCRIPT:.*]] = emitc.subscript %[[ALLOCA]][%[[i]], %[[j]]] : (!emitc.array<4x8xf32>, index, index) -> !emitc.lvalue<f32>
10+
// -----
11+
12+
// CHECK-LABEL: memref_store
13+
// CHECK-SAME: %[[buff:.*]]: memref<4x8xf32>, %[[v:.*]]: f32, %[[i:.*]]: index, %[[j:.*]]: index
14+
func.func @memref_store(%buff : memref<4x8xf32>, %v : f32, %i: index, %j: index) {
15+
// CHECK-NEXT: %[[BUFFER:.*]] = builtin.unrealized_conversion_cast %[[buff]] : memref<4x8xf32> to !emitc.array<4x8xf32>
16+
17+
// CHECK-NEXT: %[[SUBSCRIPT:.*]] = emitc.subscript %[[BUFFER]][%[[i]], %[[j]]] : (!emitc.array<4x8xf32>, index, index) -> !emitc.lvalue<f32>
1018
// CHECK-NEXT: emitc.assign %[[v]] : f32 to %[[SUBSCRIPT]] : <f32>
11-
memref.store %v, %0[%i, %j] : memref<4x8xf32>
19+
memref.store %v, %buff[%i, %j] : memref<4x8xf32>
1220
return
1321
}
1422

1523
// -----
1624

1725
// CHECK-LABEL: memref_load
18-
// CHECK-SAME: %[[i:.*]]: index, %[[j:.*]]: index
19-
func.func @memref_load(%i: index, %j: index) -> f32 {
20-
// CHECK-NEXT: %[[ALLOCA:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.array<4x8xf32>
21-
%0 = memref.alloca() : memref<4x8xf32>
22-
23-
// CHECK-NEXT: %[[SUBSCRIPT:.*]] = emitc.subscript %[[ALLOCA]][%[[i]], %[[j]]] : (!emitc.array<4x8xf32>, index, index) -> !emitc.lvalue<f32>
26+
// CHECK-SAME: %[[buff:.*]]: memref<4x8xf32>, %[[i:.*]]: index, %[[j:.*]]: index
27+
func.func @memref_load(%buff : memref<4x8xf32>, %i: index, %j: index) -> f32 {
28+
// CHECK-NEXT: %[[BUFFER:.*]] = builtin.unrealized_conversion_cast %[[buff]] : memref<4x8xf32> to !emitc.array<4x8xf32>
29+
30+
// CHECK-NEXT: %[[SUBSCRIPT:.*]] = emitc.subscript %[[BUFFER]][%[[i]], %[[j]]] : (!emitc.array<4x8xf32>, index, index) -> !emitc.lvalue<f32>
2431
// CHECK-NEXT: %[[LOAD:.*]] = emitc.load %[[SUBSCRIPT]] : <f32>
25-
%1 = memref.load %0[%i, %j] : memref<4x8xf32>
32+
%1 = memref.load %buff[%i, %j] : memref<4x8xf32>
2633
// CHECK-NEXT: return %[[LOAD]] : f32
2734
return %1 : f32
2835
}

0 commit comments

Comments
 (0)