summaryrefslogtreecommitdiff
path: root/regress/sys/kern
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2022-10-25 19:55:32 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2022-10-25 19:55:32 +0000
commit546c92a68fd2891cdbcb915ff41a19df1d21ac04 (patch)
tree05715fcaf6a7a10251aaab31d2a35afdcd3a396d /regress/sys/kern
parente55718f9c01961332361f22152f06590a076baed (diff)
Make the floating-point computations a sligthly teeny bit more complex (but
real), to prevent llvm panzers from optimizing too aggressively and generating code which does not touch the slightest floating point register on some platforms. ok otto@
Diffstat (limited to 'regress/sys/kern')
-rw-r--r--regress/sys/kern/signal/fpsig/fpsig.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/regress/sys/kern/signal/fpsig/fpsig.c b/regress/sys/kern/signal/fpsig/fpsig.c
index ae4e368e0d8..5830ab10b91 100644
--- a/regress/sys/kern/signal/fpsig/fpsig.c
+++ b/regress/sys/kern/signal/fpsig/fpsig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fpsig.c,v 1.2 2005/07/15 07:28:33 otto Exp $ */
+/* $OpenBSD: fpsig.c,v 1.3 2022/10/25 19:55:31 miod Exp $ */
/*
* Public domain. 2005, Otto Moerbeek
@@ -11,8 +11,9 @@
#include <err.h>
#include <signal.h>
#include <unistd.h>
+#include <sys/time.h>
-#define LIMIT 10.0
+#define LIMIT 11.1
volatile sig_atomic_t count;
@@ -24,10 +25,8 @@ handler(int signo)
{
double a, b, c = 0.0;
- if (signo)
- alarm(1);
- for (a = 0.0; a < LIMIT; a++)
- for (b = 0.0; b < LIMIT; b++)
+ for (a = 0.0; a < LIMIT; a += 1.1)
+ for (b = 0.0; b < LIMIT; b += 1.1)
c += a * a + b * b;
if (signo) {
@@ -40,14 +39,30 @@ handler(int signo)
int
main()
{
- signal(SIGALRM, handler);
+ struct itimerval it = {
+ .it_interval = { .tv_sec = 0, .tv_usec = 10000 },
+ .it_value = { .tv_sec = 0, .tv_usec = 10000 }
+ };
+
/* initialize global vars */
handler(0);
handler(1);
+
+ signal(SIGALRM, handler);
+ setitimer(ITIMER_REAL, &it, NULL);
- while (count < 10) {
+ while (count < 10000) {
handler(0);
- if (g1 != g2)
+ double a, b, h1 = g1, h2 = g2;
+
+ for (a = 0.0; a < LIMIT; a += 1.1)
+ for (b = 0.0; b < LIMIT; b += 1.1)
+ h1 += a * a + b * b;
+ for (a = 0.0; a < LIMIT; a += 1.1)
+ for (b = 0.0; b < LIMIT; b += 1.1)
+ h2 += a * a + b * b;
+
+ if (h1 != h2)
errx(1, "%f %f", g1, g2);
}
return (0);