@@ -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-
17571724void 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
18051772void 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+
29942961static 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
36033633static 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 ();
0 commit comments