task-create-implicit-pass #30

Merged
Alexander_KS merged 20 commits from task-create-implicit-pass into master 2024-03-23 08:21:24 +00:00
2 changed files with 13 additions and 53 deletions
Showing only changes of commit 34bc8b0219 - Show all commits

View File

@@ -2541,7 +2541,6 @@ void runPass(const int curr_regime, const char *proj_name, const char *folderNam
case LOOPS_SPLITTER: case LOOPS_SPLITTER:
case LOOPS_COMBINER: case LOOPS_COMBINER:
case FIX_COMMON_BLOCKS: case FIX_COMMON_BLOCKS:
//case SET_IMPLICIT_NONE:
case TEST_PASS: case TEST_PASS:
runAnalysis(*project, curr_regime, false); runAnalysis(*project, curr_regime, false);
case SUBST_EXPR_RD_AND_UNPARSE: case SUBST_EXPR_RD_AND_UNPARSE:

View File

@@ -19,7 +19,6 @@ char AddLettersToMap(SgExpression* params, SgType* type);
void ImplicitCheck(SgFile* file) void ImplicitCheck(SgFile* file)
{ {
for (int functionNumber = 0; functionNumber < file->numberOfFunctions(); functionNumber++) for (int functionNumber = 0; functionNumber < file->numberOfFunctions(); functionNumber++)
{ {
InitTypes(); InitTypes();
@@ -30,16 +29,14 @@ void ImplicitCheck(SgFile* file)
CleanTypes(); CleanTypes();
} }
return;
} }
void FunctionImplicitCheck(SgStatement* function) static void FunctionImplicitCheck(SgStatement* function)
{ {
auto implicitNoneDeclaration = new SgStatement(IMPL_DECL); auto implicitNoneDeclaration = new SgStatement(IMPL_DECL);
auto hasImplicitNone = false; auto hasImplicitNone = false;
for (SgStatement* statement = function; statement = statement->lexNext(); statement != NULL) for (SgStatement* statement = function; statement != NULL; statement = statement->lexNext())
{ {
if (statement->variant() == IMPL_DECL) if (statement->variant() == IMPL_DECL)
{ {
@@ -59,24 +56,16 @@ void FunctionImplicitCheck(SgStatement* function)
} }
} }
else else
{
hasImplicitNone = true; hasImplicitNone = true;
} }
} }
}
else if (statement->variant() == CONTAINS_STMT || isSgExecutableStatement(statement) != NULL) else if (statement->variant() == CONTAINS_STMT || isSgExecutableStatement(statement) != NULL)
{
break; break;
} }
}
for (SgStatement* statement = function; statement != function->lastExecutable(); statement = statement->lexNext()) for (SgStatement* statement = function; statement != function->lastExecutable(); statement = statement->lexNext())
{
for (int expressionNumber = 0; expressionNumber < 3; expressionNumber++) for (int expressionNumber = 0; expressionNumber < 3; expressionNumber++)
{
FindAllVars(statement->expr(expressionNumber)); FindAllVars(statement->expr(expressionNumber));
}
}
for (auto var : allVars) for (auto var : allVars)
{ {
@@ -87,9 +76,7 @@ void FunctionImplicitCheck(SgStatement* function)
char c = var->identifier()[0]; char c = var->identifier()[0];
if (types.find(c) != types.end()) if (types.find(c) != types.end())
{
var->setType(types[c]); var->setType(types[c]);
}
varsWithoutDecl.push_back(var); varsWithoutDecl.push_back(var);
} }
@@ -108,73 +95,55 @@ void FunctionImplicitCheck(SgStatement* function)
tmpStatement->deleteStmt(); tmpStatement->deleteStmt();
} }
else else
{
statement = statement->lexNext(); statement = statement->lexNext();
} }
function->insertStmtAfter(*implicitNoneDeclaration, *function);
} }
function->insertStmtBefore(*implicitNoneDeclaration, *function); printf("%s", function->unparse());
} }
return; static void InitTypes()
}
void InitTypes()
{ {
for (char letter = 'a'; letter <= 'z'; letter++) for (char letter = 'a'; letter <= 'z'; letter++)
{
types[letter] = NULL; types[letter] = NULL;
} }
}
void FillCommonTypes() static void FillCommonTypes()
{ {
for (char letter : commonIntLetters) for (char letter : commonIntLetters)
{
if (types[letter] == NULL) if (types[letter] == NULL)
{
types[letter] = new SgType(T_INT); types[letter] = new SgType(T_INT);
}
}
for (auto letter : types) for (auto letter : types)
{
if (letter.second == NULL) if (letter.second == NULL)
{
types[letter.first] = new SgType(T_FLOAT); types[letter.first] = new SgType(T_FLOAT);
} }
}
}
void CleanTypes() static void CleanTypes()
{ {
types.clear(); types.clear();
allVars.clear(); allVars.clear();
varsWithoutDecl.clear(); varsWithoutDecl.clear();
} }
void FindAllVars(SgExpression* expr) static void FindAllVars(SgExpression* expr)
{ {
if (expr == NULL) if (expr == NULL)
{
return; return;
}
if (expr->symbol() != NULL) if (expr->variant() == VAR_REF || expr->variant() == ARRAY_REF)
{
allVars.insert(expr->symbol()); allVars.insert(expr->symbol());
}
FindAllVars(expr->lhs()); FindAllVars(expr->lhs());
FindAllVars(expr->rhs()); FindAllVars(expr->rhs());
} }
char AddLettersToMap(SgExpression* expr, SgType* type) static char AddLettersToMap(SgExpression* expr, SgType* type)
{ {
if (expr == NULL) if (expr == NULL)
{
return NULL; return NULL;
}
if (expr->variant() == CHAR_VAL) if (expr->variant() == CHAR_VAL)
{ {
@@ -186,25 +155,17 @@ char AddLettersToMap(SgExpression* expr, SgType* type)
char rightVal = AddLettersToMap(expr->rhs(), type); char rightVal = AddLettersToMap(expr->rhs(), type);
if (expr->variant() == DDOT) if (expr->variant() == DDOT)
{
if (leftVal != NULL && rightVal != NULL) if (leftVal != NULL && rightVal != NULL)
{
for (char letter = leftVal; letter <= rightVal; letter++) for (char letter = leftVal; letter <= rightVal; letter++)
{
types[letter] = type; types[letter] = type;
}
}
}
if (expr->variant() == EXPR_LIST) if (expr->variant() == EXPR_LIST)
{ {
if (leftVal != NULL) { if (leftVal != NULL)
types[leftVal] = type; types[leftVal] = type;
} if (rightVal != NULL)
if (rightVal != NULL) {
types[rightVal] = type; types[rightVal] = type;
} }
}
return NULL; return NULL;
} }