From: Hongbin Zheng Date: Thu, 5 Apr 2012 08:05:16 +0000 (+0000) Subject: Add the function "vectorizeBasicBlock" which allow users vectorize a X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=87825e7970a361ce5a8bab19bc880ff7f6242ca2;p=oota-llvm.git 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 --- diff --git a/include/llvm/Transforms/Vectorize.h b/include/llvm/Transforms/Vectorize.h index dfc099ddb9b..ad06937caa7 100644 --- a/include/llvm/Transforms/Vectorize.h +++ b/include/llvm/Transforms/Vectorize.h @@ -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 diff --git a/lib/Transforms/Vectorize/BBVectorize.cpp b/lib/Transforms/Vectorize/BBVectorize.cpp index 28eb6345071..5abb242428a 100644 --- a/lib/Transforms/Vectorize/BBVectorize.cpp +++ b/lib/Transforms/Vectorize/BBVectorize.cpp @@ -144,6 +144,12 @@ namespace { initializeBBVectorizePass(*PassRegistry::getPassRegistry()); } + BBVectorize(Pass *P) : BasicBlockPass(ID) { + AA = &P->getAnalysis(); + SE = &P->getAnalysis(); + TD = P->getAnalysisIfAvailable(); + } + typedef std::pair ValuePair; typedef std::pair ValuePairWithDepth; typedef std::pair VPPair; // A ValuePair pair @@ -280,11 +286,7 @@ namespace { Instruction *&InsertionPt, Instruction *I, Instruction *J); - virtual bool runOnBasicBlock(BasicBlock &BB) { - AA = &getAnalysis(); - SE = &getAnalysis(); - TD = getAnalysisIfAvailable(); - + 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(); + SE = &getAnalysis(); + TD = getAnalysisIfAvailable(); + + return vectorizeBB(BB); + } + virtual void getAnalysisUsage(AnalysisUsage &AU) const { BasicBlockPass::getAnalysisUsage(AU); AU.addRequired(); @@ -1861,3 +1871,7 @@ BasicBlockPass *llvm::createBBVectorizePass() { return new BBVectorize(); } +bool llvm::vectorizeBasicBlock(Pass *P, BasicBlock &BB) { + BBVectorize BBVectorizer(P); + return BBVectorizer.vectorizeBB(BB); +}