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