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