@@ -460,6 +460,81 @@ mlir::LogicalResult CIRToLLVMAssumeOpLowering::matchAndRewrite(
460460 return mlir::success ();
461461}
462462
463+ mlir::LogicalResult CIRToLLVMBitClrsbOpLowering::matchAndRewrite (
464+ cir::BitClrsbOp op, OpAdaptor adaptor,
465+ mlir::ConversionPatternRewriter &rewriter) const {
466+ auto zero = rewriter.create <mlir::LLVM::ConstantOp>(
467+ op.getLoc (), adaptor.getInput ().getType (), 0 );
468+ auto isNeg = rewriter.create <mlir::LLVM::ICmpOp>(
469+ op.getLoc (),
470+ mlir::LLVM::ICmpPredicateAttr::get (rewriter.getContext (),
471+ mlir::LLVM::ICmpPredicate::slt),
472+ adaptor.getInput (), zero);
473+
474+ auto negOne = rewriter.create <mlir::LLVM::ConstantOp>(
475+ op.getLoc (), adaptor.getInput ().getType (), -1 );
476+ auto flipped = rewriter.create <mlir::LLVM::XOrOp>(op.getLoc (),
477+ adaptor.getInput (), negOne);
478+
479+ auto select = rewriter.create <mlir::LLVM::SelectOp>(
480+ op.getLoc (), isNeg, flipped, adaptor.getInput ());
481+
482+ auto resTy = getTypeConverter ()->convertType (op.getType ());
483+ auto clz = rewriter.create <mlir::LLVM::CountLeadingZerosOp>(
484+ op.getLoc (), resTy, select, /* is_zero_poison=*/ false );
485+
486+ auto one = rewriter.create <mlir::LLVM::ConstantOp>(op.getLoc (), resTy, 1 );
487+ auto res = rewriter.create <mlir::LLVM::SubOp>(op.getLoc (), clz, one);
488+ rewriter.replaceOp (op, res);
489+
490+ return mlir::LogicalResult::success ();
491+ }
492+
493+ mlir::LogicalResult CIRToLLVMBitClzOpLowering::matchAndRewrite (
494+ cir::BitClzOp op, OpAdaptor adaptor,
495+ mlir::ConversionPatternRewriter &rewriter) const {
496+ auto resTy = getTypeConverter ()->convertType (op.getType ());
497+ auto llvmOp = rewriter.create <mlir::LLVM::CountLeadingZerosOp>(
498+ op.getLoc (), resTy, adaptor.getInput (), op.getPoisonZero ());
499+ rewriter.replaceOp (op, llvmOp);
500+ return mlir::LogicalResult::success ();
501+ }
502+
503+ mlir::LogicalResult CIRToLLVMBitCtzOpLowering::matchAndRewrite (
504+ cir::BitCtzOp op, OpAdaptor adaptor,
505+ mlir::ConversionPatternRewriter &rewriter) const {
506+ auto resTy = getTypeConverter ()->convertType (op.getType ());
507+ auto llvmOp = rewriter.create <mlir::LLVM::CountTrailingZerosOp>(
508+ op.getLoc (), resTy, adaptor.getInput (), op.getPoisonZero ());
509+ rewriter.replaceOp (op, llvmOp);
510+ return mlir::LogicalResult::success ();
511+ }
512+
513+ mlir::LogicalResult CIRToLLVMBitParityOpLowering::matchAndRewrite (
514+ cir::BitParityOp op, OpAdaptor adaptor,
515+ mlir::ConversionPatternRewriter &rewriter) const {
516+ auto resTy = getTypeConverter ()->convertType (op.getType ());
517+ auto popcnt = rewriter.create <mlir::LLVM::CtPopOp>(op.getLoc (), resTy,
518+ adaptor.getInput ());
519+
520+ auto one = rewriter.create <mlir::LLVM::ConstantOp>(op.getLoc (), resTy, 1 );
521+ auto popcntMod2 =
522+ rewriter.create <mlir::LLVM::AndOp>(op.getLoc (), popcnt, one);
523+ rewriter.replaceOp (op, popcntMod2);
524+
525+ return mlir::LogicalResult::success ();
526+ }
527+
528+ mlir::LogicalResult CIRToLLVMBitPopcountOpLowering::matchAndRewrite (
529+ cir::BitPopcountOp op, OpAdaptor adaptor,
530+ mlir::ConversionPatternRewriter &rewriter) const {
531+ auto resTy = getTypeConverter ()->convertType (op.getType ());
532+ auto llvmOp = rewriter.create <mlir::LLVM::CtPopOp>(op.getLoc (), resTy,
533+ adaptor.getInput ());
534+ rewriter.replaceOp (op, llvmOp);
535+ return mlir::LogicalResult::success ();
536+ }
537+
463538mlir::LogicalResult CIRToLLVMBrCondOpLowering::matchAndRewrite (
464539 cir::BrCondOp brOp, OpAdaptor adaptor,
465540 mlir::ConversionPatternRewriter &rewriter) const {
@@ -1955,6 +2030,11 @@ void ConvertCIRToLLVMPass::runOnOperation() {
19552030 CIRToLLVMAssumeOpLowering,
19562031 CIRToLLVMBaseClassAddrOpLowering,
19572032 CIRToLLVMBinOpLowering,
2033+ CIRToLLVMBitClrsbOpLowering,
2034+ CIRToLLVMBitClzOpLowering,
2035+ CIRToLLVMBitCtzOpLowering,
2036+ CIRToLLVMBitParityOpLowering,
2037+ CIRToLLVMBitPopcountOpLowering,
19582038 CIRToLLVMBrCondOpLowering,
19592039 CIRToLLVMBrOpLowering,
19602040 CIRToLLVMCallOpLowering,
0 commit comments