[rtems commit] tmtests/tmcontext01: Prevent GCC 7.1 optimizations

Sebastian Huber sebh at rtems.org
Thu Jul 20 09:40:13 UTC 2017


Module:    rtems
Branch:    master
Commit:    1c256e6fbe1e72136496a0d638ede4f50d4eaa24
Changeset: http://git.rtems.org/rtems/commit/?id=1c256e6fbe1e72136496a0d638ede4f50d4eaa24

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Thu Jul 20 11:32:53 2017 +0200

tmtests/tmcontext01: Prevent GCC 7.1 optimizations

It is getting harder to prevent the compiler from optimizing away the
recursive function calls.

---

 testsuites/tmtests/tmcontext01/init.c | 41 ++++++++++++++++++-----------------
 1 file changed, 21 insertions(+), 20 deletions(-)

diff --git a/testsuites/tmtests/tmcontext01/init.c b/testsuites/tmtests/tmcontext01/init.c
index c368d79..2651847 100644
--- a/testsuites/tmtests/tmcontext01/init.c
+++ b/testsuites/tmtests/tmcontext01/init.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 embedded brains GmbH.  All rights reserved.
+ * Copyright (c) 2014, 2017 embedded brains GmbH.  All rights reserved.
  *
  *  embedded brains GmbH
  *  Dornierstr. 4
@@ -36,7 +36,7 @@ const char rtems_test_name[] = "TMCONTEXT 1";
 
 static rtems_counter_ticks t[SAMPLES];
 
-static volatile bool always_true = true;
+static volatile int prevent_optimization;
 
 static size_t cache_line_size;
 
@@ -59,19 +59,17 @@ static int dirty_data_cache(volatile int *data, size_t n, size_t clsz, int j)
   return i + j;
 }
 
-static int prevent_opt_func(int m, int n)
+static int call_at_level(
+  int start,
+  int fl,
+  int s,
+  bool dirty
+)
 {
-  if (m == 0) {
-    return n + 1;
-  } else if (m > 0 && n == 0) {
-    return prevent_opt_func(m - 1, 1);
-  } else {
-    return prevent_opt_func(m - 1, prevent_opt_func(m, n - 1));
-  }
-}
+  int prevent_optimization;;
+
+  prevent_optimization = start + fl;
 
-static int call_at_level(int start, int fl, int s, bool dirty)
-{
   if (fl == start) {
     /*
      * Some architectures like the SPARC have register windows.  A side-effect
@@ -82,11 +80,12 @@ static int call_at_level(int start, int fl, int s, bool dirty)
   }
 
   if (fl > 0) {
-    if (always_true) {
-      return call_at_level(start, fl - 1, s, dirty);
-    } else {
-      return prevent_opt_func(fl - 1, fl - 2);
-    }
+    call_at_level(
+      start,
+      fl - 1,
+      s,
+      dirty
+    );
   } else {
     char *volatile space;
     rtems_counter_ticks a;
@@ -107,9 +106,9 @@ static int call_at_level(int start, int fl, int s, bool dirty)
 
     b = rtems_counter_read();
     t[s] = rtems_counter_difference(b, a);
-
-    return 0;
   }
+
+  return prevent_optimization;
 }
 
 static void load_task(rtems_task_argument arg)
@@ -148,6 +147,8 @@ static void test_by_function_level(int fl, bool dirty)
   uint64_t q3;
   uint64_t max;
 
+  fl += prevent_optimization;
+
   rtems_interrupt_lock_initialize(&lock, "test");
   rtems_interrupt_lock_acquire(&lock, &lock_context);
 



More information about the vc mailing list