LLVM  7.0.0svn
Macros | Functions | Variables
InductiveRangeCheckElimination.cpp File Reference
#include "llvm/Transforms/Scalar/InductiveRangeCheckElimination.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/None.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/Analysis/LoopAnalysisManager.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/LoopPass.h"
#include "llvm/Analysis/ScalarEvolution.h"
#include "llvm/Analysis/ScalarEvolutionExpander.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/Pass.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/Scalar.h"
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/Transforms/Utils/LoopSimplify.h"
#include "llvm/Transforms/Utils/LoopUtils.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
#include <algorithm>
#include <cassert>
#include <iterator>
#include <limits>
#include <utility>
#include <vector>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "irce"
 

Functions

 INITIALIZE_PASS_BEGIN (IRCELegacyPass, "irce", "Inductive range check elimination", false, false) INITIALIZE_PASS_END(IRCELegacyPass
 
static void DisableAllLoopOptsOnLoop (Loop &L)
 
static bool CannotBeMaxInLoop (const SCEV *BoundSCEV, Loop *L, ScalarEvolution &SE, bool Signed)
 
static bool isSafeDecreasingBound (const SCEV *Start, const SCEV *BoundSCEV, const SCEV *Step, ICmpInst::Predicate Pred, unsigned LatchBrExitIdx, Loop *L, ScalarEvolution &SE)
 Given a loop with an deccreasing induction variable, is it possible to safely calculate the bounds of a new loop using the given Predicate. More...
 
static bool isSafeIncreasingBound (const SCEV *Start, const SCEV *BoundSCEV, const SCEV *Step, ICmpInst::Predicate Pred, unsigned LatchBrExitIdx, Loop *L, ScalarEvolution &SE)
 Given a loop with an increasing induction variable, is it possible to safely calculate the bounds of a new loop using the given Predicate. More...
 
static bool CannotBeMinInLoop (const SCEV *BoundSCEV, Loop *L, ScalarEvolution &SE, bool Signed)
 
static bool isKnownNonNegativeInLoop (const SCEV *BoundSCEV, const Loop *L, ScalarEvolution &SE)
 
static bool isKnownNegativeInLoop (const SCEV *BoundSCEV, const Loop *L, ScalarEvolution &SE)
 
static Optional< InductiveRangeCheck::Range > IntersectSignedRange (ScalarEvolution &SE, const Optional< InductiveRangeCheck::Range > &R1, const InductiveRangeCheck::Range &R2)
 
static Optional< InductiveRangeCheck::Range > IntersectUnsignedRange (ScalarEvolution &SE, const Optional< InductiveRangeCheck::Range > &R1, const InductiveRangeCheck::Range &R2)
 

Variables

static cl::opt< unsignedLoopSizeCutoff ("irce-loop-size-cutoff", cl::Hidden, cl::init(64))
 
static cl::opt< boolPrintChangedLoops ("irce-print-changed-loops", cl::Hidden, cl::init(false))
 
static cl::opt< boolPrintRangeChecks ("irce-print-range-checks", cl::Hidden, cl::init(false))
 
static cl::opt< int > MaxExitProbReciprocal ("irce-max-exit-prob-reciprocal", cl::Hidden, cl::init(10))
 
static cl::opt< boolSkipProfitabilityChecks ("irce-skip-profitability-checks", cl::Hidden, cl::init(false))
 
static cl::opt< boolAllowUnsignedLatchCondition ("irce-allow-unsigned-latch", cl::Hidden, cl::init(true))
 
static const charClonedLoopTag = "irce.loop.clone"
 
 irce
 
Inductive range check elimination
 
Inductive range check false
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "irce"

Definition at line 121 of file InductiveRangeCheckElimination.cpp.

Function Documentation

◆ CannotBeMaxInLoop()

static bool CannotBeMaxInLoop ( const SCEV BoundSCEV,
Loop L,
ScalarEvolution SE,
bool  Signed 
)
static

◆ CannotBeMinInLoop()

static bool CannotBeMinInLoop ( const SCEV BoundSCEV,
Loop L,
ScalarEvolution SE,
bool  Signed 
)
static

◆ DisableAllLoopOptsOnLoop()

static void DisableAllLoopOptsOnLoop ( Loop L)
static

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( IRCELegacyPass  ,
"irce"  ,
"Inductive range check elimination ,
false  ,
false   
)

◆ IntersectSignedRange()

static Optional<InductiveRangeCheck::Range> IntersectSignedRange ( ScalarEvolution SE,
const Optional< InductiveRangeCheck::Range > &  R1,
const InductiveRangeCheck::Range &  R2 
)
static

◆ IntersectUnsignedRange()

static Optional<InductiveRangeCheck::Range> IntersectUnsignedRange ( ScalarEvolution SE,
const Optional< InductiveRangeCheck::Range > &  R1,
const InductiveRangeCheck::Range &  R2 
)
static

◆ isKnownNegativeInLoop()

static bool isKnownNegativeInLoop ( const SCEV BoundSCEV,
const Loop L,
ScalarEvolution SE 
)
static

Definition at line 816 of file InductiveRangeCheckElimination.cpp.

References llvm::LoopBase< BlockT, LoopT >::addBasicBlockToLoop(), llvm::LoopBase< BlockT, LoopT >::addChildLoop(), llvm::PHINode::addIncoming(), AllowUnsignedLatchCondition, assert(), B, llvm::sys::path::begin(), llvm::LoopBase< BlockT, LoopT >::blocks(), C, CannotBeMaxInLoop(), CannotBeMinInLoop(), llvm::CloneBasicBlock(), ClonedLoopTag, llvm::LoopBase< BlockT, LoopT >::contains(), llvm::BasicBlock::Create(), llvm::PHINode::Create(), llvm::BranchInst::Create(), llvm::IRBuilder< T, Inserter >::CreateCondBr(), llvm::IRBuilder< T, Inserter >::CreateICmpSGT(), llvm::IRBuilder< T, Inserter >::CreateICmpSLT(), llvm::IRBuilder< T, Inserter >::CreateICmpUGT(), llvm::IRBuilder< T, Inserter >::CreateICmpULT(), llvm::IRBuilder< T, Inserter >::CreateNot(), D, llvm::dbgs(), DisableAllLoopOptsOnLoop(), llvm::dyn_cast(), llvm::sys::path::end(), llvm::WebAssembly::End, llvm::Instruction::eraseFromParent(), llvm::SCEVExpander::expandCodeFor(), F(), llvm::SCEV::FlagAnyWrap, llvm::SCEV::FlagNSW, llvm::SCEV::FlagNUW, llvm::formLCSSARecursively(), llvm::IntegerType::get(), llvm::ConstantInt::get(), llvm::MDNode::get(), llvm::ScalarEvolution::getAddExpr(), llvm::IntegerType::getBitWidth(), getBitWidth(), llvm::BranchInst::getCondition(), llvm::ScalarEvolution::getConstant(), llvm::Type::getContext(), llvm::Module::getDataLayout(), llvm::BranchProbabilityInfo::getEdgeProbability(), llvm::ScalarEvolution::getExitCount(), llvm::LoopBase< BlockT, LoopT >::getHeader(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValueForBlock(), llvm::SCEVAddRecExpr::getLoop(), llvm::ScalarEvolution::getLoopDisposition(), llvm::LoopBase< BlockT, LoopT >::getLoopLatch(), llvm::LoopBase< BlockT, LoopT >::getLoopPreheader(), llvm::Instruction::getMetadata(), llvm::ScalarEvolution::getMinusSCEV(), llvm::BasicBlock::getModule(), llvm::ScalarEvolution::getMulExpr(), llvm::Value::getName(), llvm::ScalarEvolution::getNegativeSCEV(), llvm::SCEVNAryExpr::getNoWrapFlags(), llvm::PHINode::getNumIncomingValues(), llvm::ScalarEvolution::getOne(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::LoopBase< BlockT, LoopT >::getParentLoop(), llvm::CmpInst::getPredicate(), llvm::ScalarEvolution::getSCEV(), llvm::APInt::getSignedMaxValue(), llvm::ScalarEvolution::getSignExtendExpr(), llvm::ScalarEvolution::getSMaxExpr(), llvm::ScalarEvolution::getSMinExpr(), llvm::SCEVAddRecExpr::getStart(), llvm::SCEVAddRecExpr::getStepRecurrence(), llvm::BranchInst::getSuccessor(), llvm::CmpInst::getSwappedPredicate(), llvm::BasicBlock::getTerminator(), llvm::SCEV::getType(), llvm::SCEVNAryExpr::getType(), llvm::Value::getType(), llvm::ScalarEvolution::getUMaxExpr(), llvm::ScalarEvolution::getUMinExpr(), llvm::SCEVConstant::getValue(), llvm::Optional< T >::getValue(), llvm::BranchProbability::getZero(), llvm::ScalarEvolution::getZero(), llvm::Optional< T >::hasValue(), I, llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::ICMP_ULT, llvm::SCEVAddRecExpr::isAffine(), llvm::ScalarEvolution::isAvailableAtLoopEntry(), llvm::ICmpInst::isEquality(), isKnownNonNegativeInLoop(), llvm::ScalarEvolution::isKnownPredicate(), llvm::ScalarEvolution::isLoopEntryGuardedByCond(), llvm::LoopBase< BlockT, LoopT >::isLoopExiting(), llvm::Loop::isLoopSimplifyForm(), llvm::ConstantInt::isMinusOne(), llvm::ConstantInt::isNegative(), llvm::ConstantInt::isOne(), isSafeDecreasingBound(), isSafeIncreasingBound(), llvm::isSafeToExpandAt(), llvm::CmpInst::isSigned(), llvm::BranchInst::isUnconditional(), llvm::SCEV::isZero(), llvm::ConstantInt::isZero(), LLVM_DEBUG, llvm::ScalarEvolution::LoopInvariant, llvm::AArch64CC::LS, llvm::makeArrayRef(), MaxExitProbReciprocal, llvm::None, llvm::RemapInstruction(), llvm::sys::fs::remove(), llvm::User::replaceUsesOfWith(), llvm::RF_IgnoreMissingLocals, llvm::RF_NoModuleLevelChanges, llvm::X86ISD::SBB, llvm::PHINode::setIncomingValue(), llvm::IRBuilderBase::SetInsertPoint(), llvm::Value::setName(), llvm::simplifyLoop(), SkipProfitabilityChecks, llvm::successors(), std::swap(), X, and Y.

◆ isKnownNonNegativeInLoop()

static bool isKnownNonNegativeInLoop ( const SCEV BoundSCEV,
const Loop L,
ScalarEvolution SE 
)
static

◆ isSafeDecreasingBound()

static bool isSafeDecreasingBound ( const SCEV Start,
const SCEV BoundSCEV,
const SCEV Step,
ICmpInst::Predicate  Pred,
unsigned  LatchBrExitIdx,
Loop L,
ScalarEvolution SE 
)
static

◆ isSafeIncreasingBound()

static bool isSafeIncreasingBound ( const SCEV Start,
const SCEV BoundSCEV,
const SCEV Step,
ICmpInst::Predicate  Pred,
unsigned  LatchBrExitIdx,
Loop L,
ScalarEvolution SE 
)
static

Variable Documentation

◆ AllowUnsignedLatchCondition

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

Referenced by isKnownNegativeInLoop().

◆ ClonedLoopTag

const char* ClonedLoopTag = "irce.loop.clone"
static

Definition at line 119 of file InductiveRangeCheckElimination.cpp.

Referenced by isKnownNegativeInLoop().

◆ elimination

Inductive range check elimination

Definition at line 283 of file InductiveRangeCheckElimination.cpp.

◆ false

Inductive range check false

Definition at line 283 of file InductiveRangeCheckElimination.cpp.

◆ irce

irce

Definition at line 283 of file InductiveRangeCheckElimination.cpp.

◆ LoopSizeCutoff

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

Referenced by llvm::IRCEPass::run().

◆ MaxExitProbReciprocal

cl::opt<int> MaxExitProbReciprocal("irce-max-exit-prob-reciprocal", cl::Hidden, cl::init(10))
static

Referenced by isKnownNegativeInLoop().

◆ PrintChangedLoops

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

Referenced by llvm::IRCEPass::run().

◆ PrintRangeChecks

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

Referenced by llvm::IRCEPass::run().

◆ SkipProfitabilityChecks

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

Referenced by isKnownNegativeInLoop().