1//===- llvm/Analysis/ScalarEvolutionDivision.h - See below ------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file defines the class that knows how to divide SCEV's. 10// 11//===----------------------------------------------------------------------===// 12 13#ifndef LLVM_ANALYSIS_SCALAREVOLUTIONDIVISION_H 14#define LLVM_ANALYSIS_SCALAREVOLUTIONDIVISION_H 15 16#include "llvm/Analysis/ScalarEvolutionExpressions.h" 17 18namespace llvm { 19 20class SCEV; 21 22class ScalarEvolution; 23 24struct SCEVCouldNotCompute; 25 26struct SCEVDivision : public SCEVVisitor<SCEVDivision, void> { 27public: 28 // Computes the Quotient and Remainder of the division of Numerator by 29 // Denominator. 30 static void divide(ScalarEvolution &SE, const SCEV *Numerator, 31 const SCEV *Denominator, const SCEV **Quotient, 32 const SCEV **Remainder); 33 34 // Except in the trivial case described above, we do not know how to divide 35 // Expr by Denominator for the following functions with empty implementation. 36 void visitPtrToIntExpr(const SCEVPtrToIntExpr *Numerator) {} 37 void visitTruncateExpr(const SCEVTruncateExpr *Numerator) {} 38 void visitZeroExtendExpr(const SCEVZeroExtendExpr *Numerator) {} 39 void visitSignExtendExpr(const SCEVSignExtendExpr *Numerator) {} 40 void visitUDivExpr(const SCEVUDivExpr *Numerator) {} 41 void visitSMaxExpr(const SCEVSMaxExpr *Numerator) {} 42 void visitUMaxExpr(const SCEVUMaxExpr *Numerator) {} 43 void visitSMinExpr(const SCEVSMinExpr *Numerator) {} 44 void visitUMinExpr(const SCEVUMinExpr *Numerator) {} 45 void visitUnknown(const SCEVUnknown *Numerator) {} 46 void visitCouldNotCompute(const SCEVCouldNotCompute *Numerator) {} 47 48 void visitConstant(const SCEVConstant *Numerator); 49 50 void visitAddRecExpr(const SCEVAddRecExpr *Numerator); 51 52 void visitAddExpr(const SCEVAddExpr *Numerator); 53 54 void visitMulExpr(const SCEVMulExpr *Numerator); 55 56private: 57 SCEVDivision(ScalarEvolution &S, const SCEV *Numerator, 58 const SCEV *Denominator); 59 60 // Convenience function for giving up on the division. We set the quotient to 61 // be equal to zero and the remainder to be equal to the numerator. 62 void cannotDivide(const SCEV *Numerator); 63 64 ScalarEvolution &SE; 65 const SCEV *Denominator, *Quotient, *Remainder, *Zero, *One; 66}; 67 68} // end namespace llvm 69 70#endif // LLVM_ANALYSIS_SCALAREVOLUTIONDIVISION_H 71