[llvm] [PowerPC] Fix handling of undefs in the PPC::isSplatShuffleMask query (PR #145149)

Wael Yehia via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 23 10:20:03 PDT 2025


https://github.com/w2yehia updated https://github.com/llvm/llvm-project/pull/145149

>From 93ac69f1b48f653e7620f3d179df62a844053edd Mon Sep 17 00:00:00 2001
From: Wael Yehia <wyehia at ca.ibm.com>
Date: Sat, 21 Jun 2025 01:31:53 +0000
Subject: [PATCH 1/3] fix

---
 llvm/lib/Target/PowerPC/PPCISelLowering.cpp |  9 +++++++--
 llvm/test/CodeGen/PowerPC/pr141642.ll       | 13 +++++++++++++
 2 files changed, 20 insertions(+), 2 deletions(-)
 create mode 100644 llvm/test/CodeGen/PowerPC/pr141642.ll

diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index 421a808de667a..2fcb68c4a305c 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -2242,8 +2242,13 @@ bool PPC::isSplatShuffleMask(ShuffleVectorSDNode *N, unsigned EltSize) {
       return false;
 
   for (unsigned i = EltSize, e = 16; i != e; i += EltSize) {
-    if (N->getMaskElt(i) < 0) continue;
-    for (unsigned j = 0; j != EltSize; ++j)
+    // An UNDEF element is a sequence of UNDEF bits.
+    if (N->getMaskElt(i) < 0) {
+      for (unsigned j = 1; j != EltSize; ++j)
+        if (N->getMaskElt(i+j) >= 0)
+          return false;
+    }
+    else for (unsigned j = 0; j != EltSize; ++j)
       if (N->getMaskElt(i+j) != N->getMaskElt(j))
         return false;
   }
diff --git a/llvm/test/CodeGen/PowerPC/pr141642.ll b/llvm/test/CodeGen/PowerPC/pr141642.ll
new file mode 100644
index 0000000000000..38a7065747867
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/pr141642.ll
@@ -0,0 +1,13 @@
+; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu -O0 -debug-only=selectiondag -o - < %s 2>&1 | \
+; RUN:  FileCheck %s
+; CHECK-NOT: lxvdsx
+; CHECK-NOT: LD_SPLAT
+
+define weak_odr dso_local void @unpack(ptr noalias noundef %packed_in) local_unnamed_addr {
+entry:
+  %ld = load <2 x i32>, ptr %packed_in, align 2
+  %shuf = shufflevector <2 x i32> %ld, <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 0>
+  %ie = insertelement <4 x i32> %shuf, i32 7, i32 2
+  store <4 x i32> %shuf, ptr %packed_in, align 2
+  ret void
+}

>From 33c672fe37ec6398ae43f365725b471e5d56fa31 Mon Sep 17 00:00:00 2001
From: Wael Yehia <wyehia at ca.ibm.com>
Date: Mon, 23 Jun 2025 14:53:10 +0000
Subject: [PATCH 2/3] clang-formay

---
 llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index 2fcb68c4a305c..cd2019dd836f7 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -2245,12 +2245,12 @@ bool PPC::isSplatShuffleMask(ShuffleVectorSDNode *N, unsigned EltSize) {
     // An UNDEF element is a sequence of UNDEF bits.
     if (N->getMaskElt(i) < 0) {
       for (unsigned j = 1; j != EltSize; ++j)
-        if (N->getMaskElt(i+j) >= 0)
+        if (N->getMaskElt(i + j) >= 0)
+          return false;
+    } else
+      for (unsigned j = 0; j != EltSize; ++j)
+        if (N->getMaskElt(i + j) != N->getMaskElt(j))
           return false;
-    }
-    else for (unsigned j = 0; j != EltSize; ++j)
-      if (N->getMaskElt(i+j) != N->getMaskElt(j))
-        return false;
   }
   return true;
 }

>From 1e77013683a1417cf85b9387a8acfd0a875554f9 Mon Sep 17 00:00:00 2001
From: Wael Yehia <wyehia at ca.ibm.com>
Date: Mon, 23 Jun 2025 17:22:37 +0000
Subject: [PATCH 3/3] address code review

---
 llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index cd2019dd836f7..88c6fe632d266 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -2242,7 +2242,7 @@ bool PPC::isSplatShuffleMask(ShuffleVectorSDNode *N, unsigned EltSize) {
       return false;
 
   for (unsigned i = EltSize, e = 16; i != e; i += EltSize) {
-    // An UNDEF element is a sequence of UNDEF bits.
+    // An UNDEF element is a sequence of UNDEF bytes.
     if (N->getMaskElt(i) < 0) {
       for (unsigned j = 1; j != EltSize; ++j)
         if (N->getMaskElt(i + j) >= 0)



More information about the llvm-commits mailing list