Skip to content

Commit 3ccd60b

Browse files
Lancernlanza
authored andcommitted
[CIR][Lowering] Add LLVM lowering support for cir.assume (llvm#1066)
This PR adds LLVMIR lowering support for `cir.assume`, `cir.assume.aligned`, and `cir.assume.separate_storage`.
1 parent 905b873 commit 3ccd60b

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
@@ -3034,6 +3034,66 @@ class CIRIntrinsicCallLowering
30343034
}
30353035
};
30363036

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