https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103938
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- ira-costs.c record_operand_costs is stripping off the SUBREG. Is that even valid thing to do? for (i = 0; i < recog_data.n_operands; i++) { rtx op_mem = extract_mem_from_operand (recog_data.operand[i]); memcpy (op_costs[i], init_cost, struct_costs_size); if (GET_CODE (recog_data.operand[i]) == SUBREG) recog_data.operand[i] = SUBREG_REG (recog_data.operand[i]); Here is the instruction which is causing the ICE and is valid with the subreg there: (insn 7 6 0 2 (prefetch (subreg:DI (reg:V2DI 96) 0) (const_int 0 [0]) (const_int 3 [0x3])) "t.c":4:3 26 {prefetch} (expr_list:REG_DEAD (reg:V2DI 96) (nil))) I have to wonder if the stripping off the subreg is valid or not.