diff mbox

Add " && !(MEM_P (operands[0]) && MEM_P (operands[1]))" to condition of some sse.md instructions

Message ID 20170303194420.GH1849@tucnak
State New
Headers show

Commit Message

Jakub Jelinek March 3, 2017, 7:44 p.m. UTC
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  <jakub@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.



	Jakub

Comments

Uros Bizjak March 4, 2017, 8:55 a.m. UTC | #1
On Fri, Mar 3, 2017 at 8:44 PM, Jakub Jelinek <jakub@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  <jakub@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
diff mbox

Patch

--- 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))]