File indexing completed on 2026-05-10 08:48:20
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef POLLY_SCEV_AFFINATOR_H
0014 #define POLLY_SCEV_AFFINATOR_H
0015
0016 #include "polly/Support/ScopHelper.h"
0017 #include "llvm/Analysis/ScalarEvolutionExpressions.h"
0018 #include "isl/isl-noexceptions.h"
0019
0020 namespace polly {
0021 class Scop;
0022
0023
0024
0025
0026
0027 typedef std::pair<isl::pw_aff, isl::set> PWACtx;
0028
0029
0030 class SCEVAffinator final : public llvm::SCEVVisitor<SCEVAffinator, PWACtx> {
0031 public:
0032 SCEVAffinator(Scop *S, llvm::LoopInfo &LI);
0033
0034
0035
0036
0037
0038
0039
0040 PWACtx getPwAff(const llvm::SCEV *E, llvm::BasicBlock *BB = nullptr,
0041 RecordedAssumptionsTy *RecordedAssumptions = nullptr);
0042
0043
0044 void takeNonNegativeAssumption(
0045 PWACtx &PWAC, RecordedAssumptionsTy *RecordedAssumptions = nullptr);
0046
0047
0048 void interpretAsUnsigned(PWACtx &PWAC, unsigned Width);
0049
0050
0051 bool hasNSWAddRecForLoop(llvm::Loop *L) const;
0052
0053
0054 llvm::LoopInfo *getLI() const { return &LI; }
0055
0056 private:
0057
0058 using CacheKey = std::pair<const llvm::SCEV *, llvm::BasicBlock *>;
0059
0060
0061 llvm::DenseMap<CacheKey, PWACtx> CachedExpressions;
0062
0063 Scop *S;
0064 isl::ctx Ctx;
0065 unsigned NumIterators;
0066 llvm::ScalarEvolution &SE;
0067 llvm::LoopInfo &LI;
0068 llvm::BasicBlock *BB;
0069 RecordedAssumptionsTy *RecordedAssumptions = nullptr;
0070
0071
0072 const llvm::DataLayout &TD;
0073
0074
0075 llvm::Loop *getScope();
0076
0077
0078 PWACtx getPWACtxFromPWA(isl::pw_aff PWA);
0079
0080
0081
0082
0083
0084
0085
0086 isl::pw_aff addModuloSemantic(isl::pw_aff PWA, llvm::Type *ExprType) const;
0087
0088
0089
0090
0091
0092
0093
0094 PWACtx checkForWrapping(const llvm::SCEV *Expr, PWACtx PWAC) const;
0095
0096
0097
0098 bool computeModuloForExpr(const llvm::SCEV *Expr);
0099
0100 PWACtx visit(const llvm::SCEV *E);
0101 PWACtx visitConstant(const llvm::SCEVConstant *E);
0102 PWACtx visitVScale(const llvm::SCEVVScale *E);
0103 PWACtx visitPtrToIntExpr(const llvm::SCEVPtrToIntExpr *E);
0104 PWACtx visitTruncateExpr(const llvm::SCEVTruncateExpr *E);
0105 PWACtx visitZeroExtendExpr(const llvm::SCEVZeroExtendExpr *E);
0106 PWACtx visitSignExtendExpr(const llvm::SCEVSignExtendExpr *E);
0107 PWACtx visitAddExpr(const llvm::SCEVAddExpr *E);
0108 PWACtx visitMulExpr(const llvm::SCEVMulExpr *E);
0109 PWACtx visitUDivExpr(const llvm::SCEVUDivExpr *E);
0110 PWACtx visitAddRecExpr(const llvm::SCEVAddRecExpr *E);
0111 PWACtx visitSMaxExpr(const llvm::SCEVSMaxExpr *E);
0112 PWACtx visitSMinExpr(const llvm::SCEVSMinExpr *E);
0113 PWACtx visitUMaxExpr(const llvm::SCEVUMaxExpr *E);
0114 PWACtx visitUMinExpr(const llvm::SCEVUMinExpr *E);
0115 PWACtx visitSequentialUMinExpr(const llvm::SCEVSequentialUMinExpr *E);
0116 PWACtx visitUnknown(const llvm::SCEVUnknown *E);
0117 PWACtx visitSDivInstruction(llvm::Instruction *SDiv);
0118 PWACtx visitSRemInstruction(llvm::Instruction *SRem);
0119 PWACtx complexityBailout();
0120
0121 friend struct llvm::SCEVVisitor<SCEVAffinator, PWACtx>;
0122 };
0123 }
0124
0125 #endif