reference, declaration → definition definition → references, declarations, derived classes, virtual overrides reference to multiple definitions → definitions unreferenced |
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);