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_for(%arg0 : index, %arg1 : index, %arg2 : index) {
5  scf.for %i0 = %arg0 to %arg1 step %arg2 {
6    %0 = emitc.call "f"() : () -> i32
7  }
8  return
9}
10// CPP-DEFAULT: void test_for(size_t [[START:[^ ]*]], size_t [[STOP:[^ ]*]], size_t [[STEP:[^ ]*]]) {
11// CPP-DEFAULT-NEXT: for (size_t [[ITER:[^ ]*]] = [[START]]; [[ITER]] < [[STOP]]; [[ITER]] += [[STEP]]) {
12// CPP-DEFAULT-NEXT: int32_t [[V4:[^ ]*]] = f();
13// CPP-DEFAULT-NEXT: }
14// CPP-DEFAULT-NEXT: return;
15
16// CPP-DECLTOP: void test_for(size_t [[START:[^ ]*]], size_t [[STOP:[^ ]*]], size_t [[STEP:[^ ]*]]) {
17// CPP-DECLTOP-NEXT: int32_t [[V4:[^ ]*]];
18// CPP-DECLTOP-NEXT: for (size_t [[ITER:[^ ]*]] = [[START]]; [[ITER]] < [[STOP]]; [[ITER]] += [[STEP]]) {
19// CPP-DECLTOP-NEXT: [[V4]] = f();
20// CPP-DECLTOP-NEXT: }
21// CPP-DECLTOP-NEXT: return;
22
23func @test_for_yield() {
24  %start = constant 0 : index
25  %stop = constant 10 : index
26  %step = constant 1 : index
27
28  %s0 = constant 0 : i32
29  %p0 = constant 1.0 : f32
30
31  %result:2 = scf.for %iter = %start to %stop step %step iter_args(%si = %s0, %pi = %p0) -> (i32, f32) {
32    %sn = emitc.call "add"(%si, %iter) : (i32, index) -> i32
33    %pn = emitc.call "mul"(%pi, %iter) : (f32, index) -> f32
34    scf.yield %sn, %pn : i32, f32
35  }
36
37  return
38}
39// CPP-DEFAULT: void test_for_yield() {
40// CPP-DEFAULT-NEXT: size_t [[START:[^ ]*]] = 0;
41// CPP-DEFAULT-NEXT: size_t [[STOP:[^ ]*]] = 10;
42// CPP-DEFAULT-NEXT: size_t [[STEP:[^ ]*]] = 1;
43// CPP-DEFAULT-NEXT: int32_t [[S0:[^ ]*]] = 0;
44// CPP-DEFAULT-NEXT: float [[P0:[^ ]*]] = (float)1.000000000e+00;
45// CPP-DEFAULT-NEXT: int32_t [[SE:[^ ]*]];
46// CPP-DEFAULT-NEXT: float [[PE:[^ ]*]];
47// CPP-DEFAULT-NEXT: int32_t [[SI:[^ ]*]] = [[S0]];
48// CPP-DEFAULT-NEXT: float [[PI:[^ ]*]] = [[P0]];
49// CPP-DEFAULT-NEXT: for (size_t [[ITER:[^ ]*]] = [[START]]; [[ITER]] < [[STOP]]; [[ITER]] += [[STEP]]) {
50// CPP-DEFAULT-NEXT: int32_t [[SN:[^ ]*]] = add([[SI]], [[ITER]]);
51// CPP-DEFAULT-NEXT: float [[PN:[^ ]*]] = mul([[PI]], [[ITER]]);
52// CPP-DEFAULT-NEXT: [[SI]] = [[SN]];
53// CPP-DEFAULT-NEXT: [[PI]] = [[PN]];
54// CPP-DEFAULT-NEXT: }
55// CPP-DEFAULT-NEXT: [[SE]] = [[SI]];
56// CPP-DEFAULT-NEXT: [[PE]] = [[PI]];
57// CPP-DEFAULT-NEXT: return;
58
59// CPP-DECLTOP: void test_for_yield() {
60// CPP-DECLTOP-NEXT: size_t [[START:[^ ]*]];
61// CPP-DECLTOP-NEXT: size_t [[STOP:[^ ]*]];
62// CPP-DECLTOP-NEXT: size_t [[STEP:[^ ]*]];
63// CPP-DECLTOP-NEXT: int32_t [[S0:[^ ]*]];
64// CPP-DECLTOP-NEXT: float [[P0:[^ ]*]];
65// CPP-DECLTOP-NEXT: int32_t [[SE:[^ ]*]];
66// CPP-DECLTOP-NEXT: float [[PE:[^ ]*]];
67// CPP-DECLTOP-NEXT: int32_t [[SN:[^ ]*]];
68// CPP-DECLTOP-NEXT: float [[PN:[^ ]*]];
69// CPP-DECLTOP-NEXT: [[START]] = 0;
70// CPP-DECLTOP-NEXT: [[STOP]] = 10;
71// CPP-DECLTOP-NEXT: [[STEP]] = 1;
72// CPP-DECLTOP-NEXT: [[S0]] = 0;
73// CPP-DECLTOP-NEXT: [[P0]] = (float)1.000000000e+00;
74// CPP-DECLTOP-NEXT: int32_t [[SI:[^ ]*]] = [[S0]];
75// CPP-DECLTOP-NEXT: float [[PI:[^ ]*]] = [[P0]];
76// CPP-DECLTOP-NEXT: for (size_t [[ITER:[^ ]*]] = [[START]]; [[ITER]] < [[STOP]]; [[ITER]] += [[STEP]]) {
77// CPP-DECLTOP-NEXT: [[SN]] = add([[SI]], [[ITER]]);
78// CPP-DECLTOP-NEXT: [[PN]] = mul([[PI]], [[ITER]]);
79// CPP-DECLTOP-NEXT: [[SI]] = [[SN]];
80// CPP-DECLTOP-NEXT: [[PI]] = [[PN]];
81// CPP-DECLTOP-NEXT: }
82// CPP-DECLTOP-NEXT: [[SE]] = [[SI]];
83// CPP-DECLTOP-NEXT: [[PE]] = [[PI]];
84// CPP-DECLTOP-NEXT: return;
85