[LLVMdev] [Review Request][PATCH] Add the function "vectorizeBasicBlock"
Hongbin Zheng
etherzhhb at gmail.com
Wed Apr 4 09:19:52 PDT 2012
Hi Hal,
On Thu, Apr 5, 2012 at 12:07 AM, Hal Finkel <hfinkel at anl.gov> wrote:
> Ether,
>
> Sounds great! Please keep in mind that, eventually, we'll also want to
> configure those options from TLI (or something similar). The patch
Thanks a lot for reminding this and this is what i want, in fact i
have a private backend targeting FPGA and i only want to vectorize the
load/store instructions.
> looks good to me.
I am going to commit tomorrow.
best regards
ether
>
> -Hal
>
> On Wed, 4 Apr 2012 23:54:18 +0800
> Hongbin Zheng <etherzhhb at gmail.com> wrote:
>
>> Hi Hal,
>>
>> I add a function named "vectorizeBasicBlock" which allow users to
>> perform basic block vectoirzation inside their pass. But i am not sure
>> whether i missed something as no one use the function right now (But
>> it will be used by Polly sometimes later[1]).
>>
>> In addition, we (tobi and me) also want to make the vectorizer being
>> configured command line flags. To achieve this, we are going to patch
>> the pass so that it do not read the options like ReqChainDepth,
>> SearchLimit, SplatBreaksChain, ... etc. from the command line option
>> directly, but read from an instance of the VectorizeConfig class,
>> where the VectorizeConfig class is designed to provide the vectorize
>> related parameters to to the BBVectorize pas.
>>
>> After this, people can pass target specific vectorize configuration to
>> the BBVectorize pass in tools like LLC. And original
>> createBBVectorizePass function can create a VectorizeConfig that read
>> the configuration from the commandline options and pass it to the
>> BBVectorizePass, hence users can still control the behaviour of the
>> pass with command like option.
>>
>> Any comment or suggestion is appreciated.
>>
>> best regards
>> ether
>>
>> [1]http://llvm.org/bugs/show_bug.cgi?id=12404
>> ---------- Forwarded message ----------
>> From: Hongbin Zheng <etherzhhb at gmail.com>
>> Date: Wed, Apr 4, 2012 at 9:55 PM
>> Subject: [Review Request][PATCH] Add a the function
>> "vectorizeBasicBlock" To: llvm-commits at cs.uiuc.edu
>> Cc: Tobias Grosser <tobias at grosser.es>
>>
>>
>> hi,
>>
>> This patch add a 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.
>>
>> The function is currently declared in
>> "include/llvm/Transforms/Vectorize.h", I have no idea in which header
>> the function should be declared though.
>>
>> best regards
>> ether
>>
>> ---
>> include/llvm/Transforms/Vectorize.h | 13 ++++++++++++-
>> lib/Transforms/Vectorize/BBVectorize.cpp | 25
>> ++++++++++++++++++++----- 2 files changed, 32 insertions(+), 6
>> deletions(-)
>>
>> diff --git a/include/llvm/Transforms/Vectorize.h
>> b/include/llvm/Transforms/Vectorize.h
>> index dfc099d..373d501 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,17 @@ 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.
>> +///
>> +/// @returns 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 28eb634..d65cdd8 100644
>> --- a/lib/Transforms/Vectorize/BBVectorize.cpp
>> +++ b/lib/Transforms/Vectorize/BBVectorize.cpp
>> @@ -143,6 +143,12 @@ namespace {
>> BBVectorize() : BasicBlockPass(ID) {
>> 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;
>> @@ -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 @@ -303,6 +305,14 @@ namespace {
>> DEBUG(dbgs() << "BBV: done!\n");
>> 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);
>> @@ -1861,3 +1871,8 @@ BasicBlockPass *llvm::createBBVectorizePass() {
>> return new BBVectorize();
>> }
>>
>> +bool llvm::vectorizeBasicBlock(Pass *P, BasicBlock &BB) {
>> + BBVectorize BBVectorizer(P);
>> + return BBVectorizer.vectorizeBB(BB);
>> +}
>> +
>> --
>> 1.7.5.4
>
>
>
> --
> Hal Finkel
> Postdoctoral Appointee
> Leadership Computing Facility
> Argonne National Laboratory
More information about the llvm-dev
mailing list