| // 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.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.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.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 |
| } |