Skip to content

Conversation

@RKSimon
Copy link
Collaborator

@RKSimon RKSimon commented Nov 19, 2025

This late into lowering we don't have a good way to handle constant build_vector lowering

Fixes #168594

…ant fold

This late into lowering we don't have a good way to handle constant build_vector lowering

Fixes llvm#168594
@llvmbot
Copy link
Member

llvmbot commented Nov 19, 2025

@llvm/pr-subscribers-backend-x86

Author: Simon Pilgrim (RKSimon)

Changes

This late into lowering we don't have a good way to handle constant build_vector lowering

Fixes #168594


Full diff: https://github.com/llvm/llvm-project/pull/168726.diff

2 Files Affected:

  • (modified) llvm/lib/Target/X86/X86ISelDAGToDAG.cpp (+2-1)
  • (added) llvm/test/CodeGen/X86/pr168594.ll (+22)
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
+}

@RKSimon RKSimon enabled auto-merge (squash) November 19, 2025 15:54
@RKSimon RKSimon merged commit 9c2bbfe into llvm:main Nov 19, 2025
11 of 12 checks passed
@RKSimon RKSimon deleted the x86-iseldag-addsub-constant branch November 19, 2025 16:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[X86] llc crashed at -O0/O1/O2/O3: Cannot select: t20: v8i16 = BUILD_VECTOR

2 participants