Skip to content

Commit 5d21325

Browse files
ahmedshakilllanza
authored andcommitted
[CIR][Lowering] Lower delete array to LLVM (llvm#1588)
Initial implementation of lowering cir.delete.array llvm#1285 lowered to a call to **_ZdaPv** keeping similarity with how Clang AST is lowered. before ```LLVM module @"/opt/tmp/input.cpp" attributes {cir.lang = #cir.lang<cxx>, cir.sob = #cir.signed_overflow_behavior<undefined>, cir.triple = "x86_64-unknown-linux-gnu", cir.type_size_info = #cir.type_size_info<char = 8, int = 32, size_t = 64>, dlti.dl_spec = #dlti.dl_spec<!llvm.ptr<271> = dense<32> : vector<4xi64>, !llvm.ptr<272> = dense<64> : vector<4xi64>, i128 = dense<128> : vector<2xi64>, !llvm.ptr<270> = dense<32> : vector<4xi64>, f80 = dense<128> : vector<2xi64>, i1 = dense<8> : vector<2xi64>, !llvm.ptr = dense<64> : vector<4xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, i64 = dense<64> : vector<2xi64>, "dlti.stack_alignment" = 128 : i64, "dlti.endianness" = "little", "dlti.mangling_mode" = "e">} { cir.func @_Z17test_delete_arrayPi(%arg0: !cir.ptr<!s32i> loc(fused[#loc3, #loc4])) extra(#fn_attr) { %0 = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["ptr", init] {alignment = 8 : i64} loc(#loc8) cir.store %arg0, %0 : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>> loc(#loc5) %1 = cir.load %0 : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i> loc(#loc6) cir.delete.array %1 : <!s32i> loc(#loc6) cir.return loc(#loc2) } loc(#loc7) } loc(#loc) ``` after ```LLVM define dso_local void @_Z17test_delete_arrayPi(ptr %0) #0 { %2 = alloca ptr, i64 1, align 8 store ptr %0, ptr %2, align 8 %3 = load ptr, ptr %2, align 8 call void @_ZdaPv(ptr %3) ret void } ```
1 parent 681e171 commit 5d21325

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3964,6 +3964,26 @@ mlir::LogicalResult CIRToLLVMGetBitfieldOpLowering::matchAndRewrite(
39643964
return mlir::success();
39653965
}
39663966

3967+
mlir::LogicalResult CIRToLLVMDeleteArrayOpLowering::matchAndRewrite(
3968+
cir::DeleteArrayOp op, OpAdaptor adaptor,
3969+
mlir::ConversionPatternRewriter &rewriter) const {
3970+
StringRef fnName = "_ZdaPv";
3971+
3972+
auto voidTy = rewriter.getType<mlir::LLVM::LLVMVoidType>();
3973+
auto llvmPtrTy = mlir::LLVM::LLVMPointerType::get(rewriter.getContext());
3974+
3975+
auto fnTy = mlir::LLVM::LLVMFunctionType::get(voidTy, {llvmPtrTy},
3976+
/*isVarArg=*/false);
3977+
3978+
getOrCreateLLVMFuncOp(rewriter, op, fnName, fnTy);
3979+
3980+
// Replace the operation with a call to _ZdaPv with the pointer argument
3981+
rewriter.replaceOpWithNewOp<mlir::LLVM::CallOp>(
3982+
op, mlir::TypeRange{}, fnName, mlir::ValueRange{adaptor.getAddress()});
3983+
3984+
return mlir::success();
3985+
}
3986+
39673987
mlir::LogicalResult CIRToLLVMIsConstantOpLowering::matchAndRewrite(
39683988
cir::IsConstantOp op, OpAdaptor adaptor,
39693989
mlir::ConversionPatternRewriter &rewriter) const {
@@ -4345,6 +4365,7 @@ void populateCIRToLLVMConversionPatterns(
43454365
CIRToLLVMGetGlobalOpLowering,
43464366
CIRToLLVMGetMemberOpLowering,
43474367
CIRToLLVMInsertMemberOpLowering,
4368+
CIRToLLVMDeleteArrayOpLowering,
43484369
CIRToLLVMIsConstantOpLowering,
43494370
CIRToLLVMIsFPClassOpLowering,
43504371
CIRToLLVMLinkerOptionsOpLowering,

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,6 +1099,16 @@ class CIRToLLVMGetBitfieldOpLowering
10991099
mlir::ConversionPatternRewriter &) const override;
11001100
};
11011101

1102+
class CIRToLLVMDeleteArrayOpLowering
1103+
: public mlir::OpConversionPattern<cir::DeleteArrayOp> {
1104+
public:
1105+
using mlir::OpConversionPattern<cir::DeleteArrayOp>::OpConversionPattern;
1106+
1107+
mlir::LogicalResult
1108+
matchAndRewrite(cir::DeleteArrayOp op, OpAdaptor adaptor,
1109+
mlir::ConversionPatternRewriter &rewriter) const override;
1110+
};
1111+
11021112
class CIRToLLVMIsConstantOpLowering
11031113
: public mlir::OpConversionPattern<cir::IsConstantOp> {
11041114
public:
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 -fclangir -emit-llvm -O0 %s -o %t.ll
2+
// RUN: FileCheck --input-file=%t.ll %s --check-prefix=LLVM
3+
4+
void test_delete_array(int *ptr) {
5+
delete[] ptr;
6+
}
7+
8+
// LLVM: [[PTR:%[0-9]+]] = load ptr, ptr %{{[0-9]+}}, align 8
9+
// LLVM-NEXT: call void @_ZdaPv(ptr [[PTR]])
10+
11+
12+
int *newmem();
13+
struct cls {
14+
~cls();
15+
};
16+
cls::~cls() { delete[] newmem(); }
17+
18+
// LLVM: [[NEWMEM:%[0-9]+]] = call ptr @_Z6newmemv()
19+
// LLVM-NEXT: call void @_ZdaPv(ptr [[NEWMEM]])

0 commit comments

Comments
 (0)