[llvm] [SimplfiyLibCalls] Constant fold `remquo` (PR #99647)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 19 06:17:31 PDT 2024
================
@@ -3018,6 +3018,35 @@ void LibCallSimplifier::classifyArgUse(
}
}
+/// Constant folds remquo
+Value *LibCallSimplifier::optimizeRemquo(CallInst *CI, IRBuilderBase &B) {
+ const APFloat *X, *Y;
+ if (!match(CI->getArgOperand(0), m_APFloat(X)) || !match(CI->getArgOperand(1), m_APFloat(Y)))
+ return nullptr;
+
+ if (X->isNaN() || Y->isNaN() || X->isInfinity() || Y->isZero())
+ return nullptr;
+
+ APFloat::opStatus Status;
+ APFloat Quot = *X;
+ Status = Quot.divide(*Y, APFloat::rmNearestTiesToEven);
+ if (Status != APFloat::opOK && Status != APFloat::opInexact)
+ return nullptr;
+ APFloat Rem = *X;
+ if (Rem.remainder(*Y) != APFloat::opOK)
+ return nullptr;
+
+ // TODO: We can only keep at least the three of the last bits of x/y
----------------
dtcxzyw wrote:
The current implementation is slightly conservative. The integer part of `x/y` may be out of range of i32.
https://github.com/llvm/llvm-project/pull/99647
More information about the llvm-commits
mailing list