1// RUN: mlir-translate -mlir-to-cpp %s | FileCheck --match-full-lines %s -check-prefix=CPP-DEFAULT 2// RUN: mlir-translate -mlir-to-cpp -declare-variables-at-top %s | FileCheck --match-full-lines %s -check-prefix=CPP-DECLTOP 3 4func.func @test_for(%arg0 : index, %arg1 : index, %arg2 : index) { 5 %lb = emitc.expression : index { 6 %a = emitc.add %arg0, %arg1 : (index, index) -> index 7 emitc.yield %a : index 8 } 9 %ub = emitc.expression : index { 10 %a = emitc.mul %arg1, %arg2 : (index, index) -> index 11 emitc.yield %a : index 12 } 13 %step = emitc.expression : index { 14 %a = emitc.div %arg0, %arg2 : (index, index) -> index 15 emitc.yield %a : index 16 } 17 emitc.for %i0 = %lb to %ub step %step { 18 %0 = emitc.call_opaque "f"() : () -> i32 19 } 20 return 21} 22// CPP-DEFAULT: void test_for(size_t [[V1:[^ ]*]], size_t [[V2:[^ ]*]], size_t [[V3:[^ ]*]]) { 23// CPP-DEFAULT-NEXT: for (size_t [[ITER:[^ ]*]] = [[V1]] + [[V2]]; [[ITER]] < ([[V2]] * [[V3]]); [[ITER]] += [[V1]] / [[V3]]) { 24// CPP-DEFAULT-NEXT: int32_t [[V4:[^ ]*]] = f(); 25// CPP-DEFAULT-NEXT: } 26// CPP-DEFAULT-NEXT: return; 27 28// CPP-DECLTOP: void test_for(size_t [[V1:[^ ]*]], size_t [[V2:[^ ]*]], size_t [[V3:[^ ]*]]) { 29// CPP-DECLTOP-NEXT: int32_t [[V4:[^ ]*]]; 30// CPP-DECLTOP-NEXT: for (size_t [[ITER:[^ ]*]] = [[V1]] + [[V2]]; [[ITER]] < ([[V2]] * [[V3]]); [[ITER]] += [[V1]] / [[V3]]) { 31// CPP-DECLTOP-NEXT: [[V4]] = f(); 32// CPP-DECLTOP-NEXT: } 33// CPP-DECLTOP-NEXT: return; 34 35func.func @test_for_yield() { 36 %start = "emitc.constant"() <{value = 0 : index}> : () -> index 37 %stop = "emitc.constant"() <{value = 10 : index}> : () -> index 38 %step = "emitc.constant"() <{value = 1 : index}> : () -> index 39 40 %s0 = "emitc.constant"() <{value = 0 : i32}> : () -> i32 41 %p0 = "emitc.constant"() <{value = 1.0 : f32}> : () -> f32 42 43 %0 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<i32> 44 %1 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<f32> 45 %2 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<i32> 46 %3 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<f32> 47 emitc.assign %s0 : i32 to %2 : !emitc.lvalue<i32> 48 emitc.assign %p0 : f32 to %3 : !emitc.lvalue<f32> 49 emitc.for %iter = %start to %stop step %step { 50 %4 = emitc.load %2 : !emitc.lvalue<i32> 51 %sn = emitc.call_opaque "add"(%4, %iter) : (i32, index) -> i32 52 %5 = emitc.load %3 : !emitc.lvalue<f32> 53 %pn = emitc.call_opaque "mul"(%5, %iter) : (f32, index) -> f32 54 emitc.assign %sn : i32 to %2 : !emitc.lvalue<i32> 55 emitc.assign %pn : f32 to %3 : !emitc.lvalue<f32> 56 emitc.yield 57 } 58 %6 = emitc.load %2 : !emitc.lvalue<i32> 59 emitc.assign %6 : i32 to %0 : !emitc.lvalue<i32> 60 %7 = emitc.load %3 : !emitc.lvalue<f32> 61 emitc.assign %7 : f32 to %1 : !emitc.lvalue<f32> 62 63 return 64} 65// CPP-DEFAULT: void test_for_yield() { 66// CPP-DEFAULT-NEXT: size_t [[START:[^ ]*]] = 0; 67// CPP-DEFAULT-NEXT: size_t [[STOP:[^ ]*]] = 10; 68// CPP-DEFAULT-NEXT: size_t [[STEP:[^ ]*]] = 1; 69// CPP-DEFAULT-NEXT: int32_t [[S0:[^ ]*]] = 0; 70// CPP-DEFAULT-NEXT: float [[P0:[^ ]*]] = 1.000000000e+00f; 71// CPP-DEFAULT-NEXT: int32_t [[SE:[^ ]*]]; 72// CPP-DEFAULT-NEXT: float [[PE:[^ ]*]]; 73// CPP-DEFAULT-NEXT: int32_t [[SI:[^ ]*]]; 74// CPP-DEFAULT-NEXT: float [[PI:[^ ]*]]; 75// CPP-DEFAULT-NEXT: [[SI:[^ ]*]] = [[S0]]; 76// CPP-DEFAULT-NEXT: [[PI:[^ ]*]] = [[P0]]; 77// CPP-DEFAULT-NEXT: for (size_t [[ITER:[^ ]*]] = [[START]]; [[ITER]] < [[STOP]]; [[ITER]] += [[STEP]]) { 78// CPP-DEFAULT-NEXT: int32_t [[SI_LOAD:[^ ]*]] = [[SI]]; 79// CPP-DEFAULT-NEXT: int32_t [[SN:[^ ]*]] = add([[SI_LOAD]], [[ITER]]); 80// CPP-DEFAULT-NEXT: float [[PI_LOAD:[^ ]*]] = [[PI]]; 81// CPP-DEFAULT-NEXT: float [[PN:[^ ]*]] = mul([[PI_LOAD]], [[ITER]]); 82// CPP-DEFAULT-NEXT: [[SI]] = [[SN]]; 83// CPP-DEFAULT-NEXT: [[PI]] = [[PN]]; 84// CPP-DEFAULT-NEXT: } 85// CPP-DEFAULT-NEXT: int32_t [[SI_LOAD2:[^ ]*]] = [[SI]]; 86// CPP-DEFAULT-NEXT: [[SE]] = [[SI_LOAD2]]; 87// CPP-DEFAULT-NEXT: float [[PI_LOAD2:[^ ]*]] = [[PI]]; 88// CPP-DEFAULT-NEXT: [[PE]] = [[PI_LOAD2]]; 89// CPP-DEFAULT-NEXT: return; 90 91// CPP-DECLTOP: void test_for_yield() { 92// CPP-DECLTOP-NEXT: size_t [[START:[^ ]*]]; 93// CPP-DECLTOP-NEXT: size_t [[STOP:[^ ]*]]; 94// CPP-DECLTOP-NEXT: size_t [[STEP:[^ ]*]]; 95// CPP-DECLTOP-NEXT: int32_t [[S0:[^ ]*]]; 96// CPP-DECLTOP-NEXT: float [[P0:[^ ]*]]; 97// CPP-DECLTOP-NEXT: int32_t [[SE:[^ ]*]]; 98// CPP-DECLTOP-NEXT: float [[PE:[^ ]*]]; 99// CPP-DECLTOP-NEXT: int32_t [[SI:[^ ]*]]; 100// CPP-DECLTOP-NEXT: float [[PI:[^ ]*]]; 101// CPP-DECLTOP-NEXT: int32_t [[SI_LOAD:[^ ]*]]; 102// CPP-DECLTOP-NEXT: int32_t [[SN:[^ ]*]]; 103// CPP-DECLTOP-NEXT: float [[PI_LOAD:[^ ]*]]; 104// CPP-DECLTOP-NEXT: float [[PN:[^ ]*]]; 105// CPP-DECLTOP-NEXT: int32_t [[SI_LOAD2:[^ ]*]]; 106// CPP-DECLTOP-NEXT: float [[PI_LOAD2:[^ ]*]]; 107// CPP-DECLTOP-NEXT: [[START]] = 0; 108// CPP-DECLTOP-NEXT: [[STOP]] = 10; 109// CPP-DECLTOP-NEXT: [[STEP]] = 1; 110// CPP-DECLTOP-NEXT: [[S0]] = 0; 111// CPP-DECLTOP-NEXT: [[P0]] = 1.000000000e+00f; 112// CPP-DECLTOP-NEXT: ; 113// CPP-DECLTOP-NEXT: ; 114// CPP-DECLTOP-NEXT: ; 115// CPP-DECLTOP-NEXT: ; 116// CPP-DECLTOP-NEXT: [[SI]] = [[S0]]; 117// CPP-DECLTOP-NEXT: [[PI]] = [[P0]]; 118// CPP-DECLTOP-NEXT: for (size_t [[ITER:[^ ]*]] = [[START]]; [[ITER]] < [[STOP]]; [[ITER]] += [[STEP]]) { 119// CPP-DECLTOP-NEXT: [[SI_LOAD]] = [[SI]]; 120// CPP-DECLTOP-NEXT: [[SN]] = add([[SI_LOAD]], [[ITER]]); 121// CPP-DECLTOP-NEXT: [[PI_LOAD]] = [[PI]]; 122// CPP-DECLTOP-NEXT: [[PN]] = mul([[PI_LOAD]], [[ITER]]); 123// CPP-DECLTOP-NEXT: [[SI]] = [[SN]]; 124// CPP-DECLTOP-NEXT: [[PI]] = [[PN]]; 125// CPP-DECLTOP-NEXT: } 126// CPP-DECLTOP-NEXT: [[SI_LOAD2]] = [[SI]]; 127// CPP-DECLTOP-NEXT: [[SE]] = [[SI_LOAD2]]; 128// CPP-DECLTOP-NEXT: [[PI_LOAD2]] = [[PI]]; 129// CPP-DECLTOP-NEXT: [[PE]] = [[PI_LOAD2]]; 130// CPP-DECLTOP-NEXT: return; 131 132func.func @test_for_yield_2() { 133 %start = emitc.literal "0" : index 134 %stop = emitc.literal "10" : index 135 %step = emitc.literal "1" : index 136 137 %s0 = emitc.literal "0" : i32 138 %p0 = emitc.literal "M_PI" : f32 139 140 %0 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<i32> 141 %1 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<f32> 142 %2 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<i32> 143 %3 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<f32> 144 emitc.assign %s0 : i32 to %2 : !emitc.lvalue<i32> 145 emitc.assign %p0 : f32 to %3 : !emitc.lvalue<f32> 146 emitc.for %iter = %start to %stop step %step { 147 %4 = emitc.load %2 : !emitc.lvalue<i32> 148 %sn = emitc.call_opaque "add"(%4, %iter) : (i32, index) -> i32 149 %5 = emitc.load %3 : !emitc.lvalue<f32> 150 %pn = emitc.call_opaque "mul"(%5, %iter) : (f32, index) -> f32 151 emitc.assign %sn : i32 to %2 : !emitc.lvalue<i32> 152 emitc.assign %pn : f32 to %3 : !emitc.lvalue<f32> 153 emitc.yield 154 } 155 %6 = emitc.load %2 : !emitc.lvalue<i32> 156 emitc.assign %6 : i32 to %0 : !emitc.lvalue<i32> 157 %7 = emitc.load %3 : !emitc.lvalue<f32> 158 emitc.assign %7 : f32 to %1 : !emitc.lvalue<f32> 159 160 return 161} 162// CPP-DEFAULT: void test_for_yield_2() { 163// CPP-DEFAULT: {{.*}}= M_PI; 164// CPP-DEFAULT: for (size_t [[IN:.*]] = 0; [[IN]] < 10; [[IN]] += 1) { 165