diff options
author | Sebastian Pop <sebastian.pop@amd.com> | 2011-07-21 22:57:49 +0000 |
---|---|---|
committer | Sebastian Pop <spop@gcc.gnu.org> | 2011-07-21 22:57:49 +0000 |
commit | 84f2ffea18c756f4c07e35e771739319f515711e (patch) | |
tree | f1d9fd23a26747a21db1850b97aa3885e1eec681 /gcc | |
parent | 3d9784cb6fbfa0bc90b75c90c67557a136aace35 (diff) | |
download | gcc-84f2ffea18c756f4c07e35e771739319f515711e.zip gcc-84f2ffea18c756f4c07e35e771739319f515711e.tar.gz gcc-84f2ffea18c756f4c07e35e771739319f515711e.tar.bz2 |
Generate signed types whenever possible.
2011-07-21 Sebastian Pop <sebastian.pop@amd.com>
* graphite-clast-to-gimple.c (type_for_interval): Generate signed
types whenever possible.
From-SVN: r176604
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/graphite-clast-to-gimple.c | 13 |
2 files changed, 16 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d3921ed..ea4db8c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2011-07-21 Sebastian Pop <sebastian.pop@amd.com> + * graphite-clast-to-gimple.c (type_for_interval): Generate signed + types whenever possible. + +2011-07-21 Sebastian Pop <sebastian.pop@amd.com> + * graphite-clast-to-gimple.c (struct clast_name_index): Add lb and ub fields. (new_clast_name_index): Add lb and ub parameters. diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c index 6bc84d2..9cd2737 100644 --- a/gcc/graphite-clast-to-gimple.c +++ b/gcc/graphite-clast-to-gimple.c @@ -443,6 +443,7 @@ type_for_interval (mpz_t v1, mpz_t v2) bool unsigned_p; tree type; enum machine_mode mode; + int wider_precision; int precision = MAX (mpz_sizeinbase (v1, 2), mpz_sizeinbase (v2, 2)); @@ -458,8 +459,16 @@ type_for_interval (mpz_t v1, mpz_t v2) unsigned_p = (mpz_sgn (v2) >= 0); mode = smallest_mode_for_size (precision, MODE_INT); - precision = GET_MODE_PRECISION (mode); - type = build_nonstandard_integer_type (precision, unsigned_p); + wider_precision = GET_MODE_PRECISION (mode); + + /* As we want to generate signed types as much as possible, try to + fit the interval [v1, v2] in a signed type. For example, + supposing that we have the interval [0, 100], instead of + generating unsigned char, we want to generate a signed char. */ + if (unsigned_p && precision < wider_precision) + unsigned_p = false; + + type = build_nonstandard_integer_type (wider_precision, unsigned_p); if (!type) { |