Skip to content

Commit 57dc713

Browse files
[MLIR][Bufferization] Retire enforce-aliasing-invariants (#130929)
Why? This option can lead to incorrect IR if used in isolation, for example, consider the IR below: ```mlir func.func @loop_with_aliasing(%arg0: tensor<5xf32>, %arg1: index, %arg2: index) -> tensor<5xf32> { %c1 = arith.constant 1 : index %cst = arith.constant 1.000000e+00 : f32 %0 = tensor.empty() : tensor<5xf32> %1 = linalg.fill ins(%cst : f32) outs(%0 : tensor<5xf32>) -> tensor<5xf32> // The BufferizableOpInterface says that %2 alias with %arg0 or be a newly // allocated buffer %2 = scf.for %arg3 = %arg1 to %arg2 step %c1 iter_args(%arg4 = %arg0) -> (tensor<5xf32>) { scf.yield %1 : tensor<5xf32> } %cst_0 = arith.constant 1.000000e+00 : f32 %inserted = tensor.insert %cst_0 into %1[%c1] : tensor<5xf32> return %2 : tensor<5xf32> } ``` If we bufferize with: enforce-aliasing-invariants=false, we get: ``` func.func @loop_with_aliasing(%arg0: memref<5xf32, strided<[?], offset: ?>>, %arg1: index, %arg2: index) -> memref<5xf32, strided<[?], offset: ?>> { %c1 = arith.constant 1 : index %cst = arith.constant 1.000000e+00 : f32 %alloc = memref.alloc() {alignment = 64 : i64} : memref<5xf32> linalg.fill ins(%cst : f32) outs(%alloc : memref<5xf32>) %0 = scf.for %arg3 = %arg1 to %arg2 step %c1 iter_args(%arg4 = %arg0) -> (memref<5xf32, strided<[?], offset: ?>>) { %cast = memref.cast %alloc : memref<5xf32> to memref<5xf32, strided<[?], offset: ?>> scf.yield %cast : memref<5xf32, strided<[?], offset: ?>> } %cst_0 = arith.constant 1.000000e+00 : f32 memref.store %cst_0, %alloc[%c1] : memref<5xf32> return %0 : memref<5xf32, strided<[?], offset: ?>> } ``` Which is not correct IR since the loop yields the allocation. I am using this option. What do I need to do now? If you are using this option in isolation, you are possibly generating incorrect IR, so you need to revisit your bufferization strategy. If you are using it together with `copyBeforeWrite,` you simply need to retire the `enforceAliasingInvariants` option. Co-authored-by: Matthias Springer <[email protected]>
1 parent 58dd3ed commit 57dc713

File tree

2 files changed

+2
-14
lines changed

2 files changed

+2
-14
lines changed

mlir/include/mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -315,16 +315,6 @@ struct BufferizationOptions {
315315
// outside of the parallel region will be given a new buffer.
316316
bool checkParallelRegions = true;
317317

318-
/// Certain ops have aliasing OpOperand/OpResult invariants (e.g., scf.for).
319-
/// If this flag is set to `false`, those invariants are no longer enforced
320-
/// with buffer copies.
321-
///
322-
/// Note: Deactivating this flag can lead to incorrect bufferization results
323-
/// when used incorrectly. This flag is useful with
324-
/// `AlwaysCopyAnalysisState` which bufferizes all writing tensor
325-
/// OpOperands out-of-place.
326-
bool enforceAliasingInvariants = true;
327-
328318
/// This function controls buffer types on function signatures. Sets
329319
/// `functionArgTypeConverterFn` and `inferFunctionResultLayout` accordingly.
330320
///

mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -652,8 +652,7 @@ struct ForOpInterface
652652
if (failed(bufferizableOp.resolveTensorOpOperandConflicts(rewriter, state)))
653653
return failure();
654654

655-
if (!state.getOptions().enforceAliasingInvariants ||
656-
state.getOptions().copyBeforeWrite)
655+
if (state.getOptions().copyBeforeWrite)
657656
return success();
658657

659658
// According to the `getAliasing...` implementations, a bufferized OpResult
@@ -894,8 +893,7 @@ struct WhileOpInterface
894893
if (failed(bufferizableOp.resolveTensorOpOperandConflicts(rewriter, state)))
895894
return failure();
896895

897-
if (!state.getOptions().enforceAliasingInvariants ||
898-
state.getOptions().copyBeforeWrite)
896+
if (state.getOptions().copyBeforeWrite)
899897
return success();
900898

901899
// According to the `getAliasing...` implementations, a bufferized OpResult

0 commit comments

Comments
 (0)