Hi! The huge LTO testcase in the PR ICEs, because in a function where optimize_function_for_speed_p (cfun) and when targetting -march=i686 optab_handler (movstrict_optab, E_QImode) is CODE_FOR_movstrictqi, but when the *movstrictqi instruction is being matched during vregs pass, the condition: !TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun) FAILs. I haven't been able to construct a small testcase that reproduces that, but in the PR is another one which reproduces the opposite, where optab_handler (movstrict_optab, E_QImode) is CODE_FOR_nothing in function where optimize_function_for_size_p (cfun) is true and thus we unnecessarily create larger code.
From the debugging, seems nothing guarantees that functions with different optimize_function_for_{size,speed}_p (cfun) will use different this_fn_optabs in which init_all_optabs records which patterns are disabled and which are enabled. The documentation says: @cindex named patterns and conditions For a named pattern, the condition may not depend on the data in the insn being matched, but only the target-machine-type flags. The compiler needs to test these conditions during initialization in order to learn exactly which named instructions are available in a particular run. and while the condition of movstrict<mode> doesn't depend on the data in the instruction, optimize_function_for_*_p (cfun) is not target-machine-type flags only either. Furthermore, seems movstrict<mode> is the only named pattern (one with optab, as verified by preprocessing insn-opinit.c) which does something like that. Fortunately, the only user of the corresponding optab does allow the expander to FAIL and even the pattern itself has a FAIL; already, so this patch just moves the condition into the body as a condition to FAIL. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2019-12-05 Jakub Jelinek <ja...@redhat.com> PR target/92791 * config/i386/i386.md (movstrict<mode>): Move test for TARGET_PARTIAL_REG_STALL and not optimizing for size from expander's condition to the body - FAIL; in that case. --- gcc/config/i386/i386.md.jj 2019-12-03 09:22:17.421777187 +0100 +++ gcc/config/i386/i386.md 2019-12-04 16:35:34.193669660 +0100 @@ -2801,10 +2801,11 @@ (define_peephole2 (define_expand "movstrict<mode>" [(set (strict_low_part (match_operand:SWI12 0 "register_operand")) (match_operand:SWI12 1 "general_operand"))] - "!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun)" + "" { gcc_assert (SUBREG_P (operands[0])); - if (GET_MODE_CLASS (GET_MODE (SUBREG_REG (operands[0]))) != MODE_INT) + if ((TARGET_PARTIAL_REG_STALL && optimize_function_for_speed_p (cfun)) + || GET_MODE_CLASS (GET_MODE (SUBREG_REG (operands[0]))) != MODE_INT) FAIL; }) Jakub