Don't allow 2 volatile memory references in *<avx512>_cmp<mode>3_dup_op
so that gcc.target/i386/avx2-vpcmpeqq-1.c will generate 2 loads when
-march=cascadelake is used.

PR target/122343
* config/i386/sse.md (*<avx512>_cmp<mode>3_dup_op): Don't allow
2 volatile memory references.


-- 
H.J.
From 858c0e212162c832cdb3e6c2b56a76df03a5795b Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <[email protected]>
Date: Mon, 8 Dec 2025 13:29:59 +0800
Subject: [PATCH] x86: Don't allow 2 volatile memory references

Don't allow 2 volatile memory references in *<avx512>_cmp<mode>3_dup_op
so that gcc.target/i386/avx2-vpcmpeqq-1.c will generate 2 loads when
-march=cascadelake is used.

	PR target/122343
	* config/i386/sse.md (*<avx512>_cmp<mode>3_dup_op): Don't allow
	2 volatile memory references.

Signed-off-by: H.J. Lu <[email protected]>
---
 gcc/config/i386/sse.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 0be898c789e..fb79b2e67df 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -4900,7 +4900,8 @@ (define_insn_and_split "*<avx512>_cmp<mode>3_dup_op"
 	   (match_operand:SI 3 "<cmp_imm_predicate>")]
 	  UNSPEC_PCMP_ITER))]
   "TARGET_AVX512F && ix86_pre_reload_split ()
-   && rtx_equal_p (operands[1], operands[2])"
+   && rtx_equal_p (operands[1], operands[2])
+   && (!MEM_P (operands[1]) || !MEM_VOLATILE_P (operands[1]))"
   "#"
   "&& 1"
   [(set (match_dup 0) (match_dup 4))]
-- 
2.52.0

Reply via email to