xref: /llvm-project/mlir/test/Target/Cpp/subscript.mlir (revision e47b507562624bf291ab2515699d39c2669b6131)
1// RUN: mlir-translate -mlir-to-cpp %s | FileCheck %s -check-prefix=CPP-DEFAULT
2// RUN: mlir-translate -mlir-to-cpp -declare-variables-at-top %s | FileCheck %s -check-prefix=CPP-DECLTOP
3
4func.func @load_store_array(%arg0: !emitc.array<4x8xf32>, %arg1: !emitc.array<3x5xf32>, %arg2: index, %arg3: index) {
5  %0 = emitc.subscript %arg0[%arg2, %arg3] : (!emitc.array<4x8xf32>, index, index) -> !emitc.lvalue<f32>
6  %1 = emitc.subscript %arg1[%arg2, %arg3] : (!emitc.array<3x5xf32>, index, index) -> !emitc.lvalue<f32>
7  %2 = emitc.load %0 : <f32>
8  emitc.assign %2 : f32 to %1 : !emitc.lvalue<f32>
9  return
10}
11// CPP-DEFAULT: void load_store_array(float [[ARR1:[^ ]*]][4][8], float [[ARR2:[^ ]*]][3][5],
12// CPP-DEFAULT-SAME:            size_t [[I:[^ ]*]], size_t [[J:[^ ]*]])
13// CPP-DEFAULT-NEXT: float [[VAL:[^ ]*]] = [[ARR1]][[[I]]][[[J]]];
14// CPP-DEFAULT-NEXT: [[ARR2]][[[I]]][[[J]]] = [[VAL]];
15
16// CPP-DECLTOP: void load_store_array(float [[ARR1:[^ ]*]][4][8], float [[ARR2:[^ ]*]][3][5],
17// CPP-DECLTOP-SAME:            size_t [[I:[^ ]*]], size_t [[J:[^ ]*]])
18// CPP-DECLTOP-NEXT: float [[VAL:[^ ]*]];
19// CPP-DECLTOP-NEXT: [[VAL]] = [[ARR1]][[[I]]][[[J]]];
20// CPP-DECLTOP-NEXT: [[ARR2]][[[I]]][[[J]]] = [[VAL]];
21
22func.func @load_store_pointer(%arg0: !emitc.ptr<f32>, %arg1: !emitc.ptr<f32>, %arg2: index, %arg3: index) {
23  %0 = emitc.subscript %arg0[%arg2] : (!emitc.ptr<f32>, index) -> !emitc.lvalue<f32>
24  %1 = emitc.subscript %arg1[%arg3] : (!emitc.ptr<f32>, index) -> !emitc.lvalue<f32>
25  %2 = emitc.load %0 : <f32>
26  emitc.assign %2 : f32 to %1 : <f32>
27  return
28}
29// CPP-DEFAULT: void load_store_pointer(float* [[PTR1:[^ ]*]], float* [[PTR2:[^ ]*]],
30// CPP-DEFAULT-SAME:            size_t [[I:[^ ]*]], size_t [[J:[^ ]*]])
31// CPP-DEFAULT-NEXT: float [[VAL:[^ ]*]] = [[PTR1]][[[I]]];
32// CPP-DEFAULT-NEXT: [[PTR2]][[[J]]] = [[VAL]];
33
34// CPP-DECLTOP: void load_store_pointer(float* [[PTR1:[^ ]*]], float* [[PTR2:[^ ]*]],
35// CPP-DECLTOP-SAME:            size_t [[I:[^ ]*]], size_t [[J:[^ ]*]])
36// CPP-DECLTOP-NEXT: float [[VAL:[^ ]*]];
37// CPP-DECLTOP-NEXT: [[VAL]] = [[PTR1]][[[I]]];
38// CPP-DECLTOP-NEXT: [[PTR2]][[[J]]] = [[VAL]];
39
40func.func @load_store_opaque(%arg0: !emitc.opaque<"std::map<char, int>">, %arg1: !emitc.opaque<"std::map<char, int>">, %arg2: !emitc.opaque<"char">, %arg3: !emitc.opaque<"char">) {
41  %0 = emitc.subscript %arg0[%arg2] : (!emitc.opaque<"std::map<char, int>">, !emitc.opaque<"char">) -> !emitc.lvalue<!emitc.opaque<"int">>
42  %1 = emitc.subscript %arg1[%arg3] : (!emitc.opaque<"std::map<char, int>">, !emitc.opaque<"char">) -> !emitc.lvalue<!emitc.opaque<"int">>
43  %2 = emitc.load %0 : <!emitc.opaque<"int">>
44  emitc.assign %2 : !emitc.opaque<"int"> to %1 : <!emitc.opaque<"int">>
45  return
46}
47// CPP-DEFAULT: void load_store_opaque(std::map<char, int> [[MAP1:[^ ]*]], std::map<char, int> [[MAP2:[^ ]*]],
48// CPP-DEFAULT-SAME:            char [[I:[^ ]*]], char [[J:[^ ]*]])
49// CPP-DEFAULT-NEXT: int [[VAL:[^ ]*]] = [[MAP1]][[[I]]];
50// CPP-DEFAULT-NEXT: [[MAP2]][[[J]]] = [[VAL]];
51
52// CPP-DECLTOP: void load_store_opaque(std::map<char, int> [[MAP1:[^ ]*]], std::map<char, int> [[MAP2:[^ ]*]],
53// CPP-DECLTOP-SAME:            char [[I:[^ ]*]], char [[J:[^ ]*]])
54// CPP-DECLTOP-NEXT: int [[VAL:[^ ]*]];
55// CPP-DECLTOP-NEXT: [[VAL]] = [[MAP1]][[[I]]];
56// CPP-DECLTOP-NEXT: [[MAP2]][[[J]]] = [[VAL]];
57
58emitc.func @func1(%arg0 : f32) {
59  emitc.return
60}
61
62emitc.func @call_arg(%arg0: !emitc.array<4x8xf32>, %i: i32, %j: i16,
63                     %k: i8) {
64  %0 = emitc.subscript %arg0[%i, %j] : (!emitc.array<4x8xf32>, i32, i16) -> !emitc.lvalue<f32>
65  %1 = emitc.subscript %arg0[%j, %k] : (!emitc.array<4x8xf32>, i16, i8) -> !emitc.lvalue<f32>
66
67  %2 = emitc.load %0 : <f32>
68  emitc.call @func1 (%2) : (f32) -> ()
69  %3 = emitc.load %1 : <f32>
70  emitc.call_opaque "func2" (%3) : (f32) -> ()
71  %4 = emitc.load %0 : <f32>
72  %5 = emitc.load %1 : <f32>
73  emitc.call_opaque "func3" (%4, %5) { args = [1 : index, 0 : index] } : (f32, f32) -> ()
74  emitc.return
75}
76// CPP-DEFAULT: void call_arg(float [[ARR1:[^ ]*]][4][8], int32_t [[I:[^ ]*]],
77// CPP-DEFAULT-SAME:          int16_t [[J:[^ ]*]], int8_t [[K:[^ ]*]])
78// CPP-DEFAULT-NEXT: float [[VAL0:[^ ]*]] = [[ARR1]][[[I]]][[[J]]];
79// CPP-DEFAULT-NEXT: func1([[VAL0]]);
80// CPP-DEFAULT-NEXT: float [[VAL1:[^ ]*]] = [[ARR1]][[[J]]][[[K]]];
81// CPP-DEFAULT-NEXT: func2([[VAL1]]);
82// CPP-DEFAULT-NEXT: float [[VAL2:[^ ]*]] = [[ARR1]][[[I]]][[[J]]];
83// CPP-DEFAULT-NEXT: float [[VAL3:[^ ]*]] = [[ARR1]][[[J]]][[[K]]];
84// CPP-DEFAULT-NEXT: func3([[VAL3]], [[VAL2]]);
85
86// CPP-DECLTOP: void call_arg(float [[ARR1:[^ ]*]][4][8], int32_t [[I:[^ ]*]],
87// CPP-DECLTOP-SAME:          int16_t [[J:[^ ]*]], int8_t [[K:[^ ]*]])
88// CPP-DECLTOP-NEXT: float [[VAL0:[^ ]*]];
89// CPP-DECLTOP-NEXT: float [[VAL1:[^ ]*]];
90// CPP-DECLTOP-NEXT: float [[VAL2:[^ ]*]];
91// CPP-DECLTOP-NEXT: float [[VAL3:[^ ]*]];
92// CPP-DECLTOP-NEXT: [[VAL0]] = [[ARR1]][[[I]]][[[J]]];
93// CPP-DECLTOP-NEXT: func1([[VAL0]]);
94// CPP-DECLTOP-NEXT: [[VAL1]] = [[ARR1]][[[J]]][[[K]]];
95// CPP-DECLTOP-NEXT: func2([[VAL1]]);
96// CPP-DECLTOP-NEXT: [[VAL2]] = [[ARR1]][[[I]]][[[J]]];
97// CPP-DECLTOP-NEXT: [[VAL3]] = [[ARR1]][[[J]]][[[K]]];
98// CPP-DECLTOP-NEXT: func3([[VAL3]], [[VAL2]]);
99