@@ -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}
0 commit comments