Skip to content

Commit 925cf47

Browse files
authored
[CIR][Lowering] Add LLVM lowering support for cir.assume (#1066)
This PR adds LLVMIR lowering support for `cir.assume`, `cir.assume.aligned`, and `cir.assume.separate_storage`.
1 parent 82767f4 commit 925cf47

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

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

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3038,6 +3038,66 @@ class CIRIntrinsicCallLowering
30383038
}
30393039
};
30403040

3041+
class CIRAssumeLowering
3042+
: public mlir::OpConversionPattern<mlir::cir::AssumeOp> {
3043+
public:
3044+
using OpConversionPattern<mlir::cir::AssumeOp>::OpConversionPattern;
3045+
3046+
mlir::LogicalResult
3047+
matchAndRewrite(mlir::cir::AssumeOp op, OpAdaptor adaptor,
3048+
mlir::ConversionPatternRewriter &rewriter) const override {
3049+
auto cond = rewriter.create<mlir::LLVM::TruncOp>(
3050+
op.getLoc(), rewriter.getI1Type(), adaptor.getPredicate());
3051+
rewriter.replaceOpWithNewOp<mlir::LLVM::AssumeOp>(op, cond);
3052+
return mlir::success();
3053+
}
3054+
};
3055+
3056+
class CIRAssumeAlignedLowering
3057+
: public mlir::OpConversionPattern<mlir::cir::AssumeAlignedOp> {
3058+
public:
3059+
using OpConversionPattern<mlir::cir::AssumeAlignedOp>::OpConversionPattern;
3060+
3061+
mlir::LogicalResult
3062+
matchAndRewrite(mlir::cir::AssumeAlignedOp op, OpAdaptor adaptor,
3063+
mlir::ConversionPatternRewriter &rewriter) const override {
3064+
SmallVector<mlir::Value, 3> opBundleArgs{adaptor.getPointer()};
3065+
3066+
auto alignment = rewriter.create<mlir::LLVM::ConstantOp>(
3067+
op.getLoc(), rewriter.getI64Type(), op.getAlignment());
3068+
opBundleArgs.push_back(alignment);
3069+
3070+
if (mlir::Value offset = adaptor.getOffset())
3071+
opBundleArgs.push_back(offset);
3072+
3073+
auto cond = rewriter.create<mlir::LLVM::ConstantOp>(
3074+
op.getLoc(), rewriter.getI1Type(), 1);
3075+
rewriter.create<mlir::LLVM::AssumeOp>(op.getLoc(), cond, "align",
3076+
opBundleArgs);
3077+
rewriter.replaceAllUsesWith(op, op.getPointer());
3078+
rewriter.eraseOp(op);
3079+
3080+
return mlir::success();
3081+
}
3082+
};
3083+
3084+
class CIRAssumeSepStorageLowering
3085+
: public mlir::OpConversionPattern<mlir::cir::AssumeSepStorageOp> {
3086+
public:
3087+
using OpConversionPattern<mlir::cir::AssumeSepStorageOp>::OpConversionPattern;
3088+
3089+
mlir::LogicalResult
3090+
matchAndRewrite(mlir::cir::AssumeSepStorageOp op, OpAdaptor adaptor,
3091+
mlir::ConversionPatternRewriter &rewriter) const override {
3092+
auto cond = rewriter.create<mlir::LLVM::ConstantOp>(
3093+
op.getLoc(), rewriter.getI1Type(), 1);
3094+
rewriter.replaceOpWithNewOp<mlir::LLVM::AssumeOp>(
3095+
op, cond, "separate_storage",
3096+
mlir::ValueRange{adaptor.getPtr1(), adaptor.getPtr2()});
3097+
return mlir::success();
3098+
}
3099+
};
3100+
30413101
static mlir::Value createLLVMBitOp(mlir::Location loc,
30423102
const llvm::Twine &llvmIntrinBaseName,
30433103
mlir::Type resultTy, mlir::Value operand,
@@ -4314,6 +4374,7 @@ void populateCIRToLLVMConversionPatterns(
43144374
CIRClearCacheOpLowering, CIREhTypeIdOpLowering, CIRCatchParamOpLowering,
43154375
CIRResumeOpLowering, CIRAllocExceptionOpLowering,
43164376
CIRFreeExceptionOpLowering, CIRThrowOpLowering, CIRIntrinsicCallLowering,
4377+
CIRAssumeLowering, CIRAssumeAlignedLowering, CIRAssumeSepStorageLowering,
43174378
CIRBaseClassAddrOpLowering, CIRDerivedClassAddrOpLowering,
43184379
CIRVTTAddrPointOpLowering, CIRIsFPClassOpLowering, CIRAbsOpLowering,
43194380
CIRMemMoveOpLowering, CIRMemsetOpLowering

clang/test/CIR/CodeGen/builtin-assume.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir
22
// RUN: FileCheck %s --check-prefix=CIR --input-file=%t.cir
3+
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t.ll
4+
// RUN: FileCheck %s --check-prefix=LLVM --input-file=%t.ll
35

46
int test_assume(int x) {
57
__builtin_assume(x > 0);
@@ -13,6 +15,10 @@ int test_assume(int x) {
1315
// CIR-NEXT: cir.assume %[[#cond]] : !cir.bool
1416
// CIR: }
1517

18+
// LLVM: @_Z11test_assumei
19+
// LLVM: %[[#cond:]] = trunc i8 %{{.+}} to i1
20+
// LLVM-NEXT: call void @llvm.assume(i1 %[[#cond]])
21+
1622
int test_assume_aligned(int *ptr) {
1723
int *aligned = (int *)__builtin_assume_aligned(ptr, 8);
1824
return *aligned;
@@ -26,6 +32,11 @@ int test_assume_aligned(int *ptr) {
2632
// CIR-NEXT: %{{.+}} = cir.load %[[#aligned2]] : !cir.ptr<!s32i>, !s32i
2733
// CIR: }
2834

35+
// LLVM: @_Z19test_assume_alignedPi
36+
// LLVM: %[[#ptr:]] = load ptr, ptr %{{.+}}, align 8
37+
// LLVM-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr %[[#ptr]], i64 8) ]
38+
// LLVM-NEXT: store ptr %[[#ptr]], ptr %{{.+}}, align 8
39+
2940
int test_assume_aligned_offset(int *ptr) {
3041
int *aligned = (int *)__builtin_assume_aligned(ptr, 8, 4);
3142
return *aligned;
@@ -41,6 +52,11 @@ int test_assume_aligned_offset(int *ptr) {
4152
// CIR-NEXT: %{{.+}} = cir.load %[[#aligned2]] : !cir.ptr<!s32i>, !s32i
4253
// CIR: }
4354

55+
// LLVM: @_Z26test_assume_aligned_offsetPi
56+
// LLVM: %[[#ptr:]] = load ptr, ptr %{{.+}}, align 8
57+
// LLVM-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr %[[#ptr]], i64 8, i64 4) ]
58+
// LLVM-NEXT: store ptr %[[#ptr]], ptr %{{.+}}, align 8
59+
4460
int test_separate_storage(int *p1, int *p2) {
4561
__builtin_assume_separate_storage(p1, p2);
4662
return *p1 + *p2;
@@ -53,3 +69,8 @@ int test_separate_storage(int *p1, int *p2) {
5369
// CIR-NEXT: %[[#p2_voidptr:]] = cir.cast(bitcast, %[[#p2]] : !cir.ptr<!s32i>), !cir.ptr<!void>
5470
// CIR-NEXT: cir.assume.separate_storage %[[#p1_voidptr]], %[[#p2_voidptr]] : !cir.ptr<!void>
5571
// CIR: }
72+
73+
// LLVM: @_Z21test_separate_storagePiS_
74+
// LLVM: %[[#ptr1:]] = load ptr, ptr %{{.+}}, align 8
75+
// LLVM-NEXT: %[[#ptr2:]] = load ptr, ptr %{{.+}}, align 8
76+
// LLVM-NEXT: call void @llvm.assume(i1 true) [ "separate_storage"(ptr %[[#ptr1]], ptr %[[#ptr2]]) ]

0 commit comments

Comments
 (0)