Skip to content

Commit 69e2b91

Browse files
authored
[SYCL] Last fp-accuracy command line wins. (#11937)
This implements a new request to make the last fp-accuracy option on the command line wins. A warning is generated to warn the user.
1 parent c74d001 commit 69e2b91

File tree

5 files changed

+200
-20
lines changed

5 files changed

+200
-20
lines changed

clang/include/clang/Basic/DiagnosticDriverKinds.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@ def err_drv_no_cuda_libdevice : Error<
6565
"via '--cuda-path', or pass '-nocudalib' to build without linking with "
6666
"libdevice">;
6767

68-
def warn_function_fp_accuracy_already_set : Warning <
69-
"floating point accuracy value of '%0' has already been assigned to "
70-
"function '%1'">,
71-
InGroup<DiagGroup<"fp-accuracy-already-set">>;
68+
def warn_drv_fp_accuracy_override : Warning <
69+
"'-ffp-accuracy=%0' overrides '-ffp-accuracy=%1' for the function '%2'">,
70+
InGroup<FPAccOverride>;
71+
7272
def err_drv_no_rocm_device_lib : Error<
7373
"cannot find ROCm device library%select{| for %1|for ABI version %1}0; provide its path via "
7474
"'--rocm-path' or '--rocm-device-lib-path', or pass '-nogpulib' to build "

clang/include/clang/Basic/DiagnosticGroups.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,7 @@ def DeallocInCategory:DiagGroup<"dealloc-in-category">;
850850
def SelectorTypeMismatch : DiagGroup<"selector-type-mismatch">;
851851
def Selector : DiagGroup<"selector", [SelectorTypeMismatch]>;
852852
def Protocol : DiagGroup<"protocol">;
853+
def FPAccOverride : DiagGroup<"fp-accuracy-override">;
853854
// No longer in use, preserve for backwards compatibility.
854855
def : DiagGroup<"at-protocol">;
855856
def PropertyAccessDotSyntax: DiagGroup<"property-access-dot-syntax">;

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -599,12 +599,6 @@ static bool FixupInvocation(CompilerInvocation &Invocation,
599599
LangOpts.NewAlignOverride = 0;
600600
}
601601

602-
// Diagnose FPAccuracy option validity.
603-
if (!LangOpts.FPAccuracyVal.empty())
604-
for (const auto &F : LangOpts.FPAccuracyFuncMap)
605-
Diags.Report(diag::warn_function_fp_accuracy_already_set)
606-
<< F.second << F.first;
607-
608602
// Prevent the user from specifying both -fsycl-is-device and -fsycl-is-host.
609603
if (LangOpts.SYCLIsDevice && LangOpts.SYCLIsHost)
610604
Diags.Report(diag::err_drv_argument_not_allowed_with) << "-fsycl-is-device"
@@ -3718,6 +3712,12 @@ static void checkFPAccuracyIsValid(StringRef ValElement,
37183712
<< "-ffp-accuracy" << ValElement;
37193713
}
37203714

3715+
static void diagnoseFPAccuracyHasVal(DiagnosticsEngine &Diags,
3716+
StringRef ValElement, StringRef Opt1,
3717+
StringRef Opt2, const std::string Func) {
3718+
Diags.Report(diag::warn_drv_fp_accuracy_override) << Opt1 << Opt2 << Func;
3719+
}
3720+
37213721
void CompilerInvocation::ParseFpAccuracyArgs(LangOptions &Opts, ArgList &Args,
37223722
DiagnosticsEngine &Diags) {
37233723
for (StringRef Values : Args.getAllArgValues(OPT_ffp_builtin_accuracy_EQ)) {
@@ -3733,6 +3733,14 @@ void CompilerInvocation::ParseFpAccuracyArgs(LangOptions &Opts, ArgList &Args,
37333733
if (ValElement.size() == 1) {
37343734
checkFPAccuracyIsValid(ValElement[0], Diags);
37353735
Opts.FPAccuracyVal = ValElement[0].str();
3736+
// if FPAccuracyFuncMap is not empty, visit it and update
3737+
// the values of the FPAccuracy of each function in the map;
3738+
// last fp-accuracy option in the command line wins.
3739+
for (auto &F : Opts.FPAccuracyFuncMap) {
3740+
diagnoseFPAccuracyHasVal(Diags, ValElement[0], ValuesArr[1],
3741+
ValuesArr[0], F.first);
3742+
F.second = ValElement[0];
3743+
}
37363744
}
37373745
// The option is of the form -ffp-accuracy=value:[f1, ... fn].
37383746
if (ValElement.size() == 2) {
@@ -3743,13 +3751,23 @@ void CompilerInvocation::ParseFpAccuracyArgs(LangOptions &Opts, ArgList &Args,
37433751
FuncName = FuncName.drop_front(1);
37443752
if (FuncName.back() == ']')
37453753
FuncName = FuncName.drop_back(1);
3746-
auto FuncMap = Opts.FPAccuracyFuncMap.find(FuncName.str());
37473754
checkFPAccuracyIsValid(ValElement[0], Diags);
37483755
// No need to fill the map if the FPaccuracy is 'default'.
37493756
// The default builtin will be generated.
3750-
if (!ValElement[0].equals("default"))
3751-
Opts.FPAccuracyFuncMap.insert(
3752-
{FuncName.str(), ValElement[0].str()});
3757+
if (!ValElement[0].equals("default")) {
3758+
// if FPAccuracyFuncMap of this function has been previously set
3759+
// update its value; the last fp-accuracy option in the command
3760+
// line wins.
3761+
auto FuncMap = Opts.FPAccuracyFuncMap.find(FuncName.str());
3762+
if (FuncMap != Opts.FPAccuracyFuncMap.end()) {
3763+
diagnoseFPAccuracyHasVal(Diags, ValElement[0], ValuesArr[1],
3764+
ValuesArr[0], FuncMap->first.c_str());
3765+
FuncMap->second = ValElement[0].str();
3766+
} else {
3767+
Opts.FPAccuracyFuncMap.insert(
3768+
{FuncName.str(), ValElement[0].str()});
3769+
}
3770+
}
37533771
}
37543772
}
37553773
}

clang/test/CodeGen/fp-accuracy.c

Lines changed: 158 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,34 @@
44

55
// RUN: %clang_cc1 -triple x86_64-unknown-unknown \
66
// RUN: "-ffp-builtin-accuracy=high:[acosf,cos,pow] low:[tan] medium:[sincos,log10]" \
7-
// RUN: -Wno-return-type -Wno-implicit-function-declaration -emit-llvm -o - %s \
8-
// RUN: | FileCheck --check-prefix=CHECK-F1 %s
7+
// RUN: -Wno-return-type -Wno-implicit-function-declaration \
8+
// RUN: -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-F1 %s
99

1010
// RUN: %clang_cc1 -triple x86_64-unknown-unknown \
1111
// RUN: "-ffp-builtin-accuracy=medium high:[tan] cuda:[cos]" \
1212
// RUN: -Wno-return-type -Wno-implicit-function-declaration -emit-llvm -o - %s \
1313
// RUN: | FileCheck --check-prefix=CHECK-F2 %s
1414

15-
// RUN: %clang_cc1 -triple x86_64-unknown-unknown \
15+
// RUN: %clang_cc1 -triple x86_64-unknown-unknown \
1616
// RUN: "-ffp-builtin-accuracy=high low:[tan] medium:[sincos,log10]" \
1717
// RUN: -Wno-return-type -Wno-implicit-function-declaration -emit-llvm -o - %s \
1818
// RUN: | FileCheck --check-prefix=CHECK-F3 %s
1919

20+
// RUN: %clang_cc1 -triple x86_64-unknown-unknown \
21+
// RUN: "-ffp-builtin-accuracy=high:sin medium" -Wno-return-type \
22+
// RUN: -Wno-implicit-function-declaration -emit-llvm -o - %s \
23+
// RUN: | FileCheck --check-prefixes=CHECK-F4 %s
24+
25+
// RUN: %clang_cc1 -triple x86_64-unknown-unknown \
26+
// RUN: "-ffp-builtin-accuracy=medium:[sin,cos] high:[sin,tan]" \
27+
// RUN: -Wno-return-type -Wno-implicit-function-declaration \
28+
// RUN: -emit-llvm -o - %s | FileCheck --check-prefixes=CHECK-F5 %s
29+
30+
// RUN: %clang_cc1 -triple x86_64-unknown-unknown \
31+
// RUN: "-ffp-builtin-accuracy=medium high:[sin,atan]" \
32+
// RUN: -Wno-return-type -Wno-implicit-function-declaration \
33+
// RUN: -emit-llvm -o - %s | FileCheck --check-prefixes=CHECK-F6 %s
34+
2035
// RUN: %clang_cc1 -triple spir64-unknown-unknown -ffp-builtin-accuracy=sycl \
2136
// RUN: -D SPIR -Wno-implicit-function-declaration -emit-llvm -o - %s \
2237
// RUN: | FileCheck --check-prefix=CHECK-SPIR %s
@@ -192,6 +207,115 @@ double rsqrt(double);
192207
// CHECK-F3: attributes #[[ATTR_F3_MEDIUM]] = {{.*}}"fpbuiltin-max-error"="4.0"
193208
// CHECK-F3: attributes #[[ATTR_F3_LOW]] = {{.*}}"fpbuiltin-max-error"="67108864.0"
194209
//
210+
// CHECK-LABEL-F4: define dso_local void @f1
211+
// CHECK-F4: call double @llvm.fpbuiltin.acos.f64(double %conv) #[[ATTR_F4_MEDIUM:[0-9]+]]
212+
// CHECK-F4: call double @llvm.fpbuiltin.acosh.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
213+
// CHECK-F4: call double @llvm.fpbuiltin.asin.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
214+
// CHECK-F4: call double @llvm.fpbuiltin.asinh.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
215+
// CHECK-F4: call double @llvm.fpbuiltin.atan.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
216+
// CHECK-F4: call double @llvm.fpbuiltin.atan2.f64(double {{.*}}, double {{.*}}) #[[ATTR_F4_MEDIUM]]
217+
// CHECK-F4: call double @llvm.fpbuiltin.atanh.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
218+
// CHECK-F4: call double @llvm.fpbuiltin.cos.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
219+
// CHECK-F4: call double @llvm.fpbuiltin.cosh.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
220+
// CHECK-F4: call double @llvm.fpbuiltin.erf.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
221+
// CHECK-F4: call double @llvm.fpbuiltin.erfc.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
222+
// CHECK-F4: call double @llvm.fpbuiltin.exp.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
223+
// CHECK-F4: call double @llvm.fpbuiltin.exp10.f64(double {{.*}})
224+
// CHECK-F4: call double @llvm.fpbuiltin.exp2.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
225+
// CHECK-F4: call double @llvm.fpbuiltin.expm1.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
226+
// CHECK-F4: call double @llvm.fpbuiltin.fadd.f64(double {{.*}}, double {{.*}})
227+
// CHECK-F4: call double @llvm.fpbuiltin.fdiv.f64(double {{.*}}, double {{.*}})
228+
// CHECK-F4: call double @llvm.fpbuiltin.fmul.f64(double {{.*}}, double {{.*}})
229+
// CHECK-F4: call double @llvm.fpbuiltin.frem.f64(double {{.*}}, double {{.*}})
230+
// CHECK-F4: call double @llvm.fpbuiltin.fsub.f64(double {{.*}}, double {{.*}})
231+
// CHECK-F4: call double @llvm.fpbuiltin.hypot.f64(double {{.*}}, double {{.*}}) #[[ATTR_F4_MEDIUM]]
232+
// CHECK-F4: call double @llvm.fpbuiltin.ldexp.f64(double {{.*}}, i32 {{.*}}) #[[ATTR_F4_MEDIUM]]
233+
// CHECK-F4: call double @llvm.fpbuiltin.log.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
234+
// CHECK-F4: call double @llvm.fpbuiltin.log10.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
235+
// CHECK-F4: call double @llvm.fpbuiltin.log1p.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
236+
// CHECK-F4: call double @llvm.fpbuiltin.log2.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
237+
// CHECK-F4: call double @llvm.fpbuiltin.pow.f64(double {{.*}}, double {{.*}}) #[[ATTR_F4_MEDIUM]]
238+
// CHECK-F4: call double @llvm.fpbuiltin.rsqrt.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
239+
// CHECK-F4: call double @llvm.fpbuiltin.sin.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
240+
// CHECK-F4: call void @llvm.fpbuiltin.sincos.f64(double {{.*}}, ptr %p1, ptr %p2)
241+
// CHECK-F4: call double @llvm.fpbuiltin.sinh.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
242+
// CHECK-F4: call double @llvm.fpbuiltin.sqrt.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
243+
// CHECK-F4: call double @llvm.fpbuiltin.tan.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
244+
// CHECK-F4: call double @llvm.fpbuiltin.tanh.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
245+
//
246+
// CHECK-F5-LABEL: define dso_local void @f1(
247+
// CHECK-F5: call double @acos(double noundef {{.*}})
248+
// CHECK-F5: call double @acosh(double noundef {{.*}})
249+
// CHECK-F5: call double @asin(double noundef {{.*}})
250+
// CHECK-F5: call double @asinh(double noundef {{.*}})
251+
// CHECK-F5: call double @atan(double noundef {{.*}})
252+
// CHECK-F5: call double @atan2(double noundef {{.*}}, double noundef {{.*}})
253+
// CHECK-F5: call double @atanh(double noundef {{.*}})
254+
// CHECK-F5: call double @llvm.fpbuiltin.cos.f64(double {{.*}}) #[[ATTR_F5_MEDIUM:[0-9]+]]
255+
// CHECK-F5: call double @cosh(double noundef {{.*}})
256+
// CHECK-F5: call double @erf(double noundef {{.*}})
257+
// CHECK-F5: call double @erfc(double noundef {{.*}})
258+
// CHECK-F5: call double @llvm.exp.f64(double {{.*}})
259+
// CHECK-F5: call i32 (double, ...) @exp10(double noundef {{.*}})
260+
// CHECK-F5: call double @llvm.exp2.f64(double {{.*}})
261+
// CHECK-F5: call double @expm1(double noundef {{.*}})
262+
// CHECK-F5: call i32 (double, double, ...) @fadd(double noundef {{.*}}, double noundef {{.*}})
263+
// CHECK-F5: call i32 (double, double, ...) @fdiv(double noundef {{.*}}, double noundef {{.*}})
264+
// CHECK-F5: call i32 (double, double, ...) @fmul(double noundef {{.*}}, double noundef {{.*}})
265+
// CHECK-F5: call i32 (double, double, ...) @frem(double noundef {{.*}}, double noundef {{.*}})
266+
// CHECK-F5: call i32 (double, double, ...) @fsub(double noundef {{.*}}, double noundef {{.*}})
267+
// CHECK-F5: call double @hypot(double noundef {{.*}}, double noundef {{.*}})
268+
// CHECK-F5: call double @ldexp(double noundef {{.*}}, i32 noundef {{.*}})
269+
// CHECK-F5: call double @llvm.log.f64(double {{.*}})
270+
// CHECK-F5: call double @llvm.log10.f64(double {{.*}})
271+
// CHECK-F5: call double @log1p(double noundef {{.*}})
272+
// CHECK-F5: call double @llvm.log2.f64(double {{.*}})
273+
// CHECK-F5: call double @llvm.pow.f64(double {{.*}}, double {{.*}})
274+
// CHECK-F5: call i32 (double, ...) @rsqrt(double noundef {{.*}})
275+
// CHECK-F5: call double @llvm.fpbuiltin.sin.f64(double {{.*}}) #[[ATTR_F5_HIGH:[0-9]+]]
276+
// CHECK-F5: call i32 (double, ptr, ptr, ...) @sincos(double noundef {{.*}}, ptr noundef {{.*}}, ptr noundef {{.*}})
277+
// CHECK-F5: call double @sinh(double noundef {{.*}})
278+
// CHECK-F5: call double @llvm.sqrt.f64(double {{.*}})
279+
// CHECK-F5: call double @llvm.fpbuiltin.tan.f64(double {{.*}}) #[[ATTR_F5_HIGH]]
280+
// CHECK-F5: call double @tanh(double noundef {{.*}})
281+
//
282+
//
283+
// CHECK-F6-LABEL: define dso_local void @f1(
284+
// CHECK-F6: call double @llvm.fpbuiltin.acos.f64(double {{.*}}) #[[ATTR_F6_MEDIUM:[0-9]+]]
285+
// CHECK-F6: call double @llvm.fpbuiltin.acosh.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
286+
// CHECK-F6: call double @llvm.fpbuiltin.asin.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
287+
// CHECK-F6: call double @llvm.fpbuiltin.asinh.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
288+
// CHECK-F6: call double @llvm.fpbuiltin.atan.f64(double {{.*}}) #[[ATTR_F6_HIGH:[0-9]+]]
289+
// CHECK-F6: call double @llvm.fpbuiltin.atan2.f64(double {{.*}}, double {{.*}}) #[[ATTR_F6_MEDIUM]]
290+
// CHECK-F6: call double @llvm.fpbuiltin.atanh.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
291+
// CHECK-F6: call double @llvm.fpbuiltin.cos.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
292+
// CHECK-F6: call double @llvm.fpbuiltin.cosh.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
293+
// CHECK-F6: call double @llvm.fpbuiltin.erf.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
294+
// CHECK-F6: call double @llvm.fpbuiltin.erfc.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
295+
// CHECK-F6: call double @llvm.fpbuiltin.exp.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
296+
// CHECK-F6: call double @llvm.fpbuiltin.exp10.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
297+
// CHECK-F6: call double @llvm.fpbuiltin.exp2.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
298+
// CHECK-F6: call double @llvm.fpbuiltin.expm1.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
299+
// CHECK-F6: call double @llvm.fpbuiltin.fadd.f64(double {{.*}}, double {{.*}}) #[[ATTR_F6_MEDIUM]]
300+
// CHECK-F6: call double @llvm.fpbuiltin.fdiv.f64(double {{.*}}, double {{.*}}) #[[ATTR_F6_MEDIUM]]
301+
// CHECK-F6: call double @llvm.fpbuiltin.fmul.f64(double {{.*}}, double {{.*}}) #[[ATTR_F6_MEDIUM]]
302+
// CHECK-F6: call double @llvm.fpbuiltin.frem.f64(double {{.*}}, double {{.*}}) #[[ATTR_F6_MEDIUM]]
303+
// CHECK-F6: call double @llvm.fpbuiltin.fsub.f64(double {{.*}}, double {{.*}}) #[[ATTR_F6_MEDIUM]]
304+
// CHECK-F6: call double @llvm.fpbuiltin.hypot.f64(double {{.*}}, double {{.*}}) #[[ATTR_F6_MEDIUM]]
305+
// CHECK-F6: call double @llvm.fpbuiltin.ldexp.f64(double {{.*}}, i32 {{.*}}) #[[ATTR_F6_MEDIUM]]
306+
// CHECK-F6: call double @llvm.fpbuiltin.log.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
307+
// CHECK-F6: call double @llvm.fpbuiltin.log10.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
308+
// CHECK-F6: call double @llvm.fpbuiltin.log1p.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
309+
// CHECK-F6: call double @llvm.fpbuiltin.log2.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
310+
// CHECK-F6: call double @llvm.fpbuiltin.pow.f64(double {{.*}}, double {{.*}}) #[[ATTR_F6_MEDIUM]]
311+
// CHECK-F6: call double @llvm.fpbuiltin.rsqrt.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
312+
// CHECK-F6: call double @llvm.fpbuiltin.sin.f64(double {{.*}}) #[[ATTR_F6_HIGH]]
313+
// CHECK-F6: call void @llvm.fpbuiltin.sincos.f64(double {{.*}}, ptr {{.*}}, ptr {{.*}}) #[[ATTR_F6_MEDIUM]]
314+
// CHECK-F6: call double @llvm.fpbuiltin.sinh.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
315+
// CHECK-F6: call double @llvm.fpbuiltin.sqrt.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
316+
// CHECK-F6: call double @llvm.fpbuiltin.tan.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
317+
// CHECK-F6: call double @llvm.fpbuiltin.tanh.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
318+
//
195319
// CHECK-SPIR-LABEL: define dso_local spir_func void @f1
196320
// CHECK-SPIR: call double @llvm.fpbuiltin.acos.f64(double {{.*}}) #[[ATTR_SYCL1:[0-9]+]]
197321
// CHECK-SPIR: call double @llvm.fpbuiltin.acosh.f64(double {{.*}}) #[[ATTR_SYCL1]]
@@ -290,6 +414,36 @@ void f1(float a, float b) {
290414
// CHECK-F2: call void @llvm.fpbuiltin.sincos.f64(double {{.*}}, ptr {{.*}}, ptr {{.*}}) #[[ATTR_F2_MEDIUM]]
291415
// CHECK-F2: call float @tanf(float noundef {{.*}})
292416
//
417+
// CHECK-LABEL-F4: define dso_local void @f2
418+
// CHECK-F4: call float @llvm.fpbuiltin.cos.f32(float {{.*}}) #[[ATTR_F4_MEDIUM]]
419+
// CHECK-F4: call float @llvm.fpbuiltin.sin.f32(float {{.*}}) #[[ATTR_F4_MEDIUM]]
420+
// CHECK-F4: call double @llvm.fpbuiltin.tan.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
421+
// CHECK-F4: call double @llvm.fpbuiltin.log10.f64(double {{.*}}) #[[ATTR_F4_MEDIUM]]
422+
// CHECK-F4: call void @llvm.fpbuiltin.sincos.f64(double {{.*}}, ptr {{.*}}, ptr {{.*}}) #[[ATTR_F4_MEDIUM]]
423+
// CHECK-F4: call float @tanf(float {{.*}})
424+
//
425+
// CHECK-F5-LABEL: define dso_local void @f2(
426+
// CHECK-F5: call float @llvm.cos.f32(float {{.*}})
427+
// CHECK-F5: call float @llvm.sin.f32(float {{.*}})
428+
// CHECK-F5: call double @llvm.fpbuiltin.tan.f64(double {{.*}}) #[[ATTR_F5_HIGH]]
429+
// CHECK-F5: call double @llvm.log10.f64(double {{.*}})
430+
// CHECK-F5: call i32 (double, ptr, ptr, ...) @sincos(double noundef {{.*}}, ptr noundef {{.*}}, ptr noundef {{.*}})
431+
// CHECK-F5: call float @tanf(float noundef {{.*}})
432+
//
433+
// CHECK-F5: attributes #[[ATTR_F5_MEDIUM]] = {{.*}}"fpbuiltin-max-error"="4.0"
434+
// CHECK-F5: attributes #[[ATTR_F5_HIGH]] = {{.*}}"fpbuiltin-max-error"="1.0"
435+
//
436+
// CHECK-F6-LABEL: define dso_local void @f2(
437+
// CHECK-F6: call float @llvm.fpbuiltin.cos.f32(float {{.*}}) #[[ATTR_F6_MEDIUM]]
438+
// CHECK-F6: call float @llvm.fpbuiltin.sin.f32(float {{.*}}) #[[ATTR_F6_MEDIUM]]
439+
// CHECK-F6: call double @llvm.fpbuiltin.tan.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
440+
// CHECK-F6: call double @llvm.fpbuiltin.log10.f64(double {{.*}}) #[[ATTR_F6_MEDIUM]]
441+
// CHECK-F6: call void @llvm.fpbuiltin.sincos.f64(double {{.*}}, ptr {{.*}}, ptr {{.*}}) #[[ATTR_F6_MEDIUM]]
442+
// CHECK-F6: call float @tanf(float noundef {{.*}}) #[[ATTR8:[0-9]+]]
443+
//
444+
// CHECK-F6: attributes #[[ATTR_F6_MEDIUM]] = {{.*}}"fpbuiltin-max-error"="4.0"
445+
// CHECK-F6: attributes #[[ATTR_F6_HIGH]] = {{.*}}"fpbuiltin-max-error"="1.0"
446+
//
293447
// CHECK-SPIR-LABEL: define dso_local spir_func void @f2
294448
// CHECK-SPIR: call float @llvm.fpbuiltin.cos.f32(float {{.*}}) #[[ATTR_SYCL1]]
295449
// CHECK-SPIR: call float @llvm.fpbuiltin.sin.f32(float {{.*}}) #[[ATTR_SYCL1]]
@@ -302,6 +456,7 @@ void f1(float a, float b) {
302456
// CHECK: call float @fake_exp10(float {{.*}})
303457
// CHECK-F1: call float @fake_exp10(float {{.*}})
304458
// CHECK-F2: call float @fake_exp10(float {{.*}})
459+
305460
// CHECK-SPIR-LABEL: define dso_local spir_func void @f3
306461
// CHECK-SPIR: call spir_func float @fake_exp10(float {{.*}})
307462

clang/test/Driver/fp-accuracy.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@
3838

3939
// RUN: not %clang -fno-math-errno -ffp-accuracy=low:[sin,cos] \
4040
// RUN: -ffp-accuracy=high %s 2>&1 \
41-
// RUN: | FileCheck %s --check-prefix=WARN
41+
// RUN: | FileCheck %s --check-prefix=WARN1
42+
43+
// RUN: not %clang -fno-math-errno -ffp-accuracy=low:[sin,cos] \
44+
// RUN: -ffp-accuracy=high:[cos,tan] %s 2>&1 \
45+
// RUN: | FileCheck %s --check-prefix=WARN2
4246

4347
// RUN: not %clang -Xclang -verify -ffp-accuracy=low:[sin,cos] \
4448
// RUN: -ffp-accuracy=high -fmath-errno %s 2>&1 \
@@ -58,7 +62,9 @@
5862
// ERR: (frontend): unsupported argument 'foo' to option '-ffp-accuracy'
5963
// ERR-1: (frontend): unsupported argument 'foo' to option '-ffp-accuracy'
6064
// ERR-2: (frontend): unsupported argument 'high=[sin]' to option '-ffp-accuracy'
61-
// WARN: floating point accuracy value of 'low' has already been assigned to function 'cos'
62-
// WARN: floating point accuracy value of 'low' has already been assigned to function 'sin'
65+
// WARN1: '-ffp-accuracy=high' overrides '-ffp-accuracy=low:[sin,cos]' for the function 'cos'
66+
// WARN1: '-ffp-accuracy=high' overrides '-ffp-accuracy=low:[sin,cos]' for the function 'sin'
67+
// WARN2: '-ffp-accuracy=high:[cos,tan]' overrides '-ffp-accuracy=low:[sin,cos]' for the function 'cos'
68+
6369

6470
// ERR-3: (frontend): floating point accuracy requirements cannot be guaranteed when '-fmath-errno' is enabled; use '-fno-math-errno' to enable floating point accuracy control

0 commit comments

Comments
 (0)