mibintc created this revision.
mibintc added reviewers: uabelho, rjmccall, erichkeane.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Bug reported by @uabelho against reviews.llvm.org/D72841
<https://reviews.llvm.org/D72841>
pragma STDC FENV_ACCESS ON is ignored, but the floating point state maintained
in Sema.CurFPFeatures was modified to show that
fenv_access was enabled, this caused llvm constrained intrinsics to be created
which is erroneous. This is a small patch to avoid modifying the state.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D79510
Files:
clang/lib/Parse/ParsePragma.cpp
clang/test/CodeGen/fp-floatcontrol-pragma.cpp
clang/test/Parser/fp-floatcontrol-syntax.cpp
Index: clang/test/Parser/fp-floatcontrol-syntax.cpp
===================================================================
--- clang/test/Parser/fp-floatcontrol-syntax.cpp
+++ clang/test/Parser/fp-floatcontrol-syntax.cpp
@@ -30,14 +30,15 @@
// document the warning
#ifdef FAST
// expected-warning@+1{{pragma STDC FENV_ACCESS ON is not supported, ignoring
pragma}}
-#pragma STDC FENV_ACCESS ON // expected-error{{'#pragma STDC FENV_ACCESS ON'
is illegal when precise is disabled}}
+#pragma STDC FENV_ACCESS ON
#else
#pragma STDC FENV_ACCESS ON // expected-warning{{pragma STDC FENV_ACCESS ON is
not supported, ignoring pragma}}
#endif
#ifdef STRICT
#pragma float_control(precise, off) // expected-error {{'#pragma
float_control(precise, off)' is illegal when except is enabled}}
#else
-#pragma float_control(precise, off) // expected-error {{'#pragma
float_control(precise, off)' is illegal when fenv_access is enabled}}
+// Currently FENV_ACCESS cannot be enabled by pragma, skip error check
+#pragma float_control(precise, off) // not-expected-error {{'#pragma
float_control(precise, off)' is illegal when fenv_access is enabled}}
#endif
#pragma float_control(precise, on)
Index: clang/test/CodeGen/fp-floatcontrol-pragma.cpp
===================================================================
--- clang/test/CodeGen/fp-floatcontrol-pragma.cpp
+++ clang/test/CodeGen/fp-floatcontrol-pragma.cpp
@@ -1,4 +1,5 @@
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -verify -DFENV_ON=1 -triple x86_64-linux-gnu -emit-llvm -o
- %s | FileCheck %s
float fff(float x, float y) {
// CHECK-LABEL: define float @_Z3fffff{{.*}}
@@ -38,6 +39,7 @@
}
return z;
}
+
float fma_test1(float a, float b, float c) {
// CHECK-LABEL define float @_Z9fma_test1fff{{.*}}
#pragma float_control(precise, on)
@@ -45,3 +47,16 @@
//CHECK: fmuladd
return x;
}
+
+#if FENV_ON
+// expected-warning@+1{{pragma STDC FENV_ACCESS ON is not supported, ignoring
pragma}}
+#pragma STDC FENV_ACCESS ON
+#endif
+// CHECK-LABEL: define {{.*}}callt{{.*}}
+
+void callt()
+{
+ volatile float z;
+ z = z * z;
+//CHECK: = fmul float
+}
Index: clang/lib/Parse/ParsePragma.cpp
===================================================================
--- clang/lib/Parse/ParsePragma.cpp
+++ clang/lib/Parse/ParsePragma.cpp
@@ -108,6 +108,7 @@
return;
if (OOS == tok::OOS_ON) {
PP.Diag(Tok, diag::warn_stdc_fenv_access_not_supported);
+ return;
}
MutableArrayRef<Token>
Toks(PP.getPreprocessorAllocator().Allocate<Token>(1),
Index: clang/test/Parser/fp-floatcontrol-syntax.cpp
===================================================================
--- clang/test/Parser/fp-floatcontrol-syntax.cpp
+++ clang/test/Parser/fp-floatcontrol-syntax.cpp
@@ -30,14 +30,15 @@
// document the warning
#ifdef FAST
// expected-warning@+1{{pragma STDC FENV_ACCESS ON is not supported, ignoring pragma}}
-#pragma STDC FENV_ACCESS ON // expected-error{{'#pragma STDC FENV_ACCESS ON' is illegal when precise is disabled}}
+#pragma STDC FENV_ACCESS ON
#else
#pragma STDC FENV_ACCESS ON // expected-warning{{pragma STDC FENV_ACCESS ON is not supported, ignoring pragma}}
#endif
#ifdef STRICT
#pragma float_control(precise, off) // expected-error {{'#pragma float_control(precise, off)' is illegal when except is enabled}}
#else
-#pragma float_control(precise, off) // expected-error {{'#pragma float_control(precise, off)' is illegal when fenv_access is enabled}}
+// Currently FENV_ACCESS cannot be enabled by pragma, skip error check
+#pragma float_control(precise, off) // not-expected-error {{'#pragma float_control(precise, off)' is illegal when fenv_access is enabled}}
#endif
#pragma float_control(precise, on)
Index: clang/test/CodeGen/fp-floatcontrol-pragma.cpp
===================================================================
--- clang/test/CodeGen/fp-floatcontrol-pragma.cpp
+++ clang/test/CodeGen/fp-floatcontrol-pragma.cpp
@@ -1,4 +1,5 @@
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -verify -DFENV_ON=1 -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s
float fff(float x, float y) {
// CHECK-LABEL: define float @_Z3fffff{{.*}}
@@ -38,6 +39,7 @@
}
return z;
}
+
float fma_test1(float a, float b, float c) {
// CHECK-LABEL define float @_Z9fma_test1fff{{.*}}
#pragma float_control(precise, on)
@@ -45,3 +47,16 @@
//CHECK: fmuladd
return x;
}
+
+#if FENV_ON
+// expected-warning@+1{{pragma STDC FENV_ACCESS ON is not supported, ignoring pragma}}
+#pragma STDC FENV_ACCESS ON
+#endif
+// CHECK-LABEL: define {{.*}}callt{{.*}}
+
+void callt()
+{
+ volatile float z;
+ z = z * z;
+//CHECK: = fmul float
+}
Index: clang/lib/Parse/ParsePragma.cpp
===================================================================
--- clang/lib/Parse/ParsePragma.cpp
+++ clang/lib/Parse/ParsePragma.cpp
@@ -108,6 +108,7 @@
return;
if (OOS == tok::OOS_ON) {
PP.Diag(Tok, diag::warn_stdc_fenv_access_not_supported);
+ return;
}
MutableArrayRef<Token> Toks(PP.getPreprocessorAllocator().Allocate<Token>(1),
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits