OSDN Git Service

* tree-chrec.c (chrec_convert_aggressive): Do not eliminate
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 28 Feb 2006 16:49:12 +0000 (16:49 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 28 Feb 2006 16:49:12 +0000 (16:49 +0000)
        conversions where TYPE_MIN_VALUE/TYPE_MAX_VALUE do not cover
        the range allowed by TYPE_PRECISION.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111568 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-chrec.c

index 3484670..7ba3134 100644 (file)
@@ -1,5 +1,9 @@
 2006-02-28  Jeff Law  <law@redhat.com>
 
+       * tree-chrec.c (chrec_convert_aggressive): Do not eliminate
+       conversions where TYPE_MIN_VALUE/TYPE_MAX_VALUE do not cover
+       the range allowed by TYPE_PRECISION.
+
        * tree.h (strct phi_arg_d): Remove unused NONZERO field.
 
 2006-02-28  Dorit Nuzman  <dorit@il.ibm.com>
index b1587a5..8edc5b9 100644 (file)
@@ -1219,6 +1219,26 @@ chrec_convert_aggressive (tree type, tree chrec)
   if (!rc)
     rc = chrec_convert (type, right, NULL_TREE);
 
+  /* Ada creates sub-types where TYPE_MIN_VALUE/TYPE_MAX_VALUE do not
+     cover the entire range of values allowed by TYPE_PRECISION.
+
+     We do not want to optimize away conversions to such types.  Long
+     term I'd rather see the Ada front-end fixed.  */
+  if (INTEGRAL_TYPE_P (type))
+    {
+      tree t;
+
+      t = upper_bound_in_type (type, inner_type);
+      if (! TYPE_MAX_VALUE (type)
+         || ! operand_equal_p (TYPE_MAX_VALUE (type), t, 0))
+       return NULL_TREE;
+
+      t = lower_bound_in_type (type, inner_type);
+      if (! TYPE_MIN_VALUE (type)
+         || ! operand_equal_p (TYPE_MIN_VALUE (type), t, 0))
+       return NULL_TREE;
+    }
+  
   return build_polynomial_chrec (CHREC_VARIABLE (chrec), lc, rc);
 }