[llvm] [InstCombineCompares] Replace the sqrt in if-condition (PR #91707)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri May 10 04:18:52 PDT 2024
================
@@ -8068,6 +8073,50 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
}
+ /// Try to sink the sqrt in this following case:
+ /// \code
+ /// tmp = sqrt(input)
+ /// if (tmp > cond)
+ /// branch_without_tmp
+ /// else
+ /// branch_with_tmp
+ /// ...
+ /// \endcode
+ /// Is optimized to:
+ /// \code
+ /// if (input > copysign(cond*cond, cond))
+ /// branch_without_tmp
+ /// else
+ /// tmp = sqrt(input)
+ /// branch_with_tmp
+ /// ...
+ /// \endcode
+ /// Only call sqrt in the branch that needs the sqrt result,
+ /// not if it is not needed, reducing the number of calls to sqrt.
+ if (I.isFast() && ReplaceSqrtInIfCondition) {
+ // fcmp sqrt(X), sqrt(Y) => fcmp X, Y
+ if (match(Op0, m_Intrinsic<Intrinsic::sqrt>(m_Value(X))) &&
+ match(Op1, m_Intrinsic<Intrinsic::sqrt>(m_Value(Y)))) {
+ auto CIX = cast<CallInst>(Op0);
+ auto CIY = cast<CallInst>(Op1);
+ return new FCmpInst(Pred, CIX->getOperand(0), CIY->getOperand(0), "", &I);
+ } else if (match(Op0, m_Intrinsic<Intrinsic::sqrt>(m_Value(X)))) {
----------------
arsenm wrote:
No else after return
https://github.com/llvm/llvm-project/pull/91707
More information about the llvm-commits
mailing list