diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -1476,21 +1476,9 @@ // If we're using the false successor, invert the predicate. if (FalseSucc == P->getParent()) Pred = CmpInst::getInversePredicate(Pred); - - switch (Pred) { - case CmpInst::Predicate::ICMP_EQ: - Known2 = KnownBits::makeConstant(*RHSC); - break; - case CmpInst::Predicate::ICMP_ULE: - Known2.Zero.setHighBits(RHSC->countl_zero()); - break; - case CmpInst::Predicate::ICMP_ULT: - Known2.Zero.setHighBits((*RHSC - 1).countl_zero()); - break; - default: - // TODO - add additional integer predicate handling. - break; - } + // Get the knownbits implied by the incoming phi condition. + auto CR = ConstantRange::makeExactICmpRegion(Pred, *RHSC); + Known2 = CR.toKnownBits(); } } } diff --git a/llvm/test/Analysis/ValueTracking/phi-known-bits.ll b/llvm/test/Analysis/ValueTracking/phi-known-bits.ll --- a/llvm/test/Analysis/ValueTracking/phi-known-bits.ll +++ b/llvm/test/Analysis/ValueTracking/phi-known-bits.ll @@ -7,9 +7,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], -65 ; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] ; CHECK: T: -; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] -; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 64 -; CHECK-NEXT: ret i8 [[R]] +; CHECK-NEXT: ret i8 64 ; CHECK: F: ; CHECK-NEXT: br label [[T]] ; @@ -32,9 +30,7 @@ ; CHECK: T: ; CHECK-NEXT: br label [[F]] ; CHECK: F: -; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[T]] ] -; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 64 -; CHECK-NEXT: ret i8 [[R]] +; CHECK-NEXT: ret i8 64 ; entry: %cmp = icmp ult i8 %x, 192 @@ -76,9 +72,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], -65 ; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] ; CHECK: T: -; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] -; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 64 -; CHECK-NEXT: ret i8 [[R]] +; CHECK-NEXT: ret i8 64 ; CHECK: F: ; CHECK-NEXT: br label [[T]] ; @@ -122,9 +116,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 95 ; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] ; CHECK: T: -; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] -; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 96 -; CHECK-NEXT: ret i8 [[R]] +; CHECK-NEXT: ret i8 96 ; CHECK: F: ; CHECK-NEXT: br label [[T]] ; @@ -168,9 +160,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], -1 ; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] ; CHECK: T: -; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ 0, [[F]] ] -; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], -128 -; CHECK-NEXT: ret i8 [[R]] +; CHECK-NEXT: ret i8 0 ; CHECK: F: ; CHECK-NEXT: br label [[T]] ; @@ -191,9 +181,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 63 ; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] ; CHECK: T: -; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] -; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 64 -; CHECK-NEXT: ret i8 [[R]] +; CHECK-NEXT: ret i8 64 ; CHECK: F: ; CHECK-NEXT: br label [[T]] ; @@ -237,9 +225,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 0 ; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] ; CHECK: T: -; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] -; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], -128 -; CHECK-NEXT: ret i8 [[R]] +; CHECK-NEXT: ret i8 -128 ; CHECK: F: ; CHECK-NEXT: br label [[T]] ; @@ -260,9 +246,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -64 ; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] ; CHECK: T: -; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ 0, [[F]] ] -; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 64 -; CHECK-NEXT: ret i8 [[R]] +; CHECK-NEXT: ret i8 0 ; CHECK: F: ; CHECK-NEXT: br label [[T]] ; @@ -306,9 +290,7 @@ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -64 ; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] ; CHECK: T: -; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ 0, [[F]] ] -; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 64 -; CHECK-NEXT: ret i8 [[R]] +; CHECK-NEXT: ret i8 0 ; CHECK: F: ; CHECK-NEXT: br label [[T]] ; @@ -331,9 +313,7 @@ ; CHECK: T: ; CHECK-NEXT: br label [[F]] ; CHECK: F: -; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[T]] ] -; CHECK-NEXT: [[R:%.*]] = and i8 [[V]], 64 -; CHECK-NEXT: ret i8 [[R]] +; CHECK-NEXT: ret i8 64 ; entry: %cmp = icmp sle i8 %x, 64