[llvm] d78f85e - [GlobalISel] Fix getShuffleDemandedElts input lanes in computeKnownFPClass (#192288)

via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 16 06:33:01 PDT 2026


Author: David Green
Date: 2026-04-16T14:32:55+01:00
New Revision: d78f85e46adca8a29765584e6ed8438058c18003

URL: https://github.com/llvm/llvm-project/commit/d78f85e46adca8a29765584e6ed8438058c18003
DIFF: https://github.com/llvm/llvm-project/commit/d78f85e46adca8a29765584e6ed8438058c18003.diff

LOG: [GlobalISel] Fix getShuffleDemandedElts input lanes in computeKnownFPClass (#192288)

The number of lanes needs to be for the input type, not the return, as
they can be different in GISel. This prevents an assert about invalid
shuffle mask constant from getShuffleDemandedElts.

Added: 
    llvm/test/CodeGen/AArch64/GlobalISel/knownfpclass.ll

Modified: 
    llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
index ef85b4135a0e3..32b533d93fb31 100644
--- a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
@@ -1802,9 +1802,9 @@ void GISelValueTracking::computeKnownFPClass(Register R,
       assert(DemandedElts == APInt(1, 1));
       DemandedLHS = DemandedRHS = DemandedElts;
     } else {
-      if (!llvm::getShuffleDemandedElts(DstTy.getNumElements(), Shuf.getMask(),
-                                        DemandedElts, DemandedLHS,
-                                        DemandedRHS)) {
+      unsigned NumElts = MRI.getType(Shuf.getSrc1Reg()).getNumElements();
+      if (!llvm::getShuffleDemandedElts(NumElts, Shuf.getMask(), DemandedElts,
+                                        DemandedLHS, DemandedRHS)) {
         Known.resetAll();
         return;
       }

diff  --git a/llvm/test/CodeGen/AArch64/GlobalISel/knownfpclass.ll b/llvm/test/CodeGen/AArch64/GlobalISel/knownfpclass.ll
new file mode 100644
index 0000000000000..7b4c6558de52f
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/knownfpclass.ll
@@ -0,0 +1,23 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple aarch64 -global-isel -o - %s | FileCheck %s
+
+define <4 x double> @knownfpclass_shuffle(<16 x double> %a) {
+; CHECK-LABEL: knownfpclass_shuffle:
+; CHECK:       // %bb.0: // %entry
+; CHECK-NEXT:    mov d0, v1.d[1]
+; CHECK-NEXT:    mov d1, v5.d[1]
+; CHECK-NEXT:    movi v2.2d, #0000000000000000
+; CHECK-NEXT:    mov v0.d[1], v3.d[1]
+; CHECK-NEXT:    mov v1.d[1], v7.d[1]
+; CHECK-NEXT:    fmov v3.2d, #1.00000000
+; CHECK-NEXT:    fcmlt v0.2d, v0.2d, #0.0
+; CHECK-NEXT:    fcmlt v1.2d, v1.2d, #0.0
+; CHECK-NEXT:    bsl v0.16b, v2.16b, v3.16b
+; CHECK-NEXT:    bsl v1.16b, v2.16b, v3.16b
+; CHECK-NEXT:    ret
+entry:
+  %0 = shufflevector <16 x double> %a, <16 x double> zeroinitializer, <4 x i32> <i32 3, i32 7, i32 11, i32 15>
+  %1 = fcmp olt <4 x double> %0, zeroinitializer
+  %2 = select <4 x i1> %1, <4 x double> zeroinitializer, <4 x double> splat (double 1.000000e+00)
+  ret <4 x double> %2
+}


        


More information about the llvm-commits mailing list