mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 21:32:39 +00:00
[LoopAccesses] Factor out RuntimePointerCheck::needsChecking
Will be used by the new RuntimePointerCheck::print. This is part of the patchset that converts LoopAccessAnalysis into an actual analysis pass. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229629 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ce5c5c0301
commit
0cbfb71d7b
@ -116,6 +116,10 @@ public:
|
|||||||
void insert(ScalarEvolution *SE, Loop *Lp, Value *Ptr, bool WritePtr,
|
void insert(ScalarEvolution *SE, Loop *Lp, Value *Ptr, bool WritePtr,
|
||||||
unsigned DepSetId, unsigned ASId, ValueToValueMap &Strides);
|
unsigned DepSetId, unsigned ASId, ValueToValueMap &Strides);
|
||||||
|
|
||||||
|
/// \brief Decide whether we need to issue a run-time check for pointer at
|
||||||
|
/// index \p I and \p J to prove their independence.
|
||||||
|
bool needsChecking(unsigned I, unsigned J) const;
|
||||||
|
|
||||||
/// This flag indicates if we need to add the runtime check.
|
/// This flag indicates if we need to add the runtime check.
|
||||||
bool Need;
|
bool Need;
|
||||||
/// Holds the pointers that we need to check.
|
/// Holds the pointers that we need to check.
|
||||||
|
@ -93,6 +93,23 @@ void LoopAccessInfo::RuntimePointerCheck::insert(ScalarEvolution *SE, Loop *Lp,
|
|||||||
AliasSetId.push_back(ASId);
|
AliasSetId.push_back(ASId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LoopAccessInfo::RuntimePointerCheck::needsChecking(unsigned I,
|
||||||
|
unsigned J) const {
|
||||||
|
// No need to check if two readonly pointers intersect.
|
||||||
|
if (!IsWritePtr[I] && !IsWritePtr[J])
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Only need to check pointers between two different dependency sets.
|
||||||
|
if (DependencySetId[I] == DependencySetId[J])
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Only need to check pointers in the same alias set.
|
||||||
|
if (AliasSetId[I] != AliasSetId[J])
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
/// \brief Analyses memory accesses in a loop.
|
/// \brief Analyses memory accesses in a loop.
|
||||||
///
|
///
|
||||||
@ -1147,15 +1164,7 @@ LoopAccessInfo::addRuntimeCheck(Instruction *Loc) {
|
|||||||
Value *MemoryRuntimeCheck = nullptr;
|
Value *MemoryRuntimeCheck = nullptr;
|
||||||
for (unsigned i = 0; i < NumPointers; ++i) {
|
for (unsigned i = 0; i < NumPointers; ++i) {
|
||||||
for (unsigned j = i+1; j < NumPointers; ++j) {
|
for (unsigned j = i+1; j < NumPointers; ++j) {
|
||||||
// No need to check if two readonly pointers intersect.
|
if (!PtrRtCheck.needsChecking(i, j))
|
||||||
if (!PtrRtCheck.IsWritePtr[i] && !PtrRtCheck.IsWritePtr[j])
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Only need to check pointers between two different dependency sets.
|
|
||||||
if (PtrRtCheck.DependencySetId[i] == PtrRtCheck.DependencySetId[j])
|
|
||||||
continue;
|
|
||||||
// Only need to check pointers in the same alias set.
|
|
||||||
if (PtrRtCheck.AliasSetId[i] != PtrRtCheck.AliasSetId[j])
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
unsigned AS0 = Starts[i]->getType()->getPointerAddressSpace();
|
unsigned AS0 = Starts[i]->getType()->getPointerAddressSpace();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user