aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
diff options
context:
space:
mode:
authorYingwei Zheng <dtcxzyw2333@gmail.com>2024-07-24 13:32:20 +0800
committerGitHub <noreply@github.com>2024-07-24 13:32:20 +0800
commit9d45b450f26a1ad669d4ceaac2c36aff4b80bfde (patch)
tree2ad1b31e9eccf126f1748c2bd3602adf863e2a98 /llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
parent7b619730d9e2bcc2ab1588574ed94ae19c4b8654 (diff)
downloadllvm-9d45b450f26a1ad669d4ceaac2c36aff4b80bfde.zip
llvm-9d45b450f26a1ad669d4ceaac2c36aff4b80bfde.tar.gz
llvm-9d45b450f26a1ad669d4ceaac2c36aff4b80bfde.tar.bz2
[SimplifyLibCalls] Constant fold `remquo` (#99647)
This patch adds constant folding support for `remquo`. Reference: https://en.cppreference.com/w/cpp/numeric/math/remquo Closes https://github.com/llvm/llvm-project/issues/99497.
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
index 89c8c5b..92c4426 100644
--- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -3018,6 +3018,37 @@ 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;
+
+ 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
+ unsigned IntBW = TLI->getIntSize();
+ APSInt QuotInt(IntBW, /*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.getIntNTy(IntBW), QuotInt.getExtValue()),
+ CI->getArgOperand(2), CI->getParamAlign(2));
+ return ConstantFP::get(CI->getType(), Rem);
+}
+
//===----------------------------------------------------------------------===//
// Integer Library Call Optimizations
//===----------------------------------------------------------------------===//
@@ -3926,6 +3957,10 @@ Value *LibCallSimplifier::optimizeFloatingPointLibCall(CallInst *CI,
case LibFunc_cabsf:
case LibFunc_cabsl:
return optimizeCAbs(CI, Builder);
+ case LibFunc_remquo:
+ case LibFunc_remquof:
+ case LibFunc_remquol:
+ return optimizeRemquo(CI, Builder);
default:
return nullptr;
}