Use maximal intersection algorithm exclusively. Fixes miscompile bug.

llvm-svn: 39852
This commit is contained in:
Nick Lewycky 2007-07-14 04:28:04 +00:00
parent 61b4a265ee
commit 39519f5c41
1 changed files with 11 additions and 11 deletions

View File

@ -938,7 +938,7 @@ namespace {
std::lower_bound(begin(), E, std::make_pair(Subtree, empty), swo); std::lower_bound(begin(), E, std::make_pair(Subtree, empty), swo);
if (I != end() && I->first == Subtree) { if (I != end() && I->first == Subtree) {
ConstantRange CR2 = I->second.intersectWith(CR); ConstantRange CR2 = I->second.maximalIntersectWith(CR);
assert(!CR2.isEmptySet() && !CR2.isSingleElement() && assert(!CR2.isEmptySet() && !CR2.isSingleElement() &&
"Invalid union of ranges."); "Invalid union of ranges.");
I->second = CR2; I->second = CR2;
@ -970,18 +970,18 @@ namespace {
ConstantRange Range(CR.getBitWidth()); ConstantRange Range(CR.getBitWidth());
if (LV_s == SGT_BIT) { if (LV_s == SGT_BIT) {
Range = Range.intersectWith(makeConstantRange( Range = Range.maximalIntersectWith(makeConstantRange(
hasEQ ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_SGT, CR)); hasEQ ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_SGT, CR));
} else if (LV_s == SLT_BIT) { } else if (LV_s == SLT_BIT) {
Range = Range.intersectWith(makeConstantRange( Range = Range.maximalIntersectWith(makeConstantRange(
hasEQ ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_SLT, CR)); hasEQ ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_SLT, CR));
} }
if (LV_u == UGT_BIT) { if (LV_u == UGT_BIT) {
Range = Range.intersectWith(makeConstantRange( Range = Range.maximalIntersectWith(makeConstantRange(
hasEQ ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_UGT, CR)); hasEQ ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_UGT, CR));
} else if (LV_u == ULT_BIT) { } else if (LV_u == ULT_BIT) {
Range = Range.intersectWith(makeConstantRange( Range = Range.maximalIntersectWith(makeConstantRange(
hasEQ ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_ULT, CR)); hasEQ ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_ULT, CR));
} }
@ -1104,7 +1104,7 @@ namespace {
switch (LV) { switch (LV) {
default: assert(!"Impossible lattice value!"); default: assert(!"Impossible lattice value!");
case NE: case NE:
return CR1.intersectWith(CR2).isEmptySet(); return CR1.maximalIntersectWith(CR2).isEmptySet();
case ULT: case ULT:
return CR1.getUnsignedMax().ult(CR2.getUnsignedMin()); return CR1.getUnsignedMax().ult(CR2.getUnsignedMin());
case ULE: case ULE:
@ -1170,7 +1170,7 @@ namespace {
unsigned i = VN.valueNumber(*I, Subtree); unsigned i = VN.valueNumber(*I, Subtree);
ConstantRange CR_Kill = i ? range(i, Subtree) : range(*I); ConstantRange CR_Kill = i ? range(i, Subtree) : range(*I);
if (CR_Kill.isFullSet()) continue; if (CR_Kill.isFullSet()) continue;
Merged = Merged.intersectWith(CR_Kill); Merged = Merged.maximalIntersectWith(CR_Kill);
} }
if (Merged.isFullSet() || Merged == CR_New) return; if (Merged.isFullSet() || Merged == CR_New) return;
@ -1180,7 +1180,7 @@ namespace {
void applyRange(unsigned n, const ConstantRange &CR, void applyRange(unsigned n, const ConstantRange &CR,
DomTreeDFS::Node *Subtree, VRPSolver *VRP) { DomTreeDFS::Node *Subtree, VRPSolver *VRP) {
ConstantRange Merged = CR.intersectWith(range(n, Subtree)); ConstantRange Merged = CR.maximalIntersectWith(range(n, Subtree));
if (Merged.isEmptySet()) { if (Merged.isEmptySet()) {
markBlock(VRP); markBlock(VRP);
return; return;
@ -1270,14 +1270,14 @@ namespace {
ConstantRange CR2 = range(n2, Subtree); ConstantRange CR2 = range(n2, Subtree);
if (!CR1.isSingleElement()) { if (!CR1.isSingleElement()) {
ConstantRange NewCR1 = CR1.intersectWith(create(LV, CR2)); ConstantRange NewCR1 = CR1.maximalIntersectWith(create(LV, CR2));
if (NewCR1 != CR1) if (NewCR1 != CR1)
applyRange(n1, NewCR1, Subtree, VRP); applyRange(n1, NewCR1, Subtree, VRP);
} }
if (!CR2.isSingleElement()) { if (!CR2.isSingleElement()) {
ConstantRange NewCR2 = CR2.intersectWith(create(reversePredicate(LV), ConstantRange NewCR2 = CR2.maximalIntersectWith(
CR1)); create(reversePredicate(LV), CR1));
if (NewCR2 != CR2) if (NewCR2 != CR2)
applyRange(n2, NewCR2, Subtree, VRP); applyRange(n2, NewCR2, Subtree, VRP);
} }