forked from OSchip/llvm-project
Exposed findDefsUsedOutsideOfLoop as a loop utility function
Exposed findDefsUsedOutsideOfLoop as a loop utility function by moving it from LoopDistribute to LoopUtils. Reviewed By: anemet llvm-svn: 245416
This commit is contained in:
parent
9c039962ca
commit
c5b7b55589
|
@ -281,6 +281,9 @@ void computeLICMSafetyInfo(LICMSafetyInfo *, Loop *);
|
||||||
/// variable. Returns true if this is an induction PHI along with the step
|
/// variable. Returns true if this is an induction PHI along with the step
|
||||||
/// value.
|
/// value.
|
||||||
bool isInductionPHI(PHINode *, ScalarEvolution *, ConstantInt *&);
|
bool isInductionPHI(PHINode *, ScalarEvolution *, ConstantInt *&);
|
||||||
|
|
||||||
|
/// \brief Returns the instructions that use values defined in the loop.
|
||||||
|
SmallVector<Instruction *, 8> findDefsUsedOutsideOfLoop(Loop *L);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
|
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
|
||||||
#include "llvm/Transforms/Utils/Cloning.h"
|
#include "llvm/Transforms/Utils/Cloning.h"
|
||||||
|
#include "llvm/Transforms/Utils/LoopUtils.h"
|
||||||
#include "llvm/Transforms/Utils/LoopVersioning.h"
|
#include "llvm/Transforms/Utils/LoopVersioning.h"
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
|
@ -565,25 +566,6 @@ private:
|
||||||
AccessesType Accesses;
|
AccessesType Accesses;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// \brief Returns the instructions that use values defined in the loop.
|
|
||||||
static SmallVector<Instruction *, 8> findDefsUsedOutsideOfLoop(Loop *L) {
|
|
||||||
SmallVector<Instruction *, 8> UsedOutside;
|
|
||||||
|
|
||||||
for (auto *Block : L->getBlocks())
|
|
||||||
// FIXME: I believe that this could use copy_if if the Inst reference could
|
|
||||||
// be adapted into a pointer.
|
|
||||||
for (auto &Inst : *Block) {
|
|
||||||
auto Users = Inst.users();
|
|
||||||
if (std::any_of(Users.begin(), Users.end(), [&](User *U) {
|
|
||||||
auto *Use = cast<Instruction>(U);
|
|
||||||
return !L->contains(Use->getParent());
|
|
||||||
}))
|
|
||||||
UsedOutside.push_back(&Inst);
|
|
||||||
}
|
|
||||||
|
|
||||||
return UsedOutside;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \brief The pass class.
|
/// \brief The pass class.
|
||||||
class LoopDistribute : public FunctionPass {
|
class LoopDistribute : public FunctionPass {
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -501,3 +501,22 @@ bool llvm::isInductionPHI(PHINode *Phi, ScalarEvolution *SE,
|
||||||
StepValue = ConstantInt::getSigned(CV->getType(), CVSize / Size);
|
StepValue = ConstantInt::getSigned(CV->getType(), CVSize / Size);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// \brief Returns the instructions that use values defined in the loop.
|
||||||
|
SmallVector<Instruction *, 8> llvm::findDefsUsedOutsideOfLoop(Loop *L) {
|
||||||
|
SmallVector<Instruction *, 8> UsedOutside;
|
||||||
|
|
||||||
|
for (auto *Block : L->getBlocks())
|
||||||
|
// FIXME: I believe that this could use copy_if if the Inst reference could
|
||||||
|
// be adapted into a pointer.
|
||||||
|
for (auto &Inst : *Block) {
|
||||||
|
auto Users = Inst.users();
|
||||||
|
if (std::any_of(Users.begin(), Users.end(), [&](User *U) {
|
||||||
|
auto *Use = cast<Instruction>(U);
|
||||||
|
return !L->contains(Use->getParent());
|
||||||
|
}))
|
||||||
|
UsedOutside.push_back(&Inst);
|
||||||
|
}
|
||||||
|
|
||||||
|
return UsedOutside;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue