Patchwork [09/10] Generate signed types whenever possible.

login
register
mail settings
Submitter Sebastian Pop
Date July 21, 2011, 6:31 p.m.
Message ID <1311273070-12128-10-git-send-email-sebpop@gmail.com>
Download mbox | patch
Permalink /patch/106134/
State New
Headers show

Comments

Sebastian Pop - July 21, 2011, 6:31 p.m.
2011-07-21  Sebastian Pop  <sebastian.pop@amd.com>

	* graphite-clast-to-gimple.c (type_for_interval): Generate signed
	types whenever possible.
---
 gcc/ChangeLog                  |    5 +++++
 gcc/graphite-clast-to-gimple.c |   13 +++++++++++--
 2 files changed, 16 insertions(+), 2 deletions(-)

Patch

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 485afca..c79f0b4 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)
     {