summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2012-03-05 23:09:40 +0000
committerEli Friedman <eli.friedman@gmail.com>2012-03-05 23:09:40 +0000
commita8b75ac798375e8a75a08cf62e693feaa526d182 (patch)
treefce2ee0d65f28b72bf963908563c93931ac0e583
parent9d96f843b889fcc0a98960eeab55abd4bf4f3220 (diff)
downloadbcm5719-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.cpp4
-rw-r--r--llvm/test/Transforms/InstSimplify/phi.ll22
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
+}
OpenPOWER on IntegriCloud