summaryrefslogtreecommitdiff
path: root/ir_cuda_rose_utils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ir_cuda_rose_utils.cc')
-rw-r--r--ir_cuda_rose_utils.cc191
1 files changed, 191 insertions, 0 deletions
diff --git a/ir_cuda_rose_utils.cc b/ir_cuda_rose_utils.cc
new file mode 100644
index 0000000..e7b4c37
--- /dev/null
+++ b/ir_cuda_rose_utils.cc
@@ -0,0 +1,191 @@
+/*****************************************************************************
+ 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 "ir_rose_utils.hh"
+
+
+/**
+ * Returns the body of the for loop found by finding the first loop in
+ * code, and if level > 1 recursively calling on the body of the found
+ * loop and (level-1)
+ */
+SgNode* loop_body_at_level(SgNode* tnl, int level) {
+ SgNode *inner_nl = 0;
+ //Now strip out the tnl on the inner level of the for loop
+ //tree_node_list_iter tnli(tnl);
+
+ if (isSgBasicBlock(tnl)) {
+
+ SgStatementPtrList& tnli = isSgBasicBlock(tnl)->get_statements();
+
+ for (SgStatementPtrList::iterator it = tnli.begin(); it != tnli.end();
+ it++) {
+ if (isSgForStatement(*it)) {
+ inner_nl = loop_body_at_level(isSgForStatement(*it), level);
+ break;
+ }
+
+ }
+
+ }
+
+ return inner_nl;
+}
+
+SgNode* loop_body_at_level(SgForStatement* loop, int level) {
+ if (level > 1)
+ return loop_body_at_level(loop->get_loop_body(), level - 1);
+ return loop->get_loop_body();
+}
+
+void swap_node_for_node_list(SgNode* tn, SgNode* new_tnl) {
+ SgStatement *s = isSgStatement(tn);
+
+ SgStatement* p;
+ if (s != 0) {
+ p = isSgStatement(tn->get_parent());
+
+ if (p != 0) {
+
+ if (isSgBasicBlock(new_tnl)) {
+
+ /*SgStatementPtrList & list_ =
+ isSgBasicBlock(new_tnl)->get_statements();
+
+ if (isSgForStatement(p)) {
+ if (!isSgBasicBlock(isSgForStatement(p)->get_loop_body()))
+ p->replace_statement(s, isSgStatement(new_tnl));
+ else {
+ p->insert_statement(s, list_, true);
+ p->remove(s);
+ }
+ } else {
+ p->insert_statement(s, list_, true);
+ p->remove(s);
+ }
+ */
+ if (isSgForStatement(p)) {
+ if (!isSgBasicBlock(isSgForStatement(p)->get_loop_body()))
+ p->replace_statement(s, isSgStatement(new_tnl));
+ else {
+
+ SgStatementPtrList& list_ =
+ isSgBasicBlock(new_tnl)->get_statements();
+
+ //std::vector<SgStatement*> list;
+
+ SgStatementPtrList::iterator it = list_.begin();
+ SgStatement* begin = *it;
+ begin->set_parent(p);
+
+ p->replace_statement(s, begin);
+ it++;
+ //SgStatement* stmt = first;
+ SgStatement* temp = begin;
+ for (; it != list_.end(); it++) {
+ (*it)->set_parent(p);
+ p->insert_statement(temp, *it, false);
+ temp = *it;
+ }
+
+ }
+
+ } else {
+
+
+ SgStatementPtrList& list_ =
+ isSgBasicBlock(new_tnl)->get_statements();
+
+ //std::vector<SgStatement*> list;
+
+ SgStatementPtrList::iterator it = list_.begin();
+ SgStatement* begin = *it;
+ begin->set_parent(p);
+
+ p->replace_statement(s, begin);
+ it++;
+ //SgStatement* stmt = first;
+ SgStatement* temp = begin;
+ for (; it != list_.end(); it++) {
+ (*it)->set_parent(p);
+ p->insert_statement(temp, *it, false);
+ temp = *it;
+ }
+
+ }
+
+ /* SgStatement* temp = s;
+
+ SgStatementPtrList::iterator it = list_.begin();
+ p->insert_statement(temp, *it, true);
+ temp = *it;
+ p->remove_statement(s);
+ it++;
+ for (; it != list_.end(); it++) {
+ p->insert_statement(temp, *it, false);
+ temp = *it;
+ }
+
+ // new_tnl->set_parent(p);
+ //new_tnl->get_statements();
+ SgStatementPtrList& list =
+ isSgBasicBlock(new_tnl)->get_statements();
+
+ //std::vector<SgStatement*> list;
+
+ SgStatementPtrList::iterator it = list.begin();
+ SgStatement* begin = *it;
+ begin->set_parent(p);
+
+ p->replace_statement(s, begin);
+ it++;
+ //SgStatement* stmt = first;
+ SgStatement* temp = begin;
+ for (; it != list.end(); it++) {
+ (*it)->set_parent(p);
+ p->insert_statement(temp, *it, false);
+ temp = *it;
+ }
+ */
+ /* SgStatementPtrList& stmt_list = isSgBasicBlock(new_tnl)->get_statements();
+ SgStatement* target = s;
+
+ for(SgStatementPtrList::iterator it = stmt_list.begin() ; it != stmt_list.end(); it++)
+ {
+ isSgNode(*it)->set_parent(p);
+ p->insert_statement(isSgStateme, *it, false);
+ target = *it;
+ }
+
+ p->remove_statement(s);
+
+ */
+ }else if(isSgIfStmt(p)) {
+
+ if(isSgIfStmt(p)->get_true_body() == s)
+ isSgIfStmt(p)->set_true_body(isSgStatement(new_tnl));
+ else if(isSgIfStmt(p)->get_false_body() == s)
+ isSgIfStmt(p)->set_false_body(isSgStatement(new_tnl));
+ new_tnl->set_parent(p);
+ }
+ else {
+ p->replace_statement(s, isSgStatement(new_tnl));
+ new_tnl->set_parent(p);
+ }
+ }
+
+ }
+ // return isSgNode(p);
+}