Skip to content

Commit 411607d

Browse files
committed
lower to llvm
1 parent 81bd7b3 commit 411607d

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed

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

+20
Original file line numberDiff line numberDiff line change
@@ -4239,6 +4239,24 @@ mlir::LogicalResult CIRToLLVMLinkerOptionsOpLowering::matchAndRewrite(
42394239
return mlir::success();
42404240
}
42414241

4242+
mlir::LogicalResult CIRToLLVMLifetimeStartOpLowering::matchAndRewrite(
4243+
cir::LifetimeStartOp op, OpAdaptor adaptor,
4244+
mlir::ConversionPatternRewriter &rewriter) const {
4245+
auto newOp = rewriter.create<mlir::LLVM::LifetimeStartOp>(
4246+
op.getLoc(), op.getSizeAttr(), adaptor.getPtr());
4247+
rewriter.replaceOp(op, newOp);
4248+
return mlir::success();
4249+
}
4250+
4251+
mlir::LogicalResult CIRToLLVMLifetimeEndOpLowering::matchAndRewrite(
4252+
cir::LifetimeEndOp op, OpAdaptor adaptor,
4253+
mlir::ConversionPatternRewriter &rewriter) const {
4254+
auto newOp = rewriter.create<mlir::LLVM::LifetimeEndOp>(
4255+
op.getLoc(), op.getSizeAttr(), adaptor.getPtr());
4256+
rewriter.replaceOp(op, newOp);
4257+
return mlir::success();
4258+
}
4259+
42424260
void populateCIRToLLVMConversionPatterns(
42434261
mlir::RewritePatternSet &patterns, mlir::TypeConverter &converter,
42444262
mlir::DataLayout &dataLayout, cir::LowerModule *lowerModule,
@@ -4323,6 +4341,8 @@ void populateCIRToLLVMConversionPatterns(
43234341
CIRToLLVMInsertMemberOpLowering,
43244342
CIRToLLVMIsConstantOpLowering,
43254343
CIRToLLVMIsFPClassOpLowering,
4344+
CIRToLLVMLifetimeEndOpLowering,
4345+
CIRToLLVMLifetimeStartOpLowering,
43264346
CIRToLLVMLinkerOptionsOpLowering,
43274347
CIRToLLVMLLVMIntrinsicCallOpLowering,
43284348
CIRToLLVMMemChrOpLowering,

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

+18
Original file line numberDiff line numberDiff line change
@@ -1257,6 +1257,24 @@ class CIRToLLVMLinkerOptionsOpLowering
12571257
mlir::ConversionPatternRewriter &rewriter) const override;
12581258
};
12591259

1260+
class CIRToLLVMLifetimeStartOpLowering
1261+
: public mlir::OpConversionPattern<cir::LifetimeStartOp> {
1262+
public:
1263+
using mlir::OpConversionPattern<cir::LifetimeStartOp>::OpConversionPattern;
1264+
mlir::LogicalResult
1265+
matchAndRewrite(cir::LifetimeStartOp op, OpAdaptor,
1266+
mlir::ConversionPatternRewriter &) const override;
1267+
};
1268+
1269+
class CIRToLLVMLifetimeEndOpLowering
1270+
: public mlir::OpConversionPattern<cir::LifetimeEndOp> {
1271+
public:
1272+
using mlir::OpConversionPattern<cir::LifetimeEndOp>::OpConversionPattern;
1273+
mlir::LogicalResult
1274+
matchAndRewrite(cir::LifetimeEndOp op, OpAdaptor,
1275+
mlir::ConversionPatternRewriter &) const override;
1276+
};
1277+
12601278
mlir::ArrayAttr lowerCIRTBAAAttr(mlir::Attribute tbaa,
12611279
mlir::ConversionPatternRewriter &rewriter,
12621280
cir::LowerModule *lowerMod);

clang/test/CIR/Lowering/lifetime.cir

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// RUN: cir-opt %s -cir-to-llvm -o - | FileCheck %s --check-prefix=MLIR
2+
// RUN: cir-translate %s -cir-to-llvmir --disable-cc-lowering | FileCheck %s -check-prefix=LLVM
3+
4+
!s32i = !cir.int<s, 32>
5+
6+
module {
7+
cir.func @foo(%arg0: !s32i) {
8+
%0 = cir.alloca !s32i, !cir.ptr<!s32i>, %arg0 : !s32i, ["tmp"] {alignment = 16 : i64}
9+
cir.lifetime.start 4, %0 : !cir.ptr<!s32i>
10+
cir.lifetime.end 4, %0 : !cir.ptr<!s32i>
11+
cir.return
12+
}
13+
}
14+
15+
// MLIR: module {
16+
// MLIR-NEXT: llvm.func @foo(%arg0: i32) attributes {cir.extra_attrs = #fn_attr, global_visibility = #cir<visibility default>} {
17+
// MLIR-NEXT: %0 = llvm.alloca %arg0 x i32 {alignment = 16 : i64} : (i32) -> !llvm.ptr
18+
// MLIR-NEXT: llvm.intr.lifetime.start 4, %0 : !llvm.ptr
19+
// MLIR-NEXT: llvm.intr.lifetime.end 4, %0 : !llvm.ptr
20+
// MLIR-NEXT: llvm.return
21+
// MLIR-NEXT: }
22+
// MLIR-NEXT: }
23+
24+
// LLVM: define void @foo(i32 %0)
25+
// LLVM-NEXT: %2 = alloca i32, i32 %0, align 16
26+
// LLVM-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr %2)
27+
// LLVM-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr %2)
28+
// LLVM-NEXT: ret void

0 commit comments

Comments
 (0)