[clang] The pragma STDC CX_LIMITED_RANGE ON should have precedence. (PR #98520)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 12 13:18:20 PDT 2024
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
More information about the cfe-commits
mailing list