Skip to content

Commit 8b7e836

Browse files
authored
[mlir][emitc] Remove copy from scf.for lowering (#94898)
Remove the copy into fresh variables done when lowering scf.for into emitc.for and use the variables carrying the init and iter values as the loop's results.
1 parent fe0dee4 commit 8b7e836

File tree

3 files changed

+13
-44
lines changed

3 files changed

+13
-44
lines changed

mlir/lib/Conversion/SCFToEmitC/SCFToEmitC.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,8 @@ LogicalResult ForLowering::matchAndRewrite(ForOp forOp,
102102
// assigned to by emitc::assign ops within the loop body.
103103
SmallVector<Value> resultVariables =
104104
createVariablesForResults(forOp, rewriter);
105-
SmallVector<Value> iterArgsVariables =
106-
createVariablesForResults(forOp, rewriter);
107105

108-
assignValues(forOp.getInits(), iterArgsVariables, rewriter, loc);
106+
assignValues(forOp.getInits(), resultVariables, rewriter, loc);
109107

110108
emitc::ForOp loweredFor = rewriter.create<emitc::ForOp>(
111109
loc, forOp.getLowerBound(), forOp.getUpperBound(), forOp.getStep());
@@ -117,15 +115,12 @@ LogicalResult ForLowering::matchAndRewrite(ForOp forOp,
117115

118116
SmallVector<Value> replacingValues;
119117
replacingValues.push_back(loweredFor.getInductionVar());
120-
replacingValues.append(iterArgsVariables.begin(), iterArgsVariables.end());
118+
replacingValues.append(resultVariables.begin(), resultVariables.end());
121119

122120
rewriter.mergeBlocks(forOp.getBody(), loweredBody, replacingValues);
123-
lowerYield(iterArgsVariables, rewriter,
121+
lowerYield(resultVariables, rewriter,
124122
cast<scf::YieldOp>(loweredBody->getTerminator()));
125123

126-
// Copy iterArgs into results after the for loop.
127-
assignValues(iterArgsVariables, resultVariables, rewriter, loc);
128-
129124
rewriter.replaceOp(forOp, resultVariables);
130125
return success();
131126
}

mlir/test/Conversion/SCFToEmitC/for.mlir

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,13 @@ func.func @for_yield(%arg0 : index, %arg1 : index, %arg2 : index) -> (f32, f32)
4949
// CHECK-NEXT: %[[VAL_4:.*]] = arith.constant 1.000000e+00 : f32
5050
// CHECK-NEXT: %[[VAL_5:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32
5151
// CHECK-NEXT: %[[VAL_6:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32
52-
// CHECK-NEXT: %[[VAL_7:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32
53-
// CHECK-NEXT: %[[VAL_8:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32
54-
// CHECK-NEXT: emitc.assign %[[VAL_3]] : f32 to %[[VAL_7]] : f32
55-
// CHECK-NEXT: emitc.assign %[[VAL_4]] : f32 to %[[VAL_8]] : f32
52+
// CHECK-NEXT: emitc.assign %[[VAL_3]] : f32 to %[[VAL_5]] : f32
53+
// CHECK-NEXT: emitc.assign %[[VAL_4]] : f32 to %[[VAL_6]] : f32
5654
// CHECK-NEXT: emitc.for %[[VAL_9:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] {
57-
// CHECK-NEXT: %[[VAL_10:.*]] = arith.addf %[[VAL_7]], %[[VAL_8]] : f32
58-
// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_7]] : f32
59-
// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_8]] : f32
55+
// CHECK-NEXT: %[[VAL_10:.*]] = arith.addf %[[VAL_5]], %[[VAL_6]] : f32
56+
// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_5]] : f32
57+
// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_6]] : f32
6058
// CHECK-NEXT: }
61-
// CHECK-NEXT: emitc.assign %[[VAL_7]] : f32 to %[[VAL_5]] : f32
62-
// CHECK-NEXT: emitc.assign %[[VAL_8]] : f32 to %[[VAL_6]] : f32
6359
// CHECK-NEXT: return %[[VAL_5]], %[[VAL_6]] : f32, f32
6460
// CHECK-NEXT: }
6561

@@ -78,19 +74,15 @@ func.func @nested_for_yield(%arg0 : index, %arg1 : index, %arg2 : index) -> f32
7874
// CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: index) -> f32 {
7975
// CHECK-NEXT: %[[VAL_3:.*]] = arith.constant 1.000000e+00 : f32
8076
// CHECK-NEXT: %[[VAL_4:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32
81-
// CHECK-NEXT: %[[VAL_5:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32
82-
// CHECK-NEXT: emitc.assign %[[VAL_3]] : f32 to %[[VAL_5]] : f32
77+
// CHECK-NEXT: emitc.assign %[[VAL_3]] : f32 to %[[VAL_4]] : f32
8378
// CHECK-NEXT: emitc.for %[[VAL_6:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] {
8479
// CHECK-NEXT: %[[VAL_7:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32
85-
// CHECK-NEXT: %[[VAL_8:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32
86-
// CHECK-NEXT: emitc.assign %[[VAL_5]] : f32 to %[[VAL_8]] : f32
80+
// CHECK-NEXT: emitc.assign %[[VAL_4]] : f32 to %[[VAL_7]] : f32
8781
// CHECK-NEXT: emitc.for %[[VAL_9:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] {
88-
// CHECK-NEXT: %[[VAL_10:.*]] = arith.addf %[[VAL_8]], %[[VAL_8]] : f32
89-
// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_8]] : f32
82+
// CHECK-NEXT: %[[VAL_10:.*]] = arith.addf %[[VAL_7]], %[[VAL_7]] : f32
83+
// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_7]] : f32
9084
// CHECK-NEXT: }
91-
// CHECK-NEXT: emitc.assign %[[VAL_8]] : f32 to %[[VAL_7]] : f32
92-
// CHECK-NEXT: emitc.assign %[[VAL_7]] : f32 to %[[VAL_5]] : f32
85+
// CHECK-NEXT: emitc.assign %[[VAL_7]] : f32 to %[[VAL_4]] : f32
9386
// CHECK-NEXT: }
94-
// CHECK-NEXT: emitc.assign %[[VAL_5]] : f32 to %[[VAL_4]] : f32
9587
// CHECK-NEXT: return %[[VAL_4]] : f32
9688
// CHECK-NEXT: }

mlir/test/Target/Cpp/for.mlir

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ func.func @test_for_yield() {
4040
%s0 = "emitc.constant"() <{value = 0 : i32}> : () -> i32
4141
%p0 = "emitc.constant"() <{value = 1.0 : f32}> : () -> f32
4242

43-
%0 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> i32
44-
%1 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32
4543
%2 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> i32
4644
%3 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32
4745
emitc.assign %s0 : i32 to %2 : i32
@@ -53,8 +51,6 @@ func.func @test_for_yield() {
5351
emitc.assign %pn : f32 to %3 : f32
5452
emitc.yield
5553
}
56-
emitc.assign %2 : i32 to %0 : i32
57-
emitc.assign %3 : f32 to %1 : f32
5854

5955
return
6056
}
@@ -64,8 +60,6 @@ func.func @test_for_yield() {
6460
// CPP-DEFAULT-NEXT: size_t [[STEP:[^ ]*]] = 1;
6561
// CPP-DEFAULT-NEXT: int32_t [[S0:[^ ]*]] = 0;
6662
// CPP-DEFAULT-NEXT: float [[P0:[^ ]*]] = 1.000000000e+00f;
67-
// CPP-DEFAULT-NEXT: int32_t [[SE:[^ ]*]];
68-
// CPP-DEFAULT-NEXT: float [[PE:[^ ]*]];
6963
// CPP-DEFAULT-NEXT: int32_t [[SI:[^ ]*]];
7064
// CPP-DEFAULT-NEXT: float [[PI:[^ ]*]];
7165
// CPP-DEFAULT-NEXT: [[SI:[^ ]*]] = [[S0]];
@@ -76,8 +70,6 @@ func.func @test_for_yield() {
7670
// CPP-DEFAULT-NEXT: [[SI]] = [[SN]];
7771
// CPP-DEFAULT-NEXT: [[PI]] = [[PN]];
7872
// CPP-DEFAULT-NEXT: }
79-
// CPP-DEFAULT-NEXT: [[SE]] = [[SI]];
80-
// CPP-DEFAULT-NEXT: [[PE]] = [[PI]];
8173
// CPP-DEFAULT-NEXT: return;
8274

8375
// CPP-DECLTOP: void test_for_yield() {
@@ -86,8 +78,6 @@ func.func @test_for_yield() {
8678
// CPP-DECLTOP-NEXT: size_t [[STEP:[^ ]*]];
8779
// CPP-DECLTOP-NEXT: int32_t [[S0:[^ ]*]];
8880
// CPP-DECLTOP-NEXT: float [[P0:[^ ]*]];
89-
// CPP-DECLTOP-NEXT: int32_t [[SE:[^ ]*]];
90-
// CPP-DECLTOP-NEXT: float [[PE:[^ ]*]];
9181
// CPP-DECLTOP-NEXT: int32_t [[SI:[^ ]*]];
9282
// CPP-DECLTOP-NEXT: float [[PI:[^ ]*]];
9383
// CPP-DECLTOP-NEXT: int32_t [[SN:[^ ]*]];
@@ -99,8 +89,6 @@ func.func @test_for_yield() {
9989
// CPP-DECLTOP-NEXT: [[P0]] = 1.000000000e+00f;
10090
// CPP-DECLTOP-NEXT: ;
10191
// CPP-DECLTOP-NEXT: ;
102-
// CPP-DECLTOP-NEXT: ;
103-
// CPP-DECLTOP-NEXT: ;
10492
// CPP-DECLTOP-NEXT: [[SI:[^ ]*]] = [[S0]];
10593
// CPP-DECLTOP-NEXT: [[PI:[^ ]*]] = [[P0]];
10694
// CPP-DECLTOP-NEXT: for (size_t [[ITER:[^ ]*]] = [[START]]; [[ITER]] < [[STOP]]; [[ITER]] += [[STEP]]) {
@@ -109,8 +97,6 @@ func.func @test_for_yield() {
10997
// CPP-DECLTOP-NEXT: [[SI]] = [[SN]];
11098
// CPP-DECLTOP-NEXT: [[PI]] = [[PN]];
11199
// CPP-DECLTOP-NEXT: }
112-
// CPP-DECLTOP-NEXT: [[SE]] = [[SI]];
113-
// CPP-DECLTOP-NEXT: [[PE]] = [[PI]];
114100
// CPP-DECLTOP-NEXT: return;
115101

116102
func.func @test_for_yield_2() {
@@ -121,8 +107,6 @@ func.func @test_for_yield_2() {
121107
%s0 = emitc.literal "0" : i32
122108
%p0 = emitc.literal "M_PI" : f32
123109

124-
%0 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> i32
125-
%1 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32
126110
%2 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> i32
127111
%3 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32
128112
emitc.assign %s0 : i32 to %2 : i32
@@ -134,8 +118,6 @@ func.func @test_for_yield_2() {
134118
emitc.assign %pn : f32 to %3 : f32
135119
emitc.yield
136120
}
137-
emitc.assign %2 : i32 to %0 : i32
138-
emitc.assign %3 : f32 to %1 : f32
139121

140122
return
141123
}

0 commit comments

Comments
 (0)