From cf77b7486eaa5b56ed74fa08d2ca80dc79acf258 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Wed, 19 Nov 2025 15:45:10 +0000 Subject: [PATCH] [X86] X86ISelDAGToDAG - don't let ADD/SUB(X,1) -> SUB/ADD(X,-1) constant fold This late into lowering we don't have a good way to handle constant build_vector lowering Fixes #168594 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp | 3 ++- llvm/test/CodeGen/X86/pr168594.ll | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 llvm/test/CodeGen/X86/pr168594.ll diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp index 6c16fcfb282e8..2b5a63aa66926 100644 --- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -1004,7 +1004,8 @@ void X86DAGToDAGISel::PreprocessISelDAG() { if ((N->getOpcode() == ISD::ADD || N->getOpcode() == ISD::SUB) && N->getSimpleValueType(0).isVector() && !mayPreventLoadFold()) { APInt SplatVal; - if (X86::isConstantSplat(N->getOperand(1), SplatVal) && + if (!ISD::isBuildVectorOfConstantSDNodes(N->getOperand(0).getNode()) && + X86::isConstantSplat(N->getOperand(1), SplatVal) && SplatVal.isOne()) { SDLoc DL(N); diff --git a/llvm/test/CodeGen/X86/pr168594.ll b/llvm/test/CodeGen/X86/pr168594.ll new file mode 100644 index 0000000000000..76bb13223d49c --- /dev/null +++ b/llvm/test/CodeGen/X86/pr168594.ll @@ -0,0 +1,22 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64 | FileCheck %s --check-prefixes=SSE +; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=SSE +; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=AVX +; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=AVX + +define <8 x i16> @PR168594() { +; SSE-LABEL: PR168594: +; SSE: # %bb.0: +; SSE-NEXT: pxor %xmm0, %xmm0 +; SSE-NEXT: psubw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; SSE-NEXT: retq +; +; AVX-LABEL: PR168594: +; AVX: # %bb.0: +; AVX-NEXT: vpxor %xmm0, %xmm0, %xmm0 +; AVX-NEXT: vpsubw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 +; AVX-NEXT: retq + %call = call <8 x i16> @llvm.x86.sse2.pavg.w(<8 x i16> splat (i16 1), <8 x i16> zeroinitializer) + %sub = sub <8 x i16> zeroinitializer, %call + ret <8 x i16> %sub +}