@@ -4304,6 +4304,37 @@ class CIRAbsOpLowering : public mlir::OpConversionPattern<cir::AbsOp> {
4304
4304
return mlir::success ();
4305
4305
}
4306
4306
};
4307
+ class CIRSignBitOpLowering : public mlir ::OpConversionPattern<cir::SignBitOp> {
4308
+ public:
4309
+ using OpConversionPattern<cir::SignBitOp>::OpConversionPattern;
4310
+
4311
+ mlir::LogicalResult
4312
+ matchAndRewrite (cir::SignBitOp op, OpAdaptor adaptor,
4313
+ mlir::ConversionPatternRewriter &rewriter) const override {
4314
+ assert (!::cir::MissingFeatures::isPPC_FP128Ty ());
4315
+
4316
+ mlir::DataLayout layout (op->getParentOfType <mlir::ModuleOp>());
4317
+ int width = layout.getTypeSizeInBits (op.getInput ().getType ());
4318
+ if (auto longDoubleType =
4319
+ mlir::dyn_cast<cir::LongDoubleType>(op.getInput ().getType ())) {
4320
+ if (mlir::isa<cir::FP80Type>(longDoubleType.getUnderlying ())) {
4321
+ // see https://github.com/llvm/clangir/issues/1057
4322
+ llvm_unreachable (" NYI" );
4323
+ }
4324
+ }
4325
+ auto intTy = mlir::IntegerType::get (rewriter.getContext (), width);
4326
+ auto bitcast = rewriter.create <mlir::LLVM::BitcastOp>(op->getLoc (), intTy,
4327
+ adaptor.getInput ());
4328
+ auto zero = rewriter.create <mlir::LLVM::ConstantOp>(op->getLoc (), intTy, 0 );
4329
+ auto cmpResult = rewriter.create <mlir::LLVM::ICmpOp>(
4330
+ op.getLoc (), mlir::LLVM::ICmpPredicate::slt, bitcast.getResult (), zero);
4331
+ auto converted = rewriter.create <mlir::LLVM::ZExtOp>(
4332
+ op.getLoc (), mlir::IntegerType::get (rewriter.getContext (), 32 ),
4333
+ cmpResult);
4334
+ rewriter.replaceOp (op, converted);
4335
+ return mlir::success ();
4336
+ }
4337
+ };
4307
4338
4308
4339
void populateCIRToLLVMConversionPatterns (
4309
4340
mlir::RewritePatternSet &patterns, mlir::TypeConverter &converter,
@@ -4352,7 +4383,7 @@ void populateCIRToLLVMConversionPatterns(
4352
4383
CIRAssumeLowering, CIRAssumeAlignedLowering, CIRAssumeSepStorageLowering,
4353
4384
CIRBaseClassAddrOpLowering, CIRDerivedClassAddrOpLowering,
4354
4385
CIRVTTAddrPointOpLowering, CIRIsFPClassOpLowering, CIRAbsOpLowering,
4355
- CIRMemMoveOpLowering, CIRMemsetOpLowering
4386
+ CIRMemMoveOpLowering, CIRMemsetOpLowering, CIRSignBitOpLowering
4356
4387
#define GET_BUILTIN_LOWERING_LIST
4357
4388
#include " clang/CIR/Dialect/IR/CIRBuiltinsLowering.inc"
4358
4389
#undef GET_BUILTIN_LOWERING_LIST
0 commit comments