From ade6a6de734999bf74776db67200bc2eed3c77cf Mon Sep 17 00:00:00 2001 From: ahmedshakill Date: Sat, 26 Apr 2025 13:47:52 +0600 Subject: [PATCH 1/5] lower cir.delete.array to llvm.call @_ZdaPv --- .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 22 +++++++++++++++++++ .../CIR/Lowering/DirectToLLVM/LowerToLLVM.h | 9 ++++++++ 2 files changed, 31 insertions(+) diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 00faeb76942e..7b8d59f39b68 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -3963,6 +3963,27 @@ 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 +4365,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..061092cf60d2 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h @@ -1099,6 +1099,15 @@ 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: From a3a1ca10d9feaa64c5e59aef7db97301600f4ab0 Mon Sep 17 00:00:00 2001 From: ahmedshakill Date: Sat, 26 Apr 2025 17:34:06 +0600 Subject: [PATCH 2/5] tests cir.delete.array lowering --- clang/test/CIR/Lowering/delete-array.cpp | 9 +++++++++ clang/test/CIR/Lowering/delete-array2.cpp | 11 +++++++++++ 2 files changed, 20 insertions(+) create mode 100644 clang/test/CIR/Lowering/delete-array.cpp create mode 100644 clang/test/CIR/Lowering/delete-array2.cpp diff --git a/clang/test/CIR/Lowering/delete-array.cpp b/clang/test/CIR/Lowering/delete-array.cpp new file mode 100644 index 000000000000..f668bf760e14 --- /dev/null +++ b/clang/test/CIR/Lowering/delete-array.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 -fclangir -emit-llvm %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s + +void test_delete_array(int *ptr) { + delete[] ptr; +} + +// CHECK: [[PTR:%[0-9]+]] = load ptr, ptr %{{[0-9]+}}, align 8 +// CHECK-NEXT: call void @_ZdaPv(ptr [[PTR]]) diff --git a/clang/test/CIR/Lowering/delete-array2.cpp b/clang/test/CIR/Lowering/delete-array2.cpp new file mode 100644 index 000000000000..0a503d17a5cd --- /dev/null +++ b/clang/test/CIR/Lowering/delete-array2.cpp @@ -0,0 +1,11 @@ +// 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 + +int *newmem(); +struct cls { + ~cls(); +}; +cls::~cls() { delete[] newmem(); } + +// CHECK: [[NEWMEM:%[0-9]+]] = call ptr @_Z6newmemv() +// CHECK-NEXT: call void @_ZdaPv(ptr [[NEWMEM]]) \ No newline at end of file From 4c97e88c30979fedfe628ba833635c661c56214c Mon Sep 17 00:00:00 2001 From: ahmedshakill Date: Tue, 29 Apr 2025 22:46:28 +0600 Subject: [PATCH 3/5] format and merge tests --- .../CIR/Lowering/DirectToLLVM/LowerToLLVM.h | 5 +++-- clang/test/CIR/Lowering/delete-array.cpp | 18 ++++++++++++++---- clang/test/CIR/Lowering/delete-array2.cpp | 11 ----------- 3 files changed, 17 insertions(+), 17 deletions(-) delete mode 100644 clang/test/CIR/Lowering/delete-array2.cpp diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h index 061092cf60d2..74edf58b347a 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h @@ -1100,12 +1100,13 @@ class CIRToLLVMGetBitfieldOpLowering }; class CIRToLLVMDeleteArrayOpLowering - : public mlir::OpConversionPattern { + : public mlir::OpConversionPattern { public: using mlir::OpConversionPattern::OpConversionPattern; mlir::LogicalResult - matchAndRewrite(cir::DeleteArrayOp op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const override; + matchAndRewrite(cir::DeleteArrayOp op, OpAdaptor adaptor, + mlir::ConversionPatternRewriter &rewriter) const override; }; class CIRToLLVMIsConstantOpLowering diff --git a/clang/test/CIR/Lowering/delete-array.cpp b/clang/test/CIR/Lowering/delete-array.cpp index f668bf760e14..8a41359da2e7 100644 --- a/clang/test/CIR/Lowering/delete-array.cpp +++ b/clang/test/CIR/Lowering/delete-array.cpp @@ -1,9 +1,19 @@ -// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 -fclangir -emit-llvm %s -o %t.ll -// RUN: FileCheck --input-file=%t.ll %s +// 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; } -// CHECK: [[PTR:%[0-9]+]] = load ptr, ptr %{{[0-9]+}}, align 8 -// CHECK-NEXT: call void @_ZdaPv(ptr [[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]]) \ No newline at end of file diff --git a/clang/test/CIR/Lowering/delete-array2.cpp b/clang/test/CIR/Lowering/delete-array2.cpp deleted file mode 100644 index 0a503d17a5cd..000000000000 --- a/clang/test/CIR/Lowering/delete-array2.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// 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 - -int *newmem(); -struct cls { - ~cls(); -}; -cls::~cls() { delete[] newmem(); } - -// CHECK: [[NEWMEM:%[0-9]+]] = call ptr @_Z6newmemv() -// CHECK-NEXT: call void @_ZdaPv(ptr [[NEWMEM]]) \ No newline at end of file From 5041a9ec75985f831e3a2d8ff494d1a57f45216d Mon Sep 17 00:00:00 2001 From: ahmedshakill Date: Tue, 29 Apr 2025 22:57:41 +0600 Subject: [PATCH 4/5] format test --- clang/test/CIR/Lowering/delete-array.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/CIR/Lowering/delete-array.cpp b/clang/test/CIR/Lowering/delete-array.cpp index 8a41359da2e7..380f93392a00 100644 --- a/clang/test/CIR/Lowering/delete-array.cpp +++ b/clang/test/CIR/Lowering/delete-array.cpp @@ -16,4 +16,4 @@ struct cls { cls::~cls() { delete[] newmem(); } // LLVM: [[NEWMEM:%[0-9]+]] = call ptr @_Z6newmemv() -// LLVM-NEXT: call void @_ZdaPv(ptr [[NEWMEM]]) \ No newline at end of file +// LLVM-NEXT: call void @_ZdaPv(ptr [[NEWMEM]]) From 8ce5adcc58f9fb0edaa14ebef0266922af7737c7 Mon Sep 17 00:00:00 2001 From: ahmedshakill Date: Thu, 1 May 2025 11:32:19 +0600 Subject: [PATCH 5/5] Fix formatting issues detected by clang-format --- clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 7b8d59f39b68..bfea134e544b 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -3978,8 +3978,7 @@ mlir::LogicalResult CIRToLLVMDeleteArrayOpLowering::matchAndRewrite( // Replace the operation with a call to _ZdaPv with the pointer argument rewriter.replaceOpWithNewOp( - op, mlir::TypeRange{}, - fnName, mlir::ValueRange{adaptor.getAddress()}); + op, mlir::TypeRange{}, fnName, mlir::ValueRange{adaptor.getAddress()}); return mlir::success(); }