mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
[LDist] Filter the checks locally rather than in LAA, NFC
Before, we were passing the pointer partitions to LAA. Now, we get all the checks from LAA and filter out the checks within partitions in LoopDistribution. This effectively concludes the steps to move filtering memchecks from LAA into its clients. There is still some cleanup left to remove the unused interfaces in LAA that still take PtrPartition. (Moving this functionality to LoopDistribution also requires needsChecking on pointers to be made public.) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243613 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
11186e1752
commit
52aafdb50a
@ -435,7 +435,6 @@ public:
|
||||
arePointersInSamePartition(const SmallVectorImpl<int> &PtrToPartition,
|
||||
unsigned PtrIdx1, unsigned PtrIdx2);
|
||||
|
||||
private:
|
||||
/// \brief Decide whether we need to issue a run-time check for pointer at
|
||||
/// index \p I and \p J to prove their independence.
|
||||
///
|
||||
@ -443,8 +442,9 @@ private:
|
||||
/// pointers (-1 if the pointer belongs to multiple partitions). In this
|
||||
/// case omit checks between pointers belonging to the same partition.
|
||||
bool needsChecking(unsigned I, unsigned J,
|
||||
const SmallVectorImpl<int> *PtrPartition) const;
|
||||
const SmallVectorImpl<int> *PtrPartition = nullptr) const;
|
||||
|
||||
private:
|
||||
/// Holds a pointer to the ScalarEvolution analysis.
|
||||
ScalarEvolution *SE;
|
||||
};
|
||||
|
@ -627,6 +627,45 @@ public:
|
||||
static char ID;
|
||||
|
||||
private:
|
||||
/// \brief Filter out checks between pointers from the same partition.
|
||||
///
|
||||
/// \p PtrToPartition contains the partition number for pointers. Partition
|
||||
/// number -1 means that the pointer is used in multiple partitions. In this
|
||||
/// case we can't safely omit the check.
|
||||
SmallVector<RuntimePointerChecking::PointerCheck, 4>
|
||||
includeOnlyCrossPartitionChecks(
|
||||
const SmallVectorImpl<RuntimePointerChecking::PointerCheck> &AllChecks,
|
||||
const SmallVectorImpl<int> &PtrToPartition,
|
||||
const RuntimePointerChecking *RtPtrChecking) {
|
||||
SmallVector<RuntimePointerChecking::PointerCheck, 4> Checks;
|
||||
|
||||
std::copy_if(AllChecks.begin(), AllChecks.end(), std::back_inserter(Checks),
|
||||
[&](const RuntimePointerChecking::PointerCheck &Check) {
|
||||
for (unsigned PtrIdx1 : Check.first->Members)
|
||||
for (unsigned PtrIdx2 : Check.second->Members)
|
||||
// Only include this check if there is a pair of pointers
|
||||
// that require checking and the pointers fall into
|
||||
// separate partitions.
|
||||
//
|
||||
// (Note that we already know at this point that the two
|
||||
// pointer groups need checking but it doesn't follow
|
||||
// that each pair of pointers within the two groups need
|
||||
// checking as well.
|
||||
//
|
||||
// In other words we don't want to include a check just
|
||||
// because there is a pair of pointers between the two
|
||||
// pointer groups that require checks and a different
|
||||
// pair whose pointers fall into different partitions.)
|
||||
if (RtPtrChecking->needsChecking(PtrIdx1, PtrIdx2) &&
|
||||
!RuntimePointerChecking::arePointersInSamePartition(
|
||||
PtrToPartition, PtrIdx1, PtrIdx2))
|
||||
return true;
|
||||
return false;
|
||||
});
|
||||
|
||||
return Checks;
|
||||
}
|
||||
|
||||
/// \brief Try to distribute an inner-most loop.
|
||||
bool processLoop(Loop *L) {
|
||||
assert(L->empty() && "Only process inner loops.");
|
||||
@ -747,8 +786,10 @@ private:
|
||||
// If we need run-time checks to disambiguate pointers are run-time, version
|
||||
// the loop now.
|
||||
auto PtrToPartition = Partitions.computePartitionSetForPointers(LAI);
|
||||
auto Checks =
|
||||
LAI.getRuntimePointerChecking()->generateChecks(&PtrToPartition);
|
||||
const auto *RtPtrChecking = LAI.getRuntimePointerChecking();
|
||||
auto AllChecks = RtPtrChecking->generateChecks();
|
||||
auto Checks = includeOnlyCrossPartitionChecks(AllChecks, PtrToPartition,
|
||||
RtPtrChecking);
|
||||
if (!Checks.empty()) {
|
||||
DEBUG(dbgs() << "\nPointers:\n");
|
||||
DEBUG(LAI.getRuntimePointerChecking()->printChecks(dbgs(), Checks));
|
||||
|
Loading…
Reference in New Issue
Block a user