OSDN Git Service

* fold-const.c (extract_muldiv): Don't distribute and widen
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 14 Apr 2000 17:45:17 +0000 (17:45 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 14 Apr 2000 17:45:17 +0000 (17:45 +0000)
        multiply across plus for non-sizetype unsigned types.

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

gcc/ChangeLog
gcc/fold-const.c

index 4465c29..29c1d1f 100644 (file)
@@ -1,5 +1,10 @@
 2000-04-14  Richard Henderson  <rth@cygnus.com>
 
+        * fold-const.c (extract_muldiv): Don't distribute and widen
+        multiply across plus for non-sizetype unsigned types.
+
+2000-04-14  Richard Henderson  <rth@cygnus.com>
+
        * flow.c (find_auto_inc): Don't autoinc eliminable registers.
        If the original source is dead in the incr insn, it's dead now.
 
index 19b2f70..991dddd 100644 (file)
@@ -4480,6 +4480,14 @@ extract_muldiv (t, c, code, wide_type)
       if (op1 == 0 || TREE_OVERFLOW (op1))
        break;
 
+      /* If we have an unsigned type is not a sizetype, we cannot widen
+        the operation since it will change the result if the original
+        computation overflowed.  */
+      if (TREE_UNSIGNED (ctype)
+         && ! TYPE_IS_SIZETYPE (ctype)
+         && ctype != type)
+       break;
+
       /* If we were able to eliminate our operation from the first side,
         apply our operation to the second side and reform the PLUS.  */
       if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))