[llvm] r360260 - Revert "[ValueTracking] Improve isKnowNonZero for Ints"

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Wed May 8 07:50:01 PDT 2019


Author: nikic
Date: Wed May  8 07:50:01 2019
New Revision: 360260

URL: http://llvm.org/viewvc/llvm-project?rev=360260&view=rev
Log:
Revert "[ValueTracking] Improve isKnowNonZero for Ints"

This reverts commit 3b137a495686bd6018d115ea82fb8bb7718349fd.

As reported in https://reviews.llvm.org/D60846, this is causing
miscompiles.

Modified:
    llvm/trunk/lib/Analysis/ValueTracking.cpp
    llvm/trunk/test/Transforms/InstCombine/known-non-zero.ll
    llvm/trunk/test/Transforms/InstSimplify/known-non-zero.ll
    llvm/trunk/test/Transforms/LICM/hoist-mustexec.ll

Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=360260&r1=360259&r2=360260&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
+++ llvm/trunk/lib/Analysis/ValueTracking.cpp Wed May  8 07:50:01 2019
@@ -1893,9 +1893,10 @@ static bool isGEPKnownNonNull(const GEPO
   return false;
 }
 
-static bool isKnownNonZeroFromDominatingCondition(const Value *V,
+static bool isKnownNonNullFromDominatingCondition(const Value *V,
                                                   const Instruction *CtxI,
                                                   const DominatorTree *DT) {
+  assert(V->getType()->isPointerTy() && "V must be pointer type");
   assert(!isa<ConstantData>(V) && "Did not expect ConstantPointerNull");
 
   if (!CtxI || !DT)
@@ -1908,15 +1909,14 @@ static bool isKnownNonZeroFromDominating
       break;
     NumUsesExplored++;
 
-    // If the value is a pointer and used as an argument to a call or invoke,
-    // then argument attributes may provide an answer about null-ness.
-    if (V->getType()->isPointerTy())
-      if (auto CS = ImmutableCallSite(U))
-        if (auto *CalledFunc = CS.getCalledFunction())
-          for (const Argument &Arg : CalledFunc->args())
-            if (CS.getArgOperand(Arg.getArgNo()) == V &&
-                Arg.hasNonNullAttr() && DT->dominates(CS.getInstruction(), CtxI))
-              return true;
+    // If the value is used as an argument to a call or invoke, then argument
+    // attributes may provide an answer about null-ness.
+    if (auto CS = ImmutableCallSite(U))
+      if (auto *CalledFunc = CS.getCalledFunction())
+        for (const Argument &Arg : CalledFunc->args())
+          if (CS.getArgOperand(Arg.getArgNo()) == V &&
+              Arg.hasNonNullAttr() && DT->dominates(CS.getInstruction(), CtxI))
+            return true;
 
     // Consider only compare instructions uniquely controlling a branch
     CmpInst::Predicate Pred;
@@ -2064,11 +2064,11 @@ bool isKnownNonZero(const Value *V, unsi
   }
 
 
-  if (isKnownNonZeroFromDominatingCondition(V, Q.CxtI, Q.DT))
-    return true;
-
   // Check for recursive pointer simplifications.
   if (V->getType()->isPointerTy()) {
+    if (isKnownNonNullFromDominatingCondition(V, Q.CxtI, Q.DT))
+      return true;
+
     // Look through bitcast operations, GEPs, and int2ptr instructions as they
     // do not alter the value, or at least not the nullness property of the
     // value, e.g., int2ptr is allowed to zero/sign extend the value.

Modified: llvm/trunk/test/Transforms/InstCombine/known-non-zero.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/known-non-zero.ll?rev=360260&r1=360259&r2=360260&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/known-non-zero.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/known-non-zero.ll Wed May  8 07:50:01 2019
@@ -13,7 +13,7 @@ define i32 @test0(i64 %x) {
 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i64 [[X:%.*]], 0
 ; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
 ; CHECK:       non_zero:
-; CHECK-NEXT:    [[CTZ:%.*]] = call i64 @llvm.cttz.i64(i64 [[X]], i1 true), !range !0
+; CHECK-NEXT:    [[CTZ:%.*]] = call i64 @llvm.cttz.i64(i64 [[X]], i1 false), !range !0
 ; CHECK-NEXT:    [[CTZ32:%.*]] = trunc i64 [[CTZ]] to i32
 ; CHECK-NEXT:    br label [[EXIT]]
 ; CHECK:       exit:
@@ -40,7 +40,7 @@ define i32 @test1(i64 %x) {
 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i64 [[X:%.*]], 0
 ; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
 ; CHECK:       non_zero:
-; CHECK-NEXT:    [[CTZ:%.*]] = call i64 @llvm.ctlz.i64(i64 [[X]], i1 true), !range !0
+; CHECK-NEXT:    [[CTZ:%.*]] = call i64 @llvm.ctlz.i64(i64 [[X]], i1 false), !range !0
 ; CHECK-NEXT:    [[CTZ32:%.*]] = trunc i64 [[CTZ]] to i32
 ; CHECK-NEXT:    br label [[EXIT]]
 ; CHECK:       exit:

Modified: llvm/trunk/test/Transforms/InstSimplify/known-non-zero.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/known-non-zero.ll?rev=360260&r1=360259&r2=360260&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstSimplify/known-non-zero.ll (original)
+++ llvm/trunk/test/Transforms/InstSimplify/known-non-zero.ll Wed May  8 07:50:01 2019
@@ -7,7 +7,8 @@ define i64 @test0(i64 %x) {
 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i64 [[X:%.*]], 0
 ; CHECK-NEXT:    br i1 [[A]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
 ; CHECK:       non_zero:
-; CHECK-NEXT:    br i1 false, label [[UNREACHABLE:%.*]], label [[EXIT]]
+; CHECK-NEXT:    [[B:%.*]] = icmp eq i64 [[X]], 0
+; CHECK-NEXT:    br i1 [[B]], label [[UNREACHABLE:%.*]], label [[EXIT]]
 ; CHECK:       unreachable:
 ; CHECK-NEXT:    br label [[EXIT]]
 ; CHECK:       exit:
@@ -36,7 +37,8 @@ define i64 @test1(i64 %x) {
 ; CHECK-NEXT:    [[A:%.*]] = icmp eq i64 [[X:%.*]], 0
 ; CHECK-NEXT:    br i1 [[A]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
 ; CHECK:       non_zero:
-; CHECK-NEXT:    br i1 true, label [[EXIT]], label [[UNREACHABLE:%.*]]
+; CHECK-NEXT:    [[B:%.*]] = icmp ugt i64 [[X]], 0
+; CHECK-NEXT:    br i1 [[B]], label [[EXIT]], label [[UNREACHABLE:%.*]]
 ; CHECK:       unreachable:
 ; CHECK-NEXT:    br label [[EXIT]]
 ; CHECK:       exit:
@@ -71,9 +73,11 @@ define i1 @test2(i64 %x, i1 %y) {
 ; CHECK:       two:
 ; CHECK-NEXT:    br label [[MAINBLOCK]]
 ; CHECK:       mainblock:
+; CHECK-NEXT:    [[P:%.*]] = phi i64 [ [[X]], [[ONE]] ], [ 42, [[TWO]] ]
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[P]], 0
 ; CHECK-NEXT:    br label [[EXIT]]
 ; CHECK:       exit:
-; CHECK-NEXT:    [[RES:%.*]] = phi i1 [ false, [[MAINBLOCK]] ], [ true, [[START:%.*]] ]
+; CHECK-NEXT:    [[RES:%.*]] = phi i1 [ [[CMP]], [[MAINBLOCK]] ], [ true, [[START:%.*]] ]
 ; CHECK-NEXT:    ret i1 [[RES]]
 ;
 start:

Modified: llvm/trunk/test/Transforms/LICM/hoist-mustexec.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LICM/hoist-mustexec.ll?rev=360260&r1=360259&r2=360260&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/LICM/hoist-mustexec.ll (original)
+++ llvm/trunk/test/Transforms/LICM/hoist-mustexec.ll Wed May  8 07:50:01 2019
@@ -129,6 +129,8 @@ fail:
 }
 
 ; requires fact length is non-zero
+; TODO: IsKnownNonNullFromDominatingConditions is currently only be done for
+; pointers; should handle integers too
 define i32 @test4(i32* noalias nocapture readonly %a) nounwind uwtable {
 ; CHECK-LABEL: @test4(
 ; CHECK-NEXT:  entry:
@@ -136,7 +138,6 @@ define i32 @test4(i32* noalias nocapture
 ; CHECK-NEXT:    [[IS_ZERO:%.*]] = icmp eq i32 [[LEN]], 0
 ; CHECK-NEXT:    br i1 [[IS_ZERO]], label [[FAIL:%.*]], label [[PREHEADER:%.*]]
 ; CHECK:       preheader:
-; CHECK-NEXT:    [[I1:%.*]] = load i32, i32* [[A]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[PREHEADER]] ], [ [[INC:%.*]], [[CONTINUE:%.*]] ]
@@ -144,6 +145,7 @@ define i32 @test4(i32* noalias nocapture
 ; CHECK-NEXT:    [[R_CHK:%.*]] = icmp ult i32 [[IV]], [[LEN]]
 ; CHECK-NEXT:    br i1 [[R_CHK]], label [[CONTINUE]], label [[FAIL_LOOPEXIT:%.*]]
 ; CHECK:       continue:
+; CHECK-NEXT:    [[I1:%.*]] = load i32, i32* [[A]], align 4
 ; CHECK-NEXT:    [[ADD]] = add nsw i32 [[I1]], [[ACC]]
 ; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[IV]], 1
 ; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 1000




More information about the llvm-commits mailing list