On Fri, Mar 3, 2017 at 8:44 PM, Jakub Jelinek <ja...@redhat.com> wrote: > On Fri, Mar 03, 2017 at 12:18:09PM +0100, Uros Bizjak wrote: >> Yes. Although expander takes care not to generate two memory >> references, combine can propagate memory to the other operand, >> creating semi-invalid RTX that is later resolved by RA. > > Here is a patch which does that. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > 2017-03-03 Jakub Jelinek <ja...@redhat.com> > > * config/i386/sse.md (sse_storehps, sse_storelps, > avx_<castmode><avxsizesuffix>_<castmode>, > avx512f_<castmode><avxsizesuffix>_<castmode>, > avx512f_<castmode><avxsizesuffix>_256<castmode>): Require > in condition that at least one operand is not a MEM.
OK. Thanks, Uros. > --- gcc/config/i386/sse.md.jj 2017-03-03 17:08:53.000000000 +0100 > +++ gcc/config/i386/sse.md 2017-03-03 17:39:05.907871328 +0100 > @@ -6637,7 +6637,7 @@ (define_insn "sse_storehps" > (vec_select:V2SF > (match_operand:V4SF 1 "nonimmediate_operand" "v,v,o") > (parallel [(const_int 2) (const_int 3)])))] > - "TARGET_SSE" > + "TARGET_SSE && !(MEM_P (operands[0]) && MEM_P (operands[1]))" > "@ > %vmovhps\t{%1, %0|%q0, %1} > %vmovhlps\t{%1, %d0|%d0, %1} > @@ -6690,7 +6690,7 @@ (define_insn "sse_storelps" > (vec_select:V2SF > (match_operand:V4SF 1 "nonimmediate_operand" " v,v,m") > (parallel [(const_int 0) (const_int 1)])))] > - "TARGET_SSE" > + "TARGET_SSE && !(MEM_P (operands[0]) && MEM_P (operands[1]))" > "@ > %vmovlps\t{%1, %0|%q0, %1} > %vmovaps\t{%1, %0|%0, %1} > @@ -18661,7 +18661,7 @@ (define_insn_and_split "avx_<castmode><a > (unspec:AVX256MODE2P > [(match_operand:<ssehalfvecmode> 1 "nonimmediate_operand" "xm,x")] > UNSPEC_CAST))] > - "TARGET_AVX" > + "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))" > "#" > "&& reload_completed" > [(set (match_dup 0) (match_dup 1))] > @@ -19575,7 +19575,7 @@ (define_insn_and_split "avx512f_<castmod > (unspec:AVX512MODE2P > [(match_operand:<ssequartermode> 1 "nonimmediate_operand" "xm,x")] > UNSPEC_CAST))] > - "TARGET_AVX512F" > + "TARGET_AVX512F && !(MEM_P (operands[0]) && MEM_P (operands[1]))" > "#" > "&& reload_completed" > [(set (match_dup 0) (match_dup 1))] > @@ -19592,7 +19592,7 @@ (define_insn_and_split "avx512f_<castmod > (unspec:AVX512MODE2P > [(match_operand:<ssehalfvecmode> 1 "nonimmediate_operand" "xm,x")] > UNSPEC_CAST))] > - "TARGET_AVX512F" > + "TARGET_AVX512F && !(MEM_P (operands[0]) && MEM_P (operands[1]))" > "#" > "&& reload_completed" > [(set (match_dup 0) (match_dup 1))] > > > Jakub