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 @test_if(%arg0: i1, %arg1: f32) {
5  scf.if %arg0 {
6     %0 = emitc.call "func_const"(%arg1) : (f32) -> i32
7  }
8  return
9}
10// CPP-DEFAULT: void test_if(bool [[V0:[^ ]*]], float [[V1:[^ ]*]]) {
11// CPP-DEFAULT-NEXT: if ([[V0]]) {
12// CPP-DEFAULT-NEXT: int32_t [[V2:[^ ]*]] = func_const([[V1]]);
13// CPP-DEFAULT-NEXT: ;
14// CPP-DEFAULT-NEXT: }
15// CPP-DEFAULT-NEXT: return;
16
17// CPP-DECLTOP: void test_if(bool [[V0:[^ ]*]], float [[V1:[^ ]*]]) {
18// CPP-DECLTOP-NEXT: int32_t [[V2:[^ ]*]];
19// CPP-DECLTOP-NEXT: if ([[V0]]) {
20// CPP-DECLTOP-NEXT: [[V2]] = func_const([[V1]]);
21// CPP-DECLTOP-NEXT: ;
22// CPP-DECLTOP-NEXT: }
23// CPP-DECLTOP-NEXT: return;
24
25
26func @test_if_else(%arg0: i1, %arg1: f32) {
27  scf.if %arg0 {
28    %0 = emitc.call "func_true"(%arg1) : (f32) -> i32
29  } else {
30    %0 = emitc.call "func_false"(%arg1) : (f32) -> i32
31  }
32  return
33}
34// CPP-DEFAULT: void test_if_else(bool [[V0:[^ ]*]], float [[V1:[^ ]*]]) {
35// CPP-DEFAULT-NEXT: if ([[V0]]) {
36// CPP-DEFAULT-NEXT: int32_t [[V2:[^ ]*]] = func_true([[V1]]);
37// CPP-DEFAULT-NEXT: ;
38// CPP-DEFAULT-NEXT: } else {
39// CPP-DEFAULT-NEXT: int32_t [[V3:[^ ]*]] = func_false([[V1]]);
40// CPP-DEFAULT-NEXT: ;
41// CPP-DEFAULT-NEXT: }
42// CPP-DEFAULT-NEXT: return;
43
44// CPP-DECLTOP: void test_if_else(bool [[V0:[^ ]*]], float [[V1:[^ ]*]]) {
45// CPP-DECLTOP-NEXT: int32_t [[V2:[^ ]*]];
46// CPP-DECLTOP-NEXT: int32_t [[V3:[^ ]*]];
47// CPP-DECLTOP-NEXT: if ([[V0]]) {
48// CPP-DECLTOP-NEXT: [[V2]] = func_true([[V1]]);
49// CPP-DECLTOP-NEXT: ;
50// CPP-DECLTOP-NEXT: } else {
51// CPP-DECLTOP-NEXT: [[V3]] = func_false([[V1]]);
52// CPP-DECLTOP-NEXT: ;
53// CPP-DECLTOP-NEXT: }
54// CPP-DECLTOP-NEXT: return;
55
56
57func @test_if_yield(%arg0: i1, %arg1: f32) {
58  %0 = constant 0 : i8
59  %x, %y = scf.if %arg0 -> (i32, f64) {
60    %1 = emitc.call "func_true_1"(%arg1) : (f32) -> i32
61    %2 = emitc.call "func_true_2"(%arg1) : (f32) -> f64
62    scf.yield %1, %2 : i32, f64
63  } else {
64    %1 = emitc.call "func_false_1"(%arg1) : (f32) -> i32
65    %2 = emitc.call "func_false_2"(%arg1) : (f32) -> f64
66    scf.yield %1, %2 : i32, f64
67  }
68  return
69}
70// CPP-DEFAULT: void test_if_yield(bool [[V0:[^ ]*]], float [[V1:[^ ]*]]) {
71// CPP-DEFAULT-NEXT: int8_t [[V2:[^ ]*]] = 0;
72// CPP-DEFAULT-NEXT: int32_t [[V3:[^ ]*]];
73// CPP-DEFAULT-NEXT: double [[V4:[^ ]*]];
74// CPP-DEFAULT-NEXT: if ([[V0]]) {
75// CPP-DEFAULT-NEXT: int32_t [[V5:[^ ]*]] = func_true_1([[V1]]);
76// CPP-DEFAULT-NEXT: double [[V6:[^ ]*]] = func_true_2([[V1]]);
77// CPP-DEFAULT-NEXT: [[V3]] = [[V5]];
78// CPP-DEFAULT-NEXT: [[V4]] = [[V6]];
79// CPP-DEFAULT-NEXT: } else {
80// CPP-DEFAULT-NEXT: int32_t [[V7:[^ ]*]] = func_false_1([[V1]]);
81// CPP-DEFAULT-NEXT: double [[V8:[^ ]*]] = func_false_2([[V1]]);
82// CPP-DEFAULT-NEXT: [[V3]] = [[V7]];
83// CPP-DEFAULT-NEXT: [[V4]] = [[V8]];
84// CPP-DEFAULT-NEXT: }
85// CPP-DEFAULT-NEXT: return;
86
87// CPP-DECLTOP: void test_if_yield(bool [[V0:[^ ]*]], float [[V1:[^ ]*]]) {
88// CPP-DECLTOP-NEXT: int8_t [[V2:[^ ]*]];
89// CPP-DECLTOP-NEXT: int32_t [[V3:[^ ]*]];
90// CPP-DECLTOP-NEXT: double [[V4:[^ ]*]];
91// CPP-DECLTOP-NEXT: int32_t [[V5:[^ ]*]];
92// CPP-DECLTOP-NEXT: double [[V6:[^ ]*]];
93// CPP-DECLTOP-NEXT: int32_t [[V7:[^ ]*]];
94// CPP-DECLTOP-NEXT: double [[V8:[^ ]*]];
95// CPP-DECLTOP-NEXT: [[V2]] = 0;
96// CPP-DECLTOP-NEXT: if ([[V0]]) {
97// CPP-DECLTOP-NEXT: [[V5]] = func_true_1([[V1]]);
98// CPP-DECLTOP-NEXT: [[V6]] = func_true_2([[V1]]);
99// CPP-DECLTOP-NEXT: [[V3]] = [[V5]];
100// CPP-DECLTOP-NEXT: [[V4]] = [[V6]];
101// CPP-DECLTOP-NEXT: } else {
102// CPP-DECLTOP-NEXT: [[V7]] = func_false_1([[V1]]);
103// CPP-DECLTOP-NEXT: [[V8]] = func_false_2([[V1]]);
104// CPP-DECLTOP-NEXT: [[V3]] = [[V7]];
105// CPP-DECLTOP-NEXT: [[V4]] = [[V8]];
106// CPP-DECLTOP-NEXT: }
107// CPP-DECLTOP-NEXT: return;
108