llvm-project/mlir/test/Transforms/control-flow-sink-test.mlir
Mogball b73f1d2c5d [mlir][cf-sink] Accept a callback for sinking operations
(This was a TODO from the initial patch).

The control-flow sink utility accepts a callback that is used to sink an operation into a region.
The `moveIntoRegion` is called on the same operation and region that return true for `shouldMoveIntoRegion`.
The callback must preserve the dominance of the operation within the region. In the default control-flow
sink implementation, this is moving the operation to the start of the entry block.

Reviewed By: mehdi_amini

Differential Revision: https://reviews.llvm.org/D122445
2022-03-28 19:31:23 +00:00

45 lines
1.4 KiB
MLIR

// Invoke the test control-flow sink pass to test the utilities.
// RUN: mlir-opt -test-control-flow-sink %s | FileCheck %s
// CHECK-LABEL: func @test_sink
func @test_sink() {
%0 = "test.sink_me"() : () -> i32
// CHECK-NEXT: test.sink_target
"test.sink_target"() ({
// CHECK-NEXT: %[[V0:.*]] = "test.sink_me"() {was_sunk = 0 : i32}
// CHECK-NEXT: "test.use"(%[[V0]])
"test.use"(%0) : (i32) -> ()
}) : () -> ()
return
}
// CHECK-LABEL: func @test_sink_first_region_only
func @test_sink_first_region_only() {
%0 = "test.sink_me"() {first} : () -> i32
// CHECK-NEXT: %[[V1:.*]] = "test.sink_me"() {second}
%1 = "test.sink_me"() {second} : () -> i32
// CHECK-NEXT: test.sink_target
"test.sink_target"() ({
// CHECK-NEXT: %[[V0:.*]] = "test.sink_me"() {first, was_sunk = 0 : i32}
// CHECK-NEXT: "test.use"(%[[V0]])
"test.use"(%0) : (i32) -> ()
}, {
"test.use"(%1) : (i32) -> ()
}) : () -> ()
return
}
// CHECK-LABEL: func @test_sink_targeted_op_only
func @test_sink_targeted_op_only() {
%0 = "test.sink_me"() : () -> i32
// CHECK-NEXT: %[[V1:.*]] = "test.dont_sink_me"
%1 = "test.dont_sink_me"() : () -> i32
// CHECK-NEXT: test.sink_target
"test.sink_target"() ({
// CHECK-NEXT: %[[V0:.*]] = "test.sink_me"
// CHECK-NEXT: "test.use"(%[[V0]], %[[V1]])
"test.use"(%0, %1) : (i32, i32) -> ()
}) : () -> ()
return
}