| Issue |
179144
|
| Summary |
[MLIR] Overflow in `-memref-to-llvm` when lowering large allocations
|
| Labels |
mlir
|
| Assignees |
sweiglbosker
|
| Reporter |
sweiglbosker
|
Currently, memref descriptor values are lowered according to index bitwidth, and memref size is silently truncated for the alloc. This is true for all the fields of memref descriptor, and the final allocation size.
## Input Program
```mlir
func.func @high_rank_memref_max_dim() {
// Test with fewer dimensions but larger sizes that also cause overflow
%0 = memref.alloca() : memref<8589934580x2xi32>
return
}
```
```
❯ mlir-opt -finalize-memref-to-llvm='index-bitwidth=32' test.mlir
```
# Result
```mlir
module {
func.func @high_rank_memref_max_dim() {
%0 = llvm.mlir.constant(8589934580 : index) : i32
%1 = llvm.mlir.constant(2 : index) : i32
%2 = llvm.mlir.constant(1 : index) : i32
%3 = llvm.mlir.constant(17179869160 : index) : i32
%4 = llvm.alloca %3 x i32 : (i32) -> !llvm.ptr
%5 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i32, array<2 x i32>, array<2 x i32>)>
%6 = llvm.insertvalue %4, %5[0] : !llvm.struct<(ptr, ptr, i32, array<2 x i32>, array<2 x i32>)>
%7 = llvm.insertvalue %4, %6[1] : !llvm.struct<(ptr, ptr, i32, array<2 x i32>, array<2 x i32>)>
%8 = llvm.mlir.constant(0 : index) : i32
%9 = llvm.insertvalue %8, %7[2] : !llvm.struct<(ptr, ptr, i32, array<2 x i32>, array<2 x i32>)>
%10 = llvm.insertvalue %0, %9[3, 0] : !llvm.struct<(ptr, ptr, i32, array<2 x i32>, array<2 x i32>)>
%11 = llvm.insertvalue %1, %10[3, 1] : !llvm.struct<(ptr, ptr, i32, array<2 x i32>, array<2 x i32>)>
%12 = llvm.insertvalue %1, %11[4, 0] : !llvm.struct<(ptr, ptr, i32, array<2 x i32>, array<2 x i32>)>
%13 = llvm.insertvalue %2, %12[4, 1] : !llvm.struct<(ptr, ptr, i32, array<2 x i32>, array<2 x i32>)>
return
}
}
```
translated to llvmir:
```llvm
; ModuleID = 'LLVMDialectModule'
source_filename = "LLVMDialectModule"
define void @high_rank_memref_max_dim() {
%1 = alloca i32, i32 -24, align 4
%2 = insertvalue { ptr, ptr, i32, [2 x i32], [2 x i32] } poison, ptr %1, 0
%3 = insertvalue { ptr, ptr, i32, [2 x i32], [2 x i32] } %2, ptr %1, 1
%4 = insertvalue { ptr, ptr, i32, [2 x i32], [2 x i32] } %3, i32 0, 2
%5 = insertvalue { ptr, ptr, i32, [2 x i32], [2 x i32] } %4, i32 -12, 3, 0
%6 = insertvalue { ptr, ptr, i32, [2 x i32], [2 x i32] } %5, i32 2, 3, 1
%7 = insertvalue { ptr, ptr, i32, [2 x i32], [2 x i32] } %6, i32 2, 4, 0
%8 = insertvalue { ptr, ptr, i32, [2 x i32], [2 x i32] } %7, i32 1, 4, 1
ret void
}
!llvm.module.flags = !{!0}
!0 = !{i32 2, !"Debug Info Version", i32 3}
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs