mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-14 03:29:57 +00:00
[mlir] [memref] Fix alignment bug in memref.copy lowering
memref.copy gets lowered to a function call sometimes, this function is passed the element size of the memref in bytes as an argument. The element size passed to the copyMemRef() function call can be miscalculated if the LLVM IR uses aligned access to the memory. This can be fixed by using llvm.getelementptr to calculate the element size natively. This is also done in the other lowering path that lowers to an intrinsic. Fix https://github.com/llvm/llvm-project/issues/64072 Reviewed By: ftynse Differential Revision: https://reviews.llvm.org/D156126
This commit is contained in:
parent
263fc4c79a
commit
c336a06144
@ -879,10 +879,9 @@ struct MemRefCopyOpLowering : public ConvertOpToLLVMPattern<memref::CopyOp> {
|
||||
auto sourcePtr = promote(unrankedSource);
|
||||
auto targetPtr = promote(unrankedTarget);
|
||||
|
||||
unsigned typeSize =
|
||||
mlir::DataLayout::closest(op).getTypeSize(srcType.getElementType());
|
||||
auto elemSize = rewriter.create<LLVM::ConstantOp>(
|
||||
loc, getIndexType(), rewriter.getIndexAttr(typeSize));
|
||||
// Derive size from llvm.getelementptr which will account for any
|
||||
// potential alignment
|
||||
auto elemSize = getSizeInBytes(loc, srcType.getElementType(), rewriter);
|
||||
auto copyFn = LLVM::lookupOrCreateMemRefCopyFn(
|
||||
op->getParentOfType<ModuleOp>(), getIndexType(), sourcePtr.getType());
|
||||
rewriter.create<LLVM::CallOp>(loc, copyFn,
|
||||
|
@ -558,7 +558,8 @@ func.func @memref_copy_unranked() {
|
||||
// CHECK: llvm.store {{%.*}}, [[ALLOCA2]] : !llvm.struct<(i64, ptr)>, !llvm.ptr
|
||||
// CHECK: [[ALLOCA3:%.*]] = llvm.alloca [[RANK2]] x !llvm.struct<(i64, ptr)> : (i64) -> !llvm.ptr
|
||||
// CHECK: llvm.store [[INSERT2]], [[ALLOCA3]] : !llvm.struct<(i64, ptr)>, !llvm.ptr
|
||||
// CHECK: [[SIZE:%.*]] = llvm.mlir.constant(1 : index) : i64
|
||||
// CHECK: [[SIZEPTR:%.*]] = llvm.getelementptr {{%.*}}[1] : (!llvm.ptr) -> !llvm.ptr, i1
|
||||
// CHECK: [[SIZE:%.*]] = llvm.ptrtoint [[SIZEPTR]] : !llvm.ptr to i64
|
||||
// CHECK: llvm.call @memrefCopy([[SIZE]], [[ALLOCA2]], [[ALLOCA3]]) : (i64, !llvm.ptr, !llvm.ptr) -> ()
|
||||
// CHECK: llvm.intr.stackrestore [[STACKSAVE]]
|
||||
return
|
||||
|
@ -82,7 +82,8 @@ func.func @memref_copy_unranked() {
|
||||
// CHECK: llvm.store {{%.*}}, [[ALLOCA2]] : !llvm.ptr<struct<(i64, ptr<i8>)>>
|
||||
// CHECK: [[ALLOCA3:%.*]] = llvm.alloca [[RANK2]] x !llvm.struct<(i64, ptr<i8>)> : (i64) -> !llvm.ptr<struct<(i64, ptr<i8>)>>
|
||||
// CHECK: llvm.store [[INSERT2]], [[ALLOCA3]] : !llvm.ptr<struct<(i64, ptr<i8>)>>
|
||||
// CHECK: [[SIZE:%.*]] = llvm.mlir.constant(1 : index) : i64
|
||||
// CHECK: [[SIZEPTR:%.*]] = llvm.getelementptr {{%.*}}[1] : (!llvm.ptr<i1>) -> !llvm.ptr<i1>
|
||||
// CHECK: [[SIZE:%.*]] = llvm.ptrtoint [[SIZEPTR]] : !llvm.ptr<i1> to i64
|
||||
// CHECK: llvm.call @memrefCopy([[SIZE]], [[ALLOCA2]], [[ALLOCA3]]) : (i64, !llvm.ptr<struct<(i64, ptr<i8>)>>, !llvm.ptr<struct<(i64, ptr<i8>)>>) -> ()
|
||||
// CHECK: llvm.intr.stackrestore [[STACKSAVE]]
|
||||
return
|
||||
|
Loading…
Reference in New Issue
Block a user