xref: /llvm-project/mlir/test/Target/Cpp/for.mlir (revision be96bd74f8eae5637033e4e05fcbf2a693ce8334)
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