[llvm] [GlobalISel] Add G_EXTRACT_VECTOR_ELT to computeNumSignBits (PR #218283)

Deepak Shirke via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 23 12:52:05 PDT 2026


https://github.com/deepakshirkem created https://github.com/llvm/llvm-project/pull/218283

Port the SDAG EXTRACT_VECTOR_ELT computeNumSignBits handling to GlobalISel. If the element index is known, demand only that element from the source vector. If unknown, conservatively demand all elements.

Part of #150515.

>From b1c35444100c352a008b1414d96b8a4a23b73d21 Mon Sep 17 00:00:00 2001
From: deepakshirkem <deepakshirke509 at gmail.com>
Date: Mon, 24 Aug 2026 01:20:42 +0530
Subject: [PATCH] [GlobalISel] Add G_EXTRACT_VECTOR_ELT to computeNumSignBits

Port the SDAG EXTRACT_VECTOR_ELT computeNumSignBits handling to GlobalISel.
If the element index is known, demand only that element from the source
vector. If unknown, conservatively demand all elements.
---
 .../CodeGen/GlobalISel/GISelValueTracking.cpp |  15 +++
 .../GlobalISel/knownbits-extract-vector.mir   | 105 ++++++++++++------
 2 files changed, 83 insertions(+), 37 deletions(-)

diff --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
index 0672cfffc6eac..1674c98f40ffa 100644
--- a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
@@ -2669,6 +2669,21 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
     }
     break;
   }
+  case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
+    GExtractVectorElement &Extract = cast<GExtractVectorElement>(MI);
+    Register InVec = Extract.getVectorReg();
+    Register EltNo = Extract.getIndexReg();
+    LLT VecVT = MRI.getType(InVec);
+    if (VecVT.isScalableVector())
+      break;
+    unsigned NumSrcElts = VecVT.getNumElements();
+    auto ConstEltNo = getIConstantVRegVal(EltNo, MRI);
+    APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
+    if (ConstEltNo && ConstEltNo->ult(NumSrcElts))
+      DemandedSrcElts =
+          APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
+    return computeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
+  }
   case TargetOpcode::G_EXTRACT_SUBVECTOR: {
     // Offset the demanded elts by the subvector index.
     Register SrcReg = MI.getOperand(1).getReg();
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-extract-vector.mir b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-extract-vector.mir
index 7ff593f18adc9..23084e288ac53 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-extract-vector.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-extract-vector.mir
@@ -6,11 +6,11 @@ name: all_knownbits_const_idx
 body: |
   bb.0:
   ; CHECK-LABEL: name: @all_knownbits_const_idx
-  ; CHECK-NEXT: %0:_ KnownBits:00000011 SignBits:6
-  ; CHECK-NEXT: %1:_ KnownBits:00001010 SignBits:4
-  ; CHECK-NEXT: %2:_ KnownBits:0000?01? SignBits:4
-  ; CHECK-NEXT: %idx:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000001 SignBits:63
-  ; CHECK-NEXT: %4:_ KnownBits:00001010 SignBits:4
+  ; CHECK-NEXT: %0:_ KnownBits:00000011 SignBits:6 IsKnownNeverZero:1
+  ; CHECK-NEXT: %1:_ KnownBits:00001010 SignBits:4 IsKnownNeverZero:1
+  ; CHECK-NEXT: %2:_ KnownBits:0000?01? SignBits:4 IsKnownNeverZero:1
+  ; CHECK-NEXT: %idx:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000001 SignBits:63 IsKnownNeverZero:1
+  ; CHECK-NEXT: %4:_ KnownBits:00001010 SignBits:4 IsKnownNeverZero:1
     %0:_(i8) = G_CONSTANT i8 3
     %1:_(i8) = G_CONSTANT i8 10
     %2:_(<2 x i8>) = G_BUILD_VECTOR %0, %1
@@ -22,11 +22,11 @@ name: all_knownbits
 body: |
   bb.0:
   ; CHECK-LABEL: name: @all_knownbits
-  ; CHECK-NEXT: %0:_ KnownBits:00000011 SignBits:6
-  ; CHECK-NEXT: %1:_ KnownBits:00001010 SignBits:4
-  ; CHECK-NEXT: %2:_ KnownBits:0000?01? SignBits:4
-  ; CHECK-NEXT: %idx:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1
-  ; CHECK-NEXT: %4:_ KnownBits:0000?01? SignBits:4
+  ; CHECK-NEXT: %0:_ KnownBits:00000011 SignBits:6 IsKnownNeverZero:1
+  ; CHECK-NEXT: %1:_ KnownBits:00001010 SignBits:4 IsKnownNeverZero:1
+  ; CHECK-NEXT: %2:_ KnownBits:0000?01? SignBits:4 IsKnownNeverZero:1
+  ; CHECK-NEXT: %idx:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %4:_ KnownBits:0000?01? SignBits:4 IsKnownNeverZero:1
     %0:_(i8) = G_CONSTANT i8 3
     %1:_(i8) = G_CONSTANT i8 10
     %2:_(<2 x i8>) = G_BUILD_VECTOR %0, %1
@@ -38,9 +38,9 @@ name: no_knownbits_const_idx
 body: |
   bb.0:
   ; CHECK-LABEL: name: @no_knownbits_const_idx
-  ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
-  ; CHECK-NEXT: %idx:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000001 SignBits:63
-  ; CHECK-NEXT: %2:_ KnownBits:???????? SignBits:1
+  ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %idx:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000001 SignBits:63 IsKnownNeverZero:1
+  ; CHECK-NEXT: %2:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
     %0:_(<2 x i8>) = COPY $h0
     %idx:_(i64) = G_CONSTANT i64 1
     %1:_(i8) = G_EXTRACT_VECTOR_ELT %0, %idx
@@ -50,9 +50,9 @@ name: no_knownbits
 body: |
   bb.0:
   ; CHECK-LABEL: name: @no_knownbits
-  ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
-  ; CHECK-NEXT: %idx:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1
-  ; CHECK-NEXT: %2:_ KnownBits:???????? SignBits:1
+  ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %idx:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %2:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
     %0:_(<2 x i8>) = COPY $h0
     %idx:_(i64) = COPY $d1
     %1:_(i8) = G_EXTRACT_VECTOR_ELT %0, %idx
@@ -62,10 +62,10 @@ name: zext_const_idx
 body: |
   bb.0:
   ; CHECK-LABEL: name: @zext_const_idx
-  ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
-  ; CHECK-NEXT: %zext0:_ KnownBits:00000000???????? SignBits:8
-  ; CHECK-NEXT: %idx:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000001 SignBits:63
-  ; CHECK-NEXT: %3:_ KnownBits:00000000???????? SignBits:8
+  ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %zext0:_ KnownBits:00000000???????? SignBits:8 IsKnownNeverZero:0
+  ; CHECK-NEXT: %idx:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000001 SignBits:63 IsKnownNeverZero:1
+  ; CHECK-NEXT: %3:_ KnownBits:00000000???????? SignBits:8 IsKnownNeverZero:0
     %0:_(<2 x i8>) = COPY $h0
     %zext0:_(<2 x i16>) = G_ZEXT %0
     %idx:_(i64) = G_CONSTANT i64 1
@@ -77,10 +77,10 @@ body: |
   bb.0:
 
   ; CHECK-LABEL: name: @zext
-  ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
-  ; CHECK-NEXT: %zext0:_ KnownBits:00000000???????? SignBits:8
-  ; CHECK-NEXT: %idx:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1
-  ; CHECK-NEXT: %3:_ KnownBits:00000000???????? SignBits:8
+  ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %zext0:_ KnownBits:00000000???????? SignBits:8 IsKnownNeverZero:0
+  ; CHECK-NEXT: %idx:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %3:_ KnownBits:00000000???????? SignBits:8 IsKnownNeverZero:0
     %0:_(<2 x i8>) = COPY $h0
     %zext0:_(<2 x i16>) = G_ZEXT %0
     %idx:_(i64) = COPY $d1
@@ -91,10 +91,10 @@ name: sext_const_idx
 body: |
   bb.0:
   ; CHECK-LABEL: name: @sext_const_idx
-  ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
-  ; CHECK-NEXT: %sext0:_ KnownBits:???????????????? SignBits:9
-  ; CHECK-NEXT: %idx:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000001 SignBits:63
-  ; CHECK-NEXT: %3:_ KnownBits:???????????????? SignBits:1
+  ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %sext0:_ KnownBits:???????????????? SignBits:9 IsKnownNeverZero:0
+  ; CHECK-NEXT: %idx:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000001 SignBits:63 IsKnownNeverZero:1
+  ; CHECK-NEXT: %3:_ KnownBits:???????????????? SignBits:9 IsKnownNeverZero:0
     %0:_(<2 x i8>) = COPY $h0
     %sext0:_(<2 x i16>) = G_SEXT %0
     %idx:_(i64) = G_CONSTANT i64 1
@@ -105,10 +105,10 @@ name: sext
 body: |
   bb.0:
   ; CHECK-LABEL: name: @sext
-  ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
-  ; CHECK-NEXT: %sext0:_ KnownBits:???????????????? SignBits:9
-  ; CHECK-NEXT: %idx:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1
-  ; CHECK-NEXT: %3:_ KnownBits:???????????????? SignBits:1
+  ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %sext0:_ KnownBits:???????????????? SignBits:9 IsKnownNeverZero:0
+  ; CHECK-NEXT: %idx:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %3:_ KnownBits:???????????????? SignBits:9 IsKnownNeverZero:0
     %0:_(<2 x i8>) = COPY $h0
     %sext0:_(<2 x i16>) = G_SEXT %0
     %idx:_(i64) = COPY $d1
@@ -121,13 +121,44 @@ name: bail_on_different_return_type
 body: |
   bb.0:
   ; CHECK-LABEL: name: @bail_on_different_return_type
-  ; CHECK-NEXT: %0:_ KnownBits:00000011 SignBits:6
-  ; CHECK-NEXT: %1:_ KnownBits:00001010 SignBits:4
-  ; CHECK-NEXT: %2:_ KnownBits:0000?01? SignBits:4
-  ; CHECK-NEXT: %idx:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000001 SignBits:63
-  ; CHECK-NEXT: %4:_ KnownBits:???????????????? SignBits:1
+  ; CHECK-NEXT: %0:_ KnownBits:00000011 SignBits:6 IsKnownNeverZero:1
+  ; CHECK-NEXT: %1:_ KnownBits:00001010 SignBits:4 IsKnownNeverZero:1
+  ; CHECK-NEXT: %2:_ KnownBits:0000?01? SignBits:4 IsKnownNeverZero:1
+  ; CHECK-NEXT: %idx:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000001 SignBits:63 IsKnownNeverZero:1
+  ; CHECK-NEXT: %4:_ KnownBits:???????????????? SignBits:4 IsKnownNeverZero:1
     %0:_(i8) = G_CONSTANT i8 3
     %1:_(i8) = G_CONSTANT i8 10
     %2:_(<2 x i8>) = G_BUILD_VECTOR %0, %1
     %idx:_(i64) = G_CONSTANT i64 1
     %3:_(i16) = G_EXTRACT_VECTOR_ELT %2, %idx
+---
+# computeNumSignBits: sign bits propagate through G_EXTRACT_VECTOR_ELT
+name: signbits_known_idx
+body: |
+  bb.0:
+    %0:_(i8) = COPY $b0
+    %1:_(i16) = G_SEXT %0
+    %2:_(i16) = COPY $h1
+    %3:_(<4 x i16>) = G_BUILD_VECTOR %1, %1, %2, %1
+    %4:_(i64) = G_CONSTANT i64 0
+    %5:_(i16) = G_EXTRACT_VECTOR_ELT %3, %4
+    %6:_(i64) = G_CONSTANT i64 2
+    %7:_(i16) = G_EXTRACT_VECTOR_ELT %3, %6
+...
+---
+# computeNumSignBits: unknown index demands all elements
+name: signbits_unknown_idx
+body: |
+  bb.0:
+  ; CHECK-LABEL: name: @signbits_unknown_idx
+  ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %1:_ KnownBits:???????????????? SignBits:9 IsKnownNeverZero:0
+  ; CHECK-NEXT: %2:_ KnownBits:???????????????? SignBits:9 IsKnownNeverZero:0
+  ; CHECK-NEXT: %3:_ KnownBits:???????????????????????????????????????????????????????????????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %4:_ KnownBits:???????????????? SignBits:9 IsKnownNeverZero:0
+    %0:_(i8) = COPY $b0
+    %1:_(i16) = G_SEXT %0
+    %2:_(<4 x i16>) = G_BUILD_VECTOR %1, %1, %1, %1
+    %3:_(i64) = COPY $x0
+    %4:_(i16) = G_EXTRACT_VECTOR_ELT %2, %3
+...



More information about the llvm-commits mailing list