aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/selftest-run-tests.c1
-rw-r--r--gcc/selftest.h1
-rw-r--r--gcc/sreal.c112
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/plugin/plugin.exp1
-rw-r--r--gcc/testsuite/gcc.dg/plugin/sreal-test-1.c8
-rw-r--r--gcc/testsuite/gcc.dg/plugin/sreal_plugin.c170
8 files changed, 131 insertions, 179 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d3dfcc8..2d767c8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2016-07-20 Martin Liska <mliska@suse.cz>
+
+ * selftest-run-tests.c (selftest::run_tests): New function.
+ * selftest.h (sreal_c_tests): Declare.
+ * sreal.c (sreal_verify_basics): New function.
+ (verify_aritmetics): Likewise.
+ (sreal_verify_arithmetics): Likewise.
+ (verify_shifting): Likewise.
+ (sreal_verify_shifting): Likewise.
+ (void sreal_c_tests): Likewise.
+
2016-07-19 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/71916
diff --git a/gcc/selftest-run-tests.c b/gcc/selftest-run-tests.c
index bddf0b2..bb004cc 100644
--- a/gcc/selftest-run-tests.c
+++ b/gcc/selftest-run-tests.c
@@ -49,6 +49,7 @@ selftest::run_tests ()
pretty_print_c_tests ();
wide_int_cc_tests ();
ggc_tests_c_tests ();
+ sreal_c_tests ();
/* Mid-level data structures. */
input_c_tests ();
diff --git a/gcc/selftest.h b/gcc/selftest.h
index 967e76b..c805386 100644
--- a/gcc/selftest.h
+++ b/gcc/selftest.h
@@ -86,6 +86,7 @@ extern void pretty_print_c_tests ();
extern void rtl_tests_c_tests ();
extern void spellcheck_c_tests ();
extern void spellcheck_tree_c_tests ();
+extern void sreal_c_tests ();
extern void tree_c_tests ();
extern void tree_cfg_c_tests ();
extern void vec_c_tests ();
diff --git a/gcc/sreal.c b/gcc/sreal.c
index a7c9c12..9c43b4e 100644
--- a/gcc/sreal.c
+++ b/gcc/sreal.c
@@ -52,6 +52,7 @@ along with GCC; see the file COPYING3. If not see
#include <math.h>
#include "coretypes.h"
#include "sreal.h"
+#include "selftest.h"
/* Print the content of struct sreal. */
@@ -233,3 +234,114 @@ sreal::operator/ (const sreal &other) const
r.normalize ();
return r;
}
+
+#if CHECKING_P
+
+namespace selftest {
+
+/* Selftests for sreals. */
+
+/* Verify basic sreal operations. */
+
+static void
+sreal_verify_basics (void)
+{
+ sreal minimum = INT_MIN;
+ sreal maximum = INT_MAX;
+
+ sreal seven = 7;
+ sreal minus_two = -2;
+ sreal minus_nine = -9;
+
+ ASSERT_EQ (INT_MIN, minimum.to_int ());
+ ASSERT_EQ (INT_MAX, maximum.to_int ());
+
+ ASSERT_FALSE (minus_two < minus_two);
+ ASSERT_FALSE (seven < seven);
+ ASSERT_TRUE (seven > minus_two);
+ ASSERT_TRUE (minus_two < seven);
+ ASSERT_TRUE (minus_two != seven);
+ ASSERT_EQ (minus_two, -2);
+ ASSERT_EQ (seven, 7);
+ ASSERT_EQ ((seven << 10) >> 10, 7);
+ ASSERT_EQ (seven + minus_nine, -2);
+}
+
+/* Helper function that performs basic arithmetics and comparison
+ of given arguments A and B. */
+
+static void
+verify_aritmetics (int64_t a, int64_t b)
+{
+ ASSERT_EQ (a, -(-(sreal (a))).to_int ());
+ ASSERT_EQ (a < b, sreal (a) < sreal (b));
+ ASSERT_EQ (a <= b, sreal (a) <= sreal (b));
+ ASSERT_EQ (a == b, sreal (a) == sreal (b));
+ ASSERT_EQ (a != b, sreal (a) != sreal (b));
+ ASSERT_EQ (a > b, sreal (a) > sreal (b));
+ ASSERT_EQ (a >= b, sreal (a) >= sreal (b));
+ ASSERT_EQ (a + b, (sreal (a) + sreal (b)).to_int ());
+ ASSERT_EQ (a - b, (sreal (a) - sreal (b)).to_int ());
+ ASSERT_EQ (b + a, (sreal (b) + sreal (a)).to_int ());
+ ASSERT_EQ (b - a, (sreal (b) - sreal (a)).to_int ());
+}
+
+/* Verify arithmetics for interesting numbers. */
+
+static void
+sreal_verify_arithmetics (void)
+{
+ int values[] = {-14123413, -7777, -17, -10, -2, 0, 17, 139, 1234123};
+ unsigned c = sizeof (values) / sizeof (int);
+
+ for (unsigned i = 0; i < c; i++)
+ for (unsigned j = 0; j < c; j++)
+ {
+ int a = values[i];
+ int b = values[j];
+
+ verify_aritmetics (a, b);
+ }
+}
+
+/* Helper function that performs various shifting test of a given
+ argument A. */
+
+static void
+verify_shifting (int64_t a)
+{
+ sreal v = a;
+
+ for (unsigned i = 0; i < 16; i++)
+ ASSERT_EQ (a << i, (v << i).to_int());
+
+ a = a << 16;
+ v = v << 16;
+
+ for (unsigned i = 0; i < 16; i++)
+ ASSERT_EQ (a >> i, (v >> i).to_int());
+}
+
+/* Verify shifting for interesting numbers. */
+
+static void
+sreal_verify_shifting (void)
+{
+ int values[] = {0, 17, 32, 139, 1024, 55555, 1234123};
+ unsigned c = sizeof (values) / sizeof (int);
+
+ for (unsigned i = 0; i < c; i++)
+ verify_shifting (values[i]);
+}
+
+/* Run all of the selftests within this file. */
+
+void sreal_c_tests ()
+{
+ sreal_verify_basics ();
+ sreal_verify_arithmetics ();
+ sreal_verify_shifting ();
+}
+
+} // namespace selftest
+#endif /* CHECKING_P */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 47ca526..7f42fad 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2016-07-20 Martin Liska <mliska@suse.cz>
+
+ * gcc.dg/plugin/plugin.exp: Remove sreal test.
+ * gcc.dg/plugin/sreal-test-1.c: Remove.
+ * gcc.dg/plugin/sreal_plugin.c: Remove.
+
2016-07-19 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/71902
diff --git a/gcc/testsuite/gcc.dg/plugin/plugin.exp b/gcc/testsuite/gcc.dg/plugin/plugin.exp
index f039c8d..faebb75 100644
--- a/gcc/testsuite/gcc.dg/plugin/plugin.exp
+++ b/gcc/testsuite/gcc.dg/plugin/plugin.exp
@@ -59,7 +59,6 @@ set plugin_test_list [list \
{ selfassign.c self-assign-test-1.c self-assign-test-2.c } \
{ ggcplug.c ggcplug-test-1.c } \
{ one_time_plugin.c one_time-test-1.c } \
- { sreal_plugin.c sreal-test-1.c } \
{ start_unit_plugin.c start_unit-test-1.c } \
{ finish_unit_plugin.c finish_unit-test-1.c } \
{ wide-int_plugin.c wide-int-test-1.c } \
diff --git a/gcc/testsuite/gcc.dg/plugin/sreal-test-1.c b/gcc/testsuite/gcc.dg/plugin/sreal-test-1.c
deleted file mode 100644
index 1bce2cc..0000000
--- a/gcc/testsuite/gcc.dg/plugin/sreal-test-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Test that pass is inserted and invoked once. */
-/* { dg-do compile } */
-/* { dg-options "-O" } */
-
-int main (int argc, char **argv)
-{
- return 0;
-}
diff --git a/gcc/testsuite/gcc.dg/plugin/sreal_plugin.c b/gcc/testsuite/gcc.dg/plugin/sreal_plugin.c
deleted file mode 100644
index f113816..0000000
--- a/gcc/testsuite/gcc.dg/plugin/sreal_plugin.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/* Plugin that process internal tests for sreal. */
-#include "config.h"
-#include "gcc-plugin.h"
-#include "system.h"
-#include "coretypes.h"
-#include "tree.h"
-#include "tm.h"
-#include "toplev.h"
-#include "hash-table.h"
-#include "vec.h"
-#include "ggc.h"
-#include "basic-block.h"
-#include "tree-ssa-alias.h"
-#include "internal-fn.h"
-#include "gimple-fold.h"
-#include "tree-eh.h"
-#include "gimple-expr.h"
-#include "is-a.h"
-#include "gimple.h"
-#include "tree-pass.h"
-#include "intl.h"
-#include "context.h"
-#include "sreal.h"
-
-int plugin_is_GPL_compatible;
-
-namespace {
-
-static void assert (bool c)
-{
- if (!c)
- abort ();
-}
-
-const pass_data pass_data_sreal_pass =
-{
- GIMPLE_PASS, /* type */
- "sreal", /* name */
- OPTGROUP_NONE, /* optinfo_flags */
- TV_NONE, /* tv_id */
- PROP_gimple_any, /* properties_required */
- 0, /* properties_provided */
- 0, /* properties_destroyed */
- 0, /* todo_flags_start */
- 0, /* todo_flags_finish */
-};
-
-class sreal_pass : public gimple_opt_pass
-{
-public:
- sreal_pass(gcc::context *ctxt)
- : gimple_opt_pass(pass_data_sreal_pass, ctxt)
- {}
-
- /* opt_pass methods: */
- virtual bool gate (function *);
- virtual unsigned int execute (function *);
-
-private:
- void check_sreal ();
-
- static void verify_aritmetics (int a, int b);
- static void verify_shifting (int a);
-}; // class one_pass
-
-} // anon namespace
-
-void
-sreal_pass::verify_aritmetics (int a, int b)
-{
- assert (a == -(-(sreal (a))).to_int ());
- assert ((a < b) == (sreal (a) < sreal (b)));
- assert ((a <= b) == (sreal (a) <= sreal (b)));
- assert ((a == b) == (sreal (a) == sreal (b)));
- assert ((a != b) == (sreal (a) != sreal (b)));
- assert ((a > b) == (sreal (a) > sreal (b)));
- assert ((a >= b) == (sreal (a) >= sreal (b)));
- assert ((a + b) == (sreal (a) + sreal (b)).to_int ());
- assert ((a - b) == (sreal (a) - sreal (b)).to_int ());
- assert ((b + a) == (sreal (b) + sreal (a)).to_int ());
- assert ((b - a) == (sreal (b) - sreal (a)).to_int ());
-}
-
-void
-sreal_pass::verify_shifting (int a)
-{
- sreal v = a;
-
- for (unsigned i = 0; i < 16; i++)
- assert ((a << i) == (v << i).to_int());
-
- a = a << 16;
- v = v << 16;
-
- for (unsigned i = 0; i < 16; i++)
- assert ((a >> i) == (v >> i).to_int());
-}
-
-void
-sreal_pass::check_sreal ()
-{
- sreal minimum = INT_MIN;
- sreal maximum = INT_MAX;
- sreal seven = 7;
- sreal minus_two = -2;
- sreal minus_nine = -9;
-
- assert (minimum.to_int () == INT_MIN);
- assert (maximum.to_int () == INT_MAX);
-
- assert (!(minus_two < minus_two));
- assert (!(seven < seven));
- assert (seven > minus_two);
- assert (minus_two < seven);
- assert (minus_two != seven);
- assert (minus_two == minus_two);
- assert (seven == seven);
-
- assert (seven == ((seven << 10) >> 10));
-
- assert ((seven + minus_two) == 5);
- assert ((seven + minus_nine) == -2);
-
- for (int a = -100; a < 100; a++)
- for (int b = -100; b < 100; b++)
- {
- verify_aritmetics (a, b);
- verify_aritmetics (INT_MIN + 100, b);
- verify_aritmetics (INT_MAX - 100, b);
- }
-
- srand (123456);
-
- for (int i = 0; i < 1000 * 1000; i++)
- {
- verify_aritmetics (rand () % 10, rand () % 1000000);
- verify_aritmetics (rand () % 100, rand () % 10000);
- }
-
- for (int a = -100; a < 100; a++)
- verify_shifting (a);
-}
-
-bool sreal_pass::gate (function *)
-{
- return true;
-}
-
-unsigned int
-sreal_pass::execute (function *)
-{
- check_sreal ();
-
- return 0;
-}
-
-int plugin_init (struct plugin_name_args *plugin_info,
- struct plugin_gcc_version *version)
-{
- struct register_pass_info p;
-
- p.pass = new sreal_pass (g);
- p.reference_pass_name = "cfg";
- p.ref_pass_instance_number = 1;
- p.pos_op = PASS_POS_INSERT_AFTER;
-
- register_callback ("sreal", PLUGIN_PASS_MANAGER_SETUP, NULL, &p);
-
- return 0;
-}