https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100263
--- Comment #9 from Stefan Schulze Frielinghaus <stefansf at linux dot ibm.com> --- Shouldn't we rather check for REG_CAN_CHANGE_MODE_P? A check for TARGET_HARD_REGNO_MODE_OK for a FP register and QImode is successful. Using the following also fixes the test for me: diff --git a/gcc/postreload.c b/gcc/postreload.c index dc67643384d..3dccbe63cf4 100644 --- a/gcc/postreload.c +++ b/gcc/postreload.c @@ -1733,7 +1733,7 @@ move2add_valid_value_p (int regno, scalar_int_mode mode) regno of the lowpart might be different. */ poly_int64 s_off = subreg_lowpart_offset (mode, old_mode); s_off = subreg_regno_offset (regno, old_mode, s_off, mode); - if (maybe_ne (s_off, 0)) + if (maybe_ne (s_off, 0) || !REG_CAN_CHANGE_MODE_P (regno, old_mode, mode)) /* We could in principle adjust regno, check reg_mode[regno] to be BLKmode, and return s_off to the caller (vs. -1 for failure), but we currently have no callers that could make use of this