diff options
author | Tuowen Zhao <ztuowen@gmail.com> | 2016-09-21 22:35:47 -0600 |
---|---|---|
committer | Tuowen Zhao <ztuowen@gmail.com> | 2016-09-21 22:35:47 -0600 |
commit | ab016596602a4c6bdc27adf01c308b325af221f0 (patch) | |
tree | 4e86bfcf1f38fb00cc58082d540dc3570e0f126b /src/ir_rose.cc | |
parent | 6983c09937baac3ffb7d3a45c3c5009c0eba7e6c (diff) | |
download | chill-ab016596602a4c6bdc27adf01c308b325af221f0.tar.gz chill-ab016596602a4c6bdc27adf01c308b325af221f0.tar.bz2 chill-ab016596602a4c6bdc27adf01c308b325af221f0.zip |
something that only builds ...
Diffstat (limited to 'src/ir_rose.cc')
-rw-r--r-- | src/ir_rose.cc | 1699 |
1 files changed, 0 insertions, 1699 deletions
diff --git a/src/ir_rose.cc b/src/ir_rose.cc deleted file mode 100644 index f4039ab..0000000 --- a/src/ir_rose.cc +++ /dev/null @@ -1,1699 +0,0 @@ -/***************************************************************************** - Copyright (C) 2009-2010 University of Utah - All Rights Reserved. - - Purpose: - CHiLL's rose interface. - - Notes: - Array supports mixed pointer and array type in a single declaration. - - History: - 02/23/2009 Created by Chun Chen. -*****************************************************************************/ -#include <string> -#include "ir_rose.hh" -#include "ir_rose_utils.hh" -#include "code_gen/rose_attributes.h" -#include "code_gen/CG_roseRepr.h" -#include "code_gen/CG_roseBuilder.h" - -using namespace SageBuilder; -using namespace SageInterface; -using namespace omega; -// ---------------------------------------------------------------------------- -// Class: IR_roseScalarSymbol -// ---------------------------------------------------------------------------- - -std::string IR_roseScalarSymbol::name() const { - return vs_->get_name().getString(); -} - -int IR_roseScalarSymbol::size() const { - return (vs_->get_type()->memoryUsage()) / (vs_->get_type()->numberOfNodes()); -} - -bool IR_roseScalarSymbol::operator==(const IR_Symbol &that) const { - if (typeid(*this) != typeid(that)) - return false; - - const IR_roseScalarSymbol *l_that = - static_cast<const IR_roseScalarSymbol *>(&that); - return this->vs_ == l_that->vs_; -} - -IR_Symbol *IR_roseScalarSymbol::clone() const { - return NULL; -} - -// ---------------------------------------------------------------------------- -// Class: IR_roseArraySymbol -// ---------------------------------------------------------------------------- - -std::string IR_roseArraySymbol::name() const { - return (vs_->get_declaration()->get_name().getString()); -} - -int IR_roseArraySymbol::elem_size() const { - - SgType *tn = vs_->get_type(); - SgType* arrType; - - int elemsize; - - if (arrType = isSgArrayType(tn)) { - while (isSgArrayType(arrType)) { - arrType = arrType->findBaseType(); - } - } else if (arrType = isSgPointerType(tn)) { - while (isSgPointerType(arrType)) { - arrType = arrType->findBaseType(); - } - } - - elemsize = (int) arrType->memoryUsage() / arrType->numberOfNodes(); - return elemsize; -} - -int IR_roseArraySymbol::n_dim() const { - int dim = 0; - SgType* arrType = isSgArrayType(vs_->get_type()); - SgType* ptrType = isSgPointerType(vs_->get_type()); - if (arrType != NULL) { - while (isSgArrayType(arrType)) { - arrType = isSgArrayType(arrType)->get_base_type(); - dim++; - } - } else if (ptrType != NULL) { - while (isSgPointerType(ptrType)) { - ptrType = isSgPointerType(ptrType)->get_base_type(); - dim++; - } - } - - // Manu:: fortran support - if (static_cast<const IR_roseCode *>(ir_)->is_fortran_) { - - if (arrType != NULL) { - dim = 0; - SgExprListExp * dimList = isSgArrayType(vs_->get_type())->get_dim_info(); - SgExpressionPtrList::iterator it = dimList->get_expressions().begin(); - for(;it != dimList->get_expressions().end(); it++) { - dim++; - } - } else if (ptrType != NULL) { - ; // not sure if this case will happen - } - } - - return dim; -} - -omega::CG_outputRepr *IR_roseArraySymbol::size(int dim) const { - - SgArrayType* arrType = isSgArrayType(vs_->get_type()); - int count = 0; - SgExpression* expr; - SgType* pntrType = isSgPointerType(vs_->get_type()); - - if (arrType != NULL) { - SgExprListExp* dimList = arrType->get_dim_info(); - if (!static_cast<const IR_roseCode *>(ir_)->is_fortran_) { - SgExpressionPtrList::iterator it = - dimList->get_expressions().begin(); - - while ((it != dimList->get_expressions().end()) && (count < dim)) { - it++; - count++; - } - - expr = *it; - } else { - SgExpressionPtrList::reverse_iterator i = - dimList->get_expressions().rbegin(); - for (; (i != dimList->get_expressions().rend()) && (count < dim); - i++) { - - count++; - } - - expr = *i; - } - } else if (pntrType != NULL) { - - while (count < dim) { - pntrType = (isSgPointerType(pntrType))->get_base_type(); - count++; - } - if (isSgPointerType(pntrType)) - expr = new SgExpression; - } - - if (!expr) - throw ir_error("Index variable is NULL!!"); - - // Manu :: debug - std::cout << "---------- size :: " << isSgNode(expr)->unparseToString().c_str() << "\n"; - - return new omega::CG_roseRepr(expr); - -} - -IR_ARRAY_LAYOUT_TYPE IR_roseArraySymbol::layout_type() const { - if (static_cast<const IR_roseCode *>(ir_)->is_fortran_) - return IR_ARRAY_LAYOUT_COLUMN_MAJOR; - else - return IR_ARRAY_LAYOUT_ROW_MAJOR; - -} - -bool IR_roseArraySymbol::operator==(const IR_Symbol &that) const { - - if (typeid(*this) != typeid(that)) - return false; - - const IR_roseArraySymbol *l_that = - static_cast<const IR_roseArraySymbol *>(&that); - return this->vs_ == l_that->vs_; - -} - -IR_Symbol *IR_roseArraySymbol::clone() const { - return new IR_roseArraySymbol(ir_, vs_); -} - -// ---------------------------------------------------------------------------- -// Class: IR_roseConstantRef -// ---------------------------------------------------------------------------- - -bool IR_roseConstantRef::operator==(const IR_Ref &that) const { - - if (typeid(*this) != typeid(that)) - return false; - - const IR_roseConstantRef *l_that = - static_cast<const IR_roseConstantRef *>(&that); - - if (this->type_ != l_that->type_) - return false; - - if (this->type_ == IR_CONSTANT_INT) - return this->i_ == l_that->i_; - else - return this->f_ == l_that->f_; - -} - -omega::CG_outputRepr *IR_roseConstantRef::convert() { - if (type_ == IR_CONSTANT_INT) { - omega::CG_roseRepr *result = new omega::CG_roseRepr( - isSgExpression(buildIntVal(static_cast<int>(i_)))); - delete this; - return result; - } else - throw ir_error("constant type not supported"); - -} - -IR_Ref *IR_roseConstantRef::clone() const { - if (type_ == IR_CONSTANT_INT) - return new IR_roseConstantRef(ir_, i_); - else if (type_ == IR_CONSTANT_FLOAT) - return new IR_roseConstantRef(ir_, f_); - else - throw ir_error("constant type not supported"); - -} - -// ---------------------------------------------------------------------------- -// Class: IR_roseScalarRef -// ---------------------------------------------------------------------------- - -bool IR_roseScalarRef::is_write() const { - if (is_write_ == 1) - return true; - - return false; -} - -IR_ScalarSymbol *IR_roseScalarRef::symbol() const { - return new IR_roseScalarSymbol(ir_, vs_->get_symbol()); -} - -bool IR_roseScalarRef::operator==(const IR_Ref &that) const { - if (typeid(*this) != typeid(that)) - return false; - - const IR_roseScalarRef *l_that = - static_cast<const IR_roseScalarRef *>(&that); - - if (this->ins_pos_ == NULL) - return this->vs_ == l_that->vs_; - else - return this->ins_pos_ == l_that->ins_pos_ - && this->op_pos_ == l_that->op_pos_; -} - -omega::CG_outputRepr *IR_roseScalarRef::convert() { - omega::CG_roseRepr *result = new omega::CG_roseRepr(isSgExpression(vs_)); - delete this; - return result; - -} - -IR_Ref * IR_roseScalarRef::clone() const { - return new IR_roseScalarRef(ir_, vs_, this->is_write_); -} - -// ---------------------------------------------------------------------------- -// Class: IR_roseArrayRef -// ---------------------------------------------------------------------------- - -bool IR_roseArrayRef::is_write() const { - SgAssignOp* assignment; - - if (is_write_ == 1 || is_write_ == 0) - return is_write_; - if (assignment = isSgAssignOp(ia_->get_parent())) { - if (assignment->get_lhs_operand() == ia_) - return true; - } else if (SgExprStatement* expr_stmt = isSgExprStatement( - ia_->get_parent())) { - SgExpression* exp = expr_stmt->get_expression(); - - if (exp) { - if (assignment = isSgAssignOp(exp)) { - if (assignment->get_lhs_operand() == ia_) - return true; - - } - } - - } - return false; -} - -omega::CG_outputRepr *IR_roseArrayRef::index(int dim) const { - - SgExpression *current = isSgExpression(ia_); - SgExpression* expr; - int count = 0; - - while (isSgPntrArrRefExp(current)) { - current = isSgPntrArrRefExp(current)->get_lhs_operand(); - count++; - } - - current = ia_; - - while (count > dim) { - expr = isSgPntrArrRefExp(current)->get_rhs_operand(); - current = isSgPntrArrRefExp(current)->get_lhs_operand(); - count--; - } - - // Manu:: fortran support - if (static_cast<const IR_roseCode *>(ir_)->is_fortran_) { - expr = isSgPntrArrRefExp(ia_)->get_rhs_operand(); - count = 0; - if (isSgExprListExp(expr)) { - SgExpressionPtrList::iterator indexList = isSgExprListExp(expr)->get_expressions().begin(); - while (count < dim) { - indexList++; - count++; - } - expr = isSgExpression(*indexList); - } - } - - if (!expr) - throw ir_error("Index variable is NULL!!"); - - - omega::CG_roseRepr* ind = new omega::CG_roseRepr(expr); - - return ind->clone(); - -} - -IR_ArraySymbol *IR_roseArrayRef::symbol() const { - - SgExpression *current = isSgExpression(ia_); - - SgVarRefExp* base; - SgVariableSymbol *arrSymbol; - while (isSgPntrArrRefExp(current) || isSgUnaryOp(current)) { - if (isSgPntrArrRefExp(current)) - current = isSgPntrArrRefExp(current)->get_lhs_operand(); - else if (isSgUnaryOp(current)) - /* To handle support for addressof operator and pointer dereference - * both of which are unary ops - */ - current = isSgUnaryOp(current)->get_operand(); - } - if (base = isSgVarRefExp(current)) { - arrSymbol = (SgVariableSymbol*) (base->get_symbol()); - std::string x = arrSymbol->get_name().getString(); - } else - throw ir_error("Array Symbol is not a variable?!"); - - return new IR_roseArraySymbol(ir_, arrSymbol); - -} - -bool IR_roseArrayRef::operator==(const IR_Ref &that) const { - if (typeid(*this) != typeid(that)) - return false; - - const IR_roseArrayRef *l_that = static_cast<const IR_roseArrayRef *>(&that); - - return this->ia_ == l_that->ia_; -} - -omega::CG_outputRepr *IR_roseArrayRef::convert() { - omega::CG_roseRepr *temp = new omega::CG_roseRepr( - isSgExpression(this->ia_)); - omega::CG_outputRepr *result = temp->clone(); -// delete this; // Commented by Manu - return result; -} - -IR_Ref *IR_roseArrayRef::clone() const { - return new IR_roseArrayRef(ir_, ia_, is_write_); -} - -// ---------------------------------------------------------------------------- -// Class: IR_roseLoop -// ---------------------------------------------------------------------------- - -IR_ScalarSymbol *IR_roseLoop::index() const { - SgForStatement *tf = isSgForStatement(tf_); - SgFortranDo *tfortran = isSgFortranDo(tf_); - SgVariableSymbol* vs = NULL; - if (tf) { - SgForInitStatement* list = tf->get_for_init_stmt(); - SgStatementPtrList& initStatements = list->get_init_stmt(); - SgStatementPtrList::const_iterator j = initStatements.begin(); - - if (SgExprStatement *expr = isSgExprStatement(*j)) - if (SgAssignOp* op = isSgAssignOp(expr->get_expression())) - if (SgVarRefExp* var_ref = isSgVarRefExp(op->get_lhs_operand())) - vs = var_ref->get_symbol(); - } else if (tfortran) { - SgExpression* init = tfortran->get_initialization(); - - if (SgAssignOp* op = isSgAssignOp(init)) - if (SgVarRefExp* var_ref = isSgVarRefExp(op->get_lhs_operand())) - vs = var_ref->get_symbol(); - - } - - if (vs == NULL) - throw ir_error("Index variable is NULL!!"); - - return new IR_roseScalarSymbol(ir_, vs); -} - -omega::CG_outputRepr *IR_roseLoop::lower_bound() const { - SgForStatement *tf = isSgForStatement(tf_); - SgFortranDo *tfortran = isSgFortranDo(tf_); - - SgExpression* lowerBound = NULL; - - if (tf) { - SgForInitStatement* list = tf->get_for_init_stmt(); - SgStatementPtrList& initStatements = list->get_init_stmt(); - SgStatementPtrList::const_iterator j = initStatements.begin(); - - if (SgExprStatement *expr = isSgExprStatement(*j)) - if (SgAssignOp* op = isSgAssignOp(expr->get_expression())) { - lowerBound = op->get_rhs_operand(); - //Rose sometimes introduces an unnecessary cast which is a unary op - if (isSgUnaryOp(lowerBound)) - lowerBound = isSgUnaryOp(lowerBound)->get_operand(); - - } - } else if (tfortran) { - SgExpression* init = tfortran->get_initialization(); - - if (SgAssignOp* op = isSgAssignOp(init)) - lowerBound = op->get_rhs_operand(); - } - - if (lowerBound == NULL) - throw ir_error("Lower Bound is NULL!!"); - - return new omega::CG_roseRepr(lowerBound); -} - -omega::CG_outputRepr *IR_roseLoop::upper_bound() const { - SgForStatement *tf = isSgForStatement(tf_); - SgFortranDo *tfortran = isSgFortranDo(tf_); - SgExpression* upperBound = NULL; - if (tf) { - SgBinaryOp* test_expr = isSgBinaryOp(tf->get_test_expr()); - if (test_expr == NULL) - throw ir_error("Test Expression is NULL!!"); - - upperBound = test_expr->get_rhs_operand(); - //Rose sometimes introduces an unnecessary cast which is a unary op - if (isSgUnaryOp(upperBound)) - upperBound = isSgUnaryOp(upperBound)->get_operand(); - if (upperBound == NULL) - throw ir_error("Upper Bound is NULL!!"); - } else if (tfortran) { - - upperBound = tfortran->get_bound(); - - } - - return new omega::CG_roseRepr(upperBound); - -} - -IR_CONDITION_TYPE IR_roseLoop::stop_cond() const { - SgForStatement *tf = isSgForStatement(tf_); - SgFortranDo *tfortran = isSgFortranDo(tf_); - - if (tf) { - SgExpression* stopCond = NULL; - SgExpression* test_expr = tf->get_test_expr(); - - if (isSgLessThanOp(test_expr)) - return IR_COND_LT; - else if (isSgLessOrEqualOp(test_expr)) - return IR_COND_LE; - else if (isSgGreaterThanOp(test_expr)) - return IR_COND_GT; - else if (isSgGreaterOrEqualOp(test_expr)) - return IR_COND_GE; - - else - throw ir_error("loop stop condition unsupported"); - } else if (tfortran) { - SgExpression* increment = tfortran->get_increment(); - if (!isSgNullExpression(increment)) { - if (isSgMinusOp(increment) - && !isSgBinaryOp(isSgMinusOp(increment)->get_operand())) - return IR_COND_GE; - else - return IR_COND_LE; - } else { - return IR_COND_LE; // Manu:: if increment is not present, assume it to be 1. Just a workaround, not sure if it will be correct for all cases. - SgExpression* lowerBound = NULL; - SgExpression* upperBound = NULL; - SgExpression* init = tfortran->get_initialization(); - SgIntVal* ub; - SgIntVal* lb; - if (SgAssignOp* op = isSgAssignOp(init)) - lowerBound = op->get_rhs_operand(); - - upperBound = tfortran->get_bound(); - - if ((upperBound != NULL) && (lowerBound != NULL)) { - - if ((ub = isSgIntVal(isSgValueExp(upperBound))) && (lb = - isSgIntVal(isSgValueExp(lowerBound)))) { - if (ub->get_value() > lb->get_value()) - return IR_COND_LE; - else - return IR_COND_GE; - } else - throw ir_error("loop stop condition unsupported"); - - } else - throw ir_error("malformed fortran loop bounds!!"); - - } - } - -} - -IR_Block *IR_roseLoop::body() const { - SgForStatement *tf = isSgForStatement(tf_); - SgFortranDo *tfortran = isSgFortranDo(tf_); - SgNode* loop_body = NULL; - SgStatement* body_statements = NULL; - - if (tf) { - body_statements = tf->get_loop_body(); - } else if (tfortran) { - body_statements = isSgStatement(tfortran->get_body()); - - } - - loop_body = isSgNode(body_statements); - - SgStatementPtrList list; - if (isSgBasicBlock(loop_body)) { - list = isSgBasicBlock(loop_body)->get_statements(); - - if (list.size() == 1) - loop_body = isSgNode(*(list.begin())); - } - - if (loop_body == NULL) - throw ir_error("for loop body is NULL!!"); - - return new IR_roseBlock(ir_, loop_body); -} - -int IR_roseLoop::step_size() const { - - SgForStatement *tf = isSgForStatement(tf_); - SgFortranDo *tfortran = isSgFortranDo(tf_); - - if (tf) { - SgExpression *increment = tf->get_increment(); - - if (isSgPlusPlusOp(increment)) - return 1; - if (isSgMinusMinusOp(increment)) - return -1; - else if (SgAssignOp* assignment = isSgAssignOp(increment)) { - SgBinaryOp* stepsize = isSgBinaryOp(assignment->get_lhs_operand()); - if (stepsize == NULL) - throw ir_error("Step size expression is NULL!!"); - SgIntVal* step = isSgIntVal(stepsize->get_lhs_operand()); - return step->get_value(); - } else if (SgBinaryOp* inc = isSgPlusAssignOp(increment)) { - SgIntVal* step = isSgIntVal(inc->get_rhs_operand()); - return (step->get_value()); - } else if (SgBinaryOp * inc = isSgMinusAssignOp(increment)) { - SgIntVal* step = isSgIntVal(inc->get_rhs_operand()); - return -(step->get_value()); - } else if (SgBinaryOp * inc = isSgCompoundAssignOp(increment)) { - SgIntVal* step = isSgIntVal(inc->get_rhs_operand()); - return (step->get_value()); - } - - } else if (tfortran) { - - SgExpression* increment = tfortran->get_increment(); - - if (!isSgNullExpression(increment)) { - if (isSgMinusOp(increment)) { - if (SgValueExp *inc = isSgValueExp( - isSgMinusOp(increment)->get_operand())) - if (isSgIntVal(inc)) - return -(isSgIntVal(inc)->get_value()); - } else { - if (SgValueExp* inc = isSgValueExp(increment)) - if (isSgIntVal(inc)) - return isSgIntVal(inc)->get_value(); - } - } else { - return 1; // Manu:: if increment is not present, assume it to be 1. Just a workaround, not sure if it will be correct for all cases. - SgExpression* lowerBound = NULL; - SgExpression* upperBound = NULL; - SgExpression* init = tfortran->get_initialization(); - SgIntVal* ub; - SgIntVal* lb; - if (SgAssignOp* op = isSgAssignOp(init)) - lowerBound = op->get_rhs_operand(); - - upperBound = tfortran->get_bound(); - - if ((upperBound != NULL) && (lowerBound != NULL)) { - - if ((ub = isSgIntVal(isSgValueExp(upperBound))) && (lb = - isSgIntVal(isSgValueExp(lowerBound)))) { - if (ub->get_value() > lb->get_value()) - return 1; - else - return -1; - } else - throw ir_error("loop stop condition unsupported"); - - } else - throw ir_error("loop stop condition unsupported"); - - } - - } - -} - -IR_Block *IR_roseLoop::convert() { - const IR_Code *ir = ir_; - SgNode *tnl = isSgNode(tf_); - delete this; - return new IR_roseBlock(ir, tnl); -} - -IR_Control *IR_roseLoop::clone() const { - - return new IR_roseLoop(ir_, tf_); - -} - -// ---------------------------------------------------------------------------- -// Class: IR_roseBlock -// ---------------------------------------------------------------------------- - -omega::CG_outputRepr *IR_roseBlock::original() const { - - omega::CG_outputRepr * tnl; - - if (isSgBasicBlock(tnl_)) { - - SgStatementPtrList *bb = new SgStatementPtrList(); - SgStatementPtrList::iterator it; - for (it = (isSgBasicBlock(tnl_)->get_statements()).begin(); - it != (isSgBasicBlock(tnl_)->get_statements()).end() - && (*it != start_); it++) - ; - - if (it != (isSgBasicBlock(tnl_)->get_statements()).end()) { - for (; it != (isSgBasicBlock(tnl_)->get_statements()).end(); it++) { - bb->push_back(*it); - if ((*it) == end_) - break; - } - } - tnl = new omega::CG_roseRepr(bb); - - } else { - - tnl = new omega::CG_roseRepr(tnl_); - - } - - return tnl; - -} -omega::CG_outputRepr *IR_roseBlock::extract() const { - - std::string x = tnl_->unparseToString(); - - omega::CG_roseRepr * tnl; - - omega::CG_outputRepr* block; - - if (isSgBasicBlock(tnl_)) { - - SgStatementPtrList *bb = new SgStatementPtrList(); - SgStatementPtrList::iterator it; - for (it = (isSgBasicBlock(tnl_)->get_statements()).begin(); - it != (isSgBasicBlock(tnl_)->get_statements()).end() - && (*it != start_); it++) - ; - - if (it != (isSgBasicBlock(tnl_)->get_statements()).end()) { - for (; it != (isSgBasicBlock(tnl_)->get_statements()).end(); it++) { - bb->push_back(*it); - if ((*it) == end_) - break; - } - } - tnl = new omega::CG_roseRepr(bb); - block = tnl->clone(); - - } else { - tnl = new omega::CG_roseRepr(tnl_); - - block = tnl->clone(); - } - - delete tnl; - return block; -} - -IR_Control *IR_roseBlock::clone() const { - return new IR_roseBlock(ir_, tnl_, start_, end_); - -} -// ---------------------------------------------------------------------------- -// Class: IR_roseIf -// ---------------------------------------------------------------------------- -omega::CG_outputRepr *IR_roseIf::condition() const { - SgNode *tnl = isSgNode(isSgIfStmt(ti_)->get_conditional()); - SgExpression* exp = NULL; - if (SgExprStatement* stmt = isSgExprStatement(tnl)) - exp = stmt->get_expression(); - if (exp == NULL) - return new omega::CG_roseRepr(tnl); - else - return new omega::CG_roseRepr(exp); -} - -IR_Block *IR_roseIf::then_body() const { - SgNode *tnl = isSgNode(isSgIfStmt(ti_)->get_true_body()); - - if (tnl == NULL) - return NULL; - - return new IR_roseBlock(ir_, tnl); -} - -IR_Block *IR_roseIf::else_body() const { - SgNode *tnl = isSgNode(isSgIfStmt(ti_)->get_false_body()); - - if (tnl == NULL) - return NULL; - - return new IR_roseBlock(ir_, tnl); -} - -IR_Block *IR_roseIf::convert() { - const IR_Code *ir = ir_; - delete this; - return new IR_roseBlock(ir, ti_); -} - -IR_Control *IR_roseIf::clone() const { - return new IR_roseIf(ir_, ti_); -} - -// -----------------------------------------------------------y----------------- -// Class: IR_roseCode_Global_Init -// ---------------------------------------------------------------------------- - -IR_roseCode_Global_Init *IR_roseCode_Global_Init::pinstance = 0; - -IR_roseCode_Global_Init * IR_roseCode_Global_Init::Instance(char** argv) { - if (pinstance == 0) { - pinstance = new IR_roseCode_Global_Init; - pinstance->project = frontend(2, argv); - - } - return pinstance; -} - -// ---------------------------------------------------------------------------- -// Class: IR_roseCode -// ---------------------------------------------------------------------------- - -IR_roseCode::IR_roseCode(const char *filename, const char* proc_name) : - IR_Code() { - - SgProject* project; - - char* argv[2]; - int counter = 0; - argv[0] = (char*) malloc(5 * sizeof(char)); - argv[1] = (char*) malloc((strlen(filename) + 1) * sizeof(char)); - strcpy(argv[0], "rose"); - strcpy(argv[1], filename); - - project = (IR_roseCode_Global_Init::Instance(argv))->project; - firstScope = getFirstGlobalScope(project); - SgFilePtrList& file_list = project->get_fileList(); - - for (SgFilePtrList::iterator it = file_list.begin(); it != file_list.end(); - it++) { - file = isSgSourceFile(*it); - if (file->get_outputLanguage() == SgFile::e_Fortran_output_language) - is_fortran_ = true; - else - is_fortran_ = false; - - root = file->get_globalScope(); - - if (!is_fortran_) { // Manu:: this macro should not be created if the input code is in fortran - buildCpreprocessorDefineDeclaration(root, - "#define __rose_lt(x,y) ((x)<(y)?(x):(y))", - PreprocessingInfo::before); - buildCpreprocessorDefineDeclaration(root, - "#define __rose_gt(x,y) ((x)>(y)?(x):(y))", - PreprocessingInfo::before); - } - - symtab_ = isSgScopeStatement(root)->get_symbol_table(); - SgDeclarationStatementPtrList& declList = root->get_declarations(); - - p = declList.begin(); - - while (p != declList.end()) { - func = isSgFunctionDeclaration(*p); - if (func) { - if (!strcmp((func->get_name().getString()).c_str(), proc_name)) - break; - - } - p++; - counter++; - } - if (p != declList.end()) - break; - - } - - symtab2_ = func->get_definition()->get_symbol_table(); - symtab3_ = func->get_definition()->get_body()->get_symbol_table(); - // Manu:: added is_fortran_ parameter - // TODO Substitute it with a better builder - ocg_ = new omega::CG_roseBuilder(is_fortran_, root, firstScope, - func->get_definition()->get_symbol_table(), - func->get_definition()->get_body()->get_symbol_table(), - isSgNode(func->get_definition()->get_body())); - - i_ = 0; /*i_ handling may need revision */ - - free(argv[1]); - free(argv[0]); - -} - -IR_roseCode::~IR_roseCode() { -} - -void IR_roseCode::finalizeRose() { - SgProject* project = (IR_roseCode_Global_Init::Instance(NULL))->project; - project->unparse(); -} - -IR_ScalarSymbol *IR_roseCode::CreateScalarSymbol(const IR_Symbol *sym, int) { - char str1[14]; - if (typeid(*sym) == typeid(IR_roseScalarSymbol)) { - SgType *tn = - static_cast<const IR_roseScalarSymbol *>(sym)->vs_->get_type(); - sprintf(str1, "newVariable%i", i_); - SgVariableDeclaration* defn = buildVariableDeclaration(str1, tn); - i_++; - - SgInitializedNamePtrList& variables = defn->get_variables(); - SgInitializedNamePtrList::const_iterator i = variables.begin(); - SgInitializedName* initializedName = *i; - SgVariableSymbol* vs = new SgVariableSymbol(initializedName); - - prependStatement(defn, - isSgScopeStatement(func->get_definition()->get_body())); - vs->set_parent(symtab_); - symtab_->insert(str1, vs); - - if (vs == NULL) - throw ir_error("in CreateScalarSymbol: vs is NULL!!"); - - return new IR_roseScalarSymbol(this, vs); - } else if (typeid(*sym) == typeid(IR_roseArraySymbol)) { - SgType *tn1 = - static_cast<const IR_roseArraySymbol *>(sym)->vs_->get_type(); - while (isSgArrayType(tn1) || isSgPointerType(tn1)) { - if (isSgArrayType(tn1)) - tn1 = isSgArrayType(tn1)->get_base_type(); - else if (isSgPointerType(tn1)) - tn1 = isSgPointerType(tn1)->get_base_type(); - else - throw ir_error( - "in CreateScalarSymbol: symbol not an array nor a pointer!"); - } - - sprintf(str1, "newVariable%i", i_); - i_++; - - SgVariableDeclaration* defn1 = buildVariableDeclaration(str1, tn1); - SgInitializedNamePtrList& variables1 = defn1->get_variables(); - - SgInitializedNamePtrList::const_iterator i1 = variables1.begin(); - SgInitializedName* initializedName1 = *i1; - - SgVariableSymbol *vs1 = new SgVariableSymbol(initializedName1); - prependStatement(defn1, - isSgScopeStatement(func->get_definition()->get_body())); - - vs1->set_parent(symtab_); - symtab_->insert(str1, vs1); - - if (vs1 == NULL) - throw ir_error("in CreateScalarSymbol: vs1 is NULL!!"); - - return new IR_roseScalarSymbol(this, vs1); - } else - throw std::bad_typeid(); - -} - -IR_ArraySymbol *IR_roseCode::CreateArraySymbol(const IR_Symbol *sym, - std::vector<omega::CG_outputRepr *> &size, int) { - SgType *tn; - char str1[14]; - - if (typeid(*sym) == typeid(IR_roseScalarSymbol)) { - tn = static_cast<const IR_roseScalarSymbol *>(sym)->vs_->get_type(); - } else if (typeid(*sym) == typeid(IR_roseArraySymbol)) { - tn = static_cast<const IR_roseArraySymbol *>(sym)->vs_->get_type(); - while (isSgArrayType(tn) || isSgPointerType(tn)) { - if (isSgArrayType(tn)) - tn = isSgArrayType(tn)->get_base_type(); - else if (isSgPointerType(tn)) - tn = isSgPointerType(tn)->get_base_type(); - else - throw ir_error( - "in CreateScalarSymbol: symbol not an array nor a pointer!"); - } - } else - throw std::bad_typeid(); - - - // Manu:: Fortran support - std::vector<SgExpression *>exprs; - SgExprListExp *exprLstExp; - SgExpression* sizeExpression = new SgNullExpression(); - SgArrayType* arrayType = new SgArrayType(tn,sizeExpression); - sizeExpression->set_parent(arrayType); - - if (!is_fortran_) { - for (int i = size.size() - 1; i >= 0; i--) { - tn = buildArrayType(tn,static_cast<omega::CG_roseRepr *>(size[i])->GetExpression()); - } - } else { // Manu:: required for fortran support - for (int i = size.size() - 1; i >= 0; i--) { - exprs.push_back(static_cast<omega::CG_roseRepr *>(size[i])->GetExpression()); - } - } - - if (is_fortran_) { - exprLstExp = buildExprListExp(exprs); - arrayType->set_dim_info(exprLstExp); - exprLstExp->set_parent(arrayType); - arrayType->set_rank(exprLstExp->get_expressions().size()); - } - - static int rose_array_counter = 1; - SgVariableDeclaration* defn2; - std::string s; - if (!is_fortran_) { - s = std::string("_P") + omega::to_string(rose_array_counter++); - defn2 = buildVariableDeclaration(const_cast<char *>(s.c_str()), tn); - } else {// Manu:: fortran support - s = std::string("f_P") + omega::to_string(rose_array_counter++); - defn2 = buildVariableDeclaration(const_cast<char *>(s.c_str()), arrayType); - } - - - SgInitializedNamePtrList& variables2 = defn2->get_variables(); - - SgInitializedNamePtrList::const_iterator i2 = variables2.begin(); - SgInitializedName* initializedName2 = *i2; - SgVariableSymbol *vs = new SgVariableSymbol(initializedName2); - - prependStatement(defn2, - isSgScopeStatement(func->get_definition()->get_body())); - - vs->set_parent(symtab_); - symtab_->insert(SgName(s.c_str()), vs); - - return new IR_roseArraySymbol(this, vs); -} - -IR_ScalarRef *IR_roseCode::CreateScalarRef(const IR_ScalarSymbol *sym) { - return new IR_roseScalarRef(this, - buildVarRefExp(static_cast<const IR_roseScalarSymbol *>(sym)->vs_)); - -} - -IR_ArrayRef *IR_roseCode::CreateArrayRef(const IR_ArraySymbol *sym, - std::vector<omega::CG_outputRepr *> &index) { - - int t; - - if (sym->n_dim() != index.size()) - throw std::invalid_argument("incorrect array symbol dimensionality"); - - const IR_roseArraySymbol *l_sym = - static_cast<const IR_roseArraySymbol *>(sym); - - SgVariableSymbol *vs = l_sym->vs_; - SgExpression* ia1 = buildVarRefExp(vs); - - - - if (is_fortran_) { // Manu:: fortran support - std::vector<SgExpression *>exprs; - for (int i = 0 ; i < index.size(); i++) { - exprs.push_back(static_cast<omega::CG_roseRepr *>(index[i])->GetExpression()); - } - SgExprListExp *exprLstExp; - exprLstExp = buildExprListExp(exprs); - ia1 = buildPntrArrRefExp(ia1,exprLstExp); - } else { - for (int i = 0; i < index.size(); i++) { - - ia1 = buildPntrArrRefExp(ia1, - static_cast<omega::CG_roseRepr *>(index[i])->GetExpression()); - - } - } - - SgPntrArrRefExp *ia = isSgPntrArrRefExp(ia1); - - return new IR_roseArrayRef(this, ia, -1); - -} - -std::vector<IR_ScalarRef *> IR_roseCode::FindScalarRef( - const omega::CG_outputRepr *repr) const { - std::vector<IR_ScalarRef *> scalars; - SgNode *tnl = static_cast<const omega::CG_roseRepr *>(repr)->GetCode(); - SgStatementPtrList *list = - static_cast<const omega::CG_roseRepr *>(repr)->GetList(); - SgStatement* stmt; - SgExpression * exp; - - if (list != NULL) { - for (SgStatementPtrList::iterator it = (*list).begin(); - it != (*list).end(); it++) { - omega::CG_roseRepr *r = new omega::CG_roseRepr(isSgNode(*it)); - std::vector<IR_ScalarRef *> a = FindScalarRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(scalars)); - } - } - - else if (tnl != NULL) { - if (stmt = isSgStatement(tnl)) { - if (isSgBasicBlock(stmt)) { - SgStatementPtrList& stmts = - isSgBasicBlock(stmt)->get_statements(); - for (int i = 0; i < stmts.size(); i++) { - omega::CG_roseRepr *r = new omega::CG_roseRepr( - isSgNode(stmts[i])); - std::vector<IR_ScalarRef *> a = FindScalarRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(scalars)); - } - - } else if (isSgForStatement(stmt)) { - - SgForStatement *tnf = isSgForStatement(stmt); - omega::CG_roseRepr *r = new omega::CG_roseRepr( - isSgStatement(tnf->get_loop_body())); - std::vector<IR_ScalarRef *> a = FindScalarRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(scalars)); - } else if (isSgFortranDo(stmt)) { - SgFortranDo *tfortran = isSgFortranDo(stmt); - omega::CG_roseRepr *r = new omega::CG_roseRepr( - isSgStatement(tfortran->get_body())); - std::vector<IR_ScalarRef *> a = FindScalarRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(scalars)); - } else if (isSgIfStmt(stmt)) { - SgIfStmt* tni = isSgIfStmt(stmt); - omega::CG_roseRepr *r = new omega::CG_roseRepr( - isSgNode(tni->get_conditional())); - std::vector<IR_ScalarRef *> a = FindScalarRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(scalars)); - r = new omega::CG_roseRepr(isSgNode(tni->get_true_body())); - a = FindScalarRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(scalars)); - r = new omega::CG_roseRepr(isSgNode(tni->get_false_body())); - a = FindScalarRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(scalars)); - } else if (isSgExprStatement(stmt)) { - omega::CG_roseRepr *r = new omega::CG_roseRepr( - isSgExpression( - isSgExprStatement(stmt)->get_expression())); - std::vector<IR_ScalarRef *> a = FindScalarRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(scalars)); - - } - } - } else { - SgExpression* op = - static_cast<const omega::CG_roseRepr *>(repr)->GetExpression(); - if (isSgVarRefExp(op) - && (!isSgArrayType(isSgVarRefExp(op)->get_type()))) { - if (SgBinaryOp* op_ = isSgBinaryOp( - isSgVarRefExp(op)->get_parent())) { - if (SgCompoundAssignOp *op__ = isSgCompoundAssignOp(op_)) { - if (isSgCompoundAssignOp(op_)->get_lhs_operand() - == isSgVarRefExp(op)) { - scalars.push_back( - new IR_roseScalarRef(this, isSgVarRefExp(op), - 1)); - scalars.push_back( - new IR_roseScalarRef(this, isSgVarRefExp(op), - 0)); - } - } - } else if (SgAssignOp* assmt = isSgAssignOp( - isSgVarRefExp(op)->get_parent())) { - - if (assmt->get_lhs_operand() == isSgVarRefExp(op)) - scalars.push_back( - new IR_roseScalarRef(this, isSgVarRefExp(op), 1)); - } else if (SgAssignOp * assmt = isSgAssignOp( - isSgVarRefExp(op)->get_parent())) { - - if (assmt->get_rhs_operand() == isSgVarRefExp(op)) - scalars.push_back( - new IR_roseScalarRef(this, isSgVarRefExp(op), 0)); - } else - scalars.push_back( - new IR_roseScalarRef(this, isSgVarRefExp(op), 0)); - } else if (isSgAssignOp(op)) { - omega::CG_roseRepr *r1 = new omega::CG_roseRepr( - isSgAssignOp(op)->get_lhs_operand()); - std::vector<IR_ScalarRef *> a1 = FindScalarRef(r1); - delete r1; - std::copy(a1.begin(), a1.end(), back_inserter(scalars)); - omega::CG_roseRepr *r2 = new omega::CG_roseRepr( - isSgAssignOp(op)->get_rhs_operand()); - std::vector<IR_ScalarRef *> a2 = FindScalarRef(r2); - delete r2; - std::copy(a2.begin(), a2.end(), back_inserter(scalars)); - - } else if (isSgBinaryOp(op)) { - omega::CG_roseRepr *r1 = new omega::CG_roseRepr( - isSgBinaryOp(op)->get_lhs_operand()); - std::vector<IR_ScalarRef *> a1 = FindScalarRef(r1); - delete r1; - std::copy(a1.begin(), a1.end(), back_inserter(scalars)); - omega::CG_roseRepr *r2 = new omega::CG_roseRepr( - isSgBinaryOp(op)->get_rhs_operand()); - std::vector<IR_ScalarRef *> a2 = FindScalarRef(r2); - delete r2; - std::copy(a2.begin(), a2.end(), back_inserter(scalars)); - } else if (isSgUnaryOp(op)) { - omega::CG_roseRepr *r1 = new omega::CG_roseRepr( - isSgUnaryOp(op)->get_operand()); - std::vector<IR_ScalarRef *> a1 = FindScalarRef(r1); - delete r1; - std::copy(a1.begin(), a1.end(), back_inserter(scalars)); - } - - } - return scalars; - -} - -std::vector<IR_ArrayRef *> IR_roseCode::FindArrayRef( - const omega::CG_outputRepr *repr) const { - std::vector<IR_ArrayRef *> arrays; - SgNode *tnl = static_cast<const omega::CG_roseRepr *>(repr)->GetCode(); - SgStatementPtrList* list = - static_cast<const omega::CG_roseRepr *>(repr)->GetList(); - SgStatement* stmt; - SgExpression * exp; - - if (list != NULL) { - for (SgStatementPtrList::iterator it = (*list).begin(); - it != (*list).end(); it++) { - omega::CG_roseRepr *r = new omega::CG_roseRepr(isSgNode(*it)); - std::vector<IR_ArrayRef *> a = FindArrayRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(arrays)); - } - } else if (tnl != NULL) { - if (stmt = isSgStatement(tnl)) { - if (isSgBasicBlock(stmt)) { - SgStatementPtrList& stmts = - isSgBasicBlock(stmt)->get_statements(); - for (int i = 0; i < stmts.size(); i++) { - omega::CG_roseRepr *r = new omega::CG_roseRepr( - isSgNode(stmts[i])); - std::vector<IR_ArrayRef *> a = FindArrayRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(arrays)); - } - - } else if (isSgForStatement(stmt)) { - - SgForStatement *tnf = isSgForStatement(stmt); - omega::CG_roseRepr *r = new omega::CG_roseRepr( - isSgStatement(tnf->get_loop_body())); - std::vector<IR_ArrayRef *> a = FindArrayRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(arrays)); - } else if (isSgFortranDo(stmt)) { - SgFortranDo *tfortran = isSgFortranDo(stmt); - omega::CG_roseRepr *r = new omega::CG_roseRepr( - isSgStatement(tfortran->get_body())); - std::vector<IR_ArrayRef *> a = FindArrayRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(arrays)); - } else if (isSgIfStmt(stmt)) { - SgIfStmt* tni = isSgIfStmt(stmt); - omega::CG_roseRepr *r = new omega::CG_roseRepr( - isSgNode(tni->get_conditional())); - std::vector<IR_ArrayRef *> a = FindArrayRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(arrays)); - r = new omega::CG_roseRepr(isSgNode(tni->get_true_body())); - a = FindArrayRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(arrays)); - r = new omega::CG_roseRepr(isSgNode(tni->get_false_body())); - a = FindArrayRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(arrays)); - } else if (isSgExprStatement(stmt)) { - omega::CG_roseRepr *r = new omega::CG_roseRepr( - isSgExpression( - isSgExprStatement(stmt)->get_expression())); - std::vector<IR_ArrayRef *> a = FindArrayRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(arrays)); - - } - } - } else { - SgExpression* op = - static_cast<const omega::CG_roseRepr *>(repr)->GetExpression(); - if (isSgPntrArrRefExp(op)) { - - SgVarRefExp* base; - SgExpression* op2; - if (isSgCompoundAssignOp(isSgPntrArrRefExp(op)->get_parent())) { - IR_roseArrayRef *ref1 = new IR_roseArrayRef(this, - isSgPntrArrRefExp(op), 0); - arrays.push_back(ref1); - IR_roseArrayRef *ref2 = new IR_roseArrayRef(this, - isSgPntrArrRefExp(op), 1); - arrays.push_back(ref2); - } else { - IR_roseArrayRef *ref3 = new IR_roseArrayRef(this, - isSgPntrArrRefExp(op), -1); - arrays.push_back(ref3); - - while (isSgPntrArrRefExp(op)) { - op2 = isSgPntrArrRefExp(op)->get_rhs_operand(); - op = isSgPntrArrRefExp(op)->get_lhs_operand(); - omega::CG_roseRepr *r = new omega::CG_roseRepr(op2); - std::vector<IR_ArrayRef *> a = FindArrayRef(r); - delete r; - std::copy(a.begin(), a.end(), back_inserter(arrays)); - - } - } - } else if (isSgAssignOp(op)) { - omega::CG_roseRepr *r1 = new omega::CG_roseRepr( - isSgAssignOp(op)->get_lhs_operand()); - std::vector<IR_ArrayRef *> a1 = FindArrayRef(r1); - delete r1; - std::copy(a1.begin(), a1.end(), back_inserter(arrays)); - omega::CG_roseRepr *r2 = new omega::CG_roseRepr( - isSgAssignOp(op)->get_rhs_operand()); - std::vector<IR_ArrayRef *> a2 = FindArrayRef(r2); - delete r2; - std::copy(a2.begin(), a2.end(), back_inserter(arrays)); - - } else if (isSgBinaryOp(op)) { - omega::CG_roseRepr *r1 = new omega::CG_roseRepr( - isSgBinaryOp(op)->get_lhs_operand()); - std::vector<IR_ArrayRef *> a1 = FindArrayRef(r1); - delete r1; - std::copy(a1.begin(), a1.end(), back_inserter(arrays)); - omega::CG_roseRepr *r2 = new omega::CG_roseRepr( - isSgBinaryOp(op)->get_rhs_operand()); - std::vector<IR_ArrayRef *> a2 = FindArrayRef(r2); - delete r2; - std::copy(a2.begin(), a2.end(), back_inserter(arrays)); - } else if (isSgUnaryOp(op)) { - omega::CG_roseRepr *r1 = new omega::CG_roseRepr( - isSgUnaryOp(op)->get_operand()); - std::vector<IR_ArrayRef *> a1 = FindArrayRef(r1); - delete r1; - std::copy(a1.begin(), a1.end(), back_inserter(arrays)); - } - - } - return arrays; -} - -std::vector<IR_Control *> IR_roseCode::FindOneLevelControlStructure( - const IR_Block *block) const { - - std::vector<IR_Control *> controls; - int i; - int j; - int begin; - int end; - SgNode* tnl_ = - ((static_cast<IR_roseBlock *>(const_cast<IR_Block *>(block)))->tnl_); - - if (isSgForStatement(tnl_)) - controls.push_back(new IR_roseLoop(this, tnl_)); - else if (isSgFortranDo(tnl_)) - controls.push_back(new IR_roseLoop(this, tnl_)); - else if (isSgIfStmt(tnl_)) - controls.push_back(new IR_roseIf(this, tnl_)); - - else if (isSgBasicBlock(tnl_)) { - - SgStatementPtrList& stmts = isSgBasicBlock(tnl_)->get_statements(); - - for (i = 0; i < stmts.size(); i++) { - if (isSgNode(stmts[i]) - == ((static_cast<IR_roseBlock *>(const_cast<IR_Block *>(block)))->start_)) - begin = i; - if (isSgNode(stmts[i]) - == ((static_cast<IR_roseBlock *>(const_cast<IR_Block *>(block)))->end_)) - end = i; - } - - SgNode* start = NULL; - SgNode* prev = NULL; - for (i = begin; i <= end; i++) { - if (isSgForStatement(stmts[i]) || isSgFortranDo(stmts[i])) { - if (start != NULL) { - controls.push_back( - new IR_roseBlock(this, - (static_cast<IR_roseBlock *>(const_cast<IR_Block *>(block)))->tnl_, - start, prev)); - start = NULL; - } - controls.push_back(new IR_roseLoop(this, isSgNode(stmts[i]))); - } else if (isSgIfStmt(stmts[i])) { - if (start != NULL) { - controls.push_back( - new IR_roseBlock(this, - (static_cast<IR_roseBlock *>(const_cast<IR_Block *>(block)))->tnl_, - start, prev)); - start = NULL; - } - controls.push_back(new IR_roseIf(this, isSgNode(stmts[i]))); - - } else if (start == NULL) - start = isSgNode(stmts[i]); - - prev = isSgNode(stmts[i]); - } - - if ((start != NULL) && (start != isSgNode(stmts[begin]))) - controls.push_back( - new IR_roseBlock(this, - (static_cast<IR_roseBlock *>(const_cast<IR_Block *>(block)))->tnl_, - start, prev)); - } - - return controls; - -} - -IR_Block *IR_roseCode::MergeNeighboringControlStructures( - const std::vector<IR_Control *> &controls) const { - if (controls.size() == 0) - return NULL; - - SgNode *tnl = NULL; - SgNode *start, *end; - for (int i = 0; i < controls.size(); i++) { - switch (controls[i]->type()) { - case IR_CONTROL_LOOP: { - SgNode *tf = static_cast<IR_roseLoop *>(controls[i])->tf_; - if (tnl == NULL) { - tnl = tf->get_parent(); - start = end = tf; - } else { - if (tnl != tf->get_parent()) - throw ir_error("controls to merge not at the same level"); - end = tf; - } - break; - } - case IR_CONTROL_BLOCK: { - if (tnl == NULL) { - tnl = static_cast<IR_roseBlock *>(controls[0])->tnl_; - start = static_cast<IR_roseBlock *>(controls[0])->start_; - end = static_cast<IR_roseBlock *>(controls[0])->end_; - } else { - if (tnl != static_cast<IR_roseBlock *>(controls[0])->tnl_) - throw ir_error("controls to merge not at the same level"); - end = static_cast<IR_roseBlock *>(controls[0])->end_; - } - break; - } - default: - throw ir_error("unrecognized control to merge"); - } - } - - return new IR_roseBlock(controls[0]->ir_, tnl, start, end); -} - -IR_Block *IR_roseCode::GetCode() const { - SgFunctionDefinition* def = NULL; - SgBasicBlock* block = NULL; - if (func != 0) { - if (def = func->get_definition()) { - if (block = def->get_body()) - return new IR_roseBlock(this, - func->get_definition()->get_body()); - } - } - - return NULL; - -} - -void IR_roseCode::ReplaceCode(IR_Control *old, omega::CG_outputRepr *repr) { - SgStatementPtrList *tnl = - static_cast<omega::CG_roseRepr *>(repr)->GetList(); - SgNode* node_ = static_cast<omega::CG_roseRepr *>(repr)->GetCode(); - SgNode * tf_old; - - /* May need future revision if tnl has more than one statement */ - - switch (old->type()) { - - case IR_CONTROL_LOOP: - tf_old = static_cast<IR_roseLoop *>(old)->tf_; - break; - case IR_CONTROL_BLOCK: - tf_old = static_cast<IR_roseBlock *>(old)->start_; - break; - - default: - throw ir_error("control structure to be replaced not supported"); - break; - } - - std::string y = tf_old->unparseToString(); - SgStatement *s = isSgStatement(tf_old); - if (s != 0) { - SgStatement *p = isSgStatement(tf_old->get_parent()); - - if (p != 0) { - SgStatement* temp = s; - if (tnl != NULL) { - SgStatementPtrList::iterator it = (*tnl).begin(); - p->insert_statement(temp, *it, true); - temp = *it; - p->remove_statement(s); - it++; - for (; it != (*tnl).end(); it++) { - p->insert_statement(temp, *it, false); - temp = *it; - } - } else if (node_ != NULL) { - if (!isSgStatement(node_)) - throw ir_error("Replacing Code not a statement!"); - else { - SgStatement* replace_ = isSgStatement(node_); - p->insert_statement(s, replace_, true); - p->remove_statement(s); - - } - } else { - throw ir_error("Replacing Code not a statement!"); - } - } else - throw ir_error("Replacing Code not a statement!"); - } else - throw ir_error("Replacing Code not a statement!"); - - delete old; - delete repr; -} - -void IR_roseCode::ReplaceExpression(IR_Ref *old, omega::CG_outputRepr *repr) { - - SgExpression* op = static_cast<omega::CG_roseRepr *>(repr)->GetExpression(); - - if (typeid(*old) == typeid(IR_roseArrayRef)) { - SgPntrArrRefExp* ia_orig = static_cast<IR_roseArrayRef *>(old)->ia_; - SgExpression* parent = isSgExpression(isSgNode(ia_orig)->get_parent()); - std::string x = isSgNode(op)->unparseToString(); - std::string y = isSgNode(ia_orig)->unparseToString(); - if (parent != NULL) { - std::string z = isSgNode(parent)->unparseToString(); - parent->replace_expression(ia_orig, op); - isSgNode(op)->set_parent(isSgNode(parent)); - } else { - SgStatement* parent_stmt = isSgStatement( - isSgNode(ia_orig)->get_parent()); - if (parent_stmt != NULL) - parent_stmt->replace_expression(ia_orig, op); - else - throw ir_error( - "ReplaceExpression: parent neither expression nor statement"); - } - } else - throw ir_error("replacing a scalar variable not implemented"); - - delete old; -} - -IR_OPERATION_TYPE IR_roseCode::QueryExpOperation( - const omega::CG_outputRepr *repr) const { - SgExpression* op = - static_cast<const omega::CG_roseRepr *>(repr)->GetExpression(); - - if (isSgValueExp(op)) - return IR_OP_CONSTANT; - else if (isSgVarRefExp(op) || isSgPntrArrRefExp(op)) - return IR_OP_VARIABLE; - else if (isSgAssignOp(op) || isSgCompoundAssignOp(op)) - return IR_OP_ASSIGNMENT; - else if (isSgAddOp(op)) - return IR_OP_PLUS; - else if (isSgSubtractOp(op)) - return IR_OP_MINUS; - else if (isSgMultiplyOp(op)) - return IR_OP_MULTIPLY; - else if (isSgDivideOp(op)) - return IR_OP_DIVIDE; - else if (isSgMinusOp(op)) - return IR_OP_NEGATIVE; - else if (isSgConditionalExp(op)) { - SgExpression* cond = isSgConditionalExp(op)->get_conditional_exp(); - if (isSgGreaterThanOp(cond)) - return IR_OP_MAX; - else if (isSgLessThanOp(cond)) - return IR_OP_MIN; - } else if (isSgUnaryAddOp(op)) - return IR_OP_POSITIVE; - else if (isSgNullExpression(op)) - return IR_OP_NULL; - else - return IR_OP_UNKNOWN; -} - -IR_CONDITION_TYPE IR_roseCode::QueryBooleanExpOperation( - const omega::CG_outputRepr *repr) const { - SgExpression* op2 = - static_cast<const omega::CG_roseRepr *>(repr)->GetExpression(); - SgNode* op; - - if (op2 == NULL) { - op = static_cast<const omega::CG_roseRepr *>(repr)->GetCode(); - - if (op != NULL) { - if (isSgExprStatement(op)) - op2 = isSgExprStatement(op)->get_expression(); - else - return IR_COND_UNKNOWN; - } else - return IR_COND_UNKNOWN; - } - - if (isSgEqualityOp(op2)) - return IR_COND_EQ; - else if (isSgNotEqualOp(op2)) - return IR_COND_NE; - else if (isSgLessThanOp(op2)) - return IR_COND_LT; - else if (isSgLessOrEqualOp(op2)) - return IR_COND_LE; - else if (isSgGreaterThanOp(op2)) - return IR_COND_GT; - else if (isSgGreaterOrEqualOp(op2)) - return IR_COND_GE; - - return IR_COND_UNKNOWN; - -} - -std::vector<omega::CG_outputRepr *> IR_roseCode::QueryExpOperand( - const omega::CG_outputRepr *repr) const { - std::vector<omega::CG_outputRepr *> v; - SgExpression* op1; - SgExpression* op2; - SgExpression* op = - static_cast<const omega::CG_roseRepr *>(repr)->GetExpression(); - omega::CG_roseRepr *repr1; - - if (isSgValueExp(op) || isSgVarRefExp(op)) { - omega::CG_roseRepr *repr = new omega::CG_roseRepr(op); - v.push_back(repr); - } else if (isSgAssignOp(op)) { - op1 = isSgAssignOp(op)->get_rhs_operand(); - repr1 = new omega::CG_roseRepr(op1); - v.push_back(repr1); - /*may be a problem as assignOp is a binaryop destop might be needed */ - } else if (isSgMinusOp(op)) { - op1 = isSgMinusOp(op)->get_operand(); - repr1 = new omega::CG_roseRepr(op1); - v.push_back(repr1); - } else if (isSgUnaryAddOp(op)) { - op1 = isSgUnaryAddOp(op)->get_operand(); - repr1 = new omega::CG_roseRepr(op1); - v.push_back(repr1); - } else if ((isSgAddOp(op) || isSgSubtractOp(op)) - || (isSgMultiplyOp(op) || isSgDivideOp(op))) { - op1 = isSgBinaryOp(op)->get_lhs_operand(); - repr1 = new omega::CG_roseRepr(op1); - v.push_back(repr1); - - op2 = isSgBinaryOp(op)->get_rhs_operand(); - repr1 = new omega::CG_roseRepr(op2); - v.push_back(repr1); - } else if (isSgConditionalExp(op)) { - SgExpression* cond = isSgConditionalExp(op)->get_conditional_exp(); - op1 = isSgBinaryOp(cond)->get_lhs_operand(); - repr1 = new omega::CG_roseRepr(op1); - v.push_back(repr1); - - op2 = isSgBinaryOp(cond)->get_rhs_operand(); - repr1 = new omega::CG_roseRepr(op2); - v.push_back(repr1); - } else if (isSgCompoundAssignOp(op)) { - SgExpression* cond = isSgCompoundAssignOp(op); - op1 = isSgBinaryOp(cond)->get_lhs_operand(); - repr1 = new omega::CG_roseRepr(op1); - v.push_back(repr1); - - op2 = isSgBinaryOp(cond)->get_rhs_operand(); - repr1 = new omega::CG_roseRepr(op2); - v.push_back(repr1); - - } else if (isSgBinaryOp(op)) { - - op1 = isSgBinaryOp(op)->get_lhs_operand(); - repr1 = new omega::CG_roseRepr(op1); - v.push_back(repr1); - - op2 = isSgBinaryOp(op)->get_rhs_operand(); - repr1 = new omega::CG_roseRepr(op2); - v.push_back(repr1); - } - - else - throw ir_error("operation not supported"); - - return v; -} - -IR_Ref *IR_roseCode::Repr2Ref(const omega::CG_outputRepr *repr) const { - SgExpression* op = - static_cast<const omega::CG_roseRepr *>(repr)->GetExpression(); - - if (SgValueExp* im = isSgValueExp(op)) { - if (isSgIntVal(im)) - return new IR_roseConstantRef(this, - static_cast<omega::coef_t>(isSgIntVal(im)->get_value())); - else if (isSgUnsignedIntVal(im)) - return new IR_roseConstantRef(this, - static_cast<omega::coef_t>(isSgUnsignedIntVal(im)->get_value())); - else if (isSgLongIntVal(im)) - return new IR_roseConstantRef(this, - static_cast<omega::coef_t>(isSgLongIntVal(im)->get_value())); - else if (isSgFloatVal(im)) - return new IR_roseConstantRef(this, isSgFloatVal(im)->get_value()); - else - assert(0); - - } else if (isSgVarRefExp(op)) - return new IR_roseScalarRef(this, isSgVarRefExp(op)); - else - assert(0); - -} - |