Skip to content

Commit 40740c4

Browse files
Fix crash when using when using --finalize-memref-to-llvm (#112433)
This patch fixes crash when attempting to convert uint to int address space during finalize-memref-to-llvm by doing the following: 1. Add a check to verify that IntegerAttr is signed int before calling IntegerAttr::getInt() 2. Emit error when getMemRefAddressSpace returns a failure() Closes #111242 --------- Co-authored-by: Christian Ulmann <[email protected]>
1 parent e53c46a commit 40740c4

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

mlir/lib/Conversion/LLVMCommon/TypeConverter.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -524,8 +524,11 @@ LLVMTypeConverter::getMemRefAddressSpace(BaseMemRefType type) const {
524524
return failure();
525525
if (!(*converted)) // Conversion to default is 0.
526526
return 0;
527-
if (auto explicitSpace = llvm::dyn_cast_if_present<IntegerAttr>(*converted))
528-
return explicitSpace.getInt();
527+
if (auto explicitSpace = dyn_cast_if_present<IntegerAttr>(*converted)) {
528+
if (explicitSpace.getType().isIndex() ||
529+
explicitSpace.getType().isSignlessInteger())
530+
return explicitSpace.getInt();
531+
}
529532
return failure();
530533
}
531534

mlir/lib/Conversion/MemRefToLLVM/AllocLikeConversion.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ std::tuple<Value, Value> AllocationOpLLVMLowering::allocateBufferManuallyAlign(
7474
MemRefType memRefType = getMemRefResultType(op);
7575
// Allocate the underlying buffer.
7676
Type elementPtrType = this->getElementPtrType(memRefType);
77+
if (!elementPtrType) {
78+
emitError(loc, "conversion of memref memory space ")
79+
<< memRefType.getMemorySpace()
80+
<< " to integer address space "
81+
"failed. Consider adding memory space conversions.";
82+
}
7783
LLVM::LLVMFuncOp allocFuncOp = getNotalignedAllocFn(
7884
getTypeConverter(), op->getParentWithTrait<OpTrait::SymbolTable>(),
7985
getIndexType());
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// RUN: mlir-opt %s -finalize-memref-to-llvm -verify-diagnostics
2+
3+
// CHECK-LABEL: @invalid_int_conversion
4+
func.func @invalid_int_conversion() {
5+
// expected-error@+1 {{conversion of memref memory space 1 : ui64 to integer address space failed. Consider adding memory space conversions.}}
6+
%alloc = memref.alloc() {alignment = 64 : i64} : memref<10xf32, 1 : ui64>
7+
return
8+
}

0 commit comments

Comments
 (0)