mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
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. llvm-svn: 111349
This commit is contained in:
parent
4c6e9192d1
commit
ab876b6ce8
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user