[InstSimplify] simplifyUnsignedRangeCheck(): X >= Y && Y == 0 --> Y == 0
authorRoman Lebedev <lebedev.ri@gmail.com>
Sat, 21 Sep 2019 22:27:39 +0000 (22:27 +0000)
committerRoman Lebedev <lebedev.ri@gmail.com>
Sat, 21 Sep 2019 22:27:39 +0000 (22:27 +0000)
https://rise4fun.com/Alive/v9Y4

llvm-svn: 372491

llvm/lib/Analysis/InstructionSimplify.cpp
llvm/test/Transforms/InstSimplify/unsigned-range-checks.ll

index 5c8bf8f83cf3829182eebd5a4394116d573b1ef4..67b06ea40bc74d9e2b712899547d75dd17c2d05a 100644 (file)
@@ -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
index d30fee9a606de6562ee67304d8a1a7a722659804..e0c3a7c8d689e50b873046396e9ef2eda15c08c8 100644 (file)
@@ -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