LLVM: lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp File Reference (original) (raw)

Go to the source code of this file.

Macros
#define DEBUG_TYPE "irce"
Functions
static const SCEV * NoopOrExtend (const SCEV *S, Type *Ty, ScalarEvolution &SE, bool Signed)
If the type of S matches with Ty, return S.
static std::optional< LoopConstrainer::SubRanges > calculateSubRanges (ScalarEvolution &SE, const Loop &L, InductiveRangeCheck::Range &Range, const LoopStructure &MainLoopStructure)
static std::optional< InductiveRangeCheck::Range > IntersectSignedRange (ScalarEvolution &SE, const std::optional< InductiveRangeCheck::Range > &R1, const InductiveRangeCheck::Range &R2)
static std::optional< InductiveRangeCheck::Range > IntersectUnsignedRange (ScalarEvolution &SE, const std::optional< InductiveRangeCheck::Range > &R1, const InductiveRangeCheck::Range &R2)
Variables
static cl::opt< unsigned > LoopSizeCutoff ("irce-loop-size-cutoff", cl::Hidden, cl::init(64))
static cl::opt< bool > PrintChangedLoops ("irce-print-changed-loops", cl::Hidden, cl::init(false))
static cl::opt< bool > PrintRangeChecks ("irce-print-range-checks", cl::Hidden, cl::init(false))
static cl::opt< bool > SkipProfitabilityChecks ("irce-skip-profitability-checks", cl::Hidden, cl::init(false))
static cl::opt< unsigned > MinEliminatedChecks ("irce-min-eliminated-checks", cl::Hidden, cl::init(10))
static cl::opt< bool > AllowUnsignedLatchCondition ("irce-allow-unsigned-latch", cl::Hidden, cl::init(true))
static cl::opt< bool > AllowNarrowLatchCondition ("irce-allow-narrow-latch", cl::Hidden, cl::init(true), cl::desc("If set to true, IRCE may eliminate wide range checks in loops " "with narrow latch condition."))
static cl::opt< unsigned > MaxTypeSizeForOverflowCheck ("irce-max-type-size-for-overflow-check", cl::Hidden, cl::init(32), cl::desc("Maximum size of range check type for which can be produced runtime " "overflow check of its limit's computation"))
static cl::opt< bool > PrintScaledBoundaryRangeChecks ("irce-print-scaled-boundary-range-checks", cl::Hidden, cl::init(false))

DEBUG_TYPE

#define DEBUG_TYPE "irce"

calculateSubRanges()

Definition at line 581 of file InductiveRangeCheckElimination.cpp.

References AllowNarrowLatchCondition, llvm::cast(), llvm::LoopStructure::ExitCountTy, llvm::ScalarEvolution::getAddExpr(), llvm::IntegerType::getBitWidth(), llvm::ScalarEvolution::getMinusSCEV(), llvm::ScalarEvolution::getOne(), llvm::ScalarEvolution::getSCEV(), llvm::ScalarEvolution::getSMaxExpr(), llvm::ScalarEvolution::getSMinExpr(), llvm::ScalarEvolution::getUMaxExpr(), llvm::ScalarEvolution::getUMinExpr(), llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::ICMP_ULT, llvm::LoopStructure::IndVarIncreasing, llvm::LoopStructure::IndVarStart, llvm::ScalarEvolution::isKnownPredicate(), llvm::LoopStructure::IsSignedPredicate, llvm::LoopStructure::LoopExitAt, NoopOrExtend(), and Range.

IntersectSignedRange()

IntersectUnsignedRange()

NoopOrExtend()

AllowNarrowLatchCondition

cl::opt< bool > AllowNarrowLatchCondition("irce-allow-narrow-latch", cl::Hidden, cl::init(true), cl::desc("If set to true, IRCE may eliminate wide range checks in loops " "with narrow latch condition.")) ( "irce-allow-narrow-latch" , cl::Hidden , cl::init(true) , cl::desc("If set to true, IRCE may eliminate wide range checks in loops " "with narrow latch condition.") ) static

AllowUnsignedLatchCondition

cl::opt< bool > AllowUnsignedLatchCondition("irce-allow-unsigned-latch", cl::Hidden, cl::init(true)) ( "irce-allow-unsigned-latch" , cl::Hidden , cl::init(true) ) static

LoopSizeCutoff

cl::opt< unsigned > LoopSizeCutoff("irce-loop-size-cutoff", cl::Hidden, cl::init(64)) ( "irce-loop-size-cutoff" , cl::Hidden , cl::init(64) ) static

MaxTypeSizeForOverflowCheck

cl::opt< unsigned > MaxTypeSizeForOverflowCheck("irce-max-type-size-for-overflow-check", cl::Hidden, cl::init(32), cl::desc( "Maximum size of range check type for which can be produced runtime " "overflow check of its limit's computation")) ( "irce-max-type-size-for-overflow-check" , cl::Hidden , cl::init(32) , cl::desc( "Maximum size of range check type for which can be produced runtime " "overflow check of its limit's computation") ) static

MinEliminatedChecks

cl::opt< unsigned > MinEliminatedChecks("irce-min-eliminated-checks", cl::Hidden, cl::init(10)) ( "irce-min-eliminated-checks" , cl::Hidden , cl::init(10) ) static

PrintChangedLoops

cl::opt< bool > PrintChangedLoops("irce-print-changed-loops", cl::Hidden, cl::init(false)) ( "irce-print-changed-loops" , cl::Hidden , cl::init(false) ) static

PrintRangeChecks

cl::opt< bool > PrintRangeChecks("irce-print-range-checks", cl::Hidden, cl::init(false)) ( "irce-print-range-checks" , cl::Hidden , cl::init(false) ) static

PrintScaledBoundaryRangeChecks

cl::opt< bool > PrintScaledBoundaryRangeChecks("irce-print-scaled-boundary-range-checks", cl::Hidden, cl::init(false)) ( "irce-print-scaled-boundary-range-checks" , cl::Hidden , cl::init(false) ) static

SkipProfitabilityChecks

cl::opt< bool > SkipProfitabilityChecks("irce-skip-profitability-checks", cl::Hidden, cl::init(false)) ( "irce-skip-profitability-checks" , cl::Hidden , cl::init(false) ) static