[mlir][bufferization] Clone simplify fails when input and result type not cast compatiable (#71310)

The simplify of bufferization.clone generates a memref.cast op, but the
checks in simplify do not verify whether the operand types and return
types of clone op is compatiable, leading to errors. This patch
addresses this issue.
This commit is contained in:
donald chen 2024-01-12 23:11:00 +08:00 committed by GitHub
parent 6fdc2ce8c5
commit eaa4b6cf29
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 0 deletions

View File

@ -457,6 +457,11 @@ struct SimplifyClones : public OpRewritePattern<CloneOp> {
}
Value source = cloneOp.getInput();
if (source.getType() != cloneOp.getType() &&
!memref::CastOp::areCastCompatible({source.getType()},
{cloneOp.getType()}))
return failure();
// Aims to find the dealloc op for the canonical source
// which otherwise could prevent removal of unnecessary allocs.
Value canonicalSource = source;

View File

@ -156,6 +156,18 @@ func.func @clone_and_cast(%arg0: memref<?xf32>) -> memref<32xf32> {
// -----
// CHECK-LABEL: @clone_incompatible
func.func @clone_incompatible(%arg0: memref<32xf32, strided<[2]>>) -> memref<32xf32> {
%0 = bufferization.clone %arg0 : memref<32xf32, strided<[2]>> to memref<32xf32>
memref.dealloc %arg0 : memref<32xf32, strided<[2]>>
return %0 : memref<32xf32>
}
// CHECK-SAME: %[[ARG:.*]]: memref<32xf32, strided<[2]>>
// CHECK-NEXT: bufferization.clone %[[ARG]] : memref<32xf32, strided<[2]>> to memref<32xf32>
// CHECK-NOT: memref.cast
// -----
// CHECK-LABEL: @alias_is_freed
func.func @alias_is_freed(%arg0 : memref<?xf32>) {
%0 = memref.cast %arg0 : memref<?xf32> to memref<32xf32>