[llvm] [InstCombineCompare] Use known bits to insert assume intrinsics. (PR #96017)
Mikhail Gudim via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 21 20:38:11 PDT 2024
================
@@ -6333,6 +6337,125 @@ bool InstCombinerImpl::replacedSelectWithOperand(SelectInst *SI,
return false;
}
+static void computeClosestIntsSatisfyingKnownBits(
+ APInt Target, KnownBits &Known, unsigned BitWidth, bool IsSigned,
+ APInt &ClosestSmaller, APInt &ClosestBigger) {
+ int KnownZeroMaskLength = BitWidth - Known.Zero.countLeadingZeros();
+ if (KnownZeroMaskLength == 0)
+ return;
+
+ APInt PowOf2(BitWidth, 1 << KnownZeroMaskLength);
+ if (!IsSigned || Target.isNonNegative()) {
+ ClosestSmaller =
+ PowOf2 * APIntOps::RoundingUDiv(Target, PowOf2, APInt::Rounding::DOWN);
+ ClosestBigger =
+ PowOf2 * APIntOps::RoundingUDiv(Target, PowOf2, APInt::Rounding::UP);
+ } else {
+ ClosestSmaller =
+ PowOf2 * APIntOps::RoundingSDiv(Target, PowOf2, APInt::Rounding::UP);
+ ClosestBigger =
+ PowOf2 * APIntOps::RoundingSDiv(Target, PowOf2, APInt::Rounding::DOWN);
+ }
+}
+
+static void insertAssumeICmp(BasicBlock *BB, ICmpInst::Predicate Pred,
+ Value *LHS, Value *RHS, LLVMContext &Ctx) {
+ IRBuilder<> Builder(Ctx);
+ Builder.SetInsertPoint(BB, BB->getFirstInsertionPt());
+ auto *Cmp = Builder.CreateICmp(Pred, LHS, RHS);
+ Builder.CreateAssumption(Cmp);
+ return;
+}
+
+static void tryToInsertAssumeBasedOnICmpAndKnownBits(ICmpInst &I,
+ KnownBits Op0Known,
+ KnownBits Op1Known,
+ unsigned BitWidth) {
+ if (!BitWidth)
+ return;
+ if (!(Op1Known.isConstant() && Op0Known.Zero.isMask()))
+ return;
+
+ SmallVector<BasicBlock *> TBBs;
+ SmallVector<BasicBlock *> FBBs;
+ for (Use &U : I.uses()) {
+ Instruction *UI = cast<Instruction>(U.getUser());
+ if (BranchInst *BrUse = dyn_cast<BranchInst>(UI)) {
+ if (BrUse->isUnconditional())
+ continue;
+ TBBs.push_back(BrUse->getSuccessor(0));
+ FBBs.push_back(BrUse->getSuccessor(1));
+ }
+ }
----------------
mgudim wrote:
We insert assume at both true and false destinations of all branches which use the compare.
https://github.com/llvm/llvm-project/pull/96017
More information about the llvm-commits
mailing list