[llvm] [SelectionDAG] Unify ISD::LOAD handling in ComputeNumSignBits. NFC (PR #175060)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 8 11:47:42 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-selectiondag
Author: Craig Topper (topperc)
<details>
<summary>Changes</summary>
Range metadata was handled in a ISD::LOAD case in the main opcode switch. Extending loads and constant pools were handled with special code after the main switch. Move this code into the ISD::LOAD case of the main switch.
There is one slight change here, I put the Op.getResNo() == 0 check before the range handling. This should be more correct, though I'm not sure why anyone would call ComputeNumSignBits on a pointer.
---
Full diff: https://github.com/llvm/llvm-project/pull/175060.diff
1 Files Affected:
- (modified) llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (+47-48)
``````````diff
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index e27cad6fe91d3..35e443b40c41f 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -5217,6 +5217,10 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
return Tmp;
}
case ISD::LOAD: {
+ // If we are looking at the loaded value of the SDNode.
+ if (Op.getResNo() != 0)
+ break;
+
LoadSDNode *LD = cast<LoadSDNode>(Op);
if (const MDNode *Ranges = LD->getRanges()) {
if (DemandedElts != 1)
@@ -5242,6 +5246,49 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
CR.getSignedMax().getNumSignBits());
}
+ unsigned ExtType = LD->getExtensionType();
+ switch (ExtType) {
+ default:
+ break;
+ case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
+ Tmp = LD->getMemoryVT().getScalarSizeInBits();
+ return VTBits - Tmp + 1;
+ case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
+ Tmp = LD->getMemoryVT().getScalarSizeInBits();
+ return VTBits - Tmp;
+ case ISD::NON_EXTLOAD:
+ if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
+ // We only need to handle vectors - computeKnownBits should handle
+ // scalar cases.
+ Type *CstTy = Cst->getType();
+ if (CstTy->isVectorTy() && !VT.isScalableVector() &&
+ (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
+ VTBits == CstTy->getScalarSizeInBits()) {
+ Tmp = VTBits;
+ for (unsigned i = 0; i != NumElts; ++i) {
+ if (!DemandedElts[i])
+ continue;
+ if (Constant *Elt = Cst->getAggregateElement(i)) {
+ if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
+ const APInt &Value = CInt->getValue();
+ Tmp = std::min(Tmp, Value.getNumSignBits());
+ continue;
+ }
+ if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
+ APInt Value = CFP->getValueAPF().bitcastToAPInt();
+ Tmp = std::min(Tmp, Value.getNumSignBits());
+ continue;
+ }
+ }
+ // Unknown type. Conservatively assume no bits match sign bit.
+ return 1;
+ }
+ return Tmp;
+ }
+ }
+ break;
+ }
+
break;
}
case ISD::ATOMIC_CMP_SWAP:
@@ -5287,54 +5334,6 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
}
}
- // If we are looking at the loaded value of the SDNode.
- if (Op.getResNo() == 0) {
- // Handle LOADX separately here. EXTLOAD case will fallthrough.
- if (LoadSDNode *LD = dyn_cast<LoadSDNode>(Op)) {
- unsigned ExtType = LD->getExtensionType();
- switch (ExtType) {
- default: break;
- case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
- Tmp = LD->getMemoryVT().getScalarSizeInBits();
- return VTBits - Tmp + 1;
- case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
- Tmp = LD->getMemoryVT().getScalarSizeInBits();
- return VTBits - Tmp;
- case ISD::NON_EXTLOAD:
- if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
- // We only need to handle vectors - computeKnownBits should handle
- // scalar cases.
- Type *CstTy = Cst->getType();
- if (CstTy->isVectorTy() && !VT.isScalableVector() &&
- (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
- VTBits == CstTy->getScalarSizeInBits()) {
- Tmp = VTBits;
- for (unsigned i = 0; i != NumElts; ++i) {
- if (!DemandedElts[i])
- continue;
- if (Constant *Elt = Cst->getAggregateElement(i)) {
- if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
- const APInt &Value = CInt->getValue();
- Tmp = std::min(Tmp, Value.getNumSignBits());
- continue;
- }
- if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
- APInt Value = CFP->getValueAPF().bitcastToAPInt();
- Tmp = std::min(Tmp, Value.getNumSignBits());
- continue;
- }
- }
- // Unknown type. Conservatively assume no bits match sign bit.
- return 1;
- }
- return Tmp;
- }
- }
- break;
- }
- }
- }
-
// Allow the target to implement this method for its nodes.
if (Opcode >= ISD::BUILTIN_OP_END ||
Opcode == ISD::INTRINSIC_WO_CHAIN ||
``````````
</details>
https://github.com/llvm/llvm-project/pull/175060
More information about the llvm-commits
mailing list