mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
Add the function "vectorizeBasicBlock" which allow users vectorize a
BasicBlock in other passes, e.g. we can call vectorizeBasicBlock in the loop unroll pass right after the loop is unrolled. llvm-svn: 154089
This commit is contained in:
parent
5d11d38750
commit
8d380b332d
@ -16,7 +16,7 @@
|
||||
#define LLVM_TRANSFORMS_VECTORIZE_H
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class BasicBlock;
|
||||
class BasicBlockPass;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -25,6 +25,18 @@ class BasicBlockPass;
|
||||
//
|
||||
BasicBlockPass *createBBVectorizePass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// @brief Vectorize the BasicBlock.
|
||||
///
|
||||
/// @param BB The BasicBlock to be vectorized
|
||||
/// @param P The current running pass, should require AliasAnalysis and
|
||||
/// ScalarEvolution. After the vectorization, AliasAnalysis,
|
||||
/// ScalarEvolution and CFG are preserved.
|
||||
///
|
||||
/// @return True if the BB is changed, false otherwise.
|
||||
///
|
||||
bool vectorizeBasicBlock(Pass *P, BasicBlock &BB);
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
@ -144,6 +144,12 @@ namespace {
|
||||
initializeBBVectorizePass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
BBVectorize(Pass *P) : BasicBlockPass(ID) {
|
||||
AA = &P->getAnalysis<AliasAnalysis>();
|
||||
SE = &P->getAnalysis<ScalarEvolution>();
|
||||
TD = P->getAnalysisIfAvailable<TargetData>();
|
||||
}
|
||||
|
||||
typedef std::pair<Value *, Value *> ValuePair;
|
||||
typedef std::pair<ValuePair, size_t> ValuePairWithDepth;
|
||||
typedef std::pair<ValuePair, ValuePair> VPPair; // A ValuePair pair
|
||||
@ -280,11 +286,7 @@ namespace {
|
||||
Instruction *&InsertionPt,
|
||||
Instruction *I, Instruction *J);
|
||||
|
||||
virtual bool runOnBasicBlock(BasicBlock &BB) {
|
||||
AA = &getAnalysis<AliasAnalysis>();
|
||||
SE = &getAnalysis<ScalarEvolution>();
|
||||
TD = getAnalysisIfAvailable<TargetData>();
|
||||
|
||||
bool vectorizeBB(BasicBlock &BB) {
|
||||
bool changed = false;
|
||||
// Iterate a sufficient number of times to merge types of size 1 bit,
|
||||
// then 2 bits, then 4, etc. up to half of the target vector width of the
|
||||
@ -304,6 +306,14 @@ namespace {
|
||||
return changed;
|
||||
}
|
||||
|
||||
virtual bool runOnBasicBlock(BasicBlock &BB) {
|
||||
AA = &getAnalysis<AliasAnalysis>();
|
||||
SE = &getAnalysis<ScalarEvolution>();
|
||||
TD = getAnalysisIfAvailable<TargetData>();
|
||||
|
||||
return vectorizeBB(BB);
|
||||
}
|
||||
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
BasicBlockPass::getAnalysisUsage(AU);
|
||||
AU.addRequired<AliasAnalysis>();
|
||||
@ -1861,3 +1871,7 @@ BasicBlockPass *llvm::createBBVectorizePass() {
|
||||
return new BBVectorize();
|
||||
}
|
||||
|
||||
bool llvm::vectorizeBasicBlock(Pass *P, BasicBlock &BB) {
|
||||
BBVectorize BBVectorizer(P);
|
||||
return BBVectorizer.vectorizeBB(BB);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user