Lines Matching refs:Ops
609 static void GroupByComplexity(SmallVectorImpl<const SCEV *> &Ops, in GroupByComplexity() argument
611 if (Ops.size() < 2) return; // Noop in GroupByComplexity()
612 if (Ops.size() == 2) { in GroupByComplexity()
615 const SCEV *&LHS = Ops[0], *&RHS = Ops[1]; in GroupByComplexity()
622 std::stable_sort(Ops.begin(), Ops.end(), SCEVComplexityCompare(LI)); in GroupByComplexity()
628 for (unsigned i = 0, e = Ops.size(); i != e-2; ++i) { in GroupByComplexity()
629 const SCEV *S = Ops[i]; in GroupByComplexity()
634 for (unsigned j = i+1; j != e && Ops[j]->getSCEVType() == Complexity; ++j) { in GroupByComplexity()
635 if (Ops[j] == S) { // Found a duplicate. in GroupByComplexity()
637 std::swap(Ops[i+1], Ops[j]); in GroupByComplexity()
1310 SmallVector<const SCEV *, 4> Ops; in getAnyExtendExpr() local
1313 Ops.push_back(getAnyExtendExpr(*I, Ty)); in getAnyExtendExpr()
1314 return getAddRecExpr(Ops, AR->getLoop(), SCEV::FlagNW); in getAnyExtendExpr()
1361 const SCEV *const *Ops, size_t NumOperands, in CollectAddOperandsWithScales() argument
1368 while (const SCEVConstant *C = dyn_cast<SCEVConstant>(Ops[i])) { in CollectAddOperandsWithScales()
1379 const SCEVMulExpr *Mul = dyn_cast<SCEVMulExpr>(Ops[i]); in CollectAddOperandsWithScales()
1409 M.insert(std::make_pair(Ops[i], Scale)); in CollectAddOperandsWithScales()
1434 const SCEV *ScalarEvolution::getAddExpr(SmallVectorImpl<const SCEV *> &Ops, in getAddExpr() argument
1438 assert(!Ops.empty() && "Cannot get empty add!"); in getAddExpr()
1439 if (Ops.size() == 1) return Ops[0]; in getAddExpr()
1441 Type *ETy = getEffectiveSCEVType(Ops[0]->getType()); in getAddExpr()
1442 for (unsigned i = 1, e = Ops.size(); i != e; ++i) in getAddExpr()
1443 assert(getEffectiveSCEVType(Ops[i]->getType()) == ETy && in getAddExpr()
1453 for (SmallVectorImpl<const SCEV *>::const_iterator I = Ops.begin(), in getAddExpr()
1454 E = Ops.end(); I != E; ++I) in getAddExpr()
1463 GroupByComplexity(Ops, LI); in getAddExpr()
1467 if (const SCEVConstant *LHSC = dyn_cast<SCEVConstant>(Ops[0])) { in getAddExpr()
1469 assert(Idx < Ops.size()); in getAddExpr()
1470 while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) { in getAddExpr()
1472 Ops[0] = getConstant(LHSC->getValue()->getValue() + in getAddExpr()
1474 if (Ops.size() == 2) return Ops[0]; in getAddExpr()
1475 Ops.erase(Ops.begin()+1); // Erase the folded element in getAddExpr()
1476 LHSC = cast<SCEVConstant>(Ops[0]); in getAddExpr()
1481 Ops.erase(Ops.begin()); in getAddExpr()
1485 if (Ops.size() == 1) return Ops[0]; in getAddExpr()
1491 Type *Ty = Ops[0]->getType(); in getAddExpr()
1493 for (unsigned i = 0, e = Ops.size(); i != e-1; ++i) in getAddExpr()
1494 if (Ops[i] == Ops[i+1]) { // X + Y + Y --> X + Y*2 in getAddExpr()
1497 while (i+Count != e && Ops[i+Count] == Ops[i]) in getAddExpr()
1501 const SCEV *Mul = getMulExpr(Scale, Ops[i]); in getAddExpr()
1502 if (Ops.size() == Count) in getAddExpr()
1504 Ops[i] = Mul; in getAddExpr()
1505 Ops.erase(Ops.begin()+i+1, Ops.begin()+i+Count); in getAddExpr()
1510 return getAddExpr(Ops, Flags); in getAddExpr()
1516 for (; Idx < Ops.size() && isa<SCEVTruncateExpr>(Ops[Idx]); ++Idx) { in getAddExpr()
1517 const SCEVTruncateExpr *Trunc = cast<SCEVTruncateExpr>(Ops[Idx]); in getAddExpr()
1524 for (unsigned i = 0, e = Ops.size(); i != e; ++i) { in getAddExpr()
1525 if (const SCEVTruncateExpr *T = dyn_cast<SCEVTruncateExpr>(Ops[i])) { in getAddExpr()
1531 } else if (const SCEVConstant *C = dyn_cast<SCEVConstant>(Ops[i])) { in getAddExpr()
1533 } else if (const SCEVMulExpr *M = dyn_cast<SCEVMulExpr>(Ops[i])) { in getAddExpr()
1568 while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scAddExpr) in getAddExpr()
1572 if (Idx < Ops.size()) { in getAddExpr()
1574 while (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(Ops[Idx])) { in getAddExpr()
1577 Ops.erase(Ops.begin()+Idx); in getAddExpr()
1578 Ops.append(Add->op_begin(), Add->op_end()); in getAddExpr()
1586 return getAddExpr(Ops); in getAddExpr()
1590 while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scMulExpr) in getAddExpr()
1595 if (Idx < Ops.size() && isa<SCEVMulExpr>(Ops[Idx])) { in getAddExpr()
1601 Ops.data(), Ops.size(), in getAddExpr()
1611 Ops.clear(); in getAddExpr()
1613 Ops.push_back(getConstant(AccumulatedConstant)); in getAddExpr()
1617 Ops.push_back(getMulExpr(getConstant(I->first), in getAddExpr()
1619 if (Ops.empty()) in getAddExpr()
1621 if (Ops.size() == 1) in getAddExpr()
1622 return Ops[0]; in getAddExpr()
1623 return getAddExpr(Ops); in getAddExpr()
1630 for (; Idx < Ops.size() && isa<SCEVMulExpr>(Ops[Idx]); ++Idx) { in getAddExpr()
1631 const SCEVMulExpr *Mul = cast<SCEVMulExpr>(Ops[Idx]); in getAddExpr()
1636 for (unsigned AddOp = 0, e = Ops.size(); AddOp != e; ++AddOp) in getAddExpr()
1637 if (MulOpSCEV == Ops[AddOp]) { in getAddExpr()
1651 if (Ops.size() == 2) return OuterMul; in getAddExpr()
1653 Ops.erase(Ops.begin()+AddOp); in getAddExpr()
1654 Ops.erase(Ops.begin()+Idx-1); in getAddExpr()
1656 Ops.erase(Ops.begin()+Idx); in getAddExpr()
1657 Ops.erase(Ops.begin()+AddOp-1); in getAddExpr()
1659 Ops.push_back(OuterMul); in getAddExpr()
1660 return getAddExpr(Ops); in getAddExpr()
1665 OtherMulIdx < Ops.size() && isa<SCEVMulExpr>(Ops[OtherMulIdx]); in getAddExpr()
1667 const SCEVMulExpr *OtherMul = cast<SCEVMulExpr>(Ops[OtherMulIdx]); in getAddExpr()
1690 if (Ops.size() == 2) return OuterMul; in getAddExpr()
1691 Ops.erase(Ops.begin()+Idx); in getAddExpr()
1692 Ops.erase(Ops.begin()+OtherMulIdx-1); in getAddExpr()
1693 Ops.push_back(OuterMul); in getAddExpr()
1694 return getAddExpr(Ops); in getAddExpr()
1703 while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scAddRecExpr) in getAddExpr()
1707 for (; Idx < Ops.size() && isa<SCEVAddRecExpr>(Ops[Idx]); ++Idx) { in getAddExpr()
1711 const SCEVAddRecExpr *AddRec = cast<SCEVAddRecExpr>(Ops[Idx]); in getAddExpr()
1713 for (unsigned i = 0, e = Ops.size(); i != e; ++i) in getAddExpr()
1714 if (isLoopInvariant(Ops[i], AddRecLoop)) { in getAddExpr()
1715 LIOps.push_back(Ops[i]); in getAddExpr()
1716 Ops.erase(Ops.begin()+i); in getAddExpr()
1736 if (Ops.size() == 1) return NewRec; in getAddExpr()
1740 if (Ops[i] == AddRec) { in getAddExpr()
1741 Ops[i] = NewRec; in getAddExpr()
1744 return getAddExpr(Ops); in getAddExpr()
1751 OtherIdx < Ops.size() && isa<SCEVAddRecExpr>(Ops[OtherIdx]); in getAddExpr()
1753 if (AddRecLoop == cast<SCEVAddRecExpr>(Ops[OtherIdx])->getLoop()) { in getAddExpr()
1757 for (; OtherIdx != Ops.size() && isa<SCEVAddRecExpr>(Ops[OtherIdx]); in getAddExpr()
1760 dyn_cast<SCEVAddRecExpr>(Ops[OtherIdx])) in getAddExpr()
1772 Ops.erase(Ops.begin() + OtherIdx); --OtherIdx; in getAddExpr()
1775 Ops[Idx] = getAddRecExpr(AddRecOps, AddRecLoop, SCEV::FlagAnyWrap); in getAddExpr()
1776 return getAddExpr(Ops); in getAddExpr()
1787 for (unsigned i = 0, e = Ops.size(); i != e; ++i) in getAddExpr()
1788 ID.AddPointer(Ops[i]); in getAddExpr()
1793 const SCEV **O = SCEVAllocator.Allocate<const SCEV *>(Ops.size()); in getAddExpr()
1794 std::uninitialized_copy(Ops.begin(), Ops.end(), O); in getAddExpr()
1796 O, Ops.size()); in getAddExpr()
1805 const SCEV *ScalarEvolution::getMulExpr(SmallVectorImpl<const SCEV *> &Ops, in getMulExpr() argument
1809 assert(!Ops.empty() && "Cannot get empty mul!"); in getMulExpr()
1810 if (Ops.size() == 1) return Ops[0]; in getMulExpr()
1812 Type *ETy = getEffectiveSCEVType(Ops[0]->getType()); in getMulExpr()
1813 for (unsigned i = 1, e = Ops.size(); i != e; ++i) in getMulExpr()
1814 assert(getEffectiveSCEVType(Ops[i]->getType()) == ETy && in getMulExpr()
1824 for (SmallVectorImpl<const SCEV *>::const_iterator I = Ops.begin(), in getMulExpr()
1825 E = Ops.end(); I != E; ++I) in getMulExpr()
1834 GroupByComplexity(Ops, LI); in getMulExpr()
1838 if (const SCEVConstant *LHSC = dyn_cast<SCEVConstant>(Ops[0])) { in getMulExpr()
1841 if (Ops.size() == 2) in getMulExpr()
1842 if (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(Ops[1])) in getMulExpr()
1849 while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) { in getMulExpr()
1854 Ops[0] = getConstant(Fold); in getMulExpr()
1855 Ops.erase(Ops.begin()+1); // Erase the folded element in getMulExpr()
1856 if (Ops.size() == 1) return Ops[0]; in getMulExpr()
1857 LHSC = cast<SCEVConstant>(Ops[0]); in getMulExpr()
1861 if (cast<SCEVConstant>(Ops[0])->getValue()->equalsInt(1)) { in getMulExpr()
1862 Ops.erase(Ops.begin()); in getMulExpr()
1864 } else if (cast<SCEVConstant>(Ops[0])->getValue()->isZero()) { in getMulExpr()
1866 return Ops[0]; in getMulExpr()
1867 } else if (Ops[0]->isAllOnesValue()) { in getMulExpr()
1870 if (Ops.size() == 2) { in getMulExpr()
1871 if (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(Ops[1])) { in getMulExpr()
1876 const SCEV *Mul = getMulExpr(Ops[0], *I); in getMulExpr()
1884 AddRec = dyn_cast<SCEVAddRecExpr>(Ops[1])) { in getMulExpr()
1889 Operands.push_back(getMulExpr(Ops[0], *I)); in getMulExpr()
1897 if (Ops.size() == 1) in getMulExpr()
1898 return Ops[0]; in getMulExpr()
1902 while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scMulExpr) in getMulExpr()
1906 if (Idx < Ops.size()) { in getMulExpr()
1908 while (const SCEVMulExpr *Mul = dyn_cast<SCEVMulExpr>(Ops[Idx])) { in getMulExpr()
1911 Ops.erase(Ops.begin()+Idx); in getMulExpr()
1912 Ops.append(Mul->op_begin(), Mul->op_end()); in getMulExpr()
1920 return getMulExpr(Ops); in getMulExpr()
1926 while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scAddRecExpr) in getMulExpr()
1930 for (; Idx < Ops.size() && isa<SCEVAddRecExpr>(Ops[Idx]); ++Idx) { in getMulExpr()
1934 const SCEVAddRecExpr *AddRec = cast<SCEVAddRecExpr>(Ops[Idx]); in getMulExpr()
1936 for (unsigned i = 0, e = Ops.size(); i != e; ++i) in getMulExpr()
1937 if (isLoopInvariant(Ops[i], AddRecLoop)) { in getMulExpr()
1938 LIOps.push_back(Ops[i]); in getMulExpr()
1939 Ops.erase(Ops.begin()+i); in getMulExpr()
1961 if (Ops.size() == 1) return NewRec; in getMulExpr()
1965 if (Ops[i] == AddRec) { in getMulExpr()
1966 Ops[i] = NewRec; in getMulExpr()
1969 return getMulExpr(Ops); in getMulExpr()
1976 OtherIdx < Ops.size() && isa<SCEVAddRecExpr>(Ops[OtherIdx]); in getMulExpr()
1978 if (AddRecLoop == cast<SCEVAddRecExpr>(Ops[OtherIdx])->getLoop()) { in getMulExpr()
1981 for (; OtherIdx != Ops.size() && isa<SCEVAddRecExpr>(Ops[OtherIdx]); in getMulExpr()
1984 dyn_cast<SCEVAddRecExpr>(Ops[OtherIdx])) in getMulExpr()
1996 if (Ops.size() == 2) return NewAddRec; in getMulExpr()
1997 Ops[Idx] = AddRec = cast<SCEVAddRecExpr>(NewAddRec); in getMulExpr()
1998 Ops.erase(Ops.begin() + OtherIdx); --OtherIdx; in getMulExpr()
2000 return getMulExpr(Ops); in getMulExpr()
2011 for (unsigned i = 0, e = Ops.size(); i != e; ++i) in getMulExpr()
2012 ID.AddPointer(Ops[i]); in getMulExpr()
2017 const SCEV **O = SCEVAllocator.Allocate<const SCEV *>(Ops.size()); in getMulExpr()
2018 std::uninitialized_copy(Ops.begin(), Ops.end(), O); in getMulExpr()
2020 O, Ops.size()); in getMulExpr()
2261 SmallVector<const SCEV *, 2> Ops; in getSMaxExpr() local
2262 Ops.push_back(LHS); in getSMaxExpr()
2263 Ops.push_back(RHS); in getSMaxExpr()
2264 return getSMaxExpr(Ops); in getSMaxExpr()
2268 ScalarEvolution::getSMaxExpr(SmallVectorImpl<const SCEV *> &Ops) { in getSMaxExpr() argument
2269 assert(!Ops.empty() && "Cannot get empty smax!"); in getSMaxExpr()
2270 if (Ops.size() == 1) return Ops[0]; in getSMaxExpr()
2272 Type *ETy = getEffectiveSCEVType(Ops[0]->getType()); in getSMaxExpr()
2273 for (unsigned i = 1, e = Ops.size(); i != e; ++i) in getSMaxExpr()
2274 assert(getEffectiveSCEVType(Ops[i]->getType()) == ETy && in getSMaxExpr()
2279 GroupByComplexity(Ops, LI); in getSMaxExpr()
2283 if (const SCEVConstant *LHSC = dyn_cast<SCEVConstant>(Ops[0])) { in getSMaxExpr()
2285 assert(Idx < Ops.size()); in getSMaxExpr()
2286 while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) { in getSMaxExpr()
2291 Ops[0] = getConstant(Fold); in getSMaxExpr()
2292 Ops.erase(Ops.begin()+1); // Erase the folded element in getSMaxExpr()
2293 if (Ops.size() == 1) return Ops[0]; in getSMaxExpr()
2294 LHSC = cast<SCEVConstant>(Ops[0]); in getSMaxExpr()
2298 if (cast<SCEVConstant>(Ops[0])->getValue()->isMinValue(true)) { in getSMaxExpr()
2299 Ops.erase(Ops.begin()); in getSMaxExpr()
2301 } else if (cast<SCEVConstant>(Ops[0])->getValue()->isMaxValue(true)) { in getSMaxExpr()
2304 return Ops[0]; in getSMaxExpr()
2307 if (Ops.size() == 1) return Ops[0]; in getSMaxExpr()
2311 while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scSMaxExpr) in getSMaxExpr()
2316 if (Idx < Ops.size()) { in getSMaxExpr()
2318 while (const SCEVSMaxExpr *SMax = dyn_cast<SCEVSMaxExpr>(Ops[Idx])) { in getSMaxExpr()
2319 Ops.erase(Ops.begin()+Idx); in getSMaxExpr()
2320 Ops.append(SMax->op_begin(), SMax->op_end()); in getSMaxExpr()
2325 return getSMaxExpr(Ops); in getSMaxExpr()
2331 for (unsigned i = 0, e = Ops.size()-1; i != e; ++i) in getSMaxExpr()
2334 if (Ops[i] == Ops[i+1] || in getSMaxExpr()
2335 isKnownPredicate(ICmpInst::ICMP_SGE, Ops[i], Ops[i+1])) { in getSMaxExpr()
2336 Ops.erase(Ops.begin()+i+1, Ops.begin()+i+2); in getSMaxExpr()
2338 } else if (isKnownPredicate(ICmpInst::ICMP_SLE, Ops[i], Ops[i+1])) { in getSMaxExpr()
2339 Ops.erase(Ops.begin()+i, Ops.begin()+i+1); in getSMaxExpr()
2343 if (Ops.size() == 1) return Ops[0]; in getSMaxExpr()
2345 assert(!Ops.empty() && "Reduced smax down to nothing!"); in getSMaxExpr()
2351 for (unsigned i = 0, e = Ops.size(); i != e; ++i) in getSMaxExpr()
2352 ID.AddPointer(Ops[i]); in getSMaxExpr()
2355 const SCEV **O = SCEVAllocator.Allocate<const SCEV *>(Ops.size()); in getSMaxExpr()
2356 std::uninitialized_copy(Ops.begin(), Ops.end(), O); in getSMaxExpr()
2358 O, Ops.size()); in getSMaxExpr()
2365 SmallVector<const SCEV *, 2> Ops; in getUMaxExpr() local
2366 Ops.push_back(LHS); in getUMaxExpr()
2367 Ops.push_back(RHS); in getUMaxExpr()
2368 return getUMaxExpr(Ops); in getUMaxExpr()
2372 ScalarEvolution::getUMaxExpr(SmallVectorImpl<const SCEV *> &Ops) { in getUMaxExpr() argument
2373 assert(!Ops.empty() && "Cannot get empty umax!"); in getUMaxExpr()
2374 if (Ops.size() == 1) return Ops[0]; in getUMaxExpr()
2376 Type *ETy = getEffectiveSCEVType(Ops[0]->getType()); in getUMaxExpr()
2377 for (unsigned i = 1, e = Ops.size(); i != e; ++i) in getUMaxExpr()
2378 assert(getEffectiveSCEVType(Ops[i]->getType()) == ETy && in getUMaxExpr()
2383 GroupByComplexity(Ops, LI); in getUMaxExpr()
2387 if (const SCEVConstant *LHSC = dyn_cast<SCEVConstant>(Ops[0])) { in getUMaxExpr()
2389 assert(Idx < Ops.size()); in getUMaxExpr()
2390 while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) { in getUMaxExpr()
2395 Ops[0] = getConstant(Fold); in getUMaxExpr()
2396 Ops.erase(Ops.begin()+1); // Erase the folded element in getUMaxExpr()
2397 if (Ops.size() == 1) return Ops[0]; in getUMaxExpr()
2398 LHSC = cast<SCEVConstant>(Ops[0]); in getUMaxExpr()
2402 if (cast<SCEVConstant>(Ops[0])->getValue()->isMinValue(false)) { in getUMaxExpr()
2403 Ops.erase(Ops.begin()); in getUMaxExpr()
2405 } else if (cast<SCEVConstant>(Ops[0])->getValue()->isMaxValue(false)) { in getUMaxExpr()
2408 return Ops[0]; in getUMaxExpr()
2411 if (Ops.size() == 1) return Ops[0]; in getUMaxExpr()
2415 while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scUMaxExpr) in getUMaxExpr()
2420 if (Idx < Ops.size()) { in getUMaxExpr()
2422 while (const SCEVUMaxExpr *UMax = dyn_cast<SCEVUMaxExpr>(Ops[Idx])) { in getUMaxExpr()
2423 Ops.erase(Ops.begin()+Idx); in getUMaxExpr()
2424 Ops.append(UMax->op_begin(), UMax->op_end()); in getUMaxExpr()
2429 return getUMaxExpr(Ops); in getUMaxExpr()
2435 for (unsigned i = 0, e = Ops.size()-1; i != e; ++i) in getUMaxExpr()
2438 if (Ops[i] == Ops[i+1] || in getUMaxExpr()
2439 isKnownPredicate(ICmpInst::ICMP_UGE, Ops[i], Ops[i+1])) { in getUMaxExpr()
2440 Ops.erase(Ops.begin()+i+1, Ops.begin()+i+2); in getUMaxExpr()
2442 } else if (isKnownPredicate(ICmpInst::ICMP_ULE, Ops[i], Ops[i+1])) { in getUMaxExpr()
2443 Ops.erase(Ops.begin()+i, Ops.begin()+i+1); in getUMaxExpr()
2447 if (Ops.size() == 1) return Ops[0]; in getUMaxExpr()
2449 assert(!Ops.empty() && "Reduced umax down to nothing!"); in getUMaxExpr()
2455 for (unsigned i = 0, e = Ops.size(); i != e; ++i) in getUMaxExpr()
2456 ID.AddPointer(Ops[i]); in getUMaxExpr()
2459 const SCEV **O = SCEVAllocator.Allocate<const SCEV *>(Ops.size()); in getUMaxExpr()
2460 std::uninitialized_copy(Ops.begin(), Ops.end(), O); in getUMaxExpr()
2462 O, Ops.size()); in getUMaxExpr()
2932 SmallVector<const SCEV *, 8> Ops; in createNodeForPHI() local
2935 Ops.push_back(Add->getOperand(i)); in createNodeForPHI()
2936 const SCEV *Accum = getAddExpr(Ops); in createNodeForPHI()