On Sat, Feb 09, 2019 at 01:22:30PM +0100, Jakub Jelinek wrote: > On Sat, Feb 09, 2019 at 04:11:43AM -0800, H.J. Lu wrote: > > I believe all usages of > > > > (ior (match_operand 0 "ext_sse_reg_operand") > > (match_operand 1 "ext_sse_reg_operand")) > > > > should be checked. I am not sure if they should be there at all. > > E.g. in i386.md all the other spots look fine, because {DI,SI,DF,SF}mode > is allowed in ext sse regs even with -mavx512f. And sse.md doesn't use this > at all. What I'm wondering is if we need the sse.md (*mov<mode>_internal) > code I've cited earlier, doing bootstrap/regtest now with gcc_unreachable in > there (and in *mov{o,x}i_internal* for MODE_XI too) too see if it ever > triggers.
The following didn't ICE on anything, which is not a proof, but given that hard_regno_mode_ok should return false for ext_sse_reg_operand regs for avx512f && !avx512vl, it matches my expectations, on the other hand, it was a normal defaults bootstrap, don't have a knl which might be best for this to test -mavx512f -mno-avx512vl on everything. So perhaps we can also nuke the large if from mov<mode>_internal. --- gcc/config/i386/i386.md.jj 2019-02-09 12:35:57.971475641 +0100 +++ gcc/config/i386/i386.md 2019-02-09 12:37:40.776802962 +0100 @@ -1905,6 +1905,7 @@ (define_insn "*movoi_internal_avx" return standard_sse_constant_opcode (insn, operands); case TYPE_SSEMOV: + gcc_assert (get_attr_mode (insn) != MODE_XI); if (misaligned_operand (operands[0], OImode) || misaligned_operand (operands[1], OImode)) { @@ -1970,6 +1971,7 @@ (define_insn "*movti_internal" case TYPE_SSEMOV: /* TDmode values are passed as TImode on the stack. Moving them to stack may result in unaligned memory access. */ + gcc_assert (get_attr_mode (insn) != MODE_XI); if (misaligned_operand (operands[0], TImode) || misaligned_operand (operands[1], TImode)) { --- gcc/config/i386/sse.md.jj 2019-01-28 21:57:39.301110220 +0100 +++ gcc/config/i386/sse.md 2019-02-09 12:36:45.863696416 +0100 @@ -989,6 +989,7 @@ (define_insn "mov<mode>_internal" && (EXT_REX_SSE_REG_P (operands[0]) || EXT_REX_SSE_REG_P (operands[1]))) { + gcc_unreachable (); if (memory_operand (operands[0], <MODE>mode)) { if (<MODE_SIZE> == 32) Jakub