Yet more fallout from my float->int changes. This time the failure is during sched1, where we try to constrain_operands to figure out what the sched parameters are for the insn. Except that since this is before register allocation, where we are going to force the operand to memory, there were no alternatives that match.
This seems a bit of a hacky solution, keeping the register alternative enabled until we get to register allocation, but it's restricted in scope to the i386 backend and thus gets extra points at this stage. Another possibility is to have constrain_alternatives randomly pick an alternative, assuming the register allocator will DTRT or barf later. Thoughts? r~
PR target/60704 * config/i386/i386.md (*float<SWI48><MODEF>2_sse): Leave the second alternative enabled before register allocation. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index ca16173..25e2e93 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -4739,8 +4739,13 @@ && X87_ENABLE_FLOAT (<MODEF:MODE>mode, <SWI48:MODE>mode)") (eq_attr "alternative" "1") + /* ??? For sched1 we need constrain_operands to be able to + select an alternative. Leave this enabled before RA. */ (symbol_ref "TARGET_INTER_UNIT_CONVERSIONS - || optimize_function_for_size_p (cfun)") + || optimize_function_for_size_p (cfun) + || !(reload_completed + || reload_in_progress + || lra_in_progress)") ] (symbol_ref "true"))) ])