llvm-project/mlir/test/Transforms/canonicalize-debuginfo.mlir
Majid Dadashi f45f4ae783
Avoid unnecessary erasing of constant Locs (#151573)
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.
2025-08-05 09:55:47 -07:00

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)