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

Reply via email to