[llvm] [InstCombine] Fold fcmp ogt (x - y), 0 into fcmp ogt x, y #85245 (PR #85506)
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 12 00:24:44 PDT 2024
================
@@ -7906,6 +7906,53 @@ static Instruction *foldFCmpFNegCommonOp(FCmpInst &I) {
return new FCmpInst(Pred, Op0, Zero, "", &I);
}
+static Instruction *foldFCmpFSubIntoFCmp(FCmpInst &I, Instruction *LHSI,
+ Constant *RHSC, InstCombinerImpl &CI) {
+ const CmpInst::Predicate Pred = I.getPredicate();
+ Value *X = LHSI->getOperand(0);
+ Value *Y = LHSI->getOperand(1);
+ switch (Pred) {
+ default:
+ break;
+ case FCmpInst::FCMP_UGT:
+ case FCmpInst::FCMP_ULT:
+ case FCmpInst::FCMP_UNE:
+ case FCmpInst::FCMP_OEQ:
+ case FCmpInst::FCMP_OGE:
+ case FCmpInst::FCMP_OLE:
+ // The optimization is not valid if X and Y are infinities of the same
+ // sign, i.e. the inf - inf = nan case. If the fsub has the ninf or nnan
+ // flag then we can assume we do not have that case. Otherwise we might be
+ // able to prove that either X or Y is not infinity.
+ if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
+ !isKnownNeverInfinity(LHSI->getOperand(1), /*Depth=*/0,
+ CI.getSimplifyQuery().getWithInstruction(&I)) &&
+ !isKnownNeverInfinity(LHSI->getOperand(0), /*Depth=*/0,
+ CI.getSimplifyQuery().getWithInstruction(&I)))
----------------
jayfoad wrote:
```suggestion
!isKnownNeverInfinity(Y, /*Depth=*/0,
CI.getSimplifyQuery().getWithInstruction(&I)) &&
!isKnownNeverInfinity(X, /*Depth=*/0,
CI.getSimplifyQuery().getWithInstruction(&I)))
```
https://github.com/llvm/llvm-project/pull/85506
More information about the llvm-commits
mailing list