From: Nick Lewycky Date: Sat, 14 Jul 2007 04:28:04 +0000 (+0000) Subject: Use maximal intersection algorithm exclusively. Fixes miscompile bug. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=a73d11efd435cfa5ab275400c9881724f9224ca0;p=oota-llvm.git Use maximal intersection algorithm exclusively. Fixes miscompile bug. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@39852 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/PredicateSimplifier.cpp b/lib/Transforms/Scalar/PredicateSimplifier.cpp index 7b0a413f506..cea218a8e33 100644 --- a/lib/Transforms/Scalar/PredicateSimplifier.cpp +++ b/lib/Transforms/Scalar/PredicateSimplifier.cpp @@ -938,7 +938,7 @@ namespace { std::lower_bound(begin(), E, std::make_pair(Subtree, empty), swo); if (I != end() && I->first == Subtree) { - ConstantRange CR2 = I->second.intersectWith(CR); + ConstantRange CR2 = I->second.maximalIntersectWith(CR); assert(!CR2.isEmptySet() && !CR2.isSingleElement() && "Invalid union of ranges."); I->second = CR2; @@ -970,18 +970,18 @@ namespace { ConstantRange Range(CR.getBitWidth()); if (LV_s == SGT_BIT) { - Range = Range.intersectWith(makeConstantRange( + Range = Range.maximalIntersectWith(makeConstantRange( hasEQ ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_SGT, CR)); } else if (LV_s == SLT_BIT) { - Range = Range.intersectWith(makeConstantRange( + Range = Range.maximalIntersectWith(makeConstantRange( hasEQ ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_SLT, CR)); } if (LV_u == UGT_BIT) { - Range = Range.intersectWith(makeConstantRange( + Range = Range.maximalIntersectWith(makeConstantRange( hasEQ ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_UGT, CR)); } else if (LV_u == ULT_BIT) { - Range = Range.intersectWith(makeConstantRange( + Range = Range.maximalIntersectWith(makeConstantRange( hasEQ ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_ULT, CR)); } @@ -1104,7 +1104,7 @@ namespace { switch (LV) { default: assert(!"Impossible lattice value!"); case NE: - return CR1.intersectWith(CR2).isEmptySet(); + return CR1.maximalIntersectWith(CR2).isEmptySet(); case ULT: return CR1.getUnsignedMax().ult(CR2.getUnsignedMin()); case ULE: @@ -1170,7 +1170,7 @@ namespace { unsigned i = VN.valueNumber(*I, Subtree); ConstantRange CR_Kill = i ? range(i, Subtree) : range(*I); if (CR_Kill.isFullSet()) continue; - Merged = Merged.intersectWith(CR_Kill); + Merged = Merged.maximalIntersectWith(CR_Kill); } if (Merged.isFullSet() || Merged == CR_New) return; @@ -1180,7 +1180,7 @@ namespace { void applyRange(unsigned n, const ConstantRange &CR, DomTreeDFS::Node *Subtree, VRPSolver *VRP) { - ConstantRange Merged = CR.intersectWith(range(n, Subtree)); + ConstantRange Merged = CR.maximalIntersectWith(range(n, Subtree)); if (Merged.isEmptySet()) { markBlock(VRP); return; @@ -1270,14 +1270,14 @@ namespace { ConstantRange CR2 = range(n2, Subtree); if (!CR1.isSingleElement()) { - ConstantRange NewCR1 = CR1.intersectWith(create(LV, CR2)); + ConstantRange NewCR1 = CR1.maximalIntersectWith(create(LV, CR2)); if (NewCR1 != CR1) applyRange(n1, NewCR1, Subtree, VRP); } if (!CR2.isSingleElement()) { - ConstantRange NewCR2 = CR2.intersectWith(create(reversePredicate(LV), - CR1)); + ConstantRange NewCR2 = CR2.maximalIntersectWith( + create(reversePredicate(LV), CR1)); if (NewCR2 != CR2) applyRange(n2, NewCR2, Subtree, VRP); }