Skip to content

Commit ff2b3d9

Browse files
committed
Addressed review comments.
1 parent 27011c8 commit ff2b3d9

File tree

10 files changed

+118
-143
lines changed

10 files changed

+118
-143
lines changed

clang/include/clang/Basic/FPOptions.def

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@ OPTION(BFloat16ExcessPrecision, LangOptions::ExcessPrecisionKind, 2, Float16Exce
3030
OPTION(FPAccuracy, LangOptions::FPAccuracyKind, 3, BFloat16ExcessPrecision)
3131
OPTION(MathErrno, bool, 1, FPAccuracy)
3232
OPTION(ComplexRange, LangOptions::ComplexRangeKind, 2, MathErrno)
33-
OPTION(OffloadFp32PrecDiv, bool, 1, ComplexRange)
34-
OPTION(OffloadFp32PrecSqrt, bool, 1, OffloadFp32PrecDiv)
33+
OPTION(OffloadFP32PrecDi, bool, 1, ComplexRange)
34+
OPTION(OffloadFP32PrecSqrt, bool, 1, OffloadFP32PrecDi)
3535
#undef OPTION

clang/include/clang/Basic/LangOptions.def

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,8 +372,8 @@ BENIGN_ENUM_LANGOPT(FPEvalMethod, FPEvalMethodKind, 2, FEM_UnsetOnCommandLine, "
372372
ENUM_LANGOPT(Float16ExcessPrecision, ExcessPrecisionKind, 2, FPP_Standard, "Intermediate truncation behavior for Float16 arithmetic")
373373
ENUM_LANGOPT(BFloat16ExcessPrecision, ExcessPrecisionKind, 2, FPP_Standard, "Intermediate truncation behavior for BFloat16 arithmetic")
374374
BENIGN_ENUM_LANGOPT(FPAccuracy, FPAccuracyKind, 3, FPA_Default, "Accuracy for floating point operations and library functions")
375-
LANGOPT(OffloadFp32PrecDiv, 1, 1, "Return correctly rounded results of fdiv")
376-
LANGOPT(OffloadFp32PrecSqrt, 1, 1, "Return correctly rounded results of sqrt")
375+
LANGOPT(OffloadFP32PrecDiv, 1, 1, "Return correctly rounded results of fdiv")
376+
LANGOPT(OffloadFP32PrecSqrt, 1, 1, "Return correctly rounded results of sqrt")
377377
LANGOPT(NoBitFieldTypeAlign , 1, 0, "bit-field type alignment")
378378
LANGOPT(HexagonQdsp6Compat , 1, 0, "hexagon-qdsp6 backward compatibility")
379379
LANGOPT(ObjCAutoRefCount , 1, 0, "Objective-C automated reference counting")

clang/include/clang/Driver/Options.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,15 +1158,15 @@ defm cx_fortran_rules: BoolOptionWithoutMarshalling<"f", "cx-fortran-rules",
11581158
"for complex arithmetic operations">>;
11591159

11601160
defm offload_fp32_prec_div: BoolOption<"f", "offload-fp32-prec-div",
1161-
LangOpts<"OffloadFp32PrecDiv">, DefaultTrue,
1161+
LangOpts<"OffloadFP32PrecDiv">, DefaultTrue,
11621162
PosFlag<SetTrue, [], [ClangOption, CC1Option], "fdiv operations in offload device "
11631163
"code are required to return correctly rounded results.">,
11641164
NegFlag<SetFalse, [], [ClangOption, CC1Option], "fdiv operations in offload device "
11651165
"code are not required to return correctly rounded results.">>,
11661166
Group<f_Group>;
11671167

11681168
defm offload_fp32_prec_sqrt: BoolOption<"f", "offload-fp32-prec-sqrt",
1169-
LangOpts<"OffloadFp32PrecSqrt">, DefaultTrue,
1169+
LangOpts<"OffloadFP32PrecSqrt">, DefaultTrue,
11701170
PosFlag<SetTrue, [], [ClangOption, CC1Option], "sqrt operations in offload device "
11711171
"code are required to return correctly rounded results.">,
11721172
NegFlag<SetFalse, [], [ClangOption, CC1Option], "sqrt operations in offload device "

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -521,13 +521,6 @@ static Function *getIntrinsic(CodeGenFunction &CGF, llvm::Value *Src0,
521521
: CGF.CGM.getIntrinsic(IntrinsicID, Src0->getType());
522522
}
523523

524-
static bool hasAccuracyRequirement(CodeGenFunction &CGF, StringRef Name) {
525-
if (!CGF.getLangOpts().FPAccuracyVal.empty())
526-
return true;
527-
auto FuncMapIt = CGF.getLangOpts().FPAccuracyFuncMap.find(Name.str());
528-
return FuncMapIt != CGF.getLangOpts().FPAccuracyFuncMap.end();
529-
}
530-
531524
static Function *emitMaybeIntrinsic(CodeGenFunction &CGF, const CallExpr *E,
532525
unsigned FPAccuracyIntrinsicID,
533526
unsigned IntrinsicID, llvm::Value *Src0,
@@ -546,7 +539,7 @@ static Function *emitMaybeIntrinsic(CodeGenFunction &CGF, const CallExpr *E,
546539
CGF.CGM.getContext().BuiltinInfo.getName(CGF.getCurrentBuiltinID());
547540
// Use fpbuiltin intrinsic only when needed.
548541
Func = getIntrinsic(CGF, Src0, FPAccuracyIntrinsicID, IntrinsicID,
549-
hasAccuracyRequirement(CGF, Name));
542+
CGF.hasAccuracyRequirement(Name));
550543
}
551544
}
552545
}
@@ -24201,8 +24194,8 @@ llvm::CallInst *CodeGenFunction::MaybeEmitFPBuiltinofFD(
2420124194
// a TU fp-accuracy requested.
2420224195
const LangOptions &LangOpts = getLangOpts();
2420324196
if (hasFuncNameRequestedFPAccuracy(Name, LangOpts) ||
24204-
!LangOpts.FPAccuracyVal.empty() || !LangOpts.OffloadFp32PrecDiv ||
24205-
!LangOpts.OffloadFp32PrecSqrt) {
24197+
!LangOpts.FPAccuracyVal.empty() || !LangOpts.OffloadFP32PrecDiv ||
24198+
!LangOpts.OffloadFP32PrecSqrt) {
2420624199
llvm::Function *Func =
2420724200
CGM.getIntrinsic(FPAccuracyIntrinsicID, IRArgs[0]->getType());
2420824201
return CreateBuiltinCallWithAttr(*this, Name, Func, ArrayRef(IRArgs),

clang/lib/CodeGen/CGCall.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1879,9 +1879,10 @@ void CodeGenModule::getDefaultFunctionFPAccuracyAttributes(
18791879
// the 'FPAccuracyFuncMap'; if no accuracy is mapped to Name (FuncAttrs
18801880
// is empty), then set its accuracy from the TU's accuracy value.
18811881
if (!getLangOpts().FPAccuracyFuncMap.empty()) {
1882+
StringRef FPAccuracyVal;
18821883
auto FuncMapIt = getLangOpts().FPAccuracyFuncMap.find(Name.str());
18831884
if (FuncMapIt != getLangOpts().FPAccuracyFuncMap.end()) {
1884-
StringRef FPAccuracyVal = llvm::fp::getAccuracyForFPBuiltin(
1885+
FPAccuracyVal = llvm::fp::getAccuracyForFPBuiltin(
18851886
ID, FuncType, convertFPAccuracy(FuncMapIt->second));
18861887
assert(!FPAccuracyVal.empty() && "A valid accuracy value is expected");
18871888
FuncAttrs.addAttribute("fpbuiltin-max-error", FPAccuracyVal);
@@ -1899,9 +1900,9 @@ void CodeGenModule::getDefaultFunctionFPAccuracyAttributes(
18991900
MD = llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
19001901
Int32Ty, convertFPAccuracyToAspect(getLangOpts().FPAccuracyVal)));
19011902
}
1902-
if (Name == "sqrt" && !getLangOpts().OffloadFp32PrecSqrt)
1903+
if (Name == "sqrt" && !getLangOpts().OffloadFP32PrecSqrt)
19031904
FPAccuracyVal = "3.0";
1904-
if (Name == "fdiv" && !getLangOpts().OffloadFp32PrecDiv)
1905+
if (Name == "fdiv" && !getLangOpts().OffloadFP32PrecDiv)
19051906
FPAccuracyVal = "2.5";
19061907
if (!FPAccuracyVal.empty())
19071908
FuncAttrs.addAttribute("fpbuiltin-max-error", FPAccuracyVal);
@@ -5802,13 +5803,13 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
58025803
if (FD && FD->getNameInfo().getName().isIdentifier()) {
58035804
StringRef FuncName = FD->getName();
58045805
const bool IsFloat32Type = FD->getReturnType()->isFloat32Type();
5805-
bool hasFPAccuracyFuncMap = !getLangOpts().FPAccuracyFuncMap.empty();
5806+
bool hasFPAccuracyFuncMap = hasAccuracyRequirement(FuncName);
58065807
bool hasFPAccuracyVal = !getLangOpts().FPAccuracyVal.empty();
58075808
bool isFp32SqrtFunction =
5808-
(FuncName == "sqrt" && !getLangOpts().OffloadFp32PrecSqrt &&
5809+
(FuncName == "sqrt" && !getLangOpts().OffloadFP32PrecSqrt &&
58095810
IsFloat32Type);
58105811
bool isFP32FdivFunction =
5811-
(FuncName == "fdiv" && !getLangOpts().OffloadFp32PrecDiv &&
5812+
(FuncName == "fdiv" && !getLangOpts().OffloadFP32PrecDiv &&
58125813
IsFloat32Type);
58135814
if (hasFPAccuracyFuncMap || hasFPAccuracyVal || isFp32SqrtFunction ||
58145815
isFP32FdivFunction) {

clang/lib/CodeGen/CodeGenFunction.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,13 @@ clang::ToConstrainedExceptMD(LangOptions::FPExceptionModeKind Kind) {
122122
}
123123
}
124124

125+
bool CodeGenFunction::hasAccuracyRequirement(StringRef Name) {
126+
if (!getLangOpts().FPAccuracyVal.empty())
127+
return true;
128+
auto FuncMapIt = getLangOpts().FPAccuracyFuncMap.find(Name.str());
129+
return FuncMapIt != getLangOpts().FPAccuracyFuncMap.end();
130+
}
131+
125132
void CodeGenFunction::SetFastMathFlags(FPOptions FPFeatures) {
126133
llvm::FastMathFlags FMF;
127134
FMF.setAllowReassoc(FPFeatures.getAllowFPReassociate());

clang/lib/CodeGen/CodeGenFunction.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5213,6 +5213,8 @@ class CodeGenFunction : public CodeGenTypeCache {
52135213
/// CodeGenOpts.
52145214
void SetDivFPAccuracy(llvm::Value *Val);
52155215

5216+
bool hasAccuracyRequirement(StringRef Name);
5217+
52165218
/// Set the codegen fast-math flags.
52175219
void SetFastMathFlags(FPOptions FPFeatures);
52185220

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1781,6 +1781,7 @@ void Clang::RenderTargetOptions(const llvm::Triple &EffectiveTriple,
17811781
switch (TC.getArch()) {
17821782
default:
17831783
break;
1784+
17841785
case llvm::Triple::arm:
17851786
case llvm::Triple::armeb:
17861787
case llvm::Triple::thumb:
@@ -3006,8 +3007,8 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
30063007
LangOptions::ComplexRangeKind Range = LangOptions::ComplexRangeKind::CX_None;
30073008
std::string ComplexRangeStr = "";
30083009
std::string GccRangeComplexOption = "";
3009-
bool NoOffloadFp32PrecDiv = false;
3010-
bool NoOffloadFp32PrecSqrt = false;
3010+
bool NoOffloadFP32PrecDiv = false;
3011+
bool NoOffloadFP32PrecSqrt = false;
30113012
bool IsDeviceOffloading = JA.isDeviceOffloading(Action::OFK_SYCL);
30123013

30133014
// Lambda to set fast-math options. This is also used by -ffp-model=fast
@@ -3041,8 +3042,8 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
30413042
if (IsDeviceOffloading) {
30423043
// when fp-model=fast is used the default precision for division and
30433044
// sqrt is not precise.
3044-
NoOffloadFp32PrecDiv = true;
3045-
NoOffloadFp32PrecSqrt = true;
3045+
NoOffloadFP32PrecDiv = true;
3046+
NoOffloadFP32PrecSqrt = true;
30463047
}
30473048
};
30483049

@@ -3072,33 +3073,37 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
30723073
CmdArgs.push_back(A->getValue());
30733074
}
30743075

3075-
auto toggleNoOffloadFp32PrecSqrt = [&]() {
3076-
if (NoOffloadFp32PrecSqrt)
3077-
NoOffloadFp32PrecSqrt = false;
3078-
else
3079-
NoOffloadFp32PrecSqrt = true;
3080-
};
3081-
3082-
auto toggleNoOffloadFp32PrecDiv = [&]() {
3083-
if (NoOffloadFp32PrecDiv)
3084-
NoOffloadFp32PrecDiv = false;
3085-
else
3086-
NoOffloadFp32PrecDiv = true;
3087-
};
3088-
30893076
auto addSPIRVArgs = [&](StringRef SPIRVArg) {
30903077
if (IsDeviceOffloading) {
30913078
if (!FPAccuracy.empty())
30923079
EmitAccuracyDiag(D, JA, FPAccuracy, SPIRVArg);
30933080

30943081
if (SPIRVArg == "-fno-offload-fp32-prec-div")
3095-
NoOffloadFp32PrecDiv = true;
3082+
NoOffloadFP32PrecDiv = true;
30963083
else if (SPIRVArg == "-fno-offload-fp32-prec-sqrt")
3097-
NoOffloadFp32PrecSqrt = true;
3084+
NoOffloadFP32PrecSqrt = true;
30983085
else if (SPIRVArg == "-foffload-fp32-prec-sqrt")
3099-
toggleNoOffloadFp32PrecSqrt();
3086+
NoOffloadFP32PrecSqrt = false;
31003087
else if (SPIRVArg == "-foffload-fp32-prec-div")
3101-
toggleNoOffloadFp32PrecDiv();
3088+
NoOffloadFP32PrecDiv = false;
3089+
}
3090+
};
3091+
3092+
auto ParseFPAccOption = [&](StringRef Val, bool &NoOffloadFlag) {
3093+
SmallVector<StringRef, 8> ValuesArr;
3094+
Val.split(ValuesArr, ":");
3095+
if (ValuesArr.size() == 1)
3096+
NoOffloadFlag = false;
3097+
if (ValuesArr.size() > 1) {
3098+
StringRef x = ValuesArr[1];
3099+
SmallVector<StringRef, 8> FuncsArr;
3100+
x.split(FuncsArr, ",");
3101+
for (const auto &V : FuncsArr) {
3102+
if (V == "fdiv")
3103+
NoOffloadFlag = false;
3104+
else if (V == "sqrt")
3105+
NoOffloadFlag = false;
3106+
}
31023107
}
31033108
};
31043109

@@ -3203,10 +3208,14 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
32033208
case options::OPT_ffp_accuracy_EQ: {
32043209
StringRef Val = A->getValue();
32053210
FPAccuracy = Val;
3206-
if (NoOffloadFp32PrecDiv)
3211+
if (NoOffloadFP32PrecDiv) {
32073212
EmitAccuracyDiag(D, JA, FPAccuracy, "-fno-offload-fp32-prec-div");
3208-
if (NoOffloadFp32PrecSqrt)
3213+
ParseFPAccOption(Val, NoOffloadFP32PrecDiv);
3214+
}
3215+
if (NoOffloadFP32PrecSqrt) {
32093216
EmitAccuracyDiag(D, JA, FPAccuracy, "-fno-offload-fp32-prec-sqrt");
3217+
ParseFPAccOption(Val, NoOffloadFP32PrecSqrt);
3218+
}
32103219
break;
32113220
}
32123221
case options::OPT_ffp_model_EQ: {
@@ -3621,9 +3630,9 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
36213630
if (Args.hasArg(options::OPT_fno_cx_fortran_rules))
36223631
CmdArgs.push_back("-fno-cx-fortran-rules");
36233632
if (IsDeviceOffloading) {
3624-
if (NoOffloadFp32PrecDiv)
3633+
if (NoOffloadFP32PrecDiv)
36253634
CmdArgs.push_back("-fno-offload-fp32-prec-div");
3626-
if (NoOffloadFp32PrecSqrt)
3635+
if (NoOffloadFP32PrecSqrt)
36273636
CmdArgs.push_back("-fno-offload-fp32-prec-sqrt");
36283637
}
36293638
}

clang/lib/Driver/ToolChains/Clang.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,6 @@ class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
5555
const llvm::opt::ArgList &Args,
5656
llvm::opt::ArgStringList &CmdArgs,
5757
bool KernelOrKext) const;
58-
void AddSPIRTargetArgs(const llvm::opt::ArgList &Args,
59-
llvm::opt::ArgStringList &CmdArgs, const JobAction &JA,
60-
const Driver &D) const;
6158
void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
6259
llvm::opt::ArgStringList &CmdArgs) const;
6360
void AddLoongArchTargetArgs(const llvm::opt::ArgList &Args,

0 commit comments

Comments
 (0)