diff options
author | Roman Lebedev <lebedev.ri@gmail.com> | 2019-09-21 22:27:39 +0000 |
---|---|---|
committer | Roman Lebedev <lebedev.ri@gmail.com> | 2019-09-21 22:27:39 +0000 |
commit | baf809811b066eede7c1093b5c9941e428d6bd5f (patch) | |
tree | f79ab61d89d967f6994ce632e437c68dc9fba0f5 | |
parent | e94f156f778cdc1d20cd836cfc5d6df0b77761e1 (diff) | |
download | bcm5719-llvm-baf809811b066eede7c1093b5c9941e428d6bd5f.tar.gz bcm5719-llvm-baf809811b066eede7c1093b5c9941e428d6bd5f.zip |
[InstSimplify] simplifyUnsignedRangeCheck(): X >= Y && Y == 0 --> Y == 0
https://rise4fun.com/Alive/v9Y4
llvm-svn: 372491
-rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 7 | ||||
-rw-r--r-- | llvm/test/Transforms/InstSimplify/unsigned-range-checks.ll | 4 |
2 files changed, 4 insertions, 7 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 5c8bf8f83cf..67b06ea40bc 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -1443,11 +1443,10 @@ 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 --> Y == 0 // X >= Y || Y == 0 --> X >= Y - if (UnsignedPred == ICmpInst::ICMP_UGE && EqPred == ICmpInst::ICMP_EQ && - !IsAnd) - return UnsignedICmp; + if (UnsignedPred == ICmpInst::ICMP_UGE && EqPred == ICmpInst::ICMP_EQ) + return IsAnd ? ZeroICmp : UnsignedICmp; // X > Y && Y == 0 --> Y == 0 iff X != 0 // X > Y || Y == 0 --> X > Y iff X != 0 diff --git a/llvm/test/Transforms/InstSimplify/unsigned-range-checks.ll b/llvm/test/Transforms/InstSimplify/unsigned-range-checks.ll index d30fee9a606..e0c3a7c8d68 100644 --- a/llvm/test/Transforms/InstSimplify/unsigned-range-checks.ll +++ b/llvm/test/Transforms/InstSimplify/unsigned-range-checks.ll @@ -84,9 +84,7 @@ define i1 @t7(i8 %x, i8 %y) { define i1 @t8(i8 %x, i8 %y) { ; CHECK-LABEL: @t8( ; CHECK-NEXT: [[NOT_NULL:%.*]] = icmp eq i8 [[Y:%.*]], 0 -; CHECK-NEXT: [[NO_UNDERFLOW:%.*]] = icmp ule i8 [[Y]], [[X:%.*]] -; CHECK-NEXT: [[R:%.*]] = and i1 [[NOT_NULL]], [[NO_UNDERFLOW]] -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 [[NOT_NULL]] ; %not_null = icmp eq i8 %y, 0 %no_underflow = icmp ule i8 %y, %x |