[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