Skip to content

Commit f5e1d95

Browse files
author
Simon Camphausen
committed
[mlir][EmitC] Emit parentheses for users of expression ops
1 parent 9a28272 commit f5e1d95

File tree

3 files changed

+85
-12
lines changed

3 files changed

+85
-12
lines changed

mlir/lib/Target/Cpp/TranslateToCpp.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,8 +1338,13 @@ LogicalResult CppEmitter::emitOperand(Value value) {
13381338
}
13391339

13401340
auto expressionOp = dyn_cast_if_present<ExpressionOp>(value.getDefiningOp());
1341-
if (expressionOp && shouldBeInlined(expressionOp))
1342-
return emitExpression(expressionOp);
1341+
if (expressionOp && shouldBeInlined(expressionOp)) {
1342+
os << "(";
1343+
if (failed(emitExpression(expressionOp)))
1344+
return failure();
1345+
os << ")";
1346+
return success();
1347+
}
13431348

13441349
auto literalOp = dyn_cast_if_present<LiteralOp>(value.getDefiningOp());
13451350
if (!literalOp && !hasValueInScope(value))

mlir/test/Target/Cpp/expressions.mlir

Lines changed: 76 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,11 @@ func.func @do_not_inline(%arg0: i32, %arg1: i32, %arg2 : i32) -> i32 {
6666
}
6767

6868
// CPP-DEFAULT: float parentheses_for_low_precedence(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {
69-
// CPP-DEFAULT-NEXT: return (float) ([[VAL_1]] + [[VAL_2]] * [[VAL_3]]);
69+
// CPP-DEFAULT-NEXT: return ((float) ([[VAL_1]] + [[VAL_2]] * [[VAL_3]]));
7070
// CPP-DEFAULT-NEXT: }
7171

7272
// CPP-DECLTOP: float parentheses_for_low_precedence(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {
73-
// CPP-DECLTOP-NEXT: return (float) ([[VAL_1]] + [[VAL_2]] * [[VAL_3]]);
73+
// CPP-DECLTOP-NEXT: return ((float) ([[VAL_1]] + [[VAL_2]] * [[VAL_3]]));
7474
// CPP-DECLTOP-NEXT: }
7575

7676
func.func @parentheses_for_low_precedence(%arg0: i32, %arg1: i32, %arg2: i32) -> f32 {
@@ -84,11 +84,11 @@ func.func @parentheses_for_low_precedence(%arg0: i32, %arg1: i32, %arg2: i32) ->
8484
}
8585

8686
// CPP-DEFAULT: int32_t parentheses_for_same_precedence(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {
87-
// CPP-DEFAULT-NEXT: return [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);
87+
// CPP-DEFAULT-NEXT: return ([[VAL_3]] / ([[VAL_1]] * [[VAL_2]]));
8888
// CPP-DEFAULT-NEXT: }
8989

