Lines Matching refs:SE

130   auto &SE = FAM.getResult<ScalarEvolutionAnalysis>(F);  in run()  local
132 return DependenceInfo(&F, &AA, &SE, &LI); in run()
158 auto &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE(); in runOnFunction() local
160 info.reset(new DependenceInfo(&F, &AA, &SE, &LI)); in runOnFunction()
180 ScalarEvolution &SE, bool NormalizeResults) { in dumpExampleDependence() argument
192 if (NormalizeResults && D->normalize(&SE)) in dumpExampleDependence()
303 bool FullDependence::normalize(ScalarEvolution *SE) { in normalize() argument
323 SE->getNegativeSCEV(DV[Level - 1].Distance); in normalize()
429 return SE->getNegativeSCEV(C); in getD()
460 A = SE->getOne(D->getType()); in setDistance()
461 B = SE->getNegativeSCEV(A); in setDistance()
462 C = SE->getNegativeSCEV(D); in setDistance()
469 SE = NewSE; in setAny()
549 const SCEV *Prod1 = SE->getMulExpr(X->getA(), Y->getB()); in intersectConstraints()
550 const SCEV *Prod2 = SE->getMulExpr(X->getB(), Y->getA()); in intersectConstraints()
554 Prod1 = SE->getMulExpr(X->getC(), Y->getB()); in intersectConstraints()
555 Prod2 = SE->getMulExpr(X->getB(), Y->getC()); in intersectConstraints()
568 const SCEV *C1B2 = SE->getMulExpr(X->getC(), Y->getB()); in intersectConstraints()
569 const SCEV *C1A2 = SE->getMulExpr(X->getC(), Y->getA()); in intersectConstraints()
570 const SCEV *C2B1 = SE->getMulExpr(Y->getC(), X->getB()); in intersectConstraints()
571 const SCEV *C2A1 = SE->getMulExpr(Y->getC(), X->getA()); in intersectConstraints()
572 const SCEV *A1B2 = SE->getMulExpr(X->getA(), Y->getB()); in intersectConstraints()
573 const SCEV *A2B1 = SE->getMulExpr(Y->getA(), X->getB()); in intersectConstraints()
575 dyn_cast<SCEVConstant>(SE->getMinusSCEV(C1A2, C2A1)); in intersectConstraints()
577 dyn_cast<SCEVConstant>(SE->getMinusSCEV(C1B2, C2B1)); in intersectConstraints()
579 dyn_cast<SCEVConstant>(SE->getMinusSCEV(A1B2, A2B1)); in intersectConstraints()
581 dyn_cast<SCEVConstant>(SE->getMinusSCEV(A2B1, A1B2)); in intersectConstraints()
620 X->setPoint(SE->getConstant(Xq), in intersectConstraints()
621 SE->getConstant(Yq), in intersectConstraints()
634 const SCEV *A1X1 = SE->getMulExpr(Y->getA(), X->getX()); in intersectConstraints()
635 const SCEV *B1Y1 = SE->getMulExpr(Y->getB(), X->getY()); in intersectConstraints()
636 const SCEV *Sum = SE->getAddExpr(A1X1, B1Y1); in intersectConstraints()
869 return SE->isLoopInvariant(Expression, LoopNest->getOutermostLoop()); in isLoopInvariant()
881 if (Level <= CommonLevels && !SE->isLoopInvariant(Expression, LoopNest)) in collectCommonLoops()
932 Pair->Src = SE->getSignExtendExpr(Src, widestType); in unifySubscriptType()
935 Pair->Dst = SE->getSignExtendExpr(Dst, widestType); in unifySubscriptType()
980 const SCEV *Step = AddRec->getStepRecurrence(*SE); in checkSubscript()
981 const SCEV *UB = SE->getBackedgeTakenCount(AddRec->getLoop()); in checkSubscript()
983 if (SE->getTypeSizeInBits(Start->getType()) < in checkSubscript()
984 SE->getTypeSizeInBits(UB->getType())) { in checkSubscript()
1069 if (SE->isKnownPredicate(Pred, X, Y)) in isKnownPredicate()
1076 const SCEV *Delta = SE->getMinusSCEV(X, Y); in isKnownPredicate()
1081 return SE->isKnownNonZero(Delta); in isKnownPredicate()
1083 return SE->isKnownNonNegative(Delta); in isKnownPredicate()
1085 return SE->isKnownNonPositive(Delta); in isKnownPredicate()
1087 return SE->isKnownPositive(Delta); in isKnownPredicate()
1089 return SE->isKnownNegative(Delta); in isKnownPredicate()
1106 S = SE->getTruncateOrZeroExtend(S, MaxType); in isKnownLessThan()
1107 Size = SE->getTruncateOrZeroExtend(Size, MaxType); in isKnownLessThan()
1110 const SCEV *Bound = SE->getMinusSCEV(S, Size); in isKnownLessThan()
1113 const SCEV *BECount = SE->getBackedgeTakenCount(AddRec->getLoop()); in isKnownLessThan()
1115 const SCEV *Limit = AddRec->evaluateAtIteration(BECount, *SE); in isKnownLessThan()
1116 if (SE->isKnownNegative(Limit)) in isKnownLessThan()
1124 SE->getMinusSCEV(S, SE->getSMaxExpr(Size, SE->getOne(Size->getType()))); in isKnownLessThan()
1125 return SE->isKnownNegative(LimitedBound); in isKnownLessThan()
1137 if (SE->isKnownNonNegative(AddRec->getStart()) && in isKnownNonNegative()
1138 SE->isKnownNonNegative(AddRec->getOperand(1))) in isKnownNonNegative()
1144 return SE->isKnownNonNegative(S); in isKnownNonNegative()
1155 if (SE->hasLoopInvariantBackedgeTakenCount(L)) { in collectUpperBound()
1156 const SCEV *UB = SE->getBackedgeTakenCount(L); in collectUpperBound()
1157 return SE->getTruncateOrZeroExtend(UB, T); in collectUpperBound()
1245 const SCEV *Delta = SE->getMinusSCEV(SrcConst, DstConst); in strongSIVtest()
1254 SE->isKnownNonNegative(Delta) ? Delta : SE->getNegativeSCEV(Delta); in strongSIVtest()
1256 SE->isKnownNonNegative(Coeff) ? Coeff : SE->getNegativeSCEV(Coeff); in strongSIVtest()
1257 const SCEV *Product = SE->getMulExpr(UpperBound, AbsCoeff); in strongSIVtest()
1282 Result.DV[Level].Distance = SE->getConstant(Distance); in strongSIVtest()
1283 NewConstraint.setDistance(SE->getConstant(Distance), CurLoop); in strongSIVtest()
1308 SE->getNegativeSCEV(Coeff), in strongSIVtest()
1309 SE->getNegativeSCEV(Delta), CurLoop); in strongSIVtest()
1313 bool DeltaMaybeZero = !SE->isKnownNonZero(Delta); in strongSIVtest()
1314 bool DeltaMaybePositive = !SE->isKnownNonPositive(Delta); in strongSIVtest()
1315 bool DeltaMaybeNegative = !SE->isKnownNonNegative(Delta); in strongSIVtest()
1316 bool CoeffMaybePositive = !SE->isKnownNonPositive(Coeff); in strongSIVtest()
1317 bool CoeffMaybeNegative = !SE->isKnownNonNegative(Coeff); in strongSIVtest()
1378 const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst); in weakCrossingSIVtest()
1397 if (SE->isKnownNegative(ConstCoeff)) { in weakCrossingSIVtest()
1398 ConstCoeff = dyn_cast<SCEVConstant>(SE->getNegativeSCEV(ConstCoeff)); in weakCrossingSIVtest()
1401 Delta = SE->getNegativeSCEV(Delta); in weakCrossingSIVtest()
1403 assert(SE->isKnownPositive(ConstCoeff) && "ConstCoeff should be positive"); in weakCrossingSIVtest()
1406 SplitIter = SE->getUDivExpr( in weakCrossingSIVtest()
1407 SE->getSMaxExpr(SE->getZero(Delta->getType()), Delta), in weakCrossingSIVtest()
1408 SE->getMulExpr(SE->getConstant(Delta->getType(), 2), ConstCoeff)); in weakCrossingSIVtest()
1419 if (SE->isKnownNegative(Delta)) { in weakCrossingSIVtest()
1430 const SCEV *ConstantTwo = SE->getConstant(UpperBound->getType(), 2); in weakCrossingSIVtest()
1431 const SCEV *ML = SE->getMulExpr(SE->getMulExpr(ConstCoeff, UpperBound), in weakCrossingSIVtest()
1450 Result.DV[Level].Distance = SE->getZero(Delta->getType()); in weakCrossingSIVtest()
1580 const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst); in exactSIVtest()
1582 NewConstraint.setLine(SrcCoeff, SE->getNegativeSCEV(DstCoeff), Delta, in exactSIVtest()
1776 const SCEV *Delta = SE->getMinusSCEV(SrcConst, DstConst); in weakZeroSrcSIVtest()
1777 NewConstraint.setLine(SE->getZero(Delta->getType()), DstCoeff, Delta, in weakZeroSrcSIVtest()
1792 SE->isKnownNegative(ConstCoeff) ? in weakZeroSrcSIVtest()
1793 SE->getNegativeSCEV(ConstCoeff) : ConstCoeff; in weakZeroSrcSIVtest()
1795 SE->isKnownNegative(ConstCoeff) ? SE->getNegativeSCEV(Delta) : Delta; in weakZeroSrcSIVtest()
1801 const SCEV *Product = SE->getMulExpr(AbsCoeff, UpperBound); in weakZeroSrcSIVtest()
1820 if (SE->isKnownNegative(NewDelta)) { in weakZeroSrcSIVtest()
1885 const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst); in weakZeroDstSIVtest()
1886 NewConstraint.setLine(SrcCoeff, SE->getZero(Delta->getType()), Delta, in weakZeroDstSIVtest()
1901 SE->isKnownNegative(ConstCoeff) ? in weakZeroDstSIVtest()
1902 SE->getNegativeSCEV(ConstCoeff) : ConstCoeff; in weakZeroDstSIVtest()
1904 SE->isKnownNegative(ConstCoeff) ? SE->getNegativeSCEV(Delta) : Delta; in weakZeroDstSIVtest()
1910 const SCEV *Product = SE->getMulExpr(AbsCoeff, UpperBound); in weakZeroDstSIVtest()
1929 if (SE->isKnownNegative(NewDelta)) { in weakZeroDstSIVtest()
1965 const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst); in exactRDIVtest()
2126 const SCEV *C2_C1 = SE->getMinusSCEV(C2, C1); in symbolicRDIVtest()
2127 const SCEV *C1_C2 = SE->getMinusSCEV(C1, C2); in symbolicRDIVtest()
2130 if (SE->isKnownNonNegative(A1)) { in symbolicRDIVtest()
2131 if (SE->isKnownNonNegative(A2)) { in symbolicRDIVtest()
2135 const SCEV *A1N1 = SE->getMulExpr(A1, N1); in symbolicRDIVtest()
2144 const SCEV *A2N2 = SE->getMulExpr(A2, N2); in symbolicRDIVtest()
2152 else if (SE->isKnownNonPositive(A2)) { in symbolicRDIVtest()
2156 const SCEV *A1N1 = SE->getMulExpr(A1, N1); in symbolicRDIVtest()
2157 const SCEV *A2N2 = SE->getMulExpr(A2, N2); in symbolicRDIVtest()
2158 const SCEV *A1N1_A2N2 = SE->getMinusSCEV(A1N1, A2N2); in symbolicRDIVtest()
2166 if (SE->isKnownNegative(C2_C1)) { in symbolicRDIVtest()
2172 else if (SE->isKnownNonPositive(A1)) { in symbolicRDIVtest()
2173 if (SE->isKnownNonNegative(A2)) { in symbolicRDIVtest()
2177 const SCEV *A1N1 = SE->getMulExpr(A1, N1); in symbolicRDIVtest()
2178 const SCEV *A2N2 = SE->getMulExpr(A2, N2); in symbolicRDIVtest()
2179 const SCEV *A1N1_A2N2 = SE->getMinusSCEV(A1N1, A2N2); in symbolicRDIVtest()
2187 if (SE->isKnownPositive(C2_C1)) { in symbolicRDIVtest()
2192 else if (SE->isKnownNonPositive(A2)) { in symbolicRDIVtest()
2196 const SCEV *A1N1 = SE->getMulExpr(A1, N1); in symbolicRDIVtest()
2205 const SCEV *A2N2 = SE->getMulExpr(A2, N2); in symbolicRDIVtest()
2236 const SCEV *SrcCoeff = SrcAddRec->getStepRecurrence(*SE); in testSIV()
2237 const SCEV *DstCoeff = DstAddRec->getStepRecurrence(*SE); in testSIV()
2246 else if (SrcCoeff == SE->getNegativeSCEV(DstCoeff)) in testSIV()
2258 const SCEV *SrcCoeff = SrcAddRec->getStepRecurrence(*SE); in testSIV()
2268 const SCEV *DstCoeff = DstAddRec->getStepRecurrence(*SE); in testSIV()
2312 SrcCoeff = SrcAddRec->getStepRecurrence(*SE); in testRDIV()
2315 DstCoeff = DstAddRec->getStepRecurrence(*SE); in testRDIV()
2322 SrcCoeff = tmpAddRec->getStepRecurrence(*SE); in testRDIV()
2325 DstCoeff = SE->getNegativeSCEV(SrcAddRec->getStepRecurrence(*SE)); in testRDIV()
2335 DstCoeff = tmpAddRec->getStepRecurrence(*SE); in testRDIV()
2338 SrcCoeff = SE->getNegativeSCEV(DstAddRec->getStepRecurrence(*SE)); in testRDIV()
2406 unsigned BitWidth = SE->getTypeSizeInBits(Src->getType()); in gcdMIVtest()
2416 const SCEV *Coeff = AddRec->getStepRecurrence(*SE); in gcdMIVtest()
2435 const SCEV *Coeff = AddRec->getStepRecurrence(*SE); in gcdMIVtest()
2448 const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst); in gcdMIVtest()
2508 const SCEV *SrcCoeff = AddRec->getStepRecurrence(*SE); in gcdMIVtest()
2509 const SCEV *DstCoeff = SE->getMinusSCEV(SrcCoeff, SrcCoeff); in gcdMIVtest()
2513 const SCEV *Coeff = AddRec->getStepRecurrence(*SE); in gcdMIVtest()
2530 const SCEV *Coeff = AddRec->getStepRecurrence(*SE); in gcdMIVtest()
2544 Delta = SE->getMinusSCEV(SrcCoeff, DstCoeff); in gcdMIVtest()
2617 const SCEV *Delta = SE->getMinusSCEV(B0, A0); in banerjeeMIVtest()
2837 SE->getMulExpr(SE->getMinusSCEV(A[K].NegPart, B[K].PosPart), in findBoundsALL()
2840 SE->getMulExpr(SE->getMinusSCEV(A[K].PosPart, B[K].NegPart), in findBoundsALL()
2847 SE->getZero(A[K].Coeff->getType()); in findBoundsALL()
2850 SE->getZero(A[K].Coeff->getType()); in findBoundsALL()
2875 const SCEV *Delta = SE->getMinusSCEV(A[K].Coeff, B[K].Coeff); in findBoundsEQ()
2878 SE->getMulExpr(NegativePart, Bound[K].Iterations); in findBoundsEQ()
2881 SE->getMulExpr(PositivePart, Bound[K].Iterations); in findBoundsEQ()
2886 const SCEV *Delta = SE->getMinusSCEV(A[K].Coeff, B[K].Coeff); in findBoundsEQ()
2915 const SCEV *Iter_1 = SE->getMinusSCEV( in findBoundsLT()
2916 Bound[K].Iterations, SE->getOne(Bound[K].Iterations->getType())); in findBoundsLT()
2918 getNegativePart(SE->getMinusSCEV(A[K].NegPart, B[K].Coeff)); in findBoundsLT()
2920 SE->getMinusSCEV(SE->getMulExpr(NegPart, Iter_1), B[K].Coeff); in findBoundsLT()
2922 getPositivePart(SE->getMinusSCEV(A[K].PosPart, B[K].Coeff)); in findBoundsLT()
2924 SE->getMinusSCEV(SE->getMulExpr(PosPart, Iter_1), B[K].Coeff); in findBoundsLT()
2930 getNegativePart(SE->getMinusSCEV(A[K].NegPart, B[K].Coeff)); in findBoundsLT()
2932 Bound[K].Lower[Dependence::DVEntry::LT] = SE->getNegativeSCEV(B[K].Coeff); in findBoundsLT()
2934 getPositivePart(SE->getMinusSCEV(A[K].PosPart, B[K].Coeff)); in findBoundsLT()
2936 Bound[K].Upper[Dependence::DVEntry::LT] = SE->getNegativeSCEV(B[K].Coeff); in findBoundsLT()
2959 const SCEV *Iter_1 = SE->getMinusSCEV( in findBoundsGT()
2960 Bound[K].Iterations, SE->getOne(Bound[K].Iterations->getType())); in findBoundsGT()
2962 getNegativePart(SE->getMinusSCEV(A[K].Coeff, B[K].PosPart)); in findBoundsGT()
2964 SE->getAddExpr(SE->getMulExpr(NegPart, Iter_1), A[K].Coeff); in findBoundsGT()
2966 getPositivePart(SE->getMinusSCEV(A[K].Coeff, B[K].NegPart)); in findBoundsGT()
2968 SE->getAddExpr(SE->getMulExpr(PosPart, Iter_1), A[K].Coeff); in findBoundsGT()
2973 const SCEV *NegPart = getNegativePart(SE->getMinusSCEV(A[K].Coeff, B[K].PosPart)); in findBoundsGT()
2976 const SCEV *PosPart = getPositivePart(SE->getMinusSCEV(A[K].Coeff, B[K].NegPart)); in findBoundsGT()
2985 return SE->getSMaxExpr(X, SE->getZero(X->getType())); in getPositivePart()
2991 return SE->getSMinExpr(X, SE->getZero(X->getType())); in getNegativePart()
3001 const SCEV *Zero = SE->getZero(Subscript->getType()); in collectCoeffInfo()
3012 CI[K].Coeff = AddRec->getStepRecurrence(*SE); in collectCoeffInfo()
3048 Sum = SE->getAddExpr(Sum, Bound[K].Lower[Bound[K].Direction]); in getLowerBound()
3064 Sum = SE->getAddExpr(Sum, Bound[K].Upper[Bound[K].Direction]); in getUpperBound()
3085 return SE->getZero(Expr->getType()); in findCoefficient()
3087 return AddRec->getStepRecurrence(*SE); in findCoefficient()
3104 return SE->getAddRecExpr(zeroCoefficient(AddRec->getStart(), TargetLoop), in zeroCoefficient()
3105 AddRec->getStepRecurrence(*SE), in zeroCoefficient()
3121 return SE->getAddRecExpr(Expr, in addToCoefficient()
3126 const SCEV *Sum = SE->getAddExpr(AddRec->getStepRecurrence(*SE), Value); in addToCoefficient()
3129 return SE->getAddRecExpr(AddRec->getStart(), in addToCoefficient()
3134 if (SE->isLoopInvariant(AddRec, TargetLoop)) in addToCoefficient()
3135 return SE->getAddRecExpr(AddRec, Value, TargetLoop, SCEV::FlagAnyWrap); in addToCoefficient()
3136 return SE->getAddRecExpr( in addToCoefficient()
3138 AddRec->getStepRecurrence(*SE), AddRec->getLoop(), in addToCoefficient()
3185 const SCEV *DA_K = SE->getMulExpr(A_K, CurConstraint.getD()); in propagateDistance()
3186 Src = SE->getMinusSCEV(Src, DA_K); in propagateDistance()
3190 Dst = addToCoefficient(Dst, CurLoop, SE->getNegativeSCEV(A_K)); in propagateDistance()
3224 Src = SE->getMinusSCEV(Src, SE->getMulExpr(AP_K, SE->getConstant(CdivB))); in propagateLine()
3238 Src = SE->getAddExpr(Src, SE->getMulExpr(A_K, SE->getConstant(CdivA))); in propagateLine()
3252 Src = SE->getAddExpr(Src, SE->getMulExpr(A_K, SE->getConstant(CdivA))); in propagateLine()
3261 Src = SE->getMulExpr(Src, A); in propagateLine()
3262 Dst = SE->getMulExpr(Dst, A); in propagateLine()
3263 Src = SE->getAddExpr(Src, SE->getMulExpr(A_K, C)); in propagateLine()
3265 Dst = addToCoefficient(Dst, CurLoop, SE->getMulExpr(A_K, B)); in propagateLine()
3283 const SCEV *XA_K = SE->getMulExpr(A_K, CurConstraint.getX()); in propagatePoint()
3284 const SCEV *YAP_K = SE->getMulExpr(AP_K, CurConstraint.getY()); in propagatePoint()
3286 Src = SE->getAddExpr(Src, SE->getMinusSCEV(XA_K, YAP_K)); in propagatePoint()
3308 if (!SE->isKnownNonZero(Level.Distance)) // if may be zero in updateDirection()
3310 if (!SE->isKnownNonPositive(Level.Distance)) // if may be positive in updateDirection()
3312 if (!SE->isKnownNonNegative(Level.Distance)) // if may be negative in updateDirection()
3358 const SCEV *SrcAccessFn = SE->getSCEVAtScope(SrcPtr, SrcLoop); in tryDelinearize()
3359 const SCEV *DstAccessFn = SE->getSCEVAtScope(DstPtr, DstLoop); in tryDelinearize()
3361 dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn)); in tryDelinearize()
3363 dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn)); in tryDelinearize()
3409 dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn)); in tryDelinearizeFixedSize()
3411 dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn)); in tryDelinearizeFixedSize()
3418 if (!tryDelinearizeFixedSizeImpl(SE, Src, SrcAccessFn, SrcSubscripts, in tryDelinearizeFixedSize()
3420 !tryDelinearizeFixedSizeImpl(SE, Dst, DstAccessFn, DstSubscripts, in tryDelinearizeFixedSize()
3456 const SCEV *Range = SE->getConstant( in tryDelinearizeFixedSize()
3488 dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn)); in tryDelinearizeParametricSize()
3490 dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn)); in tryDelinearizeParametricSize()
3494 const SCEV *ElementSize = SE->getElementSize(Src); in tryDelinearizeParametricSize()
3495 if (ElementSize != SE->getElementSize(Dst)) in tryDelinearizeParametricSize()
3498 const SCEV *SrcSCEV = SE->getMinusSCEV(SrcAccessFn, SrcBase); in tryDelinearizeParametricSize()
3499 const SCEV *DstSCEV = SE->getMinusSCEV(DstAccessFn, DstBase); in tryDelinearizeParametricSize()
3508 collectParametricTerms(*SE, SrcAR, Terms); in tryDelinearizeParametricSize()
3509 collectParametricTerms(*SE, DstAR, Terms); in tryDelinearizeParametricSize()
3513 findArrayDimensions(*SE, Terms, Sizes, ElementSize); in tryDelinearizeParametricSize()
3516 computeAccessFunctions(*SE, SrcAR, SrcSubscripts, Sizes); in tryDelinearizeParametricSize()
3517 computeAccessFunctions(*SE, DstAR, DstSubscripts, Sizes); in tryDelinearizeParametricSize()
3636 const SCEV *SrcSCEV = SE->getSCEV(SrcPtr); in depends()
3637 const SCEV *DstSCEV = SE->getSCEV(DstPtr); in depends()
3640 if (SE->getPointerBase(SrcSCEV) != SE->getPointerBase(DstSCEV)) { in depends()
3787 NewConstraint.setAny(SE); in depends()
3828 Constraints[II].setAny(SE); in depends()
4047 const SCEV *SrcSCEV = SE->getSCEV(SrcPtr); in getSplitIteration()
4048 const SCEV *DstSCEV = SE->getSCEV(DstPtr); in getSplitIteration()
4113 NewConstraint.setAny(SE); in getSplitIteration()
4142 Constraints[II].setAny(SE); in getSplitIteration()