Do not erase location info when moving an op within the same block. Since #75415 , the FoldUtils.cpp erases the location information when moving an operation. This was being done even when an operation was moved to the front of a block it was already in. In TFLite, this location information is used to provide meaningful names for tensors, which aids in debugging and mapping compiled tensors back to their original layers. The aggressive erasure of location info caused many tensors in TFLite models to receive generic names (e.g., tfl.pseudo_qconst), making the models harder to inspect. This change modifies the logic to preserve the location of an operation when it is moved within the same block. The location is now only erased when the operation is moved from a different block entirely. This ensures that most tensor names are preserved, improving the debugging experience for TFLite models.
47 lines
1.8 KiB
MLIR
47 lines
1.8 KiB
MLIR
// RUN: mlir-opt %s -pass-pipeline='builtin.module(func.func(canonicalize{test-convergence}))' -split-input-file -mlir-print-debuginfo | FileCheck %s
|
|
|
|
// CHECK-LABEL: func @merge_constants
|
|
func.func @merge_constants() -> (index, index, index, index) {
|
|
// CHECK-NEXT: arith.constant 42 : index loc(#[[UnknownLoc:.*]])
|
|
%0 = arith.constant 42 : index loc("merge_constants":0:0)
|
|
%1 = arith.constant 42 : index loc("merge_constants":1:0)
|
|
%2 = arith.constant 42 : index loc("merge_constants":2:0)
|
|
%3 = arith.constant 42 : index loc("merge_constants":2:0)
|
|
return %0, %1, %2, %3 : index, index, index, index
|
|
}
|
|
// CHECK: #[[UnknownLoc]] = loc(unknown)
|
|
|
|
// -----
|
|
|
|
// CHECK-LABEL: func @simple_hoist
|
|
func.func @simple_hoist(%arg0: memref<8xi32>) -> i32 {
|
|
// CHECK: arith.constant 88 : i32 loc(#[[ConstLoc2:.*]])
|
|
// CHECK: arith.constant 42 : i32 loc(#[[ConstLoc0:.*]])
|
|
// CHECK: arith.constant 0 : index loc(#[[ConstLoc1:.*]])
|
|
%0 = arith.constant 42 : i32 loc("simple_hoist":0:0)
|
|
%1 = arith.constant 0 : index loc("simple_hoist":1:0)
|
|
memref.store %0, %arg0[%1] : memref<8xi32>
|
|
|
|
%2 = arith.constant 88 : i32 loc("simple_hoist":2:0)
|
|
|
|
return %2 : i32
|
|
}
|
|
// CHECK-DAG: #[[ConstLoc0]] = loc("simple_hoist":0:0)
|
|
// CHECK-DAG: #[[ConstLoc1]] = loc("simple_hoist":1:0)
|
|
// CHECK-DAG: #[[ConstLoc2]] = loc("simple_hoist":2:0)
|
|
|
|
// -----
|
|
|
|
// CHECK-LABEL: func @hoist_and_merge
|
|
func.func @hoist_and_merge(%arg0: memref<8xi32>) {
|
|
// CHECK-NEXT: arith.constant 42 : i32 loc(#[[UnknownLoc:.*]])
|
|
affine.for %arg1 = 0 to 8 {
|
|
%0 = arith.constant 42 : i32 loc("hoist_and_merge":0:0)
|
|
%1 = arith.constant 42 : i32 loc("hoist_and_merge":1:0)
|
|
memref.store %0, %arg0[%arg1] : memref<8xi32>
|
|
memref.store %1, %arg0[%arg1] : memref<8xi32>
|
|
}
|
|
return
|
|
} loc("hoist_and_merge":2:0)
|
|
// CHECK: #[[UnknownLoc]] = loc(unknown)
|