9090
// CPP-DECLTOP: int32_t parentheses_for_same_precedence(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {
91-
// CPP-DECLTOP-NEXT: return [[VAL_3]] / ([[VAL_1]] * [[VAL_2]]);
91+
// CPP-DECLTOP-NEXT: return ([[VAL_3]] / ([[VAL_1]] * [[VAL_2]]));
9292
// CPP-DECLTOP-NEXT: }
9393
func.func @parentheses_for_same_precedence(%arg0: i32, %arg1: i32, %arg2: i32) -> i32 {
9494
%e = emitc.expression : i32 {
@@ -100,6 +100,74 @@ func.func @parentheses_for_same_precedence(%arg0: i32, %arg1: i32, %arg2: i32) -
100100
return %e : i32
101101
}
102102

103+
// CPP-DEFAULT: int32_t parentheses_for_expression_users(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {
104+
// CPP-DEFAULT-NEXT: int32_t v4 = 0;
105+
// CPP-DEFAULT-NEXT: bool v5 = (bool) ([[VAL_3]] / ([[VAL_1]] * [[VAL_2]]));
106+
// CPP-DEFAULT-NEXT: int32_t v6 = ([[VAL_3]] / ([[VAL_1]] * [[VAL_2]])) + v4;
107+
// CPP-DEFAULT-NEXT: int32_t v7 = bar(([[VAL_3]] / ([[VAL_1]] * [[VAL_2]])), v4);
108+
// CPP-DEFAULT-NEXT: int32_t v8 = v5 ? ([[VAL_3]] / ([[VAL_1]] * [[VAL_2]])) : v4;
109+
// CPP-DEFAULT-NEXT: int32_t v9;
110+
// CPP-DEFAULT-NEXT: v9 = ([[VAL_3]] / ([[VAL_1]] * [[VAL_2]]));
111+
// CPP-DEFAULT-NEXT: return ([[VAL_3]] / ([[VAL_1]] * [[VAL_2]]));
112+
// CPP-DEFAULT-NEXT: }
113+
114+
// CPP-DECLTOP: int32_t parentheses_for_expression_users(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]]) {
115+
// CPP-DECLTOP-NEXT: int32_t v4;
116+
// CPP-DECLTOP-NEXT: bool v5;
117+
// CPP-DECLTOP-NEXT: int32_t v6;
118+
// CPP-DECLTOP-NEXT: int32_t v7;
119+
// CPP-DECLTOP-NEXT: int32_t v8;
120+
// CPP-DECLTOP-NEXT: int32_t v9;
121+
// CPP-DECLTOP-NEXT: v4 = 0;
122+
// CPP-DECLTOP-NEXT: v5 = (bool) ([[VAL_3]] / ([[VAL_1]] * [[VAL_2]]));
123+
// CPP-DECLTOP-NEXT: v6 = ([[VAL_3]] / ([[VAL_1]] * [[VAL_2]])) + v4;
124+
// CPP-DECLTOP-NEXT: v7 = bar(([[VAL_3]] / ([[VAL_1]] * [[VAL_2]])), v4);
125+
// CPP-DECLTOP-NEXT: v8 = v5 ? ([[VAL_3]] / ([[VAL_1]] * [[VAL_2]])) : v4;
126+
// CPP-DECLTOP-NEXT: ;
127+
// CPP-DECLTOP-NEXT: v9 = ([[VAL_3]] / ([[VAL_1]] * [[VAL_2]]));
128+
// CPP-DECLTOP-NEXT: return ([[VAL_3]] / ([[VAL_1]] * [[VAL_2]]));
129+
// CPP-DECLTOP-NEXT: }
130+
func.func @parentheses_for_expression_users(%arg0: i32, %arg1: i32, %arg2: i32) -> i32 {
131+
%c0 = "emitc.constant"() {value = 0 : i32} : () -> i32
132+
%e0 = emitc.expression : i32 {
133+
%0 = emitc.mul %arg0, %arg1 : (i32, i32) -> i32
134+
%1 = emitc.div %arg2, %0 : (i32, i32) -> i32
135+
emitc.yield %1 : i32
136+
}
137+
%e1 = emitc.expression : i32 {
138+
%0 = emitc.mul %arg0, %arg1 : (i32, i32) -> i32
139+
%1 = emitc.div %arg2, %0 : (i32, i32) -> i32
140+
emitc.yield %1 : i32
141+
}
142+
%e2 = emitc.expression : i32 {
143+
%0 = emitc.mul %arg0, %arg1 : (i32, i32) -> i32
144+
%1 = emitc.div %arg2, %0 : (i32, i32) -> i32
145+
emitc.yield %1 : i32
146+
}
147+
%e3 = emitc.expression : i32 {
148+
%0 = emitc.mul %arg0, %arg1 : (i32, i32) -> i32
149+
%1 = emitc.div %arg2, %0 : (i32, i32) -> i32
150+
emitc.yield %1 : i32
151+
}
152+
%e4 = emitc.expression : i32 {
153+
%0 = emitc.mul %arg0, %arg1 : (i32, i32) -> i32
154+
%1 = emitc.div %arg2, %0 : (i32, i32) -> i32
155+
emitc.yield %1 : i32
156+
}
157+
%e5 = emitc.expression : i32 {
158+
%0 = emitc.mul %arg0, %arg1 : (i32, i32) -> i32
159+
%1 = emitc.div %arg2, %0 : (i32, i32) -> i32
160+
emitc.yield %1 : i32
161+
}
162+
%cast = emitc.cast %e0 : i32 to i1
163+
%add = emitc.add %e1, %c0 : (i32, i32) -> i32
164+
%call = emitc.call_opaque "bar" (%e2, %c0) : (i32, i32) -> (i32)
165+
%cond = emitc.conditional %cast, %e3, %c0 : i32
166+
%var = "emitc.variable"() {value = #emitc.opaque<"">} : () -> i32
167+
emitc.assign %e4 : i32 to %var : i32
168+
return %e5 : i32
169+
}
170+
103171
// CPP-DEFAULT: int32_t multiple_uses(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t [[VAL_3:v[0-9]+]], int32_t [[VAL_4:v[0-9]+]]) {
104172
// CPP-DEFAULT-NEXT: bool [[VAL_5:v[0-9]+]] = bar([[VAL_1]] * [[VAL_2]], [[VAL_3]]) - [[VAL_4]] < [[VAL_2]];
105173
// CPP-DEFAULT-NEXT: int32_t [[VAL_6:v[0-9]+]];
@@ -154,7 +222,7 @@ func.func @multiple_uses(%arg0: i32, %arg1: i32, %arg2: i32, %arg3: i32) -> i32
154222
// CPP-DEFAULT-NEXT: int32_t [[VAL_5:v[0-9]+]] = [[VAL_3]] % [[VAL_4]];
155223
// CPP-DEFAULT-NEXT: int32_t [[VAL_6:v[0-9]+]] = bar([[VAL_5]], [[VAL_1]] * [[VAL_2]]);
156224
// CPP-DEFAULT-NEXT: int32_t [[VAL_7:v[0-9]+]];
157-
// CPP-DEFAULT-NEXT: if ([[VAL_6]] - [[VAL_4]] < [[VAL_2]]) {
225+
// CPP-DEFAULT-NEXT: if (([[VAL_6]] - [[VAL_4]] < [[VAL_2]])) {
158226
// CPP-DEFAULT-NEXT: [[VAL_7]] = [[VAL_1]];
159227
// CPP-DEFAULT-NEXT: } else {
160228
// CPP-DEFAULT-NEXT: [[VAL_7]] = [[VAL_1]];
@@ -169,7 +237,7 @@ func.func @multiple_uses(%arg0: i32, %arg1: i32, %arg2: i32, %arg3: i32) -> i32
169237
// CPP-DECLTOP-NEXT: [[VAL_5]] = [[VAL_3]] % [[VAL_4]];
170238
// CPP-DECLTOP-NEXT: [[VAL_6]] = bar([[VAL_5]], [[VAL_1]] * [[VAL_2]]);
171239
// CPP-DECLTOP-NEXT: ;
172-
// CPP-DECLTOP-NEXT: if ([[VAL_6]] - [[VAL_4]] < [[VAL_2]]) {
240+
// CPP-DECLTOP-NEXT: if (([[VAL_6]] - [[VAL_4]] < [[VAL_2]])) {
173241
// CPP-DECLTOP-NEXT: [[VAL_7]] = [[VAL_1]];
174242
// CPP-DECLTOP-NEXT: } else {
175243
// CPP-DECLTOP-NEXT: [[VAL_7]] = [[VAL_1]];
@@ -205,13 +273,13 @@ func.func @different_expressions(%arg0: i32, %arg1: i32, %arg2: i32, %arg3: i32)
205273

206274
// CPP-DEFAULT: bool expression_with_address_taken(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t* [[VAL_3]]) {
207275
// CPP-DEFAULT-NEXT: int32_t [[VAL_4:v[0-9]+]] = [[VAL_1]] % [[VAL_2]];
208-
// CPP-DEFAULT-NEXT: return &[[VAL_4]] - [[VAL_2]] < [[VAL_3]];
276+
// CPP-DEFAULT-NEXT: return (&[[VAL_4]] - [[VAL_2]] < [[VAL_3]]);
209277
// CPP-DEFAULT-NEXT: }
210278

211279
// CPP-DECLTOP: bool expression_with_address_taken(int32_t [[VAL_1:v[0-9]+]], int32_t [[VAL_2:v[0-9]+]], int32_t* [[VAL_3]]) {
212280
// CPP-DECLTOP-NEXT: int32_t [[VAL_4:v[0-9]+]];
213281
// CPP-DECLTOP-NEXT: [[VAL_4]] = [[VAL_1]] % [[VAL_2]];
214-
// CPP-DECLTOP-NEXT: return &[[VAL_4]] - [[VAL_2]] < [[VAL_3]];
282+
// CPP-DECLTOP-NEXT: return (&[[VAL_4]] - [[VAL_2]] < [[VAL_3]]);
215283
// CPP-DECLTOP-NEXT: }
216284

217285
func.func @expression_with_address_taken(%arg0: i32, %arg1: i32, %arg2: !emitc.ptr<i32>) -> i1 {

mlir/test/Target/Cpp/for.mlir

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ func.func @test_for(%arg0 : index, %arg1 : index, %arg2 : index) {
2020
return
2121
}
2222
// 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]]) {
23+
// CPP-DEFAULT-NEXT: for (size_t [[ITER:[^ ]*]] = ([[V1]] + [[V2]]); [[ITER]] < (([[V2]] * [[V3]])); [[ITER]] += ([[V1]] / [[V3]])) {
2424
// CPP-DEFAULT-NEXT: int32_t [[V4:[^ ]*]] = f();
2525
// CPP-DEFAULT-NEXT: }
2626
// CPP-DEFAULT-NEXT: return;
2727

2828
// CPP-DECLTOP: void test_for(size_t [[V1:[^ ]*]], size_t [[V2:[^ ]*]], size_t [[V3:[^ ]*]]) {
2929
// CPP-DECLTOP-NEXT: int32_t [[V4:[^ ]*]];
30-
// CPP-DECLTOP-NEXT: for (size_t [[ITER:[^ ]*]] = [[V1]] + [[V2]]; [[ITER]] < ([[V2]] * [[V3]]); [[ITER]] += [[V1]] / [[V3]]) {
30+
// CPP-DECLTOP-NEXT: for (size_t [[ITER:[^ ]*]] = ([[V1]] + [[V2]]); [[ITER]] < (([[V2]] * [[V3]])); [[ITER]] += ([[V1]] / [[V3]])) {
3131
// CPP-DECLTOP-NEXT: [[V4]] = f();
3232
// CPP-DECLTOP-NEXT: }
3333
// CPP-DECLTOP-NEXT: return;

0 commit comments

Comments
 (0)