mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-29 10:25:12 +00:00
factor some code out into some helper functions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@89975 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -684,6 +684,33 @@ SortNonLocalDepInfoCache(MemoryDependenceAnalysis::NonLocalDepInfo &Cache,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// isPHITranslatable - Return true if the specified computation is derived from
|
||||||
|
/// a PHI node in the current block and if it is simple enough for us to handle.
|
||||||
|
static bool isPHITranslatable(Instruction *Inst) {
|
||||||
|
if (isa<PHINode>(Inst))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// TODO: BITCAST, GEP.
|
||||||
|
|
||||||
|
// ...
|
||||||
|
|
||||||
|
// cerr << "MEMDEP: Could not PHI translate: " << *Pointer;
|
||||||
|
// if (isa<BitCastInst>(PtrInst) || isa<GetElementPtrInst>(PtrInst))
|
||||||
|
// cerr << "OP:\t\t\t\t" << *PtrInst->getOperand(0);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// PHITranslateForPred - Given a computation that satisfied the
|
||||||
|
/// isPHITranslatable predicate, see if we can translate the computation into
|
||||||
|
/// the specified predecessor block. If so, return that value.
|
||||||
|
static Value *PHITranslateForPred(Instruction *Inst, BasicBlock *Pred) {
|
||||||
|
if (PHINode *PN = dyn_cast<PHINode>(Inst))
|
||||||
|
return PN->getIncomingValueForBlock(Pred);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// getNonLocalPointerDepFromBB - Perform a dependency query based on
|
/// getNonLocalPointerDepFromBB - Perform a dependency query based on
|
||||||
/// pointer/pointeesize starting at the end of StartBB. Add any clobber/def
|
/// pointer/pointeesize starting at the end of StartBB. Add any clobber/def
|
||||||
@@ -827,14 +854,18 @@ getNonLocalPointerDepFromBB(Value *Pointer, uint64_t PointeeSize,
|
|||||||
NumSortedEntries = Cache->size();
|
NumSortedEntries = Cache->size();
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this is directly a PHI node, just use the incoming values for each
|
// If this is a computation derived from a PHI node, use the suitably
|
||||||
// pred as the phi translated version.
|
// translated incoming values for each pred as the phi translated version.
|
||||||
if (PHINode *PtrPHI = dyn_cast<PHINode>(PtrInst)) {
|
if (isPHITranslatable(PtrInst)) {
|
||||||
Cache = 0;
|
Cache = 0;
|
||||||
|
|
||||||
for (BasicBlock **PI = PredCache->GetPreds(BB); *PI; ++PI) {
|
for (BasicBlock **PI = PredCache->GetPreds(BB); *PI; ++PI) {
|
||||||
BasicBlock *Pred = *PI;
|
BasicBlock *Pred = *PI;
|
||||||
Value *PredPtr = PtrPHI->getIncomingValueForBlock(Pred);
|
Value *PredPtr = PHITranslateForPred(PtrInst, Pred);
|
||||||
|
|
||||||
|
// If PHI translation fails, bail out.
|
||||||
|
if (PredPtr == 0)
|
||||||
|
goto PredTranslationFailure;
|
||||||
|
|
||||||
// Check to see if we have already visited this pred block with another
|
// Check to see if we have already visited this pred block with another
|
||||||
// pointer. If so, we can't do this lookup. This failure can occur
|
// pointer. If so, we can't do this lookup. This failure can occur
|
||||||
@@ -881,12 +912,7 @@ getNonLocalPointerDepFromBB(Value *Pointer, uint64_t PointeeSize,
|
|||||||
SkipFirstBlock = false;
|
SkipFirstBlock = false;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: BITCAST, GEP.
|
|
||||||
|
|
||||||
// cerr << "MEMDEP: Could not PHI translate: " << *Pointer;
|
|
||||||
// if (isa<BitCastInst>(PtrInst) || isa<GetElementPtrInst>(PtrInst))
|
|
||||||
// cerr << "OP:\t\t\t\t" << *PtrInst->getOperand(0);
|
|
||||||
PredTranslationFailure:
|
PredTranslationFailure:
|
||||||
|
|
||||||
if (Cache == 0) {
|
if (Cache == 0) {
|
||||||
|
Reference in New Issue
Block a user