https://gcc.gnu.org/g:59d8f303ece06543266679adba1e31471ae6b429
commit r16-9027-g59d8f303ece06543266679adba1e31471ae6b429 Author: Hongyu Wang <[email protected]> Date: Tue May 26 07:59:04 2026 +0530 i386: Disable SETcc.ZU generation on DMR/NVL via tune flag Microbenchmark performance on NovaLake/DiamondRapids shows no benefit from SETcc.ZU encoding on these cores. Add X86_TUNE_DISABLE_SETZUCC to suppress setzucc generation for DMR/NVL while keeping it enabled for other APX-capable targets. gcc/ChangeLog: * config/i386/x86-tune.def (X86_TUNE_DISABLE_SETZUCC): New. Enable for m_DIAMONDRAPIDS | m_NOVALAKE. * config/i386/i386.h (TARGET_DISABLE_SETZUCC): New define. * config/i386/i386.md (*setcc_<mode>_zu): Guard with TARGET_APX_ZU && !TARGET_DISABLE_SETZUCC. (*setcc_di_1, *setcc_<mode>_1_movzbl): Guard with (!TARGET_APX_ZU || TARGET_DISABLE_SETZUCC). (*setcc_qi, *setcc_qi_slp): Emit setzucc only when TARGET_APX_ZU && !TARGET_DISABLE_SETZUCC. gcc/testsuite/ChangeLog: * gcc.target/i386/apx-zu-4.c: New test. (cherry picked from commit 8ff497c904bb363e52d57c108eba2675d1bcde14) Diff: --- gcc/config/i386/i386.h | 3 ++- gcc/config/i386/i386.md | 12 +++++++----- gcc/config/i386/x86-tune.def | 4 ++++ gcc/testsuite/gcc.target/i386/apx-zu-4.c | 5 +++++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 888edfed88f0..d515505a21a5 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -512,7 +512,8 @@ extern unsigned char ix86_tune_features[X86_TUNE_LAST]; ix86_tune_features[X86_TUNE_ALIGN_TIGHT_LOOPS] #define TARGET_SSE_REDUCTION_PREFER_PSHUF \ ix86_tune_features[X86_TUNE_SSE_REDUCTION_PREFER_PSHUF] - +#define TARGET_DISABLE_SETZUCC \ + ix86_tune_features[X86_TUNE_DISABLE_SETZUCC] /* Feature tests against the various architecture variations. */ enum ix86_arch_indices { diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index cea79cd24465..e446e02eb3c1 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -19831,7 +19831,7 @@ [(set (match_operand:SWI248 0 "register_operand" "=r") (match_operator:SWI248 1 "ix86_comparison_operator" [(reg FLAGS_REG) (const_int 0)]))] - "TARGET_APX_ZU" + "TARGET_APX_ZU && !TARGET_DISABLE_SETZUCC" "setzu%C1\t%b0" [(set_attr "type" "setcc")]) @@ -19839,7 +19839,8 @@ [(set (match_operand:DI 0 "register_operand" "=q") (match_operator:DI 1 "ix86_comparison_operator" [(reg FLAGS_REG) (const_int 0)]))] - "!TARGET_APX_ZU && TARGET_64BIT && !TARGET_PARTIAL_REG_STALL" + "(!TARGET_APX_ZU || TARGET_DISABLE_SETZUCC) + && TARGET_64BIT && !TARGET_PARTIAL_REG_STALL" "#" "&& reload_completed" [(set (match_dup 2) (match_dup 1)) @@ -19872,7 +19873,7 @@ [(set (match_operand:SWI24 0 "register_operand" "=q") (match_operator:SWI24 1 "ix86_comparison_operator" [(reg FLAGS_REG) (const_int 0)]))] - "!TARGET_APX_ZU && !TARGET_PARTIAL_REG_STALL + "(!TARGET_APX_ZU || TARGET_DISABLE_SETZUCC) && !TARGET_PARTIAL_REG_STALL && (!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun))" "#" "&& reload_completed" @@ -19891,7 +19892,8 @@ "" { if (REG_P (operands[0]) - && TARGET_APX_ZU) + && TARGET_APX_ZU + && !TARGET_DISABLE_SETZUCC) return "setzu%C1\t%0"; else return "set%C1\t%0"; @@ -19905,7 +19907,7 @@ [(reg FLAGS_REG) (const_int 0)]))] "" { - if (TARGET_APX_ZU) + if (TARGET_APX_ZU && !TARGET_DISABLE_SETZUCC) return "setzu%C1\t%0"; else return "set%C1\t%0"; diff --git a/gcc/config/i386/x86-tune.def b/gcc/config/i386/x86-tune.def index 3b74091db351..9c1e586bc023 100644 --- a/gcc/config/i386/x86-tune.def +++ b/gcc/config/i386/x86-tune.def @@ -399,6 +399,10 @@ DEF_TUNE (X86_TUNE_AVOID_MFENCE, "avoid_mfence", DEF_TUNE (X86_TUNE_EXPAND_ABS, "expand_abs", m_CORE_ALL | m_SILVERMONT | m_GOLDMONT | m_GOLDMONT_PLUS | m_ZHAOXIN) +/* X86_TUNE_DISABLE_SETZUCC: Disable SETcc with ZU suffix. */ +DEF_TUNE (X86_TUNE_DISABLE_SETZUCC, "disable_setzucc", + m_DIAMONDRAPIDS | m_NOVALAKE) + /*****************************************************************************/ /* 387 instruction selection tuning */ /*****************************************************************************/ diff --git a/gcc/testsuite/gcc.target/i386/apx-zu-4.c b/gcc/testsuite/gcc.target/i386/apx-zu-4.c new file mode 100644 index 000000000000..0c8625792a99 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/apx-zu-4.c @@ -0,0 +1,5 @@ +/* { dg-do compile { target { ! ia32 } } } */ +/* { dg-options "-mapxf -march=x86-64 -O2 -mtune-ctrl=disable_setzucc" } */ +/* { dg-final { scan-assembler-not "setzu" } } */ + +#include "apx-zu-3.c"
