tree-chrec.c (avoid_arithmetics_in_type_p): New.
authorZdenek Dvorak <dvorakz@suse.cz>
Mon, 17 Jul 2006 17:09:39 +0000 (19:09 +0200)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Mon, 17 Jul 2006 17:09:39 +0000 (17:09 +0000)
* tree-chrec.c (avoid_arithmetics_in_type_p): New.
(convert_affine_scev, chrec_convert_aggressive): Use
avoid_arithmetics_in_type_p.  Do not check for the subtypes
separately.

From-SVN: r115528

gcc/ChangeLog
gcc/tree-chrec.c

index 7a7b79f159b61bcc361b15c85afe1d7322b10899..c9a46c00c0d7bc39dcea6f8d6df6b1c3f12e6e0f 100644 (file)
@@ -1,3 +1,10 @@
+2006-07-17  Zdenek Dvorak <dvorakz@suse.cz>
+
+       * tree-chrec.c (avoid_arithmetics_in_type_p): New.
+       (convert_affine_scev, chrec_convert_aggressive): Use
+       avoid_arithmetics_in_type_p.  Do not check for the subtypes
+       separately.
+
 2006-07-17  Richard Sandiford  <richard@codesourcery.com>
 
        PR middle-end/28403
index 8038b12279d01cf83cb2ae78b8578209faf4a3c0..f9b804e6177487b1194461d4ca61c6a9c0e889ff 100644 (file)
@@ -1096,6 +1096,21 @@ nb_vars_in_chrec (tree chrec)
     }
 }
 
+/* Returns true if TYPE is a type in that we cannot directly perform
+   arithmetics, even though it is a scalar type.  */
+
+static bool
+avoid_arithmetics_in_type_p (tree type)
+{
+  /* Ada frontend uses subtypes -- an arithmetic cannot be directly performed
+     in the subtype, but a base type must be used, and the result then can
+     be casted to the subtype.  */
+  if (TREE_CODE (type) == INTEGER_TYPE && TREE_TYPE (type) != NULL_TREE)
+    return true;
+
+  return false;
+}
+
 static tree chrec_convert_1 (tree, tree, tree, bool);
 
 /* Converts BASE and STEP of affine scev to TYPE.  LOOP is the loop whose iv
@@ -1116,6 +1131,10 @@ convert_affine_scev (struct loop *loop, tree type,
   bool must_check_src_overflow, must_check_rslt_overflow;
   tree new_base, new_step;
 
+  /* If we cannot perform arithmetic in TYPE, avoid creating an scev.  */
+  if (avoid_arithmetics_in_type_p (type))
+    return false;
+
   /* In general,
      (TYPE) (BASE + STEP * i) = (TYPE) BASE + (TYPE -- sign extend) STEP * i,
      but we must check some assumptions.
@@ -1305,6 +1324,10 @@ chrec_convert_aggressive (tree type, tree chrec)
   if (TYPE_PRECISION (type) > TYPE_PRECISION (inner_type))
     return NULL_TREE;
 
+  /* If we cannot perform arithmetic in TYPE, avoid creating an scev.  */
+  if (avoid_arithmetics_in_type_p (type))
+    return false;
+
   left = CHREC_LEFT (chrec);
   right = CHREC_RIGHT (chrec);
   lc = chrec_convert_aggressive (type, left);
@@ -1313,27 +1336,7 @@ chrec_convert_aggressive (tree type, tree chrec)
   rc = chrec_convert_aggressive (type, right);
   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);
 }