[llvm] [GlobalISel] Add G_INSERT_VECTOR_ELT to computeNumSignBits (PR #213480)

Joel Walker via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 16 11:19:19 PDT 2026


================
@@ -2583,6 +2584,64 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
       return NumSrcSignBits - (NumSrcBits - TyBits);
     break;
   }
+  case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
+    GExtractVectorElement &Extract = cast<GExtractVectorElement>(MI);
+    Register InVec = Extract.getVectorReg();
+    LLT VecVT = MRI.getType(InVec);
+    // computeNumSignBits not yet implemented for scalable vectors.
+    if (VecVT.isScalableVector())
+      break;
+
+    // If the result is wider than the element type the value is extended, and
+    // we know nothing about the extended bits.
+    const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
+    if (TyBits != EltBitWidth)
+      break;
+
+    // If we know the element index, just demand that vector element, else for
+    // an unknown element index, ignore DemandedElts and demand them all.
+    const unsigned NumSrcElts = VecVT.getNumElements();
+    APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
+    auto ConstEltNo = getIConstantVRegVal(Extract.getIndexReg(), MRI);
+    if (ConstEltNo && ConstEltNo->ult(NumSrcElts))
+      DemandedSrcElts =
+          APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
+
+    return computeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
+  }
+  case TargetOpcode::G_INSERT_VECTOR_ELT: {
+    GInsertVectorElement &Insert = cast<GInsertVectorElement>(MI);
+    Register InVec = Insert.getVectorReg();
+    Register InVal = Insert.getElementReg();
+    LLT VecVT = MRI.getType(InVec);
+    if (VecVT.isScalableVector())
+      break;
+
+    // If we know the element index, split the demand between the inserted
+    // value and the source vector, otherwise assume we need both.
+    const unsigned NumElts = VecVT.getNumElements();
+    bool DemandedVal = true;
+    APInt DemandedVecElts = DemandedElts;
+    auto ConstEltNo = getIConstantVRegVal(Insert.getIndexReg(), MRI);
+    if (ConstEltNo && ConstEltNo->ult(NumElts)) {
+      unsigned EltIdx = ConstEltNo->getZExtValue();
+      DemandedVal = !!DemandedElts[EltIdx];
+      DemandedVecElts.clearBit(EltIdx);
+    }
+
+    unsigned Tmp = std::numeric_limits<unsigned>::max();
+    if (DemandedVal) {
+      // TODO: Handle implicit truncation of inserted elements.
+      if (MRI.getType(InVal).getSizeInBits() != TyBits)
+        break;
+      Tmp = std::min(Tmp, computeNumSignBits(InVal, APInt(1, 1), Depth + 1));
+    }
+    if (!!DemandedVecElts)
----------------
Joel-Wwalker wrote:

Done.

https://github.com/llvm/llvm-project/pull/213480


More information about the llvm-commits mailing list