diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2012-03-05 23:09:40 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2012-03-05 23:09:40 +0000 |
commit | a8b75ac798375e8a75a08cf62e693feaa526d182 (patch) | |
tree | fce2ee0d65f28b72bf963908563c93931ac0e583 | |
parent | 9d96f843b889fcc0a98960eeab55abd4bf4f3220 (diff) | |
download | bcm5719-llvm-a8b75ac798375e8a75a08cf62e693feaa526d182.tar.gz bcm5719-llvm-a8b75ac798375e8a75a08cf62e693feaa526d182.zip |
Make sure we don't return bits outside the mask in ComputeMaskedBits. PR12189.
llvm-svn: 152066
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 4 | ||||
-rw-r--r-- | llvm/test/Transforms/InstSimplify/phi.ll | 22 |
2 files changed, 24 insertions, 2 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index b5811f2e8ae..b35e2074acb 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -691,8 +691,8 @@ void llvm::ComputeMaskedBits(Value *V, const APInt &Mask, if (P->hasConstantValue() == P) break; - KnownZero = APInt::getAllOnesValue(BitWidth); - KnownOne = APInt::getAllOnesValue(BitWidth); + KnownZero = Mask; + KnownOne = Mask; for (unsigned i = 0, e = P->getNumIncomingValues(); i != e; ++i) { // Skip direct self references. if (P->getIncomingValue(i) == P) continue; diff --git a/llvm/test/Transforms/InstSimplify/phi.ll b/llvm/test/Transforms/InstSimplify/phi.ll new file mode 100644 index 00000000000..05cd40d9021 --- /dev/null +++ b/llvm/test/Transforms/InstSimplify/phi.ll @@ -0,0 +1,22 @@ +; RUN: opt < %s -instsimplify -S | FileCheck %s + +; PR12189 +define i1 @test1(i32 %x) { +; CHECK: @test1 + br i1 true, label %a, label %b + +a: + %aa = or i32 %x, 10 + br label %c + +b: + %bb = or i32 %x, 10 + br label %c + +c: + %cc = phi i32 [ %bb, %b ], [%aa, %a ] + %d = urem i32 %cc, 2 + %e = icmp eq i32 %d, 0 + ret i1 %e +; CHECK: ret i1 %e +} |