27#ifndef ENZYME_MUST_EXIT_SCALAR_EVOLUTION_H_
28#define ENZYME_MUST_EXIT_SCALAR_EVOLUTION_H_
30#include <llvm/Config/llvm-config.h>
32#if LLVM_VERSION_MAJOR >= 16
34#include "llvm/Analysis/ScalarEvolution.h"
35#include "llvm/Transforms/Utils/ScalarEvolutionExpander.h"
38#include "SCEV/ScalarEvolution.h"
39#include "SCEV/ScalarEvolutionExpander.h"
42#include "llvm/IR/Dominators.h"
47 using ScalarEvolution::ScalarEvolution;
50 llvm::AssumptionCache &AC, llvm::DominatorTree &DT,
53 llvm::BasicBlock *ExitingBlock,
54 bool AllowPredicates);
57 llvm::Value *ExitCond,
60 bool AllowPredicates);
62 ScalarEvolution::ExitLimit
64 llvm::Value *ExitCond,
bool ExitIfTrue,
65 bool ControlsExit,
bool AllowPredicates);
66 ScalarEvolution::ExitLimit
68 llvm::Value *ExitCond,
bool ExitIfTrue,
69 bool ControlsExit,
bool AllowPredicates);
71 ScalarEvolution::ExitLimit
73 bool ExitIfTrue,
bool ControlsExit,
74 bool AllowPredicates =
false);
79 const llvm::SCEV *RHS,
81 bool IsSigned,
bool ControlsExit,
82 bool AllowPredicates);
85 const llvm::Loop *L, llvm::SwitchInst *Switch,
86 llvm::BasicBlock *ExitingBB,
bool IsSubExpr);
ScalarEvolution::ExitLimit howManyLessThans(const llvm::SCEV *LHS, const llvm::SCEV *RHS, const llvm::Loop *L, bool IsSigned, bool ControlsExit, bool AllowPredicates)
llvm::SmallPtrSet< llvm::BasicBlock *, 4 > GuaranteedUnreachable
ScalarEvolution::ExitLimit computeExitLimitFromICmp(const llvm::Loop *L, llvm::ICmpInst *ExitCond, bool ExitIfTrue, bool ControlsExit, bool AllowPredicates=false)
ScalarEvolution::ExitLimit computeExitLimitFromCond(const llvm::Loop *L, llvm::Value *ExitCond, bool ExitIfTrue, bool ControlsExit, bool AllowPredicates)
ScalarEvolution::ExitLimit computeExitLimitFromSingleExitSwitch(const llvm::Loop *L, llvm::SwitchInst *Switch, llvm::BasicBlock *ExitingBB, bool IsSubExpr)
ScalarEvolution::ExitLimit computeExitLimit(const llvm::Loop *L, llvm::BasicBlock *ExitingBlock, bool AllowPredicates)
ScalarEvolution::ExitLimit computeExitLimitFromCondCached(ExitLimitCacheTy &Cache, const llvm::Loop *L, llvm::Value *ExitCond, bool ExitIfTrue, bool ControlsExit, bool AllowPredicates)
ScalarEvolution::ExitLimit computeExitLimitFromCondImpl(ExitLimitCacheTy &Cache, const llvm::Loop *L, llvm::Value *ExitCond, bool ExitIfTrue, bool ControlsExit, bool AllowPredicates)
MustExitScalarEvolution(llvm::Function &F, llvm::TargetLibraryInfo &TLI, llvm::AssumptionCache &AC, llvm::DominatorTree &DT, llvm::LoopInfo &LI)
bool loopIsFiniteByAssumption(const llvm::Loop *L)