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 @@ -1457,12 +1457,12 @@ // Ok, we have a PHI of the form L op= R. Check for low // zero bits. RecQ.CxtI = RInst; - computeKnownBits(R, Known2, Depth + 1, RecQ); + computeKnownBits(R, DemandedElts, Known2, Depth + 1, RecQ); // We need to take the minimum number of known bits KnownBits Known3(BitWidth); RecQ.CxtI = LInst; - computeKnownBits(L, Known3, Depth + 1, RecQ); + computeKnownBits(L, DemandedElts, Known3, Depth + 1, RecQ); Known.Zero.setLowBits(std::min(Known2.countMinTrailingZeros(), Known3.countMinTrailingZeros())); diff --git a/llvm/test/Transforms/InstCombine/phi-known-bits-demandedelts.ll b/llvm/test/Transforms/InstCombine/phi-known-bits-demandedelts.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/phi-known-bits-demandedelts.ll @@ -0,0 +1,43 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -instcombine -S < %s | FileCheck %s + +declare void @foo4x32(<4 x i32>) + +define i1 @test(i32 %count) { +; CHECK-LABEL: @test( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[BODY:%.*]] +; CHECK: body: +; CHECK-NEXT: call void @foo4x32(<4 x i32> ) +; CHECK-NEXT: br i1 true, label [[TAKEN:%.*]], label [[NOTTAKEN:%.*]] +; CHECK: taken: +; CHECK-NEXT: ret i1 true +; CHECK: nottaken: +; CHECK-NEXT: br i1 undef, label [[END:%.*]], label [[BODY]] +; CHECK: end: +; CHECK-NEXT: ret i1 false +; +entry: + br label %body + +body: + %index = phi i32 [ 0, %entry ], [ %index.next, %nottaken ] + %vec.ind = phi <4 x i32> [ , %entry ], [ %vec.ind.next, %nottaken ] + call void @foo4x32(<4 x i32> %vec.ind) + %a = extractelement <4 x i32> %vec.ind, i32 0 + %b = and i32 %a, 3 + %cmp1 = icmp eq i32 %b, 0 ;; should be always true + br i1 %cmp1, label %taken, label %nottaken + +taken: + ret i1 true + +nottaken: + %index.next = add i32 %index, 4 + %vec.ind.next = add <4 x i32> %vec.ind, + %cmp2 = icmp eq i32 %index.next, %count + br i1 %cmp2, label %end, label %body + +end: + ret i1 false +}