Skip to content

Commit 8cd6d8b

Browse files
committed
Put the code to handle the options in RenderFloatingPointOptions
function instead of adding a JobAction to handle it.
1 parent bdf78d7 commit 8cd6d8b

File tree

5 files changed

+219
-61
lines changed

5 files changed

+219
-61
lines changed

clang/include/clang/Basic/DiagnosticCommonKinds.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,10 +379,10 @@ def err_ppc_impossible_musttail: Error<
379379
def err_aix_musttail_unsupported: Error<
380380
"'musttail' attribute is not supported on AIX">;
381381

382-
def warn_acuracy_conflicts_with_explicit_target_prec_option : Warning<
382+
def warn_acuracy_conflicts_with_explicit_offload_fp32_prec_option : Warning<
383383
"floating point accuracy control '%0' conflicts with explicit target "
384384
"precision option '%1'">,
385-
InGroup<DiagGroup<"accuracy-conflicts-with-explicit-target-prec-option">>;
385+
InGroup<DiagGroup<"accuracy-conflicts-with-explicit-offload-fp32-prec-option">>;
386386

387387
// Source manager
388388
def err_cannot_open_file : Error<"cannot open file '%0': %1">, DefaultFatal;

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 74 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1721,39 +1721,6 @@ static void CollectARMPACBTIOptions(const ToolChain &TC, const ArgList &Args,
17211721
}
17221722
}
17231723

1724-
static void EmitAccuracyDiag(const Driver &D, const JobAction &JA,
1725-
StringRef AccuracValStr, StringRef TargetPrecStr) {
1726-
if (JA.isDeviceOffloading(Action::OFK_SYCL)) {
1727-
D.Diag(clang::diag::warn_acuracy_conflicts_with_explicit_target_prec_option)
1728-
<< AccuracValStr << TargetPrecStr;
1729-
}
1730-
}
1731-
1732-
void Clang::AddSPIRTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
1733-
const JobAction &JA, const Driver &D) const {
1734-
if (JA.isDeviceOffloading(Action::OFK_SYCL)) {
1735-
if (Arg *A = Args.getLastArg(options::OPT_ffp_model_EQ)) {
1736-
if (!strcmp(A->getValue(), "fast")) {
1737-
CmdArgs.push_back("-fno-offload-fp32-prec-div");
1738-
CmdArgs.push_back("-fno-offload-fp32-prec-sqrt");
1739-
}
1740-
} else {
1741-
if (Arg *A = Args.getLastArg(options::OPT_ffp_accuracy_EQ)) {
1742-
if (Args.getLastArg(options::OPT_fno_offload_fp32_prec_div))
1743-
EmitAccuracyDiag(D, JA, A->getValue(), "-fno-offload-fp32-prec-div");
1744-
if (Args.getLastArg(options::OPT_fno_offload_fp32_prec_sqrt))
1745-
EmitAccuracyDiag(D, JA, A->getValue(), "-fno-offload-fp32-prec-sqrt");
1746-
}
1747-
if (!Args.hasFlag(options::OPT_foffload_fp32_prec_div,
1748-
options::OPT_fno_offload_fp32_prec_div, true))
1749-
CmdArgs.push_back("-fno-offload-fp32-prec-div");
1750-
if (!Args.hasFlag(options::OPT_foffload_fp32_prec_sqrt,
1751-
options::OPT_fno_offload_fp32_prec_sqrt, true))
1752-
CmdArgs.push_back("-fno-offload-fp32-prec-sqrt");
1753-
}
1754-
}
1755-
}
1756-
17571724
void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
17581725
ArgStringList &CmdArgs, bool KernelOrKext) const {
17591726
RenderARMABI(getToolChain().getDriver(), Triple, Args, CmdArgs);
@@ -1804,10 +1771,8 @@ void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
18041771

18051772
void Clang::RenderTargetOptions(const llvm::Triple &EffectiveTriple,
18061773
const ArgList &Args, bool KernelOrKext,
1807-
ArgStringList &CmdArgs,
1808-
const JobAction &JA) const {
1774+
ArgStringList &CmdArgs) const {
18091775
const ToolChain &TC = getToolChain();
1810-
const Driver &D = TC.getDriver();
18111776

18121777
// Add the target features
18131778
getTargetFeatures(TC.getDriver(), EffectiveTriple, Args, CmdArgs, false);
@@ -1816,13 +1781,6 @@ void Clang::RenderTargetOptions(const llvm::Triple &EffectiveTriple,
18161781
switch (TC.getArch()) {
18171782
default:
18181783
break;
1819-
1820-
case llvm::Triple::spir:
1821-
case llvm::Triple::spir64:
1822-
case llvm::Triple::spirv32:
1823-
case llvm::Triple::spirv64:
1824-
AddSPIRTargetArgs(Args, CmdArgs, JA, D);
1825-
break;
18261784
case llvm::Triple::arm:
18271785
case llvm::Triple::armeb:
18281786
case llvm::Triple::thumb:
@@ -2991,6 +2949,15 @@ RenderComplexRangeOption(LangOptions::ComplexRangeKind Range) {
29912949
return ComplexRangeStr;
29922950
}
29932951

2952+
static void EmitAccuracyDiag(const Driver &D, const JobAction &JA,
2953+
StringRef AccuracValStr, StringRef TargetPrecStr) {
2954+
if (JA.isDeviceOffloading(Action::OFK_SYCL)) {
2955+
D.Diag(clang::diag::
2956+
warn_acuracy_conflicts_with_explicit_offload_fp32_prec_option)
2957+
<< AccuracValStr << TargetPrecStr;
2958+
}
2959+
}
2960+
29942961
static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
29952962
bool OFastEnabled, const ArgList &Args,
29962963
ArgStringList &CmdArgs,
@@ -3039,6 +3006,8 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
30393006
LangOptions::ComplexRangeKind Range = LangOptions::ComplexRangeKind::CX_None;
30403007
std::string ComplexRangeStr = "";
30413008
std::string GccRangeComplexOption = "";
3009+
bool NoOffloadFp32PrecDiv = false;
3010+
bool NoOffloadFp32PrecSqrt = false;
30423011

30433012
// Lambda to set fast-math options. This is also used by -ffp-model=fast
30443013
auto applyFastMath = [&]() {
@@ -3068,6 +3037,13 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
30683037
: ComplexArithmeticStr(LangOptions::ComplexRangeKind::CX_Basic));
30693038
Range = LangOptions::ComplexRangeKind::CX_Basic;
30703039
SeenUnsafeMathModeOption = true;
3040+
if (JA.isDeviceOffloading(Action::OFK_SYCL) ||
3041+
JA.isDeviceOffloading(Action::OFK_OpenMP)) {
3042+
// when fp-model=fast is used the default precision for division and
3043+
// sqrt is not precise.
3044+
NoOffloadFp32PrecDiv = true;
3045+
NoOffloadFp32PrecSqrt = true;
3046+
}
30713047
};
30723048

30733049
// Lambda to consolidate common handling for fp-contract
@@ -3096,11 +3072,54 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
30963072
CmdArgs.push_back(A->getValue());
30973073
}
30983074

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+
3089+
auto addSPIRVArgs = [&](StringRef SPIRVArg) {
3090+
if (JA.isDeviceOffloading(Action::OFK_SYCL) ||
3091+
JA.isDeviceOffloading(Action::OFK_OpenMP)) {
3092+
if (!FPAccuracy.empty())
3093+
EmitAccuracyDiag(D, JA, FPAccuracy, SPIRVArg);
3094+
3095+
if (SPIRVArg == "-fno-offload-fp32-prec-div")
3096+
NoOffloadFp32PrecDiv = true;
3097+
else if (SPIRVArg == "-fno-offload-fp32-prec-sqrt")
3098+
NoOffloadFp32PrecSqrt = true;
3099+
else if (SPIRVArg == "-foffload-fp32-prec-sqrt")
3100+
toggleNoOffloadFp32PrecSqrt();
3101+
else if (SPIRVArg == "-foffload-fp32-prec-div")
3102+
toggleNoOffloadFp32PrecDiv();
3103+
}
3104+
};
3105+
30993106
for (const Arg *A : Args) {
31003107
switch (A->getOption().getID()) {
31013108
// If this isn't an FP option skip the claim below
31023109
default: continue;
31033110

3111+
case options::OPT_foffload_fp32_prec_div:
3112+
addSPIRVArgs("-foffload-fp32-prec-div");
3113+
break;
3114+
case options::OPT_foffload_fp32_prec_sqrt:
3115+
addSPIRVArgs("-foffload-fp32-prec-sqrt");
3116+
break;
3117+
case options::OPT_fno_offload_fp32_prec_div:
3118+
addSPIRVArgs("-fno-offload-fp32-prec-div");
3119+
break;
3120+
case options::OPT_fno_offload_fp32_prec_sqrt:
3121+
addSPIRVArgs("-fno-offload-fp32-prec-sqrt");
3122+
break;
31043123
case options::OPT_fcx_limited_range:
31053124
if (GccRangeComplexOption.empty()) {
31063125
if (Range != LangOptions::ComplexRangeKind::CX_Basic)
@@ -3185,6 +3204,10 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
31853204
case options::OPT_ffp_accuracy_EQ: {
31863205
StringRef Val = A->getValue();
31873206
FPAccuracy = Val;
3207+
if (NoOffloadFp32PrecDiv)
3208+
EmitAccuracyDiag(D, JA, FPAccuracy, "-fno-offload-fp32-prec-div");
3209+
if (NoOffloadFp32PrecSqrt)
3210+
EmitAccuracyDiag(D, JA, FPAccuracy, "-fno-offload-fp32-prec-sqrt");
31883211
break;
31893212
}
31903213
case options::OPT_ffp_model_EQ: {
@@ -3598,6 +3621,13 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
35983621
CmdArgs.push_back("-fno-cx-limited-range");
35993622
if (Args.hasArg(options::OPT_fno_cx_fortran_rules))
36003623
CmdArgs.push_back("-fno-cx-fortran-rules");
3624+
if (JA.isDeviceOffloading(Action::OFK_SYCL) ||
3625+
JA.isDeviceOffloading(Action::OFK_OpenMP)) {
3626+
if (NoOffloadFp32PrecDiv)
3627+
CmdArgs.push_back("-fno-offload-fp32-prec-div");
3628+
if (NoOffloadFp32PrecSqrt)
3629+
CmdArgs.push_back("-fno-offload-fp32-prec-sqrt");
3630+
}
36013631
}
36023632

36033633
static void RenderAnalyzerOptions(const ArgList &Args, ArgStringList &CmdArgs,
@@ -6847,7 +6877,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
68476877
CmdArgs.push_back(Args.MakeArgString(CPU));
68486878
}
68496879

6850-
RenderTargetOptions(Triple, Args, KernelOrKext, CmdArgs, JA);
6880+
RenderTargetOptions(Triple, Args, KernelOrKext, CmdArgs);
68516881

68526882
// Add clang-cl arguments.
68536883
types::ID InputType = Input.getType();

clang/lib/Driver/ToolChains/Clang.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
4747

4848
void RenderTargetOptions(const llvm::Triple &EffectiveTriple,
4949
const llvm::opt::ArgList &Args, bool KernelOrKext,
50-
llvm::opt::ArgStringList &CmdArgs,
51-
const JobAction &JA) const;
50+
llvm::opt::ArgStringList &CmdArgs) const;
5251

5352
void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
5453
llvm::opt::ArgStringList &CmdArgs) const;

0 commit comments

Comments
 (0)