LGTM, pushed, thanks.
On Wed, Nov 26, 2014 at 09:38:51AM +0800, Ruiling Song wrote: > Add an environment variable 'OCL_OUTPUT_CFG_GEN_IR' to control it. > > Signed-off-by: Ruiling Song <[email protected]> > --- > 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 > > _______________________________________________ > Beignet mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
