simplify-rtx: Remove non-simplifying simplification (PR77729)

If we have (X&C1)|C2 simplify_binary_operation_1 makes C1 as small as
possible.  This makes worse code in common cases like when the AND with
C1 is from a zero-extension.  This patch fixes it by removing this
transformation (twice).


	PR rtl-optimization/77729
	* simplify-rtx.c (simplify_binary_operation_1): Delete the (X&C1)|C2
	to (X&(C1&~C2))|C2 transformations.

From-SVN: r253384
This commit is contained in:
Segher Boessenkool 2017-10-03 18:02:38 +02:00 committed by Segher Boessenkool
parent 9c53f040cb
commit a8ccdfa8ea
2 changed files with 6 additions and 25 deletions

View File

@ -1,3 +1,9 @@
2017-10-03 Segher Boessenkool <segher@kernel.crashing.org>
PR rtl-optimization/77729
* simplify-rtx.c (simplify_binary_operation_1): Delete the (X&C1)|C2
to (X&(C1&~C2))|C2 transformations.
2017-10-03 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/82363

View File

@ -2673,14 +2673,6 @@ simplify_binary_operation_1 (enum rtx_code code, machine_mode mode,
/* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2. */
if (((c1|c2) & mask) == mask)
return simplify_gen_binary (IOR, mode, XEXP (op0, 0), op1);
/* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2. */
if (((c1 & ~c2) & mask) != (c1 & mask))
{
tem = simplify_gen_binary (AND, mode, XEXP (op0, 0),
gen_int_mode (c1 & ~c2, mode));
return simplify_gen_binary (IOR, mode, tem, op1);
}
}
/* Convert (A & B) | A to A. */
@ -2736,23 +2728,6 @@ simplify_binary_operation_1 (enum rtx_code code, machine_mode mode,
return gen_rtx_ROTATE (int_mode, XEXP (opright, 0),
XEXP (SUBREG_REG (opleft), 1));
/* If we have (ior (and (X C1) C2)), simplify this by making
C1 as small as possible if C1 actually changes. */
if (CONST_INT_P (op1)
&& (HWI_COMPUTABLE_MODE_P (mode)
|| INTVAL (op1) > 0)
&& GET_CODE (op0) == AND
&& CONST_INT_P (XEXP (op0, 1))
&& CONST_INT_P (op1)
&& (UINTVAL (XEXP (op0, 1)) & UINTVAL (op1)) != 0)
{
rtx tmp = simplify_gen_binary (AND, mode, XEXP (op0, 0),
gen_int_mode (UINTVAL (XEXP (op0, 1))
& ~UINTVAL (op1),
mode));
return simplify_gen_binary (IOR, mode, tmp, op1);
}
/* If OP0 is (ashiftrt (plus ...) C), it might actually be
a (sign_extend (plus ...)). Then check if OP1 is a CONST_INT and
the PLUS does not affect any of the bits in OP1: then we can do