[llvm] [SimplfiyLibCalls] Constant fold `remquo` (PR #99647)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 19 06:29:01 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
+ APSInt QuotInt(32, /*isUnsigned=*/false);
+ bool IsExact;
+ Status = Quot.convertToInteger(QuotInt, APFloat::rmNearestTiesToEven, &IsExact);
+ if (Status != APFloat::opOK || Status != APFloat::opInexact)
+ return nullptr;
+
+ B.CreateAlignedStore(ConstantInt::get(B.getInt32Ty(), QuotInt.getExtValue()), CI->getArgOperand(2), CI->getParamAlign(2));
----------------
arsenm wrote:
You should query TargetLibraryInfo for the int size instead of assuming i32
https://github.com/llvm/llvm-project/pull/99647
More information about the llvm-commits
mailing list