convert.c (convert_to_integer): Avoid recursive call to convert_to_integer by buildin...
authorRoger Sayle <roger@eyesopen.com>
Thu, 26 May 2005 04:38:51 +0000 (04:38 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Thu, 26 May 2005 04:38:51 +0000 (04:38 +0000)
* convert.c (convert_to_integer) <POINTER_TYPE>: Avoid recursive
call to convert_to_integer by building the NOP_EXPR directly.

From-SVN: r100184

gcc/ChangeLog
gcc/convert.c

index f9d1cb795a07e351ba15cffbf14fc6f0fe1deac7..a4037339c6ef88d5c494a13e1f006c79d4fed4d7 100644 (file)
@@ -1,3 +1,8 @@
+2005-05-25  Roger Sayle  <roger@eyesopen.com>
+
+       * convert.c (convert_to_integer) <POINTER_TYPE>: Avoid recursive
+       call to convert_to_integer by building the NOP_EXPR directly.
+
 2005-05-25  Richard Sandiford  <rsandifo@redhat.com>
 
        * config/rs6000/rs6000.opt (mprioritize-restricted-insns=): Fix typo.
index 97705a2926a8260d215064b9cf8baa7fa499749a..fbd18dee23e204bc5129b3729096aebf0911c0a1 100644 (file)
@@ -411,13 +411,14 @@ convert_to_integer (tree type, tree expr)
     case POINTER_TYPE:
     case REFERENCE_TYPE:
       if (integer_zerop (expr))
-       expr = integer_zero_node;
-      else
-       expr = fold (build1 (CONVERT_EXPR,
-                            lang_hooks.types.type_for_size (POINTER_SIZE, 0),
-                            expr));
-
-      return convert_to_integer (type, expr);
+       return build_int_cst (type, 0);
+
+      /* Convert to an unsigned integer of the correct width first,
+        and from there widen/truncate to the required type.  */
+      expr = fold_build1 (CONVERT_EXPR,
+                         lang_hooks.types.type_for_size (POINTER_SIZE, 0),
+                         expr);
+      return fold_build1 (NOP_EXPR, type, expr);
 
     case INTEGER_TYPE:
     case ENUMERAL_TYPE: