OSDN Git Service

* convert.c (convert_to_pointer): Preserve the TREE_OVERFLOW
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Mar 2006 21:55:34 +0000 (21:55 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Mar 2006 21:55:34 +0000 (21:55 +0000)
and TREE_CONSTANT_OVERFLOW bits of the argument.  Return
quickly if the argument is already of the correct type.
Call fold_build1 instead of build1.  Tidy up blank lines.

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

gcc/ChangeLog
gcc/convert.c

index 8a29a79..b028b30 100644 (file)
@@ -1,3 +1,10 @@
+2006-03-29  Roger Sayle  <roger@eyesopen.com>
+
+       * convert.c (convert_to_pointer): Preserve the TREE_OVERFLOW
+       and TREE_CONSTANT_OVERFLOW bits of the argument.  Return
+       quickly if the argument is already of the correct type.
+       Call fold_build1 instead of build1.  Tidy up blank lines.
+
 2006-03-29  David Edelsohn  <edelsohn@gnu.org>
 
        * genemit.c (main): Add tm-constrs.h to included headers.
index ba5f6fd..9797704 100644 (file)
@@ -33,22 +33,31 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 #include "toplev.h"
 #include "langhooks.h"
 #include "real.h"
-/* Convert EXPR to some pointer or reference type TYPE.
 
+/* Convert EXPR to some pointer or reference type TYPE.
    EXPR must be pointer, reference, integer, enumeral, or literal zero;
    in other cases error is called.  */
 
 tree
 convert_to_pointer (tree type, tree expr)
 {
+  if (TREE_TYPE (expr) == type)
+    return expr;
+
   if (integer_zerop (expr))
-    return build_int_cst (type, 0);
+    {
+      tree t = build_int_cst (type, 0);
+      if (TREE_OVERFLOW (expr) || TREE_CONSTANT_OVERFLOW (expr))
+       t = force_fit_type (t, 0, TREE_OVERFLOW (expr),
+                           TREE_CONSTANT_OVERFLOW (expr));
+      return t;
+    }
 
   switch (TREE_CODE (TREE_TYPE (expr)))
     {
     case POINTER_TYPE:
     case REFERENCE_TYPE:
-      return build1 (NOP_EXPR, type, expr);
+      return fold_build1 (NOP_EXPR, type, expr);
 
     case INTEGER_TYPE:
     case ENUMERAL_TYPE: