https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107743
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- Is that with release checking? The code around this is /* Extraction of a full MODE1 value can be done with a subreg as long as the least significant bit of the value is the least significant bit of either OP0 or a word of OP0. */ if (!MEM_P (op0) && !reverse && op0_mode.exists (&imode)) { rtx sub = extract_bit_field_as_subreg (mode1, op0, imode, bitsize, bitnum); if (sub) return convert_extracted_bit_field (sub, mode, tmode, unsignedp); } where template<typename T> template<typename U> inline bool opt_mode<T>::exists (U *mode) const { if (m_mode != E_VOIDmode) { *mode = T (typename mode_traits<T>::from_int (m_mode)); return true; } return false; } so it's unobvious how 'imode' is uninitialized.