https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91720
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I think this has been introduced in PR59461 change and is contrary to what is
documented:
"The high-order bits of rvalues are defined in the following circumstances:
@itemize
@item @code{subreg}s of @code{mem}
When @var{m2} is smaller than a word, the macro @code{LOAD_EXTEND_OP},
can control how the high-order bits are defined.
@item @code{subreg} of @code{reg}s
The upper bits are defined when @code{SUBREG_PROMOTED_VAR_P} is true.
@code{SUBREG_PROMOTED_UNSIGNED_P} describes what the upper bits hold.
Such subregs usually represent local variables, register variables
and parameter pseudo variables that have been promoted to a wider mode."
That change added the && !REG_P in there, but unless the reg is loaded from
memory, it is unclear how it can guarantee that the upper bits are zero (resp.
sign) extended after arbitrary operations.