summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/InstructionSimplify.cpp
diff options
context:
space:
mode:
authorRoman Lebedev <lebedev.ri@gmail.com>2019-09-25 22:59:41 +0000
committerRoman Lebedev <lebedev.ri@gmail.com>2019-09-25 22:59:41 +0000
commit914a3d1cf2e7fa93ab6972dd9f9d9bc525b10dd5 (patch)
tree8db6d4f28d75d5ea024ac773c765084c4e6e0d68 /llvm/lib/Analysis/InstructionSimplify.cpp
parent26606bec9a2ab9f98869d518359f8ab719e5dd0f (diff)
downloadbcm5719-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.cpp12
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)
OpenPOWER on IntegriCloud