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:
Ashutosh Nema 2015-08-19 05:40:42 +00:00
parent 9c039962ca
commit c5b7b55589
3 changed files with 23 additions and 19 deletions

View File

@ -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

View File

@ -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:

View File

@ -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;
}