[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