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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154089 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Hongbin Zheng
2012-04-05 08:05:16 +00:00
parent 22378fd664
commit 87825e7970
2 changed files with 32 additions and 6 deletions

View File

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