[llvm] [InstCombine] Generalize fold of `fcmp + copysign` (PR #86387)
Andy Kaylor via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 25 12:23:48 PDT 2024
================
@@ -8101,22 +8101,22 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
}
// Convert a sign-bit test of an FP value into a cast and integer compare.
- // TODO: Simplify if the copysign constant is 0.0 or NaN.
- // TODO: Handle non-zero compare constants.
- // TODO: Handle other predicates.
if (match(Op0, m_OneUse(m_Intrinsic<Intrinsic::copysign>(m_APFloat(C),
m_Value(X)))) &&
- match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {
+ match(Op1, m_ImmConstant(RHSC))) {
Type *IntType = Builder.getIntNTy(X->getType()->getScalarSizeInBits());
if (auto *VecTy = dyn_cast<VectorType>(OpType))
IntType = VectorType::get(IntType, VecTy->getElementCount());
- // copysign(non-zero constant, X) < 0.0 --> (bitcast X) < 0
- if (Pred == FCmpInst::FCMP_OLT) {
- Value *IntX = Builder.CreateBitCast(X, IntType);
- return new ICmpInst(ICmpInst::ICMP_SLT, IntX,
- ConstantInt::getNullValue(IntType));
- }
+ APFloat PosC = abs(*C);
----------------
andykaylor wrote:
Can you add a description of this transformation as a comment? Something like:
`copysign(C1, X) pred C2 --> signbit(X) ? ABS(C1) pred C2 : -ABS(C1) pred C2`
https://github.com/llvm/llvm-project/pull/86387
More information about the llvm-commits
mailing list