The bufferization of arith.constant ops is also switched over to BufferizableOpInterface-based bufferization. The old implementation is deleted. Both implementations utilize GlobalCreator, now renamed to just `getGlobalFor`. GlobalCreator no longer maintains a set of all created allocations to avoid duplicate allocations of the same constant. Instead, `getGlobalFor` scans the module to see if there is already a global allocation with the same constant value. For compatibility reasons, it is still possible to create a pass that bufferizes only `arith.constant`. This pass (createConstantBufferizePass) could be deleted once all users were switched over to One-Shot bufferization. Differential Revision: https://reviews.llvm.org/D118483
83 lines
2.5 KiB
MLIR
83 lines
2.5 KiB
MLIR
// RUN: mlir-opt %s -arith-bufferize -split-input-file | FileCheck %s
|
|
// RUN: mlir-opt %s -arith-bufferize=alignment=64 -split-input-file | FileCheck --check-prefix=ALIGNED %s
|
|
|
|
// CHECK-LABEL: func @index_cast(
|
|
// CHECK-SAME: %[[TENSOR:.*]]: tensor<i32>, %[[SCALAR:.*]]: i32
|
|
func @index_cast(%tensor: tensor<i32>, %scalar: i32) -> (tensor<index>, index) {
|
|
%index_tensor = arith.index_cast %tensor : tensor<i32> to tensor<index>
|
|
%index_scalar = arith.index_cast %scalar : i32 to index
|
|
return %index_tensor, %index_scalar : tensor<index>, index
|
|
}
|
|
// CHECK: %[[MEMREF:.*]] = bufferization.to_memref %[[TENSOR]] : memref<i32>
|
|
// CHECK-NEXT: %[[INDEX_MEMREF:.*]] = arith.index_cast %[[MEMREF]]
|
|
// CHECK-SAME: memref<i32> to memref<index>
|
|
// CHECK-NEXT: %[[INDEX_TENSOR:.*]] = bufferization.to_tensor %[[INDEX_MEMREF]]
|
|
// CHECK: return %[[INDEX_TENSOR]]
|
|
|
|
// -----
|
|
|
|
// CHECK-LABEL: module {
|
|
|
|
// We check the debug name too since we put some effort into making that readable.
|
|
// The name isn't load-bearing though.
|
|
|
|
// CHECK: memref.global "private" constant @__constant_3x4xf32 : memref<3x4xf32> = dense<7.000000e+00>
|
|
// CHECK-NOT: alignment
|
|
|
|
// ALIGNED: memref.global "private" constant @__constant_3x4xf32 : memref<3x4xf32> = dense<7.000000e+00>
|
|
// ALIGNED-SAME: {alignment = 64 : i64}
|
|
|
|
// CHECK: @basic
|
|
func @basic() -> tensor<3x4xf32> {
|
|
// CHECK: %[[MEMREF:.*]] = memref.get_global @__constant_3x4xf32 : memref<3x4xf32>
|
|
// CHECK: %[[TENSOR:.*]] = bufferization.to_tensor %[[MEMREF]]
|
|
%0 = arith.constant dense<7.0> : tensor<3x4xf32>
|
|
// CHECK: return %[[TENSOR]]
|
|
return %0 : tensor<3x4xf32>
|
|
}
|
|
|
|
// CHECK: }
|
|
|
|
// -----
|
|
|
|
// CHECK-LABEL: module {
|
|
|
|
// Only one global is created.
|
|
// CHECK: memref.global
|
|
// CHECK-NOT: memref.global
|
|
func @duplicate_constants() -> (tensor<3x4xf32>, tensor<3x4xf32>) {
|
|
%0 = arith.constant dense<7.0> : tensor<3x4xf32>
|
|
%1 = arith.constant dense<7.0> : tensor<3x4xf32>
|
|
return %0, %1 : tensor<3x4xf32>, tensor<3x4xf32>
|
|
}
|
|
|
|
// CHECK: }
|
|
|
|
// -----
|
|
|
|
// CHECK-LABEL: module {
|
|
|
|
// Two globals are created.
|
|
// CHECK: memref.global
|
|
// CHECK: memref.global
|
|
// CHECK-NOT: memref.global
|
|
func @multiple_constants() -> (tensor<3x4xf32>, tensor<3x4xf32>) {
|
|
%0 = arith.constant dense<7.0> : tensor<3x4xf32>
|
|
%1 = arith.constant dense<8.0> : tensor<3x4xf32>
|
|
return %0, %1 : tensor<3x4xf32>, tensor<3x4xf32>
|
|
}
|
|
|
|
// CHECK: }
|
|
|
|
// -----
|
|
|
|
// CHECK-LABEL: module {
|
|
// We don't convert non-tensor globals.
|
|
// CHECK-NOT: memref.global
|
|
func @non_tensor() {
|
|
%0 = arith.constant 7 : i32
|
|
return
|
|
}
|
|
|
|
// CHECK: }
|