diff options
Diffstat (limited to 'chill/src/ir_rose_utils.cc')
-rw-r--r-- | chill/src/ir_rose_utils.cc | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/chill/src/ir_rose_utils.cc b/chill/src/ir_rose_utils.cc new file mode 100644 index 0000000..fbce2f1 --- /dev/null +++ b/chill/src/ir_rose_utils.cc @@ -0,0 +1,88 @@ +/***************************************************************************** + Copyright (C) 2008 University of Southern California + Copyright (C) 2009 University of Utah + All Rights Reserved. + + Purpose: + SUIF interface utilities. + + Notes: + + Update history: + 01/2006 created by Chun Chen +*****************************************************************************/ + +//#include <suif1.h> +//#include <useful.h> +//#include <vector> +//#include <algorithm> +//#include <code_gen/CG_suifRepr.h> +#include "ir_rose_utils.hh" + + + +std::vector<SgForStatement *> find_loops(SgNode *tnl) { + std::vector<SgForStatement *> result; + + //tree_node_list_iter iter(tnl); + + /*while (!iter.is_empty()) { + tree_node *tn = iter.step(); + if (tn->kind() == TREE_FOR) + result.push_back(static_cast<tree_for *>(tn)); + } + */ + + SgStatementPtrList& blockStatements = isSgBasicBlock(tnl)->get_statements(); + for(SgStatementPtrList::const_iterator j = blockStatements.begin(); j != blockStatements.end(); j++) + if(isSgForStatement(*j)) + result.push_back(isSgForStatement(*j)); + + return result; +} + +std::vector<SgForStatement *> find_deepest_loops(SgStatementPtrList& tnl) { + + std::vector<SgForStatement *> loops; + + + + for(SgStatementPtrList::const_iterator j = tnl.begin(); j != tnl.end(); j++) + { + std::vector<SgForStatement *> t = find_deepest_loops(isSgNode(*j)); + if (t.size() > loops.size()) + loops = t; + } + + + + return loops; + +} + + + + + + + + +std::vector<SgForStatement *> find_deepest_loops(SgNode *tn) { + if (isSgForStatement(tn)) { + std::vector<SgForStatement *> loops; + + SgForStatement *tnf = static_cast<SgForStatement*>(tn); + loops.insert(loops.end(), tnf); + std::vector<SgForStatement*> t = find_deepest_loops(isSgNode(tnf->get_loop_body())); + std::copy(t.begin(), t.end(), std::back_inserter(loops)); + + return loops; + } + else if (isSgBasicBlock(tn)) { + SgBasicBlock *tnb = static_cast<SgBasicBlock*>(tn); + return find_deepest_loops(tnb->get_statements()); + } + else + return std::vector<SgForStatement *>(); +} + |