https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112943

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |crazylht at gmail dot com,
                   |                            |jakub at gcc dot gnu.org
           Priority|P3                          |P1
            Summary|ICE: in gen_reg_rtx, at     |[14 Regression] ICE: in
                   |emit-rtl.cc:1176 with -O2   |gen_reg_rtx, at
                   |-march=westmere -mapxf      |emit-rtl.cc:1176 with -O2
                   |                            |-march=westmere -mapxf
   Target Milestone|---                         |14.0

--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Why does ix86_expand_binary_operator have the use_ndd argument at all? 
Shouldn't it always act as if the argument is TARGET_APX_NDD?
Or, any particular reason why it isn't done in ashl<mode>3 (but in other
shifts/rotates)?
The ICE is because the
14500         if (!op_equal_p && !TARGET_APX_NDD)
14501           emit_move_insn (operands[3], operands[1]);
14502         rtx op_tmp = TARGET_APX_NDD ? operands[1] : operands[3];
14503         emit_insn (gen_ashl<mode>3 (operands[3], op_tmp, GEN_INT
(bits)));
splitter uses gen_ashl<mode>3 expander post-reload, and due to
ix86_expand_binary_operator not being called with TARGET_APX_NDD, it attempts
to force the MEM operand into a REG, which needs a pseudo.
*ashl<mode>3_1 pattern certainly uses TARGET_APX_NDD in the
ix86_binary_operator_ok call.

Reply via email to