mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-23 04:10:26 +08:00
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:
parent
9c53f040cb
commit
a8ccdfa8ea
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user