fold-const.c (div_if_zero_remainder): Do signed divide for pointer types.
authorJan Hubicka <jh@suse.cz>
Thu, 19 Apr 2007 01:35:25 +0000 (03:35 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 19 Apr 2007 01:35:25 +0000 (01:35 +0000)
* fold-const.c (div_if_zero_remainder): Do signed divide for pointer
types.

From-SVN: r123966

gcc/ChangeLog
gcc/fold-const.c

index 1138a1a3d14dc0de8d20b63e3c67cf9f86f0aaa3..2e2fad3fbe62e721585331d7a05de82ba9cce4c8 100644 (file)
@@ -1,3 +1,8 @@
+2007-04-18  Jan Hubicka  <jh@suse.cz>
+
+       * fold-const.c (div_if_zero_remainder): Do signed divide for pointer
+       types.
+
 2007-04-18  Eric Christopher  <echristo@apple.com>
 
        * config/rs6000/darwin.md (load_macho_picbase): Use link register
index 857065f1344441503769b78d575deb1c4d257936..b0a2bb7d91e48d8bcbe65cc8011c55ff900491a3 100644 (file)
@@ -890,6 +890,17 @@ div_if_zero_remainder (enum tree_code code, tree arg1, tree arg2)
 
   int1l = TREE_INT_CST_LOW (arg1);
   int1h = TREE_INT_CST_HIGH (arg1);
+  /* &obj[0] + -128 really should be compiled as &obj[-8] rahter than
+     &obj[some_exotic_number].  */
+  if (POINTER_TYPE_P (type))
+    {
+      uns = false;
+      type = signed_type_for (type);
+      fit_double_type (int1l, int1h, &int1l, &int1h,
+                      type);
+    }
+  else
+    fit_double_type (int1l, int1h, &int1l, &int1h, type);
   int2l = TREE_INT_CST_LOW (arg2);
   int2h = TREE_INT_CST_HIGH (arg2);