@@ -3038,6 +3038,66 @@ class CIRIntrinsicCallLowering
3038
3038
}
3039
3039
};
3040
3040
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
+
3041
3101
static mlir::Value createLLVMBitOp (mlir::Location loc,
3042
3102
const llvm::Twine &llvmIntrinBaseName,
3043
3103
mlir::Type resultTy, mlir::Value operand,
@@ -4314,6 +4374,7 @@ void populateCIRToLLVMConversionPatterns(
4314
4374
CIRClearCacheOpLowering, CIREhTypeIdOpLowering, CIRCatchParamOpLowering,
4315
4375
CIRResumeOpLowering, CIRAllocExceptionOpLowering,
4316
4376
CIRFreeExceptionOpLowering, CIRThrowOpLowering, CIRIntrinsicCallLowering,
4377
+ CIRAssumeLowering, CIRAssumeAlignedLowering, CIRAssumeSepStorageLowering,
4317
4378
CIRBaseClassAddrOpLowering, CIRDerivedClassAddrOpLowering,
4318
4379
CIRVTTAddrPointOpLowering, CIRIsFPClassOpLowering, CIRAbsOpLowering,
4319
4380
CIRMemMoveOpLowering, CIRMemsetOpLowering
0 commit comments