Add sreal to selftests
* 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. * gcc.dg/plugin/plugin.exp: Remove sreal test. * gcc.dg/plugin/sreal-test-1.c: Remove. * gcc.dg/plugin/sreal_plugin.c: Remove. From-SVN: r238508
This commit is contained in:
parent
43694e8bbb
commit
dcbdb17aeb
@ -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
|
||||
|
@ -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 ();
|
||||
|
@ -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 ();
|
||||
|
112
gcc/sreal.c
112
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 */
|
||||
|
@ -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
|
||||
|
@ -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 } \
|
||||
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user