[Beignet] [PATCH] GBE: Output CFG of Gen IR to dot file.

Ruiling Song ruiling.song at intel.com
Tue Nov 25 17:38:51 PST 2014


Add an environment variable 'OCL_OUTPUT_CFG_GEN_IR' to control it.

Signed-off-by: Ruiling Song <ruiling.song at intel.com>
---
 backend/src/ir/function.cpp      |   21 +++++++++++++++++++++
 backend/src/ir/function.hpp      |    2 ++
 backend/src/llvm/llvm_to_gen.cpp |    3 +++
 3 files changed, 26 insertions(+)

diff --git a/backend/src/ir/function.cpp b/backend/src/ir/function.cpp
index 7983778..6dde6e2 100644
--- a/backend/src/ir/function.cpp
+++ b/backend/src/ir/function.cpp
@@ -281,6 +281,27 @@ namespace ir {
     });
   }
 
+  void Function::outputCFG(void) {
+    std::string fileName = getName() + std::string(".dot");
+    ::FILE *fp = fopen(fileName.c_str(), "w");
+    if (fp == NULL) return;
+
+    printf("writing Gen IR CFG to %s\n", fileName.c_str());
+    fprintf(fp, "digraph \"%s\" {\n", getName().c_str());
+    this->foreachBlock([this, fp](BasicBlock &bb) {
+      uint32_t lid = bb.getLabelIndex();
+      fprintf(fp, "Node%d [shape=record, label=\"{%d}\"];\n", lid, lid);
+      set<BasicBlock*> &succ = bb.successors;
+      for (auto x : succ) {
+        uint32_t next = x->getLabelIndex();
+        fprintf(fp, "Node%d -> Node%d\n", lid, next);
+      }
+    });
+    fprintf(fp, "}\n");
+    fclose(fp);
+  }
+
+
   std::ostream &operator<< (std::ostream &out, const Function &fn)
   {
     out << ".decl_function " << fn.getName() << std::endl;
diff --git a/backend/src/ir/function.hpp b/backend/src/ir/function.hpp
index 0381095..1163a19 100644
--- a/backend/src/ir/function.hpp
+++ b/backend/src/ir/function.hpp
@@ -428,6 +428,8 @@ namespace ir {
     /*! Get surface starting address register from bti */
     Register getSurfaceBaseReg(uint8_t bti) const;
     void appendSurface(uint8_t bti, Register reg);
+    /*! Output the control flow graph to .dot file */
+    void outputCFG();
   private:
     friend class Context;           //!< Can freely modify a function
     std::string name;               //!< Function name
diff --git a/backend/src/llvm/llvm_to_gen.cpp b/backend/src/llvm/llvm_to_gen.cpp
index eb75ba1..e1bf12f 100644
--- a/backend/src/llvm/llvm_to_gen.cpp
+++ b/backend/src/llvm/llvm_to_gen.cpp
@@ -74,6 +74,7 @@ namespace gbe
 {
   BVAR(OCL_OUTPUT_CFG, false);
   BVAR(OCL_OUTPUT_CFG_ONLY, false);
+  BVAR(OCL_OUTPUT_CFG_GEN_IR, false);
   using namespace llvm;
 
   void runFuntionPass(Module &mod, TargetLibraryInfo *libraryInfo, const DataLayout &DL)
@@ -297,6 +298,8 @@ namespace gbe
       analysis::ControlTree *ct = new analysis::ControlTree(iter->second);
       ct->analyze();
       delete ct;
+      if (OCL_OUTPUT_CFG_GEN_IR)
+        iter->second->outputCFG();
       iter++;
     }
 
-- 
1.7.10.4



More information about the Beignet mailing list