reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced

References

lib/Analysis/ScalarEvolution.cpp
 2411   assert(!Ops.empty() && "Cannot get empty add!");
 2412   if (Ops.size() == 1) return Ops[0];
 2412   if (Ops.size() == 1) return Ops[0];
 2414   Type *ETy = getEffectiveSCEVType(Ops[0]->getType());
 2415   for (unsigned i = 1, e = Ops.size(); i != e; ++i)
 2416     assert(getEffectiveSCEVType(Ops[i]->getType()) == ETy &&
 2421   GroupByComplexity(Ops, &LI, DT);
 2423   Flags = StrengthenNoWrapFlags(this, scAddExpr, Ops, Flags);
 2427   if (const SCEVConstant *LHSC = dyn_cast<SCEVConstant>(Ops[0])) {
 2429     assert(Idx < Ops.size());
 2430     while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) {
 2432       Ops[0] = getConstant(LHSC->getAPInt() + RHSC->getAPInt());
 2433       if (Ops.size() == 2) return Ops[0];
 2433       if (Ops.size() == 2) return Ops[0];
 2434       Ops.erase(Ops.begin()+1);  // Erase the folded element
 2434       Ops.erase(Ops.begin()+1);  // Erase the folded element
 2435       LHSC = cast<SCEVConstant>(Ops[0]);
 2440       Ops.erase(Ops.begin());
 2440       Ops.erase(Ops.begin());
 2444     if (Ops.size() == 1) return Ops[0];
 2444     if (Ops.size() == 1) return Ops[0];
 2448   if (Depth > MaxArithDepth || hasHugeExpression(Ops))
 2449     return getOrCreateAddExpr(Ops, Flags);
 2454   Type *Ty = Ops[0]->getType();
 2456   for (unsigned i = 0, e = Ops.size(); i != e-1; ++i)
 2457     if (Ops[i] == Ops[i+1]) {      //  X + Y + Y  -->  X + Y*2
 2457     if (Ops[i] == Ops[i+1]) {      //  X + Y + Y  -->  X + Y*2
 2460       while (i+Count != e && Ops[i+Count] == Ops[i])
 2460       while (i+Count != e && Ops[i+Count] == Ops[i])
 2464       const SCEV *Mul = getMulExpr(Scale, Ops[i], SCEV::FlagAnyWrap, Depth + 1);
 2465       if (Ops.size() == Count)
 2467       Ops[i] = Mul;
 2468       Ops.erase(Ops.begin()+i+1, Ops.begin()+i+Count);
 2468       Ops.erase(Ops.begin()+i+1, Ops.begin()+i+Count);
 2468       Ops.erase(Ops.begin()+i+1, Ops.begin()+i+Count);
 2473     return getAddExpr(Ops, Flags, Depth + 1);
 2484     if (auto *T = dyn_cast<SCEVTruncateExpr>(Ops[Idx]))
 2486     if (const auto *Mul = dyn_cast<SCEVMulExpr>(Ops[Idx])) {
 2498     for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
 2499       if (const SCEVTruncateExpr *T = dyn_cast<SCEVTruncateExpr>(Ops[i])) {
 2505       } else if (const SCEVConstant *C = dyn_cast<SCEVConstant>(Ops[i])) {
 2507       } else if (const SCEVMulExpr *M = dyn_cast<SCEVMulExpr>(Ops[i])) {
 2541   while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scAddExpr)
 2541   while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scAddExpr)
 2545   if (Idx < Ops.size()) {
 2547     while (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(Ops[Idx])) {
 2548       if (Ops.size() > AddOpsInlineThreshold ||
 2553       Ops.erase(Ops.begin()+Idx);
 2553       Ops.erase(Ops.begin()+Idx);
 2554       Ops.append(Add->op_begin(), Add->op_end());
 2562       return getAddExpr(Ops, SCEV::FlagAnyWrap, Depth + 1);
 2566   while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scMulExpr)
 2566   while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scMulExpr)
 2571   if (Idx < Ops.size() && isa<SCEVMulExpr>(Ops[Idx])) {
 2571   if (Idx < Ops.size() && isa<SCEVMulExpr>(Ops[Idx])) {
 2577                                      Ops.data(), Ops.size(),
 2577                                      Ops.data(), Ops.size(),
 2592       Ops.clear();
 2594         Ops.push_back(getConstant(AccumulatedConstant));
 2597           Ops.push_back(getMulExpr(
 2601       if (Ops.empty())
 2603       if (Ops.size() == 1)
 2604         return Ops[0];
 2605       return getAddExpr(Ops, SCEV::FlagAnyWrap, Depth + 1);
 2612   for (; Idx < Ops.size() && isa<SCEVMulExpr>(Ops[Idx]); ++Idx) {
 2612   for (; Idx < Ops.size() && isa<SCEVMulExpr>(Ops[Idx]); ++Idx) {
 2613     const SCEVMulExpr *Mul = cast<SCEVMulExpr>(Ops[Idx]);
 2618       for (unsigned AddOp = 0, e = Ops.size(); AddOp != e; ++AddOp)
 2619         if (MulOpSCEV == Ops[AddOp]) {
 2634           if (Ops.size() == 2) return OuterMul;
 2636             Ops.erase(Ops.begin()+AddOp);
 2636             Ops.erase(Ops.begin()+AddOp);
 2637             Ops.erase(Ops.begin()+Idx-1);
 2637             Ops.erase(Ops.begin()+Idx-1);
 2639             Ops.erase(Ops.begin()+Idx);
 2639             Ops.erase(Ops.begin()+Idx);
 2640             Ops.erase(Ops.begin()+AddOp-1);
 2640             Ops.erase(Ops.begin()+AddOp-1);
 2642           Ops.push_back(OuterMul);
 2643           return getAddExpr(Ops, SCEV::FlagAnyWrap, Depth + 1);
 2648            OtherMulIdx < Ops.size() && isa<SCEVMulExpr>(Ops[OtherMulIdx]);
 2648            OtherMulIdx < Ops.size() && isa<SCEVMulExpr>(Ops[OtherMulIdx]);
 2650         const SCEVMulExpr *OtherMul = cast<SCEVMulExpr>(Ops[OtherMulIdx]);
 2676             if (Ops.size() == 2) return OuterMul;
 2677             Ops.erase(Ops.begin()+Idx);
 2677             Ops.erase(Ops.begin()+Idx);
 2678             Ops.erase(Ops.begin()+OtherMulIdx-1);
 2678             Ops.erase(Ops.begin()+OtherMulIdx-1);
 2679             Ops.push_back(OuterMul);
 2680             return getAddExpr(Ops, SCEV::FlagAnyWrap, Depth + 1);
 2689   while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scAddRecExpr)
 2689   while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scAddRecExpr)
 2693   for (; Idx < Ops.size() && isa<SCEVAddRecExpr>(Ops[Idx]); ++Idx) {
 2693   for (; Idx < Ops.size() && isa<SCEVAddRecExpr>(Ops[Idx]); ++Idx) {
 2697     const SCEVAddRecExpr *AddRec = cast<SCEVAddRecExpr>(Ops[Idx]);
 2699     for (unsigned i = 0, e = Ops.size(); i != e; ++i)
 2700       if (isAvailableAtLoopEntry(Ops[i], AddRecLoop)) {
 2701         LIOps.push_back(Ops[i]);
 2702         Ops.erase(Ops.begin()+i);
 2702         Ops.erase(Ops.begin()+i);
 2725       if (Ops.size() == 1) return NewRec;
 2729         if (Ops[i] == AddRec) {
 2730           Ops[i] = NewRec;
 2733       return getAddExpr(Ops, SCEV::FlagAnyWrap, Depth + 1);
 2740          OtherIdx < Ops.size() && isa<SCEVAddRecExpr>(Ops[OtherIdx]);
 2740          OtherIdx < Ops.size() && isa<SCEVAddRecExpr>(Ops[OtherIdx]);
 2745            cast<SCEVAddRecExpr>(Ops[OtherIdx])->getLoop()->getHeader(),
 2748       if (AddRecLoop == cast<SCEVAddRecExpr>(Ops[OtherIdx])->getLoop()) {
 2752         for (; OtherIdx != Ops.size() && isa<SCEVAddRecExpr>(Ops[OtherIdx]);
 2752         for (; OtherIdx != Ops.size() && isa<SCEVAddRecExpr>(Ops[OtherIdx]);
 2754           const auto *OtherAddRec = cast<SCEVAddRecExpr>(Ops[OtherIdx]);
 2767             Ops.erase(Ops.begin() + OtherIdx); --OtherIdx;
 2767             Ops.erase(Ops.begin() + OtherIdx); --OtherIdx;
 2771         Ops[Idx] = getAddRecExpr(AddRecOps, AddRecLoop, SCEV::FlagAnyWrap);
 2772         return getAddExpr(Ops, SCEV::FlagAnyWrap, Depth + 1);
 2782   return getOrCreateAddExpr(Ops, Flags);