diff options
| author | Florian Hahn <florian.hahn@arm.com> | 2017-12-01 12:34:16 +0000 |
|---|---|---|
| committer | Florian Hahn <florian.hahn@arm.com> | 2017-12-01 12:34:16 +0000 |
| commit | 30932a3c167be7e4d8be33c2b2216dc366d98c79 (patch) | |
| tree | c00f0af891f199485cca7535267bc10eae355398 /llvm/lib/Analysis | |
| parent | 9f047795fbf0e9ed760e78c496179cb9552865d7 (diff) | |
| download | bcm5719-llvm-30932a3c167be7e4d8be33c2b2216dc366d98c79.tar.gz bcm5719-llvm-30932a3c167be7e4d8be33c2b2216dc366d98c79.zip | |
[InstSimplify] More fcmp cases when comparing against negative constants.
Summary:
For known positive non-zero value X:
fcmp uge X, -C => true
fcmp ugt X, -C => true
fcmp une X, -C => true
fcmp oeq X, -C => false
fcmp ole X, -C => false
fcmp olt X, -C => false
Patch by Paul Walker.
Reviewers: majnemer, t.p.northover, spatel, RKSimon
Reviewed By: spatel
Subscribers: fhahn, llvm-commits
Differential Revision: https://reviews.llvm.org/D40012
llvm-svn: 319538
Diffstat (limited to 'llvm/lib/Analysis')
| -rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 6bed2f3a901..145aa13dfc8 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -3378,6 +3378,28 @@ static Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS, default: break; } + } else if (C->isNegative()) { + assert(!C->isNaN() && "Unexpected NaN constant!"); + // TODO: We can catch more cases by using a range check rather than + // relying on CannotBeOrderedLessThanZero. + switch (Pred) { + case FCmpInst::FCMP_UGE: + case FCmpInst::FCMP_UGT: + case FCmpInst::FCMP_UNE: + // (X >= 0) implies (X > C) when (C < 0) + if (CannotBeOrderedLessThanZero(LHS, Q.TLI)) + return getTrue(RetTy); + break; + case FCmpInst::FCMP_OEQ: + case FCmpInst::FCMP_OLE: + case FCmpInst::FCMP_OLT: + // (X >= 0) implies !(X < C) when (C < 0) + if (CannotBeOrderedLessThanZero(LHS, Q.TLI)) + return getFalse(RetTy); + break; + default: + break; + } } } |

