xref: /freebsd/contrib/llvm-project/llvm/lib/Analysis/ScalarEvolutionDivision.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15ffd83dbSDimitry Andric //===- ScalarEvolutionDivision.h - See below --------------------*- C++ -*-===//
25ffd83dbSDimitry Andric //
35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ffd83dbSDimitry Andric //
75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
85ffd83dbSDimitry Andric //
95ffd83dbSDimitry Andric // This file defines the class that knows how to divide SCEV's.
105ffd83dbSDimitry Andric //
115ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
125ffd83dbSDimitry Andric 
135ffd83dbSDimitry Andric #include "llvm/Analysis/ScalarEvolutionDivision.h"
145ffd83dbSDimitry Andric #include "llvm/ADT/APInt.h"
155ffd83dbSDimitry Andric #include "llvm/ADT/DenseMap.h"
165ffd83dbSDimitry Andric #include "llvm/ADT/SmallVector.h"
175ffd83dbSDimitry Andric #include "llvm/Analysis/ScalarEvolution.h"
185ffd83dbSDimitry Andric #include "llvm/Support/Casting.h"
195ffd83dbSDimitry Andric #include <cassert>
205ffd83dbSDimitry Andric #include <cstdint>
215ffd83dbSDimitry Andric 
225ffd83dbSDimitry Andric namespace llvm {
235ffd83dbSDimitry Andric class Type;
24*0fca6ea1SDimitry Andric } // namespace llvm
255ffd83dbSDimitry Andric 
265ffd83dbSDimitry Andric using namespace llvm;
275ffd83dbSDimitry Andric 
285ffd83dbSDimitry Andric namespace {
295ffd83dbSDimitry Andric 
sizeOfSCEV(const SCEV * S)305ffd83dbSDimitry Andric static inline int sizeOfSCEV(const SCEV *S) {
315ffd83dbSDimitry Andric   struct FindSCEVSize {
325ffd83dbSDimitry Andric     int Size = 0;
335ffd83dbSDimitry Andric 
345ffd83dbSDimitry Andric     FindSCEVSize() = default;
355ffd83dbSDimitry Andric 
365ffd83dbSDimitry Andric     bool follow(const SCEV *S) {
375ffd83dbSDimitry Andric       ++Size;
385ffd83dbSDimitry Andric       // Keep looking at all operands of S.
395ffd83dbSDimitry Andric       return true;
405ffd83dbSDimitry Andric     }
415ffd83dbSDimitry Andric 
425ffd83dbSDimitry Andric     bool isDone() const { return false; }
435ffd83dbSDimitry Andric   };
445ffd83dbSDimitry Andric 
455ffd83dbSDimitry Andric   FindSCEVSize F;
465ffd83dbSDimitry Andric   SCEVTraversal<FindSCEVSize> ST(F);
475ffd83dbSDimitry Andric   ST.visitAll(S);
485ffd83dbSDimitry Andric   return F.Size;
495ffd83dbSDimitry Andric }
505ffd83dbSDimitry Andric 
515ffd83dbSDimitry Andric } // namespace
525ffd83dbSDimitry Andric 
535ffd83dbSDimitry Andric // Computes the Quotient and Remainder of the division of Numerator by
545ffd83dbSDimitry Andric // Denominator.
divide(ScalarEvolution & SE,const SCEV * Numerator,const SCEV * Denominator,const SCEV ** Quotient,const SCEV ** Remainder)555ffd83dbSDimitry Andric void SCEVDivision::divide(ScalarEvolution &SE, const SCEV *Numerator,
565ffd83dbSDimitry Andric                           const SCEV *Denominator, const SCEV **Quotient,
575ffd83dbSDimitry Andric                           const SCEV **Remainder) {
585ffd83dbSDimitry Andric   assert(Numerator && Denominator && "Uninitialized SCEV");
595ffd83dbSDimitry Andric 
605ffd83dbSDimitry Andric   SCEVDivision D(SE, Numerator, Denominator);
615ffd83dbSDimitry Andric 
625ffd83dbSDimitry Andric   // Check for the trivial case here to avoid having to check for it in the
635ffd83dbSDimitry Andric   // rest of the code.
645ffd83dbSDimitry Andric   if (Numerator == Denominator) {
655ffd83dbSDimitry Andric     *Quotient = D.One;
665ffd83dbSDimitry Andric     *Remainder = D.Zero;
675ffd83dbSDimitry Andric     return;
685ffd83dbSDimitry Andric   }
695ffd83dbSDimitry Andric 
705ffd83dbSDimitry Andric   if (Numerator->isZero()) {
715ffd83dbSDimitry Andric     *Quotient = D.Zero;
725ffd83dbSDimitry Andric     *Remainder = D.Zero;
735ffd83dbSDimitry Andric     return;
745ffd83dbSDimitry Andric   }
755ffd83dbSDimitry Andric 
765ffd83dbSDimitry Andric   // A simple case when N/1. The quotient is N.
775ffd83dbSDimitry Andric   if (Denominator->isOne()) {
785ffd83dbSDimitry Andric     *Quotient = Numerator;
795ffd83dbSDimitry Andric     *Remainder = D.Zero;
805ffd83dbSDimitry Andric     return;
815ffd83dbSDimitry Andric   }
825ffd83dbSDimitry Andric 
835ffd83dbSDimitry Andric   // Split the Denominator when it is a product.
845ffd83dbSDimitry Andric   if (const SCEVMulExpr *T = dyn_cast<SCEVMulExpr>(Denominator)) {
855ffd83dbSDimitry Andric     const SCEV *Q, *R;
865ffd83dbSDimitry Andric     *Quotient = Numerator;
875ffd83dbSDimitry Andric     for (const SCEV *Op : T->operands()) {
885ffd83dbSDimitry Andric       divide(SE, *Quotient, Op, &Q, &R);
895ffd83dbSDimitry Andric       *Quotient = Q;
905ffd83dbSDimitry Andric 
915ffd83dbSDimitry Andric       // Bail out when the Numerator is not divisible by one of the terms of
925ffd83dbSDimitry Andric       // the Denominator.
935ffd83dbSDimitry Andric       if (!R->isZero()) {
945ffd83dbSDimitry Andric         *Quotient = D.Zero;
955ffd83dbSDimitry Andric         *Remainder = Numerator;
965ffd83dbSDimitry Andric         return;
975ffd83dbSDimitry Andric       }
985ffd83dbSDimitry Andric     }
995ffd83dbSDimitry Andric     *Remainder = D.Zero;
1005ffd83dbSDimitry Andric     return;
1015ffd83dbSDimitry Andric   }
1025ffd83dbSDimitry Andric 
1035ffd83dbSDimitry Andric   D.visit(Numerator);
1045ffd83dbSDimitry Andric   *Quotient = D.Quotient;
1055ffd83dbSDimitry Andric   *Remainder = D.Remainder;
1065ffd83dbSDimitry Andric }
1075ffd83dbSDimitry Andric 
visitConstant(const SCEVConstant * Numerator)1085ffd83dbSDimitry Andric void SCEVDivision::visitConstant(const SCEVConstant *Numerator) {
1095ffd83dbSDimitry Andric   if (const SCEVConstant *D = dyn_cast<SCEVConstant>(Denominator)) {
1105ffd83dbSDimitry Andric     APInt NumeratorVal = Numerator->getAPInt();
1115ffd83dbSDimitry Andric     APInt DenominatorVal = D->getAPInt();
1125ffd83dbSDimitry Andric     uint32_t NumeratorBW = NumeratorVal.getBitWidth();
1135ffd83dbSDimitry Andric     uint32_t DenominatorBW = DenominatorVal.getBitWidth();
1145ffd83dbSDimitry Andric 
1155ffd83dbSDimitry Andric     if (NumeratorBW > DenominatorBW)
1165ffd83dbSDimitry Andric       DenominatorVal = DenominatorVal.sext(NumeratorBW);
1175ffd83dbSDimitry Andric     else if (NumeratorBW < DenominatorBW)
1185ffd83dbSDimitry Andric       NumeratorVal = NumeratorVal.sext(DenominatorBW);
1195ffd83dbSDimitry Andric 
1205ffd83dbSDimitry Andric     APInt QuotientVal(NumeratorVal.getBitWidth(), 0);
1215ffd83dbSDimitry Andric     APInt RemainderVal(NumeratorVal.getBitWidth(), 0);
1225ffd83dbSDimitry Andric     APInt::sdivrem(NumeratorVal, DenominatorVal, QuotientVal, RemainderVal);
1235ffd83dbSDimitry Andric     Quotient = SE.getConstant(QuotientVal);
1245ffd83dbSDimitry Andric     Remainder = SE.getConstant(RemainderVal);
1255ffd83dbSDimitry Andric     return;
1265ffd83dbSDimitry Andric   }
1275ffd83dbSDimitry Andric }
1285ffd83dbSDimitry Andric 
visitVScale(const SCEVVScale * Numerator)12906c3fb27SDimitry Andric void SCEVDivision::visitVScale(const SCEVVScale *Numerator) {
13006c3fb27SDimitry Andric   return cannotDivide(Numerator);
13106c3fb27SDimitry Andric }
13206c3fb27SDimitry Andric 
visitAddRecExpr(const SCEVAddRecExpr * Numerator)1335ffd83dbSDimitry Andric void SCEVDivision::visitAddRecExpr(const SCEVAddRecExpr *Numerator) {
1345ffd83dbSDimitry Andric   const SCEV *StartQ, *StartR, *StepQ, *StepR;
1355ffd83dbSDimitry Andric   if (!Numerator->isAffine())
1365ffd83dbSDimitry Andric     return cannotDivide(Numerator);
1375ffd83dbSDimitry Andric   divide(SE, Numerator->getStart(), Denominator, &StartQ, &StartR);
1385ffd83dbSDimitry Andric   divide(SE, Numerator->getStepRecurrence(SE), Denominator, &StepQ, &StepR);
1395ffd83dbSDimitry Andric   // Bail out if the types do not match.
1405ffd83dbSDimitry Andric   Type *Ty = Denominator->getType();
1415ffd83dbSDimitry Andric   if (Ty != StartQ->getType() || Ty != StartR->getType() ||
1425ffd83dbSDimitry Andric       Ty != StepQ->getType() || Ty != StepR->getType())
1435ffd83dbSDimitry Andric     return cannotDivide(Numerator);
1445ffd83dbSDimitry Andric   Quotient = SE.getAddRecExpr(StartQ, StepQ, Numerator->getLoop(),
1455ffd83dbSDimitry Andric                               Numerator->getNoWrapFlags());
1465ffd83dbSDimitry Andric   Remainder = SE.getAddRecExpr(StartR, StepR, Numerator->getLoop(),
1475ffd83dbSDimitry Andric                                Numerator->getNoWrapFlags());
1485ffd83dbSDimitry Andric }
1495ffd83dbSDimitry Andric 
visitAddExpr(const SCEVAddExpr * Numerator)1505ffd83dbSDimitry Andric void SCEVDivision::visitAddExpr(const SCEVAddExpr *Numerator) {
1515ffd83dbSDimitry Andric   SmallVector<const SCEV *, 2> Qs, Rs;
1525ffd83dbSDimitry Andric   Type *Ty = Denominator->getType();
1535ffd83dbSDimitry Andric 
1545ffd83dbSDimitry Andric   for (const SCEV *Op : Numerator->operands()) {
1555ffd83dbSDimitry Andric     const SCEV *Q, *R;
1565ffd83dbSDimitry Andric     divide(SE, Op, Denominator, &Q, &R);
1575ffd83dbSDimitry Andric 
1585ffd83dbSDimitry Andric     // Bail out if types do not match.
1595ffd83dbSDimitry Andric     if (Ty != Q->getType() || Ty != R->getType())
1605ffd83dbSDimitry Andric       return cannotDivide(Numerator);
1615ffd83dbSDimitry Andric 
1625ffd83dbSDimitry Andric     Qs.push_back(Q);
1635ffd83dbSDimitry Andric     Rs.push_back(R);
1645ffd83dbSDimitry Andric   }
1655ffd83dbSDimitry Andric 
1665ffd83dbSDimitry Andric   if (Qs.size() == 1) {
1675ffd83dbSDimitry Andric     Quotient = Qs[0];
1685ffd83dbSDimitry Andric     Remainder = Rs[0];
1695ffd83dbSDimitry Andric     return;
1705ffd83dbSDimitry Andric   }
1715ffd83dbSDimitry Andric 
1725ffd83dbSDimitry Andric   Quotient = SE.getAddExpr(Qs);
1735ffd83dbSDimitry Andric   Remainder = SE.getAddExpr(Rs);
1745ffd83dbSDimitry Andric }
1755ffd83dbSDimitry Andric 
visitMulExpr(const SCEVMulExpr * Numerator)1765ffd83dbSDimitry Andric void SCEVDivision::visitMulExpr(const SCEVMulExpr *Numerator) {
1775ffd83dbSDimitry Andric   SmallVector<const SCEV *, 2> Qs;
1785ffd83dbSDimitry Andric   Type *Ty = Denominator->getType();
1795ffd83dbSDimitry Andric 
1805ffd83dbSDimitry Andric   bool FoundDenominatorTerm = false;
1815ffd83dbSDimitry Andric   for (const SCEV *Op : Numerator->operands()) {
1825ffd83dbSDimitry Andric     // Bail out if types do not match.
1835ffd83dbSDimitry Andric     if (Ty != Op->getType())
1845ffd83dbSDimitry Andric       return cannotDivide(Numerator);
1855ffd83dbSDimitry Andric 
1865ffd83dbSDimitry Andric     if (FoundDenominatorTerm) {
1875ffd83dbSDimitry Andric       Qs.push_back(Op);
1885ffd83dbSDimitry Andric       continue;
1895ffd83dbSDimitry Andric     }
1905ffd83dbSDimitry Andric 
1915ffd83dbSDimitry Andric     // Check whether Denominator divides one of the product operands.
1925ffd83dbSDimitry Andric     const SCEV *Q, *R;
1935ffd83dbSDimitry Andric     divide(SE, Op, Denominator, &Q, &R);
1945ffd83dbSDimitry Andric     if (!R->isZero()) {
1955ffd83dbSDimitry Andric       Qs.push_back(Op);
1965ffd83dbSDimitry Andric       continue;
1975ffd83dbSDimitry Andric     }
1985ffd83dbSDimitry Andric 
1995ffd83dbSDimitry Andric     // Bail out if types do not match.
2005ffd83dbSDimitry Andric     if (Ty != Q->getType())
2015ffd83dbSDimitry Andric       return cannotDivide(Numerator);
2025ffd83dbSDimitry Andric 
2035ffd83dbSDimitry Andric     FoundDenominatorTerm = true;
2045ffd83dbSDimitry Andric     Qs.push_back(Q);
2055ffd83dbSDimitry Andric   }
2065ffd83dbSDimitry Andric 
2075ffd83dbSDimitry Andric   if (FoundDenominatorTerm) {
2085ffd83dbSDimitry Andric     Remainder = Zero;
2095ffd83dbSDimitry Andric     if (Qs.size() == 1)
2105ffd83dbSDimitry Andric       Quotient = Qs[0];
2115ffd83dbSDimitry Andric     else
2125ffd83dbSDimitry Andric       Quotient = SE.getMulExpr(Qs);
2135ffd83dbSDimitry Andric     return;
2145ffd83dbSDimitry Andric   }
2155ffd83dbSDimitry Andric 
2165ffd83dbSDimitry Andric   if (!isa<SCEVUnknown>(Denominator))
2175ffd83dbSDimitry Andric     return cannotDivide(Numerator);
2185ffd83dbSDimitry Andric 
2195ffd83dbSDimitry Andric   // The Remainder is obtained by replacing Denominator by 0 in Numerator.
220e8d8bef9SDimitry Andric   ValueToSCEVMapTy RewriteMap;
221e8d8bef9SDimitry Andric   RewriteMap[cast<SCEVUnknown>(Denominator)->getValue()] = Zero;
222e8d8bef9SDimitry Andric   Remainder = SCEVParameterRewriter::rewrite(Numerator, SE, RewriteMap);
2235ffd83dbSDimitry Andric 
2245ffd83dbSDimitry Andric   if (Remainder->isZero()) {
2255ffd83dbSDimitry Andric     // The Quotient is obtained by replacing Denominator by 1 in Numerator.
226e8d8bef9SDimitry Andric     RewriteMap[cast<SCEVUnknown>(Denominator)->getValue()] = One;
227e8d8bef9SDimitry Andric     Quotient = SCEVParameterRewriter::rewrite(Numerator, SE, RewriteMap);
2285ffd83dbSDimitry Andric     return;
2295ffd83dbSDimitry Andric   }
2305ffd83dbSDimitry Andric 
2315ffd83dbSDimitry Andric   // Quotient is (Numerator - Remainder) divided by Denominator.
2325ffd83dbSDimitry Andric   const SCEV *Q, *R;
2335ffd83dbSDimitry Andric   const SCEV *Diff = SE.getMinusSCEV(Numerator, Remainder);
2345ffd83dbSDimitry Andric   // This SCEV does not seem to simplify: fail the division here.
2355ffd83dbSDimitry Andric   if (sizeOfSCEV(Diff) > sizeOfSCEV(Numerator))
2365ffd83dbSDimitry Andric     return cannotDivide(Numerator);
2375ffd83dbSDimitry Andric   divide(SE, Diff, Denominator, &Q, &R);
2385ffd83dbSDimitry Andric   if (R != Zero)
2395ffd83dbSDimitry Andric     return cannotDivide(Numerator);
2405ffd83dbSDimitry Andric   Quotient = Q;
2415ffd83dbSDimitry Andric }
2425ffd83dbSDimitry Andric 
SCEVDivision(ScalarEvolution & S,const SCEV * Numerator,const SCEV * Denominator)2435ffd83dbSDimitry Andric SCEVDivision::SCEVDivision(ScalarEvolution &S, const SCEV *Numerator,
2445ffd83dbSDimitry Andric                            const SCEV *Denominator)
2455ffd83dbSDimitry Andric     : SE(S), Denominator(Denominator) {
2465ffd83dbSDimitry Andric   Zero = SE.getZero(Denominator->getType());
2475ffd83dbSDimitry Andric   One = SE.getOne(Denominator->getType());
2485ffd83dbSDimitry Andric 
2495ffd83dbSDimitry Andric   // We generally do not know how to divide Expr by Denominator. We initialize
2505ffd83dbSDimitry Andric   // the division to a "cannot divide" state to simplify the rest of the code.
2515ffd83dbSDimitry Andric   cannotDivide(Numerator);
2525ffd83dbSDimitry Andric }
2535ffd83dbSDimitry Andric 
2545ffd83dbSDimitry Andric // Convenience function for giving up on the division. We set the quotient to
2555ffd83dbSDimitry Andric // be equal to zero and the remainder to be equal to the numerator.
cannotDivide(const SCEV * Numerator)2565ffd83dbSDimitry Andric void SCEVDivision::cannotDivide(const SCEV *Numerator) {
2575ffd83dbSDimitry Andric   Quotient = Zero;
2585ffd83dbSDimitry Andric   Remainder = Numerator;
2595ffd83dbSDimitry Andric }
260