[llvm] [GlobalISel] Port computeNumSignBits for G_MUL (PR #167311)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 10 19:58:37 PST 2025
================
@@ -2084,6 +2085,41 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits) - 1;
break;
}
+ case TargetOpcode::G_MUL: {
+ Register Src1 = MI.getOperand(1).getReg();
+ Register Src2 = MI.getOperand(2).getReg();
+
+ KnownBits Known1 = getKnownBits(Src1, DemandedElts, Depth + 1);
+ KnownBits Known2 = getKnownBits(Src2, DemandedElts, Depth + 1);
+
+ if (Known1.isZero() || Known2.isZero())
+ return TyBits;
+
+ auto C1 = getIConstantVRegValWithLookThrough(Src1, MRI);
+ auto C2 = getIConstantVRegValWithLookThrough(Src2, MRI);
+
+ if (C1 && C2) {
+ APInt Val1 = C1->Value;
+ APInt Val2 = C2->Value;
+ APInt Product = Val1 * Val2;
+ return Product.getNumSignBits();
+ }
+ unsigned Src1NumSignBits =
+ computeNumSignBits(Src1, DemandedElts, Depth + 1);
+ if (Src1NumSignBits == 1) {
+ return 1;
+ }
+ unsigned Src2NumSignBits =
+ computeNumSignBits(Src2, DemandedElts, Depth + 1);
+ if (Src2NumSignBits == 1) {
+ return 1;
+ }
----------------
arsenm wrote:
Compute src2 before src1, as it's canonically cheaper
https://github.com/llvm/llvm-project/pull/167311
More information about the llvm-commits
mailing list