fold-const.c (fold): Replace sign-extension of a zero extended value by a single...
authorPhilippe De Muyter <phdm@macqel.be>
Thu, 19 Mar 1998 19:27:18 +0000 (20:27 +0100)
committerJeff Law <law@gcc.gnu.org>
Thu, 19 Mar 1998 19:27:18 +0000 (12:27 -0700)
        * fold-const.c (fold): Replace sign-extension of a zero extended
        value by a single zero extension.

From-SVN: r18713

gcc/ChangeLog
gcc/fold-const.c

index 391fd9ccbe683cd6e76151cbfa07d2a3f03eae79..e25b040113ee4b7d9cc7a97e583b4e5a07edf294 100644 (file)
@@ -1,3 +1,8 @@
+Thu Mar 19 20:30:31 1998  Philippe De Muyter  <phdm@macqel.be>
+
+       * fold-const.c (fold): Replace sign-extension of a zero extended
+       value by a single zero extension.
+
 Thu Mar 19 00:58:07 1998  Jason Merrill  <jason@yorick.cygnus.com>
 
        * except.c (init_eh): Do nothing.
index 3a24e4c2df584d3b6429ab282464e7870fabbb8a..4fcd7448303f258d93e79376510af56b1ae9ac41 100644 (file)
@@ -4101,6 +4101,13 @@ fold (expr)
              && ! final_ptr)
            return convert (final_type, TREE_OPERAND (TREE_OPERAND (t, 0), 0));
 
+         /* If we have a sign-extension of a zero-extended value, we can
+            replace that by a single zero-extension.  */
+         if (inside_int && inter_int && final_int
+             && inside_prec < inter_prec && inter_prec < final_prec
+             && inside_unsignedp && !inter_unsignedp)
+           return convert (final_type, TREE_OPERAND (TREE_OPERAND (t, 0), 0));
+
          /* Two conversions in a row are not needed unless:
             - some conversion is floating-point (overstrict for now), or
             - the intermediate type is narrower than both initial and