@@ -1721,6 +1721,40 @@ 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+ }
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.getLastArg (options::OPT_fno_offload_fp32_prec_div))
1748+ CmdArgs.push_back (" -fno-offload-fp32-prec-div" );
1749+ else
1750+ CmdArgs.push_back (" -foffload-fp32-prec-div" );
1751+ if (Args.getLastArg (options::OPT_fno_offload_fp32_prec_sqrt))
1752+ CmdArgs.push_back (" -fno-offload-fp32-prec-sqrt" );
1753+ else
1754+ CmdArgs.push_back (" -foffload-fp32-prec-sqrt" );
1755+ }
1756+ }
1757+
17241758void Clang::AddARMTargetArgs (const llvm::Triple &Triple, const ArgList &Args,
17251759 ArgStringList &CmdArgs, bool KernelOrKext) const {
17261760 RenderARMABI (getToolChain ().getDriver (), Triple, Args, CmdArgs);
@@ -1771,8 +1805,10 @@ void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
17711805
17721806void Clang::RenderTargetOptions (const llvm::Triple &EffectiveTriple,
17731807 const ArgList &Args, bool KernelOrKext,
1774- ArgStringList &CmdArgs) const {
1808+ ArgStringList &CmdArgs,
1809+ const JobAction &JA) const {
17751810 const ToolChain &TC = getToolChain ();
1811+ const Driver &D = TC.getDriver ();
17761812
17771813 // Add the target features
17781814 getTargetFeatures (TC.getDriver (), EffectiveTriple, Args, CmdArgs, false );
@@ -1782,6 +1818,10 @@ void Clang::RenderTargetOptions(const llvm::Triple &EffectiveTriple,
17821818 default :
17831819 break ;
17841820
1821+ case llvm::Triple::spir:
1822+ case llvm::Triple::spir64:
1823+ AddSPIRTargetArgs (Args, CmdArgs, JA, D);
1824+ break ;
17851825 case llvm::Triple::arm:
17861826 case llvm::Triple::armeb:
17871827 case llvm::Triple::thumb:
@@ -2942,14 +2982,6 @@ static void EmitComplexRangeDiag(const Driver &D, std::string str1,
29422982 }
29432983}
29442984
2945- static void EmitAccuracyDiag (const Driver &D, const JobAction &JA,
2946- StringRef AccuracValStr, StringRef TargetPrecStr) {
2947- if (JA.isDeviceOffloading (Action::OFK_SYCL)) {
2948- D.Diag (clang::diag::warn_acuracy_conflicts_with_explicit_target_prec_option)
2949- << AccuracValStr << TargetPrecStr;
2950- }
2951- }
2952-
29532985static std::string
29542986RenderComplexRangeOption (LangOptions::ComplexRangeKind Range) {
29552987 std::string ComplexRangeStr = ComplexRangeKindToStr (Range);
@@ -3006,8 +3038,6 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
30063038 LangOptions::ComplexRangeKind Range = LangOptions::ComplexRangeKind::CX_None;
30073039 std::string ComplexRangeStr = " " ;
30083040 std::string GccRangeComplexOption = " " ;
3009- bool NoOffloadFp32PrecDiv = false ;
3010- bool NoOffloadFp32PrecSqrt = false ;
30113041
30123042 // Lambda to set fast-math options. This is also used by -ffp-model=fast
30133043 auto applyFastMath = [&]() {
@@ -3037,12 +3067,6 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
30373067 : ComplexArithmeticStr (LangOptions::ComplexRangeKind::CX_Basic));
30383068 Range = LangOptions::ComplexRangeKind::CX_Basic;
30393069 SeenUnsafeMathModeOption = true ;
3040- if (JA.isDeviceOffloading (Action::OFK_SYCL)) {
3041- // when fp-model=fast is used the default precision for division and
3042- // sqrt is not precise.
3043- NoOffloadFp32PrecDiv = true ;
3044- NoOffloadFp32PrecSqrt = true ;
3045- }
30463070 };
30473071
30483072 // Lambda to consolidate common handling for fp-contract
@@ -3076,19 +3100,6 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
30763100 // If this isn't an FP option skip the claim below
30773101 default : continue ;
30783102
3079- case options::OPT_foffload_fp32_prec_div:
3080- case options::OPT_foffload_fp32_prec_sqrt:
3081- break ;
3082- case options::OPT_fno_offload_fp32_prec_sqrt:
3083- if (!FPAccuracy.empty ())
3084- EmitAccuracyDiag (D, JA, FPAccuracy, " -fno-offload-fp32-prec-sqrt" );
3085- NoOffloadFp32PrecSqrt = true ;
3086- break ;
3087- case options::OPT_fno_offload_fp32_prec_div:
3088- if (!FPAccuracy.empty ())
3089- EmitAccuracyDiag (D, JA, FPAccuracy, " -fno-offload-fp32-prec-div" );
3090- NoOffloadFp32PrecDiv = true ;
3091- break ;
30923103 case options::OPT_fcx_limited_range:
30933104 if (GccRangeComplexOption.empty ()) {
30943105 if (Range != LangOptions::ComplexRangeKind::CX_Basic)
@@ -3173,10 +3184,6 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
31733184 case options::OPT_ffp_accuracy_EQ: {
31743185 StringRef Val = A->getValue ();
31753186 FPAccuracy = Val;
3176- if (NoOffloadFp32PrecDiv)
3177- EmitAccuracyDiag (D, JA, FPAccuracy, " -fno-offload-fp32-prec-div" );
3178- if (NoOffloadFp32PrecSqrt)
3179- EmitAccuracyDiag (D, JA, FPAccuracy, " -fno-offload-fp32-prec-sqrt" );
31803187 break ;
31813188 }
31823189 case options::OPT_ffp_model_EQ: {
@@ -3590,16 +3597,6 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
35903597 CmdArgs.push_back (" -fno-cx-limited-range" );
35913598 if (Args.hasArg (options::OPT_fno_cx_fortran_rules))
35923599 CmdArgs.push_back (" -fno-cx-fortran-rules" );
3593- if (JA.isDeviceOffloading (Action::OFK_SYCL)) {
3594- if (NoOffloadFp32PrecDiv)
3595- CmdArgs.push_back (" -fno-offload-fp32-prec-div" );
3596- else
3597- CmdArgs.push_back (" -foffload-fp32-prec-div" );
3598- if (NoOffloadFp32PrecSqrt)
3599- CmdArgs.push_back (" -fno-offload-fp32-prec-sqrt" );
3600- else
3601- CmdArgs.push_back (" -foffload-fp32-prec-sqrt" );
3602- }
36033600}
36043601
36053602static void RenderAnalyzerOptions (const ArgList &Args, ArgStringList &CmdArgs,
@@ -6849,7 +6846,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
68496846 CmdArgs.push_back (Args.MakeArgString (CPU));
68506847 }
68516848
6852- RenderTargetOptions (Triple, Args, KernelOrKext, CmdArgs);
6849+ RenderTargetOptions (Triple, Args, KernelOrKext, CmdArgs, JA );
68536850
68546851 // Add clang-cl arguments.
68556852 types::ID InputType = Input.getType ();
0 commit comments