Fix PR7755: knowing something about an inval for a pred

from the LHS should disable reconsidering that pred on the
RHS.  However, knowing something about the pred on the RHS
shouldn't disable subsequent additions on the RHS from
happening.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111349 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-08-18 03:14:36 +00:00
parent c7e31fcf49
commit 2fa7b48eb5
2 changed files with 28 additions and 8 deletions

View File

@ -341,25 +341,21 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
else
InterestingVal = ConstantInt::getFalse(I->getContext());
SmallPtrSet<BasicBlock*, 4> LHSKnownBBs;
// Scan for the sentinel. If we find an undef, force it to the
// interesting value: x|undef -> true and x&undef -> false.
for (unsigned i = 0, e = LHSVals.size(); i != e; ++i)
if (LHSVals[i].first == InterestingVal || LHSVals[i].first == 0) {
Result.push_back(LHSVals[i]);
Result.back().first = InterestingVal;
LHSKnownBBs.insert(LHSVals[i].second);
}
for (unsigned i = 0, e = RHSVals.size(); i != e; ++i)
if (RHSVals[i].first == InterestingVal || RHSVals[i].first == 0) {
// If we already inferred a value for this block on the LHS, don't
// re-add it.
bool HasValue = false;
for (unsigned r = 0, e = Result.size(); r != e; ++r)
if (Result[r].second == RHSVals[i].second) {
HasValue = true;
break;
}
if (!HasValue) {
if (!LHSKnownBBs.count(RHSVals[i].second)) {
Result.push_back(RHSVals[i]);
Result.back().first = InterestingVal;
}

View File

@ -436,4 +436,28 @@ for.cond1040: ; preds = %for.body1044, %for.
ret void
}
; PR7755
define void @test16(i1 %c, i1 %c2, i1 %c3, i1 %c4) nounwind ssp {
entry:
%cmp = icmp sgt i32 undef, 1 ; <i1> [#uses=1]
br i1 %c, label %land.end, label %land.rhs
land.rhs: ; preds = %entry
br i1 %c2, label %lor.lhs.false.i, label %land.end
lor.lhs.false.i: ; preds = %land.rhs
br i1 %c3, label %land.end, label %land.end
land.end:
%0 = phi i1 [ true, %entry ], [ false, %land.rhs ], [false, %lor.lhs.false.i], [false, %lor.lhs.false.i] ; <i1> [#uses=1]
%cmp12 = and i1 %cmp, %0
%xor1 = xor i1 %cmp12, %c4
br i1 %xor1, label %if.then, label %if.end
if.then:
ret void
if.end:
ret void
}