169 lines · plain
1// RUN: mlir-translate -mlir-to-cpp %s | FileCheck %s -check-prefix=CPP-DEFAULT2 3 4// CPP-DEFAULT-LABEL: void emitc_do(5// CPP-DEFAULT: int32_t* [[VAL_1:v[0-9]+]]) {6// CPP-DEFAULT: int32_t [[VAL_2:v[0-9]+]] = 0;7// CPP-DEFAULT: do {8// CPP-DEFAULT: printf("%d", *[[VAL_1]]);9// CPP-DEFAULT: int32_t [[VAL_3:v[0-9]+]] = [[VAL_2]];10// CPP-DEFAULT: int32_t [[VAL_4:v[0-9]+]] = [[VAL_3]] + 1;11// CPP-DEFAULT: [[VAL_2]] = [[VAL_4]];12// CPP-DEFAULT: } while ([[VAL_2]] <= 10);13// CPP-DEFAULT: return;14// CPP-DEFAULT: }15 16emitc.func @emitc_do(%arg0 : !emitc.ptr<i32>) {17 %var = "emitc.variable"() <{value = 0 : i32}> : () -> !emitc.lvalue<i32>18 %0 = literal "10" : i3219 %1 = literal "1" : i3220 21 do {22 verbatim "printf(\"%d\", *{});" args %arg0 : !emitc.ptr<i32>23 %var_load = load %var : <i32>24 %tmp_add = add %var_load, %1 : (i32, i32) -> i3225 "emitc.assign"(%var, %tmp_add) : (!emitc.lvalue<i32>, i32) -> ()26 } while {27 %r = expression %var, %0 : (!emitc.lvalue<i32>, i32) -> i1 {28 %var_load = load %var : <i32>29 %cmp = cmp le, %var_load, %0 : (i32, i32) -> i130 yield %cmp : i131 }32 33 yield %r : i134 }35 36 return37}38 39 40// CPP-DEFAULT-LABEL: void emitc_do_with_expression(41// CPP-DEFAULT: int32_t* [[VAL_1:v[0-9]+]]) {42// CPP-DEFAULT: int32_t [[VAL_2:v[0-9]+]] = 0;43// CPP-DEFAULT: int32_t [[VAL_3:v[0-9]+]] = 10 + 1;44// CPP-DEFAULT: do {45// CPP-DEFAULT: printf("%d", *[[VAL_1]]);46// CPP-DEFAULT: int32_t [[VAL_4:v[0-9]+]] = [[VAL_2]];47// CPP-DEFAULT: int32_t [[VAL_5:v[0-9]+]] = [[VAL_4]] + 1;48// CPP-DEFAULT: [[VAL_2]] = [[VAL_5]];49// CPP-DEFAULT: } while ([[VAL_2]] <= [[VAL_3]]);50// CPP-DEFAULT: return;51// CPP-DEFAULT: }52 53emitc.func @emitc_do_with_expression(%arg0 : !emitc.ptr<i32>) {54 %var = "emitc.variable"() <{value = 0 : i32}> : () -> !emitc.lvalue<i32>55 %0 = literal "10" : i3256 %1 = literal "1" : i3257 58 %add = expression %0, %1 : (i32, i32) -> i32 {59 %add = add %0, %1 : (i32, i32) -> i3260 yield %add : i3261 }62 63 do {64 verbatim "printf(\"%d\", *{});" args %arg0 : !emitc.ptr<i32>65 %var_load = load %var : <i32>66 %tmp_add = add %var_load, %1 : (i32, i32) -> i3267 "emitc.assign"(%var, %tmp_add) : (!emitc.lvalue<i32>, i32) -> ()68 } while {69 %r = expression %var, %add : (!emitc.lvalue<i32>, i32) -> i1 {70 %var_load = load %var : <i32>71 %cmp = cmp le, %var_load, %add : (i32, i32) -> i172 yield %cmp : i173 }74 75 yield %r : i176 }77 78 return79}80 81 82// CPP-DEFAULT-LABEL: void emitc_double_do()83// CPP-DEFAULT: int32_t [[VAL_1:v[0-9]+]] = 0;84// CPP-DEFAULT: int32_t [[VAL_2:v[0-9]+]] = 0;85// CPP-DEFAULT: do {86// CPP-DEFAULT: int32_t [[VAL_3:v[0-9]+]] = [[VAL_1]];87// CPP-DEFAULT: do {88// CPP-DEFAULT: int32_t [[VAL_4:v[0-9]+]] = [[VAL_2]];89// CPP-DEFAULT: printf("i = %d, j = %d", [[VAL_3]], [[VAL_4]]);90// CPP-DEFAULT: int32_t [[VAL_5:v[0-9]+]] = [[VAL_4]] + 1;91// CPP-DEFAULT: [[VAL_2]] = [[VAL_5]];92// CPP-DEFAULT: } while ([[VAL_2]] <= 5);93// CPP-DEFAULT: int32_t [[VAL_6:v[0-9]+]] = [[VAL_3]] + 1;94// CPP-DEFAULT: [[VAL_1]] = [[VAL_6]];95// CPP-DEFAULT: } while ([[VAL_1]] <= 3);96// CPP-DEFAULT: return;97// CPP-DEFAULT: }98 99emitc.func @emitc_double_do() {100 %var_1 = "emitc.variable"() <{value = 0 : i32}> : () -> !emitc.lvalue<i32>101 %var_2 = "emitc.variable"() <{value = 0 : i32}> : () -> !emitc.lvalue<i32>102 103 %step = literal "1" : i32104 %end_1 = literal "3" : i32105 %end_2 = literal "5" : i32106 107 do {108 %var_1_load = load %var_1 : <i32>109 110 do {111 %var_2_load = load %var_2 : <i32>112 verbatim "printf(\"i = %d, j = %d\", {}, {});" args %var_1_load, %var_2_load : i32, i32113 %tmp_add = add %var_2_load, %step : (i32, i32) -> i32114 "emitc.assign"(%var_2, %tmp_add) : (!emitc.lvalue<i32>, i32) -> ()115 } while {116 %r = expression %var_2, %end_2 : (!emitc.lvalue<i32>, i32) -> i1 {117 %var_2_load = load %var_2 : <i32>118 %cmp = cmp le, %var_2_load, %end_2 : (i32, i32) -> i1119 yield %cmp : i1120 }121 122 yield %r : i1123 }124 125 %tmp_add = add %var_1_load, %step : (i32, i32) -> i32126 "emitc.assign"(%var_1, %tmp_add) : (!emitc.lvalue<i32>, i32) -> ()127 } while {128 %r = expression %var_1, %end_1 : (!emitc.lvalue<i32>, i32) -> i1 {129 %var_1_load = load %var_1 : <i32>130 %cmp = cmp le, %var_1_load, %end_1 : (i32, i32) -> i1131 yield %cmp : i1132 }133 134 yield %r : i1135 }136 137 return138}139 140 141// CPP-DEFAULT-LABEL: bool payload_do_with_empty_body(142// CPP-DEFAULT: int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]]) {143// CPP-DEFAULT: bool [[VAL_3:v[0-9]+]] = [[VAL_1]] < [[VAL_2]];144// CPP-DEFAULT: return [[VAL_3]];145// CPP-DEFAULT: }146// CPP-DEFAULT: void emitc_do_with_empty_body(147// CPP-DEFAULT: int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]]) {148// CPP-DEFAULT: do {149// CPP-DEFAULT: } while (payload_do_with_empty_body([[VAL_1]], [[VAL_2]]));150// CPP-DEFAULT: return;151// CPP-DEFAULT: }152 153emitc.func @payload_do_with_empty_body(%1 : i32, %2 : i32) -> i1 {154 %cmp = emitc.cmp lt, %1, %2 : (i32, i32) -> i1155 return %cmp : i1156}157func.func @emitc_do_with_empty_body(%arg1 : i32, %arg2 : i32) {158 emitc.do {159 } while {160 %r = emitc.expression %arg1, %arg2 : (i32, i32) -> i1 {161 %call = emitc.call @payload_do_with_empty_body(%arg1, %arg2) : (i32, i32) -> i1162 emitc.yield %call : i1163 }164 emitc.yield %r: i1165 }166 167 return168}169