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 18 namespace llvm { 19 20 class SCEV; 21 22 class ScalarEvolution; 23 24 struct SCEVCouldNotCompute; 25 26 struct SCEVDivision : public SCEVVisitor<SCEVDivision, void> { 27 public: 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. visitPtrToIntExprSCEVDivision36 void visitPtrToIntExpr(const SCEVPtrToIntExpr *Numerator) {} visitTruncateExprSCEVDivision37 void visitTruncateExpr(const SCEVTruncateExpr *Numerator) {} visitZeroExtendExprSCEVDivision38 void visitZeroExtendExpr(const SCEVZeroExtendExpr *Numerator) {} visitSignExtendExprSCEVDivision39 void visitSignExtendExpr(const SCEVSignExtendExpr *Numerator) {} visitUDivExprSCEVDivision40 void visitUDivExpr(const SCEVUDivExpr *Numerator) {} visitSMaxExprSCEVDivision41 void visitSMaxExpr(const SCEVSMaxExpr *Numerator) {} visitUMaxExprSCEVDivision42 void visitUMaxExpr(const SCEVUMaxExpr *Numerator) {} visitSMinExprSCEVDivision43 void visitSMinExpr(const SCEVSMinExpr *Numerator) {} visitUMinExprSCEVDivision44 void visitUMinExpr(const SCEVUMinExpr *Numerator) {} visitUnknownSCEVDivision45 void visitUnknown(const SCEVUnknown *Numerator) {} visitCouldNotComputeSCEVDivision46 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 56 private: 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