Come up with selftests for predict.c.
authorMartin Liska <mliska@suse.cz>
Fri, 9 Jun 2017 07:38:52 +0000 (09:38 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Fri, 9 Jun 2017 07:38:52 +0000 (07:38 +0000)
2017-06-09  Martin Liska  <mliska@suse.cz>

* predict.c (struct branch_predictor): New struct.
(test_prediction_value_range): New test.
(predict_c_tests): New function.
* selftest-run-tests.c (selftest::run_tests): Run the function.
* selftest.h: Declare new tests.

From-SVN: r249048

gcc/ChangeLog
gcc/predict.c
gcc/selftest-run-tests.c
gcc/selftest.h

index 285d56af2802dccd0feadac6d39b3a565a8df4ec..ded979703ad5521e0d25f716b265e97abc4568c8 100644 (file)
@@ -1,3 +1,11 @@
+2017-06-09  Martin Liska  <mliska@suse.cz>
+
+       * predict.c (struct branch_predictor): New struct.
+       (test_prediction_value_range): New test.
+       (predict_c_tests): New function.
+       * selftest-run-tests.c (selftest::run_tests): Run the function.
+       * selftest.h: Declare new tests.
+
 2017-06-09  Segher Boessenkool  <segher@kernel.crashing.org>
 
        PR target/80966
index bf932305cc9ea9d9eb478af4aa49c3d8c4b6009c..ca40068c150777e22e7198364b4d0eac84b550a6 100644 (file)
@@ -57,6 +57,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-scalar-evolution.h"
 #include "ipa-utils.h"
 #include "gimple-pretty-print.h"
+#include "selftest.h"
 
 /* Enum with reasons why a predictor is ignored.  */
 
@@ -4016,3 +4017,46 @@ force_edge_cold (edge e, bool impossible)
                 impossible ? "impossible" : "cold");
     }
 }
+
+#if CHECKING_P
+
+namespace selftest {
+
+/* Test that value range of predictor values defined in predict.def is
+   within range (50, 100].  */
+
+struct branch_predictor
+{
+  const char *name;
+  unsigned probability;
+};
+
+#define DEF_PREDICTOR(ENUM, NAME, HITRATE, FLAGS) { NAME, HITRATE },
+
+static void
+test_prediction_value_range ()
+{
+  branch_predictor predictors[] = {
+#include "predict.def"
+    {NULL, -1}
+  };
+
+  for (unsigned i = 0; predictors[i].name != NULL; i++)
+    {
+      unsigned p = 100 * predictors[i].probability / REG_BR_PROB_BASE;
+      ASSERT_TRUE (p > 50 && p <= 100);
+    }
+}
+
+#undef DEF_PREDICTOR
+
+/* Run all of the selfests within this file.  */
+
+void
+predict_c_tests ()
+{
+  test_prediction_value_range ();
+}
+
+} // namespace selftest
+#endif /* CHECKING_P.  */
index f62bc72b07207cf5e4cacb1b3831604c0e69b8b8..30e476d14c5da02d2e2873accf1c358d04e06a63 100644 (file)
@@ -92,6 +92,7 @@ selftest::run_tests ()
     targetm.run_target_selftests ();
 
   store_merging_c_tests ();
+  predict_c_tests ();
 
   /* Run any lang-specific selftests.  */
   lang_hooks.run_lang_selftests ();
index dad53e9fe09f2258efabb04f85b03ffd1bb5b097..0572fefd2812159d6a3083a995d5f0d4963f81e8 100644 (file)
@@ -196,6 +196,7 @@ extern void tree_c_tests ();
 extern void tree_cfg_c_tests ();
 extern void vec_c_tests ();
 extern void wide_int_cc_tests ();
+extern void predict_c_tests ();
 
 extern int num_passes;