aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/combine.c15
2 files changed, 9 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4de6391..96c0e35 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+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>
PR rtl-optimization/81423
diff --git a/gcc/combine.c b/gcc/combine.c
index c1eec91..8dc62b5 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -7956,18 +7956,9 @@ make_compound_operation_int (machine_mode mode, rtx *x_ptr,
XEXP (inner_x0, 1),
i, 1, 0, in_code == COMPARE);
- if (new_rtx)
- {
- /* If we narrowed the mode when dropping the subreg, then
- 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 we narrowed the mode when dropping the subreg, then we lose. */
+ if (GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (mode))
+ new_rtx = NULL;
/* If that didn't give anything, see if the AND simplifies on
its own. */