@@ -1299,8 +1299,18 @@ mlir::LogicalResult CIRToLLVMCastOpLowering::matchAndRewrite(
12991299 }
13001300 case cir::CastKind::bitcast: {
13011301 auto dstTy = castOp.getType ();
1302- auto llvmSrcVal = adaptor.getOperands ().front ();
13031302 auto llvmDstTy = getTypeConverter ()->convertType (dstTy);
1303+
1304+ if (mlir::isa<cir::DataMemberType>(castOp.getSrc ().getType ())) {
1305+ mlir::Value loweredResult = lowerMod->getCXXABI ().lowerDataMemberBitcast (
1306+ castOp, llvmDstTy, src, rewriter);
1307+ rewriter.replaceOp (castOp, loweredResult);
1308+ return mlir::success ();
1309+ }
1310+ if (mlir::isa<cir::MethodType>(castOp.getSrc ().getType ()))
1311+ llvm_unreachable (" NYI" );
1312+
1313+ auto llvmSrcVal = adaptor.getOperands ().front ();
13041314 rewriter.replaceOpWithNewOp <mlir::LLVM::BitcastOp>(castOp, llvmDstTy,
13051315 llvmSrcVal);
13061316 return mlir::success ();
@@ -1324,6 +1334,16 @@ mlir::LogicalResult CIRToLLVMCastOpLowering::matchAndRewrite(
13241334 llvmSrcVal);
13251335 break ;
13261336 }
1337+ case cir::CastKind::member_ptr_to_bool: {
1338+ mlir::Value loweredResult;
1339+ if (mlir::isa<cir::MethodType>(castOp.getSrc ().getType ()))
1340+ llvm_unreachable (" NYI" );
1341+ else
1342+ loweredResult = lowerMod->getCXXABI ().lowerDataMemberToBoolCast (
1343+ castOp, src, rewriter);
1344+ rewriter.replaceOp (castOp, loweredResult);
1345+ break ;
1346+ }
13271347 default : {
13281348 return castOp.emitError (" Unhandled cast kind: " )
13291349 << castOp.getKindAttrName ();
@@ -2902,6 +2922,14 @@ mlir::LogicalResult CIRToLLVMCmpOpLowering::matchAndRewrite(
29022922 mlir::ConversionPatternRewriter &rewriter) const {
29032923 auto type = cmpOp.getLhs ().getType ();
29042924
2925+ if (mlir::isa<cir::DataMemberType>(type)) {
2926+ assert (lowerMod && " lowering module is not available" );
2927+ mlir::Value loweredResult = lowerMod->getCXXABI ().lowerDataMemberCmp (
2928+ cmpOp, adaptor.getLhs (), adaptor.getRhs (), rewriter);
2929+ rewriter.replaceOp (cmpOp, loweredResult);
2930+ return mlir::success ();
2931+ }
2932+
29052933 // Lower to LLVM comparison op.
29062934 // if (auto intTy = mlir::dyn_cast<cir::IntType>(type)) {
29072935 if (mlir::isa<cir::IntType, mlir::IntegerType>(type)) {
@@ -4087,6 +4115,7 @@ void populateCIRToLLVMConversionPatterns(
40874115 argsVarMap, patterns.getContext ());
40884116 patterns.add <
40894117 // clang-format off
4118+ CIRToLLVMCastOpLowering,
40904119 CIRToLLVMLoadOpLowering,
40914120 CIRToLLVMStoreOpLowering,
40924121 CIRToLLVMGlobalOpLowering,
@@ -4096,14 +4125,14 @@ void populateCIRToLLVMConversionPatterns(
40964125 patterns.add <
40974126 // clang-format off
40984127 CIRToLLVMBaseDataMemberOpLowering,
4128+ CIRToLLVMCmpOpLowering,
40994129 CIRToLLVMDerivedDataMemberOpLowering,
41004130 CIRToLLVMGetRuntimeMemberOpLowering
41014131 // clang-format on
41024132 >(converter, patterns.getContext (), lowerModule);
41034133 patterns.add <
41044134 // clang-format off
41054135 CIRToLLVMPtrStrideOpLowering,
4106- CIRToLLVMCastOpLowering,
41074136 CIRToLLVMInlineAsmOpLowering
41084137 // clang-format on
41094138 >(converter, patterns.getContext (), dataLayout);
@@ -4132,7 +4161,6 @@ void populateCIRToLLVMConversionPatterns(
41324161 CIRToLLVMCallOpLowering,
41334162 CIRToLLVMCatchParamOpLowering,
41344163 CIRToLLVMClearCacheOpLowering,
4135- CIRToLLVMCmpOpLowering,
41364164 CIRToLLVMCmpThreeWayOpLowering,
41374165 CIRToLLVMComplexCreateOpLowering,
41384166 CIRToLLVMComplexImagOpLowering,
0 commit comments