This revision fixes a bug where an operation would get replaced with a pre-existing constant that didn't dominate it. This can occur when a pattern inserts operations to be folded at the beginning of the constants insertion block. This revision fixes the bug by moving the existing constant before the replaced operation in such cases. This is fine because if a constant didn't already exist, a new one would have been inserted before this operation anyways. Differential Revision: https://reviews.llvm.org/D108498
25 lines
892 B
MLIR
25 lines
892 B
MLIR
// RUN: mlir-opt -test-patterns %s | FileCheck %s
|
|
|
|
func @foo() -> i32 {
|
|
%c42 = constant 42 : i32
|
|
|
|
// The new operation should be present in the output and contain an attribute
|
|
// with value "42" that results from folding.
|
|
|
|
// CHECK: "test.op_in_place_fold"(%{{.*}}) {attr = 42 : i32}
|
|
%0 = "test.op_in_place_fold_anchor"(%c42) : (i32) -> (i32)
|
|
return %0 : i32
|
|
}
|
|
|
|
func @test_fold_before_previously_folded_op() -> (i32, i32) {
|
|
// When folding two constants will be generated and uniqued. Check that the
|
|
// uniqued constant properly dominates both uses.
|
|
// CHECK: %[[CST:.+]] = constant true
|
|
// CHECK-NEXT: "test.cast"(%[[CST]]) : (i1) -> i32
|
|
// CHECK-NEXT: "test.cast"(%[[CST]]) : (i1) -> i32
|
|
|
|
%0 = "test.cast"() {test_fold_before_previously_folded_op} : () -> (i32)
|
|
%1 = "test.cast"() {test_fold_before_previously_folded_op} : () -> (i32)
|
|
return %0, %1 : i32, i32
|
|
}
|