[llvm] [TruncInstCombine] Handle sdiv/srem (PR #222391)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 24 08:05:25 PDT 2026


================
@@ -372,6 +373,27 @@ Type *TruncInstCombine::getBestTruncatedType() {
         llvm_unreachable("Unhandled intrinsic");
       }
     }
+    if (I->getOpcode() == Instruction::SDiv ||
+        I->getOpcode() == Instruction::SRem) {
+      unsigned NumSignBits0 = ComputeNumSignBits(I->getOperand(0));
+      unsigned NumSignBits1 = ComputeNumSignBits(I->getOperand(1));
+      unsigned MinBitWidthOp0 = OrigBitWidth - NumSignBits0 + 1;
+      unsigned MinBitWidthOp1 = OrigBitWidth - NumSignBits1 + 1;
+      unsigned MinBitWidth = std::max(MinBitWidthOp0, MinBitWidthOp1);
+
+      // In two's complement, sdiv and srem produce UB / poison on INT_MIN / -1.
+      // If LHS can be negative and RHS can be -1, we must ensure the reduced
+      // type has at least MinBitWidthOp0 + 1 bits so that LHS cannot be INT_MIN
+      // in the reduced type.
+      KnownBits KnownLHS = computeKnownBits(I->getOperand(0));
+      KnownBits KnownRHS = computeKnownBits(I->getOperand(1));
+      if (!KnownLHS.isNonNegative() && KnownRHS.Zero.isZero())
----------------
dtcxzyw wrote:

I need more time to understand this check...


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


More information about the llvm-commits mailing list