mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-15 16:09:57 +00:00
Clean up: Refactoring the hardcoded value of 6 for FindAvailableLoadedValue()'s parameter MaxInstsToScan. (Complete version of r247497. See D12886)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@248022 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
dc18fbbb2d
commit
69328805da
@ -16,6 +16,7 @@
|
||||
|
||||
#include "llvm/Analysis/AliasAnalysis.h"
|
||||
#include "llvm/IR/BasicBlock.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -29,15 +30,19 @@ class MDNode;
|
||||
bool isSafeToLoadUnconditionally(Value *V, Instruction *ScanFrom,
|
||||
unsigned Align);
|
||||
|
||||
/// DefMaxInstsToScan - the default number of maximum instructions
|
||||
/// to scan in the block, used by FindAvailableLoadedValue().
|
||||
extern cl::opt<unsigned> DefMaxInstsToScan;
|
||||
|
||||
/// FindAvailableLoadedValue - Scan the ScanBB block backwards (starting at
|
||||
/// the instruction before ScanFrom) checking to see if we have the value at
|
||||
/// the memory address *Ptr locally available within a small number of
|
||||
/// instructions. If the value is available, return it.
|
||||
///
|
||||
/// If not, return the iterator for the last validated instruction that the
|
||||
/// If not, return the iterator for the last validated instruction that the
|
||||
/// value would be live through. If we scanned the entire block and didn't
|
||||
/// find something that invalidates *Ptr or provides it, ScanFrom would be
|
||||
/// left at begin() and this returns null. ScanFrom could also be left
|
||||
/// left at begin() and this returns null. ScanFrom could also be left
|
||||
///
|
||||
/// MaxInstsToScan specifies the maximum instructions to scan in the block.
|
||||
/// If it is set to 0, it will scan the whole block. You can also optionally
|
||||
@ -48,7 +53,7 @@ bool isSafeToLoadUnconditionally(Value *V, Instruction *ScanFrom,
|
||||
/// is found, it is left unmodified.
|
||||
Value *FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB,
|
||||
BasicBlock::iterator &ScanFrom,
|
||||
unsigned MaxInstsToScan = 6,
|
||||
unsigned MaxInstsToScan = DefMaxInstsToScan,
|
||||
AliasAnalysis *AA = nullptr,
|
||||
AAMDNodes *AATags = nullptr);
|
||||
|
||||
|
@ -829,8 +829,9 @@ Value *Lint::findValueImpl(Value *V, bool OffsetOk,
|
||||
for (;;) {
|
||||
if (!VisitedBlocks.insert(BB).second)
|
||||
break;
|
||||
if (Value *U = FindAvailableLoadedValue(L->getPointerOperand(),
|
||||
BB, BBI, 6, AA))
|
||||
if (Value *U =
|
||||
FindAvailableLoadedValue(L->getPointerOperand(),
|
||||
BB, BBI, DefMaxInstsToScan, AA))
|
||||
return findValueImpl(U, OffsetOk, Visited);
|
||||
if (BBI != BB->begin()) break;
|
||||
BB = BB->getUniquePredecessor();
|
||||
|
@ -161,6 +161,18 @@ bool llvm::isSafeToLoadUnconditionally(Value *V, Instruction *ScanFrom,
|
||||
return false;
|
||||
}
|
||||
|
||||
/// DefMaxInstsToScan - the default number of maximum instructions
|
||||
/// to scan in the block, used by FindAvailableLoadedValue().
|
||||
/// FindAvailableLoadedValue() was introduced in r60148, to improve jump
|
||||
/// threading in part by eliminating partially redundant loads.
|
||||
/// At that point, the value of MaxInstsToScan was already set to '6'
|
||||
/// without documented explanation.
|
||||
cl::opt<unsigned>
|
||||
llvm::DefMaxInstsToScan("available-load-scan-limit", cl::init(6), cl::Hidden,
|
||||
cl::desc("Use this to specify the default maximum number of instructions "
|
||||
"to scan backward from a given instruction, when searching for "
|
||||
"available loaded value"));
|
||||
|
||||
/// \brief Scan the ScanBB block backwards to see if we have the value at the
|
||||
/// memory address *Ptr locally available within a small number of instructions.
|
||||
///
|
||||
|
@ -750,8 +750,9 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {
|
||||
// separated by a few arithmetic operations.
|
||||
BasicBlock::iterator BBI = &LI;
|
||||
AAMDNodes AATags;
|
||||
if (Value *AvailableVal = FindAvailableLoadedValue(Op, LI.getParent(), BBI,
|
||||
6, AA, &AATags)) {
|
||||
if (Value *AvailableVal =
|
||||
FindAvailableLoadedValue(Op, LI.getParent(), BBI,
|
||||
DefMaxInstsToScan, AA, &AATags)) {
|
||||
if (LoadInst *NLI = dyn_cast<LoadInst>(AvailableVal)) {
|
||||
unsigned KnownIDs[] = {
|
||||
LLVMContext::MD_tbaa,
|
||||
@ -822,7 +823,7 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {
|
||||
}
|
||||
|
||||
// load (select (cond, null, P)) -> load P
|
||||
if (isa<ConstantPointerNull>(SI->getOperand(1)) &&
|
||||
if (isa<ConstantPointerNull>(SI->getOperand(1)) &&
|
||||
LI.getPointerAddressSpace() == 0) {
|
||||
LI.setOperand(0, SI->getOperand(2));
|
||||
return &LI;
|
||||
|
@ -769,7 +769,7 @@ bool JumpThreading::ProcessBlock(BasicBlock *BB) {
|
||||
// If we're branching on a conditional, LVI might be able to determine
|
||||
// it's value at the branch instruction. We only handle comparisons
|
||||
// against a constant at this time.
|
||||
// TODO: This should be extended to handle switches as well.
|
||||
// TODO: This should be extended to handle switches as well.
|
||||
BranchInst *CondBr = dyn_cast<BranchInst>(BB->getTerminator());
|
||||
Constant *CondConst = dyn_cast<Constant>(CondCmp->getOperand(1));
|
||||
if (CondBr && CondConst && CondBr->isConditional()) {
|
||||
@ -877,7 +877,7 @@ bool JumpThreading::SimplifyPartiallyRedundantLoad(LoadInst *LI) {
|
||||
BasicBlock::iterator BBIt = LI;
|
||||
|
||||
if (Value *AvailableVal =
|
||||
FindAvailableLoadedValue(LoadedPtr, LoadBB, BBIt, 6)) {
|
||||
FindAvailableLoadedValue(LoadedPtr, LoadBB, BBIt, DefMaxInstsToScan)) {
|
||||
// If the value of the load is locally available within the block, just use
|
||||
// it. This frequently occurs for reg2mem'd allocas.
|
||||
//cerr << "LOAD ELIMINATED:\n" << *BBIt << *LI << "\n";
|
||||
@ -922,7 +922,8 @@ bool JumpThreading::SimplifyPartiallyRedundantLoad(LoadInst *LI) {
|
||||
// Scan the predecessor to see if the value is available in the pred.
|
||||
BBIt = PredBB->end();
|
||||
AAMDNodes ThisAATags;
|
||||
Value *PredAvailable = FindAvailableLoadedValue(LoadedPtr, PredBB, BBIt, 6,
|
||||
Value *PredAvailable = FindAvailableLoadedValue(LoadedPtr, PredBB, BBIt,
|
||||
DefMaxInstsToScan,
|
||||
nullptr, &ThisAATags);
|
||||
if (!PredAvailable) {
|
||||
OneUnavailablePred = PredBB;
|
||||
|
Loading…
Reference in New Issue
Block a user