From 8b7e836570b29d3bc89731c5af91c847e3fc5c71 Mon Sep 17 00:00:00 2001 From: Gil Rapaport Date: Mon, 10 Jun 2024 13:57:38 +0300 Subject: [PATCH] [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. --- mlir/lib/Conversion/SCFToEmitC/SCFToEmitC.cpp | 11 ++------ mlir/test/Conversion/SCFToEmitC/for.mlir | 28 +++++++------------ mlir/test/Target/Cpp/for.mlir | 18 ------------ 3 files changed, 13 insertions(+), 44 deletions(-) diff --git a/mlir/lib/Conversion/SCFToEmitC/SCFToEmitC.cpp b/mlir/lib/Conversion/SCFToEmitC/SCFToEmitC.cpp index 367142a5207427..0a892422252554 100644 --- a/mlir/lib/Conversion/SCFToEmitC/SCFToEmitC.cpp +++ b/mlir/lib/Conversion/SCFToEmitC/SCFToEmitC.cpp @@ -102,10 +102,8 @@ LogicalResult ForLowering::matchAndRewrite(ForOp forOp, // assigned to by emitc::assign ops within the loop body. SmallVector resultVariables = createVariablesForResults(forOp, rewriter); - SmallVector iterArgsVariables = - createVariablesForResults(forOp, rewriter); - assignValues(forOp.getInits(), iterArgsVariables, rewriter, loc); + assignValues(forOp.getInits(), resultVariables, rewriter, loc); emitc::ForOp loweredFor = rewriter.create( loc, forOp.getLowerBound(), forOp.getUpperBound(), forOp.getStep()); @@ -117,15 +115,12 @@ LogicalResult ForLowering::matchAndRewrite(ForOp forOp, SmallVector replacingValues; replacingValues.push_back(loweredFor.getInductionVar()); - replacingValues.append(iterArgsVariables.begin(), iterArgsVariables.end()); + replacingValues.append(resultVariables.begin(), resultVariables.end()); rewriter.mergeBlocks(forOp.getBody(), loweredBody, replacingValues); - lowerYield(iterArgsVariables, rewriter, + lowerYield(resultVariables, rewriter, cast(loweredBody->getTerminator())); - // Copy iterArgs into results after the for loop. - assignValues(iterArgsVariables, resultVariables, rewriter, loc); - rewriter.replaceOp(forOp, resultVariables); return success(); } diff --git a/mlir/test/Conversion/SCFToEmitC/for.mlir b/mlir/test/Conversion/SCFToEmitC/for.mlir index 7f90310af21894..7e59eac3d40950 100644 --- a/mlir/test/Conversion/SCFToEmitC/for.mlir +++ b/mlir/test/Conversion/SCFToEmitC/for.mlir @@ -49,17 +49,13 @@ func.func @for_yield(%arg0 : index, %arg1 : index, %arg2 : index) -> (f32, f32) // CHECK-NEXT: %[[VAL_4:.*]] = arith.constant 1.000000e+00 : f32 // CHECK-NEXT: %[[VAL_5:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 // CHECK-NEXT: %[[VAL_6:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 -// CHECK-NEXT: %[[VAL_7:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 -// CHECK-NEXT: %[[VAL_8:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 -// CHECK-NEXT: emitc.assign %[[VAL_3]] : f32 to %[[VAL_7]] : f32 -// CHECK-NEXT: emitc.assign %[[VAL_4]] : f32 to %[[VAL_8]] : f32 +// CHECK-NEXT: emitc.assign %[[VAL_3]] : f32 to %[[VAL_5]] : f32 +// CHECK-NEXT: emitc.assign %[[VAL_4]] : f32 to %[[VAL_6]] : f32 // CHECK-NEXT: emitc.for %[[VAL_9:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] { -// CHECK-NEXT: %[[VAL_10:.*]] = arith.addf %[[VAL_7]], %[[VAL_8]] : f32 -// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_7]] : f32 -// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_8]] : f32 +// CHECK-NEXT: %[[VAL_10:.*]] = arith.addf %[[VAL_5]], %[[VAL_6]] : f32 +// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_5]] : f32 +// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_6]] : f32 // CHECK-NEXT: } -// CHECK-NEXT: emitc.assign %[[VAL_7]] : f32 to %[[VAL_5]] : f32 -// CHECK-NEXT: emitc.assign %[[VAL_8]] : f32 to %[[VAL_6]] : f32 // CHECK-NEXT: return %[[VAL_5]], %[[VAL_6]] : f32, f32 // CHECK-NEXT: } @@ -78,19 +74,15 @@ func.func @nested_for_yield(%arg0 : index, %arg1 : index, %arg2 : index) -> f32 // CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: index) -> f32 { // CHECK-NEXT: %[[VAL_3:.*]] = arith.constant 1.000000e+00 : f32 // CHECK-NEXT: %[[VAL_4:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 -// CHECK-NEXT: %[[VAL_5:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 -// CHECK-NEXT: emitc.assign %[[VAL_3]] : f32 to %[[VAL_5]] : f32 +// CHECK-NEXT: emitc.assign %[[VAL_3]] : f32 to %[[VAL_4]] : f32 // CHECK-NEXT: emitc.for %[[VAL_6:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] { // CHECK-NEXT: %[[VAL_7:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 -// CHECK-NEXT: %[[VAL_8:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 -// CHECK-NEXT: emitc.assign %[[VAL_5]] : f32 to %[[VAL_8]] : f32 +// CHECK-NEXT: emitc.assign %[[VAL_4]] : f32 to %[[VAL_7]] : f32 // CHECK-NEXT: emitc.for %[[VAL_9:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] { -// CHECK-NEXT: %[[VAL_10:.*]] = arith.addf %[[VAL_8]], %[[VAL_8]] : f32 -// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_8]] : f32 +// CHECK-NEXT: %[[VAL_10:.*]] = arith.addf %[[VAL_7]], %[[VAL_7]] : f32 +// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_7]] : f32 // CHECK-NEXT: } -// CHECK-NEXT: emitc.assign %[[VAL_8]] : f32 to %[[VAL_7]] : f32 -// CHECK-NEXT: emitc.assign %[[VAL_7]] : f32 to %[[VAL_5]] : f32 +// CHECK-NEXT: emitc.assign %[[VAL_7]] : f32 to %[[VAL_4]] : f32 // CHECK-NEXT: } -// CHECK-NEXT: emitc.assign %[[VAL_5]] : f32 to %[[VAL_4]] : f32 // CHECK-NEXT: return %[[VAL_4]] : f32 // CHECK-NEXT: } diff --git a/mlir/test/Target/Cpp/for.mlir b/mlir/test/Target/Cpp/for.mlir index 60988bcb465562..af1d829113f9dd 100644 --- a/mlir/test/Target/Cpp/for.mlir +++ b/mlir/test/Target/Cpp/for.mlir @@ -40,8 +40,6 @@ func.func @test_for_yield() { %s0 = "emitc.constant"() <{value = 0 : i32}> : () -> i32 %p0 = "emitc.constant"() <{value = 1.0 : f32}> : () -> f32 - %0 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> i32 - %1 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 %2 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> i32 %3 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 emitc.assign %s0 : i32 to %2 : i32 @@ -53,8 +51,6 @@ func.func @test_for_yield() { emitc.assign %pn : f32 to %3 : f32 emitc.yield } - emitc.assign %2 : i32 to %0 : i32 - emitc.assign %3 : f32 to %1 : f32 return } @@ -64,8 +60,6 @@ func.func @test_for_yield() { // CPP-DEFAULT-NEXT: size_t [[STEP:[^ ]*]] = 1; // CPP-DEFAULT-NEXT: int32_t [[S0:[^ ]*]] = 0; // CPP-DEFAULT-NEXT: float [[P0:[^ ]*]] = 1.000000000e+00f; -// CPP-DEFAULT-NEXT: int32_t [[SE:[^ ]*]]; -// CPP-DEFAULT-NEXT: float [[PE:[^ ]*]]; // CPP-DEFAULT-NEXT: int32_t [[SI:[^ ]*]]; // CPP-DEFAULT-NEXT: float [[PI:[^ ]*]]; // CPP-DEFAULT-NEXT: [[SI:[^ ]*]] = [[S0]]; @@ -76,8 +70,6 @@ func.func @test_for_yield() { // CPP-DEFAULT-NEXT: [[SI]] = [[SN]]; // CPP-DEFAULT-NEXT: [[PI]] = [[PN]]; // CPP-DEFAULT-NEXT: } -// CPP-DEFAULT-NEXT: [[SE]] = [[SI]]; -// CPP-DEFAULT-NEXT: [[PE]] = [[PI]]; // CPP-DEFAULT-NEXT: return; // CPP-DECLTOP: void test_for_yield() { @@ -86,8 +78,6 @@ func.func @test_for_yield() { // CPP-DECLTOP-NEXT: size_t [[STEP:[^ ]*]]; // CPP-DECLTOP-NEXT: int32_t [[S0:[^ ]*]]; // CPP-DECLTOP-NEXT: float [[P0:[^ ]*]]; -// CPP-DECLTOP-NEXT: int32_t [[SE:[^ ]*]]; -// CPP-DECLTOP-NEXT: float [[PE:[^ ]*]]; // CPP-DECLTOP-NEXT: int32_t [[SI:[^ ]*]]; // CPP-DECLTOP-NEXT: float [[PI:[^ ]*]]; // CPP-DECLTOP-NEXT: int32_t [[SN:[^ ]*]]; @@ -99,8 +89,6 @@ func.func @test_for_yield() { // CPP-DECLTOP-NEXT: [[P0]] = 1.000000000e+00f; // CPP-DECLTOP-NEXT: ; // CPP-DECLTOP-NEXT: ; -// CPP-DECLTOP-NEXT: ; -// CPP-DECLTOP-NEXT: ; // CPP-DECLTOP-NEXT: [[SI:[^ ]*]] = [[S0]]; // CPP-DECLTOP-NEXT: [[PI:[^ ]*]] = [[P0]]; // CPP-DECLTOP-NEXT: for (size_t [[ITER:[^ ]*]] = [[START]]; [[ITER]] < [[STOP]]; [[ITER]] += [[STEP]]) { @@ -109,8 +97,6 @@ func.func @test_for_yield() { // CPP-DECLTOP-NEXT: [[SI]] = [[SN]]; // CPP-DECLTOP-NEXT: [[PI]] = [[PN]]; // CPP-DECLTOP-NEXT: } -// CPP-DECLTOP-NEXT: [[SE]] = [[SI]]; -// CPP-DECLTOP-NEXT: [[PE]] = [[PI]]; // CPP-DECLTOP-NEXT: return; func.func @test_for_yield_2() { @@ -121,8 +107,6 @@ func.func @test_for_yield_2() { %s0 = emitc.literal "0" : i32 %p0 = emitc.literal "M_PI" : f32 - %0 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> i32 - %1 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 %2 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> i32 %3 = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 emitc.assign %s0 : i32 to %2 : i32 @@ -134,8 +118,6 @@ func.func @test_for_yield_2() { emitc.assign %pn : f32 to %3 : f32 emitc.yield } - emitc.assign %2 : i32 to %0 : i32 - emitc.assign %3 : f32 to %1 : f32 return }