@@ -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+
30373097static 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
0 commit comments