* fold-const.c (fold): Strip NOPs that change the signedness
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 28 Feb 2004 07:33:10 +0000 (07:33 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 28 Feb 2004 07:33:10 +0000 (07:33 +0000)
for RSHIFT too.  Expand comment.

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

gcc/ChangeLog
gcc/fold-const.c

index 879bbfc..8722e94 100644 (file)
@@ -1,8 +1,13 @@
+2004-02-28  Eric Botcazou  <ebotcazou@act-europe.fr>
+
+       * fold-const.c (fold): Strip NOPs that change the signedness
+       for RSHIFT too.  Expand comment.
+
 2004-02-27  Ian Lance Taylor  <ian@wasabisystems.com>
 
        PR optimization/7871
        * flow.c (mark_set_1): Don't add LOG_LINKS for global registers
-       from or to call insns.  
+       from or to call insns.
 
 2004-02-27  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
index 9178a34..04452de 100644 (file)
@@ -5423,14 +5423,20 @@ fold (tree expr)
          if (op == 0)
            continue;           /* Valid for CALL_EXPR, at least.  */
 
-         if (kind == '<' || code == RSHIFT_EXPR)
-           {
-             /* Signedness matters here.  Perhaps we can refine this
-                later.  */
-             STRIP_SIGN_NOPS (op);
-           }
+         /* Strip any conversions that don't change the mode.  This is
+            safe for every expression, except for a comparison expression
+            because its signedness is derived from its operands.  So, in
+            the latter case, only strip conversions that don't change the
+            signedness.
+
+            Note that this is done as an internal manipulation within the
+            constant folder, in order to find the simplest representation
+            of the arguments so that their form can be studied.  In any
+            cases, the appropriate type conversions should be put back in
+            the tree that will get out of the constant folder.  */
+         if (kind == '<')
+           STRIP_SIGN_NOPS (op);
          else
-           /* Strip any conversions that don't change the mode.  */
            STRIP_NOPS (op);
 
          if (TREE_CODE (op) == COMPLEX_CST)