Commit 6cdcce60 by Segher Boessenkool Committed by Segher Boessenkool

combine: Fix for PR81423

We here have an AND of a SUBREG of an LSHIFTRT.  If that SUBREG is
paradoxical, the extraction we form is the length of the size of the
inner mode, which includes some bits that should not be in the result.
Just give up in that case.


	PR rtl-optimization/81423
	* combine.c (make_compound_operation_int): Don't try to optimize
	the AND of a SUBREG of an LSHIFTRT if that SUBREG is paradoxical.

From-SVN: r250365
parent a6722e5b
2018-07-19 Segher Boessenkool <segher@kernel.crashing.org>
PR rtl-optimization/81423
* combine.c (make_compound_operation_int): Don't try to optimize
the AND of a SUBREG of an LSHIFTRT if that SUBREG is paradoxical.
2017-07-19 Segher Boessenkool <segher@kernel.crashing.org> 2017-07-19 Segher Boessenkool <segher@kernel.crashing.org>
PR rtl-optimization/81423 PR rtl-optimization/81423
......
...@@ -7956,18 +7956,9 @@ make_compound_operation_int (machine_mode mode, rtx *x_ptr, ...@@ -7956,18 +7956,9 @@ make_compound_operation_int (machine_mode mode, rtx *x_ptr,
XEXP (inner_x0, 1), XEXP (inner_x0, 1),
i, 1, 0, in_code == COMPARE); i, 1, 0, in_code == COMPARE);
if (new_rtx) /* If we narrowed the mode when dropping the subreg, then we lose. */
{ if (GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (mode))
/* If we narrowed the mode when dropping the subreg, then new_rtx = NULL;
we must zero-extend to keep the semantics of the AND. */
if (GET_MODE_SIZE (inner_mode) >= GET_MODE_SIZE (mode))
;
else if (SCALAR_INT_MODE_P (inner_mode))
new_rtx = simplify_gen_unary (ZERO_EXTEND, mode,
new_rtx, inner_mode);
else
new_rtx = NULL;
}
/* If that didn't give anything, see if the AND simplifies on /* If that didn't give anything, see if the AND simplifies on
its own. */ its own. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment