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