This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Move stuff to simplify-rtx.c, 13/13 - misc. unary
- From: Paolo Bonzini <paolo dot bonzini at lu dot unisi dot ch>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Roger Sayle <roger at eyesopen dot com>
- Date: Wed, 14 Dec 2005 00:03:42 +0100
- Subject: [PATCH] Move stuff to simplify-rtx.c, 13/13 - misc. unary
This patch is the one I had already sent, split into thirteen pieces. I
hope it's easier to review it. This one moves POPCOUNT, PARITY, FFS,
FLOAT simplifications to simplify-rtx.c. All of these remove
unnecessary sign and zero extensions, because the mode of these code's
operands need not match the mode of the expression itself.
The patch set was bootstrapped and regtested all in one, on
powerpc-apple-darwin8.3.0 and i686-pc-linux-gnu.
Paolo
Only in combine-rest: #simplifications-in-simplify-rtx.patch#
Only in combine-rest: .#simplifications-in-simplify-rtx.patch
diff -paura combine-vec-select/combine.c combine-rest/combine.c
--- combine-vec-select/combine.c 2005-12-13 22:45:21.000000000 +0100
+++ combine-rest/combine.c 2005-12-13 22:52:39.000000000 +0100
@@ -3901,7 +3901,6 @@ combine_simplify_rtx (rtx x, enum machin
enum rtx_code code = GET_CODE (x);
enum machine_mode mode = GET_MODE (x);
rtx temp;
- rtx reversed;
int i;
/* If this is a commutative operation, put a constant last and a complex
@@ -4550,26 +4548,6 @@ combine_simplify_rtx (rtx x, enum machin
case IOR:
return simplify_logical (x);
- case FFS:
- /* (ffs (*_extend <X>)) = (ffs <X>) */
- if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
- || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
- SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
- break;
-
- case POPCOUNT:
- case PARITY:
- /* (pop* (zero_extend <X>)) = (pop* <X>) */
- if (GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
- SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
- break;
-
- case FLOAT:
- /* (float (sign_extend <X>)) = (float <X>). */
- if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
- SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
- break;
-
case ASHIFT:
case LSHIFTRT:
case ASHIFTRT:
@@ -5281,7 +5259,6 @@ simplify_logical (rtx x)
enum machine_mode mode = GET_MODE (x);
rtx op0 = XEXP (x, 0);
rtx op1 = XEXP (x, 1);
- rtx tmp, reversed;
switch (GET_CODE (x))
{
diff -paura combine-vec-select/simplify-rtx.c combine-rest/simplify-rtx.c
--- combine-vec-select/simplify-rtx.c 2005-12-13 22:51:35.000000000 +0100
+++ combine-rest/simplify-rtx.c 2005-12-13 22:51:45.000000000 +0100
@@ -399,7 +399,8 @@ simplify_unary_operation_1 (enum rtx_cod
if (GET_CODE (op) == NOT)
return XEXP (op, 0);
- /* (not (eq X Y)) == (ne X Y), etc. */
+ /* (not (eq X Y)) == (ne X Y), etc. if BImode or the result of the
+ comparison is all ones. */
if (COMPARISON_P (op)
&& (mode == BImode || STORE_FLAG_VALUE == -1)
&& ((reversed = reversed_comparison_code (op, NULL_RTX)) != UNKNOWN))
@@ -443,14 +444,6 @@ simplify_unary_operation_1 (enum rtx_cod
return simplify_gen_binary (ROTATE, mode, temp, XEXP (op, 1));
}
- /* If STORE_FLAG_VALUE is -1, (not (comparison X Y)) can be done
- by reversing the comparison code if valid. */
- if (STORE_FLAG_VALUE == -1
- && COMPARISON_P (op)
- && (reversed = reversed_comparison_code (op, NULL_RTX)) != UNKNOWN)
- return simplify_gen_relational (reversed, mode, VOIDmode,
- XEXP (op, 0), XEXP (op, 1));
-
/* (not (ashiftrt foo C)) where C is the number of bits in FOO
minus 1 is (ge foo (const_int 0)) if STORE_FLAG_VALUE is -1,
so we can perform the above simplification. */
@@ -744,6 +737,29 @@ simplify_unary_operation_1 (enum rtx_cod
break;
+ case FFS:
+ /* (ffs (*_extend <X>)) = (ffs <X>) */
+ if (GET_CODE (op) == SIGN_EXTEND
+ || GET_CODE (op) == ZERO_EXTEND)
+ return simplify_gen_unary (FFS, mode, XEXP (op, 0),
+ GET_MODE (XEXP (op, 0)));
+ break;
+
+ case POPCOUNT:
+ case PARITY:
+ /* (pop* (zero_extend <X>)) = (pop* <X>) */
+ if (GET_CODE (op) == ZERO_EXTEND)
+ return simplify_gen_unary (code, mode, XEXP (op, 0),
+ GET_MODE (XEXP (op, 0)));
+ break;
+
+ case FLOAT:
+ /* (float (sign_extend <X>)) = (float <X>). */
+ if (GET_CODE (op) == SIGN_EXTEND)
+ return simplify_gen_unary (FLOAT, mode, XEXP (op, 0),
+ GET_MODE (XEXP (op, 0)));
+ break;
+
case SIGN_EXTEND:
/* (sign_extend (truncate (minus (label_ref L1) (label_ref L2))))
becomes just the MINUS if its mode is MODE. This allows