CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
142 lines
4.4 KiB
MLIR
142 lines
4.4 KiB
MLIR
// RUN: mlir-opt %s --test-walk-pattern-rewrite-driver="dump-notifications=true" \
|
|
// RUN: --allow-unregistered-dialect --split-input-file | FileCheck %s
|
|
|
|
// The following op is updated in-place and will not be added back to the worklist.
|
|
// CHECK-LABEL: func.func @inplace_update()
|
|
// CHECK: "test.any_attr_of_i32_str"() <{attr = 1 : i32}> : () -> ()
|
|
// CHECK: "test.any_attr_of_i32_str"() <{attr = 2 : i32}> : () -> ()
|
|
func.func @inplace_update() {
|
|
"test.any_attr_of_i32_str"() {attr = 0 : i32} : () -> ()
|
|
"test.any_attr_of_i32_str"() {attr = 1 : i32} : () -> ()
|
|
return
|
|
}
|
|
|
|
// Check that the driver does not fold visited ops.
|
|
// CHECK-LABEL: func.func @add_no_fold()
|
|
// CHECK: arith.constant
|
|
// CHECK: arith.constant
|
|
// CHECK: %[[RES:.+]] = arith.addi
|
|
// CHECK: return %[[RES]]
|
|
func.func @add_no_fold() -> i32 {
|
|
%c0 = arith.constant 0 : i32
|
|
%c1 = arith.constant 1 : i32
|
|
%res = arith.addi %c0, %c1 : i32
|
|
return %res : i32
|
|
}
|
|
|
|
// Check that the driver handles rewriter.moveBefore.
|
|
// CHECK-LABEL: func.func @move_before(
|
|
// CHECK: "test.move_before_parent_op"
|
|
// CHECK: "test.any_attr_of_i32_str"() <{attr = 1 : i32}> : () -> ()
|
|
// CHECK: scf.if
|
|
// CHECK: return
|
|
func.func @move_before(%cond : i1) {
|
|
scf.if %cond {
|
|
"test.move_before_parent_op"() ({
|
|
"test.any_attr_of_i32_str"() {attr = 0 : i32} : () -> ()
|
|
}) : () -> ()
|
|
}
|
|
return
|
|
}
|
|
|
|
// Check that the driver handles rewriter.moveAfter. In this case, we expect
|
|
// the moved op to be visited twice.
|
|
// CHECK-LABEL: func.func @move_after(
|
|
// CHECK: scf.if
|
|
// CHECK: }
|
|
// CHECK: "test.move_after_parent_op"
|
|
// CHECK: "test.any_attr_of_i32_str"() <{attr = 2 : i32}> : () -> ()
|
|
// CHECK: return
|
|
func.func @move_after(%cond : i1) {
|
|
scf.if %cond {
|
|
"test.move_after_parent_op"() ({
|
|
"test.any_attr_of_i32_str"() {attr = 0 : i32} : () -> ()
|
|
}) : () -> ()
|
|
}
|
|
return
|
|
}
|
|
|
|
// Check that the driver handles rewriter.moveAfter. In this case, we expect
|
|
// the moved op to be visited twice since we advance its position to the next
|
|
// node after the parent.
|
|
// CHECK-LABEL: func.func @move_forward_and_revisit(
|
|
// CHECK: scf.if
|
|
// CHECK: }
|
|
// CHECK: arith.addi
|
|
// CHECK: "test.move_after_parent_op"
|
|
// CHECK: "test.any_attr_of_i32_str"() <{attr = 2 : i32}> : () -> ()
|
|
// CHECK: arith.addi
|
|
// CHECK: return
|
|
func.func @move_forward_and_revisit(%cond : i1) {
|
|
scf.if %cond {
|
|
"test.move_after_parent_op"() ({
|
|
"test.any_attr_of_i32_str"() {attr = 0 : i32} : () -> ()
|
|
}) {advance = 1 : i32} : () -> ()
|
|
}
|
|
%a = arith.addi %cond, %cond : i1
|
|
%b = arith.addi %a, %cond : i1
|
|
return
|
|
}
|
|
|
|
// Operation inserted just after the currently visited one won't be visited.
|
|
// CHECK-LABEL: func.func @insert_just_after
|
|
// CHECK: "test.clone_me"() ({
|
|
// CHECK: "test.any_attr_of_i32_str"() <{attr = 1 : i32}> : () -> ()
|
|
// CHECK: }) {was_cloned} : () -> ()
|
|
// CHECK: "test.clone_me"() ({
|
|
// CHECK: "test.any_attr_of_i32_str"() <{attr = 1 : i32}> : () -> ()
|
|
// CHECK: }) : () -> ()
|
|
// CHECK: return
|
|
func.func @insert_just_after(%cond : i1) {
|
|
"test.clone_me"() ({
|
|
"test.any_attr_of_i32_str"() {attr = 0 : i32} : () -> ()
|
|
}) : () -> ()
|
|
return
|
|
}
|
|
|
|
// Check that we can replace the current operation with a new one.
|
|
// Note that the new op won't be visited.
|
|
// CHECK-LABEL: func.func @replace_with_new_op
|
|
// CHECK: %[[NEW:.+]] = "test.new_op"
|
|
// CHECK: %[[RES:.+]] = arith.addi %[[NEW]], %[[NEW]]
|
|
// CHECK: return %[[RES]]
|
|
func.func @replace_with_new_op() -> i32 {
|
|
%a = "test.replace_with_new_op"() : () -> (i32)
|
|
%res = arith.addi %a, %a : i32
|
|
return %res : i32
|
|
}
|
|
|
|
// Check that we can erase nested blocks.
|
|
// CHECK-LABEL: func.func @erase_nested_block
|
|
// CHECK: %[[RES:.+]] = "test.erase_first_block"
|
|
// CHECK-NEXT: foo.bar
|
|
// CHECK: return %[[RES]]
|
|
func.func @erase_nested_block() -> i32 {
|
|
%a = "test.erase_first_block"() ({
|
|
"foo.foo"() : () -> ()
|
|
^bb1:
|
|
"foo.bar"() : () -> ()
|
|
}): () -> (i32)
|
|
return %a : i32
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: func.func @unreachable_replace_with_new_op
|
|
// CHECK: "test.new_op"
|
|
// CHECK: "test.replace_with_new_op"
|
|
// CHECK-SAME: unreachable
|
|
// CHECK: "test.new_op"
|
|
func.func @unreachable_replace_with_new_op() {
|
|
"test.br"()[^bb1] : () -> ()
|
|
^bb1:
|
|
%a = "test.replace_with_new_op"() : () -> (i32)
|
|
"test.br"()[^end] : () -> () // Test jumping over the unreachable block is visited as well.
|
|
^unreachable:
|
|
%b = "test.replace_with_new_op"() {test.unreachable} : () -> (i32)
|
|
return
|
|
^end:
|
|
%c = "test.replace_with_new_op"() : () -> (i32)
|
|
return
|
|
}
|
|
|