[LLVMdev] Fwd: [Review Request][PATCH] Add the function "vectorizeBasicBlock"

Hongbin Zheng etherzhhb at gmail.com
Wed Apr 4 08:54:18 PDT 2012


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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Add-a-the-function-vectorizeBasicBlock-which-allow-u.patch
Type: text/x-diff
Size: 3525 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120404/5d76ca92/attachment.patch>


More information about the llvm-dev mailing list