* fold-const.c (fold): Detect rotates built from BIT_XOR_EXPRs.
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Oct 1999 08:54:16 +0000 (08:54 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Oct 1999 08:54:16 +0000 (08:54 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@29966 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/fold-const.c

index 14cae90..04652a7 100644 (file)
@@ -1,3 +1,7 @@
+Thu Oct 14 02:54:13 1999  Jeffrey A Law  (law@cygnus.com)
+
+       * fold-const.c (fold): Detect rotates built from BIT_XOR_EXPRs.
+
 Thu Oct 14 02:18:19 1999  Marc Espie <espie@cvs.openbsd.org>
 
        * combine.c (simplify_logical): Recognize xor pattern that encodes
index 54eeb45..8327419 100644 (file)
@@ -5097,11 +5097,15 @@ fold (expr)
       if (t1 != NULL_TREE)
        return t1;
 
+     bit_rotate:
       /* (A << C1) | (A >> C2) if A is unsigned and C1+C2 is the size of A
         is a rotate of A by C1 bits.  */
       /* (A << B) | (A >> (Z - B)) if A is unsigned and Z is the size of A
         is a rotate of A by B bits.  */
 
+      /* Both transformations noted above also apply to when the inner
+        operation is an XOR.  */
+
       code0 = TREE_CODE (arg0);
       code1 = TREE_CODE (arg1);
       if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
@@ -5170,7 +5174,9 @@ fold (expr)
        return non_lvalue (convert (type, arg0));
       if (integer_all_onesp (arg1))
        return fold (build1 (BIT_NOT_EXPR, type, arg0));
-      goto associate;
+      /* See if this can be simplified into a rotate first.  If that
+        is unsuccessful we will jump to the association code.  */
+      goto bit_rotate;
 
     case BIT_AND_EXPR:
     bit_and: