LLVM 20.0.0git |
#include "llvm/Transforms/Scalar/InductiveRangeCheckElimination.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/PriorityWorklist.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/BlockFrequencyInfo.h"
#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/Analysis/LoopAnalysisManager.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/ScalarEvolution.h"
#include "llvm/Analysis/ScalarEvolutionExpressions.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/BranchProbability.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/Transforms/Utils/LoopConstrainer.h"
#include "llvm/Transforms/Utils/LoopSimplify.h"
#include "llvm/Transforms/Utils/LoopUtils.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
#include <algorithm>
#include <cassert>
#include <optional>
#include <utility>
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "irce" |
Functions | |
staticconstSCEV * | NoopOrExtend (constSCEV *S,Type *Ty,ScalarEvolution &SE,boolSigned) |
If the type ofS matches withTy , returnS . | |
static std::optional<LoopConstrainer::SubRanges > | calculateSubRanges (ScalarEvolution &SE,constLoop &L, InductiveRangeCheck::Range &Range,constLoopStructure &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 | |
staticcl::opt<unsigned > | LoopSizeCutoff ("irce-loop-size-cutoff", cl::Hidden, cl::init(64)) |
staticcl::opt<bool > | PrintChangedLoops ("irce-print-changed-loops", cl::Hidden, cl::init(false)) |
staticcl::opt<bool > | PrintRangeChecks ("irce-print-range-checks", cl::Hidden, cl::init(false)) |
staticcl::opt<bool > | SkipProfitabilityChecks ("irce-skip-profitability-checks", cl::Hidden, cl::init(false)) |
staticcl::opt<unsigned > | MinEliminatedChecks ("irce-min-eliminated-checks", cl::Hidden, cl::init(10)) |
staticcl::opt<bool > | AllowUnsignedLatchCondition ("irce-allow-unsigned-latch", cl::Hidden, cl::init(true)) |
staticcl::opt<bool > | AllowNarrowLatchCondition ("irce-allow-narrow-latch", cl::Hidden, cl::init(true),cl::desc("If set totrue, IRCE may eliminate wide rangechecks inloops " "with narrow latch condition.")) |
staticcl::opt<unsigned > | MaxTypeSizeForOverflowCheck ("irce-max-type-size-for-overflow-check", cl::Hidden, cl::init(32),cl::desc("Maximum size of range check typefor which can be produced runtime " "overflow check of its limit's computation")) |
staticcl::opt<bool > | PrintScaledBoundaryRangeChecks ("irce-print-scaled-boundary-range-checks", cl::Hidden, cl::init(false)) |
#define DEBUG_TYPE "irce" |
Definition at line129 of fileInductiveRangeCheckElimination.cpp.
| static |
Definition at line582 of fileInductiveRangeCheckElimination.cpp.
ReferencesAllowNarrowLatchCondition,End,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::LoopStructure::IndVarIncreasing,llvm::LoopStructure::IndVarStart,llvm::ScalarEvolution::isKnownPredicate(),llvm::LoopStructure::IsSignedPredicate,llvm::LoopStructure::LoopExitAt,NoopOrExtend(), andRange.
| static |
Definition at line844 of fileInductiveRangeCheckElimination.cpp.
Referencesassert(),llvm::ScalarEvolution::getSMaxExpr(),llvm::ScalarEvolution::getSMinExpr(), andR2.
| static |
Definition at line873 of fileInductiveRangeCheckElimination.cpp.
Referencesassert(),llvm::ScalarEvolution::getUMaxExpr(),llvm::ScalarEvolution::getUMinExpr(), andR2.
If the type ofS
matches withTy
, returnS
.
Otherwise, return signed or unsigned extension ofS
to typeTy
.
Definition at line573 of fileInductiveRangeCheckElimination.cpp.
Referencesllvm::ScalarEvolution::getNoopOrSignExtend(),llvm::ScalarEvolution::getNoopOrZeroExtend(), andSigned.
Referenced bycalculateSubRanges().
| static |
Referenced bycalculateSubRanges().
| static |
| static |
Referenced byllvm::IRCEPass::run().