forked from OSchip/llvm-project
Use maximal intersection algorithm exclusively. Fixes miscompile bug.
llvm-svn: 39852
This commit is contained in:
parent
61b4a265ee
commit
39519f5c41
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue