This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Add " && !(MEM_P (operands[0]) && MEM_P (operands[1]))" to condition of some sse.md instructions
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.
--- 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