diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index 23b75e89acaa..bfcf8c021974 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -4794,6 +4794,7 @@ class BinaryFPToFPBuiltinOp let llvmOp = llvmOpName; } +def ATan2Op: BinaryFPToFPBuiltinOp<"atan2", "ATan2Op">; def CopysignOp : BinaryFPToFPBuiltinOp<"copysign", "CopySignOp">; def FMaxNumOp : BinaryFPToFPBuiltinOp<"fmaxnum", "MaxNumOp">; def FMinNumOp : BinaryFPToFPBuiltinOp<"fminnum", "MinNumOp">; @@ -4802,6 +4803,7 @@ def FMinimumOp : BinaryFPToFPBuiltinOp<"fminimum", "MinimumOp">; def FModOp : BinaryFPToFPBuiltinOp<"fmod", "FRemOp">; def PowOp : BinaryFPToFPBuiltinOp<"pow", "PowOp">; + def IsFPClassOp : CIR_Op<"is_fp_class"> { let summary = "Corresponding to the `__builtin_fpclassify` builtin function in clang"; diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp index 608ed140ac9a..74998345e58b 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp @@ -661,7 +661,8 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, case Builtin::BI__builtin_asinf16: case Builtin::BI__builtin_asinl: case Builtin::BI__builtin_asinf128: - llvm_unreachable("Builtin::BIasin like NYI"); + assert(!cir::MissingFeatures::fastMathFlags()); + return emitUnaryMaybeConstrainedFPBuiltin(*this, *E); case Builtin::BIatan: case Builtin::BIatanf: @@ -671,7 +672,8 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, case Builtin::BI__builtin_atanf16: case Builtin::BI__builtin_atanl: case Builtin::BI__builtin_atanf128: - llvm_unreachable("Builtin::BIatan like NYI"); + assert(!cir::MissingFeatures::fastMathFlags()); + return emitUnaryMaybeConstrainedFPBuiltin(*this, *E); case Builtin::BIatan2: case Builtin::BIatan2f: @@ -681,7 +683,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, case Builtin::BI__builtin_atan2f16: case Builtin::BI__builtin_atan2l: case Builtin::BI__builtin_atan2f128: - llvm_unreachable("Builtin::BIatan2 like NYI"); + return emitBinaryFPBuiltin(*this, *E); case Builtin::BIceil: case Builtin::BIceilf: diff --git a/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp b/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp index ee0f33ae4428..cc3452ba0b39 100644 --- a/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp +++ b/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp @@ -293,6 +293,22 @@ class CIRUnaryMathOpLowering : public mlir::OpConversionPattern { } }; +class CIRATan2OpLowering : public mlir::OpConversionPattern { +public: + using mlir::OpConversionPattern::OpConversionPattern; + + mlir::LogicalResult + matchAndRewrite(cir::ATan2Op op, OpAdaptor adaptor, + mlir::ConversionPatternRewriter &rewriter) const override { + mlir::Location loc = op.getLoc(); + auto resultType = op.getResult().getType(); + + rewriter.replaceOpWithNewOp( + op, resultType, adaptor.getLhs(), adaptor.getRhs()); + return mlir::success(); + } +}; + using CIRASinOpLowering = CIRUnaryMathOpLowering; using CIRSinOpLowering = CIRUnaryMathOpLowering; @@ -1258,24 +1274,24 @@ void populateCIRToMLIRConversionPatterns(mlir::RewritePatternSet &patterns, mlir::TypeConverter &converter) { patterns.add(patterns.getContext()); - patterns - .add( - converter, patterns.getContext()); + patterns.add< + CIRATanOpLowering, CIRATan2OpLowering, CIRCmpOpLowering, + CIRCallOpLowering, CIRUnaryOpLowering, CIRBinOpLowering, + CIRLoadOpLowering, CIRConstantOpLowering, CIRStoreOpLowering, + CIRAllocaOpLowering, CIRFuncOpLowering, CIRScopeOpLowering, + CIRBrCondOpLowering, CIRTernaryOpLowering, CIRYieldOpLowering, + CIRCosOpLowering, CIRGlobalOpLowering, CIRGetGlobalOpLowering, + CIRCastOpLowering, CIRPtrStrideOpLowering, CIRSqrtOpLowering, + CIRCeilOpLowering, CIRExp2OpLowering, CIRExpOpLowering, CIRFAbsOpLowering, + CIRAbsOpLowering, CIRFloorOpLowering, CIRLog10OpLowering, + CIRLog2OpLowering, CIRLogOpLowering, CIRRoundOpLowering, + CIRPtrStrideOpLowering, CIRSinOpLowering, CIRShiftOpLowering, + CIRBitClzOpLowering, CIRBitCtzOpLowering, CIRBitPopcountOpLowering, + CIRBitClrsbOpLowering, CIRBitFfsOpLowering, CIRBitParityOpLowering, + CIRIfOpLowering, CIRVectorCreateLowering, CIRVectorInsertLowering, + CIRVectorExtractLowering, CIRVectorCmpOpLowering, CIRACosOpLowering, + CIRASinOpLowering, CIRUnreachableOpLowering, CIRTanOpLowering>( + converter, patterns.getContext()); } static mlir::TypeConverter prepareTypeConverter() {