[llvm] [GlobalISel] Add G_CONCAT_VECTOR handling in computeNumSignBits (PR #142355)
David Green via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 2 03:25:36 PDT 2025
================
@@ -1958,6 +1958,27 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
}
break;
}
+ case TargetOpcode::G_CONCAT_VECTORS: {
+ if (MRI.getType(MI.getOperand(0).getReg()).isScalableVector())
+ break;
+ FirstAnswer = std::numeric_limits<unsigned>::max();
+ // Determine the minimum number of sign bits across all demanded
+ // elts of the input vectors. Early out if the result is already 1.
+ unsigned NumSubVectorElts =
+ MRI.getType(MI.getOperand(1).getReg()).getNumElements();
+ unsigned NumSubVectors = MI.getNumOperands() - 1;
+ for (unsigned i = 0; (i < NumSubVectors); ++i) {
+ APInt DemandedSub =
+ DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
+ if (!DemandedSub)
+ continue;
+ unsigned Tmp2 = computeNumSignBits(MI.getOperand(i + 1).getReg(),
+ DemandedSub, Depth + 1);
+
+ FirstAnswer = std::min(FirstAnswer, Tmp2);
----------------
davemgreen wrote:
Perhaps add a `if (FirstAnswer == 1) break` to bail out early?
https://github.com/llvm/llvm-project/pull/142355
More information about the llvm-commits
mailing list