From 6d94dc5c5cb3474b55a7d846cae17db4a460bc0c Mon Sep 17 00:00:00 2001 From: law Date: Thu, 14 Oct 1999 08:54:16 +0000 Subject: [PATCH] * fold-const.c (fold): Detect rotates built from BIT_XOR_EXPRs. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@29966 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 4 ++++ gcc/fold-const.c | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 14cae90..04652a7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 * combine.c (simplify_logical): Recognize xor pattern that encodes diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 54eeb45..8327419 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -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: -- 2.7.4