llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-codegen Author: Zahira Ammarguellat (zahiraam) <details> <summary>Changes</summary> The `pragma STDC CX_LIMITED_RANGE` should have precedence over the command line `-fcomplex-arithmetic`. --- Full diff: https://github.com/llvm/llvm-project/pull/98520.diff 2 Files Affected: - (modified) clang/lib/CodeGen/CGExprComplex.cpp (+35-9) - (modified) clang/test/CodeGen/pragma-cx-limited-range.c (+12-16) ``````````diff diff --git a/clang/lib/CodeGen/CGExprComplex.cpp b/clang/lib/CodeGen/CGExprComplex.cpp index 84ad3b566b647..de526a74b0f2d 100644 --- a/clang/lib/CodeGen/CGExprComplex.cpp +++ b/clang/lib/CodeGen/CGExprComplex.cpp @@ -328,12 +328,21 @@ class ComplexExprEmitter } } - QualType getPromotionType(QualType Ty, bool IsDivOpCode = false) { + QualType getPromotionType(FPOptionsOverride Features, QualType Ty, + bool IsDivOpCode = false) { if (auto *CT = Ty->getAs<ComplexType>()) { QualType ElementType = CT->getElementType(); - if (IsDivOpCode && ElementType->isFloatingType() && - CGF.getLangOpts().getComplexRange() == - LangOptions::ComplexRangeKind::CX_Promoted) + bool isFloatingType = ElementType->isFloatingType(); + bool isComplexRangePromoted = CGF.getLangOpts().getComplexRange() == + LangOptions::ComplexRangeKind::CX_Promoted; + bool hasNoComplexRangeOverride = !Features.hasComplexRangeOverride(); + bool hasMatchingComplexRange = + Features.hasComplexRangeOverride() && + Features.getComplexRangeOverride() == + CGF.getLangOpts().getComplexRange(); + + if (IsDivOpCode && isFloatingType && isComplexRangePromoted && + (hasNoComplexRangeOverride || hasMatchingComplexRange)) return HigherPrecisionTypeForComplexArithmetic(ElementType, IsDivOpCode); if (ElementType.UseExcessPrecision(CGF.getContext())) @@ -347,6 +356,8 @@ class ComplexExprEmitter #define HANDLEBINOP(OP) \ ComplexPairTy VisitBin##OP(const BinaryOperator *E) { \ QualType promotionTy = getPromotionType( \ + (E->hasStoredFPFeatures() ? E->getStoredFPFeatures() \ + : FPOptionsOverride()), \ E->getType(), \ (E->getOpcode() == BinaryOperatorKind::BO_Div) ? true : false); \ ComplexPairTy result = EmitBin##OP(EmitBinOps(E, promotionTy)); \ @@ -642,7 +653,10 @@ ComplexPairTy ComplexExprEmitter::EmitCast(CastKind CK, Expr *Op, ComplexPairTy ComplexExprEmitter::VisitUnaryPlus(const UnaryOperator *E, QualType PromotionType) { QualType promotionTy = PromotionType.isNull() - ? getPromotionType(E->getSubExpr()->getType()) + ? getPromotionType((E->hasStoredFPFeatures() + ? E->getStoredFPFeatures() + : FPOptionsOverride()), + E->getSubExpr()->getType()) : PromotionType; ComplexPairTy result = VisitPlus(E, promotionTy); if (!promotionTy.isNull()) @@ -662,7 +676,10 @@ ComplexPairTy ComplexExprEmitter::VisitPlus(const UnaryOperator *E, ComplexPairTy ComplexExprEmitter::VisitUnaryMinus(const UnaryOperator *E, QualType PromotionType) { QualType promotionTy = PromotionType.isNull() - ? getPromotionType(E->getSubExpr()->getType()) + ? getPromotionType((E->hasStoredFPFeatures() + ? E->getStoredFPFeatures() + : FPOptionsOverride()), + E->getSubExpr()->getType()) : PromotionType; ComplexPairTy result = VisitMinus(E, promotionTy); if (!promotionTy.isNull()) @@ -1223,13 +1240,19 @@ EmitCompoundAssignLValue(const CompoundAssignOperator *E, // __block variables need to have the rhs evaluated first, plus this should // improve codegen a little. QualType PromotionTypeCR; - PromotionTypeCR = getPromotionType(E->getComputationResultType()); + PromotionTypeCR = + getPromotionType((E->hasStoredFPFeatures() ? E->getStoredFPFeatures() + : FPOptionsOverride()), + E->getComputationResultType()); if (PromotionTypeCR.isNull()) PromotionTypeCR = E->getComputationResultType(); OpInfo.Ty = PromotionTypeCR; QualType ComplexElementTy = OpInfo.Ty->castAs<ComplexType>()->getElementType(); - QualType PromotionTypeRHS = getPromotionType(E->getRHS()->getType()); + QualType PromotionTypeRHS = + getPromotionType((E->hasStoredFPFeatures() ? E->getStoredFPFeatures() + : FPOptionsOverride()), + E->getRHS()->getType()); // The RHS should have been converted to the computation type. if (E->getRHS()->getType()->isRealFloatingType()) { @@ -1257,7 +1280,10 @@ EmitCompoundAssignLValue(const CompoundAssignOperator *E, // Load from the l-value and convert it. SourceLocation Loc = E->getExprLoc(); - QualType PromotionTypeLHS = getPromotionType(E->getComputationLHSType()); + QualType PromotionTypeLHS = + getPromotionType((E->hasStoredFPFeatures() ? E->getStoredFPFeatures() + : FPOptionsOverride()), + E->getComputationLHSType()); if (LHSTy->isAnyComplexType()) { ComplexPairTy LHSVal = EmitLoadOfLValue(LHS, Loc); if (!PromotionTypeLHS.isNull()) diff --git a/clang/test/CodeGen/pragma-cx-limited-range.c b/clang/test/CodeGen/pragma-cx-limited-range.c index 68615348c1871..1c9bf40fd714f 100644 --- a/clang/test/CodeGen/pragma-cx-limited-range.c +++ b/clang/test/CodeGen/pragma-cx-limited-range.c @@ -106,21 +106,17 @@ _Complex float pragma_on_div(_Complex float a, _Complex float b) { // IMPRVD-NEXT: fdiv float // IMPRVD-NEXT: fdiv float - // PRMTD: fpext float {{.*}} to double - // PRMTD: fpext float {{.*}} to double - // PRMTD: fmul double - // PRMTD: fmul double - // PRMTD: fadd double - // PRMTD: fmul double - // PRMTD: fmul double - // PRMTD: fadd double - // PRMTD: fmul double - // PRMTD: fmul double - // PRMTD: fsub double - // PRMTD: fdiv double - // PRMTD: fdiv double - // PRMTD: fptrunc double - // PRMTD: fptrunc double + // PRMTD: fmul float + // PRMTD-NEXT: fmul float + // PRMTD-NEXT: fadd float + // PRMTD-NEXT: fmul float + // PRMTD-NEXT: fmul float + // PRMTD-NEXT: fadd float + // PRMTD-NEXT: fmul float + // PRMTD-NEXT: fmul float + // PRMTD-NEXT: fsub float + // PRMTD-NEXT: fdiv float + // PRMTD-NEXT: fdiv float return a / b; } @@ -135,7 +131,7 @@ _Complex float pragma_off_div(_Complex float a, _Complex float b) { // IMPRVD: call {{.*}} @__divsc3 - // PRMTD: call {{.*}} @__divdc3 + // PRMTD: call {{.*}} @__divsc3 return a / b; } `````````` </details> https://github.com/llvm/llvm-project/pull/98520 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits