diff options
author | Roman Lebedev <lebedev.ri@gmail.com> | 2019-09-21 22:27:28 +0000 |
---|---|---|
committer | Roman Lebedev <lebedev.ri@gmail.com> | 2019-09-21 22:27:28 +0000 |
commit | e94f156f778cdc1d20cd836cfc5d6df0b77761e1 (patch) | |
tree | fd4fcffd8f57d6ee00e8bd74a38cb74bebb7eea7 /llvm/lib/Analysis | |
parent | ac4dda805217f076e8dda009e7433dd278d7113e (diff) | |
download | bcm5719-llvm-e94f156f778cdc1d20cd836cfc5d6df0b77761e1.tar.gz bcm5719-llvm-e94f156f778cdc1d20cd836cfc5d6df0b77761e1.zip |
[InstSimplify][NFC] Reorganize simplifyUnsignedRangeCheck() to emphasize and/or symmetry
Only a single `X >= Y && Y == 0 --> Y == 0` fold appears to be missing.
llvm-svn: 372490
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index cfb37f49bcc..5c8bf8f83cf 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -1443,25 +1443,28 @@ static Value *simplifyUnsignedRangeCheck(ICmpInst *ZeroICmp, isKnownNonZero(X, Q.DL, /*Depth=*/0, Q.AC, Q.CxtI, Q.DT)) return IsAnd ? UnsignedICmp : ZeroICmp; + // X >= Y && Y == 0 --> Y == 0 FIXME + // X >= Y || Y == 0 --> X >= Y + if (UnsignedPred == ICmpInst::ICMP_UGE && EqPred == ICmpInst::ICMP_EQ && + !IsAnd) + return UnsignedICmp; + // X > Y && Y == 0 --> Y == 0 iff X != 0 // X > Y || Y == 0 --> X > Y iff X != 0 if (UnsignedPred == ICmpInst::ICMP_UGT && EqPred == ICmpInst::ICMP_EQ && isKnownNonZero(X, Q.DL, /*Depth=*/0, Q.AC, Q.CxtI, Q.DT)) return IsAnd ? ZeroICmp : UnsignedICmp; - // X >= Y || Y != 0 --> true - // X >= Y || Y == 0 --> X >= Y - if (UnsignedPred == ICmpInst::ICMP_UGE && !IsAnd) { - if (EqPred == ICmpInst::ICMP_NE) - return getTrue(UnsignedICmp->getType()); - return UnsignedICmp; - } - // X < Y && Y == 0 --> false if (UnsignedPred == ICmpInst::ICMP_ULT && EqPred == ICmpInst::ICMP_EQ && IsAnd) return getFalse(UnsignedICmp->getType()); + // X >= Y || Y != 0 --> true + if (UnsignedPred == ICmpInst::ICMP_UGE && EqPred == ICmpInst::ICMP_NE && + !IsAnd) + return getTrue(UnsignedICmp->getType()); + return nullptr; } |