diff options
author | Roman Lebedev <lebedev.ri@gmail.com> | 2019-09-25 22:59:41 +0000 |
---|---|---|
committer | Roman Lebedev <lebedev.ri@gmail.com> | 2019-09-25 22:59:41 +0000 |
commit | 914a3d1cf2e7fa93ab6972dd9f9d9bc525b10dd5 (patch) | |
tree | 8db6d4f28d75d5ea024ac773c765084c4e6e0d68 /llvm/lib/Analysis/InstructionSimplify.cpp | |
parent | 26606bec9a2ab9f98869d518359f8ab719e5dd0f (diff) | |
download | bcm5719-llvm-914a3d1cf2e7fa93ab6972dd9f9d9bc525b10dd5.tar.gz bcm5719-llvm-914a3d1cf2e7fa93ab6972dd9f9d9bc525b10dd5.zip |
[InstSimplify] Handle more 'A </>/>=/<= B &&/|| (A - B) !=/== 0' patterns (PR43251)
https://rise4fun.com/Alive/sl9s
https://rise4fun.com/Alive/2plN
https://bugs.llvm.org/show_bug.cgi?id=43251
llvm-svn: 372928
Diffstat (limited to 'llvm/lib/Analysis/InstructionSimplify.cpp')
-rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index dd477fe1c5d..2a911a91e29 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -1401,6 +1401,18 @@ static Value *simplifyUnsignedRangeCheck(ICmpInst *ZeroICmp, UnsignedPred == ICmpInst::ICMP_UGT) && EqPred == ICmpInst::ICMP_EQ && IsAnd) return ConstantInt::getFalse(UnsignedICmp->getType()); + + // A </> B && (A - B) != 0 <--> A </> B + // A </> B || (A - B) != 0 <--> (A - B) != 0 + if (EqPred == ICmpInst::ICMP_NE && (UnsignedPred == ICmpInst::ICMP_ULT || + UnsignedPred == ICmpInst::ICMP_UGT)) + return IsAnd ? UnsignedICmp : ZeroICmp; + + // A <=/>= B && (A - B) == 0 <--> (A - B) == 0 + // A <=/>= B || (A - B) == 0 <--> A <=/>= B + if (EqPred == ICmpInst::ICMP_EQ && (UnsignedPred == ICmpInst::ICMP_ULE || + UnsignedPred == ICmpInst::ICMP_UGE)) + return IsAnd ? ZeroICmp : UnsignedICmp; } // Given Y = (A - B) |