[llvm] [X86] X86ISelDAGToDAG - don't let ADD/SUB(X,1) -> SUB/ADD(X,-1) constant fold (PR #168726)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 19 07:47:45 PST 2025
https://github.com/RKSimon created https://github.com/llvm/llvm-project/pull/168726
This late into lowering we don't have a good way to handle constant build_vector lowering
Fixes #168594
>From cf77b7486eaa5b56ed74fa08d2ca80dc79acf258 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
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
+}
More information about the llvm-commits
mailing list