[llvm] [InstCombine] Fold copysign of selects from sign comparison to sign operand (PR #85627)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 26 01:56:08 PDT 2024
================
@@ -2479,6 +2479,47 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
if (match(Mag, m_FAbs(m_Value(X))) || match(Mag, m_FNeg(m_Value(X))))
return replaceOperand(*II, 0, X);
+ Value *A, *B;
+ CmpInst::Predicate Pred;
+ const APFloat *TC, *FC;
+ if (!match(Sign, m_Select((m_And(m_Value(B),
+ m_FCmp(Pred, m_Value(A), m_PosZeroFP()))),
+ m_APFloat(TC), m_APFloat(FC))))
+ return nullptr;
+ // Match select ?, TC, FC where the constants are equal but negated.
+ // Check for these 8 conditions
+ /*
+ copysign(Mag, B & (A < 0.0) ? -TC : TC) --> copysign(Mag, A) B->true, A<0.
+ copysign(Mag, B & (A < 0.0) ? -TC : TC) --> copysign(Mag, A) B->true, A>0.
+ copysign(Mag, B & (A < 0.0) ? -TC : TC) --> copysign(Mag, A) B->false, A>0.
+ copysign(Mag, B & (A < 0.0) ? -TC : TC) --> copysign(Mag, -A) B->false, A<0.
+ */
+ /*
+ copysign(Mag, B & (A > 0.0) ? -TC : TC) --> copysign(Mag, -A) B->true, A<0.
+ copysign(Mag, B & (A > 0.0) ? -TC : TC) --> copysign(Mag, -A) B->true, A>0.
+ copysign(Mag, B & (A > 0.0) ? -TC : TC) --> copysign(Mag, A) B->false, A>0.
+ copysign(Mag, B & (A > 0.0) ? -TC : TC) --> copysign(Mag, -A) B->false, A<0.
+ */
+ assert(TC != FC);
+
+ if (Pred == CmpInst::FCMP_OLT)
+ if (match(A, m_Negative())) {
+ if (!match(B, m_ZeroInt()) && TC->isNegative())
+ return replaceOperand(*II, 1, A);
+ if (match(B, m_ZeroInt()) && TC->isNegative())
+ A = Builder.CreateFNeg(A);
+ return replaceOperand(*II, 1, A);
+ } else
+ return replaceOperand(*II, 1, A);
+ if (Pred == CmpInst::FCMP_OGT)
+ if (match(A, m_Negative())) {
+ A = Builder.CreateFNeg(A);
+ return replaceOperand(*II, 1, A);
+ } else if (!match(B, m_ZeroInt()) && TC->isNegative())
----------------
arsenm wrote:
No else after return
https://github.com/llvm/llvm-project/pull/85627
More information about the llvm-commits
mailing list