diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 00faeb76942e..bfea134e544b 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -3963,6 +3963,26 @@ mlir::LogicalResult CIRToLLVMGetBitfieldOpLowering::matchAndRewrite( return mlir::success(); } +mlir::LogicalResult CIRToLLVMDeleteArrayOpLowering::matchAndRewrite( + cir::DeleteArrayOp op, OpAdaptor adaptor, + mlir::ConversionPatternRewriter &rewriter) const { + StringRef fnName = "_ZdaPv"; + + auto voidTy = rewriter.getType(); + auto llvmPtrTy = mlir::LLVM::LLVMPointerType::get(rewriter.getContext()); + + auto fnTy = mlir::LLVM::LLVMFunctionType::get(voidTy, {llvmPtrTy}, + /*isVarArg=*/false); + + getOrCreateLLVMFuncOp(rewriter, op, fnName, fnTy); + + // Replace the operation with a call to _ZdaPv with the pointer argument + rewriter.replaceOpWithNewOp( + op, mlir::TypeRange{}, fnName, mlir::ValueRange{adaptor.getAddress()}); + + return mlir::success(); +} + mlir::LogicalResult CIRToLLVMIsConstantOpLowering::matchAndRewrite( cir::IsConstantOp op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const { @@ -4344,6 +4364,7 @@ void populateCIRToLLVMConversionPatterns( CIRToLLVMGetGlobalOpLowering, CIRToLLVMGetMemberOpLowering, CIRToLLVMInsertMemberOpLowering, + CIRToLLVMDeleteArrayOpLowering, CIRToLLVMIsConstantOpLowering, CIRToLLVMIsFPClassOpLowering, CIRToLLVMLinkerOptionsOpLowering, diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h index 9820dee369c2..74edf58b347a 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h @@ -1099,6 +1099,16 @@ class CIRToLLVMGetBitfieldOpLowering mlir::ConversionPatternRewriter &) const override; }; +class CIRToLLVMDeleteArrayOpLowering + : public mlir::OpConversionPattern { +public: + using mlir::OpConversionPattern::OpConversionPattern; + + mlir::LogicalResult + matchAndRewrite(cir::DeleteArrayOp op, OpAdaptor adaptor, + mlir::ConversionPatternRewriter &rewriter) const override; +}; + class CIRToLLVMIsConstantOpLowering : public mlir::OpConversionPattern { public: diff --git a/clang/test/CIR/Lowering/delete-array.cpp b/clang/test/CIR/Lowering/delete-array.cpp new file mode 100644 index 000000000000..380f93392a00 --- /dev/null +++ b/clang/test/CIR/Lowering/delete-array.cpp @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 -fclangir -emit-llvm -O0 %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s --check-prefix=LLVM + +void test_delete_array(int *ptr) { + delete[] ptr; +} + +// LLVM: [[PTR:%[0-9]+]] = load ptr, ptr %{{[0-9]+}}, align 8 +// LLVM-NEXT: call void @_ZdaPv(ptr [[PTR]]) + + +int *newmem(); +struct cls { + ~cls(); +}; +cls::~cls() { delete[] newmem(); } + +// LLVM: [[NEWMEM:%[0-9]+]] = call ptr @_Z6newmemv() +// LLVM-NEXT: call void @_ZdaPv(ptr [[NEWMEM]])