diff --git a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp --- a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp +++ b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp @@ -961,6 +961,10 @@ ValueRange{rank, voidPtr}); }; + // Save stack position before promoting descriptors + auto stackSaveOp = + rewriter.create(loc, getVoidPtrType()); + Value unrankedSource = srcType.hasRank() ? makeUnranked(adaptor.getSource(), srcType) : adaptor.getSource(); @@ -990,6 +994,10 @@ op->getParentOfType(), getIndexType(), sourcePtr.getType()); rewriter.create(loc, copyFn, ValueRange{elemSize, sourcePtr, targetPtr}); + + // Restore stack used for descriptors + rewriter.create(loc, stackSaveOp); + rewriter.eraseOp(op); return success(); diff --git a/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir b/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir --- a/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir +++ b/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir @@ -1138,6 +1138,7 @@ // CHECK: [[UNDEF:%.*]] = llvm.mlir.undef : !llvm.struct<(i64, ptr)> // CHECK: [[INSERT:%.*]] = llvm.insertvalue [[RANK]], [[UNDEF]][0] : !llvm.struct<(i64, ptr)> // CHECK: [[INSERT2:%.*]] = llvm.insertvalue [[BITCAST]], [[INSERT]][1] : !llvm.struct<(i64, ptr)> + // CHECK: [[STACKSAVE:%.*]] = llvm.intr.stacksave : !llvm.ptr // CHECK: [[RANK2:%.*]] = llvm.mlir.constant(1 : index) : i64 // CHECK: [[ALLOCA2:%.*]] = llvm.alloca [[RANK2]] x !llvm.struct<(i64, ptr)> : (i64) -> !llvm.ptr)>> // CHECK: llvm.store {{%.*}}, [[ALLOCA2]] : !llvm.ptr)>> @@ -1145,6 +1146,7 @@ // CHECK: llvm.store [[INSERT2]], [[ALLOCA3]] : !llvm.ptr)>> // CHECK: [[SIZE:%.*]] = llvm.mlir.constant(1 : index) : i64 // CHECK: llvm.call @memrefCopy([[SIZE]], [[ALLOCA2]], [[ALLOCA3]]) : (i64, !llvm.ptr)>>, !llvm.ptr)>>) -> () + // CHECK: llvm.intr.stackrestore [[STACKSAVE]] return }