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