https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118594
--- Comment #8 from Richard Sandiford <rsandifo at gcc dot gnu.org> ---
I was going to say that force_subreg should call force_operand:
diff --git a/gcc/explow.cc b/gcc/explow.cc
index 7799a98053b..3f378174268 100644
--- a/gcc/explow.cc
+++ b/gcc/explow.cc
@@ -759,7 +759,9 @@ force_subreg (machine_mode outermode, rtx op,
auto *start = get_last_insn ();
op = copy_to_mode_reg (innermode, op);
rtx res = simplify_gen_subreg (outermode, op, innermode, byte);
- if (!res)
+ if (res)
+ res = force_operand (res, NULL_RTX);
+ else
delete_insns_since (start);
return res;
}
But that doesn't work because force_operand considers the subreg to be valid
(and general_operand agrees). So if this isn't a regression, it might be
better to wait until GCC 16 and disallow all (subreg (mem)) for
INSN_SCHEDULING. (Or completely, if possible.)