Follow up to the discussion from #75258, and serves as an alternate solution for #74670. Set the location to Unknown for deduplicated / moved / materialized constants by OperationFolder. This makes sure that the folded constants don't end up with an arbitrary location of one of the original ops that became it, and that hoisted ops don't confuse the stepping order.
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(#[[UnknownLoc:.*]])
|
|
// 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: #[[UnknownLoc]] = loc(unknown)
|
|
// CHECK-DAG: #[[ConstLoc0]] = loc("simple_hoist":0:0)
|
|
// CHECK-DAG: #[[ConstLoc1]] = loc("simple_hoist":1: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)
|