summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/chill.cc19
-rw-r--r--src/chillASTs.cc6539
-rw-r--r--src/chillmodule.cc392
-rw-r--r--src/dep.cc197
-rwxr-xr-xsrc/ir_clang.cc2289
-rw-r--r--src/irtools.cc624
-rw-r--r--src/omegatools.cc1766
-rw-r--r--src/transformations/loop.cc2791
-rw-r--r--src/transformations/loop_basic.cc858
-rw-r--r--src/transformations/loop_datacopy.cc811
-rw-r--r--src/transformations/loop_extra.cc124
-rw-r--r--src/transformations/loop_tile.cc420
-rw-r--r--src/transformations/loop_unroll.cc642
13 files changed, 8633 insertions, 8839 deletions
diff --git a/src/chill.cc b/src/chill.cc
index a3ad57f..f69f3bf 100644
--- a/src/chill.cc
+++ b/src/chill.cc
@@ -26,27 +26,26 @@ std::vector<int> loops;
// CHiLL program main
// Initialize state and run script or interactive mode
//---
-int main( int argc, char* argv[] )
-{
+int main(int argc, char *argv[]) {
CHILL_DEBUG_PRINT("%s main()\n", argv[0]);
if (argc > 2) {
fprintf(stderr, "Usage: %s [script_file]\n", argv[0]);
exit(-1);
}
-
+
// Create PYTHON interpreter
/* Pass argv[0] to the Python interpreter */
Py_SetProgramName(argv[0]);
-
+
/* Initialize the Python interpreter. Required. */
Py_Initialize();
-
+
/* Add a static module */
initchill();
-
+
if (argc == 2) {
- FILE* f = fopen(argv[1], "r");
- if(!f){
+ FILE *f = fopen(argv[1], "r");
+ if (!f) {
printf("can't open script file \"%s\"\n", argv[1]);
exit(-1);
}
@@ -61,8 +60,8 @@ int main( int argc, char* argv[] )
printf("Copyright (C) 2008 University of Southern California\n");
printf("Copyright (C) 2009-2012 University of Utah\n");
fflush(stdout);
- is_interactive=true;
- PyRun_InteractiveLoop(stdin,"-");
+ is_interactive = true;
+ PyRun_InteractiveLoop(stdin, "-");
printf("CHiLL ending...\n");
fflush(stdout);
}
diff --git a/src/chillASTs.cc b/src/chillASTs.cc
index 2564c63..c73eb98 100644
--- a/src/chillASTs.cc
+++ b/src/chillASTs.cc
@@ -7,322 +7,314 @@
using namespace std;
int chillAST_node::chill_scalar_counter = 0;
-int chillAST_node::chill_array_counter = 1;
-
-
-const char* Chill_AST_Node_Names[] = {
- "Unknown AST node type",
- "SourceFile",
- "TypedefDecl",
- "VarDecl",
- // "ParmVarDecl", not used any more
- "FunctionDecl",
- "RecordDecl",
- "MacroDefinition",
- "CompoundStmt",
- "ForStmt",
- "TernaryOperator",
- "BinaryOperator",
- "UnaryOperator",
- "ArraySubscriptExpr",
- "MemberExpr",
- "DeclRefExpr",
- "IntegerLiteral",
- "FloatingLiteral",
- "ImplicitCastExpr", // not sure we need this
- "ReturnStmt",
- "CallExpr",
- "DeclStmt",
- "ParenExpr",
- "CStyleCastExpr",
- "CStyleAddressOf",
- "IfStmt",
- "SizeOf",
- "Malloc",
- "Free",
- "NoOp",
-// CUDA specific
- "CudaMalloc",
- "CudaFree",
- "CudaMemcpy",
- "CudaKernelCall",
- "CudaSyncthreads",
- "fake1",
- "fake2",
- "fake3"
+int chillAST_node::chill_array_counter = 1;
+
+
+const char *Chill_AST_Node_Names[] = {
+ "Unknown AST node type",
+ "SourceFile",
+ "TypedefDecl",
+ "VarDecl",
+ // "ParmVarDecl", not used any more
+ "FunctionDecl",
+ "RecordDecl",
+ "MacroDefinition",
+ "CompoundStmt",
+ "ForStmt",
+ "TernaryOperator",
+ "BinaryOperator",
+ "UnaryOperator",
+ "ArraySubscriptExpr",
+ "MemberExpr",
+ "DeclRefExpr",
+ "IntegerLiteral",
+ "FloatingLiteral",
+ "ImplicitCastExpr", // not sure we need this
+ "ReturnStmt",
+ "CallExpr",
+ "DeclStmt",
+ "ParenExpr",
+ "CStyleCastExpr",
+ "CStyleAddressOf",
+ "IfStmt",
+ "SizeOf",
+ "Malloc",
+ "Free",
+ "NoOp",
+// CUDA specific
+ "CudaMalloc",
+ "CudaFree",
+ "CudaMemcpy",
+ "CudaKernelCall",
+ "CudaSyncthreads",
+ "fake1",
+ "fake2",
+ "fake3"
};
-char *parseUnderlyingType( char *sometype ) {
+char *parseUnderlyingType(char *sometype) {
int len = strlen(sometype);
- //fprintf(stderr, "parseUnderlyingType( %s )\n", sometype);
- char *underlying = strdup(sometype);
+ //fprintf(stderr, "parseUnderlyingType( %s )\n", sometype);
+ char *underlying = strdup(sometype);
char *p;
char *start = underlying;
// ugly. we want to turn "float *" into "float" but "struct abc *" into struct abc.
- // there are probably many more cases. have an approved list? TODO
+ // there are probably many more cases. have an approved list? TODO
if (strstr(underlying, "struct ")) start += 7; // (length("struct "))
- //fprintf(stderr, "sometype '%s' start '%s'\n", sometype, start);
+ //fprintf(stderr, "sometype '%s' start '%s'\n", sometype, start);
if (p = index(start, ' ')) *p = '\0'; // end at first space leak
if (p = index(start, '[')) *p = '\0'; // leak
if (p = index(start, '*')) *p = '\0'; // leak
-
- return underlying;
+
+ return underlying;
}
-void printSymbolTable( chillAST_SymbolTable *st ) {
- //printf("%d entries\n", st->size());
+void printSymbolTable(chillAST_SymbolTable *st) {
+ //printf("%d entries\n", st->size());
if (!st) return;
- for (int i=0; i<st->size(); i++) { printf("%d ", i ); (*st)[i]->printName(); printf("\n"); }
- if (st->size() )printf("\n");
- fflush(stdout);
+ for (int i = 0; i < st->size(); i++) {
+ printf("%d ", i);
+ (*st)[i]->printName();
+ printf("\n");
+ }
+ if (st->size())printf("\n");
+ fflush(stdout);
}
-void printSymbolTableMoreInfo( chillAST_SymbolTable *st ) {
- //printf("%d entries\n", st->size());
+void printSymbolTableMoreInfo(chillAST_SymbolTable *st) {
+ //printf("%d entries\n", st->size());
if (!st) return;
- for (int i=0; i<st->size(); i++) { printf("%d ", i ); (*st)[i]->print(); printf("\n"); }
- if (st->size() )printf("\n");
- fflush(stdout);
+ for (int i = 0; i < st->size(); i++) {
+ printf("%d ", i);
+ (*st)[i]->print();
+ printf("\n");
+ }
+ if (st->size())printf("\n");
+ fflush(stdout);
}
-bool symbolTableHasVariableNamed( chillAST_SymbolTable *table, const char *name ) {
- if (!table) return false; // ??
+bool symbolTableHasVariableNamed(chillAST_SymbolTable *table, const char *name) {
+ if (!table) return false; // ??
int numvars = table->size();
- for (int i=0; i<numvars; i++) {
+ for (int i = 0; i < numvars; i++) {
chillAST_VarDecl *vd = (*table)[i];
- if (!strcmp(name, vd->varname)) return true; // need to check type?
+ if (!strcmp(name, vd->varname)) return true; // need to check type?
}
return false;
}
-
-chillAST_VarDecl *symbolTableFindVariableNamed( chillAST_SymbolTable *table, const char *name ){ // fwd decl TODO too many similar named functions
- if (!table) return NULL; // ??
+chillAST_VarDecl *symbolTableFindVariableNamed(chillAST_SymbolTable *table,
+ const char *name) { // fwd decl TODO too many similar named functions
+ if (!table) return NULL; // ??
// see if name has a dot or arrow (->) indicating that it is a structure/class
- const char *cdot = strstr( name, "." );
+ const char *cdot = strstr(name, ".");
const char *carrow = strstr(name, "->"); // initial 'c' for const - can't change those
char *varname;
char *subpart = NULL;
- if (cdot || carrow) {
- fprintf(stderr, "symbolTableFindVariableNamed(), name '%s' looks like a struct\n", name);
+ if (cdot || carrow) {
+ fprintf(stderr, "symbolTableFindVariableNamed(), name '%s' looks like a struct\n", name);
// so, look for the first part in the symbol table.
// warning, this could be looking for a->b.c.d->e.f->g
- varname = strdup( name );
+ varname = strdup(name);
- char *dot = strstr(varname, "." );
- char *arrow = strstr( varname, "->" );
- if (dot != NULL && arrow != NULL ) { // dot AND arrow,
+ char *dot = strstr(varname, ".");
+ char *arrow = strstr(varname, "->");
+ if (dot != NULL && arrow != NULL) { // dot AND arrow,
fprintf(stderr, "chillast.cc symbolTableFindVariableNamed(), name '%s' has both dot and arrow? TODO\n");
- exit(-1);
- }
- else if (dot != NULL && !arrow) { // just dot(s). dot points to the first one
+ exit(-1);
+ } else if (dot != NULL && !arrow) { // just dot(s). dot points to the first one
//fprintf(stderr, "name '%s' has dot(s)\n", varname);
*dot = '\0'; // end string at the dot
subpart = &(dot[1]);
fprintf(stderr, "will now look for a struct/class named %s that has member %s\n", varname, subpart);
- }
- else if (arrow != NULL && !dot) { // just arrow(s) arrow points to the first one
+ } else if (arrow != NULL && !dot) { // just arrow(s) arrow points to the first one
//fprintf(stderr, "name '%s' has arrow(s)\n", varname);
*arrow = '\0'; // end string at the arrow
- subpart = &(arrow[2]);
+ subpart = &(arrow[2]);
fprintf(stderr, "will now look for a struct/class named %s that has member %s\n", varname, subpart);
+ } else { // impossible
+ fprintf(stderr,
+ "chillast.cc symbolTableFindVariableNamed(), varname '%s', looks like a struct, but I can't figure it out\n",
+ varname);
+ exit(-1);
}
- else { // impossible
- fprintf(stderr, "chillast.cc symbolTableFindVariableNamed(), varname '%s', looks like a struct, but I can't figure it out\n", varname);
- exit(-1);
- }
- }
- else {
- varname = strdup(name);
+ } else {
+ varname = strdup(name);
}
int numvars = table->size();
- for (int i=0; i<numvars; i++) {
+ for (int i = 0; i < numvars; i++) {
chillAST_VarDecl *vd = (*table)[i];
- if (!strcmp(varname, vd->varname)) {
+ if (!strcmp(varname, vd->varname)) {
fprintf(stderr, "found variable named %s\n", varname);
- if (!subpart) return vd; // need to check type?
+ if (!subpart) return vd; // need to check type?
// OK, we have a variable, which looks like a struct/class, and a subpart that is some member names
- //fprintf(stderr, "but I don't know how to check if it has member %s\n", subpart);
-
- char *dot = strstr(subpart, "." );
- char *arrow = strstr(subpart, "->" );
-
+ //fprintf(stderr, "but I don't know how to check if it has member %s\n", subpart);
+
+ char *dot = strstr(subpart, ".");
+ char *arrow = strstr(subpart, "->");
+
if (!dot && !arrow) { // whew, only one level of struct
- //fprintf(stderr, "whew, only one level of struct\n");
-
+ //fprintf(stderr, "whew, only one level of struct\n");
+
// make sure this variable definition is a struct
- if (vd->isAStruct()) {
- //fprintf(stderr, "%s is a struct of type %s\n", varname, vd->getTypeString());
- if (vd->isVarDecl()) {
- chillAST_RecordDecl *rd = vd->getStructDef();
- if (rd) {
- //fprintf(stderr, "has a recordDecl\n");
-
- chillAST_VarDecl *sp = rd->findSubpart( subpart );
+ if (vd->isAStruct()) {
+ //fprintf(stderr, "%s is a struct of type %s\n", varname, vd->getTypeString());
+ if (vd->isVarDecl()) {
+ chillAST_RecordDecl *rd = vd->getStructDef();
+ if (rd) {
+ //fprintf(stderr, "has a recordDecl\n");
+
+ chillAST_VarDecl *sp = rd->findSubpart(subpart);
if (sp) fprintf(stderr, "found a struct member named %s\n", subpart);
else fprintf(stderr, "DIDN'T FIND a struct member named %s\n", subpart);
- return sp; // return the subpart??
- }
- else {
- fprintf(stderr, "no recordDecl\n");
- exit(-1);
+ return sp; // return the subpart??
+ } else {
+ fprintf(stderr, "no recordDecl\n");
+ exit(-1);
}
- }
- else {
+ } else {
fprintf(stderr, "NOT a VarDecl???\n"); // impossible
}
- }
- else {
- fprintf(stderr, "false alarm. %s is a variable, but doesn't have subparts\n", varname);
- return NULL; // false alarm. a variable of the correct name exists, but is not a struct
+ } else {
+ fprintf(stderr, "false alarm. %s is a variable, but doesn't have subparts\n", varname);
+ return NULL; // false alarm. a variable of the correct name exists, but is not a struct
}
}
-
- fprintf(stderr, "chillast.cc symbolTableFindVariableNamed(), name '%s' can't figure out multiple levels of struct yet!\n");
- exit(-1);
+ fprintf(stderr,
+ "chillast.cc symbolTableFindVariableNamed(), name '%s' can't figure out multiple levels of struct yet!\n");
+
+ exit(-1);
}
}
return NULL;
}
-
-char *ulhack( char *brackets ) // remove UL from numbers, MODIFIES the argument!
+char *ulhack(char *brackets) // remove UL from numbers, MODIFIES the argument!
{
- //fprintf(stderr, "ulhack( \"%s\" -> ", brackets);
- // another hack. remove "UL" from integers
+ //fprintf(stderr, "ulhack( \"%s\" -> ", brackets);
+ // another hack. remove "UL" from integers
int len = strlen(brackets);
- for (int i=0; i< len-2; i++) {
+ for (int i = 0; i < len - 2; i++) {
if (isdigit(brackets[i])) {
- if (brackets[i+1] == 'U' && brackets[i+2] == 'L') {
- // remove
- for (int j=i+3; j<len; j++) brackets[j-2] = brackets[j];
- len -=2;
+ if (brackets[i + 1] == 'U' && brackets[i + 2] == 'L') {
+ // remove
+ for (int j = i + 3; j < len; j++) brackets[j - 2] = brackets[j];
+ len -= 2;
brackets[len] = '\0';
}
}
}
- //fprintf(stderr, "\"%s\" )\n", brackets);
+ //fprintf(stderr, "\"%s\" )\n", brackets);
return brackets;
}
-char *restricthack( char *typeinfo ) // remove __restrict__ , MODIFIES the argument!
+char *restricthack(char *typeinfo) // remove __restrict__ , MODIFIES the argument!
{
//if (!isRestrict( typeinfo )) return typeinfo;
// there is a "__restrict__ " somewhere embedded. remove it.
- // duplicate work
- std::string r( "__restrict__" );
- std::string t( typeinfo );
- size_t index = t.find( r );
+ // duplicate work
+ std::string r("__restrict__");
+ std::string t(typeinfo);
+ size_t index = t.find(r);
- if (index == std::string::npos) return typeinfo;
+ if (index == std::string::npos) return typeinfo;
- char *c = &( typeinfo[index] );
+ char *c = &(typeinfo[index]);
char *after = c + 12;
if (*after == ' ') after++;
- //fprintf(stderr, "after = '%s'\n", after);
+ //fprintf(stderr, "after = '%s'\n", after);
- while (*after != '\0') *c++ = *after++;
+ while (*after != '\0') *c++ = *after++;
*c = '\0';
- return typeinfo;
+ return typeinfo;
}
-
-
-
-char *parseArrayParts( char *sometype ) {
+char *parseArrayParts(char *sometype) {
int len = strlen(sometype);
- char *arraypart = (char *)calloc(1 + strlen(sometype), sizeof(char));// leak
+ char *arraypart = (char *) calloc(1 + strlen(sometype), sizeof(char));// leak
int c = 0;
- for (int i=0; i<strlen(sometype); ) {
- if ( sometype[i] == '*') arraypart[c++] = '*';
- if ( sometype[i] == '[') {
+ for (int i = 0; i < strlen(sometype);) {
+ if (sometype[i] == '*') arraypart[c++] = '*';
+ if (sometype[i] == '[') {
while (sometype[i] != ']') {
arraypart[c++] = sometype[i++];
}
- arraypart[c++] = ']';
+ arraypart[c++] = ']';
}
i += 1;
}
ulhack(arraypart);
- restricthack( arraypart );
+ restricthack(arraypart);
- //fprintf(stderr, "parseArrayParts( %s ) => %s\n", sometype, arraypart);
+ //fprintf(stderr, "parseArrayParts( %s ) => %s\n", sometype, arraypart);
return arraypart;
}
+char *splitTypeInfo(char *underlyingtype) { // return the bracketed part of a type
+ char *ap = ulhack(parseArrayParts(underlyingtype)); // return this
-
-
-
-
-char *splitTypeInfo( char *underlyingtype ) { // return the bracketed part of a type
- char *ap = ulhack(parseArrayParts( underlyingtype )); // return this
-
- // now need to remove all that from the underlyingtype to get
+ // now need to remove all that from the underlyingtype to get
char *arraypart = strdup(""); // leak
if (index(underlyingtype, '[')) {
- // looks like an array
+ // looks like an array
free(arraypart);
char *start = index(underlyingtype, '['); // wrong. can have int *buh[32]
- arraypart = strdup( start );
- if (*(start-1) == ' ') start--; // hack
+ arraypart = strdup(start);
+ if (*(start - 1) == ' ') start--; // hack
*start = '\0';
- // ugly. very leaky
- strcpy( underlyingtype, parseUnderlyingType( underlyingtype ));
-
- // ulhack( arraypart );
+ // ugly. very leaky
+ strcpy(underlyingtype, parseUnderlyingType(underlyingtype));
+
+ // ulhack( arraypart );
}
- return ap; // leak unless caller frees this
+ return ap; // leak unless caller frees this
}
-
-bool isRestrict( const char *sometype ) { // does not modify sometype
- string r( "__restrict__" );
- string t( sometype );
- return (std::string::npos != t.find( r ) );
+bool isRestrict(const char *sometype) { // does not modify sometype
+ string r("__restrict__");
+ string t(sometype);
+ return (std::string::npos != t.find(r));
}
+bool streq(const char *a, const char *b) { return !strcmp(a, b); }; // slightly less ugly // TODO enums
-bool streq( const char *a, const char *b) { return !strcmp(a,b); }; // slightly less ugly // TODO enums
+void chillindent(int howfar, FILE *fp) { for (int i = 0; i < howfar; i++) fprintf(fp, " "); }
-void chillindent( int howfar, FILE *fp ) { for (int i=0; i<howfar; i++) fprintf(fp, " "); }
-
-
-chillAST_VarDecl * chillAST_node::findVariableNamed( const char *name ) { // generic, recursive
- fprintf(stderr, "nodetype %s findVariableNamed( %s )\n", getTypeString(), name );
+chillAST_VarDecl *chillAST_node::findVariableNamed(const char *name) { // generic, recursive
+ fprintf(stderr, "nodetype %s findVariableNamed( %s )\n", getTypeString(), name);
if (hasSymbolTable()) { // look in my symbol table if I have one
- fprintf(stderr, "%s has a symbol table\n", getTypeString());
- chillAST_VarDecl *vd = symbolTableFindVariableNamed( getSymbolTable(), name);
+ fprintf(stderr, "%s has a symbol table\n", getTypeString());
+ chillAST_VarDecl *vd = symbolTableFindVariableNamed(getSymbolTable(), name);
if (vd) {
- fprintf(stderr, "found it\n");
+ fprintf(stderr, "found it\n");
return vd; // found locally
}
- fprintf(stderr, "%s has a symbol table but couldn't find %s\n", getTypeString(), name );
+ fprintf(stderr, "%s has a symbol table but couldn't find %s\n", getTypeString(), name);
}
if (!parent) {
fprintf(stderr, "%s has no parent\n", getTypeString());
@@ -331,62 +323,62 @@ chillAST_VarDecl * chillAST_node::findVariableNamed( const char *name ) { // gen
// recurse upwards
//fprintf(stderr, "recursing from %s up to parent %p\n", getTypeString(), parent);
fprintf(stderr, "recursing from %s up to parent\n", getTypeString());
- return parent->findVariableNamed( name );
+ return parent->findVariableNamed(name);
}
-chillAST_RecordDecl * chillAST_node::findRecordDeclNamed( const char *name ) { // recursive
- fprintf(stderr, "%s::findRecordDeclNamed( %s )\n", getTypeString(), name);
+chillAST_RecordDecl *chillAST_node::findRecordDeclNamed(const char *name) { // recursive
+ fprintf(stderr, "%s::findRecordDeclNamed( %s )\n", getTypeString(), name);
// look in children
int numchildren = children.size();
- fprintf(stderr, "%d children\n", numchildren);
- for (int i=0; i<numchildren; i++) {
+ fprintf(stderr, "%d children\n", numchildren);
+ for (int i = 0; i < numchildren; i++) {
fprintf(stderr, "child %d %s\n", i, children[i]->getTypeString());
if (children[i]->isRecordDecl()) {
- chillAST_RecordDecl *RD = (chillAST_RecordDecl *)children[i];
- fprintf(stderr, "it is a recordDecl named '%s' vs '%s'\n", RD->getName(), name);
- if (!strcmp( RD->getName(), name )) {
- fprintf(stderr, "FOUND IT\n");
+ chillAST_RecordDecl *RD = (chillAST_RecordDecl *) children[i];
+ fprintf(stderr, "it is a recordDecl named '%s' vs '%s'\n", RD->getName(), name);
+ if (!strcmp(RD->getName(), name)) {
+ fprintf(stderr, "FOUND IT\n");
return RD;
}
}
- }
-
+ }
+
if (!parent) return NULL; // no more recursion available
// recurse upwards
- return parent->findRecordDeclNamed( name );
+ return parent->findRecordDeclNamed(name);
}
-void chillAST_node::printPreprocBEFORE( int indent, FILE *fp ) {
- int numstmts = preprocessinginfo.size();
- //if (0 != numstmts) {
- // fprintf(fp, "chillAST_node::printPreprocBEFORE() %d statements\n", numstmts);
- //}
-
-
- for (int i=0; i< numstmts; i++) {
- //fprintf(fp, "stmt %d %d\n", i, preprocessinginfo[i]->position);
- if (preprocessinginfo[i]->position == CHILL_PREPROCESSING_LINEBEFORE ||
+void chillAST_node::printPreprocBEFORE(int indent, FILE *fp) {
+ int numstmts = preprocessinginfo.size();
+ //if (0 != numstmts) {
+ // fprintf(fp, "chillAST_node::printPreprocBEFORE() %d statements\n", numstmts);
+ //}
+
+
+ for (int i = 0; i < numstmts; i++) {
+ //fprintf(fp, "stmt %d %d\n", i, preprocessinginfo[i]->position);
+ if (preprocessinginfo[i]->position == CHILL_PREPROCESSING_LINEBEFORE ||
preprocessinginfo[i]->position == CHILL_PREPROCESSING_IMMEDIATELYBEFORE) {
- //fprintf(stderr, "before %d\n", preprocessinginfo[i]->position);
- preprocessinginfo[i]->print(indent, fp);
+ //fprintf(stderr, "before %d\n", preprocessinginfo[i]->position);
+ preprocessinginfo[i]->print(indent, fp);
}
}
}
-void chillAST_node::printPreprocAFTER( int indent, FILE *fp ) {
- for (int i=0; i< preprocessinginfo.size(); i++) {
- if (preprocessinginfo[i]->position == CHILL_PREPROCESSING_LINEAFTER ||
- preprocessinginfo[i]->position == CHILL_PREPROCESSING_TOTHERIGHT) {
- //fprintf(stderr, "after %d\n", preprocessinginfo[i]->position);
- preprocessinginfo[i]->print(indent, fp);
+void chillAST_node::printPreprocAFTER(int indent, FILE *fp) {
+ for (int i = 0; i < preprocessinginfo.size(); i++) {
+ if (preprocessinginfo[i]->position == CHILL_PREPROCESSING_LINEAFTER ||
+ preprocessinginfo[i]->position == CHILL_PREPROCESSING_TOTHERIGHT) {
+ //fprintf(stderr, "after %d\n", preprocessinginfo[i]->position);
+ preprocessinginfo[i]->print(indent, fp);
}
}
}
-chillAST_SourceFile::chillAST_SourceFile::chillAST_SourceFile() {
+chillAST_SourceFile::chillAST_SourceFile::chillAST_SourceFile() {
SourceFileName = strdup("No Source File");
asttype = CHILLAST_NODETYPE_SOURCEFILE;
parent = NULL; // top node
@@ -394,30 +386,31 @@ chillAST_SourceFile::chillAST_SourceFile::chillAST_SourceFile() {
global_symbol_table = NULL;
global_typedef_table = NULL;
FileToWrite = NULL;
- frontend = strdup("unknown");
+ frontend = strdup("unknown");
isFromSourceFile = true;
- filename = NULL;
+ filename = NULL;
};
-chillAST_SourceFile::chillAST_SourceFile(const char *filename ) {
- SourceFileName = strdup(filename);
- asttype = CHILLAST_NODETYPE_SOURCEFILE;
+chillAST_SourceFile::chillAST_SourceFile(const char *filename) {
+ SourceFileName = strdup(filename);
+ asttype = CHILLAST_NODETYPE_SOURCEFILE;
parent = NULL; // top node
metacomment = NULL;
global_symbol_table = NULL;
global_typedef_table = NULL;
- FileToWrite = NULL;
- frontend = strdup("unknown");
+ FileToWrite = NULL;
+ frontend = strdup("unknown");
isFromSourceFile = true;
- filename = NULL;
+ filename = NULL;
};
-void chillAST_SourceFile::print( int indent, FILE *fp ) {
- //fprintf(stderr, "chillAST_SourceFile::print()\n");
+void chillAST_SourceFile::print(int indent, FILE *fp) {
+ //fprintf(stderr, "chillAST_SourceFile::print()\n");
fflush(fp);
- fprintf(fp, "\n// this source derived from CHILL AST originally from file '%s' as parsed by frontend compiler %s\n\n", SourceFileName, frontend);
- std::vector< char * > includedfiles;
- int sofar = 0;
+ fprintf(fp, "\n// this source derived from CHILL AST originally from file '%s' as parsed by frontend compiler %s\n\n",
+ SourceFileName, frontend);
+ std::vector<char *> includedfiles;
+ int sofar = 0;
//fprintf(fp, "#define __rose_lt(x,y) ((x)<(y)?(x):(y))\n#define __rose_gt(x,y) ((x)>(y)?(x):(y))\n"); // help diff figure out what's going on
@@ -426,156 +419,150 @@ void chillAST_SourceFile::print( int indent, FILE *fp ) {
//fprintf(stderr, "they are\n");
//for (int i=0; i<numchildren; i++) {
// fprintf(stderr, "%s ", children[i]->getTypeString());
- // if (children[i]->isFunctionDecl()) {
+ // if (children[i]->isFunctionDecl()) {
// fprintf(stderr, "%s ", ((chillAST_FunctionDecl *)children[i])->functionName);
// }
- // fprintf(stderr, "\n");
- //}
+ // fprintf(stderr, "\n");
+ //}
- for (int i=0; i<numchildren; i++) {
+ for (int i = 0; i < numchildren; i++) {
//fprintf(fp, "\n// child %d of type %s:\n", i, children[i]->getTypeString());
- if (children[i]->isFromSourceFile) {
- if (children[i]->isFunctionDecl()) {
- fprintf(stderr, "\nchild %d function %s\n",i,((chillAST_FunctionDecl *)children[i])->functionName);
- }
- //fprintf(stderr, "child %d IS from source file\n", i);
+ if (children[i]->isFromSourceFile) {
+ if (children[i]->isFunctionDecl()) {
+ fprintf(stderr, "\nchild %d function %s\n", i, ((chillAST_FunctionDecl *) children[i])->functionName);
+ }
+ //fprintf(stderr, "child %d IS from source file\n", i);
//if (children[i]->isMacroDefinition()) fprintf(fp, "\n"); fflush(fp);
- children[i]->print( indent, fp );
- if (children[i]->isVarDecl()) fprintf(fp, ";\n"); fflush(fp); // top level vardecl\n");
- }
- else {
- //fprintf(stderr, "child %d is not from source file\n", i);
- // this should all go away
-
-#ifdef NOPE
- if (children[i]->filename // not null and not empty string
+ children[i]->print(indent, fp);
+ if (children[i]->isVarDecl()) fprintf(fp, ";\n");
+ fflush(fp); // top level vardecl\n");
+ } else {
+ //fprintf(stderr, "child %d is not from source file\n", i);
+ // this should all go away
+
+#ifdef NOPE
+ if (children[i]->filename // not null and not empty string
//&& 0 != strlen(children[i]->filename)
- ) { // should not be necessary
- //fprintf(fp, "// need an include for %s\n", children[i]->filename);
+ ) { // should not be necessary
+ //fprintf(fp, "// need an include for %s\n", children[i]->filename);
bool rddid = false;
- sofar = includedfiles.size();
-
+ sofar = includedfiles.size();
+
for (int j=0; j<sofar; j++) {
- //fprintf(stderr, "comparing %s and %s\n", includedfiles[j], children[i]->filename );
+ //fprintf(stderr, "comparing %s and %s\n", includedfiles[j], children[i]->filename );
if (!strcmp( includedfiles[j], children[i]->filename) ) { // this file has already been included
rddid = true;
- //fprintf(stderr, "already did that one\n");
+ //fprintf(stderr, "already did that one\n");
}
}
-
+
if (false == rddid) { // we need to include it now
fprintf(fp, "#include \"%s\"\n", children[i]->filename);
includedfiles.push_back(strdup( children[i]->filename ));
}
- //else {
- // fprintf(fp, "already did\n");
- //}
+ //else {
+ // fprintf(fp, "already did\n");
+ //}
}
-#endif // NOPE
+#endif // NOPE
}
- }
+ }
- fflush(fp);
+ fflush(fp);
- //fprintf(fp, "\n\n// functions??\n");
- //for (int i=0; i<functions.size(); i++) {
- // fprintf(fp, "\n\n"); functions[i]->print(0,fp); fflush(fp);
- //}
+ //fprintf(fp, "\n\n// functions??\n");
+ //for (int i=0; i<functions.size(); i++) {
+ // fprintf(fp, "\n\n"); functions[i]->print(0,fp); fflush(fp);
+ //}
};
-
-
-void chillAST_SourceFile::printToFile( char *filename ) {
+void chillAST_SourceFile::printToFile(char *filename) {
char fn[1024];
- if (NULL == filename) { // build up a filename using original name and frontend if known
- if (FileToWrite) {
- strcpy( fn, FileToWrite );
- }
- else {
+ if (NULL == filename) { // build up a filename using original name and frontend if known
+ if (FileToWrite) {
+ strcpy(fn, FileToWrite);
+ } else {
// input name with name of frontend compiler prepended
if (frontend) sprintf(fn, "%s_%s\0", frontend, SourceFileName);
else sprintf(fn, "UNKNOWNFRONTEND_%s\0", SourceFileName); // should never happen
}
- }
- else strcpy( fn, filename );
+ } else strcpy(fn, filename);
FILE *fp = fopen(fn, "w");
- if (!fp) {
+ if (!fp) {
fprintf(stderr, "can't open file '%s' for writing\n", fn);
exit(-1);
}
-
+
//fprintf(fp, "\n\n");
- //dump(0, fp);
+ //dump(0, fp);
fprintf(fp, "\n\n");
print(0, fp);
-
-}
+}
-void chillAST_SourceFile::dump( int indent, FILE *fp ) {
- fflush(fp);
- fprintf(fp, "\n//CHILL AST originally from file '%s'\n", SourceFileName);
+void chillAST_SourceFile::dump(int indent, FILE *fp) {
+ fflush(fp);
+ fprintf(fp, "\n//CHILL AST originally from file '%s'\n", SourceFileName);
int numchildren = children.size();
- for (int i=0; i<numchildren; i++) {
- children[i]->dump( indent, fp );
+ for (int i = 0; i < numchildren; i++) {
+ children[i]->dump(indent, fp);
}
- fflush(fp);
+ fflush(fp);
};
-
-chillAST_MacroDefinition * chillAST_SourceFile::findMacro( const char *name ) {
+chillAST_MacroDefinition *chillAST_SourceFile::findMacro(const char *name) {
//fprintf(stderr, "chillAST_SourceFile::findMacro( %s )\n", name );
-
+
int numMacros = macrodefinitions.size();
- for (int i=0; i<numMacros; i++) {
- if (!strcmp( macrodefinitions[i]->macroName, name )) return macrodefinitions[i];
+ for (int i = 0; i < numMacros; i++) {
+ if (!strcmp(macrodefinitions[i]->macroName, name)) return macrodefinitions[i];
}
return NULL; // not found
}
-chillAST_FunctionDecl * chillAST_SourceFile::findFunction( const char *name ) {
+chillAST_FunctionDecl *chillAST_SourceFile::findFunction(const char *name) {
//fprintf(stderr, "chillAST_SourceFile::findMacro( %s )\n", name );
-
+
int numFuncs = functions.size();
- for (int i=0; i<numFuncs; i++) {
- if ( !strcmp( functions[i]->functionName, name )) return functions[i];
+ for (int i = 0; i < numFuncs; i++) {
+ if (!strcmp(functions[i]->functionName, name)) return functions[i];
}
return NULL;
}
-chillAST_node *chillAST_SourceFile::findCall( const char *name ) {
- chillAST_MacroDefinition *macro = findMacro( name );
- if (macro) return (chillAST_node *)macro;
- chillAST_FunctionDecl *func =findFunction( name );
+chillAST_node *chillAST_SourceFile::findCall(const char *name) {
+ chillAST_MacroDefinition *macro = findMacro(name);
+ if (macro) return (chillAST_node *) macro;
+ chillAST_FunctionDecl *func = findFunction(name);
return func;
}
-chillAST_VarDecl * chillAST_SourceFile::findVariableNamed( const char *name ) {
- fprintf(stderr, "SOURCEFILE SPECIAL %s findVariableNamed( %s )\n", getTypeString(), name );
+chillAST_VarDecl *chillAST_SourceFile::findVariableNamed(const char *name) {
+ fprintf(stderr, "SOURCEFILE SPECIAL %s findVariableNamed( %s )\n", getTypeString(), name);
if (hasSymbolTable()) { // look in my symbol table if I have one
- fprintf(stderr, "%s has a symbol table\n", getTypeString());
- chillAST_VarDecl *vd = symbolTableFindVariableNamed( getSymbolTable(), name);
+ fprintf(stderr, "%s has a symbol table\n", getTypeString());
+ chillAST_VarDecl *vd = symbolTableFindVariableNamed(getSymbolTable(), name);
if (vd) {
- fprintf(stderr, "found it\n");
+ fprintf(stderr, "found it\n");
return vd; // found locally
}
- fprintf(stderr, "%s has a symbol table but couldn't find %s\n", getTypeString(), name );
+ fprintf(stderr, "%s has a symbol table but couldn't find %s\n", getTypeString(), name);
}
fprintf(stderr, "looking for %s in SourceFile global_symbol_table\n", name);
- chillAST_VarDecl *vd = symbolTableFindVariableNamed( global_symbol_table, name );
+ chillAST_VarDecl *vd = symbolTableFindVariableNamed(global_symbol_table, name);
if (vd) {
- fprintf(stderr, "found it\n");
+ fprintf(stderr, "found it\n");
return vd; // found locally
}
@@ -586,299 +573,296 @@ chillAST_VarDecl * chillAST_SourceFile::findVariableNamed( const char *name ) {
// recurse upwards
//fprintf(stderr, "recursing from %s up to parent %p\n", getTypeString(), parent);
fprintf(stderr, "recursing from %s up to parent\n", getTypeString());
- return parent->findVariableNamed( name );
+ return parent->findVariableNamed(name);
}
-
-chillAST_TypedefDecl::chillAST_TypedefDecl() {
- underlyingtype = newtype = arraypart = NULL;
- asttype = CHILLAST_NODETYPE_TYPEDEFDECL;
+chillAST_TypedefDecl::chillAST_TypedefDecl() {
+ underlyingtype = newtype = arraypart = NULL;
+ asttype = CHILLAST_NODETYPE_TYPEDEFDECL;
parent = NULL;
metacomment = NULL;
isStruct = isUnion = false;
- structname = NULL;
- rd = NULL;
- isFromSourceFile = true; // default
- filename = NULL;
+ structname = NULL;
+ rd = NULL;
+ isFromSourceFile = true; // default
+ filename = NULL;
};
chillAST_TypedefDecl::chillAST_TypedefDecl(char *t, const char *nt, chillAST_node *par) {
- //fprintf(stderr, "chillAST_TypedefDecl::chillAST_TypedefDecl( underlying type %s, newtype %s )\n", t, nt);
- underlyingtype = strdup(t);
+ //fprintf(stderr, "chillAST_TypedefDecl::chillAST_TypedefDecl( underlying type %s, newtype %s )\n", t, nt);
+ underlyingtype = strdup(t);
newtype = strdup(nt);
- arraypart = NULL;
+ arraypart = NULL;
asttype = CHILLAST_NODETYPE_TYPEDEFDECL;
- parent = NULL;
+ parent = NULL;
metacomment = NULL;
isStruct = isUnion = false;
- structname = NULL;
- rd = NULL;
- isFromSourceFile = true; // default
- filename = NULL;
+ structname = NULL;
+ rd = NULL;
+ isFromSourceFile = true; // default
+ filename = NULL;
};
chillAST_TypedefDecl::chillAST_TypedefDecl(char *t, const char *a, char *p, chillAST_node *par) {
- underlyingtype = strdup(t);
- //fprintf(stderr, "chillAST_TypedefDecl::chillAST_TypedefDecl( underlying type %s )\n", underlyingtype);
+ underlyingtype = strdup(t);
+ //fprintf(stderr, "chillAST_TypedefDecl::chillAST_TypedefDecl( underlying type %s )\n", underlyingtype);
newtype = strdup(a); // the new named type ??
- arraypart = strdup(p); // array (p)art?
- // splitarraypart(); // TODO
+ arraypart = strdup(p); // array (p)art?
+ // splitarraypart(); // TODO
- asttype = CHILLAST_NODETYPE_TYPEDEFDECL;
+ asttype = CHILLAST_NODETYPE_TYPEDEFDECL;
parent = par;
metacomment = NULL;
isStruct = isUnion = false;
- structname = NULL;
- rd = NULL;
- isFromSourceFile = true; // default
- filename = NULL;
+ structname = NULL;
+ rd = NULL;
+ isFromSourceFile = true; // default
+ filename = NULL;
};
+void chillAST_TypedefDecl::print(int indent, FILE *fp) {
+ //fprintf(fp, "typedefdecl->print()\n");
+ printPreprocBEFORE(indent, fp);
-void chillAST_TypedefDecl::print( int indent, FILE *fp ) {
- //fprintf(fp, "typedefdecl->print()\n");
-
- printPreprocBEFORE(indent, fp);
-
- if (isStruct) {
- fprintf(fp, "\n/* A typedef STRUCT */\n"); chillindent(indent, fp);
+ if (isStruct) {
+ fprintf(fp, "\n/* A typedef STRUCT */\n");
+ chillindent(indent, fp);
}
chillindent(indent, fp);
- fprintf(fp, "typedef "); fflush(fp);
-
- if (rd) {
- rd->print(indent, fp); // needs to not print the ending semicolon ??
- }
-
- else if (isStruct) {
- fprintf(stderr, "/* no rd */\n");
-
+ fprintf(fp, "typedef ");
+ fflush(fp);
+
+ if (rd) {
+ rd->print(indent, fp); // needs to not print the ending semicolon ??
+ } else if (isStruct) {
+ fprintf(stderr, "/* no rd */\n");
+
//fprintf(fp, "struct %s\n", structname);
chillindent(indent, fp);
fprintf(fp, "{\n");
- for (int i=0; i<subparts.size(); i++) {
- //fprintf(fp, "a %s\n", subparts[i]->getTypeString());
- subparts[i]->print(indent+1, fp);
+ for (int i = 0; i < subparts.size(); i++) {
+ //fprintf(fp, "a %s\n", subparts[i]->getTypeString());
+ subparts[i]->print(indent + 1, fp);
fprintf(fp, ";\n");
}
fprintf(fp, "};\n");
+ } else {
+ fprintf(fp, "/* NOT A STRUCT */ typedef %s %s%s;\n", underlyingtype, newtype, arraypart);
+ dump();
+ printf("\n\n");
+ fflush(stdout);
}
- else {
- fprintf(fp, "/* NOT A STRUCT */ typedef %s %s%s;\n", underlyingtype, newtype, arraypart );
- dump(); printf("\n\n"); fflush(stdout);
- }
-
- // then the newname
- fprintf(fp, "%s;\n", newtype);
- fflush(fp);
- printPreprocAFTER(indent, fp);
+
+ // then the newname
+ fprintf(fp, "%s;\n", newtype);
+ fflush(fp);
+ printPreprocAFTER(indent, fp);
return;
}
-chillAST_VarDecl *chillAST_TypedefDecl::findSubpart( const char *name ) {
+chillAST_VarDecl *chillAST_TypedefDecl::findSubpart(const char *name) {
//fprintf(stderr, "chillAST_TypedefDecl::findSubpart( %s )\n", name);
- //fprintf(stderr, "typedef %s %s\n", structname, newtype);
+ //fprintf(stderr, "typedef %s %s\n", structname, newtype);
if (rd) { // we have a record decl look there
- chillAST_VarDecl *sub = rd->findSubpart( name );
- //fprintf(stderr, "rd found subpart %p\n", sub);
- return sub;
+ chillAST_VarDecl *sub = rd->findSubpart(name);
+ //fprintf(stderr, "rd found subpart %p\n", sub);
+ return sub;
}
- // can this ever happen now ???
+ // can this ever happen now ???
int nsub = subparts.size();
- //fprintf(stderr, "%d subparts\n", nsub);
- for (int i=0; i<nsub; i++) {
- if ( !strcmp( name, subparts[i]->varname )) return subparts[i];
+ //fprintf(stderr, "%d subparts\n", nsub);
+ for (int i = 0; i < nsub; i++) {
+ if (!strcmp(name, subparts[i]->varname)) return subparts[i];
}
- //fprintf(stderr, "subpart not found\n");
+ //fprintf(stderr, "subpart not found\n");
+
-
- return NULL;
+ return NULL;
}
-chillAST_RecordDecl * chillAST_TypedefDecl::getStructDef() {
+chillAST_RecordDecl *chillAST_TypedefDecl::getStructDef() {
if (rd) return rd;
- return NULL;
+ return NULL;
}
-
-chillAST_RecordDecl::chillAST_RecordDecl() {
+chillAST_RecordDecl::chillAST_RecordDecl() {
asttype = CHILLAST_NODETYPE_RECORDDECL;
- name = strdup("unknown"); // ??
- originalname = NULL; // ??
+ name = strdup("unknown"); // ??
+ originalname = NULL; // ??
isStruct = isUnion = false;
- parent = NULL;
- isFromSourceFile = true; // default
- filename = NULL;
+ parent = NULL;
+ isFromSourceFile = true; // default
+ filename = NULL;
}
-chillAST_RecordDecl::chillAST_RecordDecl( const char *nam, chillAST_node *p ) {
+chillAST_RecordDecl::chillAST_RecordDecl(const char *nam, chillAST_node *p) {
//fprintf(stderr, "chillAST_RecordDecl::chillAST_RecordDecl()\n");
asttype = CHILLAST_NODETYPE_RECORDDECL;
- parent = p;
+ parent = p;
if (nam) name = strdup(nam);
- else name = strdup("unknown"); // ??
+ else name = strdup("unknown"); // ??
originalname = NULL; // ?? // make them do it manually?
isStruct = isUnion = false;
- isFromSourceFile = true; // default
- filename = NULL;
+ isFromSourceFile = true; // default
+ filename = NULL;
}
-chillAST_RecordDecl::chillAST_RecordDecl( const char *nam, const char *orig, chillAST_node *p ) {
- fprintf(stderr, "chillAST_RecordDecl::chillAST_RecordDecl( %s, ( AKA %s ) )\n", nam, orig);
+chillAST_RecordDecl::chillAST_RecordDecl(const char *nam, const char *orig, chillAST_node *p) {
+ fprintf(stderr, "chillAST_RecordDecl::chillAST_RecordDecl( %s, ( AKA %s ) )\n", nam, orig);
asttype = CHILLAST_NODETYPE_RECORDDECL;
- parent = p;
- if (p) p->addChild( this );
-
+ parent = p;
+ if (p) p->addChild(this);
+
if (nam) name = strdup(nam);
- else name = strdup("unknown"); // ??
-
- originalname = NULL;
+ else name = strdup("unknown"); // ??
+
+ originalname = NULL;
if (orig) originalname = strdup(orig);
-
+
isStruct = isUnion = false;
- isFromSourceFile = true; // default
- filename = NULL;
+ isFromSourceFile = true; // default
+ filename = NULL;
}
-
-chillAST_VarDecl * chillAST_RecordDecl::findSubpart( const char *nam ){
+chillAST_VarDecl *chillAST_RecordDecl::findSubpart(const char *nam) {
//fprintf(stderr, "chillAST_RecordDecl::findSubpart( %s )\n", nam);
int nsub = subparts.size();
//fprintf(stderr, "%d subparts\n", nsub);
- for (int i=0; i<nsub; i++) {
+ for (int i = 0; i < nsub; i++) {
//fprintf(stderr, "comparing to '%s' to '%s'\n", nam, subparts[i]->varname);
- if ( !strcmp( nam, subparts[i]->varname )) return subparts[i];
+ if (!strcmp(nam, subparts[i]->varname)) return subparts[i];
}
- fprintf(stderr, "chillAST_RecordDecl::findSubpart() couldn't find member NAMED %s in ", nam); print(); printf("\n\n"); fflush(stdout);
+ fprintf(stderr, "chillAST_RecordDecl::findSubpart() couldn't find member NAMED %s in ", nam);
+ print();
+ printf("\n\n");
+ fflush(stdout);
- return NULL;
+ return NULL;
}
-chillAST_VarDecl * chillAST_RecordDecl::findSubpartByType( const char *typ ){
+chillAST_VarDecl *chillAST_RecordDecl::findSubpartByType(const char *typ) {
//fprintf(stderr, "chillAST_RecordDecl::findSubpart( %s )\n", nam);
int nsub = subparts.size();
//fprintf(stderr, "%d subparts\n", nsub);
- for (int i=0; i<nsub; i++) {
+ for (int i = 0; i < nsub; i++) {
//fprintf(stderr, "comparing '%s' to '%s'\n", typ, subparts[i]->vartype);
- if ( !strcmp( typ, subparts[i]->vartype )) return subparts[i];
+ if (!strcmp(typ, subparts[i]->vartype)) return subparts[i];
}
- //fprintf(stderr, "chillAST_RecordDecl::findSubpart() couldn't find member of TYPE %s in ", typ); print(); printf("\n\n"); fflush(stdout);
+ //fprintf(stderr, "chillAST_RecordDecl::findSubpart() couldn't find member of TYPE %s in ", typ); print(); printf("\n\n"); fflush(stdout);
- return NULL;
+ return NULL;
}
-void chillAST_RecordDecl::print( int indent, FILE *fp ) {
+void chillAST_RecordDecl::print(int indent, FILE *fp) {
//fprintf(fp, "chillAST_RecordDecl::print()\n");
- if (isUnnamed) return;
-
- printPreprocBEFORE(indent, fp);
+ if (isUnnamed) return;
+
+ printPreprocBEFORE(indent, fp);
- chillindent(indent, fp);
- if (isStruct) {
+ chillindent(indent, fp);
+ if (isStruct) {
//fprintf(fp, "\n/* A Record Decl STRUCT */\n"); chillindent(indent, fp);
fprintf(fp, "struct ");
- if ( strncmp( "unnamed", name, 7) ) fprintf(fp, "%s\n", name);
-
+ if (strncmp("unnamed", name, 7)) fprintf(fp, "%s\n", name);
+
chillindent(indent, fp);
fprintf(fp, "{\n");
- for (int i=0; i<subparts.size(); i++) {
- //fprintf(fp, "a %s\n", subparts[i]->getTypeString());
- subparts[i]->print(indent+1, fp);
+ for (int i = 0; i < subparts.size(); i++) {
+ //fprintf(fp, "a %s\n", subparts[i]->getTypeString());
+ subparts[i]->print(indent + 1, fp);
fprintf(fp, ";\n");
}
fprintf(fp, "} ");
- fprintf(fp, "\n"); // TODO need semicolon when defining struct. can't have it when part of a typedef. One of the following lines is correct in each case.
+ fprintf(fp,
+ "\n"); // TODO need semicolon when defining struct. can't have it when part of a typedef. One of the following lines is correct in each case.
//fprintf(fp, ";\n");
- }
- else {
+ } else {
fprintf(fp, "/* UNKNOWN RECORDDECL print() */ ");
exit(-1);
}
- printPreprocAFTER(indent, fp);
- fflush(fp);
+ printPreprocAFTER(indent, fp);
+ fflush(fp);
}
-chillAST_SymbolTable * chillAST_RecordDecl::addVariableToSymbolTable( chillAST_VarDecl *vd ){
+chillAST_SymbolTable *chillAST_RecordDecl::addVariableToSymbolTable(chillAST_VarDecl *vd) {
// for now, just bail. or do we want the struct to have an actual symbol table?
- //fprintf(stderr, "chillAST_RecordDecl::addVariableToSymbolTable() ignoring struct member %s vardecl\n", vd->varname);
- return NULL; // damn, I hope nothing uses this!
+ //fprintf(stderr, "chillAST_RecordDecl::addVariableToSymbolTable() ignoring struct member %s vardecl\n", vd->varname);
+ return NULL; // damn, I hope nothing uses this!
}
-void chillAST_RecordDecl::printStructure( int indent, FILE *fp ) {
- //fprintf(stderr, "chillAST_RecordDecl::printStructure()\n");
- chillindent(indent, fp);
- if (isStruct) {
+void chillAST_RecordDecl::printStructure(int indent, FILE *fp) {
+ //fprintf(stderr, "chillAST_RecordDecl::printStructure()\n");
+ chillindent(indent, fp);
+ if (isStruct) {
fprintf(fp, "struct { ", name);
- for (int i=0; i<subparts.size(); i++) {
- subparts[i]->print( 0, fp); // ?? TODO indent level
+ for (int i = 0; i < subparts.size(); i++) {
+ subparts[i]->print(0, fp); // ?? TODO indent level
fprintf(fp, "; ");
}
fprintf(fp, "} ");
- }
- else {
+ } else {
fprintf(fp, "/* UNKNOWN RECORDDECL printStructure() */ ");
exit(-1);
}
- fflush(fp);
+ fflush(fp);
}
+void chillAST_RecordDecl::dump(int indent, FILE *fp) {
+ chillindent(indent, fp);
-void chillAST_RecordDecl::dump( int indent, FILE *fp ) {
- chillindent(indent, fp);
-
}
-chillAST_FunctionDecl::chillAST_FunctionDecl() {
- functionName = strdup("YouScrewedUp");
- asttype = CHILLAST_NODETYPE_FUNCTIONDECL;
- forwarddecl = externfunc = builtin = false;
+chillAST_FunctionDecl::chillAST_FunctionDecl() {
+ functionName = strdup("YouScrewedUp");
+ asttype = CHILLAST_NODETYPE_FUNCTIONDECL;
+ forwarddecl = externfunc = builtin = false;
uniquePtr = (void *) NULL;
- this->setFunctionCPU();
+ this->setFunctionCPU();
parent = NULL;
metacomment = NULL;
//symbol_table = NULL; // eventually, pointing to body's symbol table
typedef_table = NULL;
body = new chillAST_CompoundStmt();
- isFromSourceFile = true; // default
- filename = NULL;
+ isFromSourceFile = true; // default
+ filename = NULL;
};
-chillAST_FunctionDecl::chillAST_FunctionDecl(const char *rt, const char *fname, chillAST_node *par) {
+chillAST_FunctionDecl::chillAST_FunctionDecl(const char *rt, const char *fname, chillAST_node *par) {
returnType = strdup(rt);
functionName = strdup(fname);
- this->setFunctionCPU();
- //fprintf(stderr, "functionName %s\n", functionName);
- forwarddecl = externfunc = builtin = false;
+ this->setFunctionCPU();
+ //fprintf(stderr, "functionName %s\n", functionName);
+ forwarddecl = externfunc = builtin = false;
- asttype = CHILLAST_NODETYPE_FUNCTIONDECL;
+ asttype = CHILLAST_NODETYPE_FUNCTIONDECL;
parent = par;
metacomment = NULL;
- if (par) par->getSourceFile()->addFunc( this );
+ if (par) par->getSourceFile()->addFunc(this);
// symbol_table = NULL; //use body's instead
typedef_table = NULL;
body = new chillAST_CompoundStmt();
- isFromSourceFile = true; // default
- filename = NULL;
+ isFromSourceFile = true; // default
+ filename = NULL;
};
@@ -886,161 +870,161 @@ chillAST_FunctionDecl::chillAST_FunctionDecl(const char *rt, const char *fname,
CHILL_DEBUG_PRINT("chillAST_FunctionDecl::chillAST_FunctionDecl with unique %p\n", unique);
returnType = strdup(rt);
functionName = strdup(fname);
- this->setFunctionCPU();
- //fprintf(stderr, "functionName %s\n", functionName);
- forwarddecl = externfunc = builtin = false;
+ this->setFunctionCPU();
+ //fprintf(stderr, "functionName %s\n", functionName);
+ forwarddecl = externfunc = builtin = false;
body = new chillAST_CompoundStmt();
- asttype = CHILLAST_NODETYPE_FUNCTIONDECL;
- uniquePtr = unique; // a quick way to check equivalence. DO NOT ACCESS THROUGH THIS
+ asttype = CHILLAST_NODETYPE_FUNCTIONDECL;
+ uniquePtr = unique; // a quick way to check equivalence. DO NOT ACCESS THROUGH THIS
parent = par;
metacomment = NULL;
- if (par) par->getSourceFile()->addFunc( this );
- //symbol_table = NULL; // use body's
+ if (par) par->getSourceFile()->addFunc(this);
+ //symbol_table = NULL; // use body's
typedef_table = NULL;
- isFromSourceFile = true; // default
- filename = NULL;
+ isFromSourceFile = true; // default
+ filename = NULL;
};
-void chillAST_FunctionDecl::addParameter( chillAST_VarDecl *p) {
- CHILL_DEBUG_PRINT("%s chillAST_FunctionDecl::addParameter( 0x%x param %s) total of %d parameters\n", functionName, p, p->varname, 1+parameters.size());
+void chillAST_FunctionDecl::addParameter(chillAST_VarDecl *p) {
+ CHILL_DEBUG_PRINT("%s chillAST_FunctionDecl::addParameter( 0x%x param %s) total of %d parameters\n", functionName,
+ p, p->varname, 1 + parameters.size());
- if (symbolTableHasVariableNamed( &parameters, p->varname)) { // NOT recursive. just in FunctionDecl
+ if (symbolTableHasVariableNamed(&parameters, p->varname)) { // NOT recursive. just in FunctionDecl
CHILL_DEBUG_PRINT("chillAST_FunctionDecl::addParameter( %s ), parameter already exists?\n", p->varname);
- // exit(-1); // ??
- return; // error?
+ // exit(-1); // ??
+ return; // error?
}
parameters.push_back(p);
//addSymbolToTable( parameters, p );
CHILL_DEBUG_PRINT("setting %s isAParameter\n", p->varname);
- p->isAParameter = true;
-
- p->setParent( this ); // ?? unclear TODO
- //p->dump(); printf("\naddparameter done\n\n"); fflush(stdout);
-}
+ p->isAParameter = true;
+ p->setParent(this); // ?? unclear TODO
+ //p->dump(); printf("\naddparameter done\n\n"); fflush(stdout);
+}
-void chillAST_FunctionDecl::addDecl( chillAST_VarDecl *vd) { // to symbol table ONLY
+void chillAST_FunctionDecl::addDecl(chillAST_VarDecl *vd) { // to symbol table ONLY
CHILL_DEBUG_PRINT("chillAST_FunctionDecl::addDecl( %s )\n", vd->varname);
- if (!body) {
- //fprintf(stderr, "had no body\n");
+ if (!body) {
+ //fprintf(stderr, "had no body\n");
body = new chillAST_CompoundStmt();
-
+
//body->symbol_table = symbol_table; // probably wrong if this ever does something
}
- //fprintf(stderr, "before body->addvar(), func symbol table had %d entries\n", symbol_table->size());
- //fprintf(stderr, "before body->addvar(), body symbol table was %p\n", body->symbol_table);
- //fprintf(stderr, "before body->addvar(), body symbol table had %d entries\n", body->symbol_table->size());
+ //fprintf(stderr, "before body->addvar(), func symbol table had %d entries\n", symbol_table->size());
+ //fprintf(stderr, "before body->addvar(), body symbol table was %p\n", body->symbol_table);
+ //fprintf(stderr, "before body->addvar(), body symbol table had %d entries\n", body->symbol_table->size());
//adds to body symbol table, and makes sure function has a copy. probably dumb
- body->symbol_table = body->addVariableToSymbolTable( vd );
- //fprintf(stderr, "after body->addvar(), func symbol table had %d entries\n", symbol_table->size());
+ body->symbol_table = body->addVariableToSymbolTable(vd);
+ //fprintf(stderr, "after body->addvar(), func symbol table had %d entries\n", symbol_table->size());
}
-chillAST_VarDecl *chillAST_FunctionDecl::hasParameterNamed( const char *name ) {
+chillAST_VarDecl *chillAST_FunctionDecl::hasParameterNamed(const char *name) {
int numparams = parameters.size();
- for (int i=0; i<numparams; i++) {
- if (!strcmp(name, parameters[i]->varname)) return parameters[i]; // need to check type?
+ for (int i = 0; i < numparams; i++) {
+ if (!strcmp(name, parameters[i]->varname)) return parameters[i]; // need to check type?
}
- return NULL;
+ return NULL;
}
// similar to symbolTableHasVariableNamed() but returns the variable definition
-chillAST_VarDecl *chillAST_FunctionDecl::funcHasVariableNamed( const char *name ) { // NOT recursive
+chillAST_VarDecl *chillAST_FunctionDecl::funcHasVariableNamed(const char *name) { // NOT recursive
//fprintf(stderr, "chillAST_FunctionDecl::funcHasVariableNamed( %s )\n", name );
// first check the parameters
int numparams = parameters.size();
- for (int i=0; i<numparams; i++) {
+ for (int i = 0; i < numparams; i++) {
chillAST_VarDecl *vd = parameters[i];
- if (!strcmp(name, vd->varname)) {
- //fprintf(stderr, "yep, it's parameter %d\n", i);
- return vd; // need to check type?
+ if (!strcmp(name, vd->varname)) {
+ //fprintf(stderr, "yep, it's parameter %d\n", i);
+ return vd; // need to check type?
}
}
- //fprintf(stderr, "no parameter named %s\n", name);
+ //fprintf(stderr, "no parameter named %s\n", name);
- chillAST_SymbolTable *st = getSymbolTable();
+ chillAST_SymbolTable *st = getSymbolTable();
if (!st) {
- fprintf(stderr,"and no symbol_table, so no variable named %s\n", name);
- return NULL; // no symbol table so no variable by that name
+ fprintf(stderr, "and no symbol_table, so no variable named %s\n", name);
+ return NULL; // no symbol table so no variable by that name
}
-
- int numvars = st->size();
- //fprintf(stderr, "checking against %d variables\n", numvars);
- for (int i=0; i<numvars; i++) {
+
+ int numvars = st->size();
+ //fprintf(stderr, "checking against %d variables\n", numvars);
+ for (int i = 0; i < numvars; i++) {
chillAST_VarDecl *vd = (*st)[i];
- //fprintf(stderr, "comparing '%s' to '%s'\n", name, vd->varname);
+ //fprintf(stderr, "comparing '%s' to '%s'\n", name, vd->varname);
if (!strcmp(name, vd->varname)) {
- //fprintf(stderr, "yep, it's variable %d\n", i);
+ //fprintf(stderr, "yep, it's variable %d\n", i);
CHILL_DEBUG_PRINT("%s was already defined in the function body\n", vd->varname);
- return vd; // need to check type?
+ return vd; // need to check type?
}
}
CHILL_DEBUG_PRINT("not a parameter or variable named %s\n", name);
- return NULL;
+ return NULL;
}
-
-
-void chillAST_FunctionDecl::setBody( chillAST_node * bod ) {
- //fprintf(stderr, "%s chillAST_FunctionDecl::setBody( 0x%x ) total of %d children\n", functionName, bod, 1+children.size());
- if (bod->isCompoundStmt()) body = (chillAST_CompoundStmt *)bod;
- else {
+void chillAST_FunctionDecl::setBody(chillAST_node *bod) {
+ //fprintf(stderr, "%s chillAST_FunctionDecl::setBody( 0x%x ) total of %d children\n", functionName, bod, 1+children.size());
+ if (bod->isCompoundStmt()) body = (chillAST_CompoundStmt *) bod;
+ else {
body = new chillAST_CompoundStmt();
- body->addChild( bod );
+ body->addChild(bod);
}
- //symbol_table = body->getSymbolTable();
+ //symbol_table = body->getSymbolTable();
//addChild(bod);
- bod->setParent( this ); // well, ...
+ bod->setParent(this); // well, ...
}
-void chillAST_FunctionDecl::insertChild(int i, chillAST_node* node) {
- fprintf(stderr, "chillAST_FunctionDecl::insertChild() "); node->print(0,stderr); fprintf(stderr, "\n\n");
- body->insertChild( i, node );
+void chillAST_FunctionDecl::insertChild(int i, chillAST_node *node) {
+ fprintf(stderr, "chillAST_FunctionDecl::insertChild() ");
+ node->print(0, stderr);
+ fprintf(stderr, "\n\n");
+ body->insertChild(i, node);
- if (node->isVarDecl()) {
+ if (node->isVarDecl()) {
chillAST_VarDecl *vd = ((chillAST_VarDecl *) node);
fprintf(stderr, "functiondecl %s inserting a VarDecl named %s\n", functionName, vd->varname);
chillAST_SymbolTable *st = getSymbolTable();
- if (!st) {
- fprintf(stderr, "symbol table is NULL!\n");
- }
- else {
- fprintf(stderr, "%d entries in the symbol table\n", st->size());
- printSymbolTable( getSymbolTable() );
+ if (!st) {
+ fprintf(stderr, "symbol table is NULL!\n");
+ } else {
+ fprintf(stderr, "%d entries in the symbol table\n", st->size());
+ printSymbolTable(getSymbolTable());
}
- fprintf(stderr, "\n\n");
+ fprintf(stderr, "\n\n");
}
}
-void chillAST_FunctionDecl::addChild(chillAST_node* node) {
+void chillAST_FunctionDecl::addChild(chillAST_node *node) {
CHILL_DEBUG_BEGIN
- node->print(0,stderr); fprintf(stderr, "\n\n");
+ node->print(0, stderr);
+ fprintf(stderr, "\n\n");
CHILL_DEBUG_END
- if (node->isVarDecl()) {
+ if (node->isVarDecl()) {
chillAST_VarDecl *vd = ((chillAST_VarDecl *) node);
CHILL_DEBUG_PRINT("functiondecl %s adding a VarDecl named %s\n", functionName, vd->varname);
}
- body->addChild( node );
- node->parent = this; // this, or body??
+ body->addChild(node);
+ node->parent = this; // this, or body??
}
-void chillAST_FunctionDecl::printParameterTypes( FILE *fp ) { // also prints names
- //fprintf(stderr, "\n\n%s chillAST_FunctionDecl::printParameterTypes()\n", functionName);
- fprintf(fp, "( ");
- int numparameters = parameters.size();
- for (int i=0; i<numparameters; i++) {
- if (i!=0) fprintf(fp, ", ");
+void chillAST_FunctionDecl::printParameterTypes(FILE *fp) { // also prints names
+ //fprintf(stderr, "\n\n%s chillAST_FunctionDecl::printParameterTypes()\n", functionName);
+ fprintf(fp, "( ");
+ int numparameters = parameters.size();
+ for (int i = 0; i < numparameters; i++) {
+ if (i != 0) fprintf(fp, ", ");
chillAST_VarDecl *p = parameters[i];
p->print(0, fp); // note: no indent, as this is in the function parens
}
@@ -1049,403 +1033,392 @@ void chillAST_FunctionDecl::printParameterTypes( FILE *fp ) { // also prints n
}
-
-
-void chillAST_FunctionDecl::print( int indent, FILE *fp ) {
- //fprintf(fp, "\n// functiondecl %p \n", this);
- //chillindent(indent, fp);
+void chillAST_FunctionDecl::print(int indent, FILE *fp) {
+ //fprintf(fp, "\n// functiondecl %p \n", this);
+ //chillindent(indent, fp);
//fprintf(fp, "//(functiondecl) %d parameters\n", numparameters);
- printPreprocBEFORE(indent, fp);
+ printPreprocBEFORE(indent, fp);
fprintf(fp, "\n");
- chillindent(indent, fp);
+ chillindent(indent, fp);
+
+ if (externfunc) fprintf(fp, "extern ");
- if (externfunc) fprintf(fp, "extern ");
+ if (function_type == CHILL_FUNCTION_GPU) fprintf(fp, "__global__ ");
+ fprintf(fp, "%s %s", returnType, functionName);
+ printParameterTypes(fp);
- if (function_type == CHILL_FUNCTION_GPU) fprintf(fp, "__global__ ");
- fprintf(fp, "%s %s", returnType, functionName );
- printParameterTypes(fp);
-
- // non-parameter variables (now must have explicit vardecl in the body)
+ // non-parameter variables (now must have explicit vardecl in the body)
//int numvars = symbol_table.size();
- //for (int i=0; i<numvars; i++) {
+ //for (int i=0; i<numvars; i++) {
// symbol_table[i]->print(1,fp);
- // fprintf(fp, ";\n");
- //}
-
- // now the body
- if (!(externfunc || forwarddecl)) {
- if (body) {
- fprintf(fp, "\n{\n");
- //chillindent(indent+1, fp); fprintf(fp, "//body\n"); fflush(fp);
- body->print( indent+1, fp);
- fprintf(fp, "\n");
- //chillindent(indent+1, fp); fprintf(fp, "//END body\n"); fflush(fp);
-
+ // fprintf(fp, ";\n");
+ //}
+
+ // now the body
+ if (!(externfunc || forwarddecl)) {
+ if (body) {
+ fprintf(fp, "\n{\n");
+ //chillindent(indent+1, fp); fprintf(fp, "//body\n"); fflush(fp);
+ body->print(indent + 1, fp);
+ fprintf(fp, "\n");
+ //chillindent(indent+1, fp); fprintf(fp, "//END body\n"); fflush(fp);
+
// tidy up
- chillindent(indent, fp);
+ chillindent(indent, fp);
fprintf(fp, "}\n");
- } // if body
- else {
- fprintf(fp, "{}\n"); // should never happen, but not external and no body
+ } // if body
+ else {
+ fprintf(fp, "{}\n"); // should never happen, but not external and no body
}
- }
- else { // extern func or forward decl. just end forward declaration
+ } else { // extern func or forward decl. just end forward declaration
fprintf(fp, "; // fwd decl\n");
}
-
- printPreprocAFTER(indent, fp);
- fflush(fp);
+ printPreprocAFTER(indent, fp);
+
+ fflush(fp);
}
-
-void chillAST_FunctionDecl::dump( int indent, FILE *fp ) {
- fprintf(fp, "\n");
+void chillAST_FunctionDecl::dump(int indent, FILE *fp) {
+ fprintf(fp, "\n");
fprintf(fp, "// isFromSourceFile ");
- if (filename) fprintf(fp, "%s ", filename);
- if (isFromSourceFile) fprintf(fp, "true\n");
- else fprintf(fp, "false\n");
- chillindent(indent, fp);
- fprintf(fp, "(FunctionDecl %s %s(", returnType, functionName );
-
- int numparameters = parameters.size();
- for (int i=0; i<numparameters; i++) {
- if (i!=0) fprintf(fp, ", ");
+ if (filename) fprintf(fp, "%s ", filename);
+ if (isFromSourceFile) fprintf(fp, "true\n");
+ else fprintf(fp, "false\n");
+ chillindent(indent, fp);
+ fprintf(fp, "(FunctionDecl %s %s(", returnType, functionName);
+
+ int numparameters = parameters.size();
+ for (int i = 0; i < numparameters; i++) {
+ if (i != 0) fprintf(fp, ", ");
chillAST_VarDecl *p = parameters[i];
- //fprintf(stderr, "param type %s vartype %s\n", p->getTypeString(), p->vartype);
+ //fprintf(stderr, "param type %s vartype %s\n", p->getTypeString(), p->vartype);
p->print(0, fp); // note: no indent, as this is in the function parens, ALSO print, not dump
}
fprintf(fp, ")\n"); // end of input parameters
-
- // now the body -
- if (body) body->dump( indent+1 , fp);
+
+ // now the body -
+ if (body) body->dump(indent + 1, fp);
// tidy up
- chillindent(indent, fp);
+ chillindent(indent, fp);
fprintf(fp, ")\n");
- fflush(fp);
+ fflush(fp);
}
-
-
-
-
-void chillAST_FunctionDecl::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- //fprintf(stderr, "chillAST_FunctionDecl::gatherVarDecls()\n");
- //if (0 < children.size()) fprintf(stderr, "functiondecl has %d children\n", children.size());
+void chillAST_FunctionDecl::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ //fprintf(stderr, "chillAST_FunctionDecl::gatherVarDecls()\n");
+ //if (0 < children.size()) fprintf(stderr, "functiondecl has %d children\n", children.size());
//fprintf(stderr, "functiondecl has %d parameters\n", numParameters());
- for (int i=0; i<numParameters(); i++) parameters[i]->gatherVarDecls( decls );
- //fprintf(stderr, "after parms, %d decls\n", decls.size());
- for (int i=0; i<children.size(); i++) children[i]->gatherVarDecls( decls );
- //fprintf(stderr, "after children, %d decls\n", decls.size());
- body->gatherVarDecls( decls ); // todo, figure out if functiondecl has actual children
- //fprintf(stderr, "after body, %d decls\n", decls.size());
+ for (int i = 0; i < numParameters(); i++) parameters[i]->gatherVarDecls(decls);
+ //fprintf(stderr, "after parms, %d decls\n", decls.size());
+ for (int i = 0; i < children.size(); i++) children[i]->gatherVarDecls(decls);
+ //fprintf(stderr, "after children, %d decls\n", decls.size());
+ body->gatherVarDecls(decls); // todo, figure out if functiondecl has actual children
+ //fprintf(stderr, "after body, %d decls\n", decls.size());
//for (int d=0; d<decls.size(); d++) {
- // decls[d]->print(0,stderr); fprintf(stderr, "\n");
- //}
+ // decls[d]->print(0,stderr); fprintf(stderr, "\n");
+ //}
}
-void chillAST_FunctionDecl::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- //if (0 < children.size()) fprintf(stderr, "functiondecl has %d children\n", children.size());
-
- for (int i=0; i<numParameters(); i++) parameters[i]->gatherScalarVarDecls( decls );
- for (int i=0; i<children.size(); i++) children[i]->gatherScalarVarDecls( decls );
- body->gatherScalarVarDecls( decls ); // todo, figure out if functiondecl has actual children
+void chillAST_FunctionDecl::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ //if (0 < children.size()) fprintf(stderr, "functiondecl has %d children\n", children.size());
+
+ for (int i = 0; i < numParameters(); i++) parameters[i]->gatherScalarVarDecls(decls);
+ for (int i = 0; i < children.size(); i++) children[i]->gatherScalarVarDecls(decls);
+ body->gatherScalarVarDecls(decls); // todo, figure out if functiondecl has actual children
}
-void chillAST_FunctionDecl::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- //if (0 < children.size()) fprintf(stderr, "functiondecl has %d children\n", children.size());
-
- for (int i=0; i<numParameters(); i++) parameters[i]->gatherArrayVarDecls( decls );
- for (int i=0; i<children.size(); i++) children[i]->gatherArrayVarDecls( decls );
- body->gatherArrayVarDecls( decls ); // todo, figure out if functiondecl has actual children
+void chillAST_FunctionDecl::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ //if (0 < children.size()) fprintf(stderr, "functiondecl has %d children\n", children.size());
+
+ for (int i = 0; i < numParameters(); i++) parameters[i]->gatherArrayVarDecls(decls);
+ for (int i = 0; i < children.size(); i++) children[i]->gatherArrayVarDecls(decls);
+ body->gatherArrayVarDecls(decls); // todo, figure out if functiondecl has actual children
}
-chillAST_VarDecl *chillAST_FunctionDecl::findArrayDecl( const char *name ) {
+chillAST_VarDecl *chillAST_FunctionDecl::findArrayDecl(const char *name) {
//fprintf(stderr, "chillAST_FunctionDecl::findArrayDecl( %s )\n", name );
- chillAST_VarDecl *p = hasParameterNamed( name );
+ chillAST_VarDecl *p = hasParameterNamed(name);
//if (p) fprintf(stderr, "function %s has parameter named %s\n", functionName, name );
if (p && p->isArray()) return p;
- chillAST_VarDecl *v = funcHasVariableNamed ( name );
+ chillAST_VarDecl *v = funcHasVariableNamed(name);
//if (v) fprintf(stderr, "function %s has symbol table variable named %s\n", functionName, name );
if (v && v->isArray()) return v;
// declared variables that may not be in symbol table but probably should be
- vector<chillAST_VarDecl*> decls ;
- gatherArrayVarDecls( decls );
- for (int i=0; i<decls.size(); i++) {
- chillAST_VarDecl *vd = decls[i];
- if (0 == strcmp(vd->varname, name ) && vd->isArray()) return vd;
+ vector<chillAST_VarDecl *> decls;
+ gatherArrayVarDecls(decls);
+ for (int i = 0; i < decls.size(); i++) {
+ chillAST_VarDecl *vd = decls[i];
+ if (0 == strcmp(vd->varname, name) && vd->isArray()) return vd;
}
- //fprintf(stderr, "can't find array named %s in function %s \n", name, functionName);
- return NULL;
+ //fprintf(stderr, "can't find array named %s in function %s \n", name, functionName);
+ return NULL;
}
-void chillAST_FunctionDecl::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- for (int i=0; i<children.size(); i++) children[i]->gatherVarUsage( decls );
- body->gatherVarUsage( decls ); // todo, figure out if functiondecl has actual children
+void chillAST_FunctionDecl::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ for (int i = 0; i < children.size(); i++) children[i]->gatherVarUsage(decls);
+ body->gatherVarUsage(decls); // todo, figure out if functiondecl has actual children
}
-void chillAST_FunctionDecl::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- for (int i=0; i<children.size(); i++) children[i]->gatherDeclRefExprs( refs );
- body->gatherDeclRefExprs( refs ); // todo, figure out if functiondecl has actual children
+void chillAST_FunctionDecl::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ for (int i = 0; i < children.size(); i++) children[i]->gatherDeclRefExprs(refs);
+ body->gatherDeclRefExprs(refs); // todo, figure out if functiondecl has actual children
}
+void chillAST_FunctionDecl::cleanUpVarDecls() {
+ //fprintf(stderr, "\ncleanUpVarDecls() for function %s\n", functionName);
+ vector<chillAST_VarDecl *> used;
+ vector<chillAST_VarDecl *> defined;
+ vector<chillAST_VarDecl *> deletethese;
-void chillAST_FunctionDecl::cleanUpVarDecls() {
- //fprintf(stderr, "\ncleanUpVarDecls() for function %s\n", functionName);
- vector<chillAST_VarDecl*> used;
- vector<chillAST_VarDecl*> defined;
- vector<chillAST_VarDecl*> deletethese;
-
- gatherVarUsage( used );
- gatherVarDecls( defined );
+ gatherVarUsage(used);
+ gatherVarDecls(defined);
- //fprintf(stderr, "\nvars used: \n");
- //for ( int i=0; i< used.size(); i++) {
- //used[i]->print(0, stderr); fprintf(stderr, "\n");
- //}
- //fprintf(stderr, "\n");
- //fprintf(stderr, "\nvars defined: \n");
- //for ( int i=0; i< defined.size(); i++) {
- // defined[i]->print(0, stderr); fprintf(stderr, "\n");
- //}
- //fprintf(stderr, "\n");
+ //fprintf(stderr, "\nvars used: \n");
+ //for ( int i=0; i< used.size(); i++) {
+ //used[i]->print(0, stderr); fprintf(stderr, "\n");
+ //}
+ //fprintf(stderr, "\n");
+ //fprintf(stderr, "\nvars defined: \n");
+ //for ( int i=0; i< defined.size(); i++) {
+ // defined[i]->print(0, stderr); fprintf(stderr, "\n");
+ //}
+ //fprintf(stderr, "\n");
- for ( int j=0; j < defined.size(); j++) {
- //fprintf(stderr, "j %d defined %s\n", j, defined[j]->varname);
+ for (int j = 0; j < defined.size(); j++) {
+ //fprintf(stderr, "j %d defined %s\n", j, defined[j]->varname);
bool definedandused = false;
- for ( int i=0; i < used.size(); i++) {
- if (used[i] == defined[j]) {
- //fprintf(stderr, "i %d used %s\n", i, used[i]->varname);
+ for (int i = 0; i < used.size(); i++) {
+ if (used[i] == defined[j]) {
+ //fprintf(stderr, "i %d used %s\n", i, used[i]->varname);
//fprintf(stderr, "\n");
definedandused = true;
break;
}
}
- if (!definedandused) {
- if ( defined[j]->isParmVarDecl() ) {
- //fprintf(stderr, "we'd remove %s except that it's a parameter. Maybe someday\n", defined[j]->varname);
- }
- else {
- //fprintf(stderr, "we can probably remove the definition of %s\n", defined[j]->varname);
- deletethese.push_back( defined[j] );
+ if (!definedandused) {
+ if (defined[j]->isParmVarDecl()) {
+ //fprintf(stderr, "we'd remove %s except that it's a parameter. Maybe someday\n", defined[j]->varname);
+ } else {
+ //fprintf(stderr, "we can probably remove the definition of %s\n", defined[j]->varname);
+ deletethese.push_back(defined[j]);
}
}
}
- //fprintf(stderr, "deleting %d vardecls\n", deletethese.size());
- for (int i=0; i<deletethese.size(); i++) {
- //fprintf(stderr, "deleting varDecl %s\n", deletethese[i]->varname);
- chillAST_node *par = deletethese[i]->parent;
- par->removeChild( par->findChild( deletethese[i] ));
+ //fprintf(stderr, "deleting %d vardecls\n", deletethese.size());
+ for (int i = 0; i < deletethese.size(); i++) {
+ //fprintf(stderr, "deleting varDecl %s\n", deletethese[i]->varname);
+ chillAST_node *par = deletethese[i]->parent;
+ par->removeChild(par->findChild(deletethese[i]));
}
- //fprintf(stderr, "\n\nnow check for vars used but not defined\n");
+ //fprintf(stderr, "\n\nnow check for vars used but not defined\n");
// now check for vars used but not defined?
- for ( int j=0; j < used.size(); j++) {
- //fprintf(stderr, "%s is used\n", used[j]->varname);
+ for (int j = 0; j < used.size(); j++) {
+ //fprintf(stderr, "%s is used\n", used[j]->varname);
bool definedandused = false;
- for ( int i=0; i < defined.size(); i++) {
- if (used[j] == defined[i]) {
- //fprintf(stderr, "%s is defined\n", defined[i]->varname);
+ for (int i = 0; i < defined.size(); i++) {
+ if (used[j] == defined[i]) {
+ //fprintf(stderr, "%s is defined\n", defined[i]->varname);
definedandused = true;
break;
}
}
- if (!definedandused) {
- //fprintf(stderr, "%s is used but not defined?\n", used[j]->varname);
+ if (!definedandused) {
+ //fprintf(stderr, "%s is used but not defined?\n", used[j]->varname);
// add it to the beginning of the function
- insertChild(0, used[j]);
+ insertChild(0, used[j]);
}
}
-
+
}
//void chillAST_FunctionDecl::replaceVarDecls( chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl ) {
-// for (int i=0; i<children.size(); i++) children[i]->replaceVarDecls( olddecl, newdecl );
-//}
+// for (int i=0; i<children.size(); i++) children[i]->replaceVarDecls( olddecl, newdecl );
+//}
-bool chillAST_FunctionDecl::findLoopIndexesToReplace( chillAST_SymbolTable *symtab, bool forcesync ) {
- if (body) body->findLoopIndexesToReplace( symtab, false );
+bool chillAST_FunctionDecl::findLoopIndexesToReplace(chillAST_SymbolTable *symtab, bool forcesync) {
+ if (body) body->findLoopIndexesToReplace(symtab, false);
return false;
}
-
- chillAST_node *chillAST_FunctionDecl::constantFold() {
- //fprintf(stderr, "chillAST_FunctionDecl::constantFold()\n");
- // parameters can't have constants?
- int numparameters = parameters.size();
- for (int i=0; i<numparameters; i++) {
- parameters[i]->constantFold();
- }
- if (body) body = (chillAST_CompoundStmt *)body->constantFold();
- return this;
- }
+chillAST_node *chillAST_FunctionDecl::constantFold() {
+ //fprintf(stderr, "chillAST_FunctionDecl::constantFold()\n");
+ // parameters can't have constants?
+ int numparameters = parameters.size();
+ for (int i = 0; i < numparameters; i++) {
+ parameters[i]->constantFold();
+ }
+ if (body) body = (chillAST_CompoundStmt *) body->constantFold();
+ return this;
+}
-chillAST_MacroDefinition::chillAST_MacroDefinition() {
+chillAST_MacroDefinition::chillAST_MacroDefinition() {
macroName = strdup("UNDEFINEDMACRO");
rhsString = NULL;
- asttype = CHILLAST_NODETYPE_MACRODEFINITION;
- parent = NULL;
+ asttype = CHILLAST_NODETYPE_MACRODEFINITION;
+ parent = NULL;
metacomment = NULL;
symbol_table = NULL;
//rhsideString = NULL;
- isFromSourceFile = true; // default
- filename = NULL;
+ isFromSourceFile = true; // default
+ filename = NULL;
};
-chillAST_MacroDefinition::chillAST_MacroDefinition(const char *mname, chillAST_node *par) {
+chillAST_MacroDefinition::chillAST_MacroDefinition(const char *mname, chillAST_node *par) {
macroName = strdup(mname);
rhsString = NULL;
- asttype = CHILLAST_NODETYPE_MACRODEFINITION;
+ asttype = CHILLAST_NODETYPE_MACRODEFINITION;
parent = par;
metacomment = NULL;
symbol_table = NULL;
//rhsideString = NULL;
- if (par) par->getSourceFile()->addMacro( this );
+ if (par) par->getSourceFile()->addMacro(this);
- //fprintf(stderr, "chillAST_MacroDefinition::chillAST_MacroDefinition( %s, ", mname);
+ //fprintf(stderr, "chillAST_MacroDefinition::chillAST_MacroDefinition( %s, ", mname);
//if (par) fprintf(stderr, " parent NOT NULL);\n");
//else fprintf(stderr, " parent NULL);\n");
- isFromSourceFile = true; // default
- filename = NULL;
+ isFromSourceFile = true; // default
+ filename = NULL;
};
-chillAST_MacroDefinition::chillAST_MacroDefinition(const char *mname, const char *rhs, chillAST_node *par) {
+chillAST_MacroDefinition::chillAST_MacroDefinition(const char *mname, const char *rhs, chillAST_node *par) {
macroName = strdup(mname);
rhsString = strdup(rhs);
- asttype = CHILLAST_NODETYPE_MACRODEFINITION;
+ asttype = CHILLAST_NODETYPE_MACRODEFINITION;
parent = par;
metacomment = NULL;
symbol_table = NULL;
- if (par) par->getSourceFile()->addMacro( this );
+ if (par) par->getSourceFile()->addMacro(this);
- //fprintf(stderr, "chillAST_MacroDefinition::chillAST_MacroDefinition( %s, ", mname);
+ //fprintf(stderr, "chillAST_MacroDefinition::chillAST_MacroDefinition( %s, ", mname);
//if (par) fprintf(stderr, " parent NOT NULL);\n");
//else fprintf(stderr, " parent NULL);\n");
- isFromSourceFile = true; // default
- filename = NULL;
+ isFromSourceFile = true; // default
+ filename = NULL;
};
-chillAST_node* chillAST_MacroDefinition::clone() {
+chillAST_node *chillAST_MacroDefinition::clone() {
// TODO ?? cloning a macro makes no sense
return this;
-#ifdef CONFUSED
+#ifdef CONFUSED
- //fprintf(stderr, "chillAST_MacroDefinition::clone() for %s\n", macroName);
- chillAST_MacroDefinition *clo = new chillAST_MacroDefinition( macroName, parent);
+ //fprintf(stderr, "chillAST_MacroDefinition::clone() for %s\n", macroName);
+ chillAST_MacroDefinition *clo = new chillAST_MacroDefinition( macroName, parent);
for (int i=0; i<parameters.size(); i++) clo->addParameter( parameters[i] );
clo->setBody( body->clone() );
- return clo;
-#endif
+ return clo;
+#endif
}
-void chillAST_MacroDefinition::setBody( chillAST_node * bod ) {
- fprintf(stderr, "%s chillAST_MacroDefinition::setBody( 0x%x )\n", macroName, bod);
+void chillAST_MacroDefinition::setBody(chillAST_node *bod) {
+ fprintf(stderr, "%s chillAST_MacroDefinition::setBody( 0x%x )\n", macroName, bod);
body = bod;
- fprintf(stderr, "body is:\n"); body->print(0,stderr); fprintf(stderr, "\n\n");
- rhsString = body->stringRep();
- bod->setParent( this ); // well, ...
+ fprintf(stderr, "body is:\n");
+ body->print(0, stderr);
+ fprintf(stderr, "\n\n");
+ rhsString = body->stringRep();
+ bod->setParent(this); // well, ...
}
-void chillAST_MacroDefinition::addParameter( chillAST_VarDecl *p) {
- //fprintf(stderr, "%s chillAST_MacroDefinition::addParameter( 0x%x ) total of %d children\n", functionName, p, 1+children.size());
+void chillAST_MacroDefinition::addParameter(chillAST_VarDecl *p) {
+ //fprintf(stderr, "%s chillAST_MacroDefinition::addParameter( 0x%x ) total of %d children\n", functionName, p, 1+children.size());
parameters.push_back(p);
- fprintf(stderr, "macro setting %s isAParameter\n", p->varname);
- p->isAParameter = true;
- p->setParent( this );
+ fprintf(stderr, "macro setting %s isAParameter\n", p->varname);
+ p->isAParameter = true;
+ p->setParent(this);
- addVariableToSymbolTable( p );
+ addVariableToSymbolTable(p);
}
-chillAST_VarDecl *chillAST_MacroDefinition::hasParameterNamed( const char *name ) {
+chillAST_VarDecl *chillAST_MacroDefinition::hasParameterNamed(const char *name) {
int numparams = parameters.size();
- for (int i=0; i<numparams; i++) {
- if (!strcmp(name, parameters[i]->varname)) return parameters[i]; // need to check type?
+ for (int i = 0; i < numparams; i++) {
+ if (!strcmp(name, parameters[i]->varname)) return parameters[i]; // need to check type?
}
- return NULL;
+ return NULL;
}
-void chillAST_MacroDefinition::insertChild(int i, chillAST_node* node) {
- body->insertChild( i, node );
+void chillAST_MacroDefinition::insertChild(int i, chillAST_node *node) {
+ body->insertChild(i, node);
}
-void chillAST_MacroDefinition::addChild(chillAST_node* node) {
- body->addChild( node );
- node->parent = this; // this, or body??
+void chillAST_MacroDefinition::addChild(chillAST_node *node) {
+ body->addChild(node);
+ node->parent = this; // this, or body??
}
-void chillAST_MacroDefinition::dump( int indent, FILE *fp ) {
- fprintf(fp, "\n");
- chillindent(indent, fp);
+void chillAST_MacroDefinition::dump(int indent, FILE *fp) {
+ fprintf(fp, "\n");
+ chillindent(indent, fp);
fprintf(fp, "(MacroDefinition %s(", macroName);
- for (int i=0; i<numParameters(); i++) {
+ for (int i = 0; i < numParameters(); i++) {
fprintf(fp, "\n");
- chillindent(indent+1, fp);
- fprintf(fp, "(%s)", parameters[i]->varname);
+ chillindent(indent + 1, fp);
+ fprintf(fp, "(%s)", parameters[i]->varname);
}
- fprintf(fp, ")\n");
- body->dump( indent+1, fp);
- if (rhsString) fprintf(fp, " (aka %s)");
- fprintf(fp, "\n");
+ fprintf(fp, ")\n");
+ body->dump(indent + 1, fp);
+ if (rhsString) fprintf(fp, " (aka %s)");
+ fprintf(fp, "\n");
fflush(fp);
}
-void chillAST_MacroDefinition::print( int indent, FILE *fp ) { // UHOH TODO
+void chillAST_MacroDefinition::print(int indent, FILE *fp) { // UHOH TODO
//fprintf(fp, "\n"); // ignore indentation
- //fprintf(stderr, "macro has %d parameters\n", numParameters());
+ //fprintf(stderr, "macro has %d parameters\n", numParameters());
- printPreprocBEFORE(indent, fp);
+ printPreprocBEFORE(indent, fp);
fprintf(fp, "#define %s", macroName);
- if (0 != numParameters()) {
+ if (0 != numParameters()) {
fprintf(fp, "(");
- for (int i=0; i<numParameters(); i++) {
+ for (int i = 0; i < numParameters(); i++) {
if (i) fprintf(fp, ",");
- fprintf(fp, "%s", parameters[i]->varname);
+ fprintf(fp, "%s", parameters[i]->varname);
}
fprintf(fp, ") ");
}
- if (body) body->print(0, fp); // TODO should force newlines out of multiline macros
- fprintf(fp, "\n");
-}
-
-
+ if (body) body->print(0, fp); // TODO should force newlines out of multiline macros
+ fprintf(fp, "\n");
+}
chillAST_ForStmt::chillAST_ForStmt() {
@@ -1457,133 +1430,130 @@ chillAST_ForStmt::chillAST_ForStmt() {
parent = NULL;
metacomment = NULL;
symbol_table = NULL;
- isFromSourceFile = true; // default
- filename = NULL;
+ isFromSourceFile = true; // default
+ filename = NULL;
}
-chillAST_ForStmt::chillAST_ForStmt( chillAST_node *ini, chillAST_node *con, chillAST_node *inc, chillAST_node *bod, chillAST_node *par) {
- parent = par;
+chillAST_ForStmt::chillAST_ForStmt(chillAST_node *ini, chillAST_node *con, chillAST_node *inc, chillAST_node *bod,
+ chillAST_node *par) {
+ parent = par;
metacomment = NULL;
init = ini;
cond = con;
incr = inc;
body = bod;
- init->setParent( this );
- cond->setParent( this );
- incr->setParent( this );
-
- //fprintf(stderr, "chillAST_ForStmt::chillAST_ForStmt() bod %p\n", bod);
+ init->setParent(this);
+ cond->setParent(this);
+ incr->setParent(this);
+
+ //fprintf(stderr, "chillAST_ForStmt::chillAST_ForStmt() bod %p\n", bod);
+
+ if (body) body->setParent(this); // not sure this should be legal
- if (body) body->setParent( this ); // not sure this should be legal
-
- asttype = CHILLAST_NODETYPE_LOOP; // breaking with tradition, this was CHILL_AST_FORSTMT
+ asttype = CHILLAST_NODETYPE_LOOP; // breaking with tradition, this was CHILL_AST_FORSTMT
- if (!cond->isBinaryOperator()) {
+ if (!cond->isBinaryOperator()) {
fprintf(stderr, "ForStmt conditional is of type %s. Expecting a BinaryOperator\n", cond->getTypeString());
- exit(-1);
+ exit(-1);
}
- chillAST_BinaryOperator *bo = (chillAST_BinaryOperator *)cond;
- char *condstring = bo->op;
- if (!strcmp(condstring, "<")) conditionoperator = IR_COND_LT;
+ chillAST_BinaryOperator *bo = (chillAST_BinaryOperator *) cond;
+ char *condstring = bo->op;
+ if (!strcmp(condstring, "<")) conditionoperator = IR_COND_LT;
else if (!strcmp(condstring, "<=")) conditionoperator = IR_COND_LE;
- else if (!strcmp(condstring, ">")) conditionoperator = IR_COND_GT;
+ else if (!strcmp(condstring, ">")) conditionoperator = IR_COND_GT;
else if (!strcmp(condstring, ">=")) conditionoperator = IR_COND_GE;
- else {
+ else {
fprintf(stderr, "ForStmt, illegal/unhandled end condition \"%s\"\n", condstring);
fprintf(stderr, "currently can only handle <, >, <=, >=\n");
exit(1);
}
- isFromSourceFile = true; // default
- filename = NULL;
+ isFromSourceFile = true; // default
+ filename = NULL;
}
-bool chillAST_ForStmt::lowerBound( int &l ) { // l is an output (passed as reference)
-
- // above, cond must be a binaryoperator ... ???
- if (conditionoperator == IR_COND_LT ||
- conditionoperator == IR_COND_LE ) {
-
- // lower bound is rhs of init
- if (!init->isBinaryOperator()) {
+bool chillAST_ForStmt::lowerBound(int &l) { // l is an output (passed as reference)
+
+ // above, cond must be a binaryoperator ... ???
+ if (conditionoperator == IR_COND_LT ||
+ conditionoperator == IR_COND_LE) {
+
+ // lower bound is rhs of init
+ if (!init->isBinaryOperator()) {
fprintf(stderr, "chillAST_ForStmt::lowerBound() init is not a chillAST_BinaryOperator\n");
exit(-1);
}
-
- chillAST_BinaryOperator *bo = (chillAST_BinaryOperator *)init;
- if (!init->isAssignmentOp()) {
+
+ chillAST_BinaryOperator *bo = (chillAST_BinaryOperator *) init;
+ if (!init->isAssignmentOp()) {
fprintf(stderr, "chillAST_ForStmt::lowerBound() init is not an assignment chillAST_BinaryOperator\n");
exit(-1);
}
-
- //fprintf(stderr, "rhs "); bo->rhs->print(0,stderr); fprintf(stderr, " ");
+
+ //fprintf(stderr, "rhs "); bo->rhs->print(0,stderr); fprintf(stderr, " ");
l = bo->rhs->evalAsInt(); // float could be legal I suppose
- //fprintf(stderr, " %d\n", l);
- return true;
- }
- else if (conditionoperator == IR_COND_GT ||
- conditionoperator == IR_COND_GE ) { // decrementing
+ //fprintf(stderr, " %d\n", l);
+ return true;
+ } else if (conditionoperator == IR_COND_GT ||
+ conditionoperator == IR_COND_GE) { // decrementing
// lower bound is rhs of cond (not init)
- chillAST_BinaryOperator *bo = (chillAST_BinaryOperator *)cond;
+ chillAST_BinaryOperator *bo = (chillAST_BinaryOperator *) cond;
l = bo->rhs->evalAsInt(); // float could be legal I suppose
- return true;
+ return true;
}
-
- // some case we don't handle ??
- fprintf(stderr, "chillAST_ForStmt::lowerBound() can't find lower bound of ");
- print(0,stderr);
- fprintf(stderr, "\n\n");
+
+ // some case we don't handle ??
+ fprintf(stderr, "chillAST_ForStmt::lowerBound() can't find lower bound of ");
+ print(0, stderr);
+ fprintf(stderr, "\n\n");
return false; // or exit ???
}
-bool chillAST_ForStmt::upperBound( int &u ) { // u is an output (passed as reference)
-
- // above, cond must be a binaryoperator ... ???
- if (conditionoperator == IR_COND_GT ||
- conditionoperator == IR_COND_GE ) { // decrementing
+bool chillAST_ForStmt::upperBound(int &u) { // u is an output (passed as reference)
+
+ // above, cond must be a binaryoperator ... ???
+ if (conditionoperator == IR_COND_GT ||
+ conditionoperator == IR_COND_GE) { // decrementing
- // upper bound is rhs of init
- if (!init->isBinaryOperator()) {
+ // upper bound is rhs of init
+ if (!init->isBinaryOperator()) {
fprintf(stderr, "chillAST_ForStmt::upperBound() init is not a chillAST_BinaryOperator\n");
exit(-1);
}
- chillAST_BinaryOperator *bo = (chillAST_BinaryOperator *)init;
- if (!init->isAssignmentOp()) {
+ chillAST_BinaryOperator *bo = (chillAST_BinaryOperator *) init;
+ if (!init->isAssignmentOp()) {
fprintf(stderr, "chillAST_ForStmt::upperBound() init is not an assignment chillAST_BinaryOperator\n");
exit(-1);
}
u = bo->rhs->evalAsInt(); // float could be legal I suppose
- return true;
- }
- else if (conditionoperator == IR_COND_LT ||
- conditionoperator == IR_COND_LE ) {
+ return true;
+ } else if (conditionoperator == IR_COND_LT ||
+ conditionoperator == IR_COND_LE) {
//fprintf(stderr, "upper bound is rhs of cond ");
// upper bound is rhs of cond (not init)
- chillAST_BinaryOperator *bo = (chillAST_BinaryOperator *)cond;
+ chillAST_BinaryOperator *bo = (chillAST_BinaryOperator *) cond;
//bo->rhs->print(0,stderr);
u = bo->rhs->evalAsInt(); // float could be legal I suppose
- if (conditionoperator == IR_COND_LT) u -= 1;
+ if (conditionoperator == IR_COND_LT) u -= 1;
//fprintf(stderr, " %d\n", u);
- return true;
+ return true;
}
- // some case we don't handle ??
- fprintf(stderr, "chillAST_ForStmt::upperBound() can't find upper bound of ");
- print(0,stderr);
- fprintf(stderr, "\n\n");
+ // some case we don't handle ??
+ fprintf(stderr, "chillAST_ForStmt::upperBound() can't find upper bound of ");
+ print(0, stderr);
+ fprintf(stderr, "\n\n");
return false; // or exit ???
}
-
-
-void chillAST_ForStmt::printControl( int in, FILE *fp ) {
+void chillAST_ForStmt::printControl(int in, FILE *fp) {
chillindent(in, fp);
fprintf(fp, "for (");
init->print(0, fp);
@@ -1592,175 +1562,173 @@ void chillAST_ForStmt::printControl( int in, FILE *fp ) {
fprintf(fp, "; ");
incr->print(0, fp);
fprintf(fp, ")");
- fflush(fp);
+ fflush(fp);
}
-void chillAST_ForStmt::print( int indent, FILE *fp ) {
- printPreprocBEFORE(indent, fp);
- //fprintf(fp, "chillAST_ForStmt::print()\n");
- if (metacomment) {
+void chillAST_ForStmt::print(int indent, FILE *fp) {
+ printPreprocBEFORE(indent, fp);
+ //fprintf(fp, "chillAST_ForStmt::print()\n");
+ if (metacomment) {
chillindent(indent, fp);
- //for(int i=0; i<indent; i++) fprintf(fp, "..");
+ //for(int i=0; i<indent; i++) fprintf(fp, "..");
fprintf(fp, "// %s\n", metacomment);
}
- printControl(indent, fp); // does not do a newline or bracket
- fprintf(fp, " {\n");
+ printControl(indent, fp); // does not do a newline or bracket
+ fprintf(fp, " {\n");
- // I have no idea what made me do this next bit.
- // A forstmt with compounds inside compounds ???
- // this should probably all go away
+ // I have no idea what made me do this next bit.
+ // A forstmt with compounds inside compounds ???
+ // this should probably all go away
chillAST_node *b = body;
- //fprintf(fp, "b children %d\n", b->getNumChildren());
- //fprintf(fp, "body child 0 of type %s\n", b->children[0]->getTypeString());
- //fprintf(stderr, "forstmt body type %s\n", Chill_AST_Node_Names[b->asttype] );
+ //fprintf(fp, "b children %d\n", b->getNumChildren());
+ //fprintf(fp, "body child 0 of type %s\n", b->children[0]->getTypeString());
+ //fprintf(stderr, "forstmt body type %s\n", Chill_AST_Node_Names[b->asttype] );
// deal with a tree of compound statements, in an ugly way. leave the ugliness
- while (1 == b->getNumChildren() && b->children[0]->isCompoundStmt()) {
- b = b->children[0];
+ while (1 == b->getNumChildren() && b->children[0]->isCompoundStmt()) {
+ b = b->children[0];
}
// this was to sometimes not enclose in a bracket. stupid. always enclose in a bracket.
//if (1 == b->getNumChildren() && b->children[0]->isForStmt()) fprintf(fp, ") {\n" );
//else if (1 == b->getNumChildren() ) fprintf(fp, ") { ?? \n" ); // to allow for() for( ) to not have open bracket?
- //else {
- //fprintf(fp, ")\n");
- //chillindent(in, fp);
- //fprintf(fp, "{\n" );
+ //else {
+ //fprintf(fp, ")\n");
+ //chillindent(in, fp);
+ //fprintf(fp, "{\n" );
- //fprintf(fp, ")");
+ //fprintf(fp, ")");
//}
- b->print(indent+1, fp );
+ b->print(indent + 1, fp);
- // I think this can't happen any more. body is always a compound statement
- if (b->asttype == CHILLAST_NODETYPE_BINARYOPERATOR) { // a single assignment statement
- fprintf(fp, ";\n");
+ // I think this can't happen any more. body is always a compound statement
+ if (b->asttype == CHILLAST_NODETYPE_BINARYOPERATOR) { // a single assignment statement
+ fprintf(fp, ";\n");
}
- // always print brackets
+ // always print brackets
- //if ((1 == b->getNumChildren() && b->children[0]->isForStmt()) ||
+ //if ((1 == b->getNumChildren() && b->children[0]->isForStmt()) ||
// (1 != b->getNumChildren() )) {
chillindent(indent, fp);
- fprintf(fp, "}\n" );
+ fprintf(fp, "}\n");
//}
- printPreprocAFTER(indent, fp);
+ printPreprocAFTER(indent, fp);
fflush(fp); //
}
-void chillAST_ForStmt::dump( int indent, FILE *fp ) {
+void chillAST_ForStmt::dump(int indent, FILE *fp) {
chillindent(indent, fp);
fprintf(fp, "(ForStmt \n");
- init->dump(indent+1, fp);
- cond->dump(indent+1, fp);
- incr->dump(indent+1, fp);
- body->dump(indent+1, fp);
+ init->dump(indent + 1, fp);
+ cond->dump(indent + 1, fp);
+ incr->dump(indent + 1, fp);
+ body->dump(indent + 1, fp);
chillindent(indent, fp);
fprintf(fp, ")\n");
}
-
-chillAST_node *chillAST_ForStmt::constantFold() {
- init = init->constantFold();
- cond = cond->constantFold();
- incr = incr->constantFold();
- body = body->constantFold();
- return this;
- }
+
+chillAST_node *chillAST_ForStmt::constantFold() {
+ init = init->constantFold();
+ cond = cond->constantFold();
+ incr = incr->constantFold();
+ body = body->constantFold();
+ return this;
+}
- chillAST_node *chillAST_ForStmt::clone() {
- chillAST_ForStmt *fs = new chillAST_ForStmt( init->clone(), cond->clone(), incr->clone(), body->clone(), parent);
+chillAST_node *chillAST_ForStmt::clone() {
+ chillAST_ForStmt *fs = new chillAST_ForStmt(init->clone(), cond->clone(), incr->clone(), body->clone(), parent);
fs->isFromSourceFile = isFromSourceFile;
if (filename) fs->filename = strdup(filename);
return fs;
- }
+}
-void chillAST_ForStmt::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- //fprintf(stderr, "chillAST_ForStmt::gatherVarDecls()\n");
+void chillAST_ForStmt::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ //fprintf(stderr, "chillAST_ForStmt::gatherVarDecls()\n");
//fprintf(stderr, "chillAST_ForStmt::gatherVarDecls() before %d\n", decls.size());
- // TODO clear a loop_var_decls variable and then walk it ?
- init->gatherVarDecls( decls );
- cond->gatherVarDecls( decls );
- incr->gatherVarDecls( decls );
- body->gatherVarDecls( decls );
- //fprintf(stderr, "after %d\n", decls.size());
+ // TODO clear a loop_var_decls variable and then walk it ?
+ init->gatherVarDecls(decls);
+ cond->gatherVarDecls(decls);
+ incr->gatherVarDecls(decls);
+ body->gatherVarDecls(decls);
+ //fprintf(stderr, "after %d\n", decls.size());
}
-void chillAST_ForStmt::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
+void chillAST_ForStmt::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
//fprintf(stderr, "chillAST_ForStmt::gatherScalarVarDecls() before %d\n", decls.size());
- init->gatherScalarVarDecls( decls );
- cond->gatherScalarVarDecls( decls );
- incr->gatherScalarVarDecls( decls );
- body->gatherScalarVarDecls( decls );
+ init->gatherScalarVarDecls(decls);
+ cond->gatherScalarVarDecls(decls);
+ incr->gatherScalarVarDecls(decls);
+ body->gatherScalarVarDecls(decls);
}
-void chillAST_ForStmt::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
+void chillAST_ForStmt::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
//fprintf(stderr, "chillAST_ForStmt::gatherArrayVarDecls() before %d\n", decls.size());
- init->gatherArrayVarDecls( decls );
- cond->gatherArrayVarDecls( decls );
- incr->gatherArrayVarDecls( decls );
- body->gatherArrayVarDecls( decls );
+ init->gatherArrayVarDecls(decls);
+ cond->gatherArrayVarDecls(decls);
+ incr->gatherArrayVarDecls(decls);
+ body->gatherArrayVarDecls(decls);
}
-void chillAST_ForStmt::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool writtento ) {
- init->gatherArrayRefs( refs, 0 ); // 0 ??
- cond->gatherArrayRefs( refs, 0 ); // 0 ??
- incr->gatherArrayRefs( refs, 0 ); // 0 ??
- body->gatherArrayRefs( refs, 0 ); // 0 ??
+void chillAST_ForStmt::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool writtento) {
+ init->gatherArrayRefs(refs, 0); // 0 ??
+ cond->gatherArrayRefs(refs, 0); // 0 ??
+ incr->gatherArrayRefs(refs, 0); // 0 ??
+ body->gatherArrayRefs(refs, 0); // 0 ??
}
-void chillAST_ForStmt::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- init->gatherScalarRefs( refs, 0 ); // 0 ??
- cond->gatherScalarRefs( refs, 0 ); // 0 ??
- incr->gatherScalarRefs( refs, 0 ); // 0 ??
- body->gatherScalarRefs( refs, 0 ); // 0 ??
-}
-
-void chillAST_ForStmt::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- init->gatherDeclRefExprs( refs );
- cond->gatherDeclRefExprs( refs );
- incr->gatherDeclRefExprs( refs );
- body->gatherDeclRefExprs( refs );
+void chillAST_ForStmt::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ init->gatherScalarRefs(refs, 0); // 0 ??
+ cond->gatherScalarRefs(refs, 0); // 0 ??
+ incr->gatherScalarRefs(refs, 0); // 0 ??
+ body->gatherScalarRefs(refs, 0); // 0 ??
}
+void chillAST_ForStmt::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ init->gatherDeclRefExprs(refs);
+ cond->gatherDeclRefExprs(refs);
+ incr->gatherDeclRefExprs(refs);
+ body->gatherDeclRefExprs(refs);
+}
-void chillAST_ForStmt::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- init->gatherVarUsage( decls );
- cond->gatherVarUsage( decls );
- incr->gatherVarUsage( decls );
- body->gatherVarUsage( decls );
+void chillAST_ForStmt::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ init->gatherVarUsage(decls);
+ cond->gatherVarUsage(decls);
+ incr->gatherVarUsage(decls);
+ body->gatherVarUsage(decls);
}
-void chillAST_ForStmt::gatherStatements(std::vector<chillAST_node*> &statements ){
-
+void chillAST_ForStmt::gatherStatements(std::vector<chillAST_node *> &statements) {
+
// for completeness, should do all 4. Maybe someday
- //init->gatherStatements( statements );
- //cond->gatherStatements( statements );
- //incr->gatherStatements( statements );
- body->gatherStatements( statements );
+ //init->gatherStatements( statements );
+ //cond->gatherStatements( statements );
+ //incr->gatherStatements( statements );
+ body->gatherStatements(statements);
}
-
void chillAST_ForStmt::addSyncs() {
- //fprintf(stderr, "\nchillAST_ForStmt::addSyncs() ");
+ //fprintf(stderr, "\nchillAST_ForStmt::addSyncs() ");
//fprintf(stderr, "for (");
//init->print(0, stderr);
//fprintf(stderr, "; ");
//cond->print(0, stderr);
//fprintf(stderr, "; ");
//incr->print(0, stderr);
- //fprintf(stderr, ")\n");
-
- if (!parent) {
+ //fprintf(stderr, ")\n");
+
+ if (!parent) {
fprintf(stderr, "uhoh, chillAST_ForStmt::addSyncs() ForStmt has no parent!\n");
fprintf(stderr, "for (");
init->print(0, stderr);
@@ -1768,86 +1736,83 @@ void chillAST_ForStmt::addSyncs() {
cond->print(0, stderr);
fprintf(stderr, "; ");
incr->print(0, stderr);
- fprintf(stderr, ")\n");
+ fprintf(stderr, ")\n");
- return; // exit?
+ return; // exit?
}
- if (parent->isCompoundStmt()) {
+ if (parent->isCompoundStmt()) {
//fprintf(stderr, "ForStmt parent is CompoundStmt 0x%x\n", parent);
- vector<chillAST_node*> chillin = parent->getChildren();
+ vector<chillAST_node *> chillin = parent->getChildren();
int numc = chillin.size();
//fprintf(stderr, "ForStmt parent is CompoundStmt 0x%x with %d children\n", parent, numc);
- for (int i=0; i<numc; i++) {
- if (this == parent->getChild(i)) {
- //fprintf(stderr, "forstmt 0x%x is child %d of %d\n", this, i, numc);
+ for (int i = 0; i < numc; i++) {
+ if (this == parent->getChild(i)) {
+ //fprintf(stderr, "forstmt 0x%x is child %d of %d\n", this, i, numc);
chillAST_CudaSyncthreads *ST = new chillAST_CudaSyncthreads();
- parent->insertChild(i+1, ST); // corrupts something ...
- //fprintf(stderr, "Create a call to __syncthreads() 2\n");
- //parent->addChild(ST); // wrong, but safer still kills
+ parent->insertChild(i + 1, ST); // corrupts something ...
+ //fprintf(stderr, "Create a call to __syncthreads() 2\n");
+ //parent->addChild(ST); // wrong, but safer still kills
}
}
chillin = parent->getChildren();
int nowc = chillin.size();
- //fprintf(stderr, "old, new number of children = %d %d\n", numc, nowc);
-
- }
- else {
- fprintf(stderr, "chillAST_ForStmt::addSyncs() unhandled parent type %s\n", parent->getTypeString());
- exit(-1);
+ //fprintf(stderr, "old, new number of children = %d %d\n", numc, nowc);
+
+ } else {
+ fprintf(stderr, "chillAST_ForStmt::addSyncs() unhandled parent type %s\n", parent->getTypeString());
+ exit(-1);
}
- //fprintf(stderr, "leaving addSyncs()\n");
+ //fprintf(stderr, "leaving addSyncs()\n");
}
-
-
-void chillAST_ForStmt::removeSyncComment() {
- //fprintf(stderr, "chillAST_ForStmt::removeSyncComment()\n");
- if (metacomment && strstr(metacomment, "~cuda~") && strstr(metacomment, "preferredIdx: ")) {
- char *ptr = strlen( "preferredIdx: " ) + strstr(metacomment, "preferredIdx: ");
- *ptr = '\0';
+void chillAST_ForStmt::removeSyncComment() {
+ //fprintf(stderr, "chillAST_ForStmt::removeSyncComment()\n");
+ if (metacomment && strstr(metacomment, "~cuda~") && strstr(metacomment, "preferredIdx: ")) {
+ char *ptr = strlen("preferredIdx: ") + strstr(metacomment, "preferredIdx: ");
+ *ptr = '\0';
}
}
-bool chillAST_ForStmt::findLoopIndexesToReplace(chillAST_SymbolTable *symtab, bool forcesync ) {
- fprintf(stderr, "\nchillAST_ForStmt::findLoopIndexesToReplace( force = %d )\n", forcesync);
- //if (metacomment) fprintf(stderr, "metacomment '%s'\n", metacomment);
+bool chillAST_ForStmt::findLoopIndexesToReplace(chillAST_SymbolTable *symtab, bool forcesync) {
+ fprintf(stderr, "\nchillAST_ForStmt::findLoopIndexesToReplace( force = %d )\n", forcesync);
+ //if (metacomment) fprintf(stderr, "metacomment '%s'\n", metacomment);
bool force = forcesync;
bool didasync = false;
- if (forcesync) {
- //fprintf(stderr, "calling addSyncs() because PREVIOUS ForStmt in a block had preferredIdx\n");
+ if (forcesync) {
+ //fprintf(stderr, "calling addSyncs() because PREVIOUS ForStmt in a block had preferredIdx\n");
addSyncs();
- didasync = true;
- }
-
- //fprintf(stderr, "chillAST_ForStmt::findLoopIndexesToReplace()\n");
- if (metacomment && strstr(metacomment, "~cuda~") && strstr(metacomment, "preferredIdx: ")) {
- //fprintf(stderr, "metacomment '%s'\n", metacomment);
-
- char *copy = strdup(metacomment);
- char *ptr = strstr(copy, "preferredIdx: ");
- char *vname = ptr + strlen( "preferredIdx: " );
+ didasync = true;
+ }
+
+ //fprintf(stderr, "chillAST_ForStmt::findLoopIndexesToReplace()\n");
+ if (metacomment && strstr(metacomment, "~cuda~") && strstr(metacomment, "preferredIdx: ")) {
+ //fprintf(stderr, "metacomment '%s'\n", metacomment);
+
+ char *copy = strdup(metacomment);
+ char *ptr = strstr(copy, "preferredIdx: ");
+ char *vname = ptr + strlen("preferredIdx: ");
char *space = strstr(vname, " "); // TODO index()
- if (space) {
- //fprintf(stderr, "vname = '%s'\n", vname);
- force = true;
+ if (space) {
+ //fprintf(stderr, "vname = '%s'\n", vname);
+ force = true;
}
- if ((!didasync) && force ) {
- //fprintf(stderr, "calling addSyncs() because ForStmt metacomment had preferredIdx '%s'\n", vname);
+ if ((!didasync) && force) {
+ //fprintf(stderr, "calling addSyncs() because ForStmt metacomment had preferredIdx '%s'\n", vname);
addSyncs();
- removeSyncComment();
- didasync = true;
+ removeSyncComment();
+ didasync = true;
}
- if (space) *space = '\0'; // if this is multiple words, grab the first one
- //fprintf(stderr, "vname = '%s'\n", vname);
-
+ if (space) *space = '\0'; // if this is multiple words, grab the first one
+ //fprintf(stderr, "vname = '%s'\n", vname);
+
//fprintf(stderr, "\nfor (");
//init->print(0, stderr);
//fprintf(stderr, "; ");
@@ -1856,74 +1821,75 @@ bool chillAST_ForStmt::findLoopIndexesToReplace(chillAST_SymbolTable *symtab, bo
//incr->print(0, stderr);
//fprintf(stderr, ") %s\n", metacomment );
//fprintf(stderr, "prefer '%s'\n", vname );
-
- vector<chillAST_VarDecl*> decls;
- init->gatherVarLHSUsage( decls );
- //cond->gatherVarUsage( decls );
- //incr->gatherVarUsage( decls );
- //fprintf(stderr, "forstmt has %d vardecls in init, cond, inc\n", decls.size());
-
- if ( 1 != decls.size()) {
+
+ vector<chillAST_VarDecl *> decls;
+ init->gatherVarLHSUsage(decls);
+ //cond->gatherVarUsage( decls );
+ //incr->gatherVarUsage( decls );
+ //fprintf(stderr, "forstmt has %d vardecls in init, cond, inc\n", decls.size());
+
+ if (1 != decls.size()) {
fprintf(stderr, "uhoh, preferred index in for statement, but multiple variables used\n");
- print(0,stderr);
- fprintf(stderr, "\nvariables are:\n");
- for (int i=0; i<decls.size(); i++) {
- decls[i]->print(0,stderr); fprintf(stderr, "\n");
+ print(0, stderr);
+ fprintf(stderr, "\nvariables are:\n");
+ for (int i = 0; i < decls.size(); i++) {
+ decls[i]->print(0, stderr);
+ fprintf(stderr, "\n");
}
- exit(0);
+ exit(0);
}
- chillAST_VarDecl* olddecl = decls[0];
+ chillAST_VarDecl *olddecl = decls[0];
- // RIGHT NOW, change all the references that this loop wants swapped out
+ // RIGHT NOW, change all the references that this loop wants swapped out
// find vardecl for named preferred index. it has to already exist
- fprintf(stderr, "RIGHT NOW, change all the references that this loop wants swapped out \n");
+ fprintf(stderr, "RIGHT NOW, change all the references that this loop wants swapped out \n");
- chillAST_VarDecl *newguy = findVariableNamed( vname ); // recursive
- if (!newguy) {
+ chillAST_VarDecl *newguy = findVariableNamed(vname); // recursive
+ if (!newguy) {
fprintf(stderr, "there was no variable named %s anywhere I could find\n", vname);
}
- // wrong - this only looks at variables defined in the forstmt, not
+ // wrong - this only looks at variables defined in the forstmt, not
// in parents of the forstmt
- //int numsym = symtab->size();
+ //int numsym = symtab->size();
//fprintf(stderr, "%d symbols\n", numsym);
- //for (int i=0; i<numsym; i++) {
+ //for (int i=0; i<numsym; i++) {
// fprintf(stderr, "sym %d is '%s'\n", i, (*symtab)[i]->varname);
- // if (!strcmp(vname, (*symtab)[i]->varname)) {
+ // if (!strcmp(vname, (*symtab)[i]->varname)) {
// newguy = (*symtab)[i];
// }
//}
- if (!newguy) {
- fprintf(stderr, "chillAST_ForStmt::findLoopIndexesToReplace() there is no defined variable %s\n", vname);
+ if (!newguy) {
+ fprintf(stderr, "chillAST_ForStmt::findLoopIndexesToReplace() there is no defined variable %s\n", vname);
- // make one ?? seems like this should never happen
- newguy = new chillAST_VarDecl( olddecl->vartype, vname, ""/*?*/, NULL );
+ // make one ?? seems like this should never happen
+ newguy = new chillAST_VarDecl(olddecl->vartype, vname, ""/*?*/, NULL);
// insert actual declaration in code location? how?
// find parent of the ForStmt?
// find parent^n of the ForStmt that is not a Forstmt?
// find parent^n of the Forstmt that is a FunctionDecl?
chillAST_node *contain = findContainingNonLoop();
- if (contain == NULL) {
+ if (contain == NULL) {
fprintf(stderr, "nothing but loops all the way up?\n");
exit(0);
}
- fprintf(stderr, "containing non-loop is a %s\n", contain->getTypeString());
-
- contain->print(0,stderr);
- contain->insertChild( 0, newguy ); // ugly order TODO
- contain->addVariableToSymbolTable( newguy ); // adds to first enclosing symbolTable
-
- if (! symbolTableHasVariableNamed( contain->getSymbolTable(), vname )) {
- fprintf(stderr, "container doesn't have a var names %s afterwards???\n", vname);
- exit(-1);
+ fprintf(stderr, "containing non-loop is a %s\n", contain->getTypeString());
+
+ contain->print(0, stderr);
+ contain->insertChild(0, newguy); // ugly order TODO
+ contain->addVariableToSymbolTable(newguy); // adds to first enclosing symbolTable
+
+ if (!symbolTableHasVariableNamed(contain->getSymbolTable(), vname)) {
+ fprintf(stderr, "container doesn't have a var names %s afterwards???\n", vname);
+ exit(-1);
}
}
- // swap out old for new in init, cond, incr, body
- if (newguy) {
- fprintf(stderr, "\nwill replace %s with %s in init, cond, incr\n", olddecl->varname, newguy->varname);
+ // swap out old for new in init, cond, incr, body
+ if (newguy) {
+ fprintf(stderr, "\nwill replace %s with %s in init, cond, incr\n", olddecl->varname, newguy->varname);
fprintf(stderr, "was: for (");
init->print(0, stderr);
fprintf(stderr, "; ");
@@ -1931,11 +1897,11 @@ bool chillAST_ForStmt::findLoopIndexesToReplace(chillAST_SymbolTable *symtab, bo
fprintf(stderr, "; ");
incr->print(0, stderr);
fprintf(stderr, ")\n");
-
-
- init->replaceVarDecls( olddecl, newguy );
- cond->replaceVarDecls( olddecl, newguy );
- incr->replaceVarDecls( olddecl, newguy );
+
+
+ init->replaceVarDecls(olddecl, newguy);
+ cond->replaceVarDecls(olddecl, newguy);
+ incr->replaceVarDecls(olddecl, newguy);
fprintf(stderr, " is: for (");
init->print(0, stderr);
@@ -1945,74 +1911,74 @@ bool chillAST_ForStmt::findLoopIndexesToReplace(chillAST_SymbolTable *symtab, bo
incr->print(0, stderr);
fprintf(stderr, ")\n\n");
- fprintf(stderr,"recursing to ForStmt body of type %s\n", body->getTypeString());
- body->replaceVarDecls( olddecl, newguy );
+ fprintf(stderr, "recursing to ForStmt body of type %s\n", body->getTypeString());
+ body->replaceVarDecls(olddecl, newguy);
fprintf(stderr, "\nafter recursing to body, this loop is (there should be no %s)\n", olddecl->varname);
- print(0, stderr); fprintf(stderr, "\n");
-
+ print(0, stderr);
+ fprintf(stderr, "\n");
+
}
-
+
//if (!space) // there was only one preferred
- //fprintf(stderr, "removing metacomment\n");
+ //fprintf(stderr, "removing metacomment\n");
metacomment = NULL; // memleak
}
// check for more loops. We may have already swapped variables out in body (right above here)
- body->findLoopIndexesToReplace( symtab, false ) ;
+ body->findLoopIndexesToReplace(symtab, false);
- return force;
+ return force;
}
-void chillAST_ForStmt::replaceChild( chillAST_node *old, chillAST_node *newchild ){
- //fprintf(stderr, "chillAST_ForStmt::replaceChild() REALLY CALLING BODY->ReplaceCHILD\n");
- body->replaceChild( old, newchild );
+void chillAST_ForStmt::replaceChild(chillAST_node *old, chillAST_node *newchild) {
+ //fprintf(stderr, "chillAST_ForStmt::replaceChild() REALLY CALLING BODY->ReplaceCHILD\n");
+ body->replaceChild(old, newchild);
}
-
-void chillAST_ForStmt::replaceVarDecls( chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl){
- // logic problem if my loop var is olddecl!
+void chillAST_ForStmt::replaceVarDecls(chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
+ // logic problem if my loop var is olddecl!
//fprintf(stderr, "chillAST_ForStmt::replaceVarDecls( old %s, new %s )\n", olddecl->varname, newdecl->varname);
// this is called for inner loops!
- init->replaceVarDecls( olddecl, newdecl );
- cond->replaceVarDecls( olddecl, newdecl );
- incr->replaceVarDecls( olddecl, newdecl );
- body->replaceVarDecls( olddecl, newdecl );
+ init->replaceVarDecls(olddecl, newdecl);
+ cond->replaceVarDecls(olddecl, newdecl);
+ incr->replaceVarDecls(olddecl, newdecl);
+ body->replaceVarDecls(olddecl, newdecl);
}
-void chillAST_ForStmt::gatherLoopIndeces( std::vector<chillAST_VarDecl*> &indeces ) {
- //fprintf(stderr, "chillAST_ForStmt::gatherLoopIndeces()\nloop is:\n"); print(0,stderr);
+void chillAST_ForStmt::gatherLoopIndeces(std::vector<chillAST_VarDecl *> &indeces) {
+ //fprintf(stderr, "chillAST_ForStmt::gatherLoopIndeces()\nloop is:\n"); print(0,stderr);
- vector<chillAST_VarDecl*> decls;
- init->gatherVarLHSUsage( decls );
- cond->gatherVarLHSUsage( decls );
- incr->gatherVarLHSUsage( decls );
+ vector<chillAST_VarDecl *> decls;
+ init->gatherVarLHSUsage(decls);
+ cond->gatherVarLHSUsage(decls);
+ incr->gatherVarLHSUsage(decls);
// note: NOT GOING INTO BODY OF THE LOOP
- int numdecls = decls.size();
+ int numdecls = decls.size();
//fprintf(stderr, "gatherLoopIndeces(), %d lhs vardecls for this ForStmt\n", numdecls);
- for (int i=0; i<decls.size(); i++) {
+ for (int i = 0; i < decls.size(); i++) {
//fprintf(stderr, "%s %p\n", decls[i]->varname, decls[i] );
- indeces.push_back( decls[i] );
+ indeces.push_back(decls[i]);
}
-
+
// Don't forget to keep heading upwards!
if (parent) {
- //fprintf(stderr, "loop %p has parent of type %s\n", this, parent->getTypeString());
- parent->gatherLoopIndeces( indeces );
+ //fprintf(stderr, "loop %p has parent of type %s\n", this, parent->getTypeString());
+ parent->gatherLoopIndeces(indeces);
}
//else fprintf(stderr, "this loop has no parent???\n");
}
-void chillAST_ForStmt::gatherLoopVars( std::vector<std::string> &loopvars ) {
+void chillAST_ForStmt::gatherLoopVars(std::vector<std::string> &loopvars) {
//fprintf(stderr, "gathering loop vars for loop for (");
//init->print(0, stderr);
//fprintf(stderr, "; ");
@@ -2021,29 +1987,29 @@ void chillAST_ForStmt::gatherLoopVars( std::vector<std::string> &loopvars ) {
//incr->print(0, stderr);
//fprintf(stderr, ")\n" );
- //init->dump(0, stderr);
+ //init->dump(0, stderr);
- vector<chillAST_VarDecl*> decls;
- init->gatherVarLHSUsage( decls );
- cond->gatherVarLHSUsage( decls );
- incr->gatherVarLHSUsage( decls );
+ vector<chillAST_VarDecl *> decls;
+ init->gatherVarLHSUsage(decls);
+ cond->gatherVarLHSUsage(decls);
+ incr->gatherVarLHSUsage(decls);
// note: NOT GOING INTO BODY OF THE LOOP
-
- for (int i=0; i<decls.size(); i++) loopvars.push_back( strdup( decls[i]->varname ));
+
+ for (int i = 0; i < decls.size(); i++) loopvars.push_back(strdup(decls[i]->varname));
}
-void chillAST_ForStmt::loseLoopWithLoopVar( char *var ) {
+void chillAST_ForStmt::loseLoopWithLoopVar(char *var) {
- //fprintf(stderr, "\nchillAST_ForStmt::loseLoopWithLoopVar( %s )\n", var );
+ //fprintf(stderr, "\nchillAST_ForStmt::loseLoopWithLoopVar( %s )\n", var );
- // now recurse (could do first, I suppose)
+ // now recurse (could do first, I suppose)
// if you DON'T do this first, you may have already replaced yourself with this loop body
// the body will no longer have this forstmt as parent, it will have the forstmt's parent as its parent
- //fprintf(stderr, "forstmt 0x%x, recursing loseLoop to body 0x%x of type %s with parent 0x%x of type %s\n", this, body, body->getTypeString(), body->parent, body->parent->getTypeString());
- body->loseLoopWithLoopVar( var ) ;
+ //fprintf(stderr, "forstmt 0x%x, recursing loseLoop to body 0x%x of type %s with parent 0x%x of type %s\n", this, body, body->getTypeString(), body->parent, body->parent->getTypeString());
+ body->loseLoopWithLoopVar(var);
@@ -2051,306 +2017,309 @@ void chillAST_ForStmt::loseLoopWithLoopVar( char *var ) {
// if *I* am a loop to be replaced, tell my parent to replace me with my loop body
std::vector<std::string> loopvars;
- gatherLoopVars( loopvars );
-
- if (loopvars.size() != 1) {
+ gatherLoopVars(loopvars);
+
+ if (loopvars.size() != 1) {
fprintf(stderr, "uhoh, loop has more than a single loop var and trying to loseLoopWithLoopVar()\n");
- print(0,stderr);
- fprintf(stderr, "\nvariables are:\n");
- for (int i=0; i<loopvars.size(); i++) {
- fprintf(stderr, "%s\n", loopvars[i].c_str());
+ print(0, stderr);
+ fprintf(stderr, "\nvariables are:\n");
+ for (int i = 0; i < loopvars.size(); i++) {
+ fprintf(stderr, "%s\n", loopvars[i].c_str());
}
-
- exit(-1);
+
+ exit(-1);
}
-
+
//fprintf(stderr, "my loop var %s, looking for %s\n", loopvars[0].c_str(), var );
- if (!strcmp(var, loopvars[0].c_str())) {
+ if (!strcmp(var, loopvars[0].c_str())) {
//fprintf(stderr, "OK, trying to lose myself! for (");
//init->print(0, stderr);
//fprintf(stderr, "; ");
//cond->print(0, stderr);
//fprintf(stderr, "; ");
//incr->print(0, stderr);
- //fprintf(stderr, ")\n" );
+ //fprintf(stderr, ")\n" );
- if (!parent) {
+ if (!parent) {
fprintf(stderr, "chillAST_ForStmt::loseLoopWithLoopVar() I have no parent!\n");
exit(-1);
}
- vector<chillAST_VarDecl*> decls;
- init->gatherVarLHSUsage( decls ); // this can fail if init is outside the loop
- cond->gatherVarLHSUsage( decls );
- incr->gatherVarLHSUsage( decls );
- if (decls.size() > 1) {
+ vector<chillAST_VarDecl *> decls;
+ init->gatherVarLHSUsage(decls); // this can fail if init is outside the loop
+ cond->gatherVarLHSUsage(decls);
+ incr->gatherVarLHSUsage(decls);
+ if (decls.size() > 1) {
fprintf(stderr, "chill_ast.cc multiple loop variables confuses me\n");
- exit(-1);
+ exit(-1);
}
- chillAST_node *newstmt = body;
+ chillAST_node *newstmt = body;
// ACTUALLY, if I am being replaced, and my loop conditional is a min (Ternary), then wrap my loop body in an if statement
if (cond->isBinaryOperator()) { // what else could it be?
chillAST_BinaryOperator *BO = (chillAST_BinaryOperator *) cond;
- if (BO->rhs->isTernaryOperator()) {
+ if (BO->rhs->isTernaryOperator()) {
+
+ chillAST_TernaryOperator *TO = (chillAST_TernaryOperator *) BO->rhs;
+ chillAST_BinaryOperator *C = (chillAST_BinaryOperator *) TO->condition;
- chillAST_TernaryOperator *TO = (chillAST_TernaryOperator *)BO->rhs;
- chillAST_BinaryOperator *C = (chillAST_BinaryOperator *)TO->condition;
-
//fprintf(stderr, "loop condition RHS is ternary\nCondition RHS");
- C->print(); printf("\n"); fflush(stdout);
+ C->print();
+ printf("\n");
+ fflush(stdout);
chillAST_node *l = C->lhs;
- if (l->isParenExpr()) l = ((chillAST_ParenExpr *)l)->subexpr;
+ if (l->isParenExpr()) l = ((chillAST_ParenExpr *) l)->subexpr;
chillAST_node *r = C->rhs;
- if (r->isParenExpr()) r = ((chillAST_ParenExpr *)r)->subexpr;
+ if (r->isParenExpr()) r = ((chillAST_ParenExpr *) r)->subexpr;
- //fprintf(stderr, "lhs is %s rhs is %s\n", l->getTypeString(), r->getTypeString());
-
- chillAST_node *ifcondrhs = NULL;
+ //fprintf(stderr, "lhs is %s rhs is %s\n", l->getTypeString(), r->getTypeString());
+
+ chillAST_node *ifcondrhs = NULL;
if (!(l->isConstant())) ifcondrhs = l;
else if (!(r->isConstant())) ifcondrhs = r;
- else {
+ else {
// should never happen. 2 constants. infinite loop
- fprintf(stderr, "chill_ast.cc INIFNITE LOOP?\n");
- this->print(0,stderr); fprintf(stderr, "\n\n");
+ fprintf(stderr, "chill_ast.cc INIFNITE LOOP?\n");
+ this->print(0, stderr);
+ fprintf(stderr, "\n\n");
exit(-1);
}
-
+
// wrap the loop body in an if
- chillAST_DeclRefExpr *DRE = new chillAST_DeclRefExpr( decls[0] );
- chillAST_BinaryOperator *ifcond = new chillAST_BinaryOperator( DRE, "<=", ifcondrhs );
- chillAST_IfStmt *ifstmt = new chillAST_IfStmt( ifcond, body, NULL, NULL );
-
- newstmt = ifstmt;
+ chillAST_DeclRefExpr *DRE = new chillAST_DeclRefExpr(decls[0]);
+ chillAST_BinaryOperator *ifcond = new chillAST_BinaryOperator(DRE, "<=", ifcondrhs);
+ chillAST_IfStmt *ifstmt = new chillAST_IfStmt(ifcond, body, NULL, NULL);
+
+ newstmt = ifstmt;
}
}
- //fprintf(stderr, "forstmt 0x%x has parent 0x%x of type %s\n", this, parent, parent->getTypeString());
+ //fprintf(stderr, "forstmt 0x%x has parent 0x%x of type %s\n", this, parent, parent->getTypeString());
//fprintf(stderr, "forstmt will be replaced by\n");
- //newstmt->print(0,stderr); fprintf(stderr, "\n\n");
+ //newstmt->print(0,stderr); fprintf(stderr, "\n\n");
- parent->replaceChild( this, newstmt );
+ parent->replaceChild(this, newstmt);
}
}
-
-
-
chillAST_BinaryOperator::chillAST_BinaryOperator() {
//fprintf(stderr, "chillAST_BinaryOperator::chillAST_BinaryOperator() %p no parent\n", this);
CHILL_DEBUG_PRINT("no parent\n");
lhs = rhs = NULL;
op = NULL;
- asttype = CHILLAST_NODETYPE_BINARYOPERATOR;
- isFromSourceFile = true; // default
+ asttype = CHILLAST_NODETYPE_BINARYOPERATOR;
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_BinaryOperator::chillAST_BinaryOperator(chillAST_node *l, const char *oper, chillAST_node *r, chillAST_node *par) {
- //fprintf(stderr, "chillAST_BinaryOperator::chillAST_BinaryOperator( l %p %s r %p, parent %p) this %p\n", l, oper, r, par, this);
+chillAST_BinaryOperator::chillAST_BinaryOperator(chillAST_node *l, const char *oper, chillAST_node *r,
+ chillAST_node *par) {
+ //fprintf(stderr, "chillAST_BinaryOperator::chillAST_BinaryOperator( l %p %s r %p, parent %p) this %p\n", l, oper, r, par, this);
CHILL_DEBUG_PRINT("( l %s r )\n", oper);
- //if (l && r ) {
- // fprintf(stderr, "("); l->print(0,stderr); fprintf(stderr, ") %s (", oper); r->print(0,stderr); fprintf(stderr, ")\n\n");
- //}
+ //if (l && r ) {
+ // fprintf(stderr, "("); l->print(0,stderr); fprintf(stderr, ") %s (", oper); r->print(0,stderr); fprintf(stderr, ")\n\n");
+ //}
lhs = l;
rhs = r;
parent = par;
-
- if (lhs) lhs->setParent( this );
- if (rhs) rhs->setParent( this ); // may only have part of the lhs and rhs when binop is created
+
+ if (lhs) lhs->setParent(this);
+ if (rhs) rhs->setParent(this); // may only have part of the lhs and rhs when binop is created
op = strdup(oper);
- asttype = CHILLAST_NODETYPE_BINARYOPERATOR;
+ asttype = CHILLAST_NODETYPE_BINARYOPERATOR;
// if this writes to lhs and lhs type has an 'imwrittento' concept, set that up
- if (isAssignmentOp()) {
+ if (isAssignmentOp()) {
if (lhs && lhs->isArraySubscriptExpr()) {
- ((chillAST_ArraySubscriptExpr*)lhs)->imwrittento = true;
- //fprintf(stderr, "chillAST_BinaryOperator, op '=', lhs is an array reference LVALUE\n");
+ ((chillAST_ArraySubscriptExpr *) lhs)->imwrittento = true;
+ //fprintf(stderr, "chillAST_BinaryOperator, op '=', lhs is an array reference LVALUE\n");
}
}
- if (isAugmentedAssignmentOp()) { // += etc
- //fprintf(stderr, "isAugmentedAssignmentOp() "); print(); fflush(stdout);
- if (lhs && lhs->isArraySubscriptExpr()) {
- //fprintf(stderr, "lhs is also read from "); lhs->print(); fflush(stdout);
- ((chillAST_ArraySubscriptExpr*)lhs)->imreadfrom = true; // note will ALSO have imwrittento true
+ if (isAugmentedAssignmentOp()) { // += etc
+ //fprintf(stderr, "isAugmentedAssignmentOp() "); print(); fflush(stdout);
+ if (lhs && lhs->isArraySubscriptExpr()) {
+ //fprintf(stderr, "lhs is also read from "); lhs->print(); fflush(stdout);
+ ((chillAST_ArraySubscriptExpr *) lhs)->imreadfrom = true; // note will ALSO have imwrittento true
}
}
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
}
-int chillAST_BinaryOperator::evalAsInt() {
+int chillAST_BinaryOperator::evalAsInt() {
// very limited. allow +-*/ and integer literals ...
- if (isAssignmentOp()) return rhs->evalAsInt(); // ?? ignores/loses lhs info
+ if (isAssignmentOp()) return rhs->evalAsInt(); // ?? ignores/loses lhs info
- if (!strcmp("+", op)) {
- //fprintf(stderr, "chillAST_BinaryOperator::evalAsInt() %d + %d\n", lhs->evalAsInt(), rhs->evalAsInt());
- return lhs->evalAsInt() + rhs->evalAsInt();
+ if (!strcmp("+", op)) {
+ //fprintf(stderr, "chillAST_BinaryOperator::evalAsInt() %d + %d\n", lhs->evalAsInt(), rhs->evalAsInt());
+ return lhs->evalAsInt() + rhs->evalAsInt();
}
- if (!strcmp("-", op)) return lhs->evalAsInt() - rhs->evalAsInt();
- if (!strcmp("*", op)) return lhs->evalAsInt() * rhs->evalAsInt();
- if (!strcmp("/", op)) return lhs->evalAsInt() / rhs->evalAsInt();
-
- fprintf(stderr, "chillAST_BinaryOperator::evalAsInt() unhandled op '%s'\n", op);
- segfault();
+ if (!strcmp("-", op)) return lhs->evalAsInt() - rhs->evalAsInt();
+ if (!strcmp("*", op)) return lhs->evalAsInt() * rhs->evalAsInt();
+ if (!strcmp("/", op)) return lhs->evalAsInt() / rhs->evalAsInt();
+
+ fprintf(stderr, "chillAST_BinaryOperator::evalAsInt() unhandled op '%s'\n", op);
+ exit(-1);
}
-chillAST_IntegerLiteral *chillAST_BinaryOperator::evalAsIntegerLiteral() {
- return new chillAST_IntegerLiteral( evalAsInt() ); // ??
+chillAST_IntegerLiteral *chillAST_BinaryOperator::evalAsIntegerLiteral() {
+ return new chillAST_IntegerLiteral(evalAsInt()); // ??
}
-void chillAST_BinaryOperator::dump( int indent, FILE *fp ) {
- chillindent(indent, fp);
+void chillAST_BinaryOperator::dump(int indent, FILE *fp) {
+ chillindent(indent, fp);
fprintf(fp, "(BinaryOperator '%s'\n", op);
- if (lhs) lhs->dump(indent+1, fp); // lhs could be null
- else { chillindent(indent+1, fp); fprintf(fp, "(NULL)\n"); }
- fflush(fp);
+ if (lhs) lhs->dump(indent + 1, fp); // lhs could be null
+ else {
+ chillindent(indent + 1, fp);
+ fprintf(fp, "(NULL)\n");
+ }
+ fflush(fp);
- if (rhs) rhs->dump(indent+1, fp); // rhs could be null
- else { chillindent(indent+1, fp); fprintf(fp, "(NULL)\n"); }
- fflush(fp);
+ if (rhs) rhs->dump(indent + 1, fp); // rhs could be null
+ else {
+ chillindent(indent + 1, fp);
+ fprintf(fp, "(NULL)\n");
+ }
+ fflush(fp);
- chillindent(indent, fp);
+ chillindent(indent, fp);
fprintf(fp, ")\n");
- fflush(fp);
+ fflush(fp);
}
-void chillAST_BinaryOperator::print( int indent, FILE *fp ) { // TODO this needparens logic is wrong
- printPreprocBEFORE(indent, fp);
+void chillAST_BinaryOperator::print(int indent, FILE *fp) { // TODO this needparens logic is wrong
+ printPreprocBEFORE(indent, fp);
- chillindent( indent, fp );
+ chillindent(indent, fp);
bool needparens = false;
- if (lhs) {
- if (lhs->isImplicitCastExpr()) {
+ if (lhs) {
+ if (lhs->isImplicitCastExpr()) {
// fprintf(stderr, "\nlhs 0x%x isImplicitCastExpr()\n", lhs);
// fprintf(stderr, "lhs subexpr 0x%x\n", ((chillAST_ImplicitCastExpr*)lhs)->subexpr);
// fprintf(stderr, "lhs subexpr type %s\n", ((chillAST_ImplicitCastExpr*)lhs)->subexpr->getTypeString());
- //
- if (((chillAST_ImplicitCastExpr*)lhs)->subexpr->isNotLeaf()) needparens = true;
- }
- else if (lhs->isNotLeaf()) {
- if (isMinusOp() && lhs->isPlusOp()) needparens = false;
- else if (isPlusMinusOp() && lhs->isMultDivOp()) needparens = false;
+ //
+ if (((chillAST_ImplicitCastExpr *) lhs)->subexpr->isNotLeaf()) needparens = true;
+ } else if (lhs->isNotLeaf()) {
+ if (isMinusOp() && lhs->isPlusOp()) needparens = false;
+ else if (isPlusMinusOp() && lhs->isMultDivOp()) needparens = false;
else needparens = true;
}
}
- //fprintf(stderr, "\n\nbinop ");
- //lhs->printonly(0,stderr);
- //fprintf(stderr," %s ",op);
- //rhs->printonly(0,stderr);
- //fprintf(stderr,"\n");
+ //fprintf(stderr, "\n\nbinop ");
+ //lhs->printonly(0,stderr);
+ //fprintf(stderr," %s ",op);
+ //rhs->printonly(0,stderr);
+ //fprintf(stderr,"\n");
//fprintf(stderr, "op is %s lhs %s rhs %s\n", op, lhs->getTypeString(), rhs->getTypeString());
- //fprintf(stderr, "lhs "); lhs->printonly(0, stderr); fprintf(stderr, " ");
- //fprintf(stderr, "lhs needparens = %d\n", needparens);
+ //fprintf(stderr, "lhs "); lhs->printonly(0, stderr); fprintf(stderr, " ");
+ //fprintf(stderr, "lhs needparens = %d\n", needparens);
if (needparens) fprintf(fp, "(");
- if (lhs) lhs->print( 0, fp );
- else fprintf(fp, "(NULL)");
- if (needparens) fprintf(fp, ")");
+ if (lhs) lhs->print(0, fp);
+ else fprintf(fp, "(NULL)");
+ if (needparens) fprintf(fp, ")");
- fprintf( fp, " %s ", op);
+ fprintf(fp, " %s ", op);
needparens = false;
- //fprintf(stderr, "binop rhs is of type %s\n", rhs->getTypeString());
- if (rhs) {
- if (rhs->isImplicitCastExpr()) {
- if (((chillAST_ImplicitCastExpr*)rhs)->subexpr->isNotLeaf()) needparens = true;
- }
- //else if (rhs->isNotLeaf()) needparens = true; // too many parens. test too simple
- else if (rhs->isNotLeaf()) {
+ //fprintf(stderr, "binop rhs is of type %s\n", rhs->getTypeString());
+ if (rhs) {
+ if (rhs->isImplicitCastExpr()) {
+ if (((chillAST_ImplicitCastExpr *) rhs)->subexpr->isNotLeaf()) needparens = true;
+ }
+ //else if (rhs->isNotLeaf()) needparens = true; // too many parens. test too simple
+ else if (rhs->isNotLeaf()) {
// really need the precedence ordering, and check relative of op and rhs op
- if (isMinusOp() ) needparens = true; // safer. perhaps complicated thing on rhs of a minus
- else if (isPlusMinusOp() && rhs->isMultDivOp()) needparens = false;
+ if (isMinusOp()) needparens = true; // safer. perhaps complicated thing on rhs of a minus
+ else if (isPlusMinusOp() && rhs->isMultDivOp()) needparens = false;
else needparens = true;
}
}
- //fprintf(stderr, "rhs "); rhs->printonly(0, stderr); fprintf(stderr, " ");
- //fprintf(stderr, "rhs needparens = %d\n\n", needparens);
- //if (!needparens) fprintf(stderr, "rhs isNotLeaf() = %d\n", rhs->isNotLeaf());
+ //fprintf(stderr, "rhs "); rhs->printonly(0, stderr); fprintf(stderr, " ");
+ //fprintf(stderr, "rhs needparens = %d\n\n", needparens);
+ //if (!needparens) fprintf(stderr, "rhs isNotLeaf() = %d\n", rhs->isNotLeaf());
if (needparens) fprintf(fp, "(");
- if (rhs) rhs->print( 0, fp );
- else fprintf(fp, "(NULL)");
- if (needparens) fprintf(fp, ")");
- fflush(fp);
- printPreprocAFTER(indent, fp);
+ if (rhs) rhs->print(0, fp);
+ else fprintf(fp, "(NULL)");
+ if (needparens) fprintf(fp, ")");
+ fflush(fp);
+ printPreprocAFTER(indent, fp);
}
-char *chillAST_BinaryOperator::stringRep(int indent ) {
- std::string s = string( lhs->stringRep() ) + " " + op + " " + string(lhs->stringRep() );
- return strdup( s.c_str() );
+char *chillAST_BinaryOperator::stringRep(int indent) {
+ std::string s = string(lhs->stringRep()) + " " + op + " " + string(lhs->stringRep());
+ return strdup(s.c_str());
}
+void chillAST_BinaryOperator::printonly(int indent, FILE *fp) {
-void chillAST_BinaryOperator::printonly( int indent, FILE *fp ) {
-
- lhs->printonly( indent, fp );
- fprintf( fp, " %s ", op);
- rhs->printonly( 0, fp );
- fflush(fp);
-
+ lhs->printonly(indent, fp);
+ fprintf(fp, " %s ", op);
+ rhs->printonly(0, fp);
+ fflush(fp);
}
-class chillAST_node* chillAST_BinaryOperator::constantFold() {
+class chillAST_node *chillAST_BinaryOperator::constantFold() {
//fprintf(stderr, "\nchillAST_BinaryOperator::constantFold() ");
//print(0,stderr); fprintf(stderr, "\n");
lhs = lhs->constantFold();
rhs = rhs->constantFold();
-
+
chillAST_node *returnval = this;
- if (lhs->isConstant() && rhs->isConstant() ) {
+ if (lhs->isConstant() && rhs->isConstant()) {
//fprintf(stderr, "binop folding constants\n"); print(0,stderr); fprintf(stderr, "\n");
- if (streq(op, "+") || streq(op, "-") || streq(op, "*")) {
+ if (streq(op, "+") || streq(op, "-") || streq(op, "*")) {
if (lhs->isIntegerLiteral() && rhs->isIntegerLiteral()) {
- chillAST_IntegerLiteral *l = (chillAST_IntegerLiteral *)lhs;
- chillAST_IntegerLiteral *r = (chillAST_IntegerLiteral *)rhs;
+ chillAST_IntegerLiteral *l = (chillAST_IntegerLiteral *) lhs;
+ chillAST_IntegerLiteral *r = (chillAST_IntegerLiteral *) rhs;
chillAST_IntegerLiteral *I;
-
- if (streq(op, "+")) I = new chillAST_IntegerLiteral(l->value+r->value, parent);
- if (streq(op, "-")) I = new chillAST_IntegerLiteral(l->value-r->value, parent);
- if (streq(op, "*")) I = new chillAST_IntegerLiteral(l->value*r->value, parent);
+
+ if (streq(op, "+")) I = new chillAST_IntegerLiteral(l->value + r->value, parent);
+ if (streq(op, "-")) I = new chillAST_IntegerLiteral(l->value - r->value, parent);
+ if (streq(op, "*")) I = new chillAST_IntegerLiteral(l->value * r->value, parent);
returnval = I;
//fprintf(stderr, "%d %s %d becomes %d\n", l->value,op, r->value, I->value);
- }
- else { // at least one is a float
+ } else { // at least one is a float
// usually don't want to do this for floats or doubles
- // could probably check for special cases like 0.0/30.0 or X/X or X/1.0
+ // could probably check for special cases like 0.0/30.0 or X/X or X/1.0
#ifdef FOLDFLOATS
- float lval, rval;
- if (lhs->isIntegerLiteral()) {
- lval = (float) ((chillAST_IntegerLiteral *)lhs)->value;
+ float lval, rval;
+ if (lhs->isIntegerLiteral()) {
+ lval = (float) ((chillAST_IntegerLiteral *)lhs)->value;
}
- else {
- lval = ((chillAST_FloatingLiteral *)lhs)->value;
+ else {
+ lval = ((chillAST_FloatingLiteral *)lhs)->value;
}
- if (rhs->isIntegerLiteral()) {
- rval = (float) ((chillAST_IntegerLiteral *)rhs)->value;
+ if (rhs->isIntegerLiteral()) {
+ rval = (float) ((chillAST_IntegerLiteral *)rhs)->value;
}
- else {
- rval = ((chillAST_FloatingLiteral *)rhs)->value;
+ else {
+ rval = ((chillAST_FloatingLiteral *)rhs)->value;
}
chillAST_FloatingLiteral *F;
@@ -2363,301 +2332,297 @@ class chillAST_node* chillAST_BinaryOperator::constantFold() {
}
}
- //else fprintf(stderr, "can't fold op '%s' yet\n", op);
+ //else fprintf(stderr, "can't fold op '%s' yet\n", op);
}
- //fprintf(stderr, "returning "); returnval->print(0,stderr); fprintf(stderr, "\n");
+ //fprintf(stderr, "returning "); returnval->print(0,stderr); fprintf(stderr, "\n");
return returnval;
}
-class chillAST_node* chillAST_BinaryOperator::clone() {
- //fprintf(stderr, "chillAST_BinaryOperator::clone() "); print(); printf("\n"); fflush(stdout);
+class chillAST_node *chillAST_BinaryOperator::clone() {
+ //fprintf(stderr, "chillAST_BinaryOperator::clone() "); print(); printf("\n"); fflush(stdout);
- chillAST_node* l = lhs->clone();
- chillAST_node* r = rhs->clone();
- chillAST_BinaryOperator *bo = new chillAST_BinaryOperator( l, op, r, parent );
- l->setParent( bo );
- r->setParent( bo );
+ chillAST_node *l = lhs->clone();
+ chillAST_node *r = rhs->clone();
+ chillAST_BinaryOperator *bo = new chillAST_BinaryOperator(l, op, r, parent);
+ l->setParent(bo);
+ r->setParent(bo);
bo->isFromSourceFile = isFromSourceFile;
- if (filename) bo->filename = strdup(filename);
+ if (filename) bo->filename = strdup(filename);
return bo;
}
-void chillAST_BinaryOperator::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool w ) {
- //fprintf(stderr, "chillAST_BinaryOperator::gatherArrayRefs()\n");
- //print(); fflush(stdout); fprintf(stderr, "\n");
- //if (isAugmentedAssignmentOp()) {
+void chillAST_BinaryOperator::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool w) {
+ //fprintf(stderr, "chillAST_BinaryOperator::gatherArrayRefs()\n");
+ //print(); fflush(stdout); fprintf(stderr, "\n");
+ //if (isAugmentedAssignmentOp()) {
// fprintf(stderr, "%s is augmented assignment\n", op);
//}
- //if (isAssignmentOp()) {
+ //if (isAssignmentOp()) {
// fprintf(stderr, "%s is assignment\n", op);
//}
//if (isAugmentedAssignmentOp()) { // lhs is ALSO on the RHS, NOT as a write
// if (lhs->isArraySubscriptExpr()) { // probably some case where this fails
- // ((chillAST_ArraySubscriptExpr *) lhs)->imreadfrom = true;
+ // ((chillAST_ArraySubscriptExpr *) lhs)->imreadfrom = true;
// //lhs->&gatherArrayRefs( refs, 0 );
// }
- //}
+ //}
- //fprintf(stderr, "in chillAST_BinaryOperator::gatherArrayRefs(), %d &arrayrefs before\n", refs.size());
- lhs->gatherArrayRefs( refs, isAssignmentOp() );
- //fprintf(stderr, "in chillAST_BinaryOperator::gatherArrayRefs(), %d &arrayrefs after lhs\n", refs.size());
- rhs->gatherArrayRefs( refs, 0 );
- //fprintf(stderr, "in chillAST_BinaryOperator::gatherArrayRefs(), %d &refs\n", refs.size());
-
- //for (int i=0; i<refs.size(); i++) {
- // fprintf(stderr, "%s\n", (*refs)[i]->basedecl->varname);
- //}
+ //fprintf(stderr, "in chillAST_BinaryOperator::gatherArrayRefs(), %d &arrayrefs before\n", refs.size());
+ lhs->gatherArrayRefs(refs, isAssignmentOp());
+ //fprintf(stderr, "in chillAST_BinaryOperator::gatherArrayRefs(), %d &arrayrefs after lhs\n", refs.size());
+ rhs->gatherArrayRefs(refs, 0);
+ //fprintf(stderr, "in chillAST_BinaryOperator::gatherArrayRefs(), %d &refs\n", refs.size());
+
+ //for (int i=0; i<refs.size(); i++) {
+ // fprintf(stderr, "%s\n", (*refs)[i]->basedecl->varname);
+ //}
}
-void chillAST_BinaryOperator::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- lhs->gatherScalarRefs( refs, isAssignmentOp() );
- rhs->gatherScalarRefs( refs, 0 );
-}
+void chillAST_BinaryOperator::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ lhs->gatherScalarRefs(refs, isAssignmentOp());
+ rhs->gatherScalarRefs(refs, 0);
+}
-void chillAST_BinaryOperator::replaceChild( chillAST_node *old, chillAST_node *newchild ) {
+void chillAST_BinaryOperator::replaceChild(chillAST_node *old, chillAST_node *newchild) {
//fprintf(stderr, "\nbinop::replaceChild( old 0x%x, new ) lhs 0x%x rhd 0x%x\n", old, lhs, rhs);
// will pointers match??
- if (lhs == old) setLHS( newchild );
- else if (rhs == old) setRHS( newchild );
-
- // silently ignore?
- //else {
+ if (lhs == old) setLHS(newchild);
+ else if (rhs == old) setRHS(newchild);
+
+ // silently ignore?
+ //else {
// fprintf(stderr, "\nERROR chillAST_BinaryOperator::replaceChild( old 0x%x, new ) lhs 0x%x rhd 0x%x\n", old, lhs, rhs);
// fprintf(stderr, "old is not a child of this BinaryOperator\n");
// print();
// dump();
- // exit(-1);
- //}
+ // exit(-1);
+ //}
}
+void chillAST_BinaryOperator::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ //fprintf(stderr, "chillAST_BinaryOperator::gatherVarDecls()\n");
-void chillAST_BinaryOperator::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- //fprintf(stderr, "chillAST_BinaryOperator::gatherVarDecls()\n");
-
- //fprintf(stderr, "chillAST_BinaryOperator::gatherVarDecls() before %d\n", decls.size());
- //print(0,stderr); fprintf(stderr, "\n");
- //fprintf(stderr, "lhs is %s\n", lhs->getTypeString());
- if (lhs) lhs->gatherVarDecls( decls ); // 'if' to deal with partially formed
- if (rhs) rhs->gatherVarDecls( decls );
- //fprintf(stderr, "after %d\n", decls.size());
+ //fprintf(stderr, "chillAST_BinaryOperator::gatherVarDecls() before %d\n", decls.size());
+ //print(0,stderr); fprintf(stderr, "\n");
+ //fprintf(stderr, "lhs is %s\n", lhs->getTypeString());
+ if (lhs) lhs->gatherVarDecls(decls); // 'if' to deal with partially formed
+ if (rhs) rhs->gatherVarDecls(decls);
+ //fprintf(stderr, "after %d\n", decls.size());
}
-void chillAST_BinaryOperator::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- //fprintf(stderr, "chillAST_BinaryOperator::gatherScalarVarDecls() before %d\n", decls.size());
- //fprintf(stderr, "lhs is %s\n", lhs->getTypeString());
- lhs->gatherScalarVarDecls( decls );
- rhs->gatherScalarVarDecls( decls );
- //fprintf(stderr, "after %d\n", decls.size());
+void chillAST_BinaryOperator::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ //fprintf(stderr, "chillAST_BinaryOperator::gatherScalarVarDecls() before %d\n", decls.size());
+ //fprintf(stderr, "lhs is %s\n", lhs->getTypeString());
+ lhs->gatherScalarVarDecls(decls);
+ rhs->gatherScalarVarDecls(decls);
+ //fprintf(stderr, "after %d\n", decls.size());
}
-void chillAST_BinaryOperator::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- //fprintf(stderr, "chillAST_BinaryOperator::gatherArrayVarDecls() before %d\n", decls.size());
- //fprintf(stderr, "lhs is %s\n", lhs->getTypeString());
- lhs->gatherArrayVarDecls( decls );
- rhs->gatherArrayVarDecls( decls );
- //fprintf(stderr, "after %d\n", decls.size());
+void chillAST_BinaryOperator::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ //fprintf(stderr, "chillAST_BinaryOperator::gatherArrayVarDecls() before %d\n", decls.size());
+ //fprintf(stderr, "lhs is %s\n", lhs->getTypeString());
+ lhs->gatherArrayVarDecls(decls);
+ rhs->gatherArrayVarDecls(decls);
+ //fprintf(stderr, "after %d\n", decls.size());
}
-
-void chillAST_BinaryOperator::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- lhs->gatherDeclRefExprs( refs );
- rhs->gatherDeclRefExprs( refs );
+void chillAST_BinaryOperator::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ lhs->gatherDeclRefExprs(refs);
+ rhs->gatherDeclRefExprs(refs);
}
-void chillAST_BinaryOperator::gatherStatements(std::vector<chillAST_node*> &statements ){
-
+void chillAST_BinaryOperator::gatherStatements(std::vector<chillAST_node *> &statements) {
+
// what's legit?
- if (isAssignmentOp()) {
- statements.push_back( this );
+ if (isAssignmentOp()) {
+ statements.push_back(this);
}
}
-
-
-void chillAST_BinaryOperator::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- lhs->gatherVarUsage( decls );
- rhs->gatherVarUsage( decls );
+void chillAST_BinaryOperator::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ lhs->gatherVarUsage(decls);
+ rhs->gatherVarUsage(decls);
}
-void chillAST_BinaryOperator::gatherVarLHSUsage( vector<chillAST_VarDecl*> &decls ) {
- lhs->gatherVarUsage( decls );
+void chillAST_BinaryOperator::gatherVarLHSUsage(vector<chillAST_VarDecl *> &decls) {
+ lhs->gatherVarUsage(decls);
}
- void chillAST_BinaryOperator::replaceVarDecls( chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
- //if (!strcmp(op, "<=")) {
- // fprintf(stderr, "chillAST_BinaryOperator::replaceVarDecls( old %s, new %s)\n", olddecl->varname, newdecl->varname );
- // print(); printf("\n"); fflush(stdout);
- // fprintf(stderr, "binaryoperator, lhs is of type %s\n", lhs->getTypeString());
- // fprintf(stderr, "binaryoperator, rhs is of type %s\n", rhs->getTypeString());
- //}
- lhs->replaceVarDecls( olddecl, newdecl );
- rhs->replaceVarDecls( olddecl, newdecl );
- //if (!strcmp(op, "<=")) {
- // print(); printf("\n\n"); fflush(stdout);
- //}
- }
+void chillAST_BinaryOperator::replaceVarDecls(chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
+ //if (!strcmp(op, "<=")) {
+ // fprintf(stderr, "chillAST_BinaryOperator::replaceVarDecls( old %s, new %s)\n", olddecl->varname, newdecl->varname );
+ // print(); printf("\n"); fflush(stdout);
+ // fprintf(stderr, "binaryoperator, lhs is of type %s\n", lhs->getTypeString());
+ // fprintf(stderr, "binaryoperator, rhs is of type %s\n", rhs->getTypeString());
+ //}
+ lhs->replaceVarDecls(olddecl, newdecl);
+ rhs->replaceVarDecls(olddecl, newdecl);
+ //if (!strcmp(op, "<=")) {
+ // print(); printf("\n\n"); fflush(stdout);
+ //}
+}
-bool chillAST_BinaryOperator::isSameAs( chillAST_node *other ){
+bool chillAST_BinaryOperator::isSameAs(chillAST_node *other) {
if (!other->isBinaryOperator()) return false;
- chillAST_BinaryOperator *o = (chillAST_BinaryOperator *)other;
- if (strcmp(op, o->op)) return false; // different operators
- return lhs->isSameAs( o->lhs ) && rhs->isSameAs( o->rhs ); // recurse
+ chillAST_BinaryOperator *o = (chillAST_BinaryOperator *) other;
+ if (strcmp(op, o->op)) return false; // different operators
+ return lhs->isSameAs(o->lhs) && rhs->isSameAs(o->rhs); // recurse
}
-
-
chillAST_TernaryOperator::chillAST_TernaryOperator() {
op = strdup("?"); // the only one so far
condition = lhs = rhs = NULL;
- asttype = CHILLAST_NODETYPE_TERNARYOPERATOR;
- isFromSourceFile = true; // default
+ asttype = CHILLAST_NODETYPE_TERNARYOPERATOR;
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_TernaryOperator::chillAST_TernaryOperator(const char *oper, chillAST_node *c, chillAST_node *l, chillAST_node *r, chillAST_node *par) {
-
+chillAST_TernaryOperator::chillAST_TernaryOperator(const char *oper, chillAST_node *c, chillAST_node *l,
+ chillAST_node *r, chillAST_node *par) {
+
op = strdup(oper);
- condition = c; condition->setParent( this );
- lhs = l; lhs->setParent( this );
- rhs = r; rhs->setParent( this );
- asttype = CHILLAST_NODETYPE_TERNARYOPERATOR;
- isFromSourceFile = true; // default
+ condition = c;
+ condition->setParent(this);
+ lhs = l;
+ lhs->setParent(this);
+ rhs = r;
+ rhs->setParent(this);
+ asttype = CHILLAST_NODETYPE_TERNARYOPERATOR;
+ isFromSourceFile = true; // default
filename = NULL;
}
-void chillAST_TernaryOperator::dump( int indent, FILE *fp ) {
- chillindent(indent, fp);
+void chillAST_TernaryOperator::dump(int indent, FILE *fp) {
+ chillindent(indent, fp);
fprintf(fp, "(TernaryOperator '%s'\n", op);
- condition->dump(indent+1, fp);
- lhs->dump(indent+1, fp);
- rhs->dump(indent+1, fp);
- chillindent(indent, fp);
+ condition->dump(indent + 1, fp);
+ lhs->dump(indent + 1, fp);
+ rhs->dump(indent + 1, fp);
+ chillindent(indent, fp);
fprintf(fp, ")\n");
fflush(fp);
}
-void chillAST_TernaryOperator::print( int indent, FILE *fp ) {
- printPreprocBEFORE(indent, fp);
+void chillAST_TernaryOperator::print(int indent, FILE *fp) {
+ printPreprocBEFORE(indent, fp);
chillindent(indent, fp);
fprintf(fp, "(");
- condition->print(0,fp);
- fprintf(fp, "%s", op);
- lhs->print(0,fp);
+ condition->print(0, fp);
+ fprintf(fp, "%s", op);
+ lhs->print(0, fp);
fprintf(fp, ":");
- rhs->print(0,fp);
+ rhs->print(0, fp);
fprintf(fp, ")");
fflush(fp);
}
-void chillAST_TernaryOperator::replaceChild( chillAST_node *old, chillAST_node *newchild ) {
+void chillAST_TernaryOperator::replaceChild(chillAST_node *old, chillAST_node *newchild) {
//fprintf(stderr, "\nbinop::replaceChild( old 0x%x, new ) lhs 0x%x rhd 0x%x\n", old, lhs, rhs);
// will pointers match??
- if (lhs == old) setLHS( newchild );
- else if (rhs == old) setRHS( newchild );
- else if (condition == old) setCond( newchild );
+ if (lhs == old) setLHS(newchild);
+ else if (rhs == old) setRHS(newchild);
+ else if (condition == old) setCond(newchild);
- // silently ignore?
- //else {
+ // silently ignore?
+ //else {
//}
}
-void chillAST_TernaryOperator::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- condition->gatherVarDecls( decls );
- lhs->gatherVarDecls( decls );
- rhs->gatherVarDecls( decls );
+void chillAST_TernaryOperator::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ condition->gatherVarDecls(decls);
+ lhs->gatherVarDecls(decls);
+ rhs->gatherVarDecls(decls);
}
-void chillAST_TernaryOperator::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- condition->gatherScalarVarDecls( decls );
- lhs->gatherScalarVarDecls( decls );
- rhs->gatherScalarVarDecls( decls );
+void chillAST_TernaryOperator::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ condition->gatherScalarVarDecls(decls);
+ lhs->gatherScalarVarDecls(decls);
+ rhs->gatherScalarVarDecls(decls);
}
-void chillAST_TernaryOperator::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- condition->gatherArrayVarDecls( decls );
- lhs->gatherArrayVarDecls( decls );
- rhs->gatherArrayVarDecls( decls );
+void chillAST_TernaryOperator::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ condition->gatherArrayVarDecls(decls);
+ lhs->gatherArrayVarDecls(decls);
+ rhs->gatherArrayVarDecls(decls);
}
-
-void chillAST_TernaryOperator::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- condition->gatherDeclRefExprs( refs );
- lhs->gatherDeclRefExprs( refs );
- rhs->gatherDeclRefExprs( refs );
+void chillAST_TernaryOperator::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ condition->gatherDeclRefExprs(refs);
+ lhs->gatherDeclRefExprs(refs);
+ rhs->gatherDeclRefExprs(refs);
}
-
-void chillAST_TernaryOperator::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- condition->gatherVarUsage( decls );
- lhs->gatherVarUsage( decls );
- rhs->gatherVarUsage( decls );
+void chillAST_TernaryOperator::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ condition->gatherVarUsage(decls);
+ lhs->gatherVarUsage(decls);
+ rhs->gatherVarUsage(decls);
}
-void chillAST_TernaryOperator::gatherVarLHSUsage( vector<chillAST_VarDecl*> &decls ) {
- // this makes no sense for ternary ??
+void chillAST_TernaryOperator::gatherVarLHSUsage(vector<chillAST_VarDecl *> &decls) {
+ // this makes no sense for ternary ??
}
-void chillAST_TernaryOperator::replaceVarDecls( chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
- condition->replaceVarDecls( olddecl, newdecl );
- lhs->replaceVarDecls( olddecl, newdecl );
- rhs->replaceVarDecls( olddecl, newdecl );
+void chillAST_TernaryOperator::replaceVarDecls(chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
+ condition->replaceVarDecls(olddecl, newdecl);
+ lhs->replaceVarDecls(olddecl, newdecl);
+ rhs->replaceVarDecls(olddecl, newdecl);
}
-void chillAST_TernaryOperator::printonly( int indent, FILE *fp ) {
+void chillAST_TernaryOperator::printonly(int indent, FILE *fp) {
fprintf(fp, "(");
- condition->printonly(0,fp);
- fprintf(fp, "%s", op);
- lhs->printonly(0,fp);
+ condition->printonly(0, fp);
+ fprintf(fp, "%s", op);
+ lhs->printonly(0, fp);
fprintf(fp, ":");
- rhs->printonly(0,fp);
+ rhs->printonly(0, fp);
fprintf(fp, ")");
fflush(fp);
}
-class chillAST_node* chillAST_TernaryOperator::constantFold() {
+class chillAST_node *chillAST_TernaryOperator::constantFold() {
condition = condition->constantFold();
lhs = lhs->constantFold();
rhs = rhs->constantFold();
-
+
chillAST_node *returnval = this;
- if (condition->isConstant()) {
+ if (condition->isConstant()) {
//fprintf(stderr, "ternop folding constants\n");
//print(0,stderr);
//fprintf(stderr, "\n");
// assume op is "?"
- // TODO
- /*
-
- if (streq(op, "+") || streq(op, "-") || streq(op, "*")) {
+ // TODO
+ /*
+
+ if (streq(op, "+") || streq(op, "-") || streq(op, "*")) {
if (lhs->isIntegerLiteral() && rhs->isIntegerLiteral()) {
chillAST_IntegerLiteral *l = (chillAST_IntegerLiteral *)lhs;
chillAST_IntegerLiteral *r = (chillAST_IntegerLiteral *)rhs;
chillAST_IntegerLiteral *I;
-
+
if (streq(op, "+")) I = new chillAST_IntegerLiteral(l->value+r->value, parent);
if (streq(op, "-")) I = new chillAST_IntegerLiteral(l->value-r->value, parent);
if (streq(op, "*")) I = new chillAST_IntegerLiteral(l->value*r->value, parent);
@@ -2667,17 +2632,17 @@ class chillAST_node* chillAST_TernaryOperator::constantFold() {
}
else { // at least one is a float
float lval, rval;
- if (lhs->isIntegerLiteral()) {
- lval = (float) ((chillAST_IntegerLiteral *)lhs)->value;
+ if (lhs->isIntegerLiteral()) {
+ lval = (float) ((chillAST_IntegerLiteral *)lhs)->value;
}
- else {
- lval = ((chillAST_FloatingLiteral *)lhs)->value;
+ else {
+ lval = ((chillAST_FloatingLiteral *)lhs)->value;
}
- if (rhs->isIntegerLiteral()) {
- rval = (float) ((chillAST_IntegerLiteral *)rhs)->value;
+ if (rhs->isIntegerLiteral()) {
+ rval = (float) ((chillAST_IntegerLiteral *)rhs)->value;
}
- else {
- rval = ((chillAST_FloatingLiteral *)rhs)->value;
+ else {
+ rval = ((chillAST_FloatingLiteral *)rhs)->value;
}
chillAST_FloatingLiteral *F;
@@ -2688,238 +2653,232 @@ class chillAST_node* chillAST_TernaryOperator::constantFold() {
returnval = F;
}
}
- else fprintf(stderr, "can't fold op '%s' yet\n", op);
+ else fprintf(stderr, "can't fold op '%s' yet\n", op);
*/
}
return returnval;
}
-class chillAST_node* chillAST_TernaryOperator::clone() {
- chillAST_node* c = condition->clone();
- chillAST_node* l = lhs->clone();
- chillAST_node* r = rhs->clone();
- chillAST_TernaryOperator *to = new chillAST_TernaryOperator( op, l, r, parent );
- c->setParent( to );
- l->setParent( to );
- r->setParent( to );
+class chillAST_node *chillAST_TernaryOperator::clone() {
+ chillAST_node *c = condition->clone();
+ chillAST_node *l = lhs->clone();
+ chillAST_node *r = rhs->clone();
+ chillAST_TernaryOperator *to = new chillAST_TernaryOperator(op, l, r, parent);
+ c->setParent(to);
+ l->setParent(to);
+ r->setParent(to);
to->isFromSourceFile = isFromSourceFile;
filename = NULL;
return to;
}
-void chillAST_TernaryOperator::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool w ) {
- condition->gatherArrayRefs( refs, isAssignmentOp() );
- lhs->gatherArrayRefs( refs, isAssignmentOp() );
- rhs->gatherArrayRefs( refs, 0 );
+void chillAST_TernaryOperator::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool w) {
+ condition->gatherArrayRefs(refs, isAssignmentOp());
+ lhs->gatherArrayRefs(refs, isAssignmentOp());
+ rhs->gatherArrayRefs(refs, 0);
}
-void chillAST_TernaryOperator::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- condition->gatherScalarRefs( refs, isAssignmentOp() );
- lhs->gatherScalarRefs( refs, isAssignmentOp() );
- rhs->gatherScalarRefs( refs, 0 );
-}
-
-
-
-
-
+void chillAST_TernaryOperator::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ condition->gatherScalarRefs(refs, isAssignmentOp());
+ lhs->gatherScalarRefs(refs, isAssignmentOp());
+ rhs->gatherScalarRefs(refs, 0);
+}
-chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() {
- //fprintf(stderr, "\n%p chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() 0\n", this);
- asttype = CHILLAST_NODETYPE_ARRAYSUBSCRIPTEXPR;
+chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() {
+ //fprintf(stderr, "\n%p chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() 0\n", this);
+ asttype = CHILLAST_NODETYPE_ARRAYSUBSCRIPTEXPR;
base = index = NULL;
- basedecl = NULL; //fprintf(stderr, "setting basedecl NULL for ASE %p\n", this);
- imwrittento = false; // ??
- imreadfrom = false; // ??
+ basedecl = NULL; //fprintf(stderr, "setting basedecl NULL for ASE %p\n", this);
+ imwrittento = false; // ??
+ imreadfrom = false; // ??
parent = NULL;
metacomment = NULL;
//fprintf(stderr, "chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() NEED TO FAKE A LOCATION\n");
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
- //fprintf(stderr, "\nASE %p is empty\n", this);
+ //fprintf(stderr, "\nASE %p is empty\n", this);
}
-
-chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr( chillAST_node *bas, chillAST_node *indx, chillAST_node *par, void *unique ) {
+chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr(chillAST_node *bas, chillAST_node *indx, chillAST_node *par,
+ void *unique) {
//fprintf(stderr, "\nchillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() 1\n");
- //fprintf(stderr, "ASE index %p ", indx); indx->print(0,stderr); fprintf(stderr, "\n");
- asttype = CHILLAST_NODETYPE_ARRAYSUBSCRIPTEXPR;
- bas->setParent( this );
- if (bas->isImplicitCastExpr()) base = ((chillAST_ImplicitCastExpr*)bas)->subexpr; // probably wrong
- else base = bas;
- if (indx->isImplicitCastExpr()) index = ((chillAST_ImplicitCastExpr*)indx)->subexpr; // probably wrong
+ //fprintf(stderr, "ASE index %p ", indx); indx->print(0,stderr); fprintf(stderr, "\n");
+ asttype = CHILLAST_NODETYPE_ARRAYSUBSCRIPTEXPR;
+ bas->setParent(this);
+ if (bas->isImplicitCastExpr()) base = ((chillAST_ImplicitCastExpr *) bas)->subexpr; // probably wrong
+ else base = bas;
+ if (indx->isImplicitCastExpr()) index = ((chillAST_ImplicitCastExpr *) indx)->subexpr; // probably wrong
else index = indx;
- base->setParent( this );
- index->setParent( this );
+ base->setParent(this);
+ index->setParent(this);
- imwrittento = false; // ??
- imreadfrom = false; // ??
+ imwrittento = false; // ??
+ imreadfrom = false; // ??
uniquePtr = (void *) unique;
- //fprintf(stderr,"chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() original = 0x%x\n", uniquePtr);
- //fprintf(stderr, "chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() 1 calling multibase()\n");
- basedecl = multibase();//fprintf(stderr, "%p ASE 1 basedecl = %p\n",this,basedecl);
+ //fprintf(stderr,"chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() original = 0x%x\n", uniquePtr);
+ //fprintf(stderr, "chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() 1 calling multibase()\n");
+ basedecl = multibase();//fprintf(stderr, "%p ASE 1 basedecl = %p\n",this,basedecl);
//basedecl->print(); printf("\n");
- //basedecl->dump(); printf("\n"); fflush(stdout);
- //fprintf(stderr, "basedecl varname %s\n", basedecl->varname);
- isFromSourceFile = true; // default
+ //basedecl->dump(); printf("\n"); fflush(stdout);
+ //fprintf(stderr, "basedecl varname %s\n", basedecl->varname);
+ isFromSourceFile = true; // default
filename = NULL;
- //fprintf(stderr, "\nASE %p parent %p ", this, parent); print(0,stderr); fprintf(stderr, "\n\n");
+ //fprintf(stderr, "\nASE %p parent %p ", this, parent); print(0,stderr); fprintf(stderr, "\n\n");
}
+chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr(chillAST_node *bas, chillAST_node *indx, bool writtento,
+ chillAST_node *par, void *unique) {
+ //fprintf(stderr, "\nchillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() 2 parent %p\n", par );
+ //fprintf(stderr, "ASE %p index %p ", this, indx); indx->print(0,stderr); fprintf(stderr, "\n");
-chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr( chillAST_node *bas, chillAST_node *indx, bool writtento, chillAST_node *par, void *unique ) {
- //fprintf(stderr, "\nchillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() 2 parent %p\n", par );
- //fprintf(stderr, "ASE %p index %p ", this, indx); indx->print(0,stderr); fprintf(stderr, "\n");
-
- asttype = CHILLAST_NODETYPE_ARRAYSUBSCRIPTEXPR;
- bas->setParent( this );
- if (bas->isImplicitCastExpr()) base = ((chillAST_ImplicitCastExpr*)bas)->subexpr; // probably wrong
+ asttype = CHILLAST_NODETYPE_ARRAYSUBSCRIPTEXPR;
+ bas->setParent(this);
+ if (bas->isImplicitCastExpr()) base = ((chillAST_ImplicitCastExpr *) bas)->subexpr; // probably wrong
else base = bas;
- if (indx->isImplicitCastExpr()) index = ((chillAST_ImplicitCastExpr*)indx)->subexpr; // probably wrong
+ if (indx->isImplicitCastExpr()) index = ((chillAST_ImplicitCastExpr *) indx)->subexpr; // probably wrong
else index = indx;
-
+
//fprintf(stderr, "setting parent of base %p to %p\n", base, this);
//fprintf(stderr, "setting parent of index %p to %p\n", index, this);
- base->setParent( this );
- index->setParent( this );
-
- imwrittento = writtento; // ??
+ base->setParent(this);
+ index->setParent(this);
+
+ imwrittento = writtento; // ??
//fprintf(stderr, "ASE %p imwrittento %d\n", this, imwrittento);
- imreadfrom = false; // ??
+ imreadfrom = false; // ??
uniquePtr = (void *) unique;
- //fprintf(stderr,"chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() original = 0x%x\n", uniquePtr);
+ //fprintf(stderr,"chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() original = 0x%x\n", uniquePtr);
- basedecl = multibase();
+ basedecl = multibase();
- //fprintf(stderr, "%p ASE 2 basedecl = %p\n", this, basedecl);
- //printf("basedecl is "); fflush(stdout); basedecl->print(); printf("\n"); fflush(stdout);
+ //fprintf(stderr, "%p ASE 2 basedecl = %p\n", this, basedecl);
+ //printf("basedecl is "); fflush(stdout); basedecl->print(); printf("\n"); fflush(stdout);
//basedecl->dump(); printf("\n"); fflush(stdout);
- //fprintf(stderr, "basedecl varname %s\n", basedecl->varname);
- isFromSourceFile = true; // default
+ //fprintf(stderr, "basedecl varname %s\n", basedecl->varname);
+ isFromSourceFile = true; // default
filename = NULL;
//fprintf(stderr, "chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() 2 DONE\n");
- //print(0,stderr); fprintf(stderr, "\n\n");
- //fprintf(stderr, "\nASE %p parent %p ", this, parent); print(0,stderr); fprintf(stderr, "\n\n");
- }
-
+ //print(0,stderr); fprintf(stderr, "\n\n");
+ //fprintf(stderr, "\nASE %p parent %p ", this, parent); print(0,stderr); fprintf(stderr, "\n\n");
+}
-chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr( chillAST_VarDecl *v, std::vector<chillAST_node *> indeces, chillAST_node *par) {
- //fprintf(stderr, "\nchillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() 4\n");
+chillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr(chillAST_VarDecl *v, std::vector<chillAST_node *> indeces,
+ chillAST_node *par) {
+ //fprintf(stderr, "\nchillAST_ArraySubscriptExpr::chillAST_ArraySubscriptExpr() 4\n");
//fprintf(stderr,"chillAST_ArraySubscriptExpr( chillAST_VarDecl *v, std::vector<int> indeces)\n");
- asttype = CHILLAST_NODETYPE_ARRAYSUBSCRIPTEXPR;
+ asttype = CHILLAST_NODETYPE_ARRAYSUBSCRIPTEXPR;
parent = par;
- //if (parent == NULL) {
- // fprintf(stderr, "dammit. ASE %p has no parent\n", this);
- //}
+ //if (parent == NULL) {
+ // fprintf(stderr, "dammit. ASE %p has no parent\n", this);
+ //}
int numindeces = indeces.size();
- for (int i=0; i<numindeces; i++) {
- fprintf(stderr, "ASE index %d ", i); indeces[i]->print(0,stderr); fprintf(stderr, "\n");
- // printf("[");
- // indeces[i]->print();
- // printf("]");
- }
- //fflush(stdout);
+ for (int i = 0; i < numindeces; i++) {
+ fprintf(stderr, "ASE index %d ", i);
+ indeces[i]->print(0, stderr);
+ fprintf(stderr, "\n");
+ // printf("[");
+ // indeces[i]->print();
+ // printf("]");
+ }
+ //fflush(stdout);
//fprintf(stderr, "\n");
-
- chillAST_DeclRefExpr *DRE = new chillAST_DeclRefExpr( v->vartype, v->varname, v, NULL);
- basedecl = v; // ??
- //fprintf(stderr, "%p ASE 3 basedecl = %p ", this, basedecl);
- //fprintf(stderr, "of type %s\n", basedecl->getTypeString());
+
+ chillAST_DeclRefExpr *DRE = new chillAST_DeclRefExpr(v->vartype, v->varname, v, NULL);
+ basedecl = v; // ??
+ //fprintf(stderr, "%p ASE 3 basedecl = %p ", this, basedecl);
+ //fprintf(stderr, "of type %s\n", basedecl->getTypeString());
//basedecl->print(); printf("\n");
- //basedecl->dump(); printf("\n"); fflush(stdout);
- //fprintf(stderr, "basedecl varname %s\n", basedecl->varname);
-
+ //basedecl->dump(); printf("\n"); fflush(stdout);
+ //fprintf(stderr, "basedecl varname %s\n", basedecl->varname);
+
chillAST_ArraySubscriptExpr *rent = this; // parent for subnodes
-
- // these are on the top level ASE that we're creating here
+
+ // these are on the top level ASE that we're creating here
base = (chillAST_node *) DRE;
- index = indeces[ numindeces-1];
+ index = indeces[numindeces - 1];
+
+ base->setParent(this);
+ index->setParent(this);
- base->setParent( this );
- index->setParent(this);
+ for (int i = numindeces - 2; i >= 0; i--) {
- for (int i=numindeces-2; i>=0; i--) {
-
- chillAST_ArraySubscriptExpr *ASE = new chillAST_ArraySubscriptExpr( DRE, indeces[i], rent, 0);
- rent->base = ASE; //
+ chillAST_ArraySubscriptExpr *ASE = new chillAST_ArraySubscriptExpr(DRE, indeces[i], rent, 0);
+ rent->base = ASE; //
rent = ASE;
}
-
+
imwrittento = false;
- imreadfrom = false;
- //fprintf(stderr, "ASE is "); print(); printf("\n\n"); fflush(stdout);
- isFromSourceFile = true; // default
+ imreadfrom = false;
+ //fprintf(stderr, "ASE is "); print(); printf("\n\n"); fflush(stdout);
+ isFromSourceFile = true; // default
filename = NULL;
- //fprintf(stderr, "\nASE %p parent %p ", this, parent); print(0,stderr); fprintf(stderr, "\n\n");
+ //fprintf(stderr, "\nASE %p parent %p ", this, parent); print(0,stderr); fprintf(stderr, "\n\n");
}
-
-chillAST_node *chillAST_node::getEnclosingStatement( int level ) { // TODO do for subclasses?
+chillAST_node *chillAST_node::getEnclosingStatement(int level) { // TODO do for subclasses?
//fprintf(stderr, "chillAST_node::getEnclosingStatement( level %d ) node type %s\n", level, getTypeString());
//print(); printf("\n"); fflush(stdout);
// so far, user will ONLY call this directly on an array subscript expression
- if (isArraySubscriptExpr()) return parent->getEnclosingStatement( level+1);
+ if (isArraySubscriptExpr()) return parent->getEnclosingStatement(level + 1);
- if (level != 0) {
- if (isBinaryOperator() ||
- isUnaryOperator() ||
- isTernaryOperator() ||
- isReturnStmt() ||
+ if (level != 0) {
+ if (isBinaryOperator() ||
+ isUnaryOperator() ||
+ isTernaryOperator() ||
+ isReturnStmt() ||
isCallExpr()
- ) return this;
-
-
- // things that are not endpoints. recurse through parent
- if (isMemberExpr()) return parent->getEnclosingStatement( level+1 );
- if (isImplicitCastExpr()) return parent->getEnclosingStatement( level+1 );
- if (isSizeof()) return parent->getEnclosingStatement( level+1 );
- if (isCStyleCastExpr()) return parent->getEnclosingStatement( level+1 );
+ )
+ return this;
+
+
+ // things that are not endpoints. recurse through parent
+ if (isMemberExpr()) return parent->getEnclosingStatement(level + 1);
+ if (isImplicitCastExpr()) return parent->getEnclosingStatement(level + 1);
+ if (isSizeof()) return parent->getEnclosingStatement(level + 1);
+ if (isCStyleCastExpr()) return parent->getEnclosingStatement(level + 1);
return NULL;
}
- fprintf(stderr, "getEnclosingStatement() level %d type %s, returning NULL\n", level, getTypeString());
- segfault();
+ fprintf(stderr, "getEnclosingStatement() level %d type %s, returning NULL\n", level, getTypeString());
+ exit(-1);
return NULL;
}
-
-void chillAST_ArraySubscriptExpr::gatherIndeces(std::vector<chillAST_node*>&ind) {
- if (base->isArraySubscriptExpr()) ((chillAST_ArraySubscriptExpr *)base)->gatherIndeces( ind );
- ind.push_back( index );
+void chillAST_ArraySubscriptExpr::gatherIndeces(std::vector<chillAST_node *> &ind) {
+ if (base->isArraySubscriptExpr()) ((chillAST_ArraySubscriptExpr *) base)->gatherIndeces(ind);
+ ind.push_back(index);
}
-
-void chillAST_ArraySubscriptExpr::dump( int indent, FILE *fp ) {
+void chillAST_ArraySubscriptExpr::dump(int indent, FILE *fp) {
// fprintf(stderr, "\n%p chillAST_ArraySubscriptExpr::dump() basedecl %p\n", basedecl);
-
+
char *local;
if (basedecl && basedecl->vartype) {
- local = strdup( basedecl->vartype );
- }
- else {
- fprintf(stderr, "%p chillAST_ArraySubscriptExpr::dump(), no basedecl ???\n",this);
+ local = strdup(basedecl->vartype);
+ } else {
+ fprintf(stderr, "%p chillAST_ArraySubscriptExpr::dump(), no basedecl ???\n", this);
local = strdup("");
- //fprintf(stderr, "base is "); base->dump(); printf("\n"); base->print(); printf("\n"); fflush(stdout);
+ //fprintf(stderr, "base is "); base->dump(); printf("\n"); base->print(); printf("\n"); fflush(stdout);
//print(); printf("\n"); fflush(stdout);
}
@@ -2929,811 +2888,819 @@ void chillAST_ArraySubscriptExpr::dump( int indent, FILE *fp ) {
chillindent(indent, fp);
//fprintf(fp, "(ArraySubscriptExpr '%s' ", local);
- if (basedecl) {
- //fprintf(stderr, " chillAST_ArraySubscriptExpr::dump() basedecl is of type %s\n", basedecl->getTypeString());
- fprintf(fp, "(ArraySubscriptExpr (%s) '%s' ", basedecl->varname, local);
- }
- else fprintf(stderr, " chillAST_ArraySubscriptExpr::dump() has no basedecl\n");
+ if (basedecl) {
+ //fprintf(stderr, " chillAST_ArraySubscriptExpr::dump() basedecl is of type %s\n", basedecl->getTypeString());
+ fprintf(fp, "(ArraySubscriptExpr (%s) '%s' ", basedecl->varname, local);
+ } else fprintf(stderr, " chillAST_ArraySubscriptExpr::dump() has no basedecl\n");
free(local);
- if (imwrittento) {
- if (imreadfrom) fprintf(fp, "lvalue AND rvalue\n");
- else fprintf(fp, "lvalue\n");
- }
- else fprintf(fp, "rvalue\n");
- base->dump( indent+1, fp );
- index->dump(indent+1, fp);
+ if (imwrittento) {
+ if (imreadfrom) fprintf(fp, "lvalue AND rvalue\n");
+ else fprintf(fp, "lvalue\n");
+ } else fprintf(fp, "rvalue\n");
+ base->dump(indent + 1, fp);
+ index->dump(indent + 1, fp);
chillindent(indent, fp);
fprintf(fp, ")\n");
- fflush(fp);
+ fflush(fp);
}
-
-void chillAST_ArraySubscriptExpr::print( int indent, FILE *fp ) {
- base->print( indent, fp );
+void chillAST_ArraySubscriptExpr::print(int indent, FILE *fp) {
+ base->print(indent, fp);
fprintf(fp, "[");
- index->print(0, fp);
+ index->print(0, fp);
fprintf(fp, "]");
- fflush(fp);
+ fflush(fp);
}
-char *chillAST_ArraySubscriptExpr::stringRep(int indent ) {
- fprintf(stderr, "chillAST_ArraySubscriptExpr::stringRep\n");
+char *chillAST_ArraySubscriptExpr::stringRep(int indent) {
+ fprintf(stderr, "chillAST_ArraySubscriptExpr::stringRep\n");
char *blurb;
- char *b = base->stringRep(0);
- char *i = index->stringRep(0);
+ char *b = base->stringRep(0);
+ char *i = index->stringRep(0);
// combine. shoudl be using strings. much cleaner TODO
std::string s = string(b) + "[" + string(i) + "]";
- fprintf(stderr, "ASE stringrep %s\n", s.c_str());
- return strdup( s.c_str());
-
+ fprintf(stderr, "ASE stringrep %s\n", s.c_str());
+ return strdup(s.c_str());
+
}
-void chillAST_ArraySubscriptExpr::printonly( int indent, FILE *fp ) {
- base->printonly( indent, fp );
+void chillAST_ArraySubscriptExpr::printonly(int indent, FILE *fp) {
+ base->printonly(indent, fp);
fprintf(fp, "[");
- index->printonly(0, fp);
+ index->printonly(0, fp);
fprintf(fp, "]");
- fflush(fp);
+ fflush(fp);
}
-void chillAST_ArraySubscriptExpr::print( int indent, FILE *fp ) const {
- base->print( indent, fp );
+void chillAST_ArraySubscriptExpr::print(int indent, FILE *fp) const {
+ base->print(indent, fp);
fprintf(fp, "[");
- index->print(0, fp);
+ index->print(0, fp);
fprintf(fp, "]");
- fflush(fp);
+ fflush(fp);
};
-chillAST_VarDecl *chillAST_ArraySubscriptExpr::multibase() {
+chillAST_VarDecl *chillAST_ArraySubscriptExpr::multibase() {
// return the VARDECL of the thing the subscript is an index into
//this should probably be a chillAST_node function instead of having all these ifs
- //print(); printf("\n"); fflush(stdout);
- //base->print(); printf("\n"); fflush(stdout);
- //fprintf(stderr, "chillAST_ArraySubscriptExpr::multibase() base of type %s\n", base->getTypeString());
-
- return base->multibase();
+ //print(); printf("\n"); fflush(stdout);
+ //base->print(); printf("\n"); fflush(stdout);
+ //fprintf(stderr, "chillAST_ArraySubscriptExpr::multibase() base of type %s\n", base->getTypeString());
+
+ return base->multibase();
// this will be used to SET basedecl
//basedecl = NULL; // do this so we don't confuse ourselves looking at uninitialized basedecl
- chillAST_node *b = base;
+ chillAST_node *b = base;
//fprintf(stderr, "base is of type %s\n", b->getTypeString());
if (!b) return NULL; // just in case ??
if (base->asttype == CHILLAST_NODETYPE_IMPLICITCASTEXPR) { // bad coding
- b = ((chillAST_ImplicitCastExpr*)b)->subexpr;
+ b = ((chillAST_ImplicitCastExpr *) b)->subexpr;
}
if (b->asttype == CHILLAST_NODETYPE_ARRAYSUBSCRIPTEXPR) { // multidimensional array!
// recurse
- return ((chillAST_ArraySubscriptExpr *)b)->multibase();
+ return ((chillAST_ArraySubscriptExpr *) b)->multibase();
}
- if (b->asttype == CHILLAST_NODETYPE_DECLREFEXPR) return(((chillAST_DeclRefExpr*)b)->getVarDecl());
+ if (b->asttype == CHILLAST_NODETYPE_DECLREFEXPR) return (((chillAST_DeclRefExpr *) b)->getVarDecl());
-
- if (b->isBinaryOperator()) {
+
+ if (b->isBinaryOperator()) {
// presumably a dot or pointer ref that resolves to an array
chillAST_BinaryOperator *BO = (chillAST_BinaryOperator *) b;
- if ( strcmp(BO->op, ".") ) {
+ if (strcmp(BO->op, ".")) {
fprintf(stderr, "chillAST_ArraySubscriptExpr::multibase(), UNHANDLED case:\n");
- fprintf(stderr, "base is binary operator, of type %s\n", BO->op);
+ fprintf(stderr, "base is binary operator, of type %s\n", BO->op);
exit(-1);
}
chillAST_node *l = BO->lhs;
chillAST_node *r = BO->rhs;
- printf("L %s\nR %s\n", l->getTypeString(), r->getTypeString());
- exit(-1);
+ printf("L %s\nR %s\n", l->getTypeString(), r->getTypeString());
+ exit(-1);
return NULL; // TODO do checks?
}
- if (b->isMemberExpr()) {
+ if (b->isMemberExpr()) {
//c.i[c.count] we want i member of inspector
chillAST_MemberExpr *ME = (chillAST_MemberExpr *) b;
- //fprintf(stderr, "multibase() Member Expression "); ME->print(); printf("\n"); fflush(stdout);
+ //fprintf(stderr, "multibase() Member Expression "); ME->print(); printf("\n"); fflush(stdout);
chillAST_node *n = ME->base; // WRONG want the MEMBER
//fprintf(stderr, "chillAST_ArraySubscriptExpr::multibase() Member Expression base of type %s\n", n->getTypeString());
- //fprintf(stderr, "base is "); ME->base->dump();
+ //fprintf(stderr, "base is "); ME->base->dump();
// NEED to be able to get lowest level recorddecl or typedef from this base
- fprintf(stderr, "chillast.cc, L2315, bailing??\n");
- exit(0);
+ fprintf(stderr, "chillast.cc, L2315, bailing??\n");
+ exit(0);
- if (!n->isDeclRefExpr()) {
+ if (!n->isDeclRefExpr()) {
fprintf(stderr, "MemberExpr member is not chillAST_DeclRefExpr\n");
exit(-1);
}
- chillAST_DeclRefExpr *DRE = (chillAST_DeclRefExpr *)n;
+ chillAST_DeclRefExpr *DRE = (chillAST_DeclRefExpr *) n;
n = DRE->decl;
- //fprintf(stderr, "DRE decl is of type %s\n", n->getTypeString());
- assert( n->isVarDecl() );
+ //fprintf(stderr, "DRE decl is of type %s\n", n->getTypeString());
+ assert(n->isVarDecl());
chillAST_VarDecl *vd = (chillAST_VarDecl *) n;
- vd->print(); printf("\n"); fflush(stdout);
+ vd->print();
+ printf("\n");
+ fflush(stdout);
+
+ chillAST_TypedefDecl *tdd = vd->typedefinition;
+ chillAST_RecordDecl *rd = vd->vardef;
+ //fprintf(stderr, "tdd %p rd %p\n", tdd, rd);
- chillAST_TypedefDecl *tdd = vd->typedefinition;
- chillAST_RecordDecl *rd = vd->vardef;
- //fprintf(stderr, "tdd %p rd %p\n", tdd, rd);
-
- print(); printf("\n");
- dump(); printf("\n"); fflush(stdout);
+ print();
+ printf("\n");
+ dump();
+ printf("\n");
+ fflush(stdout);
+
+ assert(tdd != NULL || rd != NULL);
- assert( tdd != NULL || rd != NULL );
-
chillAST_VarDecl *sub;
- if (tdd) sub = tdd->findSubpart( ME->member );
- if (rd) sub = rd->findSubpart( ME->member );
+ if (tdd) sub = tdd->findSubpart(ME->member);
+ if (rd) sub = rd->findSubpart(ME->member);
+
+ //fprintf(stderr, "subpart is "); sub->print(); printf("\n"); fflush(stdout);
- //fprintf(stderr, "subpart is "); sub->print(); printf("\n"); fflush(stdout);
-
- return sub; // what if the sub is an array ?? TODO
+ return sub; // what if the sub is an array ?? TODO
}
- fprintf(stderr, "chillAST_ArraySubscriptExpr::multibase(), UNHANDLED case %s\n",
- b->getTypeString());
- print(); printf("\n"); fflush(stdout);
- fprintf(stderr, "base is: "); b->print(); printf("\n"); fflush(stdout);
- segfault();
+ fprintf(stderr, "chillAST_ArraySubscriptExpr::multibase(), UNHANDLED case %s\n",
+ b->getTypeString());
+ print();
+ printf("\n");
+ fflush(stdout);
+ fprintf(stderr, "base is: ");
+ b->print();
+ printf("\n");
+ fflush(stdout);
+ exit(-1);
}
chillAST_node *chillAST_ArraySubscriptExpr::getIndex(int dim) {
- //fprintf(stderr, "chillAST_ArraySubscriptExpr::getIndex( %d )\n", dim);
+ //fprintf(stderr, "chillAST_ArraySubscriptExpr::getIndex( %d )\n", dim);
- chillAST_node *b = base;
+ chillAST_node *b = base;
int depth = 0;
- std::vector<chillAST_node*> ind;
+ std::vector<chillAST_node *> ind;
chillAST_node *curindex = index;
- for (;;) {
- if (b->asttype == CHILLAST_NODETYPE_IMPLICITCASTEXPR) b = ((chillAST_ImplicitCastExpr*)b)->subexpr;
+ for (;;) {
+ if (b->asttype == CHILLAST_NODETYPE_IMPLICITCASTEXPR) b = ((chillAST_ImplicitCastExpr *) b)->subexpr;
else if (b->asttype == CHILLAST_NODETYPE_ARRAYSUBSCRIPTEXPR) {
- //fprintf(stderr, "base "); b->print(); fprintf(stderr, "\n");
- //fprintf(stderr, "index "); curindex->print(); fprintf(stderr, "\n");
+ //fprintf(stderr, "base "); b->print(); fprintf(stderr, "\n");
+ //fprintf(stderr, "index "); curindex->print(); fprintf(stderr, "\n");
ind.push_back(curindex);
- curindex = ((chillAST_ArraySubscriptExpr*)b)->index;
- b = ((chillAST_ArraySubscriptExpr*)b)->base;
+ curindex = ((chillAST_ArraySubscriptExpr *) b)->index;
+ b = ((chillAST_ArraySubscriptExpr *) b)->base;
depth++;
- }
- else {
- //fprintf(stderr, "base "); b->print(); fprintf(stderr, "\n");
- //fprintf(stderr, "index "); curindex->print(); fprintf(stderr, "\n");
+ } else {
+ //fprintf(stderr, "base "); b->print(); fprintf(stderr, "\n");
+ //fprintf(stderr, "index "); curindex->print(); fprintf(stderr, "\n");
//fprintf(stderr, "stopping at base type %s\n", b->getTypeString());
ind.push_back(curindex);
- break;
+ break;
}
}
//fprintf(stderr, "depth %d\n", depth );
- //for (int i=0; i<ind.size(); i++) { ind[i]->print(); fprintf(stderr, "\n"); }
-
- return ind[ depth - dim ];
- /*
- if (dim == 0) return index; // single dimension
- fprintf(stderr, "DIM NOT 0\n");
- // multidimension
- chillAST_node *b = base;
+ //for (int i=0; i<ind.size(); i++) { ind[i]->print(); fprintf(stderr, "\n"); }
+
+ return ind[depth - dim];
+ /*
+ if (dim == 0) return index; // single dimension
+ fprintf(stderr, "DIM NOT 0\n");
+ // multidimension
+ chillAST_node *b = base;
if (base->asttype == CHILLAST_NODETYPE_IMPLICITCASTEXPR) { // bad coding
b = ((chillAST_ImplicitCastExpr*)b)->subexpr;
}
if (b->asttype == CHILLAST_NODETYPE_IMPLICITCASTEXPR) { // bad coding
b = ((chillAST_ImplicitCastExpr*)b)->subexpr;
}
-
+
b->print(); printf("\n"); fflush(stdout);
if (b->asttype == CHILLAST_NODETYPE_ARRAYSUBSCRIPTEXPR) {
return ((chillAST_ArraySubscriptExpr *)b)->getIndex(dim-1);
}
fprintf(stderr, "chillAST_ArraySubscriptExpr::getIndex() failed\n");
- */
- exit(-1);
+ */
+ exit(-1);
}
-
-
-class chillAST_node* chillAST_ArraySubscriptExpr::constantFold() {
- //fprintf(stderr, "chillAST_ArraySubscriptExpr::constantFold()\n");
- base = base->constantFold();
+class chillAST_node *chillAST_ArraySubscriptExpr::constantFold() {
+ //fprintf(stderr, "chillAST_ArraySubscriptExpr::constantFold()\n");
+ base = base->constantFold();
index = index->constantFold();
return this;
}
-class chillAST_node* chillAST_ArraySubscriptExpr::clone() {
+class chillAST_node *chillAST_ArraySubscriptExpr::clone() {
//fprintf(stderr,"chillAST_ArraySubscriptExpr::clone() old imwrittento %d\n", imwrittento);
//fprintf(stderr, "cloning ASE %p ", this); print(0,stderr); printf(" with parent %p\n", parent); fflush(stdout);
- //fprintf(stderr, "base %p base->parent %p index %p index->parent %p\n", base, base->parent, index, index->parent);
+ //fprintf(stderr, "base %p base->parent %p index %p index->parent %p\n", base, base->parent, index, index->parent);
//fprintf(stderr, "old base "); base->print(); printf("\n"); fflush(stdout);
//fprintf(stderr, "old base "); base->dump(); printf("\n"); fflush(stdout);
- if (base->isDeclRefExpr()) {
- chillAST_VarDecl *vd = (chillAST_VarDecl *)(((chillAST_DeclRefExpr *)base)->decl);
+ if (base->isDeclRefExpr()) {
+ chillAST_VarDecl *vd = (chillAST_VarDecl *) (((chillAST_DeclRefExpr *) base)->decl);
//fprintf(stderr, "old decl "); vd->print(); printf("\n");fflush(stdout);
//fprintf(stderr, "old decl "); vd->dump(); printf("\n");fflush(stdout);
}
- chillAST_node *b = base->clone();
+ chillAST_node *b = base->clone();
//fprintf(stderr, "new base "); b->print(); printf("\n"); fflush(stdout);
//fprintf(stderr, "new base "); b->dump(); printf("\n"); fflush(stdout);
chillAST_node *i = index->clone();
//fprintf(stderr, "new index "); i->print(); printf("\n"); fflush(stdout);
-
- //if (!index->parent) {
+
+ //if (!index->parent) {
// fprintf(stderr, "ASE %p SOURCE OF CLONE INDEX %p of type %s HAS NO PARENT\n", this, index, index->getTypeString());
// fprintf(stderr, "ASE SOURCE IS "); print(0,stderr); fprintf(stderr, "\n\n");
- //}
- //fprintf(stderr, "cloning AST %p, after cloning base and index, creating a new ASE\n", this);
- chillAST_ArraySubscriptExpr *ASE = new chillAST_ArraySubscriptExpr( b, i, imwrittento, parent, uniquePtr /* ?? */ );
- //fprintf(stderr, "cloned AST will be %p with parent %p and base %p index %p\n", ASE, parent, b, i);
+ //}
+ //fprintf(stderr, "cloning AST %p, after cloning base and index, creating a new ASE\n", this);
+ chillAST_ArraySubscriptExpr *ASE = new chillAST_ArraySubscriptExpr(b, i, imwrittento, parent, uniquePtr /* ?? */ );
+ //fprintf(stderr, "cloned AST will be %p with parent %p and base %p index %p\n", ASE, parent, b, i);
ASE->imreadfrom = false; // don't know this yet
- //ASE->imreadfrom = imreadfrom; // ??
- //if (ASE->imreadfrom) {
+ //ASE->imreadfrom = imreadfrom; // ??
+ //if (ASE->imreadfrom) {
// fprintf(stderr, "in chillAST_ArraySubscriptExpr::clone(), imreadfrom is being set. \n");
- // ASE->print(); fflush(stdout); fprintf(stderr, "\n");
- //}
+ // ASE->print(); fflush(stdout); fprintf(stderr, "\n");
+ //}
//fprintf(stderr, "cloned result "); ASE->print(); printf("\n\n\n"); fflush(stdout);
- //fprintf(stderr, "ASE clone() this 0x%x clone 0x%x\n", this, ASE);
+ //fprintf(stderr, "ASE clone() this 0x%x clone 0x%x\n", this, ASE);
ASE->isFromSourceFile = isFromSourceFile;
- if (filename) ASE->filename = strdup(filename);
+ if (filename) ASE->filename = strdup(filename);
return ASE;
}
-void chillAST_ArraySubscriptExpr::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool writtento ) {
- //fprintf(stderr, "chillAST_ArraySubscriptExpr::gatherArrayRefs setting imwrittento %d for ", writtento);
-//fprintf(stderr, "%s ", base->getTypeString());
-//base->print(); printf("\n"); fflush(stdout);
+void chillAST_ArraySubscriptExpr::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool writtento) {
+ //fprintf(stderr, "chillAST_ArraySubscriptExpr::gatherArrayRefs setting imwrittento %d for ", writtento);
+//fprintf(stderr, "%s ", base->getTypeString());
+//base->print(); printf("\n"); fflush(stdout);
//fprintf(stderr, "found an array subscript. &refs 0x%x ", refs);
- if (!imwrittento) imwrittento = writtento; // may be both written and not for +=
- fflush(stdout);
+ if (!imwrittento) imwrittento = writtento; // may be both written and not for +=
+ fflush(stdout);
//fprintf(stderr, "recursing on index "); index->print(0,stderr); fprintf(stderr, "\n");
- index->gatherArrayRefs( refs, 0 ); // recurse first
- //fprintf(stderr, "adding this "); print(0,stderr); fprintf(stderr, "\n");
- //fprintf(stderr, "refs[%d] = 0x%x = ", refs.size(), this); print(); fflush(stdout);
- refs.push_back( this );
+ index->gatherArrayRefs(refs, 0); // recurse first
+ //fprintf(stderr, "adding this "); print(0,stderr); fprintf(stderr, "\n");
+ //fprintf(stderr, "refs[%d] = 0x%x = ", refs.size(), this); print(); fflush(stdout);
+ refs.push_back(this);
- //fprintf(stderr, " size now %d\n", refs.size());
+ //fprintf(stderr, " size now %d\n", refs.size());
}
-void chillAST_ArraySubscriptExpr::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- index->gatherScalarRefs( refs, 0 );
-}
+void chillAST_ArraySubscriptExpr::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ index->gatherScalarRefs(refs, 0);
+}
-void chillAST_ArraySubscriptExpr::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- //fprintf(stderr, "chillAST_ArraySubscriptExpr::gatherVarDecls()\n");
+void chillAST_ArraySubscriptExpr::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ //fprintf(stderr, "chillAST_ArraySubscriptExpr::gatherVarDecls()\n");
- base->gatherVarDecls( decls );
- index->gatherVarDecls( decls );
+ base->gatherVarDecls(decls);
+ index->gatherVarDecls(decls);
}
-void chillAST_ArraySubscriptExpr::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
+void chillAST_ArraySubscriptExpr::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
//fprintf(stderr, "chillAST_ArraySubscriptExpr::gatherScalarVarDecls()\n");
- //fprintf(stderr, "base %s index %s\n", base->getTypeString(), index->getTypeString());
- base->gatherScalarVarDecls( decls );
- index->gatherScalarVarDecls( decls );
+ //fprintf(stderr, "base %s index %s\n", base->getTypeString(), index->getTypeString());
+ base->gatherScalarVarDecls(decls);
+ index->gatherScalarVarDecls(decls);
}
-void chillAST_ArraySubscriptExpr::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
+void chillAST_ArraySubscriptExpr::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
//fprintf(stderr, "chillAST_ArraySubscriptExpr::gatherArrayVarDecls()\n");
- //fprintf(stderr, "base %s index %s\n", base->getTypeString(), index->getTypeString());
- base->gatherArrayVarDecls( decls );
- index->gatherArrayVarDecls( decls );
+ //fprintf(stderr, "base %s index %s\n", base->getTypeString(), index->getTypeString());
+ base->gatherArrayVarDecls(decls);
+ index->gatherArrayVarDecls(decls);
}
-void chillAST_ArraySubscriptExpr::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- base->gatherDeclRefExprs( refs );
- index->gatherDeclRefExprs( refs );
+void chillAST_ArraySubscriptExpr::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ base->gatherDeclRefExprs(refs);
+ index->gatherDeclRefExprs(refs);
}
-void chillAST_ArraySubscriptExpr::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- base->gatherVarUsage( decls );
- index->gatherVarUsage( decls );
+void chillAST_ArraySubscriptExpr::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ base->gatherVarUsage(decls);
+ index->gatherVarUsage(decls);
}
-void chillAST_ArraySubscriptExpr::replaceVarDecls( chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl){
- base->replaceVarDecls( olddecl, newdecl );
- index->replaceVarDecls( olddecl, newdecl );
+void chillAST_ArraySubscriptExpr::replaceVarDecls(chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
+ base->replaceVarDecls(olddecl, newdecl);
+ index->replaceVarDecls(olddecl, newdecl);
}
-void chillAST_ArraySubscriptExpr::replaceChild( chillAST_node *old, chillAST_node *newchild ) {
- //fprintf(stderr,"chillAST_ArraySubscriptExpr::replaceChild()\n");
+void chillAST_ArraySubscriptExpr::replaceChild(chillAST_node *old, chillAST_node *newchild) {
+ //fprintf(stderr,"chillAST_ArraySubscriptExpr::replaceChild()\n");
// arraysubscriptexpression doesn t really have children (should it?)
// try index ???
- if (old == index) {
+ if (old == index) {
//fprintf(stderr, "old is index\n");
index = newchild;
index->parent = this;
return;
}
-
- // try base ??? unclear if this makes sense TODO
- if (old == base) {
+
+ // try base ??? unclear if this makes sense TODO
+ if (old == base) {
//fprintf(stderr, "old is base\n");
base = newchild;
base->parent = this;
return;
}
-
- fprintf(stderr, "chillAST_ArraySubscriptExpr::replaceChild() old is not base or index\n");
- print(0,stderr); fprintf(stderr, "\nchild: ");
+
+ fprintf(stderr, "chillAST_ArraySubscriptExpr::replaceChild() old is not base or index\n");
+ print(0, stderr);
+ fprintf(stderr, "\nchild: ");
if (!old) fprintf(stderr, "oldchild NULL!\n");
- old->print(0,stderr); fprintf(stderr, "\nnew: ");
- newchild->print(0,stderr); fprintf(stderr, "\n");
- segfault(); // make easier for gdb
+ old->print(0, stderr);
+ fprintf(stderr, "\nnew: ");
+ newchild->print(0, stderr);
+ fprintf(stderr, "\n");
+ exit(-1); // make easier for gdb
};
-bool chillAST_ArraySubscriptExpr::operator!=( const chillAST_ArraySubscriptExpr &other) {
+bool chillAST_ArraySubscriptExpr::operator!=(const chillAST_ArraySubscriptExpr &other) {
bool opposite = *this == other;
return !opposite;
}
-
-bool chillAST_ArraySubscriptExpr::operator==( const chillAST_ArraySubscriptExpr &other) {
+bool chillAST_ArraySubscriptExpr::operator==(const chillAST_ArraySubscriptExpr &other) {
//fprintf(stderr, "chillAST_ArraySubscriptExpr::operator==\n");
//fprintf(stderr, "this->basedecl 0x%x other.basedecl 0x%x\n", this->basedecl, other.basedecl);
//this->basedecl->print(); printf("\n\n");
//other.basedecl->print(); printf("\n"); fflush(stdout);
- //this->print(); printf(" 0x%x == 0x%x ",this->uniquePtr, other.uniquePtr ); other.print(); printf(" ?? "); fflush(stdout);
- //if ( this->uniquePtr == other.uniquePtr) fprintf(stderr, "t\n");
- //else fprintf(stderr, "f\n");
- return this->uniquePtr == other.uniquePtr;
+ //this->print(); printf(" 0x%x == 0x%x ",this->uniquePtr, other.uniquePtr ); other.print(); printf(" ?? "); fflush(stdout);
+ //if ( this->uniquePtr == other.uniquePtr) fprintf(stderr, "t\n");
+ //else fprintf(stderr, "f\n");
+ return this->uniquePtr == other.uniquePtr;
}
-
-
-
-chillAST_MemberExpr::chillAST_MemberExpr() {
- asttype = CHILLAST_NODETYPE_MEMBEREXPR;
+chillAST_MemberExpr::chillAST_MemberExpr() {
+ asttype = CHILLAST_NODETYPE_MEMBEREXPR;
base = NULL;
member = NULL;
parent = NULL;
metacomment = NULL;
- exptype = CHILL_MEMBER_EXP_DOT;
- isFromSourceFile = true; // default
+ exptype = CHILL_MEMBER_EXP_DOT;
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_MemberExpr::chillAST_MemberExpr( chillAST_node *bas, const char *mem, chillAST_node *p, void *unique, CHILL_MEMBER_EXP_TYPE t ) {
- asttype = CHILLAST_NODETYPE_MEMBEREXPR;
+chillAST_MemberExpr::chillAST_MemberExpr(chillAST_node *bas, const char *mem, chillAST_node *p, void *unique,
+ CHILL_MEMBER_EXP_TYPE t) {
+ asttype = CHILLAST_NODETYPE_MEMBEREXPR;
base = bas;
- if (base) base->setParent( this );
- if (mem) member = strdup( mem );
+ if (base) base->setParent(this);
+ if (mem) member = strdup(mem);
parent = p;
metacomment = NULL;
uniquePtr = unique;
exptype = t;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
- return; // ignore tests below ?? TODO ??
+ return; // ignore tests below ?? TODO ??
// base needs to RESOLVE to a decl ref expr but may not BE one
// A.b . c lhs is a binop or memberexpr
- if (bas->isBinaryOperator()) {
+ if (bas->isBinaryOperator()) {
//fprintf(stderr, "checking binop to see if it resolved to a declrefexpr\n");
// cheat for now or just remove the check below
- return;
+ return;
}
- if (! ( bas->isDeclRefExpr() || bas->isArraySubscriptExpr() )) {
+ if (!(bas->isDeclRefExpr() || bas->isArraySubscriptExpr())) {
fprintf(stderr, "chillAST_MemberExpr::chillAST_MemberExpr(), base is of type %s\n", bas->getTypeString());
fprintf(stderr, "chillAST_MemberExpr::chillAST_MemberExpr(), base is not DeclRefExpr\n");
-
- base->print(); printf(".%s\n", mem); fflush(stdout);
- segfault();
+
+ base->print();
+ printf(".%s\n", mem);
+ fflush(stdout);
+ exit(-1);
}
}
-void chillAST_MemberExpr::dump( int indent, FILE *fp ) {
+void chillAST_MemberExpr::dump(int indent, FILE *fp) {
chillindent(indent, fp);
- fprintf(fp, "(MemberExpr \n");
+ fprintf(fp, "(MemberExpr \n");
- base->dump( indent+1, fp );
- chillindent(indent+1, fp);
+ base->dump(indent + 1, fp);
+ chillindent(indent + 1, fp);
if (exptype == CHILL_MEMBER_EXP_ARROW) fprintf(fp, "->");
- else fprintf(fp, ".");
-
- fprintf(fp, "%s\n", member);
+ else fprintf(fp, ".");
+
+ fprintf(fp, "%s\n", member);
chillindent(indent, fp);
fprintf(fp, ")\n");
}
-void chillAST_MemberExpr::print( int indent, FILE *fp ) {
- if (base) base->print( indent, fp );
+void chillAST_MemberExpr::print(int indent, FILE *fp) {
+ if (base) base->print(indent, fp);
else {
- chillindent( indent, fp );
- fprintf(fp, "(NULL)");
+ chillindent(indent, fp);
+ fprintf(fp, "(NULL)");
}
if (exptype == CHILL_MEMBER_EXP_ARROW) fprintf(fp, "->");
- else fprintf(fp, ".");
+ else fprintf(fp, ".");
if (member) fprintf(fp, "%s", member);
- else fprintf(fp, "(NULL)");
- fflush(fp);
+ else fprintf(fp, "(NULL)");
+ fflush(fp);
}
-void chillAST_MemberExpr::printonly( int indent, FILE *fp ) {
- base->print( indent, fp );
+void chillAST_MemberExpr::printonly(int indent, FILE *fp) {
+ base->print(indent, fp);
if (exptype == CHILL_MEMBER_EXP_ARROW) fprintf(fp, "->");
- else fprintf(fp, ".");
+ else fprintf(fp, ".");
fprintf(fp, "%s", member);
- fflush(fp);
+ fflush(fp);
}
-char *chillAST_MemberExpr::stringRep( int indent ) { // char pointer to what we'd print
- fprintf(stderr, "*chillAST_MemberExpr::stringRep()\n");
- if (base->isDeclRefExpr()) { //
- chillAST_VarDecl *vd = (chillAST_VarDecl *) ((chillAST_DeclRefExpr *)base)->decl;
- char *leak = (char *)malloc(128);
+char *chillAST_MemberExpr::stringRep(int indent) { // char pointer to what we'd print
+ fprintf(stderr, "*chillAST_MemberExpr::stringRep()\n");
+ if (base->isDeclRefExpr()) { //
+ chillAST_VarDecl *vd = (chillAST_VarDecl *) ((chillAST_DeclRefExpr *) base)->decl;
+ char *leak = (char *) malloc(128);
if (exptype == CHILL_MEMBER_EXP_ARROW) sprintf(leak, "%s->%s", vd->varname, member);
else sprintf(leak, "%s.%s", vd->varname, member);
- printstring = leak;
+ printstring = leak;
return leak;
}
- // else
- // TODO
- return strdup("chillAST_MemberExpr::getStringRep()hadanerror");
+ // else
+ // TODO
+ return strdup("chillAST_MemberExpr::getStringRep()hadanerror");
}
-class chillAST_node* chillAST_MemberExpr::constantFold() {
- base = base->constantFold();
+class chillAST_node *chillAST_MemberExpr::constantFold() {
+ base = base->constantFold();
//member = member->constantFold();
return this;
}
-class chillAST_node* chillAST_MemberExpr::clone() {
- chillAST_node *b = base->clone();
- char *m = strdup( member ); // ??
- chillAST_MemberExpr *ME = new chillAST_MemberExpr( b, m, parent, uniquePtr /* ?? */ );
+class chillAST_node *chillAST_MemberExpr::clone() {
+ chillAST_node *b = base->clone();
+ char *m = strdup(member); // ??
+ chillAST_MemberExpr *ME = new chillAST_MemberExpr(b, m, parent, uniquePtr /* ?? */ );
ME->isFromSourceFile = isFromSourceFile;
- if (filename) ME->filename = strdup(filename);
+ if (filename) ME->filename = strdup(filename);
return ME;
}
-void chillAST_MemberExpr::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool writtento ) {
- fprintf(stderr, "chillAST_MemberExpr::gatherArrayRefs() "); print(0,stderr); fprintf(stderr, "\n");
- fprintf(stderr, "base of of type %s\n", base->getTypeString());
- base->gatherArrayRefs( refs, writtento ); //
-
+void chillAST_MemberExpr::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool writtento) {
+ fprintf(stderr, "chillAST_MemberExpr::gatherArrayRefs() ");
+ print(0, stderr);
+ fprintf(stderr, "\n");
+ fprintf(stderr, "base of of type %s\n", base->getTypeString());
+ base->gatherArrayRefs(refs, writtento); //
+
}
-void chillAST_MemberExpr::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- base->gatherScalarRefs( refs, writtento );
-}
+void chillAST_MemberExpr::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ base->gatherScalarRefs(refs, writtento);
+}
-void chillAST_MemberExpr::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- base->gatherVarDecls( decls );
+void chillAST_MemberExpr::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ base->gatherVarDecls(decls);
}
-void chillAST_MemberExpr::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- base->gatherScalarVarDecls( decls );
+void chillAST_MemberExpr::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ base->gatherScalarVarDecls(decls);
}
-void chillAST_MemberExpr::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- base->gatherArrayVarDecls( decls );
+void chillAST_MemberExpr::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ base->gatherArrayVarDecls(decls);
}
-void chillAST_MemberExpr::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- base->gatherDeclRefExprs( refs );
+void chillAST_MemberExpr::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ base->gatherDeclRefExprs(refs);
}
-void chillAST_MemberExpr::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- base->gatherVarUsage( decls );
+void chillAST_MemberExpr::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ base->gatherVarUsage(decls);
}
-void chillAST_MemberExpr::replaceVarDecls( chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl){
- base->replaceVarDecls( olddecl, newdecl );
+void chillAST_MemberExpr::replaceVarDecls(chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
+ base->replaceVarDecls(olddecl, newdecl);
}
-bool chillAST_MemberExpr::operator!=( const chillAST_MemberExpr &other) {
+bool chillAST_MemberExpr::operator!=(const chillAST_MemberExpr &other) {
bool opposite = *this == other;
return !opposite;
}
-bool chillAST_MemberExpr::operator==( const chillAST_MemberExpr &other) {
- return this->uniquePtr == other.uniquePtr;
+bool chillAST_MemberExpr::operator==(const chillAST_MemberExpr &other) {
+ return this->uniquePtr == other.uniquePtr;
}
-void chillAST_MemberExpr::replaceChild( chillAST_node *old, chillAST_node *newchild ) {
+void chillAST_MemberExpr::replaceChild(chillAST_node *old, chillAST_node *newchild) {
//printf("\nMemberExpr::replaceChild( )\n");
- //printf("old: ");
- //old->print();
- //printf("\nnew: ");
- //newchild->print();
- //printf("\n"); fflush(stdout);
+ //printf("old: ");
+ //old->print();
+ //printf("\nnew: ");
+ //newchild->print();
+ //printf("\n"); fflush(stdout);
// will pointers match??
- if (base == old) {
- //fprintf(stderr, "old matches base of MemberExpr\n");
- base = newchild;
- }
- else {
- base->replaceChild( old, newchild );
+ if (base == old) {
+ //fprintf(stderr, "old matches base of MemberExpr\n");
+ base = newchild;
+ } else {
+ base->replaceChild(old, newchild);
}
-}
+}
-chillAST_node *chillAST_MemberExpr::multibase2() { /*fprintf(stderr, "ME MB2\n" );*/ return (chillAST_node *)this; }
+chillAST_node *chillAST_MemberExpr::multibase2() { /*fprintf(stderr, "ME MB2\n" );*/ return (chillAST_node *) this; }
-chillAST_VarDecl* chillAST_MemberExpr::getUnderlyingVarDecl() {
+chillAST_VarDecl *chillAST_MemberExpr::getUnderlyingVarDecl() {
fprintf(stderr, "chillAST_MemberExpr:getUnderlyingVarDecl()\n");
- print(); printf("\n"); fflush(stdout);
- exit(-1);
+ print();
+ printf("\n");
+ fflush(stdout);
+ exit(-1);
// find the member with the correct name
-
-}
-
+}
chillAST_VarDecl *chillAST_MemberExpr::multibase() {
- //c.i[c.count] we want i member of c
- //fprintf(stderr, "ME MB\n" );
+ //c.i[c.count] we want i member of c
+ //fprintf(stderr, "ME MB\n" );
//fprintf(stderr, "chillAST_MemberExpr::multibase()\n");
//print(); printf("\n"); fflush(stdout);
//fprintf(stderr, "MemberExpr base is type %s, member %s\n", base->getTypeString(), member);
-
- //chillAST_VarDecl *vd = base->getUnderlyingVarDecl(); // this is the only thing that ever calls this ???
- chillAST_VarDecl *vd = base->multibase(); // ??
+
+ //chillAST_VarDecl *vd = base->getUnderlyingVarDecl(); // this is the only thing that ever calls this ???
+ chillAST_VarDecl *vd = base->multibase(); // ??
//fprintf(stderr, "vd "); vd->print(); printf("\n"); fflush(stdout);
-
+
chillAST_RecordDecl *rd = vd->getStructDef();
- if (!rd) {
+ if (!rd) {
fprintf(stderr, "chillAST_MemberExpr::multibase() vardecl is not a struct??\n");
- fprintf(stderr, "vd "); vd->print(); printf("\n"); fflush(stdout);
- fprintf(stderr, "vd "); vd->dump(); printf("\n"); fflush(stdout);
+ fprintf(stderr, "vd ");
+ vd->print();
+ printf("\n");
+ fflush(stdout);
+ fprintf(stderr, "vd ");
+ vd->dump();
+ printf("\n");
+ fflush(stdout);
exit(-1);
}
// OK, we have the recorddecl that defines the structure
// now find the member with the correct name
- chillAST_VarDecl *sub = rd->findSubpart( member );
+ chillAST_VarDecl *sub = rd->findSubpart(member);
//fprintf(stderr, "sub %s:\n", member);
- if (!sub) {
+ if (!sub) {
fprintf(stderr, "can't find member %s in \n", member);
- rd->print();
+ rd->print();
}
//sub->print(); printf("\n"); fflush(stdout);
//sub->dump() ; printf("\n"); fflush(stdout);
- return sub;
+ return sub;
//find vardecl of member in def of base
-
-}
-
+}
-chillAST_DeclRefExpr::chillAST_DeclRefExpr() {
- asttype = CHILLAST_NODETYPE_DECLREFEXPR;
- declarationType = strdup("UNKNOWN");
+chillAST_DeclRefExpr::chillAST_DeclRefExpr() {
+ asttype = CHILLAST_NODETYPE_DECLREFEXPR;
+ declarationType = strdup("UNKNOWN");
declarationName = strdup("NONE");
- decl = NULL;
+ decl = NULL;
parent = NULL;
metacomment = NULL;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_DeclRefExpr::chillAST_DeclRefExpr( const char *varname, chillAST_node *par ) {
- asttype = CHILLAST_NODETYPE_DECLREFEXPR;
- declarationType = strdup("UNKNOWN");
- declarationName = strdup(varname);
- decl = NULL;
- parent = par;
- isFromSourceFile = true; // default
+chillAST_DeclRefExpr::chillAST_DeclRefExpr(const char *varname, chillAST_node *par) {
+ asttype = CHILLAST_NODETYPE_DECLREFEXPR;
+ declarationType = strdup("UNKNOWN");
+ declarationName = strdup(varname);
+ decl = NULL;
+ parent = par;
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_DeclRefExpr::chillAST_DeclRefExpr( const char *vartype, const char *varname, chillAST_node *par) {
- //fprintf(stderr, "DRE::DRE 0x%x %s %s\n", this, vartype, varname );
- asttype = CHILLAST_NODETYPE_DECLREFEXPR;
- declarationType = strdup(vartype);
- declarationName = strdup(varname);
- decl = NULL;
- parent = par;
- isFromSourceFile = true; // default
+chillAST_DeclRefExpr::chillAST_DeclRefExpr(const char *vartype, const char *varname, chillAST_node *par) {
+ //fprintf(stderr, "DRE::DRE 0x%x %s %s\n", this, vartype, varname );
+ asttype = CHILLAST_NODETYPE_DECLREFEXPR;
+ declarationType = strdup(vartype);
+ declarationName = strdup(varname);
+ decl = NULL;
+ parent = par;
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_DeclRefExpr::chillAST_DeclRefExpr( const char *vartype, const char *varname, chillAST_node *d, chillAST_node *par ) {
- //fprintf(stderr, "DRE::DRE2 0x%x %s %s 0x%x\n", this, vartype, varname, d );
- asttype = CHILLAST_NODETYPE_DECLREFEXPR;
- declarationType = strdup(vartype);
- declarationName = strdup(varname);
- decl = d;
- parent = par;
- isFromSourceFile = true; // default
+chillAST_DeclRefExpr::chillAST_DeclRefExpr(const char *vartype, const char *varname, chillAST_node *d,
+ chillAST_node *par) {
+ //fprintf(stderr, "DRE::DRE2 0x%x %s %s 0x%x\n", this, vartype, varname, d );
+ asttype = CHILLAST_NODETYPE_DECLREFEXPR;
+ declarationType = strdup(vartype);
+ declarationName = strdup(varname);
+ decl = d;
+ parent = par;
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_DeclRefExpr::chillAST_DeclRefExpr( chillAST_VarDecl *vd, chillAST_node *par ){ // variable def
- //fprintf(stderr, "DRE::DRE3 (VD) 0x%x %s %s 0x%x\n", this, vd->vartype, vd->varname, vd );
-
- asttype = CHILLAST_NODETYPE_DECLREFEXPR;
- declarationType = strdup(vd->vartype);
- declarationName = strdup(vd->varname);
- decl = vd;
+chillAST_DeclRefExpr::chillAST_DeclRefExpr(chillAST_VarDecl *vd, chillAST_node *par) { // variable def
+ //fprintf(stderr, "DRE::DRE3 (VD) 0x%x %s %s 0x%x\n", this, vd->vartype, vd->varname, vd );
+
+ asttype = CHILLAST_NODETYPE_DECLREFEXPR;
+ declarationType = strdup(vd->vartype);
+ declarationName = strdup(vd->varname);
+ decl = vd;
parent = par;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_DeclRefExpr::chillAST_DeclRefExpr( chillAST_FunctionDecl *fd, chillAST_node *par ){ // function def
- asttype = CHILLAST_NODETYPE_DECLREFEXPR;
- declarationType = strdup(fd->returnType);
- declarationName = strdup(fd->functionName);
- decl = fd;
+chillAST_DeclRefExpr::chillAST_DeclRefExpr(chillAST_FunctionDecl *fd, chillAST_node *par) { // function def
+ asttype = CHILLAST_NODETYPE_DECLREFEXPR;
+ declarationType = strdup(fd->returnType);
+ declarationName = strdup(fd->functionName);
+ decl = fd;
parent = par;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
}
+chillAST_DeclRefExpr *buildDeclRefExpr(chillAST_VarDecl *vd) {
+ chillAST_DeclRefExpr *dre = new chillAST_DeclRefExpr(vd, NULL);
-chillAST_DeclRefExpr *buildDeclRefExpr( chillAST_VarDecl *vd) {
- chillAST_DeclRefExpr *dre = new chillAST_DeclRefExpr( vd, NULL );
-
}
-void chillAST_DeclRefExpr::print( int indent, FILE *fp) {
+void chillAST_DeclRefExpr::print(int indent, FILE *fp) {
chillindent(indent, fp);
- //fprintf(fp, "%s %s", declarationType, declarationName); // this is printing float *A
- fprintf(fp, "%s", declarationName); // this is printing A
- fflush(fp);
+ //fprintf(fp, "%s %s", declarationType, declarationName); // this is printing float *A
+ fprintf(fp, "%s", declarationName); // this is printing A
+ fflush(fp);
}
-char *chillAST_DeclRefExpr::stringRep( int indent ) {
- return strdup( declarationName );
+char *chillAST_DeclRefExpr::stringRep(int indent) {
+ return strdup(declarationName);
}
-void chillAST_DeclRefExpr::dump( int indent, FILE *fp) {
+void chillAST_DeclRefExpr::dump(int indent, FILE *fp) {
chillindent(indent, fp);
- fprintf(fp, "(DeclRefExpr '%s' ", declarationType);
+ fprintf(fp, "(DeclRefExpr '%s' ", declarationType);
chillAST_VarDecl *vd = getVarDecl();
- if (vd) {
+ if (vd) {
if (vd->isAParameter) fprintf(fp, "ParmVar ");
else fprintf(fp, "Var ");
}
- fprintf(fp, "'%s' ", declarationName); // variable or function name
+ fprintf(fp, "'%s' ", declarationName); // variable or function name
- if (chillAST_FunctionDecl *fd = getFunctionDecl()) {
- // print parameter types for functions
- fd->printParameterTypes( fp );
+ if (chillAST_FunctionDecl *fd = getFunctionDecl()) {
+ // print parameter types for functions
+ fd->printParameterTypes(fp);
}
-
- fprintf(fp, ")\n");
- fflush(fp);
+
+ fprintf(fp, ")\n");
+ fflush(fp);
}
-class chillAST_node* chillAST_DeclRefExpr::constantFold() { // can never do anything?
+class chillAST_node *chillAST_DeclRefExpr::constantFold() { // can never do anything?
return this;
}
-class chillAST_node* chillAST_DeclRefExpr::clone() {
- //fprintf(stderr, "chillAST_DeclRefExpr::clone()\n");
- chillAST_DeclRefExpr *DRE = new chillAST_DeclRefExpr( declarationType, declarationName, decl, parent );
+class chillAST_node *chillAST_DeclRefExpr::clone() {
+ //fprintf(stderr, "chillAST_DeclRefExpr::clone()\n");
+ chillAST_DeclRefExpr *DRE = new chillAST_DeclRefExpr(declarationType, declarationName, decl, parent);
DRE->isFromSourceFile = isFromSourceFile;
- if (filename) DRE->filename = strdup(filename);
+ if (filename) DRE->filename = strdup(filename);
return DRE;
}
-void chillAST_DeclRefExpr::gatherVarDeclsMore( vector<chillAST_VarDecl*> &decls ) {
- //fprintf(stderr, "chillAST_DeclRefExpr::gatherVarDeclsMore()\n");
- decl->gatherVarDeclsMore( decls );
+void chillAST_DeclRefExpr::gatherVarDeclsMore(vector<chillAST_VarDecl *> &decls) {
+ //fprintf(stderr, "chillAST_DeclRefExpr::gatherVarDeclsMore()\n");
+ decl->gatherVarDeclsMore(decls);
}
-void chillAST_DeclRefExpr::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- //fprintf(stderr, "chillAST_DeclRefExpr::gatherScalarVarDecls()\n");
- decl->gatherScalarVarDecls(decls);
- //fprintf(stderr, "now %d scalar vardecls\n", decls.size());
+void chillAST_DeclRefExpr::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ //fprintf(stderr, "chillAST_DeclRefExpr::gatherScalarVarDecls()\n");
+ decl->gatherScalarVarDecls(decls);
+ //fprintf(stderr, "now %d scalar vardecls\n", decls.size());
}
-void chillAST_DeclRefExpr::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- //fprintf(stderr, "chillAST_DeclRefExpr::gatherArrayVarDecls()\n");
- decl->gatherArrayVarDecls(decls);
- //fprintf(stderr, "now %d Array vardecls\n", decls.size());
+void chillAST_DeclRefExpr::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ //fprintf(stderr, "chillAST_DeclRefExpr::gatherArrayVarDecls()\n");
+ decl->gatherArrayVarDecls(decls);
+ //fprintf(stderr, "now %d Array vardecls\n", decls.size());
}
-void chillAST_DeclRefExpr::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- refs.push_back(this);
+void chillAST_DeclRefExpr::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ refs.push_back(this);
}
-void chillAST_DeclRefExpr::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- refs.push_back(this);
-}
+void chillAST_DeclRefExpr::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ refs.push_back(this);
+}
-void chillAST_DeclRefExpr::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- //fprintf(stderr, "chillAST_DeclRefExpr::gatherVarUsage()\n");
- for (int i=0; i<decls.size(); i++) {
- if (decls[i] == decl) {
+void chillAST_DeclRefExpr::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ //fprintf(stderr, "chillAST_DeclRefExpr::gatherVarUsage()\n");
+ for (int i = 0; i < decls.size(); i++) {
+ if (decls[i] == decl) {
//fprintf(stderr, "decl was already there\n");
return;
}
- if (streq(declarationName, decls[i]->varname)) {
- if (streq(declarationType, decls[i]->vartype)) {
+ if (streq(declarationName, decls[i]->varname)) {
+ if (streq(declarationType, decls[i]->vartype)) {
//fprintf(stderr, "decl was already there\n");
return;
}
}
}
chillAST_VarDecl *vd = getVarDecl(); // null for functiondecl
- if (vd) decls.push_back( vd );
+ if (vd) decls.push_back(vd);
}
-
-
-void chillAST_DeclRefExpr::replaceVarDecls( chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl){
- //fprintf(stderr, "chillAST_DeclRefExpr::replaceVarDecls()\n");
- if (decl == olddecl) {
+void chillAST_DeclRefExpr::replaceVarDecls(chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
+ //fprintf(stderr, "chillAST_DeclRefExpr::replaceVarDecls()\n");
+ if (decl == olddecl) {
//fprintf(stderr, "replacing old %s with %s\n", olddecl->varname, newdecl->varname);
- //fprintf(stderr, "DRE was "); print();
- decl = newdecl;
- declarationType = strdup(newdecl->vartype);
- declarationName = strdup(newdecl->varname);
- //fprintf(stderr, "\nDRE is "); print(); fprintf(stderr, "\n\n");
- }
- else {
- if (!strcmp(olddecl->varname, declarationName)) {
- //fprintf(stderr, "uhoh, chillAST_DeclRefExpr::replaceVarDecls()\n");
- decl = newdecl;
- declarationType = strdup(newdecl->vartype);
- declarationName = strdup(newdecl->varname);
+ //fprintf(stderr, "DRE was "); print();
+ decl = newdecl;
+ declarationType = strdup(newdecl->vartype);
+ declarationName = strdup(newdecl->varname);
+ //fprintf(stderr, "\nDRE is "); print(); fprintf(stderr, "\n\n");
+ } else {
+ if (!strcmp(olddecl->varname, declarationName)) {
+ //fprintf(stderr, "uhoh, chillAST_DeclRefExpr::replaceVarDecls()\n");
+ decl = newdecl;
+ declarationType = strdup(newdecl->vartype);
+ declarationName = strdup(newdecl->varname);
}
}
}
@@ -3749,797 +3716,771 @@ chillAST_VarDecl *chillAST_DeclRefExpr::multibase() {
}
-
-
-
-
-
-
-
-void chillAST_VarDecl::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- //fprintf(stderr, "chillAST_VarDecl::gatherVarDecls()\n");
- for (int i=0; i<decls.size(); i++) {
- if (decls[i] == this) {
+void chillAST_VarDecl::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ //fprintf(stderr, "chillAST_VarDecl::gatherVarDecls()\n");
+ for (int i = 0; i < decls.size(); i++) {
+ if (decls[i] == this) {
//fprintf(stderr, "decl was already there\n");
return;
}
- if (streq(decls[i]->varname, varname)) {
- if (streq(decls[i]->vartype, vartype)) {
+ if (streq(decls[i]->varname, varname)) {
+ if (streq(decls[i]->vartype, vartype)) {
//fprintf(stderr, "VarDecl (direct) decl was already there\n");
return;
}
}
}
- decls.push_back( this );
+ decls.push_back(this);
}
-void chillAST_VarDecl::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- //fprintf(stderr, "chillAST_VarDecl::gatherScalarVarDecls(), %s numdimensions %d\n", varname, numdimensions);
+void chillAST_VarDecl::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ //fprintf(stderr, "chillAST_VarDecl::gatherScalarVarDecls(), %s numdimensions %d\n", varname, numdimensions);
if (numdimensions != 0) return; // not a scalar
-
- for (int i=0; i<decls.size(); i++) {
- if (decls[i] == this) {
+
+ for (int i = 0; i < decls.size(); i++) {
+ if (decls[i] == this) {
//fprintf(stderr, "decl was already there\n");
return;
}
if (streq(decls[i]->varname, varname)) { // wrong. scoping. TODO
- if (streq(decls[i]->vartype, vartype)) {
+ if (streq(decls[i]->vartype, vartype)) {
//fprintf(stderr, "VarDecl (direct) decl was already there\n");
return;
}
}
}
- //fprintf(stderr, "adding vardecl for %s to decls\n", varname);
- decls.push_back( this );
+ //fprintf(stderr, "adding vardecl for %s to decls\n", varname);
+ decls.push_back(this);
}
-void chillAST_VarDecl::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- //fprintf(stderr, "chillAST_VarDecl::gatherScalarVarDecls(), %s numdimensions %d\n", varname, numdimensions);
+void chillAST_VarDecl::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ //fprintf(stderr, "chillAST_VarDecl::gatherScalarVarDecls(), %s numdimensions %d\n", varname, numdimensions);
if (numdimensions == 0) return; // not an array
-
- for (int i=0; i<decls.size(); i++) {
- if (decls[i] == this) {
+
+ for (int i = 0; i < decls.size(); i++) {
+ if (decls[i] == this) {
//fprintf(stderr, "decl was already there\n");
return;
}
if (streq(decls[i]->varname, varname)) { // wrong. scoping. TODO
- if (streq(decls[i]->vartype, vartype)) {
+ if (streq(decls[i]->vartype, vartype)) {
//fprintf(stderr, "VarDecl (direct) decl was already there\n");
return;
}
}
}
- //fprintf(stderr, "adding vardecl for %s to decls\n", varname);
- decls.push_back( this );
+ //fprintf(stderr, "adding vardecl for %s to decls\n", varname);
+ decls.push_back(this);
}
+chillAST_node *chillAST_VarDecl::constantFold() { return this; }
-chillAST_node *chillAST_VarDecl::constantFold() { return this; }
-
-chillAST_node* chillAST_VarDecl::clone() {
- fprintf(stderr, "\nchillAST_VarDecl::clone() cloning vardecl for %s\n", varname);
+chillAST_node *chillAST_VarDecl::clone() {
+ fprintf(stderr, "\nchillAST_VarDecl::clone() cloning vardecl for %s\n", varname);
if (isAParameter) fprintf(stderr, "old vardecl IS a parameter\n");
//else fprintf(stderr, "old vardecl IS NOT a parameter\n");
- chillAST_VarDecl *vd = new chillAST_VarDecl( vartype, strdup(varname), arraypart, NULL); // NULL so we don't add the variable AGAIN to the (presumably) function
-
+ chillAST_VarDecl *vd = new chillAST_VarDecl(vartype, strdup(varname), arraypart,
+ NULL); // NULL so we don't add the variable AGAIN to the (presumably) function
+
vd->typedefinition = typedefinition;
- vd->vardef = vardef; // perhaps should not do this TODO
+ vd->vardef = vardef; // perhaps should not do this TODO
//vd->isStruct = (vardef != NULL); // ??
-
- vd->underlyingtype = strdup(underlyingtype);
+
+ vd->underlyingtype = strdup(underlyingtype);
vd->arraysizes = NULL;
- vd->knownArraySizes = knownArraySizes;
+ vd->knownArraySizes = knownArraySizes;
vd->numdimensions = numdimensions;
vd->arraypointerpart = NULL;
- if (arraypart != NULL && NULL!=arraysizes) { // !strcmp(arraypart, "")) {
+ if (arraypart != NULL && NULL != arraysizes) { // !strcmp(arraypart, "")) {
//fprintf(stderr, "in chillAST_VarDecl::clone(), cloning the array info\n");
//fprintf(stderr, "numdimensions %d arraysizes 0x%x\n", numdimensions, arraysizes) ;
vd->numdimensions = numdimensions;
- if (arraysizes) {
- vd->arraysizes = (int *)malloc( sizeof(int *) * numdimensions );
- for (int i=0; i< numdimensions; i++) {
- //fprintf(stderr, "i %d\n", i);
- vd->arraysizes[i] = arraysizes[i];
+ if (arraysizes) {
+ vd->arraysizes = (int *) malloc(sizeof(int *) * numdimensions);
+ for (int i = 0; i < numdimensions; i++) {
+ //fprintf(stderr, "i %d\n", i);
+ vd->arraysizes[i] = arraysizes[i];
}
}
}
- if ( arraypointerpart ) {
- //fprintf(stderr, "copying arraypointerpart\n");
- vd->arraypointerpart = strdup( arraypointerpart);
+ if (arraypointerpart) {
+ //fprintf(stderr, "copying arraypointerpart\n");
+ vd->arraypointerpart = strdup(arraypointerpart);
}
- vd->isStruct = this->isStruct;
- //vd->insideAStruct = this->insideAStruct;
+ vd->isStruct = this->isStruct;
+ //vd->insideAStruct = this->insideAStruct;
- //if (vd->isStruct) fprintf(stderr, "vardecl::clone() %s is a struct\n", varname);
- //else fprintf(stderr, "vardecl::clone() %s is NOT a struct\n", varname);
+ //if (vd->isStruct) fprintf(stderr, "vardecl::clone() %s is a struct\n", varname);
+ //else fprintf(stderr, "vardecl::clone() %s is NOT a struct\n", varname);
- vd->knownArraySizes = this->knownArraySizes;
+ vd->knownArraySizes = this->knownArraySizes;
vd->isFromSourceFile = isFromSourceFile;
- if (filename) vd->filename = strdup(filename);
+ if (filename) vd->filename = strdup(filename);
return vd;
}
-void chillAST_VarDecl::splitarraypart() {
+void chillAST_VarDecl::splitarraypart() {
if (arraypart) CHILL_DEBUG_PRINT("%s\n", arraypart);
// split arraypart into (leading??) asterisks and known sizes [1][2][3]
- if (!arraypart || // NULL
+ if (!arraypart || // NULL
(arraypart && (*arraypart == '\0'))) { // or empty string
// parts are both empty string
if (arraypointerpart) free(arraypointerpart);
arraypointerpart = strdup("");
if (arraysetpart) free(arraysetpart);
- arraysetpart = strdup("");
+ arraysetpart = strdup("");
return;
}
// arraypart exists and is not empty
int asteriskcount = 0;
int fixedcount = 0;
- for ( int i=0; i<strlen(arraypart); i++) {
- if (arraypart[i] == '*') {
+ for (int i = 0; i < strlen(arraypart); i++) {
+ if (arraypart[i] == '*') {
if (fixedcount) {
CHILL_ERROR("illegal vardecl arraypart: '%s'\n", arraypart);
- segfault();
+ exit(-1);
exit(-1);
}
asteriskcount++;
- }
- else { // remainder is fixed?
- fixedcount++;
+ } else { // remainder is fixed?
+ fixedcount++;
// check for brackets and digits only? TODO
}
}
- arraypointerpart = (char *) calloc( asteriskcount+1, sizeof(char));
- arraysetpart = (char *) calloc( fixedcount+1, sizeof(char));
+ arraypointerpart = (char *) calloc(asteriskcount + 1, sizeof(char));
+ arraysetpart = (char *) calloc(fixedcount + 1, sizeof(char));
char *ptr = arraypart;
- for ( int i=0; i<asteriskcount; i++) arraypointerpart[i] = *ptr++;
- for ( int i=0; i<fixedcount; i++) arraysetpart[i] = *ptr++;
+ for (int i = 0; i < asteriskcount; i++) arraypointerpart[i] = *ptr++;
+ for (int i = 0; i < fixedcount; i++) arraysetpart[i] = *ptr++;
- //fprintf(stderr, "%s = %s + %s\n", arraypart, arraypointerpart, arraysetpart);
+ //fprintf(stderr, "%s = %s + %s\n", arraypart, arraypointerpart, arraysetpart);
}
-
-
-
-
-chillAST_IntegerLiteral::chillAST_IntegerLiteral(int val, chillAST_node *par){
- value = val;
+chillAST_IntegerLiteral::chillAST_IntegerLiteral(int val, chillAST_node *par) {
+ value = val;
asttype = CHILLAST_NODETYPE_INTEGERLITERAL;
parent = par;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
}
-void chillAST_IntegerLiteral::print( int indent, FILE *fp) {
+void chillAST_IntegerLiteral::print(int indent, FILE *fp) {
chillindent(indent, fp);
fprintf(fp, "%d", value);
- fflush(fp);
+ fflush(fp);
}
-void chillAST_IntegerLiteral::dump( int indent, FILE *fp) {
+void chillAST_IntegerLiteral::dump(int indent, FILE *fp) {
chillindent(indent, fp);
fprintf(fp, "(IntegerLiteral 'int' %d)\n", value);
- fflush(fp);
+ fflush(fp);
}
+class chillAST_node *chillAST_IntegerLiteral::constantFold() { return this; } // can never do anything
-class chillAST_node* chillAST_IntegerLiteral::constantFold() { return this; } // can never do anything
+class chillAST_node *chillAST_IntegerLiteral::clone() {
-class chillAST_node* chillAST_IntegerLiteral::clone() {
-
- chillAST_IntegerLiteral *IL = new chillAST_IntegerLiteral( value, parent );
- IL->isFromSourceFile = isFromSourceFile;
- if (filename) IL->filename = strdup(filename);
- return IL;
+ chillAST_IntegerLiteral *IL = new chillAST_IntegerLiteral(value, parent);
+ IL->isFromSourceFile = isFromSourceFile;
+ if (filename) IL->filename = strdup(filename);
+ return IL;
}
-
-chillAST_FloatingLiteral::chillAST_FloatingLiteral(float val, chillAST_node *par){
- value = val;
+
+chillAST_FloatingLiteral::chillAST_FloatingLiteral(float val, chillAST_node *par) {
+ value = val;
precision = 1;
- float0double1 = 0; // which is live!
- allthedigits = NULL;
+ float0double1 = 0; // which is live!
+ allthedigits = NULL;
asttype = CHILLAST_NODETYPE_FLOATINGLITERAL;
parent = par;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_FloatingLiteral::chillAST_FloatingLiteral(double val, chillAST_node *par){
- doublevalue = val;
+chillAST_FloatingLiteral::chillAST_FloatingLiteral(double val, chillAST_node *par) {
+ doublevalue = val;
precision = 2;
- float0double1 = 1; // which is live!
- allthedigits = NULL;
+ float0double1 = 1; // which is live!
+ allthedigits = NULL;
asttype = CHILLAST_NODETYPE_FLOATINGLITERAL;
parent = par;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_FloatingLiteral::chillAST_FloatingLiteral(float val, int precis, chillAST_node *par){
- value = val;
+chillAST_FloatingLiteral::chillAST_FloatingLiteral(float val, int precis, chillAST_node *par) {
+ value = val;
precision = 1;
- float0double1 = 0; // which is live!
- precision = precis; //
- allthedigits = NULL;
+ float0double1 = 0; // which is live!
+ precision = precis; //
+ allthedigits = NULL;
asttype = CHILLAST_NODETYPE_FLOATINGLITERAL;
parent = par;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_FloatingLiteral::chillAST_FloatingLiteral(double val, int precis, chillAST_node *par){
- doublevalue = val;
- float0double1 = 1; // which is live!
- precision = precis; //
- allthedigits = NULL;
+chillAST_FloatingLiteral::chillAST_FloatingLiteral(double val, int precis, chillAST_node *par) {
+ doublevalue = val;
+ float0double1 = 1; // which is live!
+ precision = precis; //
+ allthedigits = NULL;
asttype = CHILLAST_NODETYPE_FLOATINGLITERAL;
parent = par;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_FloatingLiteral::chillAST_FloatingLiteral(float val, const char *printthis, chillAST_node *par){
- value = val;
- float0double1 = 0; // which is live!
+chillAST_FloatingLiteral::chillAST_FloatingLiteral(float val, const char *printthis, chillAST_node *par) {
+ value = val;
+ float0double1 = 0; // which is live!
precision = 1;
allthedigits = NULL;
- if (printthis) allthedigits = strdup( printthis );
- //fprintf(stderr, "\nfloatingliteral allthedigits = '%s'\n", allthedigits);
+ if (printthis) allthedigits = strdup(printthis);
+ //fprintf(stderr, "\nfloatingliteral allthedigits = '%s'\n", allthedigits);
asttype = CHILLAST_NODETYPE_FLOATINGLITERAL;
parent = par;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_FloatingLiteral::chillAST_FloatingLiteral(float val, int precis, const char *printthis, chillAST_node *par){
- value = val;
- float0double1 = 0; // which is live!
- precision = precis; // but value is a float?? TODO
+chillAST_FloatingLiteral::chillAST_FloatingLiteral(float val, int precis, const char *printthis, chillAST_node *par) {
+ value = val;
+ float0double1 = 0; // which is live!
+ precision = precis; // but value is a float?? TODO
allthedigits = NULL;
- if (printthis) {
- //fprintf(stderr, "\nchillAST_FloatingLiteral constructor, printthis ");
- //fprintf(stderr, "%p\n", printthis);
- allthedigits = strdup( printthis );
+ if (printthis) {
+ //fprintf(stderr, "\nchillAST_FloatingLiteral constructor, printthis ");
+ //fprintf(stderr, "%p\n", printthis);
+ allthedigits = strdup(printthis);
}
- //fprintf(stderr, "\nfloatingliteral allthedigits = '%s'\n", allthedigits);
+ //fprintf(stderr, "\nfloatingliteral allthedigits = '%s'\n", allthedigits);
asttype = CHILLAST_NODETYPE_FLOATINGLITERAL;
parent = par;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_FloatingLiteral::chillAST_FloatingLiteral( chillAST_FloatingLiteral *old ) {
- //fprintf(stderr, "chillAST_FloatingLiteral::chillAST_FloatingLiteral( old ) allthedigits %p\n", old->allthedigits);
+chillAST_FloatingLiteral::chillAST_FloatingLiteral(chillAST_FloatingLiteral *old) {
+ //fprintf(stderr, "chillAST_FloatingLiteral::chillAST_FloatingLiteral( old ) allthedigits %p\n", old->allthedigits);
asttype = CHILLAST_NODETYPE_FLOATINGLITERAL;
- value = old->value;
- doublevalue = old->doublevalue;
- float0double1 = old->float0double1;
+ value = old->value;
+ doublevalue = old->doublevalue;
+ float0double1 = old->float0double1;
allthedigits = NULL;
- if (old->allthedigits) allthedigits = strdup(old->allthedigits);
- precision = old->precision;
- isFromSourceFile = true; // default
+ if (old->allthedigits) allthedigits = strdup(old->allthedigits);
+ precision = old->precision;
+ isFromSourceFile = true; // default
filename = NULL;
}
-
-void chillAST_FloatingLiteral::print( int indent, FILE *fp) {
+void chillAST_FloatingLiteral::print(int indent, FILE *fp) {
chillindent(indent, fp);
//fprintf(fp, "%f", value);
// attempt to be more like rose output
- char output[1024]; // warning, hardcoded
+ char output[1024]; // warning, hardcoded
if (allthedigits != NULL) {
- strcpy(output, allthedigits ); // if they have specified 100 digits of pi, give 'em 100 digits
- //fprintf(stderr, "floatingliteral allthedigits = '%s'\n", allthedigits);
- }
- else {
- if (float0double1 == 0) sprintf(output, "%f", value);
+ strcpy(output, allthedigits); // if they have specified 100 digits of pi, give 'em 100 digits
+ //fprintf(stderr, "floatingliteral allthedigits = '%s'\n", allthedigits);
+ } else {
+ if (float0double1 == 0) sprintf(output, "%f", value);
else sprintf(output, "%f", doublevalue);
-
+
// next part to avoid printing 123.4560000000000000000000000000
char *dot = index(output, '.');
- if (dot) {
+ if (dot) {
char *end = output + strlen(output);
char *onechar;
char *lastnonzero = dot;
- for (onechar = output; onechar < end; onechar ++) {
+ for (onechar = output; onechar < end; onechar++) {
if (*onechar != '0') lastnonzero = onechar;
}
-
- if (lastnonzero == dot)
+
+ if (lastnonzero == dot)
lastnonzero[2] = '\0'; // may be after end of string, but that should be OK
else lastnonzero[1] = '\0'; // may be after end of string, but that should be OK
}
}
- if (precision == 1) {
+ if (precision == 1) {
int len = strlen(output);
output[len] = 'f'; // explicit single precision
- output[len+1] = '\0';
+ output[len + 1] = '\0';
}
- fprintf(fp, "%s", output);
- fflush(fp);
+ fprintf(fp, "%s", output);
+ fflush(fp);
}
-void chillAST_FloatingLiteral::dump( int indent, FILE *fp) {
+void chillAST_FloatingLiteral::dump(int indent, FILE *fp) {
chillindent(indent, fp);
// 2x2 cases ???
- if (precision == 1)
- fprintf(fp, "(FloatingLiteral 'float' ");
- else fprintf(fp, "(FloatingLiteral 'double' ");
+ if (precision == 1)
+ fprintf(fp, "(FloatingLiteral 'float' ");
+ else fprintf(fp, "(FloatingLiteral 'double' ");
- if (float0double1 == 0) fprintf(fp, "%f)\n", value); // %f gives enough digits
- else fprintf(fp, "%f)\n", doublevalue); // %f gives enough digits
- fflush(fp);
+ if (float0double1 == 0) fprintf(fp, "%f)\n", value); // %f gives enough digits
+ else fprintf(fp, "%f)\n", doublevalue); // %f gives enough digits
+ fflush(fp);
}
-chillAST_node* chillAST_FloatingLiteral::constantFold() { return this; }; // NOOP
+chillAST_node *chillAST_FloatingLiteral::constantFold() { return this; }; // NOOP
-chillAST_node* chillAST_FloatingLiteral::clone() {
- //fprintf(stderr, "chillAST_FloatingLiteral::clone() ");
- //fprintf(stderr, "allthedigits %p \n", allthedigits);
- chillAST_FloatingLiteral *newone = new chillAST_FloatingLiteral( this );
+chillAST_node *chillAST_FloatingLiteral::clone() {
+ //fprintf(stderr, "chillAST_FloatingLiteral::clone() ");
+ //fprintf(stderr, "allthedigits %p \n", allthedigits);
+ chillAST_FloatingLiteral *newone = new chillAST_FloatingLiteral(this);
- newone->isFromSourceFile = isFromSourceFile;
- if (filename) newone->filename = strdup(filename);
- //print(); printf(" "); newone->print(); printf("\n"); fflush(stdout);
+ newone->isFromSourceFile = isFromSourceFile;
+ if (filename) newone->filename = strdup(filename);
+ //print(); printf(" "); newone->print(); printf("\n"); fflush(stdout);
return newone;
}
-
-bool chillAST_FloatingLiteral::isSameAs( chillAST_node *other ){
+
+bool chillAST_FloatingLiteral::isSameAs(chillAST_node *other) {
if (!other->isFloatingLiteral()) return false;
- chillAST_FloatingLiteral *o = (chillAST_FloatingLiteral *)other;
+ chillAST_FloatingLiteral *o = (chillAST_FloatingLiteral *) other;
// should we care about single vs double precision?
if (float0double1 != o->float0double1) return false;
- if (float0double1 == 0) {
+ if (float0double1 == 0) {
return value == o->value; // WARNING, comparing floats with ==
}
return doublevalue == o->doublevalue; // WARNING, comparing doubless with ==
-}
-
-
-
+}
-chillAST_UnaryOperator::chillAST_UnaryOperator( const char *oper, bool pre, chillAST_node *sub, chillAST_node *par ) {
+chillAST_UnaryOperator::chillAST_UnaryOperator(const char *oper, bool pre, chillAST_node *sub, chillAST_node *par) {
op = strdup(oper);
prefix = pre;
- subexpr = sub;
- subexpr->setParent( this );
- asttype = CHILLAST_NODETYPE_UNARYOPERATOR;
- parent = par;
- isFromSourceFile = true; // default
+ subexpr = sub;
+ subexpr->setParent(this);
+ asttype = CHILLAST_NODETYPE_UNARYOPERATOR;
+ parent = par;
+ isFromSourceFile = true; // default
filename = NULL;
}
-void chillAST_UnaryOperator::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool w ) {
- subexpr->gatherArrayRefs( refs, isAssignmentOp()); //
+void chillAST_UnaryOperator::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool w) {
+ subexpr->gatherArrayRefs(refs, isAssignmentOp()); //
}
-
-void chillAST_UnaryOperator::print( int indent, FILE *fp) {
+void chillAST_UnaryOperator::print(int indent, FILE *fp) {
bool needparens = false;
if (subexpr->isNotLeaf()) needparens = true; // may get more complicated
- chillindent( indent, fp); // will this ever be invoked?
- if (prefix) fprintf(fp, "%s", op);
+ chillindent(indent, fp); // will this ever be invoked?
+ if (prefix) fprintf(fp, "%s", op);
if (needparens) fprintf(fp, "(");
- subexpr->print( 0, fp );
- if (needparens) fprintf(fp, ")");
- if (!prefix) fprintf(fp, "%s", op);
- fflush(fp);
+ subexpr->print(0, fp);
+ if (needparens) fprintf(fp, ")");
+ if (!prefix) fprintf(fp, "%s", op);
+ fflush(fp);
}
-void chillAST_UnaryOperator::dump( int indent, FILE *fp) {
- chillindent( indent, fp);
+void chillAST_UnaryOperator::dump(int indent, FILE *fp) {
+ chillindent(indent, fp);
fprintf(fp, "(UnaryOperator ");
- if (prefix) fprintf(fp, "prefix ");
+ if (prefix) fprintf(fp, "prefix ");
else fprintf(fp, "postfix ");
fprintf(fp, "%s\n", op);
- subexpr->dump(indent+1, fp);
+ subexpr->dump(indent + 1, fp);
- chillindent( indent, fp);
+ chillindent(indent, fp);
fprintf(fp, ")\n");
}
-void chillAST_UnaryOperator::gatherVarLHSUsage( vector<chillAST_VarDecl*> &decls ) {
+void chillAST_UnaryOperator::gatherVarLHSUsage(vector<chillAST_VarDecl *> &decls) {
if ((!strcmp("++", op)) || (!strcmp("--", op))) {
- subexpr->gatherVarUsage( decls ); // do all unary modify the subexpr? (no, - )
+ subexpr->gatherVarUsage(decls); // do all unary modify the subexpr? (no, - )
}
}
-
-chillAST_node* chillAST_UnaryOperator::constantFold() {
+chillAST_node *chillAST_UnaryOperator::constantFold() {
//fprintf(stderr, "chillAST_UnaryOperator::constantFold() ");
- //print(); fprintf(stderr, "\n");
+ //print(); fprintf(stderr, "\n");
subexpr = subexpr->constantFold();
chillAST_node *returnval = this;
if (subexpr->isConstant()) {
//fprintf(stderr, "unary op folding constants\n");
//print(0,stderr); fprintf(stderr, "\n");
-
- if (streq(op, "-")) {
+
+ if (streq(op, "-")) {
if (subexpr->isIntegerLiteral()) {
- int intval = ((chillAST_IntegerLiteral*)subexpr)->value;
- chillAST_IntegerLiteral *I = new chillAST_IntegerLiteral( -intval, parent);
+ int intval = ((chillAST_IntegerLiteral *) subexpr)->value;
+ chillAST_IntegerLiteral *I = new chillAST_IntegerLiteral(-intval, parent);
returnval = I;
//fprintf(stderr, "integer -%d becomes %d\n", intval, I->value);
- }
- else {
- chillAST_FloatingLiteral *FL = (chillAST_FloatingLiteral*)subexpr;
- chillAST_FloatingLiteral *F = new chillAST_FloatingLiteral( FL ); // clone
+ } else {
+ chillAST_FloatingLiteral *FL = (chillAST_FloatingLiteral *) subexpr;
+ chillAST_FloatingLiteral *F = new chillAST_FloatingLiteral(FL); // clone
F->parent = FL->parent;
F->value = -F->value;
F->doublevalue = -F->doublevalue;
-
- F->print(); fprintf(stderr, "\n");
-
+
+ F->print();
+ fprintf(stderr, "\n");
+
returnval = F;
}
- }
- else fprintf(stderr, "can't fold op '%s' yet\n", op);
- }
+ } else fprintf(stderr, "can't fold op '%s' yet\n", op);
+ }
return returnval;
}
-class chillAST_node* chillAST_UnaryOperator::clone() {
- chillAST_UnaryOperator *UO = new chillAST_UnaryOperator( op, prefix, subexpr->clone(), parent );
- UO->isFromSourceFile = isFromSourceFile;
- if (filename) UO->filename = strdup(filename);
- return UO;
+class chillAST_node *chillAST_UnaryOperator::clone() {
+ chillAST_UnaryOperator *UO = new chillAST_UnaryOperator(op, prefix, subexpr->clone(), parent);
+ UO->isFromSourceFile = isFromSourceFile;
+ if (filename) UO->filename = strdup(filename);
+ return UO;
}
-void chillAST_UnaryOperator::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherVarDecls( decls );
+void chillAST_UnaryOperator::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherVarDecls(decls);
}
-void chillAST_UnaryOperator::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherScalarVarDecls( decls );
+void chillAST_UnaryOperator::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherScalarVarDecls(decls);
}
-void chillAST_UnaryOperator::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherArrayVarDecls( decls );
+void chillAST_UnaryOperator::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherArrayVarDecls(decls);
}
-void chillAST_UnaryOperator::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- subexpr->gatherDeclRefExprs( refs );
+void chillAST_UnaryOperator::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ subexpr->gatherDeclRefExprs(refs);
}
-void chillAST_UnaryOperator::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherVarUsage( decls );
+void chillAST_UnaryOperator::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherVarUsage(decls);
}
- void chillAST_UnaryOperator::replaceVarDecls( chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
- subexpr->replaceVarDecls( olddecl, newdecl );
- }
+void chillAST_UnaryOperator::replaceVarDecls(chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
+ subexpr->replaceVarDecls(olddecl, newdecl);
+}
-int chillAST_UnaryOperator::evalAsInt() {
+int chillAST_UnaryOperator::evalAsInt() {
if (!strcmp("+", op)) return subexpr->evalAsInt();
if (!strcmp("-", op)) return -subexpr->evalAsInt();
if (!strcmp("++", op)) return 1 + subexpr->evalAsInt();
if (!strcmp("--", op)) return subexpr->evalAsInt() - 1;
- fprintf(stderr, "chillAST_UnaryOperator::evalAsInt() unhandled op '%s'\n", op);
- segfault();
+ fprintf(stderr, "chillAST_UnaryOperator::evalAsInt() unhandled op '%s'\n", op);
+ exit(-1);
}
-bool chillAST_UnaryOperator::isSameAs( chillAST_node *other ){
+bool chillAST_UnaryOperator::isSameAs(chillAST_node *other) {
if (!other->isUnaryOperator()) return false;
- chillAST_UnaryOperator *o = (chillAST_UnaryOperator *)other;
- if (strcmp(op, o->op)) return false; // different operators
- return subexpr->isSameAs( o->subexpr ); // recurse
+ chillAST_UnaryOperator *o = (chillAST_UnaryOperator *) other;
+ if (strcmp(op, o->op)) return false; // different operators
+ return subexpr->isSameAs(o->subexpr); // recurse
}
-chillAST_ImplicitCastExpr::chillAST_ImplicitCastExpr( chillAST_node *sub, chillAST_node *par ) {
+chillAST_ImplicitCastExpr::chillAST_ImplicitCastExpr(chillAST_node *sub, chillAST_node *par) {
subexpr = sub;
- subexpr->setParent( this );
- asttype = CHILLAST_NODETYPE_IMPLICITCASTEXPR;
- parent = par;
+ subexpr->setParent(this);
+ asttype = CHILLAST_NODETYPE_IMPLICITCASTEXPR;
+ parent = par;
//fprintf(stderr, "ImplicitCastExpr 0x%x has subexpr 0x%x", this, subexpr);
- //fprintf(stderr, " of type %s\n", subexpr->getTypeString());
- isFromSourceFile = true; // default
+ //fprintf(stderr, " of type %s\n", subexpr->getTypeString());
+ isFromSourceFile = true; // default
filename = NULL;
}
-void chillAST_ImplicitCastExpr::print( int indent, FILE *fp) {
+void chillAST_ImplicitCastExpr::print(int indent, FILE *fp) {
// No need to print anything, simply forward to the sub expression.
- subexpr->print( indent, fp );
- fflush(fp);
+ subexpr->print(indent, fp);
+ fflush(fp);
};
-void chillAST_ImplicitCastExpr::printonly( int indent, FILE *fp) {
+void chillAST_ImplicitCastExpr::printonly(int indent, FILE *fp) {
// No need to print anything, simply forward to the sub expression.
- subexpr->printonly( indent, fp );
- fflush(fp);
+ subexpr->printonly(indent, fp);
+ fflush(fp);
};
-void chillAST_ImplicitCastExpr::replaceChild( chillAST_node *old, chillAST_node *newchild ){
+void chillAST_ImplicitCastExpr::replaceChild(chillAST_node *old, chillAST_node *newchild) {
if (subexpr == old) { // should be the case for this to get called
subexpr = newchild;
- subexpr->setParent( this );
+ subexpr->setParent(this);
//old->parent = NULL;
return;
}
fprintf(stderr, "chillAST_ImplicitCastExpr::replaceChild() called with bad 'old'\n");
- exit(-1); // ??
+ exit(-1); // ??
}
-class chillAST_node* chillAST_ImplicitCastExpr::constantFold() {
+class chillAST_node *chillAST_ImplicitCastExpr::constantFold() {
chillAST_node *child = subexpr->constantFold();
- child->setParent( parent ) ; // remove myself !! probably a bad idea. TODO
- return child;
+ child->setParent(parent); // remove myself !! probably a bad idea. TODO
+ return child;
}
-class chillAST_node* chillAST_ImplicitCastExpr::clone() {
- chillAST_ImplicitCastExpr *ICE = new chillAST_ImplicitCastExpr( subexpr->clone(), parent);
- ICE->isFromSourceFile = isFromSourceFile;
- if (filename) ICE->filename = strdup(filename);
- return ICE;
+class chillAST_node *chillAST_ImplicitCastExpr::clone() {
+ chillAST_ImplicitCastExpr *ICE = new chillAST_ImplicitCastExpr(subexpr->clone(), parent);
+ ICE->isFromSourceFile = isFromSourceFile;
+ if (filename) ICE->filename = strdup(filename);
+ return ICE;
}
-void chillAST_ImplicitCastExpr::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool w ) {
- subexpr->gatherArrayRefs( refs, w );
+void chillAST_ImplicitCastExpr::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool w) {
+ subexpr->gatherArrayRefs(refs, w);
}
-void chillAST_ImplicitCastExpr::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- subexpr->gatherScalarRefs( refs, writtento );
-}
+void chillAST_ImplicitCastExpr::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ subexpr->gatherScalarRefs(refs, writtento);
+}
-void chillAST_ImplicitCastExpr::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherVarDecls( decls );
+void chillAST_ImplicitCastExpr::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherVarDecls(decls);
}
-void chillAST_ImplicitCastExpr::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherScalarVarDecls( decls );
+void chillAST_ImplicitCastExpr::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherScalarVarDecls(decls);
}
-void chillAST_ImplicitCastExpr::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherArrayVarDecls( decls );
+void chillAST_ImplicitCastExpr::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherArrayVarDecls(decls);
}
-void chillAST_ImplicitCastExpr::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- subexpr->gatherDeclRefExprs( refs );
+void chillAST_ImplicitCastExpr::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ subexpr->gatherDeclRefExprs(refs);
}
-void chillAST_ImplicitCastExpr::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherVarUsage( decls );
+void chillAST_ImplicitCastExpr::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherVarUsage(decls);
}
+chillAST_CStyleCastExpr::chillAST_CStyleCastExpr(const char *to, chillAST_node *sub, chillAST_node *par) {
-chillAST_CStyleCastExpr::chillAST_CStyleCastExpr( const char *to, chillAST_node *sub, chillAST_node *par ) {
-
- //fprintf(stderr, "chillAST_CStyleCastExpr::chillAST_CStyleCastExpr( %s, ...)\n", to);
+ //fprintf(stderr, "chillAST_CStyleCastExpr::chillAST_CStyleCastExpr( %s, ...)\n", to);
towhat = strdup(to);
subexpr = sub;
- if (subexpr) subexpr->setParent( this );
- asttype = CHILLAST_NODETYPE_CSTYLECASTEXPR;
- parent = par;
- //fprintf(stderr, "chillAST_CStyleCastExpr (%s) sub 0x%x\n", towhat, sub );
- isFromSourceFile = true; // default
+ if (subexpr) subexpr->setParent(this);
+ asttype = CHILLAST_NODETYPE_CSTYLECASTEXPR;
+ parent = par;
+ //fprintf(stderr, "chillAST_CStyleCastExpr (%s) sub 0x%x\n", towhat, sub );
+ isFromSourceFile = true; // default
filename = NULL;
}
-void chillAST_CStyleCastExpr::replaceChild( chillAST_node *old, chillAST_node *newchild ){
+void chillAST_CStyleCastExpr::replaceChild(chillAST_node *old, chillAST_node *newchild) {
if (subexpr == old) { // should be the case for this to get called
subexpr = newchild;
- subexpr->setParent( this );
+ subexpr->setParent(this);
//old->parent = NULL;
return;
}
fprintf(stderr, "chillAST_CStyleCastExpr::replaceChild() called with bad 'old'\n");
- exit(-1); // ??
+ exit(-1); // ??
}
- void chillAST_CStyleCastExpr::replaceVarDecls( chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
- subexpr->replaceVarDecls( olddecl, newdecl);
- }
+void chillAST_CStyleCastExpr::replaceVarDecls(chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
+ subexpr->replaceVarDecls(olddecl, newdecl);
+}
-void chillAST_CStyleCastExpr::print( int indent, FILE *fp) {
- //fprintf(stderr, "CStyleCastExpr::print()\n");
- chillindent(indent, fp);
+void chillAST_CStyleCastExpr::print(int indent, FILE *fp) {
+ //fprintf(stderr, "CStyleCastExpr::print()\n");
+ chillindent(indent, fp);
// special cases? should probably walk the AST and change the literal itself
- if ( !strcmp("float", towhat) && subexpr->isIntegerLiteral()) { // (float) 3 => 3.0f
- subexpr->print( 0, fp ); fprintf(fp, ".0f");
- }
- else if ( !strcmp("double", towhat) && subexpr->isIntegerLiteral()) { // (double) 3 => 3.0
- subexpr->print( 0, fp ); fprintf(fp, ".0");
- }
- else if ( !strcmp("float", towhat) && subexpr->isFloatingLiteral()) { // (float) 3.0 => 3.0f
- subexpr->print( 0, fp ); fprintf(fp, "f");
- }
- else { // general case
- fprintf(fp, "((%s) ", towhat);
- //fprintf(fp, "\ntowhat '%s'\n", towhat );
-
- if (subexpr->isVarDecl()) fprintf(fp, "%s", ((chillAST_VarDecl *)subexpr)->varname);
- else subexpr->print( indent, fp );
- //fprintf(fp, "subexpr '%s' ", subexpr->getTypeString());
- fprintf(fp, ")");
+ if (!strcmp("float", towhat) && subexpr->isIntegerLiteral()) { // (float) 3 => 3.0f
+ subexpr->print(0, fp);
+ fprintf(fp, ".0f");
+ } else if (!strcmp("double", towhat) && subexpr->isIntegerLiteral()) { // (double) 3 => 3.0
+ subexpr->print(0, fp);
+ fprintf(fp, ".0");
+ } else if (!strcmp("float", towhat) && subexpr->isFloatingLiteral()) { // (float) 3.0 => 3.0f
+ subexpr->print(0, fp);
+ fprintf(fp, "f");
+ } else { // general case
+ fprintf(fp, "((%s) ", towhat);
+ //fprintf(fp, "\ntowhat '%s'\n", towhat );
+
+ if (subexpr->isVarDecl()) fprintf(fp, "%s", ((chillAST_VarDecl *) subexpr)->varname);
+ else subexpr->print(indent, fp);
+ //fprintf(fp, "subexpr '%s' ", subexpr->getTypeString());
+ fprintf(fp, ")");
}
- fflush(fp);
+ fflush(fp);
};
-void chillAST_CStyleCastExpr::dump( int indent, FILE *fp) {
+void chillAST_CStyleCastExpr::dump(int indent, FILE *fp) {
chillindent(indent, fp);
fprintf(fp, "(CStyleCastExpr (%s) \n", towhat);
- subexpr->dump( indent+1, fp );
+ subexpr->dump(indent + 1, fp);
chillindent(indent, fp);
fprintf(fp, ")\n");
- fflush(fp);
+ fflush(fp);
}
-class chillAST_node* chillAST_CStyleCastExpr::constantFold() {
+class chillAST_node *chillAST_CStyleCastExpr::constantFold() {
subexpr = subexpr->constantFold();
- return this;
+ return this;
}
-class chillAST_node* chillAST_CStyleCastExpr::clone() {
- chillAST_CStyleCastExpr *CSCE = new chillAST_CStyleCastExpr( towhat, subexpr->clone(), parent );
- CSCE->isFromSourceFile = isFromSourceFile;
- if (filename) CSCE->filename = strdup(filename);
+class chillAST_node *chillAST_CStyleCastExpr::clone() {
+ chillAST_CStyleCastExpr *CSCE = new chillAST_CStyleCastExpr(towhat, subexpr->clone(), parent);
+ CSCE->isFromSourceFile = isFromSourceFile;
+ if (filename) CSCE->filename = strdup(filename);
return CSCE;
}
-void chillAST_CStyleCastExpr::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool w ) {
- subexpr->gatherArrayRefs( refs, w );
+void chillAST_CStyleCastExpr::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool w) {
+ subexpr->gatherArrayRefs(refs, w);
}
-void chillAST_CStyleCastExpr::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- subexpr->gatherScalarRefs( refs, writtento );
-}
-
-
-void chillAST_CStyleCastExpr::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherVarDecls( decls );
+void chillAST_CStyleCastExpr::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ subexpr->gatherScalarRefs(refs, writtento);
}
-void chillAST_CStyleCastExpr::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherScalarVarDecls( decls );
+void chillAST_CStyleCastExpr::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherVarDecls(decls);
}
-void chillAST_CStyleCastExpr::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherArrayVarDecls( decls );
+void chillAST_CStyleCastExpr::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherScalarVarDecls(decls);
}
-void chillAST_CStyleCastExpr::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- subexpr->gatherDeclRefExprs( refs );
+void chillAST_CStyleCastExpr::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherArrayVarDecls(decls);
}
-void chillAST_CStyleCastExpr::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherVarUsage( decls );
+void chillAST_CStyleCastExpr::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ subexpr->gatherDeclRefExprs(refs);
}
+void chillAST_CStyleCastExpr::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherVarUsage(decls);
+}
-chillAST_CStyleAddressOf::chillAST_CStyleAddressOf( chillAST_node *sub, chillAST_node *par ) {
+chillAST_CStyleAddressOf::chillAST_CStyleAddressOf(chillAST_node *sub, chillAST_node *par) {
subexpr = sub;
- subexpr->setParent( this );
- asttype = CHILLAST_NODETYPE_CSTYLEADDRESSOF;
- parent = par;
- //fprintf(stderr, "chillAST_CStyleCastExpr (%s) sub 0x%x\n", towhat, sub );
- isFromSourceFile = true; // default
+ subexpr->setParent(this);
+ asttype = CHILLAST_NODETYPE_CSTYLEADDRESSOF;
+ parent = par;
+ //fprintf(stderr, "chillAST_CStyleCastExpr (%s) sub 0x%x\n", towhat, sub );
+ isFromSourceFile = true; // default
filename = NULL;
}
-void chillAST_CStyleAddressOf::print( int indent, FILE *fp) {
- //fprintf(stderr, "CStyleAddressOf::print()\n");
- chillindent(indent, fp);
- fprintf(fp, "(&");
- subexpr->print( 0, fp );
- fprintf(fp, ")");
- fflush(fp);
+void chillAST_CStyleAddressOf::print(int indent, FILE *fp) {
+ //fprintf(stderr, "CStyleAddressOf::print()\n");
+ chillindent(indent, fp);
+ fprintf(fp, "(&");
+ subexpr->print(0, fp);
+ fprintf(fp, ")");
+ fflush(fp);
};
-void chillAST_CStyleAddressOf::dump( int indent, FILE *fp) {
+void chillAST_CStyleAddressOf::dump(int indent, FILE *fp) {
chillindent(indent, fp);
fprintf(fp, "(CStyleAddressOf \n");
- subexpr->print( indent+1, fp );
+ subexpr->print(indent + 1, fp);
chillindent(indent, fp);
fprintf(fp, ")\n");
- fflush(fp);
+ fflush(fp);
}
-class chillAST_node* chillAST_CStyleAddressOf::constantFold() {
+class chillAST_node *chillAST_CStyleAddressOf::constantFold() {
subexpr = subexpr->constantFold();
- return this;
+ return this;
}
-class chillAST_node* chillAST_CStyleAddressOf::clone() {
- chillAST_CStyleAddressOf *CSAO = new chillAST_CStyleAddressOf( subexpr->clone(), parent );
- CSAO->isFromSourceFile = isFromSourceFile;
- if (filename) CSAO->filename = strdup(filename);
+class chillAST_node *chillAST_CStyleAddressOf::clone() {
+ chillAST_CStyleAddressOf *CSAO = new chillAST_CStyleAddressOf(subexpr->clone(), parent);
+ CSAO->isFromSourceFile = isFromSourceFile;
+ if (filename) CSAO->filename = strdup(filename);
return CSAO;
}
-void chillAST_CStyleAddressOf::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool w ) {
- subexpr->gatherArrayRefs( refs, w );
+void chillAST_CStyleAddressOf::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool w) {
+ subexpr->gatherArrayRefs(refs, w);
}
-void chillAST_CStyleAddressOf::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- subexpr->gatherScalarRefs( refs, writtento );
-}
-
-void chillAST_CStyleAddressOf::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherVarDecls( decls );
+void chillAST_CStyleAddressOf::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ subexpr->gatherScalarRefs(refs, writtento);
}
-void chillAST_CStyleAddressOf::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherScalarVarDecls( decls );
+void chillAST_CStyleAddressOf::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherVarDecls(decls);
}
-
-void chillAST_CStyleAddressOf::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherArrayVarDecls( decls );
+void chillAST_CStyleAddressOf::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherScalarVarDecls(decls);
}
-void chillAST_CStyleAddressOf::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- subexpr->gatherDeclRefExprs( refs );
+void chillAST_CStyleAddressOf::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherArrayVarDecls(decls);
}
-void chillAST_CStyleAddressOf::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherVarUsage( decls );
+void chillAST_CStyleAddressOf::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ subexpr->gatherDeclRefExprs(refs);
}
+void chillAST_CStyleAddressOf::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherVarUsage(decls);
+}
chillAST_Malloc::chillAST_Malloc(chillAST_node *size, chillAST_node *p) {
@@ -4547,810 +4488,793 @@ chillAST_Malloc::chillAST_Malloc(chillAST_node *size, chillAST_node *p) {
sizeexpr = size; // probably a multiply like sizeof(int) * 1024
asttype = CHILLAST_NODETYPE_MALLOC;
parent = p;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
-};
+};
chillAST_Malloc::chillAST_Malloc(char *thething, chillAST_node *numthings, chillAST_node *p) {
thing = strdup(thething); // "int" or "float" or "struct widget"
- sizeexpr = numthings;
+ sizeexpr = numthings;
asttype = CHILLAST_NODETYPE_MALLOC;
parent = p;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
-};
+};
-chillAST_node* chillAST_Malloc::constantFold() {
- sizeexpr->constantFold();
+chillAST_node *chillAST_Malloc::constantFold() {
+ sizeexpr->constantFold();
}
-chillAST_node* chillAST_Malloc::clone() {
- chillAST_Malloc *M = new chillAST_Malloc( thing, sizeexpr, parent); // the general version
- M->isFromSourceFile = isFromSourceFile;
- if (filename) M->filename = strdup(filename);
+chillAST_node *chillAST_Malloc::clone() {
+ chillAST_Malloc *M = new chillAST_Malloc(thing, sizeexpr, parent); // the general version
+ M->isFromSourceFile = isFromSourceFile;
+ if (filename) M->filename = strdup(filename);
return M;
-};
+};
-void chillAST_Malloc::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool writtento ) {
- sizeexpr->gatherArrayRefs( refs, writtento );
+void chillAST_Malloc::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool writtento) {
+ sizeexpr->gatherArrayRefs(refs, writtento);
};
-void chillAST_Malloc::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- sizeexpr->gatherScalarRefs( refs, writtento );
+void chillAST_Malloc::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ sizeexpr->gatherScalarRefs(refs, writtento);
};
-void chillAST_Malloc::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- sizeexpr->gatherVarDecls(decls);
+void chillAST_Malloc::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ sizeexpr->gatherVarDecls(decls);
};
-void chillAST_Malloc::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ){
- sizeexpr->gatherScalarVarDecls(decls);
+void chillAST_Malloc::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ sizeexpr->gatherScalarVarDecls(decls);
};
-void chillAST_Malloc::gatherArrayVarDecls ( vector<chillAST_VarDecl*> &decls ) {
- sizeexpr->gatherArrayVarDecls(decls);
+void chillAST_Malloc::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ sizeexpr->gatherArrayVarDecls(decls);
};
-void chillAST_Malloc::gatherVarUsage( vector<chillAST_VarDecl*> &decls ){
- sizeexpr->gatherVarUsage(decls);
+void chillAST_Malloc::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ sizeexpr->gatherVarUsage(decls);
};
+void chillAST_Malloc::print(int indent, FILE *fp) {
+ chillindent(indent, fp);
+ fprintf(fp, "malloc(");
-void chillAST_Malloc::print( int indent, FILE *fp ) {
- chillindent(indent, fp);
- fprintf(fp, "malloc(");
-
if (thing) {
- fprintf(fp, " sizeof(%s) * ", thing );
+ fprintf(fp, " sizeof(%s) * ", thing);
}
- sizeexpr->print(0,fp);
+ sizeexpr->print(0, fp);
fprintf(fp, ")");
- fflush(fp);
-};
+ fflush(fp);
+};
-void chillAST_Malloc::dump( int indent, FILE *fp ) {
- chillindent(indent, fp);
- fprintf(fp, "(Malloc \n");
- sizeexpr->dump( indent+1, fp );
- chillindent(indent, fp);
+void chillAST_Malloc::dump(int indent, FILE *fp) {
+ chillindent(indent, fp);
+ fprintf(fp, "(Malloc \n");
+ sizeexpr->dump(indent + 1, fp);
+ chillindent(indent, fp);
fprintf(fp, ")\n");
- fflush(fp);
+ fflush(fp);
};
-
chillAST_CudaMalloc::chillAST_CudaMalloc(chillAST_node *devmemptr, chillAST_node *size, chillAST_node *p) {
- devPtr = devmemptr;
+ devPtr = devmemptr;
sizeinbytes = size; // probably a multiply like sizeof(int) * 1024
asttype = CHILLAST_NODETYPE_CUDAMALLOC;
parent = p;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
-};
+};
-void chillAST_CudaMalloc::print( int indent, FILE *fp ) {
- chillindent(indent, fp);
- fprintf(fp, "cudaMalloc(");
- devPtr->print( 0, fp );
+void chillAST_CudaMalloc::print(int indent, FILE *fp) {
+ chillindent(indent, fp);
+ fprintf(fp, "cudaMalloc(");
+ devPtr->print(0, fp);
fprintf(fp, ",");
- sizeinbytes->print( 0, fp );
+ sizeinbytes->print(0, fp);
fprintf(fp, ")");
- fflush(fp);
+ fflush(fp);
};
-void chillAST_CudaMalloc::dump( int indent, FILE *fp ) {
- chillindent(indent, fp);
- fprintf(fp, "(CudaMalloc \n");
- devPtr->dump( indent+1, fp );
+void chillAST_CudaMalloc::dump(int indent, FILE *fp) {
+ chillindent(indent, fp);
+ fprintf(fp, "(CudaMalloc \n");
+ devPtr->dump(indent + 1, fp);
fprintf(fp, "\n");
- sizeinbytes->dump( indent+1, fp );
+ sizeinbytes->dump(indent + 1, fp);
fprintf(fp, ")\n");
- fflush(fp);
+ fflush(fp);
};
-class chillAST_node* chillAST_CudaMalloc::constantFold() {
+class chillAST_node *chillAST_CudaMalloc::constantFold() {
devPtr = devPtr->constantFold();
- return this;
+ return this;
}
-class chillAST_node* chillAST_CudaMalloc::clone() {
- chillAST_CudaMalloc *CM = new chillAST_CudaMalloc( devPtr->clone(), sizeinbytes->clone(), parent );
- CM->isFromSourceFile = isFromSourceFile;
- if (filename) CM->filename = strdup(filename);
- return CM;
+class chillAST_node *chillAST_CudaMalloc::clone() {
+ chillAST_CudaMalloc *CM = new chillAST_CudaMalloc(devPtr->clone(), sizeinbytes->clone(), parent);
+ CM->isFromSourceFile = isFromSourceFile;
+ if (filename) CM->filename = strdup(filename);
+ return CM;
}
-void chillAST_CudaMalloc::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool w ) {
- devPtr->gatherArrayRefs( refs, false );
- sizeinbytes->gatherArrayRefs( refs, false );
+void chillAST_CudaMalloc::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool w) {
+ devPtr->gatherArrayRefs(refs, false);
+ sizeinbytes->gatherArrayRefs(refs, false);
}
-void chillAST_CudaMalloc::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- devPtr->gatherScalarRefs( refs, false );
- sizeinbytes->gatherScalarRefs( refs, false );
+void chillAST_CudaMalloc::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ devPtr->gatherScalarRefs(refs, false);
+ sizeinbytes->gatherScalarRefs(refs, false);
}
-void chillAST_CudaMalloc::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- devPtr->gatherVarDecls( decls );
- sizeinbytes->gatherVarDecls( decls );
+void chillAST_CudaMalloc::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ devPtr->gatherVarDecls(decls);
+ sizeinbytes->gatherVarDecls(decls);
}
-void chillAST_CudaMalloc::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- devPtr->gatherScalarVarDecls( decls );
- sizeinbytes->gatherScalarVarDecls( decls );
+void chillAST_CudaMalloc::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ devPtr->gatherScalarVarDecls(decls);
+ sizeinbytes->gatherScalarVarDecls(decls);
}
-
-void chillAST_CudaMalloc::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- devPtr->gatherArrayVarDecls( decls );
- sizeinbytes->gatherArrayVarDecls( decls );
+void chillAST_CudaMalloc::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ devPtr->gatherArrayVarDecls(decls);
+ sizeinbytes->gatherArrayVarDecls(decls);
}
-
-void chillAST_CudaMalloc::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- devPtr->gatherVarUsage( decls );
- sizeinbytes->gatherVarUsage( decls );
+void chillAST_CudaMalloc::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ devPtr->gatherVarUsage(decls);
+ sizeinbytes->gatherVarUsage(decls);
}
-
chillAST_CudaFree::chillAST_CudaFree(chillAST_VarDecl *var, chillAST_node *p) {
- variable = var;
+ variable = var;
parent = p;
asttype = CHILLAST_NODETYPE_CUDAFREE;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
-};
+};
-void chillAST_CudaFree::print( int indent, FILE *fp ) {
- chillindent(indent, fp);
- fprintf(fp, "cudaFree(%s)", variable->varname);
- fflush(fp);
+void chillAST_CudaFree::print(int indent, FILE *fp) {
+ chillindent(indent, fp);
+ fprintf(fp, "cudaFree(%s)", variable->varname);
+ fflush(fp);
};
-void chillAST_CudaFree::dump( int indent, FILE *fp ) {
- chillindent(indent, fp);
- fprintf(fp, "(CudaFree %s )\n", variable->varname);
- fflush(fp);
+void chillAST_CudaFree::dump(int indent, FILE *fp) {
+ chillindent(indent, fp);
+ fprintf(fp, "(CudaFree %s )\n", variable->varname);
+ fflush(fp);
};
-class chillAST_node* chillAST_CudaFree::constantFold() {
- return this;
+class chillAST_node *chillAST_CudaFree::constantFold() {
+ return this;
}
-class chillAST_node* chillAST_CudaFree::clone() {
- chillAST_CudaFree *CF = new chillAST_CudaFree( variable, parent );
- CF->isFromSourceFile = isFromSourceFile;
- if (filename) CF->filename = strdup(filename);
- return CF;
+class chillAST_node *chillAST_CudaFree::clone() {
+ chillAST_CudaFree *CF = new chillAST_CudaFree(variable, parent);
+ CF->isFromSourceFile = isFromSourceFile;
+ if (filename) CF->filename = strdup(filename);
+ return CF;
}
-void chillAST_CudaFree::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool w ) {}
-void chillAST_CudaFree::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {}
-
-void chillAST_CudaFree::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- variable->gatherVarDecls( decls );
-}
+void chillAST_CudaFree::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool w) {}
+void chillAST_CudaFree::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {}
-void chillAST_CudaFree::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- variable->gatherScalarVarDecls( decls );
+void chillAST_CudaFree::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ variable->gatherVarDecls(decls);
}
-void chillAST_CudaFree::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- variable->gatherArrayVarDecls( decls );
+void chillAST_CudaFree::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ variable->gatherScalarVarDecls(decls);
}
-
-void chillAST_CudaFree::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- variable->gatherVarUsage( decls );
+void chillAST_CudaFree::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ variable->gatherArrayVarDecls(decls);
}
+void chillAST_CudaFree::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ variable->gatherVarUsage(decls);
+}
-
-
-
-
-
-chillAST_CudaMemcpy::chillAST_CudaMemcpy(chillAST_VarDecl *d, chillAST_VarDecl *s, chillAST_node *siz, char *kind, chillAST_node *par) {
+chillAST_CudaMemcpy::chillAST_CudaMemcpy(chillAST_VarDecl *d, chillAST_VarDecl *s, chillAST_node *siz, char *kind,
+ chillAST_node *par) {
dest = d;
src = s;
- //fprintf(stderr, "chillAST_CudaMemcpy::chillAST_CudaMemcpy( dest %s, src %s, ...)\n", d->varname, s->varname );
+ //fprintf(stderr, "chillAST_CudaMemcpy::chillAST_CudaMemcpy( dest %s, src %s, ...)\n", d->varname, s->varname );
size = siz;
cudaMemcpyKind = kind;
asttype = CHILLAST_NODETYPE_CUDAMEMCPY;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
parent = par;
-};
+};
-void chillAST_CudaMemcpy::print( int indent, FILE *fp ) {
- chillindent(indent, fp);
- fprintf(fp, "cudaMemcpy(%s,%s,", dest->varname, src->varname);
+void chillAST_CudaMemcpy::print(int indent, FILE *fp) {
+ chillindent(indent, fp);
+ fprintf(fp, "cudaMemcpy(%s,%s,", dest->varname, src->varname);
//dest->print( 0, fp );
//fprintf(fp, ",");
- // src->print( 0, fp ); just want the src NAME, not name and array info
+ // src->print( 0, fp ); just want the src NAME, not name and array info
//fprintf(fp, ",");
- size->print( 0, fp );
+ size->print(0, fp);
fprintf(fp, ",%s)", cudaMemcpyKind);
- fflush(fp);
+ fflush(fp);
};
-void chillAST_CudaMemcpy::dump( int indent, FILE *fp ) {
- chillindent(indent, fp);
- fprintf(fp, "(CudaMemcpy \n");
- dest->dump( indent+1, fp );
- src->dump( indent+1, fp );
- size->dump( indent+1, fp );
- chillindent(indent+1, fp);
+void chillAST_CudaMemcpy::dump(int indent, FILE *fp) {
+ chillindent(indent, fp);
+ fprintf(fp, "(CudaMemcpy \n");
+ dest->dump(indent + 1, fp);
+ src->dump(indent + 1, fp);
+ size->dump(indent + 1, fp);
+ chillindent(indent + 1, fp);
fprintf(fp, ",%s\n", cudaMemcpyKind);
- fflush(fp);
+ fflush(fp);
};
-class chillAST_node* chillAST_CudaMemcpy::constantFold() {
- dest = (chillAST_VarDecl *)dest->constantFold();
- src = (chillAST_VarDecl *)src->constantFold();
+class chillAST_node *chillAST_CudaMemcpy::constantFold() {
+ dest = (chillAST_VarDecl *) dest->constantFold();
+ src = (chillAST_VarDecl *) src->constantFold();
size = size->constantFold();
- return this;
+ return this;
}
-class chillAST_node* chillAST_CudaMemcpy::clone() {
- chillAST_CudaMemcpy *CMCPY = new chillAST_CudaMemcpy((chillAST_VarDecl *)(dest->clone()),(chillAST_VarDecl *)(src->clone()), size->clone(), strdup(cudaMemcpyKind), parent );
- CMCPY->isFromSourceFile = isFromSourceFile;
- if (filename) CMCPY->filename = strdup(filename);
+class chillAST_node *chillAST_CudaMemcpy::clone() {
+ chillAST_CudaMemcpy *CMCPY = new chillAST_CudaMemcpy((chillAST_VarDecl *) (dest->clone()),
+ (chillAST_VarDecl *) (src->clone()), size->clone(),
+ strdup(cudaMemcpyKind), parent);
+ CMCPY->isFromSourceFile = isFromSourceFile;
+ if (filename) CMCPY->filename = strdup(filename);
return CMCPY;
}
-void chillAST_CudaMemcpy::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool w ) {
- dest->gatherArrayRefs( refs, false );
- src ->gatherArrayRefs( refs, false );
- size->gatherArrayRefs( refs, false );
+void chillAST_CudaMemcpy::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool w) {
+ dest->gatherArrayRefs(refs, false);
+ src->gatherArrayRefs(refs, false);
+ size->gatherArrayRefs(refs, false);
}
-void chillAST_CudaMemcpy::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- dest->gatherScalarRefs( refs, false );
- src ->gatherScalarRefs( refs, false );
- size->gatherScalarRefs( refs, false );
-}
+void chillAST_CudaMemcpy::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ dest->gatherScalarRefs(refs, false);
+ src->gatherScalarRefs(refs, false);
+ size->gatherScalarRefs(refs, false);
+}
-void chillAST_CudaMemcpy::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- dest->gatherVarDecls( decls );
- src ->gatherVarDecls( decls );
- size->gatherVarDecls( decls );
+void chillAST_CudaMemcpy::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ dest->gatherVarDecls(decls);
+ src->gatherVarDecls(decls);
+ size->gatherVarDecls(decls);
}
-void chillAST_CudaMemcpy::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- dest->gatherScalarVarDecls( decls );
- src ->gatherScalarVarDecls( decls );
- size->gatherScalarVarDecls( decls );
+void chillAST_CudaMemcpy::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ dest->gatherScalarVarDecls(decls);
+ src->gatherScalarVarDecls(decls);
+ size->gatherScalarVarDecls(decls);
}
-void chillAST_CudaMemcpy::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- dest->gatherArrayVarDecls( decls );
- src ->gatherArrayVarDecls( decls );
- size->gatherArrayVarDecls( decls );
+void chillAST_CudaMemcpy::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ dest->gatherArrayVarDecls(decls);
+ src->gatherArrayVarDecls(decls);
+ size->gatherArrayVarDecls(decls);
}
-void chillAST_CudaMemcpy::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- dest->gatherVarUsage( decls );
- src ->gatherVarUsage( decls );
- size->gatherVarUsage( decls );
+void chillAST_CudaMemcpy::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ dest->gatherVarUsage(decls);
+ src->gatherVarUsage(decls);
+ size->gatherVarUsage(decls);
}
-
-chillAST_CudaSyncthreads::chillAST_CudaSyncthreads( chillAST_node *par) {
+chillAST_CudaSyncthreads::chillAST_CudaSyncthreads(chillAST_node *par) {
asttype = CHILLAST_NODETYPE_CUDASYNCTHREADS;
parent = par;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
-}
-
- void chillAST_CudaSyncthreads::print( int indent, FILE *fp ) {
- chillindent(indent, fp);
- fprintf(fp, "__syncthreads()");
- fflush(fp);
- }
-
- void chillAST_CudaSyncthreads::dump( int indent, FILE *fp ) {
- chillindent(indent, fp);
- fprintf(fp, "(syncthreads)\n");
- fflush(fp);
- }
-
-
-
-
-
-
+}
+void chillAST_CudaSyncthreads::print(int indent, FILE *fp) {
+ chillindent(indent, fp);
+ fprintf(fp, "__syncthreads()");
+ fflush(fp);
+}
+void chillAST_CudaSyncthreads::dump(int indent, FILE *fp) {
+ chillindent(indent, fp);
+ fprintf(fp, "(syncthreads)\n");
+ fflush(fp);
+}
-chillAST_ReturnStmt::chillAST_ReturnStmt( chillAST_node *retval, chillAST_node *par ) {
- asttype = CHILLAST_NODETYPE_RETURNSTMT;
+chillAST_ReturnStmt::chillAST_ReturnStmt(chillAST_node *retval, chillAST_node *par) {
+ asttype = CHILLAST_NODETYPE_RETURNSTMT;
returnvalue = retval;
- if (returnvalue) returnvalue->setParent( this );
- parent = par;
- isFromSourceFile = true; // default
+ if (returnvalue) returnvalue->setParent(this);
+ parent = par;
+ isFromSourceFile = true; // default
filename = NULL;
}
-void chillAST_ReturnStmt::print( int indent, FILE *fp) {
- printPreprocBEFORE(indent, fp);
+void chillAST_ReturnStmt::print(int indent, FILE *fp) {
+ printPreprocBEFORE(indent, fp);
chillindent(indent, fp);
if (returnvalue != NULL) {
fprintf(fp, "return(");
- returnvalue->print( 0, fp );
- fprintf(fp, ")" ); // parent will add ";\n" ??
- }
- else {
+ returnvalue->print(0, fp);
+ fprintf(fp, ")"); // parent will add ";\n" ??
+ } else {
fprintf(fp, "return");
}
- fflush(fp);
+ fflush(fp);
}
-void chillAST_ReturnStmt::dump( int indent, FILE *fp) {
+void chillAST_ReturnStmt::dump(int indent, FILE *fp) {
chillindent(indent, fp);
fprintf(fp, "(ReturnStmt");
if (returnvalue) {
fprintf(fp, "\n");
- returnvalue->dump(indent+1,fp);
+ returnvalue->dump(indent + 1, fp);
chillindent(indent, fp);
}
- fprintf(fp, ")\n");
+ fprintf(fp, ")\n");
}
-class chillAST_node* chillAST_ReturnStmt::constantFold() {
- if (returnvalue) returnvalue = returnvalue->constantFold();
+class chillAST_node *chillAST_ReturnStmt::constantFold() {
+ if (returnvalue) returnvalue = returnvalue->constantFold();
return this;
}
-
-class chillAST_node* chillAST_ReturnStmt::clone() {
- chillAST_node *val = NULL;
- if ( returnvalue ) val = returnvalue->clone();
- chillAST_ReturnStmt *RS = new chillAST_ReturnStmt( val, parent );
- RS->isFromSourceFile = isFromSourceFile;
- if (filename) RS->filename = strdup(filename);
+class chillAST_node *chillAST_ReturnStmt::clone() {
+ chillAST_node *val = NULL;
+ if (returnvalue) val = returnvalue->clone();
+ chillAST_ReturnStmt *RS = new chillAST_ReturnStmt(val, parent);
+ RS->isFromSourceFile = isFromSourceFile;
+ if (filename) RS->filename = strdup(filename);
return RS;
}
-void chillAST_ReturnStmt::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- if (returnvalue) returnvalue->gatherVarDecls( decls );
+void chillAST_ReturnStmt::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ if (returnvalue) returnvalue->gatherVarDecls(decls);
}
-void chillAST_ReturnStmt::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- if (returnvalue) returnvalue->gatherScalarVarDecls( decls );
+void chillAST_ReturnStmt::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ if (returnvalue) returnvalue->gatherScalarVarDecls(decls);
}
-void chillAST_ReturnStmt::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- if (returnvalue) returnvalue->gatherArrayVarDecls( decls );
+void chillAST_ReturnStmt::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ if (returnvalue) returnvalue->gatherArrayVarDecls(decls);
}
-
-void chillAST_ReturnStmt::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- if (returnvalue) returnvalue->gatherDeclRefExprs( refs );
+void chillAST_ReturnStmt::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ if (returnvalue) returnvalue->gatherDeclRefExprs(refs);
}
-
-void chillAST_ReturnStmt::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- if (returnvalue) returnvalue->gatherVarUsage( decls );
+void chillAST_ReturnStmt::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ if (returnvalue) returnvalue->gatherVarUsage(decls);
}
+chillAST_CallExpr::chillAST_CallExpr(chillAST_node *c,
+ chillAST_node *par) { //, int numofargs, chillAST_node **theargs ) {
-
-chillAST_CallExpr::chillAST_CallExpr(chillAST_node *c, chillAST_node *par) { //, int numofargs, chillAST_node **theargs ) {
-
- //fprintf(stderr, "chillAST_CallExpr::chillAST_CallExpr callee type %s\n", c->getTypeString());
+ //fprintf(stderr, "chillAST_CallExpr::chillAST_CallExpr callee type %s\n", c->getTypeString());
asttype = CHILLAST_NODETYPE_CALLEXPR;
callee = c;
- //callee->setParent( this ); // ??
+ //callee->setParent( this ); // ??
numargs = 0;
- parent = par;
+ parent = par;
grid = block = NULL;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
}
-void chillAST_CallExpr::addArg( chillAST_node *a ) {
- args.push_back( a );
- a->setParent( this );
+void chillAST_CallExpr::addArg(chillAST_node *a) {
+ args.push_back(a);
+ a->setParent(this);
numargs += 1;
}
-void chillAST_CallExpr::print( int indent, FILE *fp) {
- printPreprocBEFORE(indent, fp);
+void chillAST_CallExpr::print(int indent, FILE *fp) {
+ printPreprocBEFORE(indent, fp);
chillindent(indent, fp);
chillAST_FunctionDecl *FD = NULL;
chillAST_MacroDefinition *MD = NULL;
- if (callee->isDeclRefExpr()) {
- chillAST_DeclRefExpr *DRE = (chillAST_DeclRefExpr *) callee;
- //fprintf(stderr, "DRE decl is 0x%x\n", DRE->decl);
- if (!DRE->decl) {
- // a macro?
- fprintf(fp, "%s ", DRE->declarationName);
- return; // ??
+ if (callee->isDeclRefExpr()) {
+ chillAST_DeclRefExpr *DRE = (chillAST_DeclRefExpr *) callee;
+ //fprintf(stderr, "DRE decl is 0x%x\n", DRE->decl);
+ if (!DRE->decl) {
+ // a macro?
+ fprintf(fp, "%s ", DRE->declarationName);
+ return; // ??
}
- //fprintf(stderr, "DRE decl of type %s\n", DRE->decl->getTypeString());
- if ( (DRE->decl)->isFunctionDecl()) FD = (chillAST_FunctionDecl *)DRE->decl;
- else {
- fprintf(stderr, "chillAST_CallExpr::print() DRE decl of type %s\n", DRE->decl->getTypeString());
+ //fprintf(stderr, "DRE decl of type %s\n", DRE->decl->getTypeString());
+ if ((DRE->decl)->isFunctionDecl()) FD = (chillAST_FunctionDecl *) DRE->decl;
+ else {
+ fprintf(stderr, "chillAST_CallExpr::print() DRE decl of type %s\n", DRE->decl->getTypeString());
exit(-1);
}
- }
- else if (callee->isFunctionDecl()) FD = (chillAST_FunctionDecl *) callee;
- else if (callee->isMacroDefinition()) {
+ } else if (callee->isFunctionDecl()) FD = (chillAST_FunctionDecl *) callee;
+ else if (callee->isMacroDefinition()) {
MD = (chillAST_MacroDefinition *) callee;
- fprintf(fp, "%s(", MD->macroName);
- }
- else {
- fprintf(stderr, "\nchillAST_CallExpr::print() callee of unhandled type %s\n", callee->getTypeString());
+ fprintf(fp, "%s(", MD->macroName);
+ } else {
+ fprintf(stderr, "\nchillAST_CallExpr::print() callee of unhandled type %s\n", callee->getTypeString());
callee->dump();
- exit(-1);
+ exit(-1);
}
-
- if (FD) {
- fprintf(fp, "%s", FD->functionName ); fflush(fp);
+
+ if (FD) {
+ fprintf(fp, "%s", FD->functionName);
+ fflush(fp);
if (grid && block) {
fprintf(fp, "<<<%s,%s>>>(", grid->varname, block->varname); // a
- }
- else fprintf(fp, "(");
+ } else fprintf(fp, "(");
}
//callee->print( indent, fp);
- for (int i=0; i<args.size(); i++) {
- if (i!=0) fprintf(fp, ", ");
- args[i]->print(0, fp);
+ for (int i = 0; i < args.size(); i++) {
+ if (i != 0) fprintf(fp, ", ");
+ args[i]->print(0, fp);
}
fprintf(fp, ")"); //a
- fflush(fp);
+ fflush(fp);
}
-void chillAST_CallExpr::dump( int indent, FILE *fp) {
+void chillAST_CallExpr::dump(int indent, FILE *fp) {
chillindent(indent, fp);
fprintf(fp, "(CallExpr ");
- //fprintf(stderr, "callee type %s\n", callee->getTypeString());
+ //fprintf(stderr, "callee type %s\n", callee->getTypeString());
chillAST_FunctionDecl *fd = NULL;
if (callee->isDeclRefExpr()) { // always?
- chillAST_DeclRefExpr *dre = (chillAST_DeclRefExpr *)callee;
+ chillAST_DeclRefExpr *dre = (chillAST_DeclRefExpr *) callee;
fd = dre->getFunctionDecl(); // if NULL, we've got a Vardecl instead
if (fd) {
- //fd->print();
+ //fd->print();
fprintf(fp, "%s\n", fd->returnType);
}
- callee->dump(indent+1, fp);
- if (fd) {
+ callee->dump(indent + 1, fp);
+ if (fd) {
int numparams = fd->parameters.size();
- for (int i=0; i<numparams; i++) fd->parameters[i]->dump(indent+1, fp);
+ for (int i = 0; i < numparams; i++) fd->parameters[i]->dump(indent + 1, fp);
}
}
chillindent(indent, fp);
fprintf(fp, ")\n");
}
-void chillAST_CallExpr::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool writtento ) {
- for (int i=0; i<args.size(); i++) {
- args[i]->gatherArrayRefs( refs, writtento );
+void chillAST_CallExpr::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool writtento) {
+ for (int i = 0; i < args.size(); i++) {
+ args[i]->gatherArrayRefs(refs, writtento);
}
}
-void chillAST_CallExpr::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- for (int i=0; i<args.size(); i++) {
- args[i]->gatherScalarRefs( refs, writtento );
+
+void chillAST_CallExpr::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ for (int i = 0; i < args.size(); i++) {
+ args[i]->gatherScalarRefs(refs, writtento);
}
-}
+}
-void chillAST_CallExpr::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- for (int i=0; i<args.size(); i++) {
- args[i]->gatherVarDecls( decls );
+void chillAST_CallExpr::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ for (int i = 0; i < args.size(); i++) {
+ args[i]->gatherVarDecls(decls);
}
}
-void chillAST_CallExpr::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- for (int i=0; i<args.size(); i++) {
- args[i]->gatherScalarVarDecls( decls );
+void chillAST_CallExpr::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ for (int i = 0; i < args.size(); i++) {
+ args[i]->gatherScalarVarDecls(decls);
}
}
-void chillAST_CallExpr::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- for (int i=0; i<args.size(); i++) {
- args[i]->gatherArrayVarDecls( decls );
+void chillAST_CallExpr::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ for (int i = 0; i < args.size(); i++) {
+ args[i]->gatherArrayVarDecls(decls);
}
}
-void chillAST_CallExpr::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- for (int i=0; i<args.size(); i++) {
- args[i]->gatherDeclRefExprs( refs );
+void chillAST_CallExpr::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ for (int i = 0; i < args.size(); i++) {
+ args[i]->gatherDeclRefExprs(refs);
}
}
-void chillAST_CallExpr::replaceVarDecls( chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl){
- for (int i=0; i<args.size(); i++) args[i]->replaceVarDecls( olddecl, newdecl );
+void chillAST_CallExpr::replaceVarDecls(chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
+ for (int i = 0; i < args.size(); i++) args[i]->replaceVarDecls(olddecl, newdecl);
}
-void chillAST_CallExpr::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- for (int i=0; i<args.size(); i++) {
- args[i]->gatherVarUsage( decls );
+void chillAST_CallExpr::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ for (int i = 0; i < args.size(); i++) {
+ args[i]->gatherVarUsage(decls);
}
}
-chillAST_node* chillAST_CallExpr::constantFold() {
- numargs = args.size(); // wrong place for this
- for (int i=0; i<numargs; i++) {
- args[i] = args[i]->constantFold();
+chillAST_node *chillAST_CallExpr::constantFold() {
+ numargs = args.size(); // wrong place for this
+ for (int i = 0; i < numargs; i++) {
+ args[i] = args[i]->constantFold();
}
- return this;
+ return this;
}
-chillAST_node* chillAST_CallExpr::clone() {
+chillAST_node *chillAST_CallExpr::clone() {
//fprintf(stderr, "chillAST_CallExpr::clone()\n");
- //print(0, stderr); fprintf(stderr, "\n");
+ //print(0, stderr); fprintf(stderr, "\n");
- chillAST_CallExpr *CE = new chillAST_CallExpr( callee->clone(), NULL );
- for (int i=0; i<args.size(); i++) CE->addArg( args[i]->clone() );
- CE->isFromSourceFile = isFromSourceFile;
- if (filename) CE->filename = strdup(filename);
- return CE;
+ chillAST_CallExpr *CE = new chillAST_CallExpr(callee->clone(), NULL);
+ for (int i = 0; i < args.size(); i++) CE->addArg(args[i]->clone());
+ CE->isFromSourceFile = isFromSourceFile;
+ if (filename) CE->filename = strdup(filename);
+ return CE;
}
-
-
-chillAST_VarDecl::chillAST_VarDecl() {
- //fprintf(stderr, "0chillAST_VarDecl::chillAST_VarDecl() %p\n", this);
- fprintf(stderr, "0chillAST_VarDecl::chillAST_VarDecl()\n");
+chillAST_VarDecl::chillAST_VarDecl() {
+ //fprintf(stderr, "0chillAST_VarDecl::chillAST_VarDecl() %p\n", this);
+ fprintf(stderr, "0chillAST_VarDecl::chillAST_VarDecl()\n");
vartype = underlyingtype = varname = arraypart = arraypointerpart = arraysetpart = NULL;
- typedefinition = NULL;
+ typedefinition = NULL;
- //fprintf(stderr, "setting underlying type NULL\n" );
+ //fprintf(stderr, "setting underlying type NULL\n" );
init = NULL;
- numdimensions=0; arraysizes = NULL;
- asttype = CHILLAST_NODETYPE_VARDECL; //
+ numdimensions = 0;
+ arraysizes = NULL;
+ asttype = CHILLAST_NODETYPE_VARDECL; //
parent = NULL;
metacomment = NULL;
- vardef = NULL;
+ vardef = NULL;
isStruct = false;
-
- //insideAStruct = false;
- isAParameter = false;
+
+ //insideAStruct = false;
+ isAParameter = false;
byreference = false;
- isABuiltin = false;
- isRestrict = isDevice = isShared = false; // fprintf(stderr, "RDS = false\n");
+ isABuiltin = false;
+ isRestrict = isDevice = isShared = false; // fprintf(stderr, "RDS = false\n");
knownArraySizes = false;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
-};
-
+};
-chillAST_VarDecl::chillAST_VarDecl( const char *t, const char *n, const char *a, chillAST_node *par) {
- //fprintf(stderr, "1chillAST_VarDecl::chillAST_VarDecl( type %s, name %s, arraypart %s, parent %p) %p\n", t, n, a, par, this);
- fprintf(stderr, "1chillAST_VarDecl::chillAST_VarDecl( type %s, name %s, arraypart %s)\n", t, n, a);
- vartype = strdup(t);
+chillAST_VarDecl::chillAST_VarDecl(const char *t, const char *n, const char *a, chillAST_node *par) {
+ //fprintf(stderr, "1chillAST_VarDecl::chillAST_VarDecl( type %s, name %s, arraypart %s, parent %p) %p\n", t, n, a, par, this);
+ fprintf(stderr, "1chillAST_VarDecl::chillAST_VarDecl( type %s, name %s, arraypart %s)\n", t, n, a);
+ vartype = strdup(t);
typedefinition = NULL;
- underlyingtype = parseUnderlyingType( vartype );
- //fprintf(stderr, "setting underlying type %s from %s\n", underlyingtype, vartype );
- varname = strdup(n);
+ underlyingtype = parseUnderlyingType(vartype);
+ //fprintf(stderr, "setting underlying type %s from %s\n", underlyingtype, vartype );
+ varname = strdup(n);
arraypointerpart = arraysetpart = NULL;
if (a) arraypart = strdup(a);
- else arraypart = strdup("");
+ else arraypart = strdup("");
splitarraypart();
init = NULL;
- numdimensions=0; arraysizes = NULL;
+ numdimensions = 0;
+ arraysizes = NULL;
uniquePtr = NULL;
asttype = CHILLAST_NODETYPE_VARDECL;
parent = par;
-
- knownArraySizes = false;
- //fprintf(stderr, "arraypart len %d\n", strlen(a));
- for (int i=0; i<strlen(a); i++) {
- if (a[i] == '[') { numdimensions++; knownArraySizes = true; }
+ knownArraySizes = false;
+ //fprintf(stderr, "arraypart len %d\n", strlen(a));
+ for (int i = 0; i < strlen(a); i++) {
+ if (a[i] == '[') {
+ numdimensions++;
+ knownArraySizes = true;
+ }
if (!knownArraySizes && a[i] == '*') numdimensions++;
}
-
- vardef = NULL;
+
+ vardef = NULL;
isStruct = false;
-
- //insideAStruct = false;
- isAParameter = false;
+
+ //insideAStruct = false;
+ isAParameter = false;
byreference = false;
- isABuiltin = false;
- isRestrict = isDevice = isShared = false; // fprintf(stderr, "RDS = false\n");
+ isABuiltin = false;
+ isRestrict = isDevice = isShared = false; // fprintf(stderr, "RDS = false\n");
+
+ if (parent) {
+ //fprintf(stderr, "chillAST_VarDecl::chillAST_VarDecl( %s ), adding to symbol table???\n", varname);
+ parent->addVariableToSymbolTable(this); // should percolate up until something has a symbol table
- if (parent) {
- //fprintf(stderr, "chillAST_VarDecl::chillAST_VarDecl( %s ), adding to symbol table???\n", varname);
- parent->addVariableToSymbolTable( this ); // should percolate up until something has a symbol table
-
}
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
-};
-
+};
-chillAST_VarDecl::chillAST_VarDecl( chillAST_RecordDecl *astruct, const char *nam, const char *array, chillAST_node *par) {
+chillAST_VarDecl::chillAST_VarDecl(chillAST_RecordDecl *astruct, const char *nam, const char *array,
+ chillAST_node *par) {
// define a variable whose type is a struct!
-
- fprintf(stderr, "3chillAST_VarDecl::chillAST_VarDecl( %s %p struct ", nam, this );
- const char *type = astruct->getName();
- fprintf (stderr, "%s, name %s, arraypart %s parent ) %p\n", type, nam, array, this); // , par);
+
+ fprintf(stderr, "3chillAST_VarDecl::chillAST_VarDecl( %s %p struct ", nam, this);
+ const char *type = astruct->getName();
+ fprintf(stderr, "%s, name %s, arraypart %s parent ) %p\n", type, nam, array, this); // , par);
vartype = strdup(type);
- // these always go together ??
- vardef = astruct;// pointer to the thing that says what is inside the struct
- isStruct = true; // ?? wrong if it's a union ?? TODO
-
- //insideAStruct = false;
- //fprintf(stderr, "setting vardef of %s to %p\n", nam, vardef);
-
- underlyingtype = parseUnderlyingType( vartype );
- //fprintf(stderr, "setting underlying type %s from %s\n", underlyingtype, vartype );
- varname = strdup(nam);
+ // these always go together ??
+ vardef = astruct;// pointer to the thing that says what is inside the struct
+ isStruct = true; // ?? wrong if it's a union ?? TODO
+
+ //insideAStruct = false;
+ //fprintf(stderr, "setting vardef of %s to %p\n", nam, vardef);
+
+ underlyingtype = parseUnderlyingType(vartype);
+ //fprintf(stderr, "setting underlying type %s from %s\n", underlyingtype, vartype );
+ varname = strdup(nam);
arraypart = strdup(array);
arraypointerpart = arraysetpart = NULL;
- splitarraypart();
+ splitarraypart();
init = NULL;
- numdimensions=0; arraysizes = NULL;
+ numdimensions = 0;
+ arraysizes = NULL;
uniquePtr = NULL;
asttype = CHILLAST_NODETYPE_VARDECL;
parent = par;
- knownArraySizes = false;
- //fprintf(stderr, "arraypart len %d\n", strlen(a));
- for (int i=0; i<strlen(array); i++) {
- if (array[i] == '[') { numdimensions++; knownArraySizes = true; }
+ knownArraySizes = false;
+ //fprintf(stderr, "arraypart len %d\n", strlen(a));
+ for (int i = 0; i < strlen(array); i++) {
+ if (array[i] == '[') {
+ numdimensions++;
+ knownArraySizes = true;
+ }
if (!knownArraySizes && array[i] == '*') numdimensions++;
}
-
+
isAParameter = false;
- fprintf(stderr, "%s is NOT a parameter\n", nam);
+ fprintf(stderr, "%s is NOT a parameter\n", nam);
byreference = false;
- isABuiltin = false;
- isRestrict = isDevice = isShared = false; // fprintf(stderr, "RDS = false\n");
+ isABuiltin = false;
+ isRestrict = isDevice = isShared = false; // fprintf(stderr, "RDS = false\n");
typedefinition = NULL;
- //fprintf(stderr, "chillAST_VarDecl::chillAST_VarDecl( chillAST_RecordDecl *astruct, ...) MIGHT add struct to some symbol table\n");
- //if (parent) fprintf(stderr, "yep, adding it\n");
+ //fprintf(stderr, "chillAST_VarDecl::chillAST_VarDecl( chillAST_RecordDecl *astruct, ...) MIGHT add struct to some symbol table\n");
+ //if (parent) fprintf(stderr, "yep, adding it\n");
- if (parent) parent->addVariableToSymbolTable( this ); // should percolate up until something has a symbol table
+ if (parent) parent->addVariableToSymbolTable(this); // should percolate up until something has a symbol table
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
-};
-
-
-
+};
-chillAST_VarDecl::chillAST_VarDecl( chillAST_TypedefDecl *tdd, const char *n, const char *a, chillAST_node *par) {
+chillAST_VarDecl::chillAST_VarDecl(chillAST_TypedefDecl *tdd, const char *n, const char *a, chillAST_node *par) {
fprintf(stderr, "4chillAST_VarDecl::chillAST_VarDecl( %s typedef ", n);
const char *type = tdd->getStructName();
//fprintf (stderr, "%s, name %s, arraypart %s parent ) %p\n", type, n, a,this); // , par);
typedefinition = tdd;
- vartype = strdup(type);
- underlyingtype = parseUnderlyingType( vartype );
- //fprintf(stderr, "setting underlying type %s from %s\n", underlyingtype, vartype );
- varname = strdup(n);
+ vartype = strdup(type);
+ underlyingtype = parseUnderlyingType(vartype);
+ //fprintf(stderr, "setting underlying type %s from %s\n", underlyingtype, vartype );
+ varname = strdup(n);
arraypart = strdup(a);
arraypointerpart = arraysetpart = NULL;
- splitarraypart();
+ splitarraypart();
init = NULL;
- numdimensions=0; arraysizes = NULL;
+ numdimensions = 0;
+ arraysizes = NULL;
uniquePtr = NULL;
asttype = CHILLAST_NODETYPE_VARDECL;
parent = par;
- knownArraySizes = false;
- //fprintf(stderr, "arraypart len %d\n", strlen(a));
- for (int i=0; i<strlen(a); i++) {
- if (a[i] == '[') { numdimensions++; knownArraySizes = true; }
+ knownArraySizes = false;
+ //fprintf(stderr, "arraypart len %d\n", strlen(a));
+ for (int i = 0; i < strlen(a); i++) {
+ if (a[i] == '[') {
+ numdimensions++;
+ knownArraySizes = true;
+ }
if (!knownArraySizes && a[i] == '*') numdimensions++;
}
isStruct = tdd->isAStruct();
-
- //insideAStruct = false;
-
- vardef = NULL;
+ //insideAStruct = false;
- isAParameter = false;
- byreference = false;
- isABuiltin = false;
- isRestrict = isDevice = isShared = false; // //fprintf(stderr, "RDS = false\n");
- if (parent) parent->addVariableToSymbolTable( this ); // should percolate up until something has a symbol table
- isFromSourceFile = true; // default
- filename = NULL;
-};
-
+ vardef = NULL;
+ isAParameter = false;
+ byreference = false;
+ isABuiltin = false;
+ isRestrict = isDevice = isShared = false; // //fprintf(stderr, "RDS = false\n");
+ if (parent) parent->addVariableToSymbolTable(this); // should percolate up until something has a symbol table
+ isFromSourceFile = true; // default
+ filename = NULL;
+};
-chillAST_VarDecl::chillAST_VarDecl( const char *t, const char *n, const char *a, void *ptr, chillAST_node *par) {
+chillAST_VarDecl::chillAST_VarDecl(const char *t, const char *n, const char *a, void *ptr, chillAST_node *par) {
CHILL_DEBUG_PRINT("chillAST_VarDecl::chillAST_VarDecl( type %s, name %s, arraypart '%s' ) %p\n", t, n, a, this);
- vartype = strdup(t);
+ vartype = strdup(t);
typedefinition = NULL;
- underlyingtype = parseUnderlyingType( vartype );
- //fprintf(stderr, "setting underlying type %s from %s\n", underlyingtype, vartype );
- varname = strdup(n);
+ underlyingtype = parseUnderlyingType(vartype);
+ //fprintf(stderr, "setting underlying type %s from %s\n", underlyingtype, vartype );
+ varname = strdup(n);
vardef = NULL; // not a struct
isStruct = false;
- isAParameter = false;
-
+ isAParameter = false;
+
if (a) arraypart = strdup(a);
else arraypart = strdup(""); // should catch this earlier
arraypointerpart = arraysetpart = NULL;
- splitarraypart();
+ splitarraypart();
init = NULL;
- numdimensions=0; arraysizes = NULL;
+ numdimensions = 0;
+ arraysizes = NULL;
uniquePtr = ptr;
asttype = CHILLAST_NODETYPE_VARDECL;
parent = par;
- knownArraySizes = false;
+ knownArraySizes = false;
if (par) par->addChild(this); // ??
-
- //fprintf(stderr, "name arraypart len %d\n", strlen(a));
- //fprintf(stderr, "arraypart '%s'\n", arraypart);
- for (int i=0; i<strlen(a); i++) {
- if (a[i] == '[') { numdimensions++; knownArraySizes = true; }
- if (!knownArraySizes && a[i] == '*') numdimensions++; // fails for a[4000 * 4]
- }
- //if (0 == strlen(a) && numdimensions == 0) {
- // for (int i=0; i<strlen(t); i++) { // handle float * x
+
+ //fprintf(stderr, "name arraypart len %d\n", strlen(a));
+ //fprintf(stderr, "arraypart '%s'\n", arraypart);
+ for (int i = 0; i < strlen(a); i++) {
+ if (a[i] == '[') {
+ numdimensions++;
+ knownArraySizes = true;
+ }
+ if (!knownArraySizes && a[i] == '*') numdimensions++; // fails for a[4000 * 4]
+ }
+ //if (0 == strlen(a) && numdimensions == 0) {
+ // for (int i=0; i<strlen(t); i++) { // handle float * x
// if (t[i] == '[') numdimensions++;
// if (t[i] == '*') numdimensions++;
- // }
- //}
- //fprintf(stderr, "2name %s numdimensions %d\n", n, numdimensions);
+ // }
+ //}
+ //fprintf(stderr, "2name %s numdimensions %d\n", n, numdimensions);
@@ -5360,674 +5284,655 @@ chillAST_VarDecl::chillAST_VarDecl( const char *t, const char *n, const char *a
//knownArraySizes = true;
//if (index(vartype, '*')) knownArraySizes = false; // float *a; for example
//if (index(arraypart, '*')) knownArraySizes = false;
-
+
// note: vartype here, arraypart in next code.. is that right?
- if (index(vartype, '*')) {
- for (int i = 0; i<strlen(vartype); i++) if (vartype[i] == '*') numdim++;
+ if (index(vartype, '*')) {
+ for (int i = 0; i < strlen(vartype); i++) if (vartype[i] == '*') numdim++;
//fprintf(stderr, "numd %d\n", numd);
- numdimensions = numdim;
+ numdimensions = numdim;
}
-
+
if (index(arraypart, '[')) { // JUST [12][34][56] no asterisks
char *dupe = strdup(arraypart);
int len = strlen(arraypart);
- for (int i=0; i<len; i++) if (dupe[i] == '[') numdim++;
-
+ for (int i = 0; i < len; i++) if (dupe[i] == '[') numdim++;
+
//fprintf(stderr, "numdim %d\n", numdim);
-
- numdimensions = numdim;
- int *as = (int *)malloc(sizeof(int *) * numdim );
- if (!as) {
+
+ numdimensions = numdim;
+ int *as = (int *) malloc(sizeof(int *) * numdim);
+ if (!as) {
fprintf(stderr, "can't malloc array sizes in ConvertVarDecl()\n");
exit(-1);
}
arraysizes = as; // 'as' changed later!
-
-
+
+
char *ptr = dupe;
//fprintf(stderr, "dupe '%s'\n", ptr);
while (ptr = index(ptr, '[')) { // this fails for float a[4000*4]
ptr++;
char *leak = strdup(ptr);
char *close = index(leak, ']');
- if (close) *close = '\0';
+ if (close) *close = '\0';
int l = strlen(leak);
bool justdigits = true;
bool justmath = true;
- for (int i=0; i<l; i++) {
- char c = leak[i];
+ for (int i = 0; i < l; i++) {
+ char c = leak[i];
if (!isdigit(c)) justdigits = false;
- if (!( isdigit(c) ||
- isblank(c) ||
- ((c == '+') || (c == '*') || (c == '*') || (c == '*')) || // math
- ((c == '(') || (c == ')')))
- ) {
- //fprintf(stderr, " not justmath because '%c'\n", c);
- justmath = false;
+ if (!(isdigit(c) ||
+ isblank(c) ||
+ ((c == '+') || (c == '*') || (c == '*') || (c == '*')) || // math
+ ((c == '(') || (c == ')')))
+ ) {
+ //fprintf(stderr, " not justmath because '%c'\n", c);
+ justmath = false;
}
-
+
}
//fprintf(stderr, "tmp '%s'\n", leak);
- if (justdigits) {
+ if (justdigits) {
int dim;
sscanf(ptr, "%d", &dim);
//fprintf(stderr, "dim %d\n", dim);
- *as++ = dim;
- }
- else {
+ *as++ = dim;
+ } else {
if (justmath) fprintf(stderr, "JUST MATH\n");
- fprintf(stderr, "need to evaluate %s, faking with hardcoded 16000\n", leak);
- *as++ = 16000; // temp TODO DFL
+ fprintf(stderr, "need to evaluate %s, faking with hardcoded 16000\n", leak);
+ *as++ = 16000; // temp TODO DFL
}
- free (leak);
+ free(leak);
- ptr = index(ptr, ']');
- //fprintf(stderr, "bottom of loop, ptr = '%s'\n", ptr);
+ ptr = index(ptr, ']');
+ //fprintf(stderr, "bottom of loop, ptr = '%s'\n", ptr);
}
free(dupe);
- //for (int i=0; i<numdim; i++) {
- // fprintf(stderr, "dimension %d = %d\n", i, arraysizes[i]);
- //}
-
+ //for (int i=0; i<numdim; i++) {
+ // fprintf(stderr, "dimension %d = %d\n", i, arraysizes[i]);
+ //}
+
//fprintf(stderr, "need to handle [] array to determine num dimensions\n");
- //exit(-1);
+ //exit(-1);
}
-
-
- //insideAStruct = false;
+
+
+ //insideAStruct = false;
byreference = false;
- isABuiltin = false;
- isRestrict = isDevice = isShared = false; // fprintf(stderr, "RDS = false\n");
-
- //print(); printf("\n"); fflush(stdout);
+ isABuiltin = false;
+ isRestrict = isDevice = isShared = false; // fprintf(stderr, "RDS = false\n");
- // currently this is bad, because a struct does not have a symbol table, so the
- // members of a struct are passed up to the func or sourcefile.
- if (parent) parent->addVariableToSymbolTable( this ); // should percolate up until something has a symbol table
+ //print(); printf("\n"); fflush(stdout);
+ // currently this is bad, because a struct does not have a symbol table, so the
+ // members of a struct are passed up to the func or sourcefile.
+ if (parent) parent->addVariableToSymbolTable(this); // should percolate up until something has a symbol table
- isFromSourceFile = true; // default
+
+ isFromSourceFile = true; // default
filename = NULL;
CHILL_DEBUG_PRINT("LEAVING\n");
//parent->print(); fprintf(stderr, "\n\n");
-};
+};
-void chillAST_VarDecl::print( int indent, FILE *fp ) {
+void chillAST_VarDecl::print(int indent, FILE *fp) {
//fprintf(fp, "chillAST_VarDecl::print()\n");
-
- printPreprocBEFORE(indent, fp);
- //fprintf(fp, "VarDecl vartype '%s' varname %s ", vartype, varname);
+ printPreprocBEFORE(indent, fp);
+
+ //fprintf(fp, "VarDecl vartype '%s' varname %s ", vartype, varname);
//if (isAStruct()) fprintf(fp, "isAStruct()\n");
//else fprintf(fp, "NOT A Struct\n");
// fprintf(fp, "\n"); fflush(fp); dump(0,fp); fflush(fp); // debug
chillindent(indent, fp);
- //fprintf(fp, "vardecl->print vartype '%s'\n", vartype);
- if (isDevice) fprintf(fp, "__device__ ");
- if (isShared) fprintf(fp, "__shared__ ");
-
+ //fprintf(fp, "vardecl->print vartype '%s'\n", vartype);
+ if (isDevice) fprintf(fp, "__device__ ");
+ if (isShared) fprintf(fp, "__shared__ ");
+
//if (isAStruct()) fprintf(fp, "/* isAStruct() */ ");
//else fprintf(fp, "/* NOT A Struct() */ ");
- //if (vardef) fprintf(fp, "/* vardef */ ");
- //else fprintf(fp, "/* NOT vardef */ ");
+ //if (vardef) fprintf(fp, "/* vardef */ ");
+ //else fprintf(fp, "/* NOT vardef */ ");
- //fprintf(stderr, "chillAST_VarDecl::print() %s\n", varname );
- //if (isParmVarDecl()) fprintf(stderr, "%s is a parameter\n", varname);
- //if (isAStruct()) fprintf(stderr, "%s is a struct\n", varname);
- //else fprintf(stderr, "%s is NOT a struct\n", varname);
+ //fprintf(stderr, "chillAST_VarDecl::print() %s\n", varname );
+ //if (isParmVarDecl()) fprintf(stderr, "%s is a parameter\n", varname);
+ //if (isAStruct()) fprintf(stderr, "%s is a struct\n", varname);
+ //else fprintf(stderr, "%s is NOT a struct\n", varname);
//if (!parent) fprintf(stderr, "VARDECL HAS NO PARENT\n");
- //else fprintf(stderr, "parent of %s is type %s\n", varname, parent->getTypeString());
+ //else fprintf(stderr, "parent of %s is type %s\n", varname, parent->getTypeString());
// this logic is probably wrong (what about pointer to struct? )
//fprintf(stderr, "checking for unnamed only used here\n");
if ((!isAParameter) && isAStruct() && vardef) { // an unnamed struct used only here ??
-
+
//fprintf(fp, "i%s sAStruct() && vardef ?? vardecl of type UNNAMED ONLY USED HERE \n", varname );
- // print the internals of the struct and then the name
- vardef->printStructure( 0, fp );
- fprintf(fp, "%s", varname );
-
+ // print the internals of the struct and then the name
+ vardef->printStructure(0, fp);
+ fprintf(fp, "%s", varname);
+
return;
}
-
- //fprintf(fp, "ugly logic\n");
+
+ //fprintf(fp, "ugly logic\n");
// ugly logic TODO
-
- if (typedefinition && typedefinition->isAStruct()) fprintf(fp, "struct ");
+
+ if (typedefinition && typedefinition->isAStruct()) fprintf(fp, "struct ");
if (isAParameter) {
- //fprintf(fp, "%s isaparameter\n", varname);
- //if (isAStruct()) fprintf(fp, "struct ");
- //fprintf(fp, "(param) nd %d", numdimensions );
- //dump();
+ //fprintf(fp, "%s isaparameter\n", varname);
+ //if (isAStruct()) fprintf(fp, "struct ");
+ //fprintf(fp, "(param) nd %d", numdimensions );
+ //dump();
if (numdimensions > 0) {
- if (knownArraySizes) { // just [12][34][56]
+ if (knownArraySizes) { // just [12][34][56]
fprintf(fp, "%s ", vartype);
if (byreference) fprintf(fp, "&");
fprintf(fp, "%s", varname);
- for (int n=0; n< (numdimensions); n++) fprintf(fp, "[%d]", arraysizes[n]);
- }
- else { // some unknown array part float *a; or float **a; or float (*)a[1234]
+ for (int n = 0; n < (numdimensions); n++) fprintf(fp, "[%d]", arraysizes[n]);
+ } else { // some unknown array part float *a; or float **a; or float (*)a[1234]
//fprintf(fp, "\nsome unknown\n");
//fprintf(fp, "arraypointerpart '%s'\n", arraypointerpart);
//fprintf(fp, "arraysetpart '%s'\n", arraysetpart);
-
- if (numdimensions == 1) {
- //fprintf(fp, "\nnd1, vartype %s\n", vartype);
-
+
+ if (numdimensions == 1) {
+ //fprintf(fp, "\nnd1, vartype %s\n", vartype);
+
// TODO this if means I have probably made a mistake somewhere
- if (!index(vartype, '*')) fprintf(fp, "%s *%s", vartype, varname ); // float *x
+ if (!index(vartype, '*')) fprintf(fp, "%s *%s", vartype, varname); // float *x
else fprintf(fp, "%s%s", vartype, varname); // float *a;
-
- }
- else { // more than one dimension
- if ( !strcmp("", arraysetpart) ) { // no known dimensions float ***a;
- fprintf(fp, "%s %s%s", vartype, arraypointerpart, varname);
- }
- else if ( !strcmp("", arraypointerpart)) { // ALL known float a[2][7];
- fprintf(fp, "%s %s", vartype, varname);
- for (int n=0; n< numdimensions; n++) fprintf(fp, "[%d]", arraysizes[n]);
- }
- else { // float (*)a[1234]
- // this seems really wrong
- // float (*)a[1234]
- fprintf(fp, "%s (", vartype);
- for (int n=0; n< (numdimensions-1); n++) fprintf(fp, "*");
+ } else { // more than one dimension
+
+ if (!strcmp("", arraysetpart)) { // no known dimensions float ***a;
+ fprintf(fp, "%s %s%s", vartype, arraypointerpart, varname);
+ } else if (!strcmp("", arraypointerpart)) { // ALL known float a[2][7];
+ fprintf(fp, "%s %s", vartype, varname);
+ for (int n = 0; n < numdimensions; n++) fprintf(fp, "[%d]", arraysizes[n]);
+ } else { // float (*)a[1234]
+ // this seems really wrong
+ // float (*)a[1234]
+ fprintf(fp, "%s (", vartype);
+ for (int n = 0; n < (numdimensions - 1); n++) fprintf(fp, "*");
fprintf(fp, "%s)", varname);
- fprintf(fp, "[%d]", arraysizes[numdimensions-1]);
+ fprintf(fp, "[%d]", arraysizes[numdimensions - 1]);
}
-
+
}
}
} // if numdimensions > 0
else { // parameter float x
- fprintf(fp, "%s ", vartype);
- if (byreference) fprintf(fp, "&");
- fprintf(fp, "%s", varname);
+ fprintf(fp, "%s ", vartype);
+ if (byreference) fprintf(fp, "&");
+ fprintf(fp, "%s", varname);
}
- } // end parameter
+ } // end parameter
else { // NOT A PARAMETER
- //fprintf(fp, "NOT A PARAM ... vartype '%s'\n", vartype);
+ //fprintf(fp, "NOT A PARAM ... vartype '%s'\n", vartype);
//if (isArray()) fprintf(stderr, "an array, numdimensions %d\n", numdimensions);
//fprintf(stderr, "arraysizes %p\n", arraysizes);
-
-
-
- //if (isArray() && arraysizes == NULL) {
+
+
+
+ //if (isArray() && arraysizes == NULL) {
// // we just know the number of dimensions but no sizes
// // int ***something
// fprintf(fp, "%s ", vartype); // "int "
// for (int i=0; i<numdimensions; i++) fprintf(fp, "*"); // ***
- // fprintf(fp, "%s", varname); // variable name
+ // fprintf(fp, "%s", varname); // variable name
// }
- // else
-
- fprintf(fp, "%s %s", vartype, arraypointerpart);
+ // else
+
+ fprintf(fp, "%s %s", vartype, arraypointerpart);
if (isRestrict) fprintf(fp, " __restrict__ "); // wrong place
- fprintf(fp, "%s%s", varname, arraysetpart );
- if (init) {
- fprintf(fp, " = "); fflush(fp);
+ fprintf(fp, "%s%s", varname, arraysetpart);
+ if (init) {
+ fprintf(fp, " = ");
+ fflush(fp);
init->print(0, fp);
}
}
- fflush(fp);
- //fprintf(stderr, "numdimensions %d arraysizes address 0x%x\n", numdimensions, arraysizes);
- //if (!isAParameter) fprintf(fp, ";\n", vartype, varname, arraypart );
+ fflush(fp);
+ //fprintf(stderr, "numdimensions %d arraysizes address 0x%x\n", numdimensions, arraysizes);
+ //if (!isAParameter) fprintf(fp, ";\n", vartype, varname, arraypart );
};
-
-
-void chillAST_VarDecl::printName( int in, FILE *fp ) {
+void chillAST_VarDecl::printName(int in, FILE *fp) {
chillindent(in, fp);
fprintf(fp, "%s", varname);
};
-
-
-void chillAST_VarDecl::dump( int indent, FILE *fp ) {
+void chillAST_VarDecl::dump(int indent, FILE *fp) {
chillindent(indent, fp);
- fprintf(fp, "(VarDecl \"'%s' '%s' '%s'\" n_dim %d ) ", vartype, varname, arraypart, numdimensions);
-
+ fprintf(fp, "(VarDecl \"'%s' '%s' '%s'\" n_dim %d ) ", vartype, varname, arraypart, numdimensions);
+
//fprintf(fp, "vardef %p\n", vardef);
- //if (vardef) fprintf(fp, "(typedef or struct!)\n");
+ //if (vardef) fprintf(fp, "(typedef or struct!)\n");
//fprintf(fp, "typedefinition %p\n", typedefinition);
- //if (isStruct) fprintf(fp, "isStruct\n");
-
+ //if (isStruct) fprintf(fp, "isStruct\n");
+
//if (isAParameter) fprintf(fp, "PARAMETER\n");
//else fprintf(fp, "NOT PARAMETER\n");
- fflush(fp);
+ fflush(fp);
- //segfault(); // see what called this
+ //exit(-1); // see what called this
};
-chillAST_RecordDecl * chillAST_VarDecl::getStructDef() {
+chillAST_RecordDecl *chillAST_VarDecl::getStructDef() {
if (vardef) return vardef;
if (typedefinition) return typedefinition->getStructDef();
- return NULL;
+ return NULL;
}
-
-
-
chillAST_CompoundStmt::chillAST_CompoundStmt() {
- //fprintf(stderr, "chillAST_CompoundStmt::chillAST_CompoundStmt() %p\n", this);
- asttype = CHILLAST_NODETYPE_COMPOUNDSTMT;
- parent = NULL;
+ //fprintf(stderr, "chillAST_CompoundStmt::chillAST_CompoundStmt() %p\n", this);
+ asttype = CHILLAST_NODETYPE_COMPOUNDSTMT;
+ parent = NULL;
symbol_table = new chillAST_SymbolTable;
typedef_table = NULL;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
-};
+};
-void chillAST_CompoundStmt::print( int indent, FILE *fp ) {
- printPreprocBEFORE(indent, fp);
+void chillAST_CompoundStmt::print(int indent, FILE *fp) {
+ printPreprocBEFORE(indent, fp);
int numchildren = children.size();
- //fprintf(stderr, "NUMCHILDREN %d\n", numchildren); sleep(1);
- for (int i=0; i<numchildren; i++) {
+ //fprintf(stderr, "NUMCHILDREN %d\n", numchildren); sleep(1);
+ for (int i = 0; i < numchildren; i++) {
children[i]->print(indent, fp);
- if (children[i]->asttype != CHILLAST_NODETYPE_FORSTMT
+ if (children[i]->asttype != CHILLAST_NODETYPE_FORSTMT
&& children[i]->asttype != CHILLAST_NODETYPE_IFSTMT
&& children[i]->asttype != CHILLAST_NODETYPE_COMPOUNDSTMT
- //&& children[i]->asttype != CHILLAST_NODETYPE_VARDECL // vardecl does its own ";\n"
- )
- {
- fprintf(fp, ";\n"); // probably wrong
- }
+ //&& children[i]->asttype != CHILLAST_NODETYPE_VARDECL // vardecl does its own ";\n"
+ ) {
+ fprintf(fp, ";\n"); // probably wrong
+ }
}
- fflush(fp);
+ fflush(fp);
}
-void chillAST_CompoundStmt::replaceChild( chillAST_node *old, chillAST_node *newchild ){
- //fprintf(stderr, "chillAST_CompoundStmt::replaceChild( old %s, new %s)\n", old->getTypeString(), newchild->getTypeString() );
- vector<chillAST_node*> dupe = children;
- int numdupe = dupe.size();
- int any = 0;
-
- for (int i=0; i<numdupe; i++) {
+void chillAST_CompoundStmt::replaceChild(chillAST_node *old, chillAST_node *newchild) {
+ //fprintf(stderr, "chillAST_CompoundStmt::replaceChild( old %s, new %s)\n", old->getTypeString(), newchild->getTypeString() );
+ vector<chillAST_node *> dupe = children;
+ int numdupe = dupe.size();
+ int any = 0;
+
+ for (int i = 0; i < numdupe; i++) {
- //fprintf(stderr, "\ni %d\n",i);
- //for (int j=0; j<numdupe; j++) {
- // fprintf(stderr, "this 0x%x children[%d/%d] = 0x%x type %s\n", this, j, children.size(), children[j], children[j]->getTypeString());
+ //fprintf(stderr, "\ni %d\n",i);
+ //for (int j=0; j<numdupe; j++) {
+ // fprintf(stderr, "this 0x%x children[%d/%d] = 0x%x type %s\n", this, j, children.size(), children[j], children[j]->getTypeString());
//}
- if (dupe[i] == old) {
- //fprintf(stderr, "replacing child %d of %d\n", i, numdupe);
+ if (dupe[i] == old) {
+ //fprintf(stderr, "replacing child %d of %d\n", i, numdupe);
//fprintf(stderr, "was \n"); print();
children[i] = newchild;
- newchild->setParent( this );
- //fprintf(stderr, "is \n"); print(); fprintf(stderr, "\n\n");
- // old->parent = NULL;
+ newchild->setParent(this);
+ //fprintf(stderr, "is \n"); print(); fprintf(stderr, "\n\n");
+ // old->parent = NULL;
any = 1;
}
}
- if (!any) {
+ if (!any) {
fprintf(stderr, "chillAST_CompoundStmt::replaceChild(), could not find old\n");
- exit(-1);
+ exit(-1);
}
}
-void chillAST_CompoundStmt::loseLoopWithLoopVar( char *var ) {
- //fprintf(stderr, "chillAST_CompoundStmt::loseLoopWithLoopVar( %s )\n", var);
+void chillAST_CompoundStmt::loseLoopWithLoopVar(char *var) {
+ //fprintf(stderr, "chillAST_CompoundStmt::loseLoopWithLoopVar( %s )\n", var);
//fprintf(stderr, "CompoundStmt 0x%x has parent 0x%x ", this, this->parent);
- //fprintf(stderr, "%s\n", parent->getTypeString());
+ //fprintf(stderr, "%s\n", parent->getTypeString());
-
- //fprintf(stderr, "CompoundStmt node has %d children\n", children.size());
- //fprintf(stderr, "before doing a damned thing, \n");
+
+ //fprintf(stderr, "CompoundStmt node has %d children\n", children.size());
+ //fprintf(stderr, "before doing a damned thing, \n");
//print();
//dump(); fflush(stdout);
- //fprintf(stderr, "\n\n");
+ //fprintf(stderr, "\n\n");
#ifdef DAMNED
- for (int j=0; j<children.size(); j++) {
- fprintf(stderr, "j %d/%d ", j, children.size());
+ for (int j=0; j<children.size(); j++) {
+ fprintf(stderr, "j %d/%d ", j, children.size());
fprintf(stderr, "subnode %d 0x%x ", j, children[j] );
- fprintf(stderr, "asttype %d ", children[j]->asttype);
+ fprintf(stderr, "asttype %d ", children[j]->asttype);
fprintf(stderr, "%s ", children[j]->getTypeString());
- if (children[j]->isForStmt()) {
- chillAST_ForStmt *FS = ((chillAST_ForStmt *) children[j]);
+ if (children[j]->isForStmt()) {
+ chillAST_ForStmt *FS = ((chillAST_ForStmt *) children[j]);
fprintf(stderr, "for (");
FS->init->print(0, stderr);
fprintf(stderr, "; ");
FS->cond->print(0, stderr);
fprintf(stderr, "; ");
FS->incr->print(0, stderr);
- fprintf(stderr, ") with %d statements in body 0x%x\n", FS->body->getNumChildren(), FS->body );
+ fprintf(stderr, ") with %d statements in body 0x%x\n", FS->body->getNumChildren(), FS->body );
}
- else fprintf(stderr, "\n");
+ else fprintf(stderr, "\n");
}
#endif
- vector<chillAST_node*> dupe = children; // simple enough?
- for (int i=0; i<dupe.size(); i++) {
- //for (int j=0; j<dupe.size(); j++) {
- // fprintf(stderr, "j %d/%d\n", j, dupe.size());
+ vector<chillAST_node *> dupe = children; // simple enough?
+ for (int i = 0; i < dupe.size(); i++) {
+ //for (int j=0; j<dupe.size(); j++) {
+ // fprintf(stderr, "j %d/%d\n", j, dupe.size());
// fprintf(stderr, "subnode %d %s ", j, children[j]->getTypeString());
- // if (children[j]->isForStmt()) {
- // chillAST_ForStmt *FS = ((chillAST_ForStmt *) children[j]);
+ // if (children[j]->isForStmt()) {
+ // chillAST_ForStmt *FS = ((chillAST_ForStmt *) children[j]);
// fprintf(stderr, "for (");
// FS->init->print(0, stderr);
// fprintf(stderr, "; ");
// FS->cond->print(0, stderr);
// fprintf(stderr, "; ");
// FS->incr->print(0, stderr);
- // fprintf(stderr, ") with %d statements in body 0x%x\n", FS->body->getNumChildren(), FS->body );
- //}
- //else fprintf(stderr, "\n");
+ // fprintf(stderr, ") with %d statements in body 0x%x\n", FS->body->getNumChildren(), FS->body );
+ //}
+ //else fprintf(stderr, "\n");
//}
-
- //fprintf(stderr, "CompoundStmt 0x%x recursing to child %d/%d\n", this, i, dupe.size());
- dupe[i]->loseLoopWithLoopVar( var );
+
+ //fprintf(stderr, "CompoundStmt 0x%x recursing to child %d/%d\n", this, i, dupe.size());
+ dupe[i]->loseLoopWithLoopVar(var);
}
- //fprintf(stderr, "CompoundStmt node 0x%x done recursing\n", this );
+ //fprintf(stderr, "CompoundStmt node 0x%x done recursing\n", this );
}
-
-void chillAST_CompoundStmt::dump( int indent, FILE *fp ) {
- chillindent(indent, fp);
- fprintf(fp, "(CompoundStmt \n" );
+void chillAST_CompoundStmt::dump(int indent, FILE *fp) {
+ chillindent(indent, fp);
+ fprintf(fp, "(CompoundStmt \n");
int numchildren = children.size();
- //for (int i=0; i<numchildren; i++) {
- // fprintf(fp, "%d %s 0x%x\n", i, children[i]->getTypeString(), children[i]);
- //}
- //fprintf(fp, "\n");
+ //for (int i=0; i<numchildren; i++) {
+ // fprintf(fp, "%d %s 0x%x\n", i, children[i]->getTypeString(), children[i]);
+ //}
+ //fprintf(fp, "\n");
- for (int i=0; i<numchildren; i++) {
- children[i]->dump(indent+1, fp);
+ for (int i = 0; i < numchildren; i++) {
+ children[i]->dump(indent + 1, fp);
fprintf(fp, "\n"); // ???
fflush(fp);
}
- chillindent(indent, fp);
- fprintf(fp, ")\n");
+ chillindent(indent, fp);
+ fprintf(fp, ")\n");
};
-
-chillAST_node* chillAST_CompoundStmt::constantFold(){
- //fprintf(stderr, "chillAST_CompoundStmt::constantFold()\n");
- for (int i=0; i<children.size(); i++) children[i] = children[i]->constantFold();
+chillAST_node *chillAST_CompoundStmt::constantFold() {
+ //fprintf(stderr, "chillAST_CompoundStmt::constantFold()\n");
+ for (int i = 0; i < children.size(); i++) children[i] = children[i]->constantFold();
return this;
}
-chillAST_node* chillAST_CompoundStmt::clone(){
+chillAST_node *chillAST_CompoundStmt::clone() {
chillAST_CompoundStmt *cs = new chillAST_CompoundStmt();
- for (int i=0; i<children.size(); i++) cs->addChild( children[i]->clone() );
- cs->setParent( parent );
- cs->isFromSourceFile = isFromSourceFile;
- if (filename) cs->filename = strdup(filename);
+ for (int i = 0; i < children.size(); i++) cs->addChild(children[i]->clone());
+ cs->setParent(parent);
+ cs->isFromSourceFile = isFromSourceFile;
+ if (filename) cs->filename = strdup(filename);
return cs;
}
-void chillAST_CompoundStmt::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- //fprintf(stderr, "chillAST_CompoundStmt::gatherVarDecls()\n");
- for (int i=0; i<children.size(); i++) children[i]->gatherVarDecls( decls );
+void chillAST_CompoundStmt::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ //fprintf(stderr, "chillAST_CompoundStmt::gatherVarDecls()\n");
+ for (int i = 0; i < children.size(); i++) children[i]->gatherVarDecls(decls);
}
-void chillAST_CompoundStmt::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- for (int i=0; i<children.size(); i++) children[i]->gatherScalarVarDecls( decls );
+void chillAST_CompoundStmt::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ for (int i = 0; i < children.size(); i++) children[i]->gatherScalarVarDecls(decls);
}
-void chillAST_CompoundStmt::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- for (int i=0; i<children.size(); i++) children[i]->gatherArrayVarDecls( decls );
+void chillAST_CompoundStmt::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ for (int i = 0; i < children.size(); i++) children[i]->gatherArrayVarDecls(decls);
}
-void chillAST_CompoundStmt::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- for (int i=0; i<children.size(); i++) children[i]->gatherDeclRefExprs( refs );
+void chillAST_CompoundStmt::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ for (int i = 0; i < children.size(); i++) children[i]->gatherDeclRefExprs(refs);
}
-void chillAST_CompoundStmt::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- for (int i=0; i<children.size(); i++) children[i]->gatherVarUsage( decls );
+void chillAST_CompoundStmt::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ for (int i = 0; i < children.size(); i++) children[i]->gatherVarUsage(decls);
}
-void chillAST_CompoundStmt::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool writtento ) {
- for (int i=0; i<children.size(); i++) children[i]->gatherArrayRefs( refs, 0);
+void chillAST_CompoundStmt::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool writtento) {
+ for (int i = 0; i < children.size(); i++) children[i]->gatherArrayRefs(refs, 0);
+}
+
+void chillAST_CompoundStmt::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ for (int i = 0; i < children.size(); i++) children[i]->gatherScalarRefs(refs, 0);
}
-void chillAST_CompoundStmt::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- for (int i=0; i<children.size(); i++) children[i]->gatherScalarRefs( refs, 0);
-}
-
-void chillAST_CompoundStmt::gatherStatements(std::vector<chillAST_node*> &statements ){
- for (int i=0; i<children.size(); i++) children[i]->gatherStatements( statements );
-}
-
+void chillAST_CompoundStmt::gatherStatements(std::vector<chillAST_node *> &statements) {
+ for (int i = 0; i < children.size(); i++) children[i]->gatherStatements(statements);
+}
-void chillAST_CompoundStmt::replaceVarDecls( chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl){
- for (int i=0; i<children.size(); i++) children[i]->replaceVarDecls( olddecl, newdecl );
+void chillAST_CompoundStmt::replaceVarDecls(chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
+ for (int i = 0; i < children.size(); i++) children[i]->replaceVarDecls(olddecl, newdecl);
}
-bool chillAST_CompoundStmt::findLoopIndexesToReplace( chillAST_SymbolTable *symtab, bool forcesync ) {
+bool chillAST_CompoundStmt::findLoopIndexesToReplace(chillAST_SymbolTable *symtab, bool forcesync) {
// see how many elements we currently have
- int sofar = children.size();
+ int sofar = children.size();
// make big enough to add a sync after each statement. wasteful. TODO
- // this prevents inserts happening at the forstmt::addSync() from causing a
- // reallocation, which screwsup the loop below here
- children.reserve( 2 * sofar );
- //fprintf(stderr, "sofar %d reserved %d\n", sofar, 2*sofar);
+ // this prevents inserts happening at the forstmt::addSync() from causing a
+ // reallocation, which screwsup the loop below here
+ children.reserve(2 * sofar);
+ //fprintf(stderr, "sofar %d reserved %d\n", sofar, 2*sofar);
bool force = false;
- for (int i=0; i<children.size(); i++) { // children.size() to see it gain each time
- if (children.size() > sofar ) {
- //fprintf(stderr, "HEY! CompoundStmt::findLoopIndexesToReplace() noticed that children increased from %d to %d\n", sofar, children.size());
- sofar = children.size();
+ for (int i = 0; i < children.size(); i++) { // children.size() to see it gain each time
+ if (children.size() > sofar) {
+ //fprintf(stderr, "HEY! CompoundStmt::findLoopIndexesToReplace() noticed that children increased from %d to %d\n", sofar, children.size());
+ sofar = children.size();
}
- //fprintf(stderr, "compound child %d of type %s force %d\n", i, children[i]->getTypeString(), force );
- bool thisforces = children[i]->findLoopIndexesToReplace( symtab, force );
+ //fprintf(stderr, "compound child %d of type %s force %d\n", i, children[i]->getTypeString(), force );
+ bool thisforces = children[i]->findLoopIndexesToReplace(symtab, force);
force = force || thisforces; // once set, always
}
- return false;
+ return false;
-/*
+/*
vector<chillAST_node*> childrencopy;
- for (int i=0; i<children.size(); i++) childrencopy.push_back( children[i] );
+ for (int i=0; i<children.size(); i++) childrencopy.push_back( children[i] );
bool force = false;
-
- char *origtypes[64];
- int origsize = children.size();
- for (int i=0; i<children.size(); i++) {
- fprintf(stderr, "ORIGINAL compound child %d of type %s\n", i, children[i]->getTypeString() );
- origtypes[i] = strdup( children[i]->getTypeString() );
- fprintf(stderr, "ORIGINAL compound child %d of type %s\n", i, children[i]->getTypeString() );
- }
-
- for (int i=0; i<childrencopy.size(); i++) {
- fprintf(stderr, "compound child %d of type %s force %d\n", i, childrencopy[i]->getTypeString(), force );
+
+ char *origtypes[64];
+ int origsize = children.size();
+ for (int i=0; i<children.size(); i++) {
+ fprintf(stderr, "ORIGINAL compound child %d of type %s\n", i, children[i]->getTypeString() );
+ origtypes[i] = strdup( children[i]->getTypeString() );
+ fprintf(stderr, "ORIGINAL compound child %d of type %s\n", i, children[i]->getTypeString() );
+ }
+
+ for (int i=0; i<childrencopy.size(); i++) {
+ fprintf(stderr, "compound child %d of type %s force %d\n", i, childrencopy[i]->getTypeString(), force );
force = force || childrencopy[i]->findLoopIndexesToReplace( symtab, force ); // once set, always
}
- fprintf(stderr, "\n");
- for (int i=0; i<origsize; i++) {
- fprintf(stderr, "BEFORE compound child %d/%d of type %s\n", i, origsize, origtypes[i]);
+ fprintf(stderr, "\n");
+ for (int i=0; i<origsize; i++) {
+ fprintf(stderr, "BEFORE compound child %d/%d of type %s\n", i, origsize, origtypes[i]);
}
- for (int i=0; i<children.size(); i++) {
- fprintf(stderr, "AFTER compound child %d/%d of type %s\n", i, children.size(), children[i]->getTypeString() );
+ for (int i=0; i<children.size(); i++) {
+ fprintf(stderr, "AFTER compound child %d/%d of type %s\n", i, children.size(), children[i]->getTypeString() );
}
return false;
-*/
+*/
}
-
-
-
-chillAST_ParenExpr::chillAST_ParenExpr( chillAST_node *sub, chillAST_node *par ){
+chillAST_ParenExpr::chillAST_ParenExpr(chillAST_node *sub, chillAST_node *par) {
subexpr = sub;
- subexpr->setParent( this );
- asttype = CHILLAST_NODETYPE_PARENEXPR;
+ subexpr->setParent(this);
+ asttype = CHILLAST_NODETYPE_PARENEXPR;
parent = par;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
}
-void chillAST_ParenExpr::print( int indent, FILE *fp ) {
- //fprintf(stderr, "chillAST_ParenExpr::print()\n");
+void chillAST_ParenExpr::print(int indent, FILE *fp) {
+ //fprintf(stderr, "chillAST_ParenExpr::print()\n");
chillindent(indent, fp); // hard to believe this will ever do anything
- fprintf(fp, "(" );
- subexpr->print( 0, fp );
- fprintf(fp, ")" );
- fflush(fp);
+ fprintf(fp, "(");
+ subexpr->print(0, fp);
+ fprintf(fp, ")");
+ fflush(fp);
}
-void chillAST_ParenExpr::dump( int indent, FILE *fp ) {
- chillindent(indent, fp);
- fprintf(fp, "(ParenExpr \n");
- subexpr->dump( indent+1, fp );
- chillindent(indent, fp);
- fprintf(fp, ")\n");
+void chillAST_ParenExpr::dump(int indent, FILE *fp) {
+ chillindent(indent, fp);
+ fprintf(fp, "(ParenExpr \n");
+ subexpr->dump(indent + 1, fp);
+ chillindent(indent, fp);
+ fprintf(fp, ")\n");
}
-void chillAST_ParenExpr::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool writtento ) {
- subexpr->gatherArrayRefs( refs, writtento );
+void chillAST_ParenExpr::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool writtento) {
+ subexpr->gatherArrayRefs(refs, writtento);
}
-void chillAST_ParenExpr::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- subexpr->gatherScalarRefs( refs, writtento );
-}
-
+void chillAST_ParenExpr::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ subexpr->gatherScalarRefs(refs, writtento);
+}
-chillAST_node* chillAST_ParenExpr::constantFold() {
+chillAST_node *chillAST_ParenExpr::constantFold() {
subexpr = subexpr->constantFold();
- return this;
+ return this;
}
-chillAST_node* chillAST_ParenExpr::clone() {
- chillAST_ParenExpr *PE = new chillAST_ParenExpr( subexpr->clone(), NULL );
- PE->isFromSourceFile = isFromSourceFile;
- if (filename) PE->filename = strdup(filename);
- return PE;
+chillAST_node *chillAST_ParenExpr::clone() {
+ chillAST_ParenExpr *PE = new chillAST_ParenExpr(subexpr->clone(), NULL);
+ PE->isFromSourceFile = isFromSourceFile;
+ if (filename) PE->filename = strdup(filename);
+ return PE;
}
-void chillAST_ParenExpr::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherVarDecls( decls );
+void chillAST_ParenExpr::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherVarDecls(decls);
}
-void chillAST_ParenExpr::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherScalarVarDecls( decls );
+void chillAST_ParenExpr::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherScalarVarDecls(decls);
}
-void chillAST_ParenExpr::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherArrayVarDecls( decls );
+void chillAST_ParenExpr::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherArrayVarDecls(decls);
}
-void chillAST_ParenExpr::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- subexpr->gatherDeclRefExprs( refs );
+void chillAST_ParenExpr::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ subexpr->gatherDeclRefExprs(refs);
}
-void chillAST_ParenExpr::replaceVarDecls( chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl){
- subexpr->replaceVarDecls( olddecl, newdecl );
+void chillAST_ParenExpr::replaceVarDecls(chillAST_VarDecl *olddecl, chillAST_VarDecl *newdecl) {
+ subexpr->replaceVarDecls(olddecl, newdecl);
}
-void chillAST_ParenExpr::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- subexpr->gatherVarUsage( decls );
+void chillAST_ParenExpr::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ subexpr->gatherVarUsage(decls);
}
-
-chillAST_Sizeof::chillAST_Sizeof( char *athing, chillAST_node *par ){
- thing = strdup( athing ); // memory leak
+chillAST_Sizeof::chillAST_Sizeof(char *athing, chillAST_node *par) {
+ thing = strdup(athing); // memory leak
parent = par;
- isFromSourceFile = true; // default
+ isFromSourceFile = true; // default
filename = NULL;
}
-void chillAST_Sizeof::print( int indent, FILE *fp ) {
- //fprintf(stderr, "chillAST_Sizeof::print()\n");
+void chillAST_Sizeof::print(int indent, FILE *fp) {
+ //fprintf(stderr, "chillAST_Sizeof::print()\n");
chillindent(indent, fp); // hard to believe this will ever do anything
- fprintf(fp, "sizeof(" );
- fprintf(fp, "%s)", thing );
- fflush(fp);
+ fprintf(fp, "sizeof(");
+ fprintf(fp, "%s)", thing);
+ fflush(fp);
}
-void chillAST_Sizeof::dump( int indent, FILE *fp ) {
- chillindent(indent, fp);
- fprintf(fp, "(Sizeof %s )\n", thing);
+void chillAST_Sizeof::dump(int indent, FILE *fp) {
+ chillindent(indent, fp);
+ fprintf(fp, "(Sizeof %s )\n", thing);
}
-void chillAST_Sizeof::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool writtento ) {}
-void chillAST_Sizeof::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {}
+void chillAST_Sizeof::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool writtento) {}
-chillAST_node* chillAST_Sizeof::constantFold() {
- return this;
+void chillAST_Sizeof::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {}
+
+chillAST_node *chillAST_Sizeof::constantFold() {
+ return this;
}
-chillAST_node* chillAST_Sizeof::clone() {
- chillAST_Sizeof *SO = new chillAST_Sizeof( thing, NULL );
- SO->isFromSourceFile = isFromSourceFile;
- if (filename) SO->filename = strdup(filename);
- return SO;
+chillAST_node *chillAST_Sizeof::clone() {
+ chillAST_Sizeof *SO = new chillAST_Sizeof(thing, NULL);
+ SO->isFromSourceFile = isFromSourceFile;
+ if (filename) SO->filename = strdup(filename);
+ return SO;
}
-void chillAST_Sizeof::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) { // TODO
+void chillAST_Sizeof::gatherVarDecls(vector<chillAST_VarDecl *> &decls) { // TODO
}
-void chillAST_Sizeof::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) { // TODO
+void chillAST_Sizeof::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) { // TODO
}
-void chillAST_Sizeof::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) { // TODO
+void chillAST_Sizeof::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) { // TODO
}
-void chillAST_Sizeof::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- // TODO
+void chillAST_Sizeof::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ // TODO
}
-void chillAST_Sizeof::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
+void chillAST_Sizeof::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
}
-void insertNewDeclAtLocationOfOldIfNeeded( chillAST_VarDecl *newdecl, chillAST_VarDecl *olddecl) {
+void insertNewDeclAtLocationOfOldIfNeeded(chillAST_VarDecl *newdecl, chillAST_VarDecl *olddecl) {
//fprintf(stderr, "insertNewDeclAtLocationOfOldIfNeeded( new 0x%x old 0x%x\n", newdecl, olddecl );
if (newdecl == NULL || olddecl == NULL) {
@@ -6041,196 +5946,195 @@ void insertNewDeclAtLocationOfOldIfNeeded( chillAST_VarDecl *newdecl, chillAST_V
chillAST_node *newparent = newdecl->parent;
chillAST_node *oldparent = olddecl->parent;
- //fprintf(stderr, "newparent 0x%x oldparent 0x%x\n", newparent, oldparent );
+ //fprintf(stderr, "newparent 0x%x oldparent 0x%x\n", newparent, oldparent );
if (newparent == oldparent) return;
- if (newparent != NULL)
+ if (newparent != NULL)
//fprintf(stderr, "chill_ast.cc insertNewDeclAtLocationOfOldIfNeeded() new decl already has parent?? probably wrong\n");
- newdecl->parent = oldparent; // will be true soon
+ newdecl->parent = oldparent; // will be true soon
// find actual location of old decl and insert new one there
//fprintf(stderr, "oldparent is of type %s\n", oldparent->getTypeString()); // better be compoundstmt ??
- vector<chillAST_node*> children = oldparent->getChildren();
-
- int numchildren = children.size();
- //fprintf(stderr, "oldparent has %d children\n", numchildren);
-
+ vector<chillAST_node *> children = oldparent->getChildren();
+
+ int numchildren = children.size();
+ //fprintf(stderr, "oldparent has %d children\n", numchildren);
+
if (numchildren == 0) {
- fprintf(stderr, "chill_ast.cc insertNewDeclAtLocationOfOldIfNeeded() impossible number of oldparent children (%d)\n", numchildren);
+ fprintf(stderr,
+ "chill_ast.cc insertNewDeclAtLocationOfOldIfNeeded() impossible number of oldparent children (%d)\n",
+ numchildren);
exit(-1);
}
bool newalreadythere = false;
int index = -1;
- //fprintf(stderr, "olddecl is 0x%x\n", olddecl);
+ //fprintf(stderr, "olddecl is 0x%x\n", olddecl);
//fprintf(stderr, "I know of %d variables\n", numchildren);
- for (int i=0; i<numchildren; i++) {
- chillAST_node *child = oldparent->getChild(i);
- //fprintf(stderr, "child %d @ 0x%x is of type %s\n", i, child, child->getTypeString());
- if (children[i] == olddecl) {
+ for (int i = 0; i < numchildren; i++) {
+ chillAST_node *child = oldparent->getChild(i);
+ //fprintf(stderr, "child %d @ 0x%x is of type %s\n", i, child, child->getTypeString());
+ if (children[i] == olddecl) {
index = i;
- //fprintf(stderr, "found old decl at index %d\n", index);
+ //fprintf(stderr, "found old decl at index %d\n", index);
}
- if (children[i] == newdecl) {
- newalreadythere = true;
- //fprintf(stderr, "new already there @ index %d\n", i);
+ if (children[i] == newdecl) {
+ newalreadythere = true;
+ //fprintf(stderr, "new already there @ index %d\n", i);
}
}
- if (index == -1) {
- fprintf(stderr, "chill_ast.cc insertNewDeclAtLocationOfOldIfNeeded() can't find old decl for %s\n", olddecl->varname);
+ if (index == -1) {
+ fprintf(stderr, "chill_ast.cc insertNewDeclAtLocationOfOldIfNeeded() can't find old decl for %s\n",
+ olddecl->varname);
exit(-1);
}
- if (!newalreadythere) oldparent->insertChild( index, newdecl );
+ if (!newalreadythere) oldparent->insertChild(index, newdecl);
}
-void gatherVarDecls( vector<chillAST_node*> &code, vector<chillAST_VarDecl*> &decls) {
+void gatherVarDecls(vector<chillAST_node *> &code, vector<chillAST_VarDecl *> &decls) {
//fprintf(stderr, "gatherVarDecls()\n");
int numcode = code.size();
//fprintf(stderr, "%d top level statements\n", numcode);
- for (int i=0; i<numcode; i++) {
+ for (int i = 0; i < numcode; i++) {
chillAST_node *statement = code[i];
- statement->gatherVarDecls( decls );
+ statement->gatherVarDecls(decls);
}
}
-void gatherVarUsage( vector<chillAST_node*> &code, vector<chillAST_VarDecl*> &decls) {
+void gatherVarUsage(vector<chillAST_node *> &code, vector<chillAST_VarDecl *> &decls) {
//fprintf(stderr, "gatherVarUsage()\n");
int numcode = code.size();
//fprintf(stderr, "%d top level statements\n", numcode);
- for (int i=0; i<numcode; i++) {
+ for (int i = 0; i < numcode; i++) {
chillAST_node *statement = code[i];
- statement->gatherVarUsage( decls );
+ statement->gatherVarUsage(decls);
}
}
-
-
-chillAST_IfStmt::chillAST_IfStmt() {
- cond = thenpart = elsepart = NULL;
- asttype = CHILLAST_NODETYPE_IFSTMT;
- isFromSourceFile = true; // default
+chillAST_IfStmt::chillAST_IfStmt() {
+ cond = thenpart = elsepart = NULL;
+ asttype = CHILLAST_NODETYPE_IFSTMT;
+ isFromSourceFile = true; // default
filename = NULL;
}
-chillAST_IfStmt::chillAST_IfStmt(chillAST_node *c, chillAST_node *t, chillAST_node *e, chillAST_node *p){
+chillAST_IfStmt::chillAST_IfStmt(chillAST_node *c, chillAST_node *t, chillAST_node *e, chillAST_node *p) {
cond = c;
- if (cond) cond->setParent( this );
+ if (cond) cond->setParent(this);
thenpart = t;
- if (thenpart) thenpart->setParent( this );
+ if (thenpart) thenpart->setParent(this);
elsepart = e;
- if (elsepart) elsepart->setParent( this );
+ if (elsepart) elsepart->setParent(this);
parent = p;
- asttype = CHILLAST_NODETYPE_IFSTMT;
- isFromSourceFile = true; // default
+ asttype = CHILLAST_NODETYPE_IFSTMT;
+ isFromSourceFile = true; // default
filename = NULL;
}
-void chillAST_IfStmt::gatherVarDecls( vector<chillAST_VarDecl*> &decls ) {
- if (cond) cond->gatherVarDecls( decls );
- if (thenpart) thenpart->gatherVarDecls( decls );
- if (elsepart) elsepart->gatherVarDecls( decls );
+void chillAST_IfStmt::gatherVarDecls(vector<chillAST_VarDecl *> &decls) {
+ if (cond) cond->gatherVarDecls(decls);
+ if (thenpart) thenpart->gatherVarDecls(decls);
+ if (elsepart) elsepart->gatherVarDecls(decls);
}
-void chillAST_IfStmt::gatherScalarVarDecls( vector<chillAST_VarDecl*> &decls ) {
- if (cond) cond->gatherScalarVarDecls( decls );
- if (thenpart) thenpart->gatherScalarVarDecls( decls );
- if (elsepart) elsepart->gatherScalarVarDecls( decls );
+void chillAST_IfStmt::gatherScalarVarDecls(vector<chillAST_VarDecl *> &decls) {
+ if (cond) cond->gatherScalarVarDecls(decls);
+ if (thenpart) thenpart->gatherScalarVarDecls(decls);
+ if (elsepart) elsepart->gatherScalarVarDecls(decls);
}
-void chillAST_IfStmt::gatherArrayVarDecls( vector<chillAST_VarDecl*> &decls ) {
- if (cond) cond->gatherArrayVarDecls( decls );
- if (thenpart) thenpart->gatherArrayVarDecls( decls );
- if (elsepart) elsepart->gatherArrayVarDecls( decls );
+void chillAST_IfStmt::gatherArrayVarDecls(vector<chillAST_VarDecl *> &decls) {
+ if (cond) cond->gatherArrayVarDecls(decls);
+ if (thenpart) thenpart->gatherArrayVarDecls(decls);
+ if (elsepart) elsepart->gatherArrayVarDecls(decls);
}
-void chillAST_IfStmt::gatherDeclRefExprs( vector<chillAST_DeclRefExpr *>&refs ) {
- if (cond) cond->gatherDeclRefExprs( refs );
- if (thenpart) thenpart->gatherDeclRefExprs( refs );
- if (elsepart) elsepart->gatherDeclRefExprs( refs );
+void chillAST_IfStmt::gatherDeclRefExprs(vector<chillAST_DeclRefExpr *> &refs) {
+ if (cond) cond->gatherDeclRefExprs(refs);
+ if (thenpart) thenpart->gatherDeclRefExprs(refs);
+ if (elsepart) elsepart->gatherDeclRefExprs(refs);
}
-void chillAST_IfStmt::gatherVarUsage( vector<chillAST_VarDecl*> &decls ) {
- if (cond) cond->gatherVarUsage( decls );
- if (thenpart) thenpart->gatherVarUsage( decls );
- if (elsepart) elsepart->gatherVarUsage( decls );
+void chillAST_IfStmt::gatherVarUsage(vector<chillAST_VarDecl *> &decls) {
+ if (cond) cond->gatherVarUsage(decls);
+ if (thenpart) thenpart->gatherVarUsage(decls);
+ if (elsepart) elsepart->gatherVarUsage(decls);
}
-void chillAST_IfStmt::gatherArrayRefs( std::vector<chillAST_ArraySubscriptExpr*> &refs, bool writtento ) {
- cond->gatherArrayRefs( refs, 0 ); // 0 ??
- thenpart->gatherArrayRefs( refs, 0 ); // 0 ??
- if (elsepart) elsepart->gatherArrayRefs( refs, 0 ); // 0 ??
+void chillAST_IfStmt::gatherArrayRefs(std::vector<chillAST_ArraySubscriptExpr *> &refs, bool writtento) {
+ cond->gatherArrayRefs(refs, 0); // 0 ??
+ thenpart->gatherArrayRefs(refs, 0); // 0 ??
+ if (elsepart) elsepart->gatherArrayRefs(refs, 0); // 0 ??
}
-void chillAST_IfStmt::gatherScalarRefs( std::vector<chillAST_DeclRefExpr*> &refs, bool writtento ) {
- cond->gatherScalarRefs( refs, 0 ); // 0 ??
- thenpart->gatherScalarRefs( refs, 0 ); // 0 ??
- if (elsepart) elsepart->gatherScalarRefs( refs, 0 ); // 0 ??
-}
+void chillAST_IfStmt::gatherScalarRefs(std::vector<chillAST_DeclRefExpr *> &refs, bool writtento) {
+ cond->gatherScalarRefs(refs, 0); // 0 ??
+ thenpart->gatherScalarRefs(refs, 0); // 0 ??
+ if (elsepart) elsepart->gatherScalarRefs(refs, 0); // 0 ??
+}
-chillAST_node *chillAST_IfStmt::constantFold() {
+chillAST_node *chillAST_IfStmt::constantFold() {
if (cond) cond = cond->constantFold();
if (thenpart) thenpart = thenpart->constantFold();
if (elsepart) elsepart = elsepart->constantFold();
- return this;
+ return this;
}
-void chillAST_IfStmt::gatherStatements(std::vector<chillAST_node*> &statements ){
+void chillAST_IfStmt::gatherStatements(std::vector<chillAST_node *> &statements) {
- //print(); printf("\n"); fflush(stdout);
- thenpart->gatherStatements( statements );
- //fprintf(stderr, "ifstmt, after then, %d statements\n", statements.size());
- if (elsepart){
- //fprintf(stderr, "there is an elsepart of type %s\n", elsepart->getTypeString());
- elsepart->gatherStatements( statements );
+ //print(); printf("\n"); fflush(stdout);
+ thenpart->gatherStatements(statements);
+ //fprintf(stderr, "ifstmt, after then, %d statements\n", statements.size());
+ if (elsepart) {
+ //fprintf(stderr, "there is an elsepart of type %s\n", elsepart->getTypeString());
+ elsepart->gatherStatements(statements);
}
- //fprintf(stderr, "ifstmt, after else, %d statements\n", statements.size());
+ //fprintf(stderr, "ifstmt, after else, %d statements\n", statements.size());
}
-
-chillAST_node *chillAST_IfStmt::clone() {
- chillAST_node *c, *t, *e;
- c = t = e = NULL;
- if (cond) c = cond->clone(); // has to be one, right?
+chillAST_node *chillAST_IfStmt::clone() {
+ chillAST_node *c, *t, *e;
+ c = t = e = NULL;
+ if (cond) c = cond->clone(); // has to be one, right?
if (thenpart) t = thenpart->clone();
if (elsepart) e = elsepart->clone();
- chillAST_IfStmt *IS = new chillAST_IfStmt( c, t, e, parent);
+ chillAST_IfStmt *IS = new chillAST_IfStmt(c, t, e, parent);
IS->isFromSourceFile = isFromSourceFile;
- if (filename) IS->filename = strdup(filename);
+ if (filename) IS->filename = strdup(filename);
return IS;
-}
-
+}
-void chillAST_IfStmt::dump( int indent, FILE *fp ) {
+void chillAST_IfStmt::dump(int indent, FILE *fp) {
chillindent(indent, fp);
fprintf(fp, "(if ");
fprintf(fp, "\n");
- cond->dump(indent+1, fp);
+ cond->dump(indent + 1, fp);
fprintf(fp, "\n");
- thenpart->dump(indent+1, fp);
- fprintf(fp, "\n");
+ thenpart->dump(indent + 1, fp);
+ fprintf(fp, "\n");
- if (elsepart) {
- elsepart->dump(indent+1, fp);
+ if (elsepart) {
+ elsepart->dump(indent + 1, fp);
fprintf(fp, "\n");
}
chillindent(indent, fp);
@@ -6238,255 +6142,246 @@ void chillAST_IfStmt::dump( int indent, FILE *fp ) {
}
-
-void chillAST_IfStmt::print(int indent, FILE *fp ) {
- printPreprocBEFORE(indent, fp);
+void chillAST_IfStmt::print(int indent, FILE *fp) {
+ printPreprocBEFORE(indent, fp);
chillindent(indent, fp);
- fprintf(fp, "if (");
+ fprintf(fp, "if (");
if (cond) cond->print(0, fp);
- else fprintf(fp, "(NULL cond)");
+ else fprintf(fp, "(NULL cond)");
- bool needbracket = true;
- if (thenpart) {
+ bool needbracket = true;
+ if (thenpart) {
if (thenpart->isBinaryOperator()) needbracket = false;
if (thenpart->isCompoundStmt()) { // almost always true
- chillAST_CompoundStmt *CS = (chillAST_CompoundStmt*) thenpart;
- if (CS->children.size() == 1 && CS->children[0]->isBinaryOperator()) needbracket = false;
- }
-
- if(needbracket) fprintf(fp, ") {\n");
- else fprintf(fp, ")\n");
-
- thenpart->print(indent+1, fp); // end of line
-
- if(needbracket) {
- //fprintf(fp, "\n");
+ chillAST_CompoundStmt *CS = (chillAST_CompoundStmt *) thenpart;
+ if (CS->children.size() == 1 && CS->children[0]->isBinaryOperator()) needbracket = false;
+ }
+
+ if (needbracket) fprintf(fp, ") {\n");
+ else fprintf(fp, ")\n");
+
+ thenpart->print(indent + 1, fp); // end of line
+
+ if (needbracket) {
+ //fprintf(fp, "\n");
chillindent(indent, fp);
- fprintf(fp, "}\n");
+ fprintf(fp, "}\n");
}
- }
- else fprintf(fp, "(NULL thenpart)");
+ } else fprintf(fp, "(NULL thenpart)");
+
-
needbracket = true;
- if (elsepart) {
+ if (elsepart) {
if (elsepart->isBinaryOperator()) needbracket = false;
if (elsepart->isCompoundStmt()) { // almost always true
- chillAST_CompoundStmt *CS = (chillAST_CompoundStmt*) elsepart;
-
- if (CS->children.size() == 1 && CS->children[0]->isBinaryOperator()) needbracket = false;
-
- }
-
- fprintf(fp, "\n");
+ chillAST_CompoundStmt *CS = (chillAST_CompoundStmt *) elsepart;
+
+ if (CS->children.size() == 1 && CS->children[0]->isBinaryOperator()) needbracket = false;
+
+ }
+
+ fprintf(fp, "\n");
chillindent(indent, fp);
-
- if (needbracket) fprintf(fp, "else {\n");
- else fprintf(fp, "else\n");
-
- elsepart->print(indent+1, fp);
-
- if(needbracket) {
- fprintf(fp, "\n");
+
+ if (needbracket) fprintf(fp, "else {\n");
+ else fprintf(fp, "else\n");
+
+ elsepart->print(indent + 1, fp);
+
+ if (needbracket) {
+ fprintf(fp, "\n");
chillindent(indent, fp);
- fprintf(fp, "}\n");
+ fprintf(fp, "}\n");
}
}
- //else fprintf(fp, "else { /* NOTHING */ }");
+ //else fprintf(fp, "else { /* NOTHING */ }");
}
-
-bool chillAST_IfStmt::findLoopIndexesToReplace( chillAST_SymbolTable *symtab, bool forcesync ) {
- thenpart->findLoopIndexesToReplace( symtab );
- elsepart->findLoopIndexesToReplace( symtab );
- return false; // ??
+bool chillAST_IfStmt::findLoopIndexesToReplace(chillAST_SymbolTable *symtab, bool forcesync) {
+ thenpart->findLoopIndexesToReplace(symtab);
+ elsepart->findLoopIndexesToReplace(symtab);
+ return false; // ??
}
-
-chillAST_node *lessthanmacro( chillAST_node *left, chillAST_node *right) {
+chillAST_node *lessthanmacro(chillAST_node *left, chillAST_node *right) {
- chillAST_ParenExpr *lp1 = new chillAST_ParenExpr( left );
- chillAST_ParenExpr *rp1 = new chillAST_ParenExpr( right );
- chillAST_BinaryOperator *cond = new chillAST_BinaryOperator( lp1, "<", rp1 );
+ chillAST_ParenExpr *lp1 = new chillAST_ParenExpr(left);
+ chillAST_ParenExpr *rp1 = new chillAST_ParenExpr(right);
+ chillAST_BinaryOperator *cond = new chillAST_BinaryOperator(lp1, "<", rp1);
- chillAST_ParenExpr *lp2 = new chillAST_ParenExpr( left );
- chillAST_ParenExpr *rp2 = new chillAST_ParenExpr( right );
-
- chillAST_TernaryOperator *t = new chillAST_TernaryOperator("?", cond, lp2, rp2);
-
- return t;
-}
+ chillAST_ParenExpr *lp2 = new chillAST_ParenExpr(left);
+ chillAST_ParenExpr *rp2 = new chillAST_ParenExpr(right);
+ chillAST_TernaryOperator *t = new chillAST_TernaryOperator("?", cond, lp2, rp2);
+ return t;
+}
// look for function declaration with a given name, in the tree with root "node"
-void findFunctionDeclRecursive( chillAST_node *node, const char *procname, vector<chillAST_FunctionDecl*>& funcs )
-{
- //fprintf(stderr, "findmanually() CHILL AST node of type %s\n", node->getTypeString());
-
- if (node->isFunctionDecl()) {
+void findFunctionDeclRecursive(chillAST_node *node, const char *procname, vector<chillAST_FunctionDecl *> &funcs) {
+ //fprintf(stderr, "findmanually() CHILL AST node of type %s\n", node->getTypeString());
+
+ if (node->isFunctionDecl()) {
char *name = ((chillAST_FunctionDecl *) node)->functionName; // compare name with desired name
//fprintf(stderr, "node name 0x%x ", name);
- //fprintf(stderr, "%s procname ", name);
+ //fprintf(stderr, "%s procname ", name);
//fprintf(stderr, "0x%x ", procname);
- //fprintf(stderr, "%s\n", procname);
- if (!strcmp( name, procname)) {
- //fprintf(stderr, "found procedure %s\n", procname );
- funcs.push_back( (chillAST_FunctionDecl*) node ); // this is it
+ //fprintf(stderr, "%s\n", procname);
+ if (!strcmp(name, procname)) {
+ //fprintf(stderr, "found procedure %s\n", procname );
+ funcs.push_back((chillAST_FunctionDecl *) node); // this is it
// quit recursing. probably not correct in some horrible case
- return;
+ return;
}
- //else fprintf(stderr, "this is not the function we're looking for\n");
+ //else fprintf(stderr, "this is not the function we're looking for\n");
}
- // this is where the children can be used effectively.
+ // this is where the children can be used effectively.
// we don't really care what kind of node we're at. We just check the node itself
- // and then its children is needed.
+ // and then its children is needed.
- int numc = node->children.size();
+ int numc = node->children.size();
fprintf(stderr, "(top)node has %d children\n", numc);
- for (int i=0; i<numc; i++) {
- if (node->isSourceFile()) {
- fprintf(stderr, "node of type %s is recursing to child %d of type %s\n", node->getTypeString(), i, node->children[i]->getTypeString());
- if (node->children[i]->isFunctionDecl()) {
- chillAST_FunctionDecl *fd = (chillAST_FunctionDecl*) node->children[i];
- fprintf(stderr, "child %d is functiondecl %s\n", i, fd->functionName);
+ for (int i = 0; i < numc; i++) {
+ if (node->isSourceFile()) {
+ fprintf(stderr, "node of type %s is recursing to child %d of type %s\n", node->getTypeString(), i,
+ node->children[i]->getTypeString());
+ if (node->children[i]->isFunctionDecl()) {
+ chillAST_FunctionDecl *fd = (chillAST_FunctionDecl *) node->children[i];
+ fprintf(stderr, "child %d is functiondecl %s\n", i, fd->functionName);
}
}
- findFunctionDeclRecursive( node->children[i], procname, funcs );
-
+ findFunctionDeclRecursive(node->children[i], procname, funcs);
+
}
- return;
+ return;
}
-chillAST_FunctionDecl *findFunctionDecl( chillAST_node *node, const char *procname)
-{
- vector<chillAST_FunctionDecl*> functions;
- findFunctionDeclRecursive( node, procname, functions );
+chillAST_FunctionDecl *findFunctionDecl(chillAST_node *node, const char *procname) {
+ vector<chillAST_FunctionDecl *> functions;
+ findFunctionDeclRecursive(node, procname, functions);
- if ( functions.size() == 0 ) {
+ if (functions.size() == 0) {
fprintf(stderr, "could not find function named '%s'\n", procname);
exit(-1);
}
-
- if ( functions.size() > 1 ) {
+
+ if (functions.size() > 1) {
fprintf(stderr, "oddly, found %d functions named '%s'\n", functions.size(), procname);
- fprintf(stderr, "I am unsure what to do\n");
+ fprintf(stderr, "I am unsure what to do\n");
- for (int f = 0; f < functions.size(); f++) {
- fprintf(stderr, "function %d %p %s\n", f, functions[f], functions[f]->functionName);
+ for (int f = 0; f < functions.size(); f++) {
+ fprintf(stderr, "function %d %p %s\n", f, functions[f], functions[f]->functionName);
}
exit(-1);
}
-
- //fprintf(stderr, "found the procedure named %s\n", procname);
+
+ //fprintf(stderr, "found the procedure named %s\n", procname);
return functions[0];
}
-chillAST_SymbolTable *addSymbolToTable( chillAST_SymbolTable *st, chillAST_VarDecl *vd ) // definition
+chillAST_SymbolTable *addSymbolToTable(chillAST_SymbolTable *st, chillAST_VarDecl *vd) // definition
{
chillAST_SymbolTable *s = st;
- if (!s) s = new chillAST_SymbolTable;
-
+ if (!s) s = new chillAST_SymbolTable;
+
int tablesize = s->size();
-
- for (int i=0; i<tablesize; i++) {
- if ((*s)[i] == vd) {
- //fprintf(stderr, "the exact same symbol, not just the same name, was already there\n");
- return s; // already there
+
+ for (int i = 0; i < tablesize; i++) {
+ if ((*s)[i] == vd) {
+ //fprintf(stderr, "the exact same symbol, not just the same name, was already there\n");
+ return s; // already there
}
}
- for (int i=0; i<tablesize; i++) {
- //fprintf(stderr, "name %s vs name %s\n", (*s)[i]->varname, vd->varname);
- if (!strcmp( (*s)[i]->varname, vd->varname)) {
- //fprintf(stderr, "symbol with the same name was already there\n");
- return s; // already there
+ for (int i = 0; i < tablesize; i++) {
+ //fprintf(stderr, "name %s vs name %s\n", (*s)[i]->varname, vd->varname);
+ if (!strcmp((*s)[i]->varname, vd->varname)) {
+ //fprintf(stderr, "symbol with the same name was already there\n");
+ return s; // already there
}
}
- //fprintf(stderr, "adding %s %s to a symbol table that didn't already have it\n", vd->vartype, vd->varname);
+ //fprintf(stderr, "adding %s %s to a symbol table that didn't already have it\n", vd->vartype, vd->varname);
- //printf("before:\n");
- //printSymbolTable( s ); fflush(stdout);
+ //printf("before:\n");
+ //printSymbolTable( s ); fflush(stdout);
- s->push_back(vd); // add it
+ s->push_back(vd); // add it
- //printf("after:\n");
- //printSymbolTable( s ); fflush(stdout);
+ //printf("after:\n");
+ //printSymbolTable( s ); fflush(stdout);
return s;
}
-chillAST_TypedefTable *addTypedefToTable( chillAST_TypedefTable *tdt, chillAST_TypedefDecl *td )
-{
+chillAST_TypedefTable *addTypedefToTable(chillAST_TypedefTable *tdt, chillAST_TypedefDecl *td) {
chillAST_TypedefTable *t = tdt;
if (!t) t = new chillAST_TypedefTable;
int tablesize = t->size();
-
- for (int i=0; i<tablesize; i++) {
- if ((*t)[i] == td) return t; // already there
+
+ for (int i = 0; i < tablesize; i++) {
+ if ((*t)[i] == td) return t; // already there
}
- t->push_back(td); // add it
+ t->push_back(td); // add it
return t;
}
-chillAST_NoOp::chillAST_NoOp( chillAST_node *p ) {
- parent = p;
- isFromSourceFile = true; // default
+chillAST_NoOp::chillAST_NoOp(chillAST_node *p) {
+ parent = p;
+ isFromSourceFile = true; // default
filename = NULL;
}; // so we have SOMETHING for NoOp in the cc file ???
-chillAST_Preprocessing::chillAST_Preprocessing() {
+chillAST_Preprocessing::chillAST_Preprocessing() {
position = CHILL_PREPROCESSING_POSITIONUNKNOWN;
- pptype = CHILL_PREPROCESSING_TYPEUNKNOWN;
+ pptype = CHILL_PREPROCESSING_TYPEUNKNOWN;
blurb = strdup(""); // never use null. ignore the leak ??
}
- chillAST_Preprocessing::chillAST_Preprocessing(CHILL_PREPROCESSING_POSITION pos,
- CHILL_PREPROCESSING_TYPE t,
- char *text )
- {
- position = pos;
- pptype = t;
- blurb = strdup( text );
- }
-
-void chillAST_Preprocessing::print( int indent, FILE *fp ) { // probably very wrong
- if (position == CHILL_PREPROCESSING_LINEAFTER ) {
- fprintf(fp, "\n");
- chillindent(indent, fp);
- }
- if (position == CHILL_PREPROCESSING_LINEBEFORE) { // ???
- //fprintf(fp, "\n");
- chillindent(indent, fp);
- }
-
- fprintf(fp, "%s", blurb);
-
- if (position == CHILL_PREPROCESSING_TOTHERIGHT) {
- fprintf(fp, "\n");
- }
+chillAST_Preprocessing::chillAST_Preprocessing(CHILL_PREPROCESSING_POSITION pos,
+ CHILL_PREPROCESSING_TYPE t,
+ char *text) {
+ position = pos;
+ pptype = t;
+ blurb = strdup(text);
+}
+
+void chillAST_Preprocessing::print(int indent, FILE *fp) { // probably very wrong
+ if (position == CHILL_PREPROCESSING_LINEAFTER) {
+ fprintf(fp, "\n");
+ chillindent(indent, fp);
+ }
+ if (position == CHILL_PREPROCESSING_LINEBEFORE) { // ???
+ //fprintf(fp, "\n");
+ chillindent(indent, fp);
+ }
+ fprintf(fp, "%s", blurb);
- if (position == CHILL_PREPROCESSING_LINEBEFORE) {
- //fprintf(fp, "\n"); // comment seems to have \n at the end already
- //chillindent(indent, fp);
- }
+ if (position == CHILL_PREPROCESSING_TOTHERIGHT) {
+ fprintf(fp, "\n");
+ }
- //if (pptype != CHILL_PREPROCESSING_IMMEDIATELYBEFORE && pptype != CHILL_PREPROCESSING_UNKNOWN) fprint(fp, "\n");
-
- }
+ if (position == CHILL_PREPROCESSING_LINEBEFORE) {
+ //fprintf(fp, "\n"); // comment seems to have \n at the end already
+ //chillindent(indent, fp);
+ }
+
+
+ //if (pptype != CHILL_PREPROCESSING_IMMEDIATELYBEFORE && pptype != CHILL_PREPROCESSING_UNKNOWN) fprint(fp, "\n");
+
+}
diff --git a/src/chillmodule.cc b/src/chillmodule.cc
index 5a7d575..5e78be3 100644
--- a/src/chillmodule.cc
+++ b/src/chillmodule.cc
@@ -53,8 +53,7 @@ void finalize_loop(int loop_num_start, int loop_num_end) {
if (loop_num_start == loop_num_end) {
ir_code->ReplaceCode(ir_controls[loops[loop_num_start]], myloop->getCode());
ir_controls[loops[loop_num_start]] = NULL;
- }
- else {
+ } else {
std::vector<IR_Control *> parm;
for (int i = loops[loop_num_start]; i <= loops[loop_num_end]; i++)
parm.push_back(ir_controls[i]);
@@ -67,20 +66,21 @@ void finalize_loop(int loop_num_start, int loop_num_end) {
}
delete myloop;
}
+
void finalize_loop() {
int loop_num_start = get_loop_num_start();
int loop_num_end = get_loop_num_end();
finalize_loop(loop_num_start, loop_num_end);
}
+
static void init_loop(int loop_num_start, int loop_num_end) {
if (source_filename.empty()) {
- fprintf(stderr, "source file not set when initializing the loop");
+ CHILL_ERROR("source file not set when initializing the loop");
if (!is_interactive)
exit(2);
- }
- else {
+ } else {
if (ir_code == NULL) {
- ir_code = new IR_clangCode(source_filename.c_str(),procedure_name.c_str());
+ ir_code = new IR_clangCode(source_filename.c_str(), procedure_name.c_str());
IR_Block *block = ir_code->GetCode();
ir_controls = ir_code->FindOneLevelControlStructure(block);
for (int i = 0; i < ir_controls.size(); i++) {
@@ -90,25 +90,25 @@ static void init_loop(int loop_num_start, int loop_num_end) {
delete block;
}
if (myloop != NULL && myloop->isInitialized()) {
- finalize_loop();
+ finalize_loop();
}
}
set_loop_num_start(loop_num_start);
set_loop_num_end(loop_num_end);
if (loop_num_end < loop_num_start) {
- fprintf(stderr, "the last loop must be after the start loop");
+ CHILL_ERROR("the last loop must be after the start loop");
if (!is_interactive)
exit(2);
- }
+ }
if (loop_num_end >= loops.size()) {
- fprintf(stderr, "loop %d does not exist", loop_num_end);
+ CHILL_ERROR("loop %d does not exist", loop_num_end);
if (!is_interactive)
exit(2);
}
std::vector<IR_Control *> parm;
for (int i = loops[loop_num_start]; i <= loops[loop_num_end]; i++) {
if (ir_controls[i] == NULL) {
- fprintf(stderr, "loop has already been processed");
+ CHILL_ERROR("loop has already been processed");
if (!is_interactive)
exit(2);
}
@@ -116,7 +116,7 @@ static void init_loop(int loop_num_start, int loop_num_end) {
}
IR_Block *block = ir_code->MergeNeighboringControlStructures(parm);
myloop = new Loop(block);
- delete block;
+ delete block;
}
// ----------------------- //
@@ -124,11 +124,11 @@ static void init_loop(int loop_num_start, int loop_num_end) {
// ----------------------- //
// -- CHiLL support -- //
-static void strict_arg_num(PyObject* args, int arg_num, const char* fname = NULL) {
+static void strict_arg_num(PyObject *args, int arg_num, const char *fname = NULL) {
int arg_given = PyTuple_Size(args);
char msg[128];
- if(arg_num != arg_given) {
- if(fname)
+ if (arg_num != arg_given) {
+ if (fname)
sprintf(msg, "%s: expected %i arguments, was given %i.", fname, arg_num, arg_given);
else
sprintf(msg, "Expected %i argumets, was given %i.", arg_num, arg_given);
@@ -136,11 +136,11 @@ static void strict_arg_num(PyObject* args, int arg_num, const char* fname = NULL
}
}
-static int strict_arg_range(PyObject* args, int arg_min, int arg_max, const char* fname = NULL) {
+static int strict_arg_range(PyObject *args, int arg_min, int arg_max, const char *fname = NULL) {
int arg_given = PyTuple_Size(args);
char msg[128];
- if(arg_given < arg_min || arg_given > arg_max) {
- if(fname)
+ if (arg_given < arg_min || arg_given > arg_max) {
+ if (fname)
sprintf(msg, "%s: expected %i to %i arguments, was given %i.", fname, arg_min, arg_max, arg_given);
else
sprintf(msg, "Expected %i to %i, argumets, was given %i.", arg_min, arg_max, arg_given);
@@ -149,58 +149,58 @@ static int strict_arg_range(PyObject* args, int arg_min, int arg_max, const char
return arg_given;
}
-static int intArg(PyObject* args, int index, int dval = 0) {
- if(PyTuple_Size(args) <= index)
- return dval;
+static int intArg(PyObject *args, int index, int dval = 0) {
+ if (PyTuple_Size(args) <= index)
+ return dval;
int ival;
- PyObject *item = PyTuple_GetItem(args, index);
+ PyObject *item = PyTuple_GetItem(args, index);
Py_INCREF(item);
if (PyInt_Check(item)) ival = PyInt_AsLong(item);
else {
- fprintf(stderr, "argument at index %i is not an int\n", index);
+ CHILL_ERROR("argument at index %i is not an int\n", index);
exit(-1);
}
return ival;
}
-static std::string strArg(PyObject* args, int index, const char* dval = NULL) {
- if(PyTuple_Size(args) <= index)
+static std::string strArg(PyObject *args, int index, const char *dval = NULL) {
+ if (PyTuple_Size(args) <= index)
return dval;
std::string strval;
- PyObject *item = PyTuple_GetItem(args, index);
+ PyObject *item = PyTuple_GetItem(args, index);
Py_INCREF(item);
if (PyString_Check(item)) strval = strdup(PyString_AsString(item));
else {
- fprintf(stderr, "argument at index %i is not an string\n", index);
+ CHILL_ERROR("argument at index %i is not an string\n", index);
exit(-1);
}
return strval;
}
-static bool boolArg(PyObject* args, int index, bool dval = false) {
- if(PyTuple_Size(args) <= index)
+static bool boolArg(PyObject *args, int index, bool dval = false) {
+ if (PyTuple_Size(args) <= index)
return dval;
bool bval;
- PyObject* item = PyTuple_GetItem(args, index);
+ PyObject *item = PyTuple_GetItem(args, index);
Py_INCREF(item);
- return (bool)PyObject_IsTrue(item);
+ return (bool) PyObject_IsTrue(item);
}
-static bool tostringintmapvector(PyObject* args, int index, std::vector<std::map<std::string,int> >& vec) {
- if(PyTuple_Size(args) <= index)
+static bool tostringintmapvector(PyObject *args, int index, std::vector<std::map<std::string, int> > &vec) {
+ if (PyTuple_Size(args) <= index)
return false;
- PyObject* seq = PyTuple_GetItem(args, index);
+ PyObject *seq = PyTuple_GetItem(args, index);
//TODO: Typecheck
int seq_len = PyList_Size(seq);
- for(int i = 0; i < seq_len; i++) {
- std::map<std::string,int> map;
- PyObject* dict = PyList_GetItem(seq, i);
- PyObject* keys = PyDict_Keys(dict);
+ for (int i = 0; i < seq_len; i++) {
+ std::map<std::string, int> map;
+ PyObject *dict = PyList_GetItem(seq, i);
+ PyObject *keys = PyDict_Keys(dict);
//TODO: Typecheck
int dict_len = PyList_Size(keys);
- for(int j = 0; j < dict_len; j++) {
- PyObject* key = PyList_GetItem(keys, j);
- PyObject* value = PyDict_GetItem(dict, key);
+ for (int j = 0; j < dict_len; j++) {
+ PyObject *key = PyList_GetItem(keys, j);
+ PyObject *value = PyDict_GetItem(dict, key);
std::string str_key = strdup(PyString_AsString(key));
int int_value = PyInt_AsLong(value);
map[str_key] = int_value;
@@ -210,46 +210,47 @@ static bool tostringintmapvector(PyObject* args, int index, std::vector<std::map
return true;
}
-static bool tointvector(PyObject* seq, std::vector<int>& vec) {
+static bool tointvector(PyObject *seq, std::vector<int> &vec) {
//TODO: Typecheck
int seq_len = PyList_Size(seq);
- for(int i = 0; i < seq_len; i++) {
- PyObject* item = PyList_GetItem(seq, i);
+ for (int i = 0; i < seq_len; i++) {
+ PyObject *item = PyList_GetItem(seq, i);
vec.push_back(PyInt_AsLong(item));
}
return true;
}
-static bool tointvector(PyObject* args, int index, std::vector<int>& vec) {
- if(PyTuple_Size(args) <= index)
+static bool tointvector(PyObject *args, int index, std::vector<int> &vec) {
+ if (PyTuple_Size(args) <= index)
return false;
- PyObject* seq = PyTuple_GetItem(args, index);
+ PyObject *seq = PyTuple_GetItem(args, index);
return tointvector(seq, vec);
}
-static bool tointset(PyObject* args, int index, std::set<int>& set) {
- if(PyTuple_Size(args) <= index)
+static bool tointset(PyObject *args, int index, std::set<int> &set) {
+ if (PyTuple_Size(args) <= index)
return false;
- PyObject* seq = PyTuple_GetItem(args, index);
+ PyObject *seq = PyTuple_GetItem(args, index);
//TODO: Typecheck
int seq_len = PyList_Size(seq);
- for(int i = 0; i < seq_len; i++) {
- PyObject* item = PyList_GetItem(seq, i);
+ for (int i = 0; i < seq_len; i++) {
+ PyObject *item = PyList_GetItem(seq, i);
set.insert(PyInt_AsLong(item));
}
return true;
}
-static bool tointmatrix(PyObject* args, int index, std::vector<std::vector<int> >& mat) {
- if(PyTuple_Size(args) <= index)
+
+static bool tointmatrix(PyObject *args, int index, std::vector<std::vector<int> > &mat) {
+ if (PyTuple_Size(args) <= index)
return false;
- PyObject* seq_one = PyTuple_GetItem(args, index);
+ PyObject *seq_one = PyTuple_GetItem(args, index);
int seq_one_len = PyList_Size(seq_one);
- for(int i = 0; i < seq_one_len; i++) {
+ for (int i = 0; i < seq_one_len; i++) {
std::vector<int> vec;
- PyObject* seq_two = PyList_GetItem(seq_one, i);
+ PyObject *seq_two = PyList_GetItem(seq_one, i);
int seq_two_len = PyList_Size(seq_two);
- for(int j = 0; j < seq_two_len; j++) {
- PyObject* item = PyList_GetItem(seq_two, j);
+ for (int j = 0; j < seq_two_len; j++) {
+ PyObject *item = PyList_GetItem(seq_two, j);
vec.push_back(PyInt_AsLong(item));
}
mat.push_back(vec);
@@ -261,40 +262,38 @@ static bool tointmatrix(PyObject* args, int index, std::vector<std::vector<int>
// CHiLL interface functions //
// ------------------------- //
-static PyObject* chill_source(PyObject* self, PyObject* args) {
+static PyObject *chill_source(PyObject *self, PyObject *args) {
strict_arg_num(args, 1, "source");
source_filename = strArg(args, 0);
Py_RETURN_NONE;
}
-static PyObject* chill_procedure(PyObject* self, PyObject* args) {
- if(!procedure_name.empty()) {
- fprintf(stderr, "only one procedure can be handled in a script");
- if(!is_interactive)
+static PyObject *chill_procedure(PyObject *self, PyObject *args) {
+ if (!procedure_name.empty()) {
+ CHILL_ERROR("only one procedure can be handled in a script");
+ if (!is_interactive)
exit(2);
}
procedure_name = strArg(args, 0);
Py_RETURN_NONE;
}
-static PyObject* chill_loop(PyObject* self, PyObject* args) {
+static PyObject *chill_loop(PyObject *self, PyObject *args) {
// loop (n)
// loop (n:m)
-
+
int nargs = PyTuple_Size(args);
int start_num;
int end_num;
- if(nargs == 1) {
+ if (nargs == 1) {
start_num = intArg(args, 0);
end_num = start_num;
- }
- else if(nargs == 2) {
+ } else if (nargs == 2) {
start_num = intArg(args, 0);
end_num = intArg(args, 1);
- }
- else {
- fprintf(stderr, "loop takes one or two arguments");
- if(!is_interactive)
+ } else {
+ CHILL_ERROR("loop takes one or two arguments");
+ if (!is_interactive)
exit(2);
}
set_loop_num_start(start_num);
@@ -303,20 +302,20 @@ static PyObject* chill_loop(PyObject* self, PyObject* args) {
Py_RETURN_NONE;
}
-static PyObject* chill_print_code(PyObject* self, PyObject* args) {
+static PyObject *chill_print_code(PyObject *self, PyObject *args) {
strict_arg_num(args, 0, "print_code");
myloop->printCode();
printf("\n");
Py_RETURN_NONE;
}
-static PyObject* chill_print_dep(PyObject* self, PyObject* args) {
+static PyObject *chill_print_dep(PyObject *self, PyObject *args) {
strict_arg_num(args, 0, "print_dep");
myloop->printDependenceGraph();
Py_RETURN_NONE;
}
-static PyObject* chill_print_space(PyObject* self, PyObject* args) {
+static PyObject *chill_print_space(PyObject *self, PyObject *args) {
strict_arg_num(args, 0, "print_space");
myloop->printIterationSpace();
Py_RETURN_NONE;
@@ -324,9 +323,9 @@ static PyObject* chill_print_space(PyObject* self, PyObject* args) {
static void add_known(std::string cond_expr) {
int num_dim = myloop->known.n_set();
- std::vector<std::map<std::string, int> >* cond;
+ std::vector<std::map<std::string, int> > *cond;
cond = parse_relation_vector(cond_expr.c_str());
-
+
Relation rel(num_dim);
F_And *f_root = rel.add_and();
for (int j = 0; j < cond->size(); j++) {
@@ -358,21 +357,20 @@ static void add_known(std::string cond_expr) {
myloop->addKnown(rel);
}
-static PyObject* chill_known(PyObject* self, PyObject* args) {
+static PyObject *chill_known(PyObject *self, PyObject *args) {
strict_arg_num(args, 1, "known");
if (PyList_Check(PyTuple_GetItem(args, 0))) {
- PyObject* list = PyTuple_GetItem(args, 0);
+ PyObject *list = PyTuple_GetItem(args, 0);
for (int i = 0; i < PyList_Size(list); i++) {
add_known(std::string(PyString_AsString(PyList_GetItem(list, i))));
}
- }
- else {
+ } else {
add_known(strArg(args, 0));
}
Py_RETURN_NONE;
}
-static PyObject* chill_remove_dep(PyObject* self, PyObject* args) {
+static PyObject *chill_remove_dep(PyObject *self, PyObject *args) {
strict_arg_num(args, 0, "remove_dep");
int from = intArg(args, 0);
int to = intArg(args, 1);
@@ -380,45 +378,43 @@ static PyObject* chill_remove_dep(PyObject* self, PyObject* args) {
Py_RETURN_NONE;
}
-static PyObject* chill_original(PyObject* self, PyObject* args) {
+static PyObject *chill_original(PyObject *self, PyObject *args) {
strict_arg_num(args, 0, "original");
myloop->original();
Py_RETURN_NONE;
}
-static PyObject* chill_permute(PyObject* self, PyObject* args) {
+static PyObject *chill_permute(PyObject *self, PyObject *args) {
int nargs = strict_arg_range(args, 1, 3, "permute");
- if((nargs < 1) || (nargs > 3))
+ if ((nargs < 1) || (nargs > 3))
throw std::runtime_error("incorrect number of arguments in permute");
- if(nargs == 1) {
+ if (nargs == 1) {
// premute ( vector )
- std::vector<int> pi;
- if(!tointvector(args, 0, pi))
+ std::vector<int> pi;
+ if (!tointvector(args, 0, pi))
throw std::runtime_error("first arg in permute(pi) must be an int vector");
myloop->permute(pi);
- }
- else if (nargs == 2) {
+ } else if (nargs == 2) {
// permute ( set, vector )
std::set<int> active;
std::vector<int> pi;
- if(!tointset(args, 0, active))
+ if (!tointset(args, 0, active))
throw std::runtime_error("the first argument in permute(active, pi) must be an int set");
- if(!tointvector(args, 1, pi))
+ if (!tointvector(args, 1, pi))
throw std::runtime_error("the second argument in permute(active, pi) must be an int vector");
- myloop->permute(active, pi);
- }
- else if (nargs == 3) {
+ myloop->permute(active, pi);
+ } else if (nargs == 3) {
int stmt_num = intArg(args, 1);
int level = intArg(args, 2);
std::vector<int> pi;
- if(!tointvector(args, 3, pi))
+ if (!tointvector(args, 3, pi))
throw std::runtime_error("the third argument in permute(stmt_num, level, pi) must be an int vector");
myloop->permute(stmt_num, level, pi);
}
Py_RETURN_NONE;
}
-static PyObject* chill_pragma(PyObject* self, PyObject* args) {
+static PyObject *chill_pragma(PyObject *self, PyObject *args) {
strict_arg_num(args, 3, "pragma");
int stmt_num = intArg(args, 1);
int level = intArg(args, 1);
@@ -427,7 +423,7 @@ static PyObject* chill_pragma(PyObject* self, PyObject* args) {
Py_RETURN_NONE;
}
-static PyObject* chill_prefetch(PyObject* self, PyObject* args) {
+static PyObject *chill_prefetch(PyObject *self, PyObject *args) {
strict_arg_num(args, 3, "prefetch");
int stmt_num = intArg(args, 0);
int level = intArg(args, 1);
@@ -437,17 +433,16 @@ static PyObject* chill_prefetch(PyObject* self, PyObject* args) {
Py_RETURN_NONE;
}
-static PyObject* chill_tile(PyObject* self, PyObject* args) {
+static PyObject *chill_tile(PyObject *self, PyObject *args) {
int nargs = strict_arg_range(args, 3, 7, "tile");
int stmt_num = intArg(args, 0);
int level = intArg(args, 1);
int tile_size = intArg(args, 2);
- if(nargs == 3) {
+ if (nargs == 3) {
myloop->tile(stmt_num, level, tile_size);
- }
- else if(nargs >= 4) {
+ } else if (nargs >= 4) {
int outer_level = intArg(args, 3);
- if(nargs >= 5) {
+ if (nargs >= 5) {
TilingMethodType method = StridedTile;
int imethod = intArg(args, 4, 2); //< don't know if a default value is needed
// check method input against expected values
@@ -457,25 +452,25 @@ static PyObject* chill_tile(PyObject* self, PyObject* args) {
method = CountedTile;
else
throw std::runtime_error("5th argument must be either strided or counted");
- if(nargs >= 6) {
+ if (nargs >= 6) {
int alignment_offset = intArg(args, 5);
- if(nargs == 7) {
+ if (nargs == 7) {
int alignment_multiple = intArg(args, 6, 1);
myloop->tile(stmt_num, level, tile_size, outer_level, method, alignment_offset, alignment_multiple);
}
- if(nargs == 6)
+ if (nargs == 6)
myloop->tile(stmt_num, level, tile_size, outer_level, method, alignment_offset);
}
- if(nargs == 5)
+ if (nargs == 5)
myloop->tile(stmt_num, level, tile_size, outer_level, method);
}
- if(nargs == 4)
- myloop->tile(stmt_num, level, tile_size, outer_level);
+ if (nargs == 4)
+ myloop->tile(stmt_num, level, tile_size, outer_level);
}
Py_RETURN_NONE;
}
-static void chill_datacopy_vec(PyObject* args) {
+static void chill_datacopy_vec(PyObject *args) {
// Overload 1: bool datacopy(
// const std::vector<std::pair<int, std::vector<int> > > &array_ref_nums,
// int level,
@@ -487,28 +482,26 @@ static void chill_datacopy_vec(PyObject* args) {
std::vector<std::pair<int, std::vector<int> > > array_ref_nums;
// expect list(tuple(int,list(int)))
// or dict(int,list(int))
- if(PyList_CheckExact(PyTuple_GetItem(args, 0))) {
- PyObject* list = PyTuple_GetItem(args, 0);
- for(int i = 0; i < PyList_Size(list); i ++) {
- PyObject* tup = PyList_GetItem(list, i);
+ if (PyList_CheckExact(PyTuple_GetItem(args, 0))) {
+ PyObject *list = PyTuple_GetItem(args, 0);
+ for (int i = 0; i < PyList_Size(list); i++) {
+ PyObject *tup = PyList_GetItem(list, i);
int index = PyLong_AsLong(PyTuple_GetItem(tup, 0));
std::vector<int> vec;
tointvector(PyTuple_GetItem(tup, 1), vec);
array_ref_nums.push_back(std::pair<int, std::vector<int> >(index, vec));
}
- }
- else if(PyList_CheckExact(PyTuple_GetItem(args, 0))) {
- PyObject* dict = PyTuple_GetItem(args, 0);
- PyObject* klist = PyDict_Keys(dict);
- for(int ki = 0; ki < PyList_Size(klist); ki++) {
- PyObject* index = PyList_GetItem(klist, ki);
+ } else if (PyList_CheckExact(PyTuple_GetItem(args, 0))) {
+ PyObject *dict = PyTuple_GetItem(args, 0);
+ PyObject *klist = PyDict_Keys(dict);
+ for (int ki = 0; ki < PyList_Size(klist); ki++) {
+ PyObject *index = PyList_GetItem(klist, ki);
std::vector<int> vec;
- tointvector(PyDict_GetItem(dict,index), vec);
+ tointvector(PyDict_GetItem(dict, index), vec);
array_ref_nums.push_back(std::pair<int, std::vector<int> >(PyLong_AsLong(index), vec));
}
Py_DECREF(klist);
- }
- else {
+ } else {
//TODO: this should never happen
}
int level = intArg(args, 1);
@@ -517,34 +510,35 @@ static void chill_datacopy_vec(PyObject* args) {
int padding_stride = intArg(args, 4, 1);
int padding_alignment = intArg(args, 5, 4);
int memory_type = intArg(args, 6, 0);
- myloop->datacopy(array_ref_nums, level, allow_extra_read, fastest_changing_dimension, padding_stride, padding_alignment, memory_type);
+ myloop->datacopy(array_ref_nums, level, allow_extra_read, fastest_changing_dimension, padding_stride,
+ padding_alignment, memory_type);
}
-static void chill_datacopy_int(PyObject* args) {
+static void chill_datacopy_int(PyObject *args) {
int stmt_num = intArg(args, 0);
int level = intArg(args, 1);
- std::string array_name = strArg(args,2,0);
- bool allow_extra_read = boolArg(args,3,false);
+ std::string array_name = strArg(args, 2, 0);
+ bool allow_extra_read = boolArg(args, 3, false);
int fastest_changing_dimension = intArg(args, 4, -1);
int padding_stride = intArg(args, 5, 1);
int padding_alignment = intArg(args, 6, 4);
int memory_type = intArg(args, 7, 0);
- myloop->datacopy(stmt_num, level, array_name, allow_extra_read, fastest_changing_dimension, padding_stride, padding_alignment, memory_type);
+ myloop->datacopy(stmt_num, level, array_name, allow_extra_read, fastest_changing_dimension, padding_stride,
+ padding_alignment, memory_type);
}
-static PyObject* chill_datacopy(PyObject* self, PyObject* args) {
+static PyObject *chill_datacopy(PyObject *self, PyObject *args) {
// Overload 2: bool datacopy(int stmt_num, int level, const std::string &array_name, bool allow_extra_read = false, int fastest_changing_dimension = -1, int padding_stride = 1, int padding_alignment = 4, int memory_type = 0);
int nargs = strict_arg_range(args, 3, 7, "datacopy");
- if(PyList_CheckExact(PyTuple_GetItem(args,0)) || PyDict_CheckExact(PyTuple_GetItem(args, 0))) {
+ if (PyList_CheckExact(PyTuple_GetItem(args, 0)) || PyDict_CheckExact(PyTuple_GetItem(args, 0))) {
chill_datacopy_vec(args);
- }
- else {
+ } else {
chill_datacopy_int(args);
}
Py_RETURN_NONE;
}
-static PyObject* chill_datacopy_privatized(PyObject* self, PyObject* args) {
+static PyObject *chill_datacopy_privatized(PyObject *self, PyObject *args) {
// bool datacopy_privatized(int stmt_num, int level, const std::string &array_name, const std::vector<int> &privatized_levels, bool allow_extra_read = false, int fastest_changing_dimension = -1, int padding_stride = 1, int padding_alignment = 1, int memory_type = 0);
int nargs = strict_arg_range(args, 4, 9, "datacopy_privatized");
int stmt_num = intArg(args, 0);
@@ -557,43 +551,44 @@ static PyObject* chill_datacopy_privatized(PyObject* self, PyObject* args) {
int padding_stride = intArg(args, 6, 1);
int padding_alignment = intArg(args, 7, 1);
int memory_type = intArg(args, 8);
- myloop->datacopy_privatized(stmt_num, level, array_name, privatized_levels, allow_extra_read, fastest_changing_dimension, padding_stride, padding_alignment, memory_type);
+ myloop->datacopy_privatized(stmt_num, level, array_name, privatized_levels, allow_extra_read,
+ fastest_changing_dimension, padding_stride, padding_alignment, memory_type);
Py_RETURN_NONE;
}
-static PyObject* chill_unroll(PyObject* self, PyObject* args) {
+static PyObject *chill_unroll(PyObject *self, PyObject *args) {
int nargs = strict_arg_range(args, 3, 4, "unroll");
//std::set<int> unroll(int stmt_num, int level, int unroll_amount, std::vector< std::vector<std::string> >idxNames= std::vector< std::vector<std::string> >(), int cleanup_split_level = 0);
int stmt_num = intArg(args, 0);
int level = intArg(args, 1);
int unroll_amount = intArg(args, 2);
- std::vector< std::vector<std::string> > idxNames = std::vector< std::vector<std::string> >();
+ std::vector<std::vector<std::string> > idxNames = std::vector<std::vector<std::string> >();
int cleanup_split_level = intArg(args, 3);
myloop->unroll(stmt_num, level, unroll_amount, idxNames, cleanup_split_level);
Py_RETURN_NONE;
}
-
-static PyObject* chill_unroll_extra(PyObject* self, PyObject* args) {
+
+static PyObject *chill_unroll_extra(PyObject *self, PyObject *args) {
int nargs = strict_arg_range(args, 3, 4, "unroll_extra");
int stmt_num = intArg(args, 0);
int level = intArg(args, 1);
int unroll_amount = intArg(args, 2);
int cleanup_split_level = intArg(args, 3, 0);
- myloop->unroll_extra(stmt_num, level, unroll_amount, cleanup_split_level);
+ myloop->unroll_extra(stmt_num, level, unroll_amount, cleanup_split_level);
Py_RETURN_NONE;
}
-
-static PyObject* chill_split(PyObject* self, PyObject* args) {
+
+static PyObject *chill_split(PyObject *self, PyObject *args) {
strict_arg_num(args, 3, "split");
int stmt_num = intArg(args, 0);
int level = intArg(args, 1);
int num_dim = myloop->stmt[stmt_num].xform.n_out();
-
- std::vector<std::map<std::string, int> >* cond;
+
+ std::vector<std::map<std::string, int> > *cond;
std::string cond_expr = strArg(args, 2);
cond = parse_relation_vector(cond_expr.c_str());
-
- Relation rel((num_dim-1)/2);
+
+ Relation rel((num_dim - 1) / 2);
F_And *f_root = rel.add_and();
for (int j = 0; j < cond->size(); j++) {
GEQ_Handle h = f_root->add_GEQ();
@@ -603,7 +598,7 @@ static PyObject* chill_split(PyObject* self, PyObject* args) {
if (dim == 0)
h.update_const(it->second);
else {
- if (dim > (num_dim-1)/2)
+ if (dim > (num_dim - 1) / 2)
throw std::invalid_argument("invalid loop level " + to_string(dim) + " in split condition");
h.update_coef(rel.set_var(dim), it->second);
}
@@ -623,18 +618,18 @@ static PyObject* chill_split(PyObject* self, PyObject* args) {
}
}
}
- myloop->split(stmt_num,level,rel);
+ myloop->split(stmt_num, level, rel);
Py_RETURN_NONE;
}
-static PyObject* chill_nonsingular(PyObject* self, PyObject* args) {
- std::vector< std::vector<int> > mat;
+static PyObject *chill_nonsingular(PyObject *self, PyObject *args) {
+ std::vector<std::vector<int> > mat;
tointmatrix(args, 0, mat);
myloop->nonsingular(mat);
Py_RETURN_NONE;
}
-static PyObject* chill_skew(PyObject* self, PyObject* args) {
+static PyObject *chill_skew(PyObject *self, PyObject *args) {
std::set<int> stmt_nums;
std::vector<int> skew_amounts;
int level = intArg(args, 1);
@@ -644,7 +639,7 @@ static PyObject* chill_skew(PyObject* self, PyObject* args) {
Py_RETURN_NONE;
}
-static PyObject* chill_scale(PyObject* self, PyObject* args) {
+static PyObject *chill_scale(PyObject *self, PyObject *args) {
strict_arg_num(args, 3);
std::set<int> stmt_nums;
int level = intArg(args, 1);
@@ -654,7 +649,7 @@ static PyObject* chill_scale(PyObject* self, PyObject* args) {
Py_RETURN_NONE;
}
-static PyObject* chill_reverse(PyObject* self, PyObject* args) {
+static PyObject *chill_reverse(PyObject *self, PyObject *args) {
strict_arg_num(args, 2);
std::set<int> stmt_nums;
int level = intArg(args, 1);
@@ -663,7 +658,7 @@ static PyObject* chill_reverse(PyObject* self, PyObject* args) {
Py_RETURN_NONE;
}
-static PyObject* chill_shift(PyObject* self, PyObject* args) {
+static PyObject *chill_shift(PyObject *self, PyObject *args) {
strict_arg_num(args, 3);
std::set<int> stmt_nums;
int level = intArg(args, 1);
@@ -673,7 +668,7 @@ static PyObject* chill_shift(PyObject* self, PyObject* args) {
Py_RETURN_NONE;
}
-static PyObject* chill_shift_to(PyObject* self, PyObject* args) {
+static PyObject *chill_shift_to(PyObject *self, PyObject *args) {
strict_arg_num(args, 3);
int stmt_num = intArg(args, 0);
int level = intArg(args, 1);
@@ -682,7 +677,7 @@ static PyObject* chill_shift_to(PyObject* self, PyObject* args) {
Py_RETURN_NONE;
}
-static PyObject* chill_peel(PyObject* self, PyObject* args) {
+static PyObject *chill_peel(PyObject *self, PyObject *args) {
strict_arg_range(args, 2, 3);
int stmt_num = intArg(args, 0);
int level = intArg(args, 1);
@@ -691,7 +686,7 @@ static PyObject* chill_peel(PyObject* self, PyObject* args) {
Py_RETURN_NONE;
}
-static PyObject* chill_fuse(PyObject* self, PyObject* args) {
+static PyObject *chill_fuse(PyObject *self, PyObject *args) {
strict_arg_num(args, 2);
std::set<int> stmt_nums;
int level = intArg(args, 1);
@@ -700,7 +695,7 @@ static PyObject* chill_fuse(PyObject* self, PyObject* args) {
Py_RETURN_NONE;
}
-static PyObject* chill_distribute(PyObject* self, PyObject* args) {
+static PyObject *chill_distribute(PyObject *self, PyObject *args) {
strict_arg_num(args, 2);
std::set<int> stmts;
int level = intArg(args, 1);
@@ -710,49 +705,48 @@ static PyObject* chill_distribute(PyObject* self, PyObject* args) {
}
static PyObject *
-chill_num_statements(PyObject *self, PyObject *args)
-{
+chill_num_statements(PyObject *self, PyObject *args) {
//DEBUG_PRINT("\nC chill_num_statements() called from python\n");
int num = myloop->stmt.size();
//DEBUG_PRINT("C num_statement() = %d\n", num);
- return Py_BuildValue( "i", num ); // BEWARE "d" is DOUBLE, not int
-}
-
-static PyMethodDef ChillMethods[] = {
-
- //python name C routine parameter passing comment
- {"source", chill_source, METH_VARARGS, "set source file for chill script"},
- {"procedure", chill_procedure, METH_VARARGS, "set the name of the procedure"},
- {"loop", chill_loop, METH_VARARGS, "indicate which loop to optimize"},
- {"print_code", chill_print_code, METH_VARARGS, "print generated code"},
- {"print_dep", chill_print_dep, METH_VARARGS, "print the dependencies graph"},
- {"print_space", chill_print_space, METH_VARARGS, "print space"},
- {"known", chill_known, METH_VARARGS, "knwon"},
- {"remove_dep", chill_remove_dep, METH_VARARGS, "remove dependency i suppose"},
- {"original", chill_original, METH_VARARGS, "original"},
- {"permute", chill_permute, METH_VARARGS, "permute"},
- {"pragma", chill_pragma, METH_VARARGS, "pragma"},
- {"prefetch", chill_prefetch, METH_VARARGS, "prefetch"},
- {"tile", chill_tile, METH_VARARGS, "tile"},
- {"datacopy", chill_datacopy, METH_VARARGS, "datacopy"},
- {"datacopy_privitized", chill_datacopy_privatized, METH_VARARGS, "datacopy_privatized"},
- {"unroll", chill_unroll, METH_VARARGS, "unroll"},
- {"unroll_extra", chill_unroll_extra, METH_VARARGS, "unroll_extra"},
- {"split", chill_split, METH_VARARGS, "split"},
- {"nonsingular", chill_nonsingular, METH_VARARGS, "nonsingular"},
- {"skew", chill_skew, METH_VARARGS, "skew"},
- {"scale", chill_scale, METH_VARARGS, "scale"},
- {"reverse", chill_reverse, METH_VARARGS, "reverse"},
- {"shift", chill_shift, METH_VARARGS, "shift"},
- {"shift_to", chill_shift_to, METH_VARARGS, "shift_to"},
- {"peel", chill_peel, METH_VARARGS, "peel"},
- {"fuse", chill_fuse, METH_VARARGS, "fuse"},
- {"distribute", chill_distribute, METH_VARARGS, "distribute"},
- {"num_statements", chill_num_statements, METH_VARARGS, "number of statements in the current loop"},
- {NULL, NULL, 0, NULL}
+ return Py_BuildValue("i", num); // BEWARE "d" is DOUBLE, not int
+}
+
+static PyMethodDef ChillMethods[] = {
+
+ //python name C routine parameter passing comment
+ {"source", chill_source, METH_VARARGS, "set source file for chill script"},
+ {"procedure", chill_procedure, METH_VARARGS, "set the name of the procedure"},
+ {"loop", chill_loop, METH_VARARGS, "indicate which loop to optimize"},
+ {"print_code", chill_print_code, METH_VARARGS, "print generated code"},
+ {"print_dep", chill_print_dep, METH_VARARGS, "print the dependencies graph"},
+ {"print_space", chill_print_space, METH_VARARGS, "print space"},
+ {"known", chill_known, METH_VARARGS, "knwon"},
+ {"remove_dep", chill_remove_dep, METH_VARARGS, "remove dependency i suppose"},
+ {"original", chill_original, METH_VARARGS, "original"},
+ {"permute", chill_permute, METH_VARARGS, "permute"},
+ {"pragma", chill_pragma, METH_VARARGS, "pragma"},
+ {"prefetch", chill_prefetch, METH_VARARGS, "prefetch"},
+ {"tile", chill_tile, METH_VARARGS, "tile"},
+ {"datacopy", chill_datacopy, METH_VARARGS, "datacopy"},
+ {"datacopy_privitized", chill_datacopy_privatized, METH_VARARGS, "datacopy_privatized"},
+ {"unroll", chill_unroll, METH_VARARGS, "unroll"},
+ {"unroll_extra", chill_unroll_extra, METH_VARARGS, "unroll_extra"},
+ {"split", chill_split, METH_VARARGS, "split"},
+ {"nonsingular", chill_nonsingular, METH_VARARGS, "nonsingular"},
+ {"skew", chill_skew, METH_VARARGS, "skew"},
+ {"scale", chill_scale, METH_VARARGS, "scale"},
+ {"reverse", chill_reverse, METH_VARARGS, "reverse"},
+ {"shift", chill_shift, METH_VARARGS, "shift"},
+ {"shift_to", chill_shift_to, METH_VARARGS, "shift_to"},
+ {"peel", chill_peel, METH_VARARGS, "peel"},
+ {"fuse", chill_fuse, METH_VARARGS, "fuse"},
+ {"distribute", chill_distribute, METH_VARARGS, "distribute"},
+ {"num_statements", chill_num_statements, METH_VARARGS, "number of statements in the current loop"},
+ {NULL, NULL, 0, NULL}
};
-static void register_globals(PyObject* m) {
+static void register_globals(PyObject *m) {
// Preset globals
PyModule_AddStringConstant(m, "VERSION", CHILL_BUILD_VERSION);
PyModule_AddStringConstant(m, "dest", "C");
@@ -766,12 +760,12 @@ static void register_globals(PyObject* m) {
PyModule_AddIntConstant(m, "textured", 2);
// Bool flags
PyModule_AddIntConstant(m, "sync", 1);
-}
+}
PyMODINIT_FUNC
initchill(void) // pass C methods to python
{
- CHILL_DEBUG_PRINT("in C, initchill() to set up C methods to be called from python\n");
- PyObject* m = Py_InitModule("chill", ChillMethods);
+ CHILL_DEBUG_PRINT("set up C methods to be called from python\n");
+ PyObject *m = Py_InitModule("chill", ChillMethods);
register_globals(m);
}
diff --git a/src/dep.cc b/src/dep.cc
index e47d7aa..7439dd2 100644
--- a/src/dep.cc
+++ b/src/dep.cc
@@ -26,51 +26,51 @@
// Class: DependeceVector
//-----------------------------------------------------------------------------
-std::ostream& operator<<(std::ostream &os, const DependenceVector &d) {
+std::ostream &operator<<(std::ostream &os, const DependenceVector &d) {
if (d.sym != NULL) {
os << d.sym->name();
os << ':';
if (d.quasi)
os << "_quasi";
-
+
}
-
+
switch (d.type) {
- case DEP_W2R:
- os << "flow";
- // Check for reduction implemetation correctness
- if (d.is_reduction)
- os << "_reduction";
- break;
- case DEP_R2W:
- os << "anti";
- // TODO: Remove Check for reduction implemetation correctness
- if (d.is_reduction)
- os << "_reduction";
- break;
- case DEP_W2W:
- os << "output";
- // TODO: Remove Check for reduction implemetation correctness
- if (d.is_reduction)
- os << "_reduction";
- break;
- case DEP_R2R:
- os << "input";
- break;
- case DEP_CONTROL:
- os << "control";
- break;
- default:
- os << "unknown";
- break;
+ case DEP_W2R:
+ os << "flow";
+ // Check for reduction implemetation correctness
+ if (d.is_reduction)
+ os << "_reduction";
+ break;
+ case DEP_R2W:
+ os << "anti";
+ // TODO: Remove Check for reduction implemetation correctness
+ if (d.is_reduction)
+ os << "_reduction";
+ break;
+ case DEP_W2W:
+ os << "output";
+ // TODO: Remove Check for reduction implemetation correctness
+ if (d.is_reduction)
+ os << "_reduction";
+ break;
+ case DEP_R2R:
+ os << "input";
+ break;
+ case DEP_CONTROL:
+ os << "control";
+ break;
+ default:
+ os << "unknown";
+ break;
}
-
+
os << '(';
-
+
for (int i = 0; i < d.lbounds.size(); i++) {
omega::coef_t lbound = d.lbounds[i];
omega::coef_t ubound = d.ubounds[i];
-
+
if (lbound == ubound)
os << lbound;
else {
@@ -91,13 +91,13 @@ std::ostream& operator<<(std::ostream &os, const DependenceVector &d) {
} else
os << lbound << '~' << ubound;
}
-
+
if (i < d.lbounds.size() - 1)
os << ", ";
}
-
+
os << ')';
-
+
return os;
}
@@ -139,6 +139,7 @@ DependenceVector &DependenceVector::operator=(const DependenceVector &that) {
}
return *this;
}
+
DependenceType DependenceVector::getType() const {
return type;
}
@@ -161,14 +162,14 @@ bool DependenceVector::is_control_dependence() const {
bool DependenceVector::has_negative_been_carried_at(int dim) const {
if (!is_data_dependence())
throw std::invalid_argument("only works for data dependences");
-
+
if (dim < 0 || dim >= lbounds.size())
return false;
-
+
for (int i = 0; i < dim; i++)
if (lbounds[i] > 0 || ubounds[i] < 0)
return false;
-
+
if (lbounds[dim] < 0)
return true;
else
@@ -179,36 +180,36 @@ bool DependenceVector::has_negative_been_carried_at(int dim) const {
bool DependenceVector::has_been_carried_at(int dim) const {
if (!is_data_dependence())
throw std::invalid_argument("only works for data dependences");
-
+
if (dim < 0 || dim >= lbounds.size())
return false;
-
+
for (int i = 0; i < dim; i++)
if (lbounds[i] > 0 || ubounds[i] < 0)
return false;
-
- if ((lbounds[dim] != 0) || (ubounds[dim] !=0))
+
+ if ((lbounds[dim] != 0) || (ubounds[dim] != 0))
return true;
-
+
return false;
}
bool DependenceVector::has_been_carried_before(int dim) const {
if (!is_data_dependence())
throw std::invalid_argument("only works for data dependences");
-
+
if (dim < 0)
return false;
if (dim > lbounds.size())
dim = lbounds.size();
-
+
for (int i = 0; i < dim; i++) {
if (lbounds[i] > 0)
return true;
if (ubounds[i] < 0)
return true;
}
-
+
return false;
}
@@ -219,11 +220,11 @@ bool DependenceVector::isZero() const {
bool DependenceVector::isZero(int dim) const {
if (dim >= lbounds.size())
throw std::invalid_argument("invalid dependence dimension");
-
+
for (int i = 0; i <= dim; i++)
if (lbounds[i] != 0 || ubounds[i] != 0)
return false;
-
+
return true;
}
@@ -235,7 +236,7 @@ bool DependenceVector::isPositive() const {
else if (lbounds[i] > 0)
return true;
}
-
+
return false;
}
@@ -247,7 +248,7 @@ bool DependenceVector::isNegative() const {
else if (ubounds[i] < 0)
return true;
}
-
+
return false;
}
@@ -255,7 +256,7 @@ bool DependenceVector::isAllPositive() const {
for (int i = 0; i < lbounds.size(); i++)
if (lbounds[i] < 0)
return false;
-
+
return true;
}
@@ -263,14 +264,14 @@ bool DependenceVector::isAllNegative() const {
for (int i = 0; i < ubounds.size(); i++)
if (ubounds[i] > 0)
return false;
-
+
return true;
}
bool DependenceVector::hasPositive(int dim) const {
if (dim >= lbounds.size())
throw std::invalid_argument("invalid dependence dimension");
-
+
if (lbounds[dim] > 0)
//av: changed from ubounds to lbounds may have side effects
return true;
@@ -281,7 +282,7 @@ bool DependenceVector::hasPositive(int dim) const {
bool DependenceVector::hasNegative(int dim) const {
if (dim >= lbounds.size())
throw std::invalid_argument("invalid dependence dimension");
-
+
if (ubounds[dim] < 0)
//av: changed from lbounds to ubounds may have side effects
return true;
@@ -292,45 +293,45 @@ bool DependenceVector::hasNegative(int dim) const {
bool DependenceVector::isCarried(int dim, omega::coef_t distance) const {
if (distance <= 0)
throw std::invalid_argument("invalid dependence distance size");
-
+
if (dim > lbounds.size())
dim = lbounds.size();
-
+
for (int i = 0; i < dim; i++)
if (lbounds[i] > 0)
return false;
else if (ubounds[i] < 0)
return false;
-
+
if (dim >= lbounds.size())
return true;
-
+
if (lbounds[dim] > distance)
return false;
else if (ubounds[dim] < -distance)
return false;
-
+
return true;
}
bool DependenceVector::canPermute(const std::vector<int> &pi) const {
if (pi.size() != lbounds.size())
throw std::invalid_argument(
- "permute dimensionality do not match dependence space");
-
+ "permute dimensionality do not match dependence space");
+
for (int i = 0; i < pi.size(); i++) {
if (lbounds[pi[i]] > 0)
return true;
else if (lbounds[pi[i]] < 0)
return false;
}
-
+
return true;
}
std::vector<DependenceVector> DependenceVector::normalize() const {
std::vector<DependenceVector> result;
-
+
DependenceVector dv(*this);
for (int i = 0; i < dv.lbounds.size(); i++) {
if (dv.lbounds[i] < 0 && dv.ubounds[i] >= 0) {
@@ -351,63 +352,63 @@ std::vector<DependenceVector> DependenceVector::normalize() const {
else
break;
}
-
+
result.push_back(dv);
return result;
}
std::vector<DependenceVector> DependenceVector::permute(
- const std::vector<int> &pi) const {
+ const std::vector<int> &pi) const {
if (pi.size() != lbounds.size())
throw std::invalid_argument(
- "permute dimensionality do not match dependence space");
-
+ "permute dimensionality do not match dependence space");
+
const int n = lbounds.size();
-
+
DependenceVector dv(*this);
for (int i = 0; i < n; i++) {
dv.lbounds[i] = lbounds[pi[i]];
dv.ubounds[i] = ubounds[pi[i]];
}
-
+
int violated = 0;
-
+
for (int i = 0; i < n; i++) {
if (dv.lbounds[i] > 0)
break;
else if (dv.lbounds[i] < 0)
violated = 1;
}
-
+
if (((violated == 1) && !quasi) && !is_scalar_dependence) {
throw ir_error("dependence violation");
-
+
}
-
+
return dv.normalize();
}
DependenceVector DependenceVector::reverse() const {
const int n = lbounds.size();
-
+
DependenceVector dv(*this);
switch (type) {
- case DEP_W2R:
- dv.type = DEP_R2W;
- break;
- case DEP_R2W:
- dv.type = DEP_W2R;
- break;
- default:
- dv.type = type;
+ case DEP_W2R:
+ dv.type = DEP_R2W;
+ break;
+ case DEP_R2W:
+ dv.type = DEP_W2R;
+ break;
+ default:
+ dv.type = type;
}
-
+
for (int i = 0; i < n; i++) {
dv.lbounds[i] = -ubounds[i];
dv.ubounds[i] = -lbounds[i];
}
dv.quasi = true;
-
+
return dv;
}
@@ -473,10 +474,10 @@ DependenceVector DependenceVector::reverse() const {
DependenceGraph DependenceGraph::permute(const std::vector<int> &pi,
const std::set<int> &active) const {
DependenceGraph g;
-
+
for (int i = 0; i < vertex.size(); i++)
g.insert(vertex[i].first);
-
+
for (int i = 0; i < vertex.size(); i++)
for (EdgeList::const_iterator j = vertex[i].second.begin();
j != vertex[i].second.end(); j++) {
@@ -502,7 +503,7 @@ DependenceGraph DependenceGraph::permute(const std::vector<int> &pi,
g.connect(i, j->first, dv);
}
}
-
+
return g;
}
@@ -522,23 +523,23 @@ DependenceGraph DependenceGraph::permute(const std::vector<int> &pi,
DependenceGraph DependenceGraph::subspace(int dim) const {
DependenceGraph g;
-
+
for (int i = 0; i < vertex.size(); i++)
g.insert(vertex[i].first);
-
+
for (int i = 0; i < vertex.size(); i++)
for (EdgeList::const_iterator j = vertex[i].second.begin();
j != vertex[i].second.end(); j++)
-
+
for (int k = 0; k < j->second.size(); k++) {
- if(j->second[k].type != DEP_CONTROL){
+ if (j->second[k].type != DEP_CONTROL) {
if (j->second[k].isCarried(dim))
g.connect(i, j->first, j->second[k]);
- }else
+ } else
g.connect(i, j->first, j->second[k]);
-
+
}
-
+
return g;
}
@@ -549,7 +550,7 @@ bool DependenceGraph::isPositive() const {
for (int k = 0; k < j->second.size(); k++)
if (!j->second[k].isPositive())
return false;
-
+
return true;
}
@@ -560,7 +561,7 @@ bool DependenceGraph::hasPositive(int dim) const {
for (int k = 0; k < j->second.size(); k++)
if (!j->second[k].hasPositive(dim))
return false;
-
+
return true;
}
@@ -571,6 +572,6 @@ bool DependenceGraph::hasNegative(int dim) const {
for (int k = 0; k < j->second.size(); k++)
if (!j->second[k].hasNegative(dim))
return false;
-
+
return true;
}
diff --git a/src/ir_clang.cc b/src/ir_clang.cc
index 0c56cf0..c8a0c12 100755
--- a/src/ir_clang.cc
+++ b/src/ir_clang.cc
@@ -21,7 +21,7 @@ History:
#include "loop.hh"
#include "chill_error.hh"
-#define DUMPFUNC(x, y) std::cerr << "In function " << x << "\n"; y->dump();
+#define DUMPFUNC(x, y) std::cerr << "In function " << x << "\n"; y->dump();
#include "clang/Frontend/FrontendActions.h"
#include <clang/CodeGen/CodeGenAction.h>
@@ -47,29 +47,48 @@ History:
// TODO move to ir_clang.hh
// fwd declarations
-chillAST_node * ConvertVarDecl( clang::VarDecl *D, chillAST_node * );
-chillAST_node * ConvertTypeDefDecl( clang::TypedefDecl *TDD, chillAST_node * );
-chillAST_node * ConvertRecordDecl( clang::RecordDecl *D, chillAST_node * );
-chillAST_node * ConvertDeclStmt( clang::DeclStmt *clangDS, chillAST_node * );
-chillAST_node * ConvertCompoundStmt( clang::CompoundStmt *clangCS, chillAST_node * );
-chillAST_node * ConvertFunctionDecl( clang::FunctionDecl *D , chillAST_node *);
-chillAST_node * ConvertForStmt( clang::ForStmt *clangFS, chillAST_node * );
-chillAST_node * ConvertUnaryOperator( clang::UnaryOperator * clangU, chillAST_node *O );
-chillAST_node * ConvertBinaryOperator( clang::BinaryOperator * clangBO, chillAST_node *B );
-chillAST_node * ConvertArraySubscriptExpr( clang::ArraySubscriptExpr *clangASE, chillAST_node * );
-chillAST_node * ConvertDeclRefExpr( clang::DeclRefExpr * clangDRE, chillAST_node * );
-chillAST_node * ConvertIntegerLiteral( clang::IntegerLiteral *clangIL, chillAST_node * );
-chillAST_node * ConvertFloatingLiteral( clang::FloatingLiteral *clangFL, chillAST_node * );
-chillAST_node * ConvertImplicitCastExpr( clang::ImplicitCastExpr *clangICE, chillAST_node * );
-chillAST_node * ConvertCStyleCastExpr( clang::CStyleCastExpr *clangICE, chillAST_node * );
-chillAST_node * ConvertReturnStmt( clang::ReturnStmt *clangRS, chillAST_node * );
-chillAST_node * ConvertCallExpr( clang::CallExpr *clangCE , chillAST_node *);
-chillAST_node * ConvertIfStmt( clang::IfStmt *clangIS , chillAST_node *);
-chillAST_node * ConvertMemberExpr( clang::MemberExpr *clangME , chillAST_node *);
-
-
-chillAST_node * ConvertTranslationUnit( clang::TranslationUnitDecl *TUD, char *filename );
-chillAST_node * ConvertGenericClangAST( clang::Stmt *s, chillAST_node * );
+chillAST_node *ConvertVarDecl(clang::VarDecl *D, chillAST_node *);
+
+chillAST_node *ConvertTypeDefDecl(clang::TypedefDecl *TDD, chillAST_node *);
+
+chillAST_node *ConvertRecordDecl(clang::RecordDecl *D, chillAST_node *);
+
+chillAST_node *ConvertDeclStmt(clang::DeclStmt *clangDS, chillAST_node *);
+
+chillAST_node *ConvertCompoundStmt(clang::CompoundStmt *clangCS, chillAST_node *);
+
+chillAST_node *ConvertFunctionDecl(clang::FunctionDecl *D, chillAST_node *);
+
+chillAST_node *ConvertForStmt(clang::ForStmt *clangFS, chillAST_node *);
+
+chillAST_node *ConvertUnaryOperator(clang::UnaryOperator *clangU, chillAST_node *O);
+
+chillAST_node *ConvertBinaryOperator(clang::BinaryOperator *clangBO, chillAST_node *B);
+
+chillAST_node *ConvertArraySubscriptExpr(clang::ArraySubscriptExpr *clangASE, chillAST_node *);
+
+chillAST_node *ConvertDeclRefExpr(clang::DeclRefExpr *clangDRE, chillAST_node *);
+
+chillAST_node *ConvertIntegerLiteral(clang::IntegerLiteral *clangIL, chillAST_node *);
+
+chillAST_node *ConvertFloatingLiteral(clang::FloatingLiteral *clangFL, chillAST_node *);
+
+chillAST_node *ConvertImplicitCastExpr(clang::ImplicitCastExpr *clangICE, chillAST_node *);
+
+chillAST_node *ConvertCStyleCastExpr(clang::CStyleCastExpr *clangICE, chillAST_node *);
+
+chillAST_node *ConvertReturnStmt(clang::ReturnStmt *clangRS, chillAST_node *);
+
+chillAST_node *ConvertCallExpr(clang::CallExpr *clangCE, chillAST_node *);
+
+chillAST_node *ConvertIfStmt(clang::IfStmt *clangIS, chillAST_node *);
+
+chillAST_node *ConvertMemberExpr(clang::MemberExpr *clangME, chillAST_node *);
+
+
+chillAST_node *ConvertTranslationUnit(clang::TranslationUnitDecl *TUD, char *filename);
+
+chillAST_node *ConvertGenericClangAST(clang::Stmt *s, chillAST_node *);
std::vector<chillAST_VarDecl *> VariableDeclarations;
@@ -82,89 +101,99 @@ using namespace std;
static string binops[] = {
- " ", " ", // BO_PtrMemD, BO_PtrMemI, // [C++ 5.5] Pointer-to-member operators.
- "*", "/", "%", // BO_Mul, BO_Div, BO_Rem, // [C99 6.5.5] Multiplicative operators.
- "+", "-", // BO_Add, BO_Sub, // [C99 6.5.6] Additive operators.
- "<<", ">>", // BO_Shl, BO_Shr, // [C99 6.5.7] Bitwise shift operators.
- "<", ">", "<=", ">=", // BO_LT, BO_GT, BO_LE, BO_GE, // [C99 6.5.8] Relational operators.
- "==", "!=", // BO_EQ, BO_NE, // [C99 6.5.9] Equality operators.
- "&", // BO_And, // [C99 6.5.10] Bitwise AND operator.
- "??", // BO_Xor, // [C99 6.5.11] Bitwise XOR operator.
- "|", // BO_Or, // [C99 6.5.12] Bitwise OR operator.
- "&&", // BO_LAnd, // [C99 6.5.13] Logical AND operator.
- "||", // BO_LOr, // [C99 6.5.14] Logical OR operator.
- "=", "*=", // BO_Assign, BO_MulAssign, // [C99 6.5.16] Assignment operators.
- "/=", "%=", // BO_DivAssign, BO_RemAssign,
- "+=", "-=", // BO_AddAssign, BO_SubAssign,
- "???", "???", // BO_ShlAssign, BO_ShrAssign,
- "&&=", "???", // BO_AndAssign, BO_XorAssign,
- "||=", // BO_OrAssign,
- ","}; // BO_Comma // [C99 6.5.17] Comma operator.
+ " ", " ", // BO_PtrMemD, BO_PtrMemI, // [C++ 5.5] Pointer-to-member operators.
+ "*", "/", "%", // BO_Mul, BO_Div, BO_Rem, // [C99 6.5.5] Multiplicative operators.
+ "+", "-", // BO_Add, BO_Sub, // [C99 6.5.6] Additive operators.
+ "<<", ">>", // BO_Shl, BO_Shr, // [C99 6.5.7] Bitwise shift operators.
+ "<", ">", "<=", ">=", // BO_LT, BO_GT, BO_LE, BO_GE, // [C99 6.5.8] Relational operators.
+ "==", "!=", // BO_EQ, BO_NE, // [C99 6.5.9] Equality operators.
+ "&", // BO_And, // [C99 6.5.10] Bitwise AND operator.
+ "??", // BO_Xor, // [C99 6.5.11] Bitwise XOR operator.
+ "|", // BO_Or, // [C99 6.5.12] Bitwise OR operator.
+ "&&", // BO_LAnd, // [C99 6.5.13] Logical AND operator.
+ "||", // BO_LOr, // [C99 6.5.14] Logical OR operator.
+ "=", "*=", // BO_Assign, BO_MulAssign, // [C99 6.5.16] Assignment operators.
+ "/=", "%=", // BO_DivAssign, BO_RemAssign,
+ "+=", "-=", // BO_AddAssign, BO_SubAssign,
+ "???", "???", // BO_ShlAssign, BO_ShrAssign,
+ "&&=", "???", // BO_AndAssign, BO_XorAssign,
+ "||=", // BO_OrAssign,
+ ","}; // BO_Comma // [C99 6.5.17] Comma operator.
static string unops[] = {
- "++", "--", // [C99 6.5.2.4] Postfix increment and decrement
- "++", "--", // [C99 6.5.3.1] Prefix increment and decrement
- "@", "*", // [C99 6.5.3.2] Address and indirection
- "+", "-", // [C99 6.5.3.3] Unary arithmetic
- "~", "!", // [C99 6.5.3.3] Unary arithmetic
- "__real", "__imag", // "__real expr"/"__imag expr" Extension.
- "__extension" // __extension__ marker.
+ "++", "--", // [C99 6.5.2.4] Postfix increment and decrement
+ "++", "--", // [C99 6.5.3.1] Prefix increment and decrement
+ "@", "*", // [C99 6.5.3.2] Address and indirection
+ "+", "-", // [C99 6.5.3.3] Unary arithmetic
+ "~", "!", // [C99 6.5.3.3] Unary arithmetic
+ "__real", "__imag", // "__real expr"/"__imag expr" Extension.
+ "__extension" // __extension__ marker.
};
// forward defs
-SourceManager * globalSRCMAN; // ugly. shame.
+SourceManager *globalSRCMAN; // ugly. shame.
+
+char *splitTypeInfo(char *underlyingtype);
+
+void printsourceline(const char *filename, int line);
+
+void printlines(SourceLocation &S, SourceLocation &E, SourceManager *SRCMAN);
+
+void PrintBinaryOperator(Stmt *s, SourceManager *SRCMAN, int level);
+
+void PrintDeclStmt(Stmt *s, SourceManager *SRCMAN, int level);
+
+void PrintALoop(Stmt *L, SourceManager *SRCMAN, int level);
-char *splitTypeInfo( char *underlyingtype );
-void printsourceline( const char *filename, int line );
-void printlines( SourceLocation &S, SourceLocation &E, SourceManager *SRCMAN );
+void PrintAUnaryOperator(Stmt *s, SourceManager *SRCMAN, int level);
-void PrintBinaryOperator( Stmt *s, SourceManager *SRCMAN, int level );
-void PrintDeclStmt( Stmt *s, SourceManager *SRCMAN, int level );
-void PrintALoop( Stmt *L, SourceManager *SRCMAN, int level );
-void PrintAUnaryOperator( Stmt *s, SourceManager *SRCMAN, int level );
-void PrintAnIfStmt( Stmt *s, SourceManager *SRCMAN, int level );
-void PrintCompoundStmt( Stmt *s, SourceManager *SRCMAN, int level );
-void PrintDeclRefExpr( Stmt *s, SourceManager *SRCMAN, int level );
-void PrintImplicitCastExpr( Stmt *s, SourceManager *SRCMAN, int level );
-void PrintReturnStmt( Stmt *s, SourceManager *SRCMAN, int level );
-void PrintStmt( Stmt *s, SourceManager *SRCMAN, int level );
+void PrintAnIfStmt(Stmt *s, SourceManager *SRCMAN, int level);
-void PrintAnIntegerLiteral( Stmt *I );
-void PrintAFloatingLiteral( Stmt *s );
+void PrintCompoundStmt(Stmt *s, SourceManager *SRCMAN, int level);
-void PrintFunctionDecl( FunctionDecl *D, SourceManager *SRCMAN, int level );
-void PrintTypeDefDecl( TypedefDecl *D, SourceManager *SRCMAN, int level );
-void PrintVarDecl( VarDecl *D, SourceManager *SRCMAN, int level );
+void PrintDeclRefExpr(Stmt *s, SourceManager *SRCMAN, int level);
+void PrintImplicitCastExpr(Stmt *s, SourceManager *SRCMAN, int level);
+void PrintReturnStmt(Stmt *s, SourceManager *SRCMAN, int level);
+void PrintStmt(Stmt *s, SourceManager *SRCMAN, int level);
+void PrintAnIntegerLiteral(Stmt *I);
-void printlines( SourceLocation &S, SourceLocation &E, SourceManager *SRCMAN ) {
- unsigned int startlineno = SRCMAN->getPresumedLineNumber( S );
- unsigned int endlineno = SRCMAN->getPresumedLineNumber( E );
- const char *filename = SRCMAN->getBufferName( S );
+void PrintAFloatingLiteral(Stmt *s);
+
+void PrintFunctionDecl(FunctionDecl *D, SourceManager *SRCMAN, int level);
+
+void PrintTypeDefDecl(TypedefDecl *D, SourceManager *SRCMAN, int level);
+
+void PrintVarDecl(VarDecl *D, SourceManager *SRCMAN, int level);
+
+
+void printlines(SourceLocation &S, SourceLocation &E, SourceManager *SRCMAN) {
+ unsigned int startlineno = SRCMAN->getPresumedLineNumber(S);
+ unsigned int endlineno = SRCMAN->getPresumedLineNumber(E);
+ const char *filename = SRCMAN->getBufferName(S);
fprintf(stderr, "\n");
- for (int l=startlineno; l<= endlineno; l++) printsourceline( filename, l);
+ for (int l = startlineno; l <= endlineno; l++) printsourceline(filename, l);
}
-void Indent( int level ) {
- for (int i=0; i<level; i++) fprintf(stderr, " ");
+void Indent(int level) {
+ for (int i = 0; i < level; i++) fprintf(stderr, " ");
}
// really slow and bad. but I'm debugging
-void printsourceline( const char *filename, int line )
-{
- FILE *fp = fopen (filename, "r");
+void printsourceline(const char *filename, int line) {
+ FILE *fp = fopen(filename, "r");
// Now read lines up to and including the line we want.
char buf[10240];
int l = 0;
while (l < line) {
- if (fgets (buf, sizeof(buf), fp))
+ if (fgets(buf, sizeof(buf), fp))
++l;
else
break;
@@ -175,8 +204,7 @@ void printsourceline( const char *filename, int line )
}
-
-void PrintBinaryOperator( Stmt *s, SourceManager *SRCMAN, int level ) { // SOMETIMES SHOULD HAVE ; + return
+void PrintBinaryOperator(Stmt *s, SourceManager *SRCMAN, int level) { // SOMETIMES SHOULD HAVE ; + return
//rintf(stderr, "\nBinaryOperator(%d) ", level);
BinaryOperator *b = cast<BinaryOperator>(s);
@@ -187,91 +215,83 @@ void PrintBinaryOperator( Stmt *s, SourceManager *SRCMAN, int level ) { // SOME
//fprintf(stderr, "binaryoperator lhs has type %s\n", lhs->getStmtClassName());
//fprintf(stderr, "binaryoperator rhs has type %s\n\n", rhs->getStmtClassName());
- PrintStmt( lhs, SRCMAN, level+1 );
- fprintf(stderr, " %s ", binops[op].c_str());
- PrintStmt( rhs, SRCMAN, level+1);
+ PrintStmt(lhs, SRCMAN, level + 1);
+ fprintf(stderr, " %s ", binops[op].c_str());
+ PrintStmt(rhs, SRCMAN, level + 1);
if (level == 1) fprintf(stderr, ";\n");
}
-
-void PrintDeclStmt( Stmt *s, SourceManager *SRCMAN, int level ) {
- fprintf(stderr, "\nDeclaration Statement(%d)", level);
+void PrintDeclStmt(Stmt *s, SourceManager *SRCMAN, int level) {
+ fprintf(stderr, "\nDeclaration Statement(%d)", level);
DeclStmt *D = cast<DeclStmt>(s);
- //QualType QT = D->getType();
- //string TypeStr = QT.getAsString();
- //fprintf(stderr, "type %s\n", TypeStr,c_str());
+ //QualType QT = D->getType();
+ //string TypeStr = QT.getAsString();
+ //fprintf(stderr, "type %s\n", TypeStr,c_str());
+
+ //SourceLocation S = D->getStartLoc();
+ //SourceLocation E = D->getEndLoc();
+ //printlines(S, E, SRCMAN);
+
+ if (D->isSingleDecl()) {
+ fprintf(stderr, "this is a single definition\n");
+ Decl *d = D->getSingleDecl();
+ } else {
+ fprintf(stderr, "this is NOT a single definition\n");
+ DeclGroupRef dg = D->getDeclGroup();
+ }
+
+ for (DeclStmt::decl_iterator DI = D->decl_begin(), DE = D->decl_end(); DI != DE; ++DI) {
+ //fprintf(stderr, "a def\n");
+ Decl *d = *DI;
+ //fprintf(stderr, "\nstatement of type %s\n", d->getStmtClassName());
+ //std::cout << (void *) d << "?";
+ if (ValueDecl *VD = dyn_cast<ValueDecl>(d)) {
+ if (VarDecl *V = dyn_cast<VarDecl>(VD)) {
+ if (V->getStorageClass() != SC_None) {
+ fprintf(stderr, "%s ", VarDecl::getStorageClassSpecifierString(V->getStorageClass()));
+ }
+ // else fprintf(stderr, "no storage class? ");
+
+ QualType T = V->getType();
+ string TypeStr = T.getAsString();
+ std::string Name = VD->getNameAsString();
+ //VD->getType().getAsStringInternal(Name,
+ // PrintingPolicy(VD->getASTContext().getLangOpts()));
+ fprintf(stderr, "%s %s ", TypeStr.c_str(), Name.c_str());
+ // If this is a vardecl with an initializer, emit it.
+ if (Expr *E = V->getInit()) {
+ fprintf(stderr, " = ");
+
+ Stmt *s = dyn_cast<Stmt>(E);
+ PrintStmt(s, SRCMAN, level + 1);
+ //fprintf(stderr, ";\n");
- //SourceLocation S = D->getStartLoc();
- //SourceLocation E = D->getEndLoc();
- //printlines(S, E, SRCMAN);
+ }
- if (D->isSingleDecl()) {
- fprintf(stderr, "this is a single definition\n");
- Decl *d = D->getSingleDecl();
- }
- else {
- fprintf(stderr, "this is NOT a single definition\n");
- DeclGroupRef dg = D->getDeclGroup();
}
- for (DeclStmt::decl_iterator DI = D->decl_begin(), DE = D->decl_end(); DI != DE; ++DI) {
- //fprintf(stderr, "a def\n");
- Decl *d = *DI;
- //fprintf(stderr, "\nstatement of type %s\n", d->getStmtClassName());
- //std::cout << (void *) d << "?";
- if (ValueDecl *VD = dyn_cast<ValueDecl>(d)) {
- if (VarDecl *V = dyn_cast<VarDecl>(VD)) {
- if (V->getStorageClass() != SC_None) {
- fprintf(stderr, "%s ", VarDecl::getStorageClassSpecifierString(V->getStorageClass()));
- }
- // else fprintf(stderr, "no storage class? ");
-
- QualType T = V->getType();
- string TypeStr = T.getAsString();
- std::string Name = VD->getNameAsString();
- //VD->getType().getAsStringInternal(Name,
- // PrintingPolicy(VD->getASTContext().getLangOpts()));
- fprintf(stderr,"%s %s ", TypeStr.c_str(), Name.c_str());
- // If this is a vardecl with an initializer, emit it.
- if (Expr *E = V->getInit()) {
- fprintf(stderr, " = ");
-
- Stmt *s = dyn_cast<Stmt>(E);
- PrintStmt(s, SRCMAN, level+1);
- //fprintf(stderr, ";\n");
-
- }
-
- }
-
- }
- if (level <= 1) fprintf(stderr, ";\n"); // TODO wrong
+ }
+ if (level <= 1) fprintf(stderr, ";\n"); // TODO wrong
- } // for each actual declaration
+ } // for each actual declaration
}
-
-
-
-
-void PrintAFloatingLiteral( Stmt *s ) {
+void PrintAFloatingLiteral(Stmt *s) {
FloatingLiteral *F = dyn_cast<FloatingLiteral>(s);
fprintf(stderr, "%f", F->getValueAsApproximateDouble()); // TODO approximate?
}
-
-
-void PrintALoop( Stmt *L, SourceManager *SRCMAN, int level ) {
+void PrintALoop(Stmt *L, SourceManager *SRCMAN, int level) {
//fprintf(stderr, "\nA LOOP L=0x%x SRCMAN 0x%x", L, &SRCMAN);
ForStmt *ForStatement = cast<ForStmt>(L);
SourceLocation srcloc = ForStatement->getForLoc();
- unsigned int lineno = SRCMAN->getPresumedLineNumber( srcloc );
- const char *filename = SRCMAN->getBufferName( srcloc );
+ unsigned int lineno = SRCMAN->getPresumedLineNumber(srcloc);
+ const char *filename = SRCMAN->getBufferName(srcloc);
//fprintf(stderr, " in file %s at line %d ", filename, lineno);
//printsourceline( filename, lineno);
@@ -287,34 +307,33 @@ void PrintALoop( Stmt *L, SourceManager *SRCMAN, int level ) {
fprintf(stderr, "; ");
PrintStmt(incr, SRCMAN, 0);
fprintf(stderr, " )\n");
- Indent(level);
+ Indent(level);
fprintf(stderr, "{\n");
- PrintStmt(body, SRCMAN, level+1);
+ PrintStmt(body, SRCMAN, level + 1);
fprintf(stderr, "}\n\n");
}
-void PrintAUnaryOperator( Stmt *s, SourceManager *SRCMAN, int level ) {
+void PrintAUnaryOperator(Stmt *s, SourceManager *SRCMAN, int level) {
//fprintf(stderr, "UnaryOperator ");
UnaryOperator *u = cast<UnaryOperator>(s);
const char *op = unops[u->getOpcode()].c_str();
if (u->isPrefix()) {
- fprintf(stderr, "%s", op );
+ fprintf(stderr, "%s", op);
}
- PrintStmt( u->getSubExpr(), SRCMAN, level+1 );
+ PrintStmt(u->getSubExpr(), SRCMAN, level + 1);
if (u->isPostfix()) {
- fprintf(stderr, "%s", op );
+ fprintf(stderr, "%s", op);
}
}
-
-void PrintAnIfStmt( Stmt *s, SourceManager *SRCMAN, int level ) {
+void PrintAnIfStmt(Stmt *s, SourceManager *SRCMAN, int level) {
//fprintf(stderr, "an IF statement\n");
// SourceLocation S = s->getLocStart();
// SourceLocation E = s->getLocEnd();
@@ -327,95 +346,89 @@ void PrintAnIfStmt( Stmt *s, SourceManager *SRCMAN, int level ) {
Stmt *Else = IfStatement->getElse();
fprintf(stderr, "if (");
- PrintStmt(Cond, SRCMAN, level+1);
+ PrintStmt(Cond, SRCMAN, level + 1);
fprintf(stderr, ") {\n");
- PrintStmt(Then, SRCMAN, level+1);
+ PrintStmt(Then, SRCMAN, level + 1);
fprintf(stderr, "\n}\nelse\n{\n");
- PrintStmt(Else, SRCMAN, level+1);
+ PrintStmt(Else, SRCMAN, level + 1);
fprintf(stderr, "\n}\n\n");
}
-
-void PrintAnIntegerLiteral( Stmt *s ) {
+void PrintAnIntegerLiteral(Stmt *s) {
IntegerLiteral *I = dyn_cast<IntegerLiteral>(s);
bool isSigned = I->getType()->isSignedIntegerType();
fprintf(stderr, "%s", I->getValue().toString(10, isSigned).c_str());
}
-
-void PrintArraySubscriptExpr( Stmt *s, SourceManager *SRCMAN, int level ) {
+void PrintArraySubscriptExpr(Stmt *s, SourceManager *SRCMAN, int level) {
ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(s);
Expr *Base = ASE->getBase();
Expr *Index = ASE->getIdx();
- PrintStmt(Base, SRCMAN, level+1);
+ PrintStmt(Base, SRCMAN, level + 1);
fprintf(stderr, "[");
- PrintStmt(Index, SRCMAN, level+1);
+ PrintStmt(Index, SRCMAN, level + 1);
fprintf(stderr, "]");
}
-void PrintCompoundStmt( Stmt *s, SourceManager *SRCMAN, int level ) {
+void PrintCompoundStmt(Stmt *s, SourceManager *SRCMAN, int level) {
//fprintf(stderr, "\nCompoundStmt(%d)", level);
CompoundStmt *cs = dyn_cast<CompoundStmt>(s);
- int numchildren=cs->size();
- //fprintf(stderr, "CompoundStmt has %d children\n", numchildren);
-
-
-#ifdef DEBUGGING
-BUH
- for (Stmt::child_range I = cs->children(); I; ++I) {
- const char *classname = I->getStmtClassName();
- if (!strcmp(classname, "BinaryOperator")) {
- BinaryOperator *b = cast<BinaryOperator>(*I);
- BinaryOperator::Opcode op = b->getOpcode();
- if (op == BO_Assign) {
- fprintf(stderr, "compound statement has child of type ASSIGNMENT STATEMENT ");
- SourceLocation S = I->getLocStart();
- SourceLocation E = I->getLocEnd();
- unsigned int startlineno = SRCMAN->getPresumedLineNumber( S );
- unsigned int endlineno = SRCMAN->getPresumedLineNumber( E );
- fprintf(stderr, "(%d-%d)\n", startlineno, endlineno );
+ int numchildren = cs->size();
+ //fprintf(stderr, "CompoundStmt has %d children\n", numchildren);
+
+
+#ifdef DEBUGGING
+ BUH
+ for (Stmt::child_range I = cs->children(); I; ++I) {
+ const char *classname = I->getStmtClassName();
+ if (!strcmp(classname, "BinaryOperator")) {
+ BinaryOperator *b = cast<BinaryOperator>(*I);
+ BinaryOperator::Opcode op = b->getOpcode();
+ if (op == BO_Assign) {
+ fprintf(stderr, "compound statement has child of type ASSIGNMENT STATEMENT ");
+ SourceLocation S = I->getLocStart();
+ SourceLocation E = I->getLocEnd();
+ unsigned int startlineno = SRCMAN->getPresumedLineNumber( S );
+ unsigned int endlineno = SRCMAN->getPresumedLineNumber( E );
+ fprintf(stderr, "(%d-%d)\n", startlineno, endlineno );
+ }
+ else
+ fprintf(stderr, "compound statement has child of type %s\n", I->getStmtClassName());
}
else
fprintf(stderr, "compound statement has child of type %s\n", I->getStmtClassName());
}
- else
- fprintf(stderr, "compound statement has child of type %s\n", I->getStmtClassName());
- }
#endif // debugging
+ for (auto I = cs->child_begin(); I != cs->child_end(); ++I) {
+ Stmt *child = *I;
+ PrintStmt(child, SRCMAN, level); // NOTE not level + 1
- for (auto I = cs->child_begin(); I!=cs->child_end(); ++I) {
- Stmt *child = *I;
- PrintStmt( child, SRCMAN, level ); // NOTE not level + 1
-
- fprintf(stderr, "\n"); // ***\n\n");
- }
-
-}
-
+ fprintf(stderr, "\n"); // ***\n\n");
+ }
+}
-void PrintDeclRefExpr( Stmt *s, SourceManager *SRCMAN, int level ) {
+void PrintDeclRefExpr(Stmt *s, SourceManager *SRCMAN, int level) {
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(s);
//if (NestedNameSpecifier *Qualifier = DRE->getQualifier())
// Qualifier->print( raw_ostream nonstandard of course );
DeclarationNameInfo DNI = DRE->getNameInfo();
DeclarationName DN = DNI.getName();
- fprintf(stderr, "%s", DN.getAsString().c_str());
+ fprintf(stderr, "%s", DN.getAsString().c_str());
}
-
-void PrintFunctionDecl( FunctionDecl *D, SourceManager *SRCMAN, int level ) {
+void PrintFunctionDecl(FunctionDecl *D, SourceManager *SRCMAN, int level) {
//rintf(stderr, "\nFunctionDecl(%d) %s\n", level, D->getNameInfo().getAsString().c_str());
// Type name as string
QualType QT = D->getReturnType();
@@ -427,11 +440,11 @@ void PrintFunctionDecl( FunctionDecl *D, SourceManager *SRCMAN, int level ) {
//fprintf(stderr, "function %s has type %s ", FuncName.c_str(), TypeStr.c_str());
- fprintf(stderr, "\n%s %s(",TypeStr.c_str(), FuncName.c_str());
+ fprintf(stderr, "\n%s %s(", TypeStr.c_str(), FuncName.c_str());
int numparams = D->getNumParams();
//fprintf(stderr, "and %d parameters\n", numparams);
- for (int i=0; i<numparams; i++) {
+ for (int i = 0; i < numparams; i++) {
if (i) fprintf(stderr, ", ");
ParmVarDecl *clangVardecl = D->getParamDecl(i);
@@ -439,16 +452,16 @@ void PrintFunctionDecl( FunctionDecl *D, SourceManager *SRCMAN, int level ) {
StorageClass SCAsWritten = clangVardecl->getStorageClass();
if (SCAsWritten != SC_None) {
fprintf(stderr, "%s ", VarDecl::getStorageClassSpecifierString(SCAsWritten));
- }
+ }
//else fprintf(stderr, "(no storage class?) ");
QualType T = clangVardecl->getType();
if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(clangVardecl))
T = Parm->getOriginalType();
- string Name = clangVardecl->getName();
+ string Name = clangVardecl->getName();
char *td = strdup(T.getAsString().c_str());
- fprintf(stderr, "td = '%s'\n", td);
+ fprintf(stderr, "td = '%s'\n", td);
char *arraypart = splitTypeInfo(td);
fprintf(stderr, "%s %s%s ", td, Name.c_str(), arraypart);
@@ -457,31 +470,30 @@ void PrintFunctionDecl( FunctionDecl *D, SourceManager *SRCMAN, int level ) {
fprintf(stderr, ")\n{\n"); // beginning of function body
Stmt *body = D->getBody();
- PrintStmt( body, SRCMAN, level+1);
+ PrintStmt(body, SRCMAN, level + 1);
fprintf(stderr, "}\n\n"); // end of function body
}
-void PrintImplicitCastExpr( Stmt *s, SourceManager *SRCMAN, int level ) {
+void PrintImplicitCastExpr(Stmt *s, SourceManager *SRCMAN, int level) {
ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(s);
- PrintStmt( ICE->getSubExpr(), SRCMAN, level+1);
+ PrintStmt(ICE->getSubExpr(), SRCMAN, level + 1);
}
-
-void PrintReturnStmt( Stmt *s, SourceManager *SRCMAN, int level ) {
+void PrintReturnStmt(Stmt *s, SourceManager *SRCMAN, int level) {
ReturnStmt *r = dyn_cast<ReturnStmt>(s);
fprintf(stderr, "return");
if (r->getRetValue()) {
fprintf(stderr, " ");
- PrintStmt( r->getRetValue(), SRCMAN, level+1);
+ PrintStmt(r->getRetValue(), SRCMAN, level + 1);
}
fprintf(stderr, ";\n");
}
-void PrintStmt( Stmt *s, SourceManager *SRCMAN, int level ) {
+void PrintStmt(Stmt *s, SourceManager *SRCMAN, int level) {
//fprintf(stderr, "\nprint statement 0x%x of type %s\n", s, s->getStmtClassName());
@@ -491,21 +503,33 @@ void PrintStmt( Stmt *s, SourceManager *SRCMAN, int level ) {
//const char *filename = SRCMAN->getBufferName( srcloc );
//StmtClass getStmtClass()
- if (isa<DeclStmt>(s)) { PrintDeclStmt(s, SRCMAN, level);
- } else if (isa<FloatingLiteral>(s)) { PrintAFloatingLiteral(s );
- } else if (isa<IntegerLiteral>(s)) { PrintAnIntegerLiteral(s );
- } else if (isa<UnaryOperator>(s)) { PrintAUnaryOperator(s, SRCMAN, level);
- } else if (isa<BinaryOperator>(s)) { PrintBinaryOperator(s, SRCMAN, level);
- } else if (isa<ForStmt>(s)) { PrintALoop(s, SRCMAN, level);
- } else if (isa<IfStmt>(s)) { PrintAnIfStmt(s, SRCMAN, level);
- } else if (isa<CompoundStmt>(s)) { PrintCompoundStmt(s, SRCMAN, level);
- } else if (isa<ImplicitCastExpr>(s)) { PrintImplicitCastExpr(s, SRCMAN, level);
- } else if (isa<DeclRefExpr>(s)) { PrintDeclRefExpr(s, SRCMAN, level);
- } else if (isa<ArraySubscriptExpr>(s)) {PrintArraySubscriptExpr(s, SRCMAN, level);
- } else if (isa<ReturnStmt>(s)) { PrintReturnStmt(s, SRCMAN, level);
- } else {
+ if (isa<DeclStmt>(s)) {
+ PrintDeclStmt(s, SRCMAN, level);
+ } else if (isa<FloatingLiteral>(s)) {
+ PrintAFloatingLiteral(s);
+ } else if (isa<IntegerLiteral>(s)) {
+ PrintAnIntegerLiteral(s);
+ } else if (isa<UnaryOperator>(s)) {
+ PrintAUnaryOperator(s, SRCMAN, level);
+ } else if (isa<BinaryOperator>(s)) {
+ PrintBinaryOperator(s, SRCMAN, level);
+ } else if (isa<ForStmt>(s)) {
+ PrintALoop(s, SRCMAN, level);
+ } else if (isa<IfStmt>(s)) {
+ PrintAnIfStmt(s, SRCMAN, level);
+ } else if (isa<CompoundStmt>(s)) {
+ PrintCompoundStmt(s, SRCMAN, level);
+ } else if (isa<ImplicitCastExpr>(s)) {
+ PrintImplicitCastExpr(s, SRCMAN, level);
+ } else if (isa<DeclRefExpr>(s)) {
+ PrintDeclRefExpr(s, SRCMAN, level);
+ } else if (isa<ArraySubscriptExpr>(s)) {
+ PrintArraySubscriptExpr(s, SRCMAN, level);
+ } else if (isa<ReturnStmt>(s)) {
+ PrintReturnStmt(s, SRCMAN, level);
+ } else {
fprintf(stderr, "\nPrintStmt() UNHANDLED statement of type %s\n", s->getStmtClassName());
- exit(-1);
+ exit(-1);
}
//int numchildren=0;
//for (Stmt::child_range I = s->children(); I; ++I, numchildren++) ;
@@ -516,36 +540,34 @@ void PrintStmt( Stmt *s, SourceManager *SRCMAN, int level ) {
}
-void PrintTranslationUnit( TranslationUnitDecl *TUD, ASTContext &CTX ) {
+void PrintTranslationUnit(TranslationUnitDecl *TUD, ASTContext &CTX) {
// TUD derived from Decl and DeclContext
- static DeclContext *DC = TUD->castToDeclContext( TUD );
+ static DeclContext *DC = TUD->castToDeclContext(TUD);
//SourceManager SM = CTX.getSourceManager();
for (DeclContext::decl_iterator DI = DC->decls_begin(), DE = DC->decls_end(); DI != DE; ++DI) {
Decl *D = *DI;
- if (isa<FunctionDecl>(D)) { //fprintf(stderr, "FunctionDecl\n");
- PrintFunctionDecl( dyn_cast<FunctionDecl>(D), &CTX.getSourceManager(), 0);
- }
- else if (isa<VarDecl>(D)) { //fprintf(stderr, "VarDecl\n");
- PrintVarDecl( dyn_cast<VarDecl>(D), &CTX.getSourceManager(), 0 );
- }
- else if (isa<TypedefDecl>(D)) { //fprintf(stderr, "TypedefDecl\n");
- PrintTypeDefDecl( dyn_cast<TypedefDecl>(D), &CTX.getSourceManager(), 0 );
- }
- else if (isa<TypeAliasDecl>(D)) { fprintf(stderr, "TypeAliasDecl\n");
- }
- else {
- fprintf(stderr, "\na declaration of type %s (%d) which I have no idea how to handle\n", D->getDeclKindName(), D->getKind());
+ if (isa<FunctionDecl>(D)) { //fprintf(stderr, "FunctionDecl\n");
+ PrintFunctionDecl(dyn_cast<FunctionDecl>(D), &CTX.getSourceManager(), 0);
+ } else if (isa<VarDecl>(D)) { //fprintf(stderr, "VarDecl\n");
+ PrintVarDecl(dyn_cast<VarDecl>(D), &CTX.getSourceManager(), 0);
+ } else if (isa<TypedefDecl>(D)) { //fprintf(stderr, "TypedefDecl\n");
+ PrintTypeDefDecl(dyn_cast<TypedefDecl>(D), &CTX.getSourceManager(), 0);
+ } else if (isa<TypeAliasDecl>(D)) {
+ fprintf(stderr, "TypeAliasDecl\n");
+ } else {
+ fprintf(stderr, "\na declaration of type %s (%d) which I have no idea how to handle\n", D->getDeclKindName(),
+ D->getKind());
exit(-1);
}
-
+
//else if (isa<TypedefNameDecl>(D)) { fprintf(stderr, "TypedefNameDecl\n");}
}
}
-void PrintTypeDefDecl( TypedefDecl *D, SourceManager *SRCMAN, int level ) {
+void PrintTypeDefDecl(TypedefDecl *D, SourceManager *SRCMAN, int level) {
/* internal typedefs do not have a source file and this will die!
SourceLocation S = D->getLocStart(); // NOT getStartLoc(), that's class DeclStmt
@@ -558,7 +580,7 @@ void PrintTypeDefDecl( TypedefDecl *D, SourceManager *SRCMAN, int level ) {
*/
// arrays suck
- char *td = strdup( D->getUnderlyingType().getAsString().c_str());
+ char *td = strdup(D->getUnderlyingType().getAsString().c_str());
//fprintf(stderr, "td = '%s'\n", td);
char *arraypart = splitTypeInfo(td);
fprintf(stderr, "typedef %s %s%s;\n", td, D->getName().str().c_str(), arraypart);
@@ -568,18 +590,17 @@ void PrintTypeDefDecl( TypedefDecl *D, SourceManager *SRCMAN, int level ) {
}
-
-void PrintVarDecl( VarDecl *D, SourceManager *SRCMAN, int level ) {
+void PrintVarDecl(VarDecl *D, SourceManager *SRCMAN, int level) {
// arrays suck
- char *td = strdup( D->getType().getAsString().c_str()); // leak
+ char *td = strdup(D->getType().getAsString().c_str()); // leak
//fprintf(stderr, "td = '%s'\n", td);
char *arraypart = splitTypeInfo(td);
- fprintf(stderr, "%s %s%s", td, D->getName().str().c_str(), arraypart);
+ fprintf(stderr, "%s %s%s", td, D->getName().str().c_str(), arraypart);
Expr *Init = D->getInit();
if (Init) {
//fprintf(stderr," = (TODO)");
- PrintStmt( Init, SRCMAN, level+1);
+ PrintStmt(Init, SRCMAN, level + 1);
}
fprintf(stderr, ";\n");
@@ -594,33 +615,33 @@ void PrintVarDecl( VarDecl *D, SourceManager *SRCMAN, int level ) {
-chillAST_node * ConvertVarDecl( VarDecl *D, chillAST_node *p ) {
+chillAST_node *ConvertVarDecl(VarDecl *D, chillAST_node *p) {
//fprintf(stderr, "\nConvertVarDecl()\n");
//fprintf(stderr, "Decl has type %s\n", D->getDeclKindName());
//PrintVarDecl( D, globalSRCMAN, 0 );
- bool isParm = false;
+ bool isParm = false;
- QualType T0 = D->getType();
- QualType T = T0;
- if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) { // My GOD clang stinks
- T = Parm->getOriginalType();
- isParm = true;
- }
+ QualType T0 = D->getType();
+ QualType T = T0;
+ if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) { // My GOD clang stinks
+ T = Parm->getOriginalType();
+ isParm = true;
+ }
// arrays suck
- char *vartype = strdup( T.getAsString().c_str());
+ char *vartype = strdup(T.getAsString().c_str());
//fprintf(stderr, "vartype = '%s' T0 '%s\n", vartype, T0.getAsString().c_str() );
char *arraypart = splitTypeInfo(vartype);
//fprintf(stderr, "arraypart = '%s'\n", arraypart);
- char *varname = strdup(D->getName().str().c_str());
+ char *varname = strdup(D->getName().str().c_str());
//fprintf(stderr, "VarDecl (clang 0x%x) for %s %s%s\n", D, vartype, varname, arraypart);
-
- chillAST_VarDecl * chillVD = new chillAST_VarDecl( vartype, varname, arraypart, (void *)D, p /* , initializer */ );
- chillVD->isAParameter = isParm;
+ chillAST_VarDecl *chillVD = new chillAST_VarDecl(vartype, varname, arraypart, (void *) D, p /* , initializer */ );
+
+ chillVD->isAParameter = isParm;
//fprintf(stderr, "\nthis is the vardecl\n");
//chillVD->print(); printf("\n\n"); fflush(stdout);
@@ -643,68 +664,69 @@ chillAST_node * ConvertVarDecl( VarDecl *D, chillAST_node *p ) {
int numdim = 0;
- chillVD-> knownArraySizes = true;
+ chillVD->knownArraySizes = true;
if (index(vartype, '*')) chillVD->knownArraySizes = false; // float *a; for example
- if (index(arraypart, '*')) chillVD->knownArraySizes = false;
-
+ if (index(arraypart, '*')) chillVD->knownArraySizes = false;
+
// note: vartype here, arraypart in next code.. is that right?
- if (index(vartype, '*')) {
- for (int i = 0; i<strlen(vartype); i++) if (vartype[i] == '*') numdim++;
+ if (index(vartype, '*')) {
+ for (int i = 0; i < strlen(vartype); i++) if (vartype[i] == '*') numdim++;
//fprintf(stderr, "numd %d\n", numd);
- chillVD->numdimensions = numdim;
+ chillVD->numdimensions = numdim;
}
if (index(arraypart, '[')) { // JUST [12][34][56] no asterisks
char *dupe = strdup(arraypart);
int len = strlen(arraypart);
- for (int i=0; i<len; i++) if (dupe[i] == '[') numdim++;
+ for (int i = 0; i < len; i++) if (dupe[i] == '[') numdim++;
//fprintf(stderr, "numdim %d\n", numdim);
- chillVD->numdimensions = numdim;
- int *as = (int *)malloc(sizeof(int *) * numdim );
- if (!as) {
+ chillVD->numdimensions = numdim;
+ int *as = (int *) malloc(sizeof(int *) * numdim);
+ if (!as) {
fprintf(stderr, "can't malloc array sizes in ConvertVarDecl()\n");
exit(-1);
}
chillVD->arraysizes = as; // 'as' changed later!
-
+
char *ptr = dupe;
//fprintf(stderr, "dupe '%s'\n", ptr);
- while (ptr = index(ptr, '[')) {
+ while (ptr = index(ptr, '[')) {
ptr++;
//fprintf(stderr, "tmp '%s'\n", ptr);
int dim;
sscanf(ptr, "%d", &dim);
//fprintf(stderr, "dim %d\n", dim);
- *as++ = dim;
-
- ptr = index(ptr, ']');
+ *as++ = dim;
+
+ ptr = index(ptr, ']');
//fprintf(stderr, "bottom of loop, ptr = '%s'\n", ptr);
}
free(dupe);
//for (int i=0; i<numdim; i++) {
// fprintf(stderr, "dimension %d = %d\n", i, chillVD->arraysizes[i]);
//}
-
+
//fprintf(stderr, "need to handle [] array to determine num dimensions\n");
//exit(-1);
}
-
+
Expr *Init = D->getInit();
if (Init) {
- fprintf(stderr," = VARDECL HAS INIT. (TODO) (RIGHT NOW)"); exit(-1);
+ fprintf(stderr, " = VARDECL HAS INIT. (TODO) (RIGHT NOW)");
+ exit(-1);
}
//fprintf(stderr, ";\n");
-
+
//fprintf(stderr, "calling chillVD->print()\n");
//chillVD->print(); // debugging only
- free (vartype);
- free (varname);
+ free(vartype);
+ free(varname);
// store this away for declrefexpr that references it!
VariableDeclarations.push_back(chillVD);
@@ -712,65 +734,61 @@ chillAST_node * ConvertVarDecl( VarDecl *D, chillAST_node *p ) {
}
-
-chillAST_node * ConvertRecordDecl( clang::RecordDecl *RD, chillAST_node *p ) { // for structs and unions
+chillAST_node *ConvertRecordDecl(clang::RecordDecl *RD, chillAST_node *p) { // for structs and unions
//fprintf(stderr, "ConvertRecordDecl( )\n\nclang sees\n");
//RD->dump();
//fflush(stdout);
//fprintf(stderr, "\n");
-
+
//fprintf(stderr, "%s with name %s\n", ((clang::Decl *)RD)->getDeclKindName(), RD->getNameAsString().c_str());
//const clang::ASTRecordLayout RL = RD->getASTContext().getASTRecordLayout( RD );
//RD->getASTContext().DumpRecordLayout( RD , cout );
int count = 0;
- for (clang::RecordDecl::field_iterator fi = RD->field_begin(); fi != RD->field_end(); fi++) count++;
+ for (clang::RecordDecl::field_iterator fi = RD->field_begin(); fi != RD->field_end(); fi++) count++;
//fprintf(stderr, "%d fields in this struct/union\n", count);
char blurb[128];
- sprintf(blurb, "struct %s", RD->getNameAsString().c_str());
- fprintf(stderr, "blurb is '%s'\n", blurb);
+ sprintf(blurb, "struct %s", RD->getNameAsString().c_str());
+ fprintf(stderr, "blurb is '%s'\n", blurb);
- chillAST_TypedefDecl *astruct = new chillAST_TypedefDecl( blurb, "", p);
- astruct->setStruct( true );
- astruct->setStructName( RD->getNameAsString().c_str() );
+ chillAST_TypedefDecl *astruct = new chillAST_TypedefDecl(blurb, "", p);
+ astruct->setStruct(true);
+ astruct->setStructName(RD->getNameAsString().c_str());
- for (clang::RecordDecl::field_iterator fi = RD->field_begin(); fi != RD->field_end(); fi++) {
+ for (clang::RecordDecl::field_iterator fi = RD->field_begin(); fi != RD->field_end(); fi++) {
clang::FieldDecl *FD = (*fi);
- FD->dump(); printf(";\n"); fflush(stdout);
- string TypeStr = FD->getType().getAsString();
+ FD->dump();
+ printf(";\n");
+ fflush(stdout);
+ string TypeStr = FD->getType().getAsString();
- const char *typ = TypeStr.c_str();
+ const char *typ = TypeStr.c_str();
const char *name = FD->getNameAsString().c_str();
fprintf(stderr, "(typ) %s (name) %s\n", typ, name);
chillAST_VarDecl *VD = NULL;
// very clunky and incomplete
- VD = new chillAST_VarDecl( typ, name, "", astruct ); // can't handle arrays yet
-
- astruct->subparts.push_back(VD);
+ VD = new chillAST_VarDecl(typ, name, "", astruct); // can't handle arrays yet
+
+ astruct->subparts.push_back(VD);
}
- fprintf(stderr, "I just defined a struct\n");
- astruct->print(0, stderr);
+ fprintf(stderr, "I just defined a struct\n");
+ astruct->print(0, stderr);
- return astruct;
+ return astruct;
}
-
-
-
-
-
-chillAST_node * ConvertTypeDefDecl( TypedefDecl *TDD, chillAST_node *p ) {
+chillAST_node *ConvertTypeDefDecl(TypedefDecl *TDD, chillAST_node *p) {
//fprintf(stderr, "ConvertTypedefDecl( ) \n");
//fprintf(stderr, "TDD has type %s\n", TDD->getDeclKindName());
//TDD->dump(); fprintf(stderr, "\n");
- char *under = strdup( TDD->getUnderlyingType().getAsString().c_str());
+ char *under = strdup(TDD->getUnderlyingType().getAsString().c_str());
//fprintf(stderr, "under = '%s'\n", under);
char *arraypart = splitTypeInfo(under);
//fprintf(stderr, "typedef %s %s%s;\n", under, TDD->getName().str().c_str(), arraypart);
@@ -778,99 +796,95 @@ chillAST_node * ConvertTypeDefDecl( TypedefDecl *TDD, chillAST_node *p ) {
char *alias = strdup(TDD->getName().str().c_str());
//fprintf(stderr, "underlying type %s arraypart '%s' name %s\n", under, arraypart, TDD->getName().str().c_str() );
- chillAST_TypedefDecl *CTDD = new chillAST_TypedefDecl( under, alias, arraypart, p );
+ chillAST_TypedefDecl *CTDD = new chillAST_TypedefDecl(under, alias, arraypart, p);
- free(under);
- free(arraypart);
+ free(under);
+ free(arraypart);
- return CTDD;
+ return CTDD;
}
-
-chillAST_node * ConvertDeclStmt( DeclStmt *clangDS, chillAST_node *p ) {
+chillAST_node *ConvertDeclStmt(DeclStmt *clangDS, chillAST_node *p) {
//fprintf(stderr, "ConvertDeclStmt()\n");
chillAST_VarDecl *chillvardecl; // the thing we'll return if this is a single declaration
-
+
bool multiples = !clangDS->isSingleDecl();
- if ( multiples) {
+ if (multiples) {
//fprintf(stderr, "ir_clang.cc multiple declarations in a single CLANG DeclStmt not really handled! (??)\n");
// for now, try to make the multiple decls into a compoundstmt with them inside.
// if we don't get scoping problems, this might work
}
-
+
DeclGroupRef dgr = clangDS->getDeclGroup();
clang::DeclGroupRef::iterator DI = dgr.begin();
clang::DeclGroupRef::iterator DE = dgr.end();
-
- for ( ; DI != DE; ++DI) {
+
+ for (; DI != DE; ++DI) {
Decl *D = *DI;
- const char *declty = D->getDeclKindName();
+ const char *declty = D->getDeclKindName();
//fprintf(stderr, "a decl of type %s\n", D->getDeclKindName());
-
+
if (!strcmp("Var", declty)) {
VarDecl *V = dyn_cast<VarDecl>(D);
// ValueDecl *VD = dyn_cast<ValueDecl>(D); // not needed?
std::string Name = V->getNameAsString();
- char *varname = strdup( Name.c_str());
-
+ char *varname = strdup(Name.c_str());
+
//fprintf(stderr, "variable named %s\n", Name.c_str());
QualType T = V->getType();
string TypeStr = T.getAsString();
- char *vartype = strdup( TypeStr.c_str());
-
+ char *vartype = strdup(TypeStr.c_str());
+
//fprintf(stderr, "%s %s\n", td, varname);
- char *arraypart = splitTypeInfo( vartype );
-
- chillvardecl = new chillAST_VarDecl(vartype, varname, arraypart, (void *)D, p );
+ char *arraypart = splitTypeInfo(vartype);
+
+ chillvardecl = new chillAST_VarDecl(vartype, varname, arraypart, (void *) D, p);
//fprintf(stderr, "DeclStmt (clang 0x%x) for %s %s%s\n", D, vartype, varname, arraypart);
// store this away for declrefexpr that references it!
VariableDeclarations.push_back(chillvardecl);
-
- if (multiples) p->addChild( chillvardecl );
+
+ if (multiples) p->addChild(chillvardecl);
// TODO
- if (V->hasInit()) {
+ if (V->hasInit()) {
CHILL_ERROR(" ConvertDeclStmt() UNHANDLED initialization\n");
- exit(-1);
+ exit(-1);
}
}
} // for each of possibly multiple decls
-
+
if (multiples) return NULL; // multiple decls added themselves already
return chillvardecl; // OR a single decl
}
-
-chillAST_node * ConvertCompoundStmt( CompoundStmt *clangCS, chillAST_node *p ) {
+chillAST_node *ConvertCompoundStmt(CompoundStmt *clangCS, chillAST_node *p) {
//fprintf(stderr, "ConvertCompoundStmt( )\n");
- int numchildren= clangCS->size();
+ int numchildren = clangCS->size();
//fprintf(stderr, "clang CompoundStmt has %d children\n", numchildren);
// make an empty CHILL compound statement
- chillAST_CompoundStmt *chillCS = new chillAST_CompoundStmt;
- chillCS->setParent( p );
+ chillAST_CompoundStmt *chillCS = new chillAST_CompoundStmt;
+ chillCS->setParent(p);
// for each clang child
- for (auto I = clangCS->child_begin(); I!=clangCS->child_end(); ++I) { // ?? loop looks WRONG
+ for (auto I = clangCS->child_begin(); I != clangCS->child_end(); ++I) { // ?? loop looks WRONG
// create the chill ast for each child
Stmt *child = *I;
- chillAST_node *n = ConvertGenericClangAST( child, chillCS );
+ chillAST_node *n = ConvertGenericClangAST(child, chillCS);
// usually n will be a statement. We just add it as a child.
// SOME DeclStmts have multiple declarations. They will add themselves and return NULL
- if (n) chillCS->addChild( n );
+ if (n) chillCS->addChild(n);
}
-
+
return chillCS;
}
-
-
-chillAST_node * ConvertFunctionDecl( FunctionDecl *D, chillAST_node *p ) {
+chillAST_node *ConvertFunctionDecl(FunctionDecl *D, chillAST_node *p) {
//fprintf(stderr, "\nConvertFunctionDecl( )\n");
QualType QT = D->getReturnType();
string ReturnTypeStr = QT.getAsString();
@@ -881,108 +895,110 @@ chillAST_node * ConvertFunctionDecl( FunctionDecl *D, chillAST_node *p ) {
//fprintf(stderr, "function %s has type %s ", FuncName.c_str(), ReturnTypeStr.c_str());
//fprintf(stderr, "\n%s %s()\n", ReturnTypeStr.c_str(), FuncName.c_str());
- chillAST_FunctionDecl *chillFD = new chillAST_FunctionDecl( ReturnTypeStr.c_str(), FuncName.c_str(), p, D);
-
+ chillAST_FunctionDecl *chillFD = new chillAST_FunctionDecl(ReturnTypeStr.c_str(), FuncName.c_str(), p, D);
+
int numparams = D->getNumParams();
- CHILL_DEBUG_PRINT( " %d parameters\n", numparams);
- for (int i=0; i<numparams; i++) {
+ CHILL_DEBUG_PRINT(" %d parameters\n", numparams);
+ for (int i = 0; i < numparams; i++) {
VarDecl *clangvardecl = D->getParamDecl(i); // the ith parameter (CLANG)
- ParmVarDecl *pvd = D->getParamDecl(i);
+ ParmVarDecl *pvd = D->getParamDecl(i);
QualType T = pvd->getOriginalType();
CHILL_DEBUG_PRINT("OTYPE %s\n", T.getAsString().c_str());
- chillAST_VarDecl *chillPVD = (chillAST_VarDecl *)ConvertVarDecl( clangvardecl, chillFD ) ;
+ chillAST_VarDecl *chillPVD = (chillAST_VarDecl *) ConvertVarDecl(clangvardecl, chillFD);
//chillPVD->print(); fflush(stdout);
//chillPVD->isAParameter = 1;
- VariableDeclarations.push_back(chillPVD);
-
- chillFD->addParameter(chillPVD);
- CHILL_DEBUG_PRINT("chillAST ParmVarDecl for %s from chill location 0x%x\n",chillPVD->varname, clangvardecl);
+ VariableDeclarations.push_back(chillPVD);
+
+ chillFD->addParameter(chillPVD);
+ CHILL_DEBUG_PRINT("chillAST ParmVarDecl for %s from chill location 0x%x\n", chillPVD->varname, clangvardecl);
} // for each parameter
//fprintf(stderr, ")\n{\n"); // beginning of function body
//if (D->isExternC()) { chillFD->setExtern(); fprintf(stderr, "%s is extern\n", FuncName.c_str()); };
- if (D->getBuiltinID()) { chillFD->setExtern(); CHILL_DEBUG_PRINT("%s is builtin (extern)\n", FuncName.c_str()); };
+ if (D->getBuiltinID()) {
+ chillFD->setExtern();
+ CHILL_DEBUG_PRINT("%s is builtin (extern)\n", FuncName.c_str());
+ };
Stmt *clangbody = D->getBody();
if (clangbody) { // may just be fwd decl or external, without an actual body
//fprintf(stderr, "body of type %s\n", clangbody->getStmtClassName());
//chillAST_node *CB = ConvertCompoundStmt( dyn_cast<CompoundStmt>(clangbody) ); // always a compound statement?
- chillAST_node *CB = ConvertGenericClangAST( clangbody, chillFD );
+ chillAST_node *CB = ConvertGenericClangAST(clangbody, chillFD);
//fprintf(stderr, "FunctionDecl body = 0x%x of type %s\n", CB, CB->getTypeString());
- chillFD->setBody ( CB );
+ chillFD->setBody(CB);
}
//fprintf(stderr, "adding function %s 0x%x to FunctionDeclarations\n", chillFD->functionName, chillFD);
- FunctionDeclarations.push_back(chillFD);
- return chillFD;
+ FunctionDeclarations.push_back(chillFD);
+ return chillFD;
}
-chillAST_node * ConvertForStmt( ForStmt *clangFS, chillAST_node *p ) {
+chillAST_node *ConvertForStmt(ForStmt *clangFS, chillAST_node *p) {
Stmt *init = clangFS->getInit();
Expr *cond = clangFS->getCond();
Expr *incr = clangFS->getInc();
Stmt *body = clangFS->getBody();
- chillAST_node *ini = ConvertGenericClangAST( init, NULL );
- chillAST_node *con = ConvertGenericClangAST( cond, NULL);
- chillAST_node *inc = ConvertGenericClangAST( incr, NULL);
- chillAST_node *bod = ConvertGenericClangAST( body, NULL);
- if (bod->asttype != CHILLAST_NODETYPE_COMPOUNDSTMT) {
+ chillAST_node *ini = ConvertGenericClangAST(init, NULL);
+ chillAST_node *con = ConvertGenericClangAST(cond, NULL);
+ chillAST_node *inc = ConvertGenericClangAST(incr, NULL);
+ chillAST_node *bod = ConvertGenericClangAST(body, NULL);
+ if (bod->asttype != CHILLAST_NODETYPE_COMPOUNDSTMT) {
//fprintf(stderr, "ForStmt body of type %s\n", bod->getTypeString());
// make single statement loop bodies loop like other loops
- chillAST_CompoundStmt *cs = new chillAST_CompoundStmt( );
- cs->addChild( bod );
+ chillAST_CompoundStmt *cs = new chillAST_CompoundStmt();
+ cs->addChild(bod);
bod = cs;
}
- chillAST_ForStmt *chill_loop = new chillAST_ForStmt( ini, con, inc, bod, p );
- ini->setParent( chill_loop );
- con->setParent( chill_loop );
- inc->setParent( chill_loop );
- bod->setParent( chill_loop );
+ chillAST_ForStmt *chill_loop = new chillAST_ForStmt(ini, con, inc, bod, p);
+ ini->setParent(chill_loop);
+ con->setParent(chill_loop);
+ inc->setParent(chill_loop);
+ bod->setParent(chill_loop);
- return chill_loop;
+ return chill_loop;
}
-chillAST_node * ConvertIfStmt( IfStmt *clangIS, chillAST_node *p ) {
+chillAST_node *ConvertIfStmt(IfStmt *clangIS, chillAST_node *p) {
Expr *cond = clangIS->getCond();
Stmt *thenpart = clangIS->getThen();
Stmt *elsepart = clangIS->getElse();
-
- chillAST_node *con = ConvertGenericClangAST( cond, NULL);
+
+ chillAST_node *con = ConvertGenericClangAST(cond, NULL);
chillAST_node *thn = NULL;
- if (thenpart) thn = ConvertGenericClangAST( thenpart, NULL);
+ if (thenpart) thn = ConvertGenericClangAST(thenpart, NULL);
chillAST_node *els = NULL;
- if (elsepart) els = ConvertGenericClangAST( elsepart, NULL);
-
- chillAST_IfStmt *ifstmt = new chillAST_IfStmt( con, thn, els, NULL);
- return ifstmt;
-}
+ if (elsepart) els = ConvertGenericClangAST(elsepart, NULL);
+ chillAST_IfStmt *ifstmt = new chillAST_IfStmt(con, thn, els, NULL);
+ return ifstmt;
+}
-chillAST_node * ConvertUnaryOperator( UnaryOperator * clangUO, chillAST_node *p ) {
+chillAST_node *ConvertUnaryOperator(UnaryOperator *clangUO, chillAST_node *p) {
const char *op = unops[clangUO->getOpcode()].c_str();
bool pre = clangUO->isPrefix();
- chillAST_node *sub = ConvertGenericClangAST( clangUO->getSubExpr(), NULL );
+ chillAST_node *sub = ConvertGenericClangAST(clangUO->getSubExpr(), NULL);
- chillAST_UnaryOperator *chillUO = new chillAST_UnaryOperator( op, pre, sub, p );
- sub->setParent( chillUO );
- return chillUO;
+ chillAST_UnaryOperator *chillUO = new chillAST_UnaryOperator(op, pre, sub, p);
+ sub->setParent(chillUO);
+ return chillUO;
}
-chillAST_node * ConvertBinaryOperator( BinaryOperator * clangBO, chillAST_node *p ) {
+chillAST_node *ConvertBinaryOperator(BinaryOperator *clangBO, chillAST_node *p) {
// get the clang parts
Expr *lhs = clangBO->getLHS();
@@ -991,40 +1007,37 @@ chillAST_node * ConvertBinaryOperator( BinaryOperator * clangBO, chillAST_node *
// convert to chill equivalents
- chillAST_node *l = ConvertGenericClangAST( lhs, NULL );
+ chillAST_node *l = ConvertGenericClangAST(lhs, NULL);
const char *opstring = binops[op].c_str();
- chillAST_node *r = ConvertGenericClangAST( rhs, NULL );
+ chillAST_node *r = ConvertGenericClangAST(rhs, NULL);
// TODO chill equivalent for numeric op.
// build up the chill Binary Op AST node
- chillAST_BinaryOperator * binop = new chillAST_BinaryOperator( l, opstring, r, p );
- l->setParent( binop );
- r->setParent( binop );
+ chillAST_BinaryOperator *binop = new chillAST_BinaryOperator(l, opstring, r, p);
+ l->setParent(binop);
+ r->setParent(binop);
- return binop;
+ return binop;
}
+chillAST_node *ConvertArraySubscriptExpr(ArraySubscriptExpr *clangASE, chillAST_node *p) {
-
-chillAST_node * ConvertArraySubscriptExpr( ArraySubscriptExpr *clangASE, chillAST_node *p ) {
-
- Expr *clangbase = clangASE->getBase();
+ Expr *clangbase = clangASE->getBase();
Expr *clangindex = clangASE->getIdx();
//fprintf(stderr, "clang base: "); clangbase->dump(); fprintf(stderr, "\n");
- chillAST_node *bas = ConvertGenericClangAST( clangbase, NULL );
- chillAST_node *indx = ConvertGenericClangAST( clangindex, NULL );
-
- chillAST_ArraySubscriptExpr * chillASE = new chillAST_ArraySubscriptExpr( bas, indx, p, clangASE);
- bas->setParent( chillASE );
- indx->setParent( chillASE );
- return chillASE;
-}
+ chillAST_node *bas = ConvertGenericClangAST(clangbase, NULL);
+ chillAST_node *indx = ConvertGenericClangAST(clangindex, NULL);
+ chillAST_ArraySubscriptExpr *chillASE = new chillAST_ArraySubscriptExpr(bas, indx, p, clangASE);
+ bas->setParent(chillASE);
+ indx->setParent(chillASE);
+ return chillASE;
+}
-chillAST_node * ConvertDeclRefExpr( DeclRefExpr * clangDRE, chillAST_node *p ) {
+chillAST_node *ConvertDeclRefExpr(DeclRefExpr *clangDRE, chillAST_node *p) {
DeclarationNameInfo DNI = clangDRE->getNameInfo();
ValueDecl *vd = static_cast<ValueDecl *>(clangDRE->getDecl()); // ValueDecl ?? VarDecl ??
@@ -1035,232 +1048,232 @@ chillAST_node * ConvertDeclRefExpr( DeclRefExpr * clangDRE, chillAST_node *p ) {
//fprintf(stderr, "kind %s\n", vd->getDeclKindName());
DeclarationName DN = DNI.getName();
- const char *varname = DN.getAsString().c_str() ;
- chillAST_DeclRefExpr * chillDRE = new chillAST_DeclRefExpr(TypeStr.c_str(), varname, p );
+ const char *varname = DN.getAsString().c_str();
+ chillAST_DeclRefExpr *chillDRE = new chillAST_DeclRefExpr(TypeStr.c_str(), varname, p);
//fprintf(stderr, "clang DeclRefExpr refers to declaration of %s @ 0x%x\n", varname, vd);
//fprintf(stderr, "clang DeclRefExpr refers to declaration of %s of kind %s\n", varname, vd->getDeclKindName());
-
+
// find the definition (we hope)
- if ( (!strcmp("Var", vd->getDeclKindName())) || (!strcmp("ParmVar", vd->getDeclKindName()))) {
+ if ((!strcmp("Var", vd->getDeclKindName())) || (!strcmp("ParmVar", vd->getDeclKindName()))) {
// it's a variable reference
int numvars = VariableDeclarations.size();
chillAST_VarDecl *chillvd = NULL;
- for (int i=0; i<numvars; i++) {
+ for (int i = 0; i < numvars; i++) {
if (VariableDeclarations[i]->uniquePtr == vd) {
chillvd = VariableDeclarations[i];
//fprintf(stderr, "found it at variabledeclaration %d of %d\n", i, numvars);
}
}
- if (!chillvd) {
- fprintf(stderr, "\nWARNING, ir_clang.cc clang DeclRefExpr %s refers to a declaration I can't find! at ox%x\n", varname, vd);
+ if (!chillvd) {
+ fprintf(stderr, "\nWARNING, ir_clang.cc clang DeclRefExpr %s refers to a declaration I can't find! at ox%x\n",
+ varname, vd);
fprintf(stderr, "variables I know of are:\n");
- for (int i=0; i<numvars; i++) {
+ for (int i = 0; i < numvars; i++) {
chillAST_VarDecl *adecl = VariableDeclarations[i];
if (adecl->isParmVarDecl()) fprintf(stderr, "(parameter) ");
- fprintf(stderr, "%s %s at location 0x%x\n", adecl->vartype, adecl->varname, adecl->uniquePtr);
- }
- fprintf(stderr, "\n");
+ fprintf(stderr, "%s %s at location 0x%x\n", adecl->vartype, adecl->varname, adecl->uniquePtr);
+ }
+ fprintf(stderr, "\n");
}
-
- if (chillvd == NULL) { fprintf(stderr, "chillDRE->decl = 0x%x\n", chillvd); exit(-1); }
- chillDRE->decl = (chillAST_node *)chillvd; // start of spaghetti pointers ...
- }
- else if (!strcmp("Function", vd->getDeclKindName())) {
+ if (chillvd == NULL) {
+ fprintf(stderr, "chillDRE->decl = 0x%x\n", chillvd);
+ exit(-1);
+ }
+
+ chillDRE->decl = (chillAST_node *) chillvd; // start of spaghetti pointers ...
+ } else if (!strcmp("Function", vd->getDeclKindName())) {
//fprintf(stderr, "declrefexpr of type Function\n");
int numfuncs = FunctionDeclarations.size();
chillAST_FunctionDecl *chillfd = NULL;
- for (int i=0; i<numfuncs; i++) {
+ for (int i = 0; i < numfuncs; i++) {
if (FunctionDeclarations[i]->uniquePtr == vd) {
chillfd = FunctionDeclarations[i];
//fprintf(stderr, "found it at functiondeclaration %d of %d\n", i, numfuncs);
}
}
- if (chillfd == NULL) { fprintf(stderr, "chillDRE->decl = 0x%x\n", chillfd); exit(-1); }
+ if (chillfd == NULL) {
+ fprintf(stderr, "chillDRE->decl = 0x%x\n", chillfd);
+ exit(-1);
+ }
- chillDRE->decl = (chillAST_node *)chillfd; // start of spaghetti pointers ...
-
- }
- else {
- fprintf(stderr, "clang DeclRefExpr refers to declaration of %s of kind %s\n", varname, vd->getDeclKindName());
- fprintf(stderr, "chillDRE->decl = UNDEFINED\n");
- exit(-1);
+ chillDRE->decl = (chillAST_node *) chillfd; // start of spaghetti pointers ...
+
+ } else {
+ fprintf(stderr, "clang DeclRefExpr refers to declaration of %s of kind %s\n", varname, vd->getDeclKindName());
+ fprintf(stderr, "chillDRE->decl = UNDEFINED\n");
+ exit(-1);
}
//fprintf(stderr, "%s\n", DN.getAsString().c_str());
- return chillDRE;
+ return chillDRE;
}
-
-chillAST_node * ConvertIntegerLiteral( IntegerLiteral *clangIL, chillAST_node *p ) {
+chillAST_node *ConvertIntegerLiteral(IntegerLiteral *clangIL, chillAST_node *p) {
bool isSigned = clangIL->getType()->isSignedIntegerType();
//int val = clangIL->getIntValue();
- const char *printable = clangIL->getValue().toString(10, isSigned).c_str();
- int val = atoi( printable );
+ const char *printable = clangIL->getValue().toString(10, isSigned).c_str();
+ int val = atoi(printable);
//fprintf(stderr, "int value %s (%d)\n", printable, val);
- chillAST_IntegerLiteral *chillIL = new chillAST_IntegerLiteral( val, p );
- return chillIL;
+ chillAST_IntegerLiteral *chillIL = new chillAST_IntegerLiteral(val, p);
+ return chillIL;
}
-chillAST_node * ConvertFloatingLiteral( FloatingLiteral *clangFL, chillAST_node *p ) {
+chillAST_node *ConvertFloatingLiteral(FloatingLiteral *clangFL, chillAST_node *p) {
//fprintf(stderr, "\nConvertFloatingLiteral()\n");
float val = clangFL->getValueAsApproximateDouble(); // TODO approx is a bad idea!
- string WHAT;
+ string WHAT;
SmallString<16> Str;
- clangFL->getValue().toString( Str );
- const char *printable = Str.c_str();
+ clangFL->getValue().toString(Str);
+ const char *printable = Str.c_str();
//fprintf(stderr, "literal %s\n", printable);
SourceLocation sloc = clangFL->getLocStart();
SourceLocation eloc = clangFL->getLocEnd();
- std::string start = sloc.printToString( *globalSRCMAN );
- std::string end = eloc.printToString( *globalSRCMAN );
+ std::string start = sloc.printToString(*globalSRCMAN);
+ std::string end = eloc.printToString(*globalSRCMAN);
//fprintf(stderr, "literal try2 start %s end %s\n", start.c_str(), end.c_str());
//printlines( sloc, eloc, globalSRCMAN );
- unsigned int startlineno = globalSRCMAN->getPresumedLineNumber( sloc );
- unsigned int endlineno = globalSRCMAN->getPresumedLineNumber( eloc ); ;
- const char *filename = globalSRCMAN->getBufferName( sloc );
+ unsigned int startlineno = globalSRCMAN->getPresumedLineNumber(sloc);
+ unsigned int endlineno = globalSRCMAN->getPresumedLineNumber(eloc);;
+ const char *filename = globalSRCMAN->getBufferName(sloc);
- std::string fname = globalSRCMAN->getFilename( sloc );
+ std::string fname = globalSRCMAN->getFilename(sloc);
//fprintf(stderr, "fname %s\n", fname.c_str());
if (filename && strlen(filename) > 0) {} // fprintf(stderr, "literal file '%s'\n", filename);
- else {
- fprintf(stderr, "\nConvertFloatingLiteral() filename is NULL?\n");
+ else {
+ fprintf(stderr, "\nConvertFloatingLiteral() filename is NULL?\n");
//sloc = globalSRCMAN->getFileLoc( sloc ); // should get spelling loc?
- sloc = globalSRCMAN->getSpellingLoc( sloc ); // should get spelling loc?
+ sloc = globalSRCMAN->getSpellingLoc(sloc); // should get spelling loc?
//eloc = globalSRCMAN->getFileLoc( eloc );
- start = sloc.printToString( *globalSRCMAN );
+ start = sloc.printToString(*globalSRCMAN);
//end = eloc.printToString( *globalSRCMAN );
//fprintf(stderr, "literal try3 start %s end %s\n", start.c_str(), end.c_str());
-
- startlineno = globalSRCMAN->getPresumedLineNumber( sloc );
+
+ startlineno = globalSRCMAN->getPresumedLineNumber(sloc);
//endlineno = globalSRCMAN->getPresumedLineNumber( eloc ); ;
//fprintf(stderr, "start, end line numbers %d %d\n", startlineno, endlineno);
-
- filename = globalSRCMAN->getBufferName( sloc );
+
+ filename = globalSRCMAN->getBufferName(sloc);
//if (globalSRCMAN->isMacroBodyExpansion( sloc )) {
// fprintf(stderr, "IS MACRO\n");
//}
}
-
- unsigned int offset = globalSRCMAN->getFileOffset( sloc );
+
+ unsigned int offset = globalSRCMAN->getFileOffset(sloc);
//fprintf(stderr, "literal file offset %d\n", offset);
- FILE *fp = fopen (filename, "r");
+ FILE *fp = fopen(filename, "r");
fseek(fp, offset, SEEK_SET); // go to the part of the file where the float is defined
-
+
char buf[10240];
- fgets (buf, sizeof(buf), fp); // read a line starting where the float starts
+ fgets(buf, sizeof(buf), fp); // read a line starting where the float starts
fclose(fp);
// buf has the line we want grab the float constant out of it
//fprintf(stderr, "\nbuf '%s'\n", buf);
char *ptr = buf;
if (*ptr == '-') ptr++; // ignore possible minus sign
- int len = strspn(ptr, ".-0123456789f");
+ int len = strspn(ptr, ".-0123456789f");
buf[len] = '\0';
//fprintf(stderr, "'%s'\n", buf);
- chillAST_FloatingLiteral *chillFL = new chillAST_FloatingLiteral( val, buf, p );
-
+ chillAST_FloatingLiteral *chillFL = new chillAST_FloatingLiteral(val, buf, p);
+
//chillFL->print(); printf("\n"); fflush(stdout);
- return chillFL;
+ return chillFL;
}
-chillAST_node * ConvertImplicitCastExpr( ImplicitCastExpr *clangICE, chillAST_node *p ) {
+chillAST_node *ConvertImplicitCastExpr(ImplicitCastExpr *clangICE, chillAST_node *p) {
//fprintf(stderr, "ConvertImplicitCastExpr()\n");
CastExpr *CE = dyn_cast<ImplicitCastExpr>(clangICE);
//fprintf(stderr, "implicit cast of type %s\n", CE->getCastKindName());
- chillAST_node * sub = ConvertGenericClangAST( clangICE->getSubExpr(), p );
- chillAST_ImplicitCastExpr *chillICE = new chillAST_ImplicitCastExpr( sub, p );
-
+ chillAST_node *sub = ConvertGenericClangAST(clangICE->getSubExpr(), p);
+ chillAST_ImplicitCastExpr *chillICE = new chillAST_ImplicitCastExpr(sub, p);
+
//sub->setParent( chillICE ); // these 2 lines work
//return chillICE;
//sub->setParent(p); // ignore the ImplicitCastExpr !! TODO (probably a bad idea)
- return sub;
+ return sub;
}
-
-
-chillAST_node * ConvertCStyleCastExpr( CStyleCastExpr *clangCSCE, chillAST_node *p ) {
+chillAST_node *ConvertCStyleCastExpr(CStyleCastExpr *clangCSCE, chillAST_node *p) {
//fprintf(stderr, "ConvertCStyleCastExpr()\n");
//fprintf(stderr, "C Style cast of kind ");
CastExpr *CE = dyn_cast<CastExpr>(clangCSCE);
//fprintf(stderr, "%s\n", CE->getCastKindName());
-
+
//clangCSCE->getTypeAsWritten().getAsString(Policy)
- const char * towhat = strdup( clangCSCE->getTypeAsWritten().getAsString().c_str() );
+ const char *towhat = strdup(clangCSCE->getTypeAsWritten().getAsString().c_str());
//fprintf(stderr, "before sub towhat (%s)\n", towhat);
- chillAST_node * sub = ConvertGenericClangAST( clangCSCE->getSubExprAsWritten(), NULL );
+ chillAST_node *sub = ConvertGenericClangAST(clangCSCE->getSubExprAsWritten(), NULL);
//fprintf(stderr, "after sub towhat (%s)\n", towhat);
- chillAST_CStyleCastExpr *chillCSCE = new chillAST_CStyleCastExpr( towhat, sub, p );
+ chillAST_CStyleCastExpr *chillCSCE = new chillAST_CStyleCastExpr(towhat, sub, p);
//fprintf(stderr, "after CSCE towhat (%s)\n", towhat);
- sub->setParent( chillCSCE );
- return chillCSCE;
+ sub->setParent(chillCSCE);
+ return chillCSCE;
}
-
-
-chillAST_node * ConvertReturnStmt( ReturnStmt *clangRS, chillAST_node *p ) {
- chillAST_node * retval = ConvertGenericClangAST( clangRS->getRetValue(), NULL ); // NULL is handled
+chillAST_node *ConvertReturnStmt(ReturnStmt *clangRS, chillAST_node *p) {
+ chillAST_node *retval = ConvertGenericClangAST(clangRS->getRetValue(), NULL); // NULL is handled
//if (retval == NULL) fprintf(stderr, "return stmt returns nothing\n");
- chillAST_ReturnStmt * chillRS = new chillAST_ReturnStmt( retval, p );
- if (retval) retval->setParent( chillRS );
- return chillRS;
+ chillAST_ReturnStmt *chillRS = new chillAST_ReturnStmt(retval, p);
+ if (retval) retval->setParent(chillRS);
+ return chillRS;
}
-chillAST_node * ConvertCallExpr( CallExpr *clangCE, chillAST_node *p ) {
+chillAST_node *ConvertCallExpr(CallExpr *clangCE, chillAST_node *p) {
//fprintf(stderr, "ConvertCallExpr()\n");
- chillAST_node *callee = ConvertGenericClangAST( clangCE->getCallee(), NULL );
+ chillAST_node *callee = ConvertGenericClangAST(clangCE->getCallee(), NULL);
//fprintf(stderr, "callee is of type %s\n", callee->getTypeString());
//chillAST_node *next = ((chillAST_ImplicitCastExpr *)callee)->subexpr;
//fprintf(stderr, "callee is of type %s\n", next->getTypeString());
- chillAST_CallExpr *chillCE = new chillAST_CallExpr( callee, p );
- callee->setParent( chillCE );
+ chillAST_CallExpr *chillCE = new chillAST_CallExpr(callee, p);
+ callee->setParent(chillCE);
int numargs = clangCE->getNumArgs();
//fprintf(stderr, "CallExpr has %d args\n", numargs);
- Expr **clangargs = clangCE->getArgs();
- for (int i=0; i<numargs; i++) {
- chillCE->addArg( ConvertGenericClangAST( clangargs[i], chillCE ) );
+ Expr **clangargs = clangCE->getArgs();
+ for (int i = 0; i < numargs; i++) {
+ chillCE->addArg(ConvertGenericClangAST(clangargs[i], chillCE));
}
-
- return chillCE;
+
+ return chillCE;
}
-chillAST_node * ConvertParenExpr( ParenExpr *clangPE, chillAST_node *p ) {
- chillAST_node *sub = ConvertGenericClangAST( clangPE->getSubExpr(), NULL);
- chillAST_ParenExpr *chillPE = new chillAST_ParenExpr( sub, p);
- sub->setParent( chillPE );
+chillAST_node *ConvertParenExpr(ParenExpr *clangPE, chillAST_node *p) {
+ chillAST_node *sub = ConvertGenericClangAST(clangPE->getSubExpr(), NULL);
+ chillAST_ParenExpr *chillPE = new chillAST_ParenExpr(sub, p);
+ sub->setParent(chillPE);
- return chillPE;
+ return chillPE;
}
-chillAST_node * ConvertTranslationUnit( TranslationUnitDecl *TUD, char *filename ) {
+chillAST_node *ConvertTranslationUnit(TranslationUnitDecl *TUD, char *filename) {
//fprintf(stderr, "ConvertTranslationUnit( filename %s )\n\n", filename);
// TUD derived from Decl and DeclContext
- static DeclContext *DC = TUD->castToDeclContext( TUD );
+ static DeclContext *DC = TUD->castToDeclContext(TUD);
// TODO this was to get the filename without having to pass it in
@@ -1271,35 +1284,33 @@ chillAST_node * ConvertTranslationUnit( TranslationUnitDecl *TUD, char *filenam
//const char *filename = SRCMAN->getBufferName( srcloc );
- chillAST_SourceFile * topnode = new chillAST_SourceFile( filename );
- topnode->setFrontend("clang");
- topnode->chill_array_counter = 1;
+ chillAST_SourceFile *topnode = new chillAST_SourceFile(filename);
+ topnode->setFrontend("clang");
+ topnode->chill_array_counter = 1;
topnode->chill_scalar_counter = 0;
// now recursively build clang AST from the children of TUD
//for (DeclContext::decl_iterator DI = DC->decls_begin(), DE = DC->decls_end(); DI != DE; ++DI)
DeclContext::decl_iterator start = DC->decls_begin();
- DeclContext::decl_iterator end = DC->decls_end();
- for (DeclContext::decl_iterator DI=start; DI != end; ++DI) {
+ DeclContext::decl_iterator end = DC->decls_end();
+ for (DeclContext::decl_iterator DI = start; DI != end; ++DI) {
Decl *D = *DI;
-
- if (isa<FunctionDecl>(D)) { //fprintf(stderr, "\nTUD FunctionDecl\n");
- topnode->addChild( ConvertFunctionDecl( dyn_cast<FunctionDecl>(D), topnode ));
- }
- else if (isa<VarDecl>(D)) { //fprintf(stderr, "\nTUD VarDecl\n");
- topnode->addChild( ConvertVarDecl( dyn_cast<VarDecl>(D), topnode ));
+
+ if (isa<FunctionDecl>(D)) { //fprintf(stderr, "\nTUD FunctionDecl\n");
+ topnode->addChild(ConvertFunctionDecl(dyn_cast<FunctionDecl>(D), topnode));
+ } else if (isa<VarDecl>(D)) { //fprintf(stderr, "\nTUD VarDecl\n");
+ topnode->addChild(ConvertVarDecl(dyn_cast<VarDecl>(D), topnode));
//fflush(stdout); fprintf(stderr, "\nTUD VarDecl DONE\n");
- }
- else if (isa<TypedefDecl>(D)) { //fprintf(stderr, "\nTUD TypedefDecl\n");
- topnode->addChild( ConvertTypeDefDecl( dyn_cast<TypedefDecl>(D), topnode ));
- }
- else if (isa<RecordDecl>(D)) { fprintf(stderr, "\nTUD RecordDecl\n");
- topnode->addChild( ConvertRecordDecl( dyn_cast<RecordDecl>(D), topnode ));
- }
- else if (isa<TypeAliasDecl>(D)) { fprintf(stderr, "TUD TypeAliasDecl TODO \n"); exit(-1);
- }
- else {
- fprintf(stderr, "\nTUD a declaration of type %s (%d) which I can't handle\n", D->getDeclKindName(), D->getKind());
+ } else if (isa<TypedefDecl>(D)) { //fprintf(stderr, "\nTUD TypedefDecl\n");
+ topnode->addChild(ConvertTypeDefDecl(dyn_cast<TypedefDecl>(D), topnode));
+ } else if (isa<RecordDecl>(D)) {
+ fprintf(stderr, "\nTUD RecordDecl\n");
+ topnode->addChild(ConvertRecordDecl(dyn_cast<RecordDecl>(D), topnode));
+ } else if (isa<TypeAliasDecl>(D)) {
+ fprintf(stderr, "TUD TypeAliasDecl TODO \n");
+ exit(-1);
+ } else {
+ fprintf(stderr, "\nTUD a declaration of type %s (%d) which I can't handle\n", D->getDeclKindName(), D->getKind());
exit(-1);
}
}
@@ -1307,63 +1318,78 @@ chillAST_node * ConvertTranslationUnit( TranslationUnitDecl *TUD, char *filenam
//fprintf(stderr, "in ConvertTranslationUnit(), dumping the file\n");
//topnode->dump();
- return ( chillAST_node *) topnode;
+ return (chillAST_node *) topnode;
}
+chillAST_node *ConvertGenericClangAST(Stmt *s, chillAST_node *p) {
- chillAST_node * ConvertGenericClangAST( Stmt *s, chillAST_node *p ) {
-
- if (s == NULL) return NULL;
- //fprintf(stderr, "\nConvertGenericClangAST() Stmt of type %d (%s)\n", s->getStmtClass(),s->getStmtClassName());
- Decl *D = (Decl *) s;
- //if (isa<Decl>(D)) fprintf(stderr, "Decl of kind %d (%s)\n", D->getKind(),D->getDeclKindName() );
-
+ if (s == NULL) return NULL;
+ //fprintf(stderr, "\nConvertGenericClangAST() Stmt of type %d (%s)\n", s->getStmtClass(),s->getStmtClassName());
+ Decl *D = (Decl *) s;
+ //if (isa<Decl>(D)) fprintf(stderr, "Decl of kind %d (%s)\n", D->getKind(),D->getDeclKindName() );
- chillAST_node *ret = NULL;
- if (isa<CompoundStmt>(s)) {ret = ConvertCompoundStmt( dyn_cast<CompoundStmt>(s),p);
- } else if (isa<DeclStmt>(s)) {ret = ConvertDeclStmt(dyn_cast<DeclStmt>(s),p);
- } else if (isa<ForStmt>(s)) {ret = ConvertForStmt(dyn_cast<ForStmt>(s),p);
- } else if (isa<BinaryOperator>(s)) {ret = ConvertBinaryOperator(dyn_cast<BinaryOperator>(s),p);
- } else if (isa<ArraySubscriptExpr>(s)) {ret = ConvertArraySubscriptExpr(dyn_cast<ArraySubscriptExpr>(s),p);
- } else if (isa<DeclRefExpr>(s)) {ret = ConvertDeclRefExpr(dyn_cast<DeclRefExpr>(s),p);
- } else if (isa<FloatingLiteral>(s)) {ret = ConvertFloatingLiteral(dyn_cast<FloatingLiteral>(s),p);
- } else if (isa<IntegerLiteral>(s)) {ret = ConvertIntegerLiteral(dyn_cast<IntegerLiteral>(s),p);
- } else if (isa<UnaryOperator>(s)) {ret = ConvertUnaryOperator(dyn_cast<UnaryOperator>(s),p);
- } else if (isa<ImplicitCastExpr>(s)) {ret = ConvertImplicitCastExpr(dyn_cast<ImplicitCastExpr>(s),p);
- } else if (isa<CStyleCastExpr>(s)) {ret = ConvertCStyleCastExpr(dyn_cast<CStyleCastExpr>(s),p);
- } else if (isa<ReturnStmt>(s)) {ret = ConvertReturnStmt(dyn_cast<ReturnStmt>(s),p);
- } else if (isa<CallExpr>(s)) {ret = ConvertCallExpr(dyn_cast<CallExpr>(s),p);
- } else if (isa<ParenExpr>(s)) {ret = ConvertParenExpr(dyn_cast<ParenExpr>(s),p);
- } else if (isa<IfStmt>(s)) {ret = ConvertIfStmt(dyn_cast<IfStmt>(s),p);
- } else if (isa<MemberExpr>(s)) {ret = ConvertMemberExpr(dyn_cast<MemberExpr>(s),p);
+ chillAST_node *ret = NULL;
+ if (isa<CompoundStmt>(s)) {
+ ret = ConvertCompoundStmt(dyn_cast<CompoundStmt>(s), p);
+ } else if (isa<DeclStmt>(s)) {
+ ret = ConvertDeclStmt(dyn_cast<DeclStmt>(s), p);
+ } else if (isa<ForStmt>(s)) {
+ ret = ConvertForStmt(dyn_cast<ForStmt>(s), p);
+ } else if (isa<BinaryOperator>(s)) {
+ ret = ConvertBinaryOperator(dyn_cast<BinaryOperator>(s), p);
+ } else if (isa<ArraySubscriptExpr>(s)) {
+ ret = ConvertArraySubscriptExpr(dyn_cast<ArraySubscriptExpr>(s), p);
+ } else if (isa<DeclRefExpr>(s)) {
+ ret = ConvertDeclRefExpr(dyn_cast<DeclRefExpr>(s), p);
+ } else if (isa<FloatingLiteral>(s)) {
+ ret = ConvertFloatingLiteral(dyn_cast<FloatingLiteral>(s), p);
+ } else if (isa<IntegerLiteral>(s)) {
+ ret = ConvertIntegerLiteral(dyn_cast<IntegerLiteral>(s), p);
+ } else if (isa<UnaryOperator>(s)) {
+ ret = ConvertUnaryOperator(dyn_cast<UnaryOperator>(s), p);
+ } else if (isa<ImplicitCastExpr>(s)) {
+ ret = ConvertImplicitCastExpr(dyn_cast<ImplicitCastExpr>(s), p);
+ } else if (isa<CStyleCastExpr>(s)) {
+ ret = ConvertCStyleCastExpr(dyn_cast<CStyleCastExpr>(s), p);
+ } else if (isa<ReturnStmt>(s)) {
+ ret = ConvertReturnStmt(dyn_cast<ReturnStmt>(s), p);
+ } else if (isa<CallExpr>(s)) {
+ ret = ConvertCallExpr(dyn_cast<CallExpr>(s), p);
+ } else if (isa<ParenExpr>(s)) {
+ ret = ConvertParenExpr(dyn_cast<ParenExpr>(s), p);
+ } else if (isa<IfStmt>(s)) {
+ ret = ConvertIfStmt(dyn_cast<IfStmt>(s), p);
+ } else if (isa<MemberExpr>(s)) {
+ ret = ConvertMemberExpr(dyn_cast<MemberExpr>(s), p);
- // these can only happen at the top level?
- // } else if (isa<FunctionDecl>(D)) { ret = ConvertFunctionDecl( dyn_cast<FunctionDecl>(D));
- //} else if (isa<VarDecl>(D)) { ret = ConvertVarDecl( dyn_cast<VarDecl>(D) );
- //} else if (isa<TypedefDecl>(D)) { ret = ConvertTypeDefDecl( dyn_cast<TypedefDecl>(D));
- // else if (isa<TranslationUnitDecl>(s)) // need filename
+ // these can only happen at the top level?
+ // } else if (isa<FunctionDecl>(D)) { ret = ConvertFunctionDecl( dyn_cast<FunctionDecl>(D));
+ //} else if (isa<VarDecl>(D)) { ret = ConvertVarDecl( dyn_cast<VarDecl>(D) );
+ //} else if (isa<TypedefDecl>(D)) { ret = ConvertTypeDefDecl( dyn_cast<TypedefDecl>(D));
+ // else if (isa<TranslationUnitDecl>(s)) // need filename
- // } else if (isa<>(s)) { Convert ( dyn_cast<>(s));
- /*
- */
+ // } else if (isa<>(s)) { Convert ( dyn_cast<>(s));
- } else {
- // more work to do
- fprintf(stderr, "ir_clang.cc ConvertGenericClangAST() UNHANDLED ");
- //if (isa<Decl>(D)) fprintf(stderr, "Decl of kind %s\n", D->getDeclKindName() );
- if (isa<Stmt>(s))fprintf(stderr, "Stmt of type %s\n", s->getStmtClassName());
- exit(-1);
- }
-
- return ret;
- }
+ /*
+ */
+
+ } else {
+ // more work to do
+ fprintf(stderr, "ir_clang.cc ConvertGenericClangAST() UNHANDLED ");
+ //if (isa<Decl>(D)) fprintf(stderr, "Decl of kind %s\n", D->getDeclKindName() );
+ if (isa<Stmt>(s))fprintf(stderr, "Stmt of type %s\n", s->getStmtClassName());
+ exit(-1);
+ }
+
+ return ret;
+}
@@ -1377,18 +1403,18 @@ chillAST_node * ConvertTranslationUnit( TranslationUnitDecl *TUD, char *filenam
// ----------------------------------------------------------------------------
// Class: IR_chillScalarSymbol
// ----------------------------------------------------------------------------
-
+
std::string IR_chillScalarSymbol::name() const {
//return vd_->getNameAsString(); CLANG
//fprintf(stderr, "IR_chillScalarSymbol::name() %s\n", chillvd->varname);
return std::string(chillvd->varname); // CHILL
}
-
+
// Return size in bytes
int IR_chillScalarSymbol::size() const {
//return (vd_->getASTContext().getTypeSize(vd_->getType())) / 8; // ??
- fprintf(stderr, "IR_chillScalarSymbol::size() probably WRONG\n");
+ fprintf(stderr, "IR_chillScalarSymbol::size() probably WRONG\n");
return (8); // bytes??
}
@@ -1397,13 +1423,13 @@ bool IR_chillScalarSymbol::operator==(const IR_Symbol &that) const {
//fprintf(stderr, "IR_xxxxScalarSymbol::operator== probably WRONG\n");
if (typeid(*this) != typeid(that))
return false;
-
+
const IR_chillScalarSymbol *l_that = static_cast<const IR_chillScalarSymbol *>(&that);
return this->chillvd == l_that->chillvd;
}
IR_Symbol *IR_chillScalarSymbol::clone() const {
- return new IR_chillScalarSymbol(ir_, chillvd ); // clone
+ return new IR_chillScalarSymbol(ir_, chillvd); // clone
}
// ----------------------------------------------------------------------------
@@ -1411,12 +1437,13 @@ IR_Symbol *IR_chillScalarSymbol::clone() const {
// ----------------------------------------------------------------------------
std::string IR_chillArraySymbol::name() const {
- return std::string( strdup( chillvd ->varname));
+ return std::string(strdup(chillvd->varname));
}
int IR_chillArraySymbol::elem_size() const {
- fprintf(stderr, "IR_chillArraySymbol::elem_size() TODO\n"); exit(-1);
+ fprintf(stderr, "IR_chillArraySymbol::elem_size() TODO\n");
+ exit(-1);
return 8; // TODO
//const ArrayType *at = dyn_cast<ArrayType>(vd_->getType());
//if(at) {
@@ -1432,13 +1459,14 @@ int IR_chillArraySymbol::n_dim() const {
//fprintf(stderr, "variable %s %s %s\n", chillvd->vartype, chillvd->varname, chillvd->arraypart);
//fprintf(stderr, "IR_chillArraySymbol::n_dim() %d\n", chillvd->numdimensions);
//fprintf(stderr, "IR_chillArraySymbol::n_dim() TODO \n"); exit(-1);
- return chillvd->numdimensions;
+ return chillvd->numdimensions;
}
// TODO
omega::CG_outputRepr *IR_chillArraySymbol::size(int dim) const {
- fprintf(stderr, "IR_chillArraySymbol::n_size() TODO \n"); exit(-1);
+ fprintf(stderr, "IR_chillArraySymbol::n_size() TODO \n");
+ exit(-1);
return NULL;
}
@@ -1446,13 +1474,13 @@ omega::CG_outputRepr *IR_chillArraySymbol::size(int dim) const {
bool IR_chillArraySymbol::operator!=(const IR_Symbol &that) const {
//fprintf(stderr, "IR_xxxxArraySymbol::operator!= NOT EQUAL\n");
//chillAST_VarDecl *chillvd;
- return chillvd != ((IR_chillArraySymbol*)&that)->chillvd ;
+ return chillvd != ((IR_chillArraySymbol *) &that)->chillvd;
}
bool IR_chillArraySymbol::operator==(const IR_Symbol &that) const {
//fprintf(stderr, "IR_xxxxArraySymbol::operator== EQUAL\n");
//chillAST_VarDecl *chillvd;
- return chillvd == ((IR_chillArraySymbol*)&that)->chillvd ;
+ return chillvd == ((IR_chillArraySymbol *) &that)->chillvd;
/*
if (typeid(*this) != typeid(that))
return false;
@@ -1474,12 +1502,12 @@ IR_Symbol *IR_chillArraySymbol::clone() const {
bool IR_chillConstantRef::operator==(const IR_Ref &that) const {
if (typeid(*this) != typeid(that))
return false;
-
+
const IR_chillConstantRef *l_that = static_cast<const IR_chillConstantRef *>(&that);
-
+
if (this->type_ != l_that->type_)
return false;
-
+
if (this->type_ == IR_CONSTANT_INT)
return this->i_ == l_that->i_;
else
@@ -1491,8 +1519,9 @@ omega::CG_outputRepr *IR_chillConstantRef::convert() {
//assert(astContext_ != NULL);
if (type_ == IR_CONSTANT_INT) {
- fprintf(stderr, "IR_chillConstantRef::convert() unimplemented\n"); exit(-1);
-
+ fprintf(stderr, "IR_chillConstantRef::convert() unimplemented\n");
+ exit(-1);
+
// TODO
/*
BuiltinType *bint = new BuiltinType(BuiltinType::Int);
@@ -1501,8 +1530,7 @@ omega::CG_outputRepr *IR_chillConstantRef::convert() {
delete this;
return result;
*/
- }
- else
+ } else
throw ir_error("constant type not supported");
}
@@ -1521,7 +1549,7 @@ IR_Ref *IR_chillConstantRef::clone() const {
// ----------------------------------------------------------------------------
bool IR_chillScalarRef::is_write() const {
- return op_pos_ == OP_DEST; // 2 other alternatives: OP_UNKNOWN, OP_SRC
+ return op_pos_ == OP_DEST; // 2 other alternatives: OP_UNKNOWN, OP_SRC
}
@@ -1529,7 +1557,7 @@ IR_ScalarSymbol *IR_chillScalarRef::symbol() const {
//VarDecl *vd = static_cast<VarDecl *>(vs_->getDecl());
//fprintf(stderr, "ir_clang.cc IR_chillScalarRef::symbol()\n"); //exit(-1);
chillAST_VarDecl *vd = NULL;
- if (chillvd) vd = chillvd;
+ if (chillvd) vd = chillvd;
return new IR_chillScalarSymbol(ir_, vd); // IR_chillScalarRef::symbol()
}
@@ -1537,22 +1565,22 @@ IR_ScalarSymbol *IR_chillScalarRef::symbol() const {
bool IR_chillScalarRef::operator==(const IR_Ref &that) const {
if (typeid(*this) != typeid(that))
return false;
-
+
const IR_chillScalarRef *l_that = static_cast<const IR_chillScalarRef *>(&that);
-
+
return this->chillvd == l_that->chillvd;
}
omega::CG_outputRepr *IR_chillScalarRef::convert() {
//fprintf(stderr, "IR_chillScalarRef::convert() unimplemented\n"); exit(-1);
- if (!dre) fprintf(stderr, "IR_chillScalarRef::convert() CLANG SCALAR REF has no dre\n");
+ if (!dre) fprintf(stderr, "IR_chillScalarRef::convert() CLANG SCALAR REF has no dre\n");
omega::CG_chillRepr *result = new omega::CG_chillRepr(dre);
delete this;
return result;
}
-IR_Ref * IR_chillScalarRef::clone() const {
+IR_Ref *IR_chillScalarRef::clone() const {
if (dre) return new IR_chillScalarRef(ir_, dre); // use declrefexpr if it exists
return new IR_chillScalarRef(ir_, chillvd); // uses vardecl
}
@@ -1563,17 +1591,17 @@ IR_Ref * IR_chillScalarRef::clone() const {
// ----------------------------------------------------------------------------
bool IR_chillArrayRef::is_write() const {
-
+
return (iswrite); // TODO
}
// TODO
omega::CG_outputRepr *IR_chillArrayRef::index(int dim) const {
- fprintf(stderr, "IR_xxxxArrayRef::index( %d ) \n", dim);
+ fprintf(stderr, "IR_xxxxArrayRef::index( %d ) \n", dim);
//chillASE->print(); printf("\n"); fflush(stdout);
//chillASE->getIndex(dim)->print(); printf("\n"); fflush(stdout);
- return new omega::CG_chillRepr( chillASE->getIndex(dim) );
+ return new omega::CG_chillRepr(chillASE->getIndex(dim));
}
@@ -1582,16 +1610,16 @@ IR_ArraySymbol *IR_chillArrayRef::symbol() const {
//chillASE->print(); printf("\n"); fflush(stdout);
//fprintf(stderr, "base: "); chillASE->base->print(); printf("\n"); fflush(stdout);
-
- chillAST_node *mb = chillASE->multibase();
- chillAST_VarDecl *vd = (chillAST_VarDecl*)mb;
+
+ chillAST_node *mb = chillASE->multibase();
+ chillAST_VarDecl *vd = (chillAST_VarDecl *) mb;
//fprintf(stderr, "symbol: '%s'\n", vd->varname);
//fprintf(stderr, "IR_chillArrayRef symbol: '%s%s'\n", vd->varname, vd->arraypart);
//fprintf(stderr, "numdimensions %d\n", vd->numdimensions);
- IR_ArraySymbol *AS = new IR_chillArraySymbol(ir_, vd);
+ IR_ArraySymbol *AS = new IR_chillArraySymbol(ir_, vd);
//fprintf(stderr, "ir_clang.cc returning IR_chillArraySymbol 0x%x\n", AS);
- return AS;
+ return AS;
/*
chillAST_node *b = chillASE->base;
fprintf(stderr, "base of type %s\n", b->getTypeString());
@@ -1624,10 +1652,12 @@ bool IR_chillArrayRef::operator!=(const IR_Ref &that) const {
bool op = (*this) == that; // opposite
return !op;
}
-
-void IR_chillArrayRef::Dump() const {
+
+void IR_chillArrayRef::Dump() const {
//fprintf(stderr, "IR_chillArrayRef::Dump() this 0x%x chillASE 0x%x\n", this, chillASE);
- chillASE->print(); printf("\n");fflush(stdout);
+ chillASE->print();
+ printf("\n");
+ fflush(stdout);
}
@@ -1635,7 +1665,7 @@ bool IR_chillArrayRef::operator==(const IR_Ref &that) const {
//fprintf(stderr, "IR_xxxxArrayRef::operator==\n");
//printf("I am\n"); chillASE->print(); printf("\n");
const IR_chillArrayRef *l_that = static_cast<const IR_chillArrayRef *>(&that);
- const chillAST_ArraySubscriptExpr* thatASE = l_that->chillASE;
+ const chillAST_ArraySubscriptExpr *thatASE = l_that->chillASE;
//printf("other is:\n"); thatASE->print(); printf("\n"); fflush(stdout);
//fprintf(stderr, "addresses are 0x%x 0x%x\n", chillASE, thatASE );
return (*chillASE) == (*thatASE);
@@ -1653,7 +1683,7 @@ bool IR_chillArrayRef::operator==(const IR_Ref &that) const {
omega::CG_outputRepr *IR_chillArrayRef::convert() {
//fprintf(stderr, "IR_chillArrayRef::convert()\n");
- CG_chillRepr *result = new CG_chillRepr( chillASE->clone() );
+ CG_chillRepr *result = new CG_chillRepr(chillASE->clone());
// omega::CG_chillRepr *temp = new omega::CG_chillRepr(static_cast<Expr*>(this->as_));
// omega::CG_outputRepr *result = temp->clone();
delete this;
@@ -1669,74 +1699,70 @@ IR_Ref *IR_chillArrayRef::clone() const {
// ----------------------------------------------------------------------------
// Class: IR_chillLoop
// ----------------------------------------------------------------------------
-IR_chillLoop::IR_chillLoop(const IR_Code *ir, clang::ForStmt *tf) { CHILL_ERROR("IR_chillLoop::IR_chillLoop() you lose\n"); exit(-1); };
+IR_chillLoop::IR_chillLoop(const IR_Code *ir, clang::ForStmt *tf) {
+ CHILL_ERROR("you lose\n");
+ exit(-1);
+};
IR_chillLoop::IR_chillLoop(const IR_Code *ir, chillAST_ForStmt *achillforstmt) {
CHILL_DEBUG_BEGIN
- fprintf(stderr, "IR_xxxxLoop::IR_xxxxLoop()\n");
fprintf(stderr, "loop is:\n");
achillforstmt->print();
CHILL_DEBUG_END
- ir_ = ir;
+ ir_ = ir;
chillforstmt = achillforstmt;
- chillAST_BinaryOperator *init = (chillAST_BinaryOperator *)chillforstmt->getInit();
- chillAST_BinaryOperator *cond = (chillAST_BinaryOperator *)chillforstmt->getCond();
+ chillAST_BinaryOperator *init = (chillAST_BinaryOperator *) chillforstmt->getInit();
+ chillAST_BinaryOperator *cond = (chillAST_BinaryOperator *) chillforstmt->getCond();
// check to be sure (assert)
- if (!init->isAssignmentOp() || !cond->isComparisonOp() ) {
+ if (!init->isAssignmentOp() || !cond->isComparisonOp()) {
CHILL_ERROR("malformed loop init or cond:\n");
- achillforstmt->print();
- exit(-1);
+ achillforstmt->print();
+ exit(-1);
}
chilllowerbound = init->getRHS();
chillupperbound = cond->getRHS();
- conditionoperator = achillforstmt->conditionoperator;
-
- chillAST_node *inc = chillforstmt->getInc();
+ conditionoperator = achillforstmt->conditionoperator;
+
+ chillAST_node *inc = chillforstmt->getInc();
// check the increment
//fprintf(stderr, "increment is of type %s\n", inc->getTypeString());
//inc->print(); printf("\n"); fflush(stdout);
- if (inc->asttype == CHILLAST_NODETYPE_UNARYOPERATOR) {
+ if (inc->asttype == CHILLAST_NODETYPE_UNARYOPERATOR) {
if (!strcmp(((chillAST_UnaryOperator *) inc)->op, "++")) step_size_ = 1;
- else step_size_ = -1;
- }
- else if (inc->asttype == CHILLAST_NODETYPE_BINARYOPERATOR) {
+ else step_size_ = -1;
+ } else if (inc->asttype == CHILLAST_NODETYPE_BINARYOPERATOR) {
int beets = false; // slang
chillAST_BinaryOperator *bop = (chillAST_BinaryOperator *) inc;
if (bop->isAssignmentOp()) { // I=I+1 or similar
chillAST_node *rhs = bop->getRHS(); // (I+1)
// TODO looks like this will fail for I=1+I or I=J+1 etc. do more checking
-
- char *assop = bop->getOp();
+
+ char *assop = bop->getOp();
//fprintf(stderr, "'%s' is an assignment op\n", bop->getOp());
if (streq(assop, "+=") || streq(assop, "-=")) {
chillAST_node *stride = rhs;
//fprintf(stderr, "stride is of type %s\n", stride->getTypeString());
- if (stride->isIntegerLiteral()) {
- int val = ((chillAST_IntegerLiteral *)stride)->value;
- if (streq( assop, "+=")) step_size_ = val;
- else if (streq( assop, "-=")) step_size_ = -val;
- else beets = true;
- }
- else beets = true; // += or -= but not constant stride
- }
- else if (rhs->isBinaryOperator()) {
- chillAST_BinaryOperator *binoprhs = (chillAST_BinaryOperator *)rhs;
- chillAST_node *intlit = binoprhs->getRHS();
+ if (stride->isIntegerLiteral()) {
+ int val = ((chillAST_IntegerLiteral *) stride)->value;
+ if (streq(assop, "+=")) step_size_ = val;
+ else if (streq(assop, "-=")) step_size_ = -val;
+ else beets = true;
+ } else beets = true; // += or -= but not constant stride
+ } else if (rhs->isBinaryOperator()) {
+ chillAST_BinaryOperator *binoprhs = (chillAST_BinaryOperator *) rhs;
+ chillAST_node *intlit = binoprhs->getRHS();
if (intlit->isIntegerLiteral()) {
- int val = ((chillAST_IntegerLiteral *)intlit)->value;
- if (!strcmp( binoprhs->getOp(), "+")) step_size_ = val;
- else if (!strcmp( binoprhs->getOp(), "-")) step_size_ = -val;
- else beets = true;
- }
- else beets = true;
- }
- else beets = true;
- }
- else beets = true;
+ int val = ((chillAST_IntegerLiteral *) intlit)->value;
+ if (!strcmp(binoprhs->getOp(), "+")) step_size_ = val;
+ else if (!strcmp(binoprhs->getOp(), "-")) step_size_ = -val;
+ else beets = true;
+ } else beets = true;
+ } else beets = true;
+ } else beets = true;
if (beets) {
CHILL_ERROR("malformed loop increment (or more likely unhandled case)\n");
@@ -1751,10 +1777,10 @@ IR_chillLoop::IR_chillLoop(const IR_Code *ir, chillAST_ForStmt *achillforstmt) {
}
//inc->print(0, stderr);fprintf(stderr, "\n");
- chillAST_DeclRefExpr *dre = (chillAST_DeclRefExpr *)init->getLHS();
- if (!dre->isDeclRefExpr()) {
+ chillAST_DeclRefExpr *dre = (chillAST_DeclRefExpr *) init->getLHS();
+ if (!dre->isDeclRefExpr()) {
CHILL_DEBUG_PRINT("malformed loop init.\n");
- init->print();
+ init->print();
}
chillindex = dre; // the loop index variable
@@ -1766,7 +1792,7 @@ IR_chillLoop::IR_chillLoop(const IR_Code *ir, chillAST_ForStmt *achillforstmt) {
//chillupperbound->print(0, stderr); fprintf(stderr, "\n");
//fprintf(stderr, "step size is %d\n\n", step_size_) ;
- chillbody = achillforstmt->getBody();
+ chillbody = achillforstmt->getBody();
CHILL_DEBUG_PRINT("IR_xxxxLoop::IR_xxxxLoop() DONE\n");
}
@@ -1787,7 +1813,7 @@ IR_Block *IR_chillLoop::body() const {
//assert(isa<CompoundStmt>(tf_->getBody()));
//fprintf(stderr, "returning a clangBLOCK corresponding to the body of the loop\n");
//fprintf(stderr, "body type %s\n", chillbody->getTypeString());
- return new IR_chillBlock(ir_, chillbody ) ; // static_cast<CompoundStmt *>(tf_->getBody()));
+ return new IR_chillBlock(ir_, chillbody); // static_cast<CompoundStmt *>(tf_->getBody()));
}
IR_Control *IR_chillLoop::clone() const {
@@ -1797,18 +1823,18 @@ IR_Control *IR_chillLoop::clone() const {
}
IR_CONDITION_TYPE IR_chillLoop::stop_cond() const {
- chillAST_BinaryOperator *loopcondition = (chillAST_BinaryOperator*) chillupperbound;
+ chillAST_BinaryOperator *loopcondition = (chillAST_BinaryOperator *) chillupperbound;
CHILL_DEBUG_PRINT("IR_xxxxLoop::stop_cond()\n");
- return conditionoperator;
+ return conditionoperator;
}
IR_Block *IR_chillLoop::convert() { // convert the loop to a block
CHILL_DEBUG_PRINT("IR_xxxxLoop::convert() maybe \n");
- return new IR_chillBlock( ir_, chillbody ); // ??
+ return new IR_chillBlock(ir_, chillbody); // ??
return NULL;
}
-void IR_chillLoop::dump() const {
+void IR_chillLoop::dump() const {
CHILL_ERROR("TODO: IR_chillLoop::dump()\n");
exit(-1);
}
@@ -1824,102 +1850,91 @@ omega::CG_outputRepr *IR_chillBlock::original() const {
}
-
omega::CG_outputRepr *IR_chillBlock::extract() const {
- fflush(stdout);
- fprintf(stderr, "IR_xxxxBlock::extract()\n");
+ fflush(stdout);
+ fprintf(stderr, "IR_xxxxBlock::extract()\n");
//omega::CG_chillRepr *tnl = new omega::CG_chillRepr(getStmtList());
// if the block refers to a compound statement, return the next level
// of statements ; otherwise just return a repr of the statements
- chillAST_node *code = chillAST;
- //if (chillAST != NULL) fprintf(stderr, "block has chillAST of type %s\n",code->getTypeString());
+ //if (chillAST != NULL) fprintf(stderr, "block has chillAST of type %s\n",code->getTypeString());
//fprintf(stderr, "block has %d exploded statements\n", statements.size());
- omega::CG_chillRepr *OR;
- if (0 == statements.size()) {
- OR = new omega::CG_chillRepr(code); // presumably a compound statement ??
- }
- else {
- fprintf(stderr, "adding a statement from IR_chillBlock::extract()\n");
- OR = new omega::CG_chillRepr(); // empty of statements
- for (int i=0; i<statements.size(); i++) OR->addStatement( statements[i] );
- }
-
- fflush(stdout);
- fprintf(stderr, "IR_xxxxBlock::extract() LEAVING\n");
+ omega::CG_chillRepr *OR;
+ CHILL_DEBUG_PRINT("adding a statement from IR_chillBlock::extract()\n");
+ OR = new omega::CG_chillRepr(); // empty of statements
+ for (int i = 0; i < statements.size(); i++) OR->addStatement(statements[i]);
+ CHILL_DEBUG_PRINT("IR_xxxxBlock::extract() LEAVING\n");
return OR;
}
IR_Control *IR_chillBlock::clone() const {
CHILL_DEBUG_PRINT("IR_xxxxBlock::clone()\n");
//fprintf(stderr, "IR_xxxxBlock::clone() %d statements\n", statements.size());
- return new IR_chillBlock( this ); // shallow copy ?
+ return new IR_chillBlock(this); // shallow copy ?
}
-void IR_chillBlock::dump() const {
- fprintf(stderr, "IR_chillBlock::dump() TODO\n"); return;
+void IR_chillBlock::dump() const {
+ fprintf(stderr, "IR_chillBlock::dump() TODO\n");
+ return;
}
//StmtList
-vector<chillAST_node*> IR_chillBlock::getStmtList() const {
+vector<chillAST_node *> IR_chillBlock::getStmtList() const {
fprintf(stderr, "IR_xxxxBlock::getStmtList()\n");
return statements; // ??
}
-void IR_chillBlock::addStatement( chillAST_node* s ) {
- statements.push_back( s );
+void IR_chillBlock::addStatement(chillAST_node *s) {
+ statements.push_back(s);
}
-
-void PrintTranslationUnit( TranslationUnitDecl *TUD) { // , ASTContext &CTX ) {
- fprintf(stderr, "MY PrintTranslationUnit()\n");
+void PrintTranslationUnit(TranslationUnitDecl *TUD) { // , ASTContext &CTX ) {
+ fprintf(stderr, "MY PrintTranslationUnit()\n");
// TUD derived from Decl and DeclContext
- static DeclContext *DC = TUD->castToDeclContext( TUD );
+ static DeclContext *DC = TUD->castToDeclContext(TUD);
//SourceManager SM = CTX.getSourceManager();
for (DeclContext::decl_iterator DI = DC->decls_begin(), DE = DC->decls_end(); DI != DE; ++DI) {
Decl *D = *DI;
- fprintf(stderr, "D\n");
- if (isa<FunctionDecl>(D)) { fprintf(stderr, "FunctionDecl\n");
+ fprintf(stderr, "D\n");
+ if (isa<FunctionDecl>(D)) {
+ fprintf(stderr, "FunctionDecl\n");
//PrintFunctionDecl( dyn_cast<FunctionDecl>(D), CTX.getSourceManager(), 0);
- }
- else if (isa<VarDecl>(D)) { fprintf(stderr, "VarDecl\n");
+ } else if (isa<VarDecl>(D)) {
+ fprintf(stderr, "VarDecl\n");
//PrintVarDecl( dyn_cast<VarDecl>(D), CTX.getSourceManager(), 0 );
- }
- else if (isa<TypedefDecl>(D)) { fprintf(stderr, "TypedefDecl\n");
+ } else if (isa<TypedefDecl>(D)) {
+ fprintf(stderr, "TypedefDecl\n");
//PrintTypeDefDecl( dyn_cast<TypedefDecl>(D), CTX.getSourceManager(), 0 );
- }
- else if (isa<TypeAliasDecl>(D)) { fprintf(stderr, "TypeAliasDecl\n");
- }
- else fprintf(stderr, "\na declaration of type %s (%d)\n", D->getDeclKindName(), D->getKind());
+ } else if (isa<TypeAliasDecl>(D)) {
+ fprintf(stderr, "TypeAliasDecl\n");
+ } else fprintf(stderr, "\na declaration of type %s (%d)\n", D->getDeclKindName(), D->getKind());
//else if (isa<TypedefNameDecl>(D)) { fprintf(stderr, "TypedefNameDecl\n");}
}
}
-class NULLASTConsumer : public ASTConsumer
-{
+class NULLASTConsumer : public ASTConsumer {
};
-
-void findmanually( chillAST_node *node, char *procname, std::vector<chillAST_node*>& procs ) {
+void findmanually(chillAST_node *node, char *procname, std::vector<chillAST_node *> &procs) {
//fprintf(stderr, "findmanually() CHILL AST node of type %s\n", node->getTypeString());
-
- if (node->asttype == CHILLAST_NODETYPE_FUNCTIONDECL ) {
+
+ if (node->asttype == CHILLAST_NODETYPE_FUNCTIONDECL) {
char *name = ((chillAST_FunctionDecl *) node)->functionName;
//fprintf(stderr, "node name 0x%x ", name);
//fprintf(stderr, "%s procname ", name);
//fprintf(stderr, "0x%x ", procname);
//fprintf(stderr, "%s\n", procname);
- if (!strcmp( name, procname)) {
+ if (!strcmp(name, procname)) {
//fprintf(stderr, "found procedure %s\n", procname );
- procs.push_back( node );
+ procs.push_back(node);
// quit recursing. probably not correct in some horrible case
- return;
+ return;
}
//else fprintf(stderr, "this is not the function we're looking for\n");
}
@@ -1929,14 +1944,14 @@ void findmanually( chillAST_node *node, char *procname, std::vector<chillAST_nod
// we don't really care what kind of node we're at. We just check the node itself
// and then its children is needed.
- int numc = node->children.size();
+ int numc = node->children.size();
//fprintf(stderr, "%d children\n", numc);
- for (int i=0; i<numc; i++) {
+ for (int i = 0; i < numc; i++) {
//fprintf(stderr, "node of type %s is recursing to child %d\n", node->getTypeString(), i);
- findmanually( node->children[i], procname, procs );
+ findmanually(node->children[i], procname, procs);
}
- return;
+ return;
}
// ----------------------------------------------------------------------------
@@ -1949,34 +1964,35 @@ IR_clangCode_Global_Init *IR_clangCode_Global_Init::pinstance = 0;
IR_clangCode_Global_Init *IR_clangCode_Global_Init::Instance(char **argv) {
if (pinstance == 0) {
// this is the only way to create an IR_clangCode_Global_Init
- pinstance = new IR_clangCode_Global_Init;
- pinstance->ClangCompiler = new aClangCompiler( argv[1] );
+ pinstance = new IR_clangCode_Global_Init;
+ pinstance->ClangCompiler = new aClangCompiler(argv[1]);
}
return pinstance;
}
-aClangCompiler::aClangCompiler( char *filename ) {
-
+aClangCompiler::aClangCompiler(char *filename) {
+
//fprintf(stderr, "making a clang compiler for file %s\n", filename);
- SourceFileName = strdup( filename );
+ SourceFileName = strdup(filename);
// Arguments to pass to the clang frontend
std::vector<const char *> args;
- args.push_back(strdup(filename));
-
+ args.push_back(strdup(filename));
+
// The compiler invocation needs a DiagnosticsEngine so it can report problems
//IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions(); // temp
- diagnosticOptions = new DiagnosticOptions(); // private member of aClangCompiler
-
- pTextDiagnosticPrinter = new clang::TextDiagnosticPrinter(llvm::errs(), diagnosticOptions); // private member of aClangCompiler
-
+ diagnosticOptions = new DiagnosticOptions(); // private member of aClangCompiler
+
+ pTextDiagnosticPrinter = new clang::TextDiagnosticPrinter(llvm::errs(),
+ diagnosticOptions); // private member of aClangCompiler
+
//llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> DiagID(new clang::DiagnosticIDs());
//clang::DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagClient);
diagnosticsEngine = new clang::DiagnosticsEngine(diagID, diagnosticOptions, pTextDiagnosticPrinter);
-
+
// Create the compiler invocation
// This class is designed to represent an abstract "invocation" of the compiler,
// including data such as the include paths, the code generation options,
@@ -1985,7 +2001,7 @@ aClangCompiler::aClangCompiler( char *filename ) {
//CI = new clang::CompilerInvocation;
clang::CompilerInvocation::CreateFromArgs(*CI, &args[0], &args[0] + args.size(), *diagnosticsEngine);
-
+
// Create the compiler instance
Clang = new clang::CompilerInstance(); // TODO should have a better name ClangCompilerInstance
@@ -1993,10 +2009,10 @@ aClangCompiler::aClangCompiler( char *filename ) {
// Get ready to report problems
Clang->createDiagnostics(nullptr, true);
//Clang.createDiagnostics(0, 0);
-
-
+
+
//#ifdef KIDDINGME
- //fprintf(stderr, "target\n");
+ //fprintf(stderr, "target\n");
// Initialize target info with the default triple for our platform.
//TargetOptions TO;
//TO.Triple = llvm::sys::getDefaultTargetTriple();
@@ -2006,24 +2022,24 @@ aClangCompiler::aClangCompiler( char *filename ) {
targetOptions = std::make_shared<clang::TargetOptions>();
targetOptions->Triple = llvm::sys::getDefaultTargetTriple();
- TargetInfo *pti = TargetInfo::CreateTargetInfo(Clang->getDiagnostics(),targetOptions);
+ TargetInfo *pti = TargetInfo::CreateTargetInfo(Clang->getDiagnostics(), targetOptions);
Clang->setTarget(pti);
-
+
//#endif
-
+
// ??
//fprintf(stderr, "filemgr\n");
Clang->createFileManager();
FileManager &FileMgr = Clang->getFileManager();
fileManager = &FileMgr;
-
+
//fprintf(stderr, "sourcemgr\n");
Clang->createSourceManager(FileMgr);
SourceManager &SourceMgr = Clang->getSourceManager();
sourceManager = &SourceMgr; // ?? aclangcompiler copy
- globalSRCMAN = &SourceMgr; // TODO global bad
+ globalSRCMAN = &SourceMgr; // TODO global bad
Clang->setInvocation(CI.get()); // Replace the current invocation
@@ -2039,14 +2055,14 @@ aClangCompiler::aClangCompiler( char *filename ) {
//fprintf(stderr, "CONTEXT\n");
Clang->createASTContext(); // needs preprocessor
- astContext_ = &Clang->getASTContext();
-
+ astContext_ = &Clang->getASTContext();
+
//fprintf(stderr, "filein\n");
const FileEntry *FileIn = FileMgr.getFile(filename); // needs preprocessor
- SourceMgr.setMainFileID(SourceMgr.createFileID(FileIn,clang::SourceLocation(),clang::SrcMgr::C_User));
+ SourceMgr.setMainFileID(SourceMgr.createFileID(FileIn, clang::SourceLocation(), clang::SrcMgr::C_User));
//DiagnosticConsumer DiagConsumer = Clang->getDiagnosticClient();
- Clang->getDiagnosticClient().BeginSourceFile( Clang->getLangOpts(), &Clang->getPreprocessor());
+ Clang->getDiagnosticClient().BeginSourceFile(Clang->getLangOpts(), &Clang->getPreprocessor());
NULLASTConsumer TheConsumer; // must pass a consumer in to ParseAST(). This one does nothing
@@ -2054,15 +2070,15 @@ aClangCompiler::aClangCompiler( char *filename ) {
//fprintf(stderr, "ready? Parse.\n");
CHILL_DEBUG_PRINT("actually parsing file %s using clang\n", filename);
- ParseAST( Clang->getPreprocessor(), &TheConsumer, Clang->getASTContext());
+ ParseAST(Clang->getPreprocessor(), &TheConsumer, Clang->getASTContext());
// Translation Unit is contents of a file
- TranslationUnitDecl* TUD = astContext_->getTranslationUnitDecl();
+ TranslationUnitDecl *TUD = astContext_->getTranslationUnitDecl();
// TUD->dump(); // print it out
// create another AST, very similar to the clang AST but not written by idiots
CHILL_DEBUG_PRINT("converting entire clang AST into chill AST (ir_clang.cc)\n");
- chillAST_node * wholefile = ConvertTranslationUnit( TUD, filename);
+ chillAST_node *wholefile = ConvertTranslationUnit(TUD, filename);
fflush(stdout);
//fprintf(stderr, "printing whole file\n");
@@ -2071,14 +2087,14 @@ aClangCompiler::aClangCompiler( char *filename ) {
//wholefile->dump();
//fflush(stdout);
- entire_file_AST = (chillAST_SourceFile *)wholefile;
+ entire_file_AST = (chillAST_SourceFile *) wholefile;
- astContext_ = &Clang->getASTContext();
+ astContext_ = &Clang->getASTContext();
//#define DOUBLE
#ifdef DOUBLE
- fprintf(stderr, "DOUBLE\n");
+ fprintf(stderr, "DOUBLE\n");
fprintf(stderr, "\n\nCLANG dump of the file I parsed:\n");
llvm::OwningPtr<clang::FrontendAction> Act2(new clang::ASTDumpAction());
@@ -2087,21 +2103,18 @@ aClangCompiler::aClangCompiler( char *filename ) {
exit(3);
}
#endif
- fflush(stdout); fflush(stderr);
- fflush(stdout); fflush(stderr);
- fflush(stdout); fflush(stderr);
- fflush(stdout); fflush(stderr);
-
-
-
-
-
-
+ fflush(stdout);
+ fflush(stderr);
+ fflush(stdout);
+ fflush(stderr);
+ fflush(stdout);
+ fflush(stderr);
+ fflush(stdout);
+ fflush(stderr);
+#ifdef DONTDOTHIS
-#ifdef DONTDOTHIS
-
// calling this Action seems to overwrite the astcontext and the AST. (!)
// don't ever do this, or you lose contact with the original AST (?)
@@ -2117,43 +2130,40 @@ aClangCompiler::aClangCompiler( char *filename ) {
fflush(stdout);
#endif
-
+
//fprintf(stderr, "leaving aClangCompiler::aClangCompiler( filename )\n");
}
-
-
-chillAST_FunctionDecl* aClangCompiler::findprocedurebyname( char *procname ) {
+chillAST_FunctionDecl *aClangCompiler::findprocedurebyname(char *procname) {
//fprintf(stderr, "searching through files in the clang AST\n\n");
//fprintf(stderr, "astContext_ 0x%x\n", astContext_);
- std::vector<chillAST_node*> procs;
- findmanually( entire_file_AST, procname, procs );
+ std::vector<chillAST_node *> procs;
+ findmanually(entire_file_AST, procname, procs);
//fprintf(stderr, "procs has %d members\n", procs.size());
- if ( procs.size() == 0 ) {
+ if (procs.size() == 0) {
CHILL_ERROR("could not find function named '%s' in AST from file %s\n", procname, SourceFileName);
exit(-1);
}
-
- if ( procs.size() > 1 ) {
+
+ if (procs.size() > 1) {
CHILL_ERROR("oddly, found %d functions named '%s' in AST from file %s\n", procs.size(), procname, SourceFileName);
CHILL_ERROR("I am unsure what to do\n");
exit(-1);
}
CHILL_DEBUG_PRINT("found the procedure named %s\n", procname);
- return (chillAST_FunctionDecl *)procs[0];
+ return (chillAST_FunctionDecl *) procs[0];
}
-
-#ifdef NOPE
-IR_clangCode_Global_Init::IR_clangCode_Global_Init(char *filename , clang::FileSystemOptions fso ) :
+#ifdef NOPE
+IR_clangCode_Global_Init::IR_clangCode_Global_Init(char *filename , clang::FileSystemOptions fso ) :
fileManager(fso) // , headerSearch( headerSearchOptions, fileManager, diagengine, languageOptions, pTargetInfo )
{
/* CLANG Initialization */
@@ -2201,11 +2211,10 @@ IR_clangCode_Global_Init::IR_clangCode_Global_Init(char *filename , clang::File
sema.Initialize();
clang::ParseAST(*preprocessor, astConsumer_, *astContext_);
}
-#endif
+#endif
-IR_clangCode_Global_Init::~IR_clangCode_Global_Init()
-{
+IR_clangCode_Global_Init::~IR_clangCode_Global_Init() {
/*
delete pTextDiagnosticPrinter;
delete diagnostic;
@@ -2224,10 +2233,10 @@ IR_clangCode_Global_Init::~IR_clangCode_Global_Init()
// Class: IR_clangCode
// ----------------------------------------------------------------------------
-IR_clangCode::IR_clangCode(const char *fname, const char *proc_name): IR_Code() {
+IR_clangCode::IR_clangCode(const char *fname, const char *proc_name) : IR_Code() {
CHILL_DEBUG_PRINT("IR_xxxxCode::IR_xxxxCode()\n");
//fprintf(stderr, "IR_clangCode::IR_clangCode( filename %s, procedure %s )\n", filename, proc_name);
-
+
filename = strdup(fname); // filename is internal to IR_clangCode
procedurename = strdup(proc_name);
@@ -2235,34 +2244,34 @@ IR_clangCode::IR_clangCode(const char *fname, const char *proc_name): IR_Code()
char *argv[2];
argv[0] = strdup("chill");
argv[1] = strdup(filename);
-
+
// use clang to parse the input file ? (or is that already done?)
//fprintf(stderr, "IR_clangCode::IR_clangCode(), parsing input file %s\n", argv[1]);
-
+
// this causes opening and parsing of the file.
// this is the only call to Instance that has an argument list or file name
IR_clangCode_Global_Init *pInstance = IR_clangCode_Global_Init::Instance(argv);
-
- if(pInstance) {
-
+
+ if (pInstance) {
+
aClangCompiler *Clang = pInstance->ClangCompiler;
//fprintf(stderr, "Clang is 0x%x\n", Clang);
//fprintf(stderr, "want to get pointer to clang ast for procedure %s\n", proc_name);
- pInstance->setCurrentFunction( NULL ); // we have no function AST yet
+ pInstance->setCurrentFunction(NULL); // we have no function AST yet
entire_file_AST = Clang->entire_file_AST; // ugly that same name, different classes
- chillAST_FunctionDecl *localFD = Clang->findprocedurebyname( strdup(proc_name) ); // stored locally
+ chillAST_FunctionDecl *localFD = Clang->findprocedurebyname(strdup(proc_name)); // stored locally
//fprintf(stderr, "back from findprocedurebyname( %s )\n", proc_name );
//localFD->print();
- pInstance->setCurrentFunction( localFD );
+ pInstance->setCurrentFunction(localFD);
- chillAST_node *b = localFD->getBody(); // we do this just because it will get done next
+ chillAST_node *b = localFD->getBody(); // we do this just because it will get done next
CHILL_DEBUG_PRINT("calling new CG_chillBuilder() umwut?\n");
ocg_ = new omega::CG_chillBuilder(); // ocg == omega code gen
- chillfunc = localFD;
+ chillfunc = localFD;
}
@@ -2281,121 +2290,122 @@ IR_clangCode::~IR_clangCode() {
//fprintf(stderr, "Constant Folding before\n");
//chillfunc->print();
- chillfunc->constantFold();
+ chillfunc->constantFold();
//fprintf(stderr, "\nConstant Folding after\n");
//chillfunc->print();
- chillfunc->cleanUpVarDecls();
+ chillfunc->cleanUpVarDecls();
//chillfunc->dump();
// TODO should output the entire file, not just the function we're working on
- chillAST_SourceFile *src = chillfunc->getSourceFile();
+ chillAST_SourceFile *src = chillfunc->getSourceFile();
//chillAST_node *p = chillfunc->parent; // should be translationDeclUnit
- if (src) {
+ if (src) {
//src->print(); // tmp
- if (src->isSourceFile()) src->printToFile( );
+ if (src->isSourceFile()) src->printToFile();
}
}
-
-
-
//TODO
IR_ScalarSymbol *IR_clangCode::CreateScalarSymbol(const IR_Symbol *sym, int i) {
//fprintf(stderr, "IR_clangCode::CreateScalarSymbol()\n");
- if (typeid(*sym) == typeid( IR_chillScalarSymbol ) ) { // should be the case ???
- fprintf(stderr, "IR_xxxxCode::CreateScalarSymbol() from a scalar symbol\n");
+ if (typeid(*sym) == typeid(IR_chillScalarSymbol)) { // should be the case ???
+ fprintf(stderr, "IR_xxxxCode::CreateScalarSymbol() from a scalar symbol\n");
//fprintf(stderr, "(typeid(*sym) == typeid( IR_chillScalarSymbol )\n");
- const IR_chillScalarSymbol *CSS = (IR_chillScalarSymbol*) sym;
+ const IR_chillScalarSymbol *CSS = (IR_chillScalarSymbol *) sym;
chillAST_VarDecl *vd = CSS->chillvd;
-
+
// do we have to check to see if it's already there?
- VariableDeclarations.push_back(vd);
- chillAST_node *bod = chillfunc->getBody(); // always a compoundStmt ??
- bod->insertChild(0, vd);
- fprintf(stderr, "returning ... really\n");
- return new IR_chillScalarSymbol( this, CSS->chillvd); // CSS->clone();
+ VariableDeclarations.push_back(vd);
+ chillAST_node *bod = chillfunc->getBody(); // always a compoundStmt ??
+ bod->insertChild(0, vd);
+ fprintf(stderr, "returning ... really\n");
+ return new IR_chillScalarSymbol(this, CSS->chillvd); // CSS->clone();
}
// ??
- if (typeid(*sym) == typeid( IR_chillArraySymbol ) ) {
- fprintf(stderr, "IR_xxxxCode::CreateScalarSymbol() from an array symbol?\n");
- const IR_chillArraySymbol *CAS = (IR_chillArraySymbol*) sym;
+ if (typeid(*sym) == typeid(IR_chillArraySymbol)) {
+ fprintf(stderr, "IR_xxxxCode::CreateScalarSymbol() from an array symbol?\n");
+ const IR_chillArraySymbol *CAS = (IR_chillArraySymbol *) sym;
//fprintf(stderr, "CAS 0x%x chillvd = 0x%x\n", CAS, CAS->chillvd);
//fprintf(stderr, "\nthis is the SYMBOL?: \n");
//CAS->print();
//CAS->dump();
- chillAST_VarDecl *vd = CAS->chillvd;
+ chillAST_VarDecl *vd = CAS->chillvd;
//fprintf(stderr, "\nthis is the var decl?: ");
//vd->print(); printf("\n");
//vd->dump(); printf("\n\n");
- fflush(stdout);
-
+ fflush(stdout);
+
// figure out the base type (probably float) of the array
char *basetype = vd->underlyingtype;
- fprintf(stderr, "scalar will be of type SgType%s\n", basetype);
+ fprintf(stderr, "scalar will be of type SgType%s\n", basetype);
char tmpname[128];
- sprintf(tmpname, "newVariable%i\0", vd->chill_scalar_counter++);
- chillAST_VarDecl * scalarvd = new chillAST_VarDecl( basetype, tmpname, "", NULL); // TODO parent
- scalarvd->print(); printf("\n"); fflush(stdout);
+ sprintf(tmpname, "newVariable%i\0", vd->chill_scalar_counter++);
+ chillAST_VarDecl *scalarvd = new chillAST_VarDecl(basetype, tmpname, "", NULL); // TODO parent
+ scalarvd->print();
+ printf("\n");
+ fflush(stdout);
- fprintf(stderr, "VarDecl has parent that is a NULL\n");
+ fprintf(stderr, "VarDecl has parent that is a NULL\n");
- return (IR_ScalarSymbol *) (new IR_chillScalarSymbol( this, scalarvd)); // CSS->clone();
+ return (IR_ScalarSymbol *) (new IR_chillScalarSymbol(this, scalarvd)); // CSS->clone();
}
-
- fprintf(stderr, "IR_clangCode::CreateScalarSymbol(), passed a sym that is not a clang scalar symbol OR an array symbol???\n");
+
+ fprintf(stderr,
+ "IR_clangCode::CreateScalarSymbol(), passed a sym that is not a clang scalar symbol OR an array symbol???\n");
int *n = NULL;
n[0] = 1;
- exit(-1);
+ exit(-1);
return NULL;
}
-IR_ArraySymbol *IR_clangCode::CreateArraySymbol(const IR_Symbol *sym, std::vector<omega::CG_outputRepr *> &size, int i) {
- fprintf(stderr, "IR_xxxxCode::CreateArraySymbol()\n");
+IR_ArraySymbol *
+IR_clangCode::CreateArraySymbol(const IR_Symbol *sym, std::vector<omega::CG_outputRepr *> &size, int i) {
+ fprintf(stderr, "IR_xxxxCode::CreateArraySymbol()\n");
// build a new array name
char namestring[128];
sprintf(namestring, "_P%d\0", entire_file_AST->chill_array_counter++);
- fprintf(stderr, "creating Array %s\n", namestring);
-
+ fprintf(stderr, "creating Array %s\n", namestring);
+
char arraypart[100];
char *s = &arraypart[0];
- for (int i=0; i<size.size(); i++) {
+ for (int i = 0; i < size.size(); i++) {
omega::CG_outputRepr *OR = size[i];
- CG_chillRepr * CR = (CG_chillRepr * ) OR;
+ CG_chillRepr *CR = (CG_chillRepr *) OR;
//fprintf(stderr, "%d chillnodes\n", CR->chillnodes.size());
-
+
// this SHOULD be 1 chillnode of type IntegerLiteral (per dimension)
int numnodes = CR->chillnodes.size();
- if (1 != numnodes) {
- fprintf(stderr,
- "IR_clangCode::CreateArraySymbol() array dimension %d has %d chillnodes\n",
- i, numnodes );
+ if (1 != numnodes) {
+ fprintf(stderr,
+ "IR_clangCode::CreateArraySymbol() array dimension %d has %d chillnodes\n",
+ i, numnodes);
exit(-1);
}
chillAST_node *nodezero = CR->chillnodes[0];
- if (!nodezero->isIntegerLiteral()) {
+ if (!nodezero->isIntegerLiteral()) {
fprintf(stderr, "IR_clangCode::CreateArraySymbol() array dimension %d not an IntegerLiteral\n", i);
exit(-1);
}
- chillAST_IntegerLiteral *IL = (chillAST_IntegerLiteral *)nodezero;
+ chillAST_IntegerLiteral *IL = (chillAST_IntegerLiteral *) nodezero;
int val = IL->value;
- sprintf(s, "[%d]\0", val);
- s = &arraypart[ strlen(arraypart) ];
+ sprintf(s, "[%d]\0", val);
+ s = &arraypart[strlen(arraypart)];
}
//fprintf(stderr, "arraypart '%s'\n", arraypart);
- chillAST_VarDecl *vd = new chillAST_VarDecl( "float", namestring, arraypart, NULL); // todo type from sym
+ chillAST_VarDecl *vd = new chillAST_VarDecl("float", namestring, arraypart, NULL); // todo type from sym
// put decl in some symbol table
VariableDeclarations.push_back(vd);
@@ -2403,37 +2413,37 @@ IR_ArraySymbol *IR_clangCode::CreateArraySymbol(const IR_Symbol *sym, std::vecto
chillAST_node *bod = chillfunc->getBody(); // always a compoundStmt ??
bod->insertChild(0, vd);
- return new IR_chillArraySymbol( this, vd);
+ return new IR_chillArraySymbol(this, vd);
}
// TODO
std::vector<IR_ScalarRef *> IR_clangCode::FindScalarRef(const omega::CG_outputRepr *repr) const {
std::vector<IR_ScalarRef *> scalars;
- fprintf(stderr, "IR_clangCode::FindScalarRef() DIE\n"); exit(-1);
+ fprintf(stderr, "IR_clangCode::FindScalarRef() DIE\n");
+ exit(-1);
return scalars;
}
-
IR_ScalarRef *IR_clangCode::CreateScalarRef(const IR_ScalarSymbol *sym) {
//fprintf(stderr, "\n***** ir_clang.cc IR_clangCode::CreateScalarRef( sym %s )\n", sym->name().c_str());
//DeclRefExpr *de = new (vd->getASTContext())DeclRefExpr(static_cast<ValueDecl*>(vd), vd->getType(), SourceLocation());
//fprintf(stderr, "sym 0x%x\n", sym);
- IR_chillScalarRef *sr = new IR_chillScalarRef(this, buildDeclRefExpr(((IR_chillScalarSymbol*)sym)->chillvd)); // uses VarDecl to mak a declrefexpr
+ IR_chillScalarRef *sr = new IR_chillScalarRef(this, buildDeclRefExpr(
+ ((IR_chillScalarSymbol *) sym)->chillvd)); // uses VarDecl to mak a declrefexpr
//fprintf(stderr, "returning ScalarRef with dre 0x%x\n", sr->dre);
- return sr;
+ return sr;
//return (IR_ScalarRef *)NULL;
}
-
IR_ArrayRef *IR_clangCode::CreateArrayRef(const IR_ArraySymbol *sym, std::vector<omega::CG_outputRepr *> &index) {
- fprintf(stderr, "IR_clangCode::CreateArrayRef() ir_clang.cc\n");
- fprintf(stderr, "sym->n_dim() %d index.size() %d\n", sym->n_dim(), index.size());
+ fprintf(stderr, "IR_clangCode::CreateArrayRef() ir_clang.cc\n");
+ fprintf(stderr, "sym->n_dim() %d index.size() %d\n", sym->n_dim(), index.size());
int t;
- if(sym->n_dim() != index.size()) {
+ if (sym->n_dim() != index.size()) {
throw std::invalid_argument("incorrect array symbol dimensionality dim != size ir_clang.cc L2359");
}
@@ -2442,18 +2452,18 @@ IR_ArrayRef *IR_clangCode::CreateArrayRef(const IR_ArraySymbol *sym, std::vector
std::vector<chillAST_node *> inds;
//fprintf(stderr, "%d array indeces\n", sym->n_dim());
- for (int i=0; i< index.size(); i++) {
- CG_chillRepr *CR = (CG_chillRepr *)index[i];
-
+ for (int i = 0; i < index.size(); i++) {
+ CG_chillRepr *CR = (CG_chillRepr *) index[i];
+
int numnodes = CR->chillnodes.size();
- if (1 != numnodes) {
- fprintf(stderr,
- "IR_clangCode::CreateArrayRef() array dimension %d has %d chillnodes\n",
- i, numnodes );
+ if (1 != numnodes) {
+ fprintf(stderr,
+ "IR_clangCode::CreateArrayRef() array dimension %d has %d chillnodes\n",
+ i, numnodes);
exit(-1);
}
- inds.push_back( CR->chillnodes[0] );
+ inds.push_back(CR->chillnodes[0]);
/*
chillAST_node *nodezero = CR->chillnodes[0];
@@ -2473,9 +2483,9 @@ IR_ArrayRef *IR_clangCode::CreateArrayRef(const IR_ArraySymbol *sym, std::vector
// now we've got the vardecl AND the indeces to make a chillAST that represents the array reference
// TODO Passing NULL for chillAST node?
CHILL_DEBUG_PRINT("Passed NULL as chillAST node");
- chillAST_ArraySubscriptExpr *ASE = new chillAST_ArraySubscriptExpr( vd, inds, NULL);
+ chillAST_ArraySubscriptExpr *ASE = new chillAST_ArraySubscriptExpr(vd, inds, NULL);
- auto ref = new IR_chillArrayRef( this, ASE, 0 );
+ auto ref = new IR_chillArrayRef(this, ASE, 0);
return ref;
}
@@ -2484,23 +2494,23 @@ IR_ArrayRef *IR_clangCode::CreateArrayRef(const IR_ArraySymbol *sym, std::vector
std::vector<IR_ArrayRef *> IR_clangCode::FindArrayRef(const omega::CG_outputRepr *repr) const {
//fprintf(stderr, "FindArrayRef()\n");
std::vector<IR_ArrayRef *> arrays;
- const omega::CG_chillRepr *crepr = static_cast<const omega::CG_chillRepr *>(repr);
- std::vector<chillAST_node*> chillstmts = crepr->getChillCode();
+ const omega::CG_chillRepr *crepr = static_cast<const omega::CG_chillRepr *>(repr);
+ std::vector<chillAST_node *> chillstmts = crepr->getChillCode();
//fprintf(stderr, "there are %d chill statements in this repr\n", chillstmts.size());
- std::vector<chillAST_ArraySubscriptExpr*> refs;
- for (int i=0; i<chillstmts.size(); i++) {
+ std::vector<chillAST_ArraySubscriptExpr *> refs;
+ for (int i = 0; i < chillstmts.size(); i++) {
//fprintf(stderr, "\nchillstatement %d = ", i); chillstmts[i]->print(0, stderr); fprintf(stderr, "\n");
- chillstmts[i]->gatherArrayRefs( refs, false );
+ chillstmts[i]->gatherArrayRefs(refs, false);
}
//fprintf(stderr, "%d total refs\n", refs.size());
- for (int i=0; i<refs.size(); i++) {
- if (refs[i]->imreadfrom) {
+ for (int i = 0; i < refs.size(); i++) {
+ if (refs[i]->imreadfrom) {
//fprintf(stderr, "ref[%d] going to be put in TWICE, as both read and write\n", i);
- arrays.push_back( new IR_chillArrayRef( this, refs[i], 0 ) ); // UGLY TODO dual usage of a ref in "+="
+ arrays.push_back(new IR_chillArrayRef(this, refs[i], 0)); // UGLY TODO dual usage of a ref in "+="
}
- arrays.push_back( new IR_chillArrayRef( this, refs[i], refs[i]->imwrittento ) ); // this is wrong
+ arrays.push_back(new IR_chillArrayRef(this, refs[i], refs[i]->imwrittento)); // this is wrong
// we need to know whether this reference will be written, etc.
}
@@ -2576,32 +2586,29 @@ std::vector<IR_ArrayRef *> IR_clangCode::FindArrayRef(const omega::CG_outputRepr
std::vector<IR_Control *> IR_clangCode::FindOneLevelControlStructure(const IR_Block *block) const {
- CHILL_DEBUG_PRINT("IR_xxxxCode::FindOneLevelControlStructure()\n");
- const IR_chillBlock *CB = (const IR_chillBlock *) block;
+ const IR_chillBlock *CB = (const IR_chillBlock *) block;
//fprintf(stderr, "block 0x%x\n", block);
std::vector<IR_Control *> controls;
- chillAST_node *blockast = CB->chillAST;
- //fprintf(stderr, "blockast 0x%x\n", blockast);
- if (blockast == NULL) {
- int numstmts = CB->statements.size();
- CHILL_DEBUG_PRINT("%d statements\n", numstmts);
+ chillAST_node *blockast = NULL;
+ int numstmts = CB->statements.size();
+ CHILL_DEBUG_PRINT("%d statements\n", numstmts);
- if (numstmts == 0) return controls;
+ if (numstmts == 0) return controls;
- else if (numstmts == 1) blockast = CB->statements[0]; // a single statement
+ else if (numstmts == 1) blockast = CB->statements[0]; // a single statement
- else {
- CHILL_ERROR( "IR_xxxBlock is dumb, with multiple ways to hold statements\n");
- exit(-1); // TODO FIX
+ CHILL_DEBUG_BEGIN
+ for (int i = 0; i < CB->statements.size(); ++i) {
+ fprintf(stderr, "block's AST is of type %s\n", CB->statements[i]->getTypeString());
+ CB->statements[i]->print();
+ printf("\n");
+ fflush(stdout);
}
- }
+ CHILL_DEBUG_END
- //fprintf(stderr, "block's AST is of type %s\n", blockast->getTypeString());
- //blockast->print(); printf("\n\n"); fflush(stdout);
-
//vector<chillAST_node *> funcchildren = chillfunc->getChildren();
//fprintf(stderr, "%d children of clangcode\n", funcchildren.size()); // includes parameters
@@ -2612,7 +2619,7 @@ std::vector<IR_Control *> IR_clangCode::FindOneLevelControlStructure(const IR_Bl
std::vector<chillAST_node *> children;
-
+
if (blockast->asttype == CHILLAST_NODETYPE_FORSTMT) {
CHILL_DEBUG_BEGIN
fflush(stdout);
@@ -2622,154 +2629,147 @@ std::vector<IR_Control *> IR_clangCode::FindOneLevelControlStructure(const IR_Bl
fprintf(stderr, "pushing the loop at TOP\n");
CHILL_DEBUG_END
- controls.push_back( new IR_chillLoop( this, (chillAST_ForStmt *)blockast));
+ controls.push_back(new IR_chillLoop(this, (chillAST_ForStmt *) blockast));
}
- //else if (blockast->asttype == CHILLAST_NODETYPE_IFSTMT) {
- // controls.push_back( new IR_clangIf( this, (chillAST_IfStmt *)blockast));
- //}
- else if (blockast->asttype == CHILLAST_NODETYPE_COMPOUNDSTMT ||
- blockast->asttype == CHILLAST_NODETYPE_FUNCTIONDECL) {
+ //else if (blockast->asttype == CHILLAST_NODETYPE_IFSTMT) {
+ // controls.push_back( new IR_clangIf( this, (chillAST_IfStmt *)blockast));
+ //}
+ else if (blockast->asttype == CHILLAST_NODETYPE_COMPOUNDSTMT ||
+ blockast->asttype == CHILLAST_NODETYPE_FUNCTIONDECL) {
- if (blockast->asttype == CHILLAST_NODETYPE_FUNCTIONDECL) {
+ if (blockast->asttype == CHILLAST_NODETYPE_FUNCTIONDECL) {
//fprintf(stderr, "ir_clanc.cc blockast->asttype == CHILLAST_NODETYPE_FUNCTIONDECL\n");
- chillAST_FunctionDecl *FD = (chillAST_FunctionDecl *)blockast;
- chillAST_node *bod = FD->getBody();
+ chillAST_FunctionDecl *FD = (chillAST_FunctionDecl *) blockast;
+ chillAST_node *bod = FD->getBody();
//fprintf(stderr, "bod 0x%x\n", bod);
- children = bod->getChildren();
+ children = bod->getChildren();
//fprintf(stderr, "FunctionDecl body is of type %s\n", bod->getTypeString());
//fprintf(stderr, "found a top level FunctionDecl (Basic Block)\n");
//fprintf(stderr, "basic block has %d statements\n", children.size() );
//fprintf(stderr, "basic block is:\n");
//bod->print();
- }
- else /* CompoundStmt */ {
+ } else /* CompoundStmt */ {
//fprintf(stderr, "found a top level Basic Block\n");
children = blockast->getChildren();
}
-
- int numchildren = children.size();
+
+ int numchildren = children.size();
//fprintf(stderr, "basic block has %d statements\n", numchildren);
//fprintf(stderr, "basic block is:\n");
//fprintf(stderr, "{\n");
//blockast->print();
//fprintf(stderr, "}\n");
-
- int ns;
+
+ int ns;
IR_chillBlock *basicblock = new IR_chillBlock(this); // no statements
- for (int i=0; i<numchildren; i++) {
+ for (int i = 0; i < numchildren; i++) {
//fprintf(stderr, "child %d is of type %s\n", i, children[i]->getTypeString());
CHILL_ASTNODE_TYPE typ = children[i]->asttype;
if (typ == CHILLAST_NODETYPE_LOOP) {
- if (numchildren == 1) {
+ if (numchildren == 1) {
CHILL_DEBUG_PRINT("found a For statement (Loop)\n");
- }
- else {
+ } else {
CHILL_DEBUG_PRINT("found a For statement (Loop) at %d within a Basic Block\n", i);
}
//children[i]->print(); printf("\n"); fflush(stdout);
-
+
ns = basicblock->numstatements();
if (ns) {
- CHILL_DEBUG_PRINT("pushing a run of statements %d to %d as a block\n", i-ns, i-1);
- controls.push_back( basicblock );
+ CHILL_DEBUG_PRINT("pushing a run of statements as a block\n");
+ controls.push_back(basicblock);
basicblock = new IR_chillBlock(this); // start a new one
}
-
- //fprintf(stderr, "pushing the loop at %d\n", i);
- controls.push_back( new IR_chillLoop(this, (chillAST_ForStmt *)children[i] ));
-
+
+ CHILL_DEBUG_PRINT("pushing the loop at %d\n", i);
+ controls.push_back(new IR_chillLoop(this, (chillAST_ForStmt *) children[i]));
+
}
- //else if (typ == CHILLAST_NODETYPE_IFSTMT ) // TODO
+ //else if (typ == CHILLAST_NODETYPE_IFSTMT ) // TODO
else { // straight line code
- //fprintf(stderr, "straight line code\n");
- basicblock->addStatement( children[i] );
- //fprintf(stderr, "child %d = \n", i); children[i]->print(); printf("\n"); fflush(stdout);
- //fprintf(stderr, "child %d is part of a basic block\n", i);
+ basicblock->addStatement(children[i]);
+ CHILL_DEBUG_BEGIN
+ fprintf(stderr, "straight line code\n");
+ fprintf(stderr, "child %d = \n", i);
+ children[i]->print();
+ printf("\n");
+ fflush(stdout);
+ fprintf(stderr, "child %d is part of a basic block\n", i);
+ CHILL_DEBUG_END
}
} // for each child
ns = basicblock->numstatements();
//fprintf(stderr, "ns %d\n", ns);
- if (ns != 0 ) {
+ if (ns != 0) {
if (ns != numchildren) {
//fprintf(stderr, "end of body ends the run of %d statements in the Basic Block\n", ns);
- controls.push_back( basicblock );
- }
- else {
+ controls.push_back(basicblock);
+ } else {
//fprintf(stderr, "NOT sending straightline run of statements, because it would be the entire block. There are no control statements in the block\n");
}
}
//else fprintf(stderr, "NOT sending the last run of %d statements\n", ns);
-
- }
- else {
- CHILL_ERROR("IR_clangCode::FindOneLevelControlStructure(), block is a %s???\n", blockast->getTypeString());
+
+ } else {
+ CHILL_ERROR("block is a %s???\n", blockast->getTypeString());
exit(-1);
}
-
- CHILL_DEBUG_PRINT("returning vector of %d controls\n", controls.size() );
+
+ CHILL_DEBUG_PRINT("returning vector of %d controls\n", controls.size());
return controls;
}
IR_Block *IR_clangCode::MergeNeighboringControlStructures(const std::vector<IR_Control *> &controls) const {
- CHILL_DEBUG_PRINT("IR_xxxxCode::MergeNeighboringControlStructures %d controls\n", controls.size());
+ CHILL_DEBUG_PRINT("%d controls\n", controls.size());
if (controls.size() == 0)
return NULL;
-
- IR_chillBlock *CBlock = new IR_chillBlock(controls[0]->ir_); // the thing we're building
- std::vector<chillAST_node*> statements;
- chillAST_node *parent = NULL;
- for (int i = 0; i < controls.size(); i++) {
+ IR_chillBlock *CBlock = new IR_chillBlock(controls[0]->ir_); // the thing we're building
+
+ std::vector<chillAST_node *> statements;
+ chillAST_node *parent = NULL;
+ for (int i = 0; i < controls.size(); i++) {
switch (controls[i]->type()) {
- case IR_CONTROL_LOOP: {
- CHILL_DEBUG_PRINT("control %d is IR_CONTROL_LOOP\n", i);
- chillAST_ForStmt *loop = static_cast<IR_chillLoop *>(controls[i])->chillforstmt;
- if (parent == NULL) {
- parent = loop->parent;
- } else {
- if (parent != loop->parent) {
- throw ir_error("controls to merge not at the same level");
+ case IR_CONTROL_LOOP: {
+ CHILL_DEBUG_PRINT("control %d is IR_CONTROL_LOOP\n", i);
+ chillAST_ForStmt *loop = static_cast<IR_chillLoop *>(controls[i])->chillforstmt;
+ if (parent == NULL) {
+ parent = loop->parent;
+ } else {
+ if (parent != loop->parent) {
+ throw ir_error("controls to merge not at the same level");
+ }
}
+ CBlock->addStatement(loop);
+ break;
}
- CBlock->addStatement( loop );
- break;
- }
- case IR_CONTROL_BLOCK: {
- CHILL_DEBUG_PRINT("control %d is IR_CONTROL_BLOCK\n", i);
- IR_chillBlock *CB = static_cast<IR_chillBlock*>(controls[i]);
- std::vector<chillAST_node*> blockstmts = CB->statements;
- if (statements.size() != 0) {
- for (int j=0; j< blockstmts.size(); j++) {
+ case IR_CONTROL_BLOCK: {
+ CHILL_DEBUG_PRINT("control %d is IR_CONTROL_BLOCK\n", i);
+ IR_chillBlock *CB = static_cast<IR_chillBlock *>(controls[i]);
+ std::vector<chillAST_node *> blockstmts = CB->statements;
+ for (int j = 0; j < blockstmts.size(); j++) {
if (parent == NULL) {
parent = blockstmts[j]->parent;
- }
- else {
- if (parent != blockstmts[j]->parent) {
- throw ir_error("ir_clang.cc IR_clangCode::MergeNeighboringControlStructures controls to merge not at the same level");
+ } else {
+ if (parent != blockstmts[j]->parent) {
+ throw ir_error(
+ "ir_clang.cc IR_clangCode::MergeNeighboringControlStructures controls to merge not at the same level");
}
}
- CBlock->addStatement( blockstmts[j] );
+ CBlock->addStatement(blockstmts[j]);
}
+ break;
}
- else {
- if (CB->chillAST) CBlock->addStatement(CBlock->chillAST); // if this is a block, add theblock's statements?
- else { // should never happen
- CHILL_DEBUG_PRINT("WARNING: empty IR_CONTROL_BLOCK \n");
- }
- }
- break;
+ default:
+ throw ir_error("unrecognized control to merge");
}
- default:
- throw ir_error("unrecognized control to merge");
- }
- } // for each control
+ } // for each control
- return CBlock;
+ return CBlock;
}
@@ -2783,16 +2783,16 @@ IR_Block *IR_clangCode::GetCode() const { // return IR_Block corresponding to
//fprintf(stderr, "sourceManager 0x%x\n", sourceManager);
//bod->print();
- return new IR_chillBlock(this, chillfunc ) ;
+ return new IR_chillBlock(this, chillfunc);
}
void IR_clangCode::ReplaceCode(IR_Control *old, omega::CG_outputRepr *repr) {
- fflush(stdout);
- fprintf(stderr, "IR_xxxxCode::ReplaceCode( old, *repr)\n");
+ fflush(stdout);
+ fprintf(stderr, "IR_xxxxCode::ReplaceCode( old, *repr)\n");
CG_chillRepr *chillrepr = (CG_chillRepr *) repr;
- std::vector<chillAST_node*> newcode = chillrepr->getChillCode();
+ std::vector<chillAST_node *> newcode = chillrepr->getChillCode();
int numnew = newcode.size();
//fprintf(stderr, "new code (%d) is\n", numnew);
@@ -2801,10 +2801,10 @@ void IR_clangCode::ReplaceCode(IR_Control *old, omega::CG_outputRepr *repr) {
// fprintf(stderr, "\n");
//}
- struct IR_chillLoop* cloop;
+ struct IR_chillLoop *cloop;
- std::vector<chillAST_VarDecl*> olddecls;
- chillfunc->gatherVarDecls( olddecls );
+ std::vector<chillAST_VarDecl *> olddecls;
+ chillfunc->gatherVarDecls(olddecls);
//fprintf(stderr, "\n%d old decls they are:\n", olddecls.size());
//for (int i=0; i<olddecls.size(); i++) {
// fprintf(stderr, "olddecl[%d] ox%x ",i, olddecls[i]);
@@ -2814,11 +2814,11 @@ void IR_clangCode::ReplaceCode(IR_Control *old, omega::CG_outputRepr *repr) {
//fprintf(stderr, "num new stmts %d\n", numnew);
//fprintf(stderr, "new code we're look for decls in:\n");
- std::vector<chillAST_VarDecl*> decls;
- for (int i=0; i<numnew; i++) {
+ std::vector<chillAST_VarDecl *> decls;
+ for (int i = 0; i < numnew; i++) {
//newcode[i]->print(0,stderr);
//fprintf(stderr, "\n");
- newcode[i]->gatherVarUsage( decls );
+ newcode[i]->gatherVarUsage(decls);
}
//fprintf(stderr, "\n%d new vars used they are:\n", decls.size());
@@ -2828,21 +2828,21 @@ void IR_clangCode::ReplaceCode(IR_Control *old, omega::CG_outputRepr *repr) {
//}
- for (int i=0; i<decls.size(); i++) {
+ for (int i = 0; i < decls.size(); i++) {
//fprintf(stderr, "\nchecking "); decls[i]->print(); printf("\n"); fflush(stdout);
- int inthere = 0;
- for (int j=0; j<VariableDeclarations.size(); j++) {
- if (VariableDeclarations[j] == decls[i]) {
+ int inthere = 0;
+ for (int j = 0; j < VariableDeclarations.size(); j++) {
+ if (VariableDeclarations[j] == decls[i]) {
//fprintf(stderr, "it's in the Variable Declarations()\n");
}
}
- for (int j=0; j<olddecls.size(); j++) {
- if (decls[i] == olddecls[j]) {
+ for (int j = 0; j < olddecls.size(); j++) {
+ if (decls[i] == olddecls[j]) {
//fprintf(stderr, "it's in the olddecls (exactly)\n");
inthere = 1;
}
- if (streq(decls[i]->varname, olddecls[j]->varname)) {
- if (streq(decls[i]->arraypart, olddecls[j]->arraypart)) {
+ if (streq(decls[i]->varname, olddecls[j]->varname)) {
+ if (streq(decls[i]->arraypart, olddecls[j]->arraypart)) {
//fprintf(stderr, "it's in the olddecls (INEXACTLY)\n");
inthere = 1;
}
@@ -2850,50 +2850,52 @@ void IR_clangCode::ReplaceCode(IR_Control *old, omega::CG_outputRepr *repr) {
}
if (!inthere) {
//fprintf(stderr, "inserting decl[%d] for ",i); decls[i]->print(); printf("\n");fflush(stdout);
- chillfunc->getBody()->insertChild(0, decls[i]);
- olddecls.push_back( decls[i] );
+ chillfunc->getBody()->insertChild(0, decls[i]);
+ olddecls.push_back(decls[i]);
}
}
-
+
chillAST_node *par;
switch (old->type()) {
- case IR_CONTROL_LOOP:
- {
+ case IR_CONTROL_LOOP: {
//fprintf(stderr, "old is IR_CONTROL_LOOP\n");
- cloop = (struct IR_chillLoop* )old;
+ cloop = (struct IR_chillLoop *) old;
chillAST_ForStmt *forstmt = cloop->chillforstmt;
fprintf(stderr, "old was\n");
- forstmt->print(); printf("\n"); fflush(stdout);
+ forstmt->print();
+ printf("\n");
+ fflush(stdout);
//fprintf(stderr, "\nnew code is\n");
//for (int i=0; i<numnew; i++) { newcode[i]->print(); printf("\n"); }
//fflush(stdout);
-
+
par = forstmt->parent;
if (!par) {
- fprintf(stderr, "old parent was NULL\n");
+ fprintf(stderr, "old parent was NULL\n");
fprintf(stderr, "ir_clang.cc that will not work very well.\n");
- exit(-1);
+ exit(-1);
}
-
- fprintf(stderr, "\nold parent was\n\n{\n");
- par->print(); printf("\n"); fflush(stdout);
- fprintf(stderr, "\n}\n");
+ fprintf(stderr, "\nold parent was\n\n{\n");
+ par->print();
+ printf("\n");
+ fflush(stdout);
+ fprintf(stderr, "\n}\n");
- std::vector<chillAST_node*> oldparentcode = par->getChildren(); // probably only works for compoundstmts
+ std::vector<chillAST_node *> oldparentcode = par->getChildren(); // probably only works for compoundstmts
//fprintf(stderr, "ir_clang.cc oldparentcode\n");
// find loop in the parent
int index = -1;
int numstatements = oldparentcode.size();
- for (int i=0; i<numstatements; i++) if (oldparentcode[i] == forstmt) { index = i; }
- if (index == -1) {
- fprintf(stderr, "ir_clang.cc can't find the loop in its parent\n");
- exit(-1);
+ for (int i = 0; i < numstatements; i++) if (oldparentcode[i] == forstmt) { index = i; }
+ if (index == -1) {
+ fprintf(stderr, "ir_clang.cc can't find the loop in its parent\n");
+ exit(-1);
}
//fprintf(stderr, "loop is index %d\n", index);
@@ -2901,96 +2903,105 @@ void IR_clangCode::ReplaceCode(IR_Control *old, omega::CG_outputRepr *repr) {
par->setChild(index, newcode[0]); // overwrite old stmt
//fprintf(stderr, "inserting %s 0x%x as index %d of 0x%x\n", newcode[0]->getTypeString(), newcode[0], index, par);
// do we need to update the IR_cloop?
- cloop->chillforstmt = (chillAST_ForStmt*) newcode[0]; // ?? DFL
+ cloop->chillforstmt = (chillAST_ForStmt *) newcode[0]; // ?? DFL
//printf("inserting "); newcode[0]->print(); printf("\n");
- if (numnew > 1){
+ if (numnew > 1) {
//oldparentcode.insert( oldparentcode.begin()+index+1, numnew-1, NULL); // allocate in bulk
-
+
// add the rest of the new statements
- for (int i=1; i<numnew; i++) {
- printf("inserting "); newcode[i]->print(); printf("\n");
- par->insertChild( index+i, newcode[i] ); // sets parent
+ for (int i = 1; i < numnew; i++) {
+ printf("inserting ");
+ newcode[i]->print();
+ printf("\n");
+ par->insertChild(index + i, newcode[i]); // sets parent
}
}
// TODO add in (insert) variable declarations that go with the new loops
-
- fflush(stdout);
+
+ fflush(stdout);
}
- break;
- case IR_CONTROL_BLOCK:
- CHILL_ERROR("old is IR_CONTROL_BLOCK\n");
- exit(-1);
- //tf_old = static_cast<IR_chillBlock *>(old)->getStmtList()[0];
- break;
- default:
- throw ir_error("control structure to be replaced not supported");
- break;
+ break;
+ case IR_CONTROL_BLOCK:
+ CHILL_ERROR("old is IR_CONTROL_BLOCK\n");
+ exit(-1);
+ //tf_old = static_cast<IR_chillBlock *>(old)->getStmtList()[0];
+ break;
+ default:
+ throw ir_error("control structure to be replaced not supported");
+ break;
}
-
- fflush(stdout);
+
+ fflush(stdout);
//fprintf(stderr, "\nafter inserting %d statements into the Clang IR,", numnew);
CHILL_DEBUG_BEGIN
fprintf(stderr, "new parent2 is\n\n{\n");
- std::vector<chillAST_node*> newparentcode = par->getChildren();
- for (int i=0; i<newparentcode.size(); i++) {
+ std::vector<chillAST_node *> newparentcode = par->getChildren();
+ for (int i = 0; i < newparentcode.size(); i++) {
fflush(stdout);
//fprintf(stderr, "%d ", i);
- newparentcode[i]->print(); printf(";\n"); fflush(stdout);
+ newparentcode[i]->print();
+ printf(";\n");
+ fflush(stdout);
}
fprintf(stderr, "}\n");
CHILL_DEBUG_END
-
}
-
-
void IR_clangCode::ReplaceExpression(IR_Ref *old, omega::CG_outputRepr *repr) {
fprintf(stderr, "IR_xxxxCode::ReplaceExpression()\n");
if (typeid(*old) == typeid(IR_chillArrayRef)) {
//fprintf(stderr, "expressions is IR_chillArrayRef\n");
- IR_chillArrayRef *CAR = (IR_chillArrayRef *)old;
- chillAST_ArraySubscriptExpr* CASE = CAR->chillASE;
- printf("\nreplacing old "); CASE->print(); printf("\n"); fflush(stdout);
-
- omega::CG_chillRepr *crepr = (omega::CG_chillRepr *)repr;
- if (crepr->chillnodes.size() != 1) {
- fprintf(stderr, "IR_clangCode::ReplaceExpression(), replacing with %d chillnodes???\n");
+ IR_chillArrayRef *CAR = (IR_chillArrayRef *) old;
+ chillAST_ArraySubscriptExpr *CASE = CAR->chillASE;
+ printf("\nreplacing old ");
+ CASE->print();
+ printf("\n");
+ fflush(stdout);
+
+ omega::CG_chillRepr *crepr = (omega::CG_chillRepr *) repr;
+ if (crepr->chillnodes.size() != 1) {
+ fprintf(stderr, "IR_clangCode::ReplaceExpression(), replacing with %d chillnodes???\n");
//exit(-1);
}
-
- chillAST_node *newthing = crepr->chillnodes[0];
- fprintf(stderr, "with new "); newthing->print(); printf("\n\n"); fflush(stdout);
- if (!CASE->parent) {
- fprintf(stderr, "IR_clangCode::ReplaceExpression() old has no parent ??\n");
- exit(-1);
+ chillAST_node *newthing = crepr->chillnodes[0];
+ fprintf(stderr, "with new ");
+ newthing->print();
+ printf("\n\n");
+ fflush(stdout);
+
+ if (!CASE->parent) {
+ fprintf(stderr, "IR_clangCode::ReplaceExpression() old has no parent ??\n");
+ exit(-1);
}
fprintf(stderr, "OLD parent = "); // of type %s\n", CASE->parent->getTypeString());
- if (CASE->parent->isImplicitCastExpr()) CASE->parent->parent->print();
- else CASE->parent->print();
- printf("\n"); fflush(stdout);
+ if (CASE->parent->isImplicitCastExpr()) CASE->parent->parent->print();
+ else CASE->parent->print();
+ printf("\n");
+ fflush(stdout);
//CASE->parent->print(); printf("\n"); fflush(stdout);
//CASE->parent->parent->print(); printf("\n"); fflush(stdout);
//CASE->parent->parent->print(); printf("\n"); fflush(stdout);
//CASE->parent->parent->parent->print(); printf("\n"); fflush(stdout);
- CASE->parent->replaceChild( CASE, newthing );
+ CASE->parent->replaceChild(CASE, newthing);
fprintf(stderr, "after replace parent is "); // of type %s\n", CASE->parent->getTypeString());
- if (CASE->parent->isImplicitCastExpr()) CASE->parent->parent->print();
- else CASE->parent->print();
- printf("\n\n"); fflush(stdout);
+ if (CASE->parent->isImplicitCastExpr()) CASE->parent->parent->print();
+ else CASE->parent->print();
+ printf("\n\n");
+ fflush(stdout);
@@ -3000,12 +3011,11 @@ void IR_clangCode::ReplaceExpression(IR_Ref *old, omega::CG_outputRepr *repr) {
//CASE->parent->parent->parent->print(); printf("\n"); fflush(stdout);
- }
- else if (typeid(*old) == typeid(IR_chillScalarRef)) {
- fprintf(stderr, "IR_clangCode::ReplaceExpression() IR_chillScalarRef unhandled\n");
- }
- else {
- fprintf(stderr, "UNKNOWN KIND OF REF\n"); exit(-1);
+ } else if (typeid(*old) == typeid(IR_chillScalarRef)) {
+ fprintf(stderr, "IR_clangCode::ReplaceExpression() IR_chillScalarRef unhandled\n");
+ } else {
+ fprintf(stderr, "UNKNOWN KIND OF REF\n");
+ exit(-1);
}
delete old;
@@ -3018,27 +3028,26 @@ IR_CONDITION_TYPE IR_clangCode::QueryBooleanExpOperation(const omega::CG_outputR
}
-
IR_OPERATION_TYPE IR_clangCode::QueryExpOperation(const omega::CG_outputRepr *repr) const {
//fprintf(stderr, "IR_clangCode::QueryExpOperation()\n");
- CG_chillRepr *crepr = (CG_chillRepr *) repr;
+ CG_chillRepr *crepr = (CG_chillRepr *) repr;
chillAST_node *node = crepr->chillnodes[0];
//fprintf(stderr, "chillAST node type %s\n", node->getTypeString());
// really need to be more rigorous than this hack // TODO
- if (node->isImplicitCastExpr()) node = ((chillAST_ImplicitCastExpr*)node)->subexpr;
- if (node->isCStyleCastExpr()) node = ((chillAST_CStyleCastExpr*) node)->subexpr;
- if (node->isParenExpr()) node = ((chillAST_ParenExpr*) node)->subexpr;
+ if (node->isImplicitCastExpr()) node = ((chillAST_ImplicitCastExpr *) node)->subexpr;
+ if (node->isCStyleCastExpr()) node = ((chillAST_CStyleCastExpr *) node)->subexpr;
+ if (node->isParenExpr()) node = ((chillAST_ParenExpr *) node)->subexpr;
- if (node->isIntegerLiteral() || node->isFloatingLiteral()) return IR_OP_CONSTANT;
+ if (node->isIntegerLiteral() || node->isFloatingLiteral()) return IR_OP_CONSTANT;
else if (node->isBinaryOperator() || node->isUnaryOperator()) {
char *opstring;
- if (node->isBinaryOperator())
- opstring= ((chillAST_BinaryOperator*)node)->op; // TODO enum
+ if (node->isBinaryOperator())
+ opstring = ((chillAST_BinaryOperator *) node)->op; // TODO enum
else
- opstring= ((chillAST_UnaryOperator*)node)->op; // TODO enum
-
+ opstring = ((chillAST_UnaryOperator *) node)->op; // TODO enum
+
if (!strcmp(opstring, "+")) return IR_OP_PLUS;
if (!strcmp(opstring, "-")) return IR_OP_MINUS;
if (!strcmp(opstring, "*")) return IR_OP_MULTIPLY;
@@ -3047,10 +3056,9 @@ IR_OPERATION_TYPE IR_clangCode::QueryExpOperation(const omega::CG_outputRepr *re
CHILL_ERROR("UNHANDLED Binary(or Unary)Operator op type (%s)\n", opstring);
exit(-1);
- }
- else if (node->isDeclRefExpr() ) return IR_OP_VARIABLE; // ??
- //else if (node->is ) return something;
- else {
+ } else if (node->isDeclRefExpr()) return IR_OP_VARIABLE; // ??
+ //else if (node->is ) return something;
+ else {
CHILL_ERROR("IR_clangCode::QueryExpOperation() UNHANDLED NODE TYPE %s\n", node->getTypeString());
exit(-1);
}
@@ -3090,151 +3098,148 @@ IR_OPERATION_TYPE IR_clangCode::QueryExpOperation(const omega::CG_outputRepr *re
}
-std::vector<omega::CG_outputRepr *> IR_clangCode::QueryExpOperand(const omega::CG_outputRepr *repr) const {
+std::vector<omega::CG_outputRepr *> IR_clangCode::QueryExpOperand(const omega::CG_outputRepr *repr) const {
//fprintf(stderr, "IR_clangCode::QueryExpOperand()\n");
std::vector<omega::CG_outputRepr *> v;
-
- CG_chillRepr *crepr = (CG_chillRepr *) repr;
+
+ CG_chillRepr *crepr = (CG_chillRepr *) repr;
//Expr *e = static_cast<const omega::CG_chillRepr *>(repr)->GetExpression(); wrong.. CLANG
chillAST_node *e = crepr->chillnodes[0]; // ??
//e->print(); printf("\n"); fflush(stdout);
// really need to be more rigorous than this hack // TODO
- if (e->isImplicitCastExpr()) e = ((chillAST_ImplicitCastExpr*)e)->subexpr;
- if (e->isCStyleCastExpr()) e = ((chillAST_CStyleCastExpr*) e)->subexpr;
- if (e->isParenExpr()) e = ((chillAST_ParenExpr*) e)->subexpr;
+ if (e->isImplicitCastExpr()) e = ((chillAST_ImplicitCastExpr *) e)->subexpr;
+ if (e->isCStyleCastExpr()) e = ((chillAST_CStyleCastExpr *) e)->subexpr;
+ if (e->isParenExpr()) e = ((chillAST_ParenExpr *) e)->subexpr;
//if(isa<IntegerLiteral>(e) || isa<FloatingLiteral>(e) || isa<DeclRefExpr>(e)) {
- if (e->isIntegerLiteral() || e->isFloatingLiteral() || e->isDeclRefExpr() ) {
+ if (e->isIntegerLiteral() || e->isFloatingLiteral() || e->isDeclRefExpr()) {
//fprintf(stderr, "it's a constant\n");
omega::CG_chillRepr *repr = new omega::CG_chillRepr(e);
v.push_back(repr);
//} else if(BinaryOperator *bop = dyn_cast<BinaryOperator>(e)) {
- } else if (e->isBinaryOperator()) {
+ } else if (e->isBinaryOperator()) {
//fprintf(stderr, "ir_clang.cc BOP TODO\n"); exit(-1); //
- chillAST_BinaryOperator *bop = (chillAST_BinaryOperator*)e;
+ chillAST_BinaryOperator *bop = (chillAST_BinaryOperator *) e;
char *op = bop->op; // TODO enum for operator types
- if (streq(op, "=")) {
- v.push_back(new omega::CG_chillRepr( bop->rhs )); // for assign, return RHS
- }
- else if (streq(op, "+") || streq(op, "-") || streq(op, "*") || streq(op, "/") ) {
- v.push_back(new omega::CG_chillRepr( bop->lhs )); // for +*-/ return both lhs and rhs
- v.push_back(new omega::CG_chillRepr( bop->rhs ));
- }
- else {
+ if (streq(op, "=")) {
+ v.push_back(new omega::CG_chillRepr(bop->rhs)); // for assign, return RHS
+ } else if (streq(op, "+") || streq(op, "-") || streq(op, "*") || streq(op, "/")) {
+ v.push_back(new omega::CG_chillRepr(bop->lhs)); // for +*-/ return both lhs and rhs
+ v.push_back(new omega::CG_chillRepr(bop->rhs));
+ } else {
CHILL_ERROR("Binary Operator UNHANDLED op (%s)\n", op);
exit(-1);
}
} // BinaryOperator
- else if (e->isUnaryOperator()) {
+ else if (e->isUnaryOperator()) {
omega::CG_chillRepr *repr;
- chillAST_UnaryOperator *uop = (chillAST_UnaryOperator*)e;
+ chillAST_UnaryOperator *uop = (chillAST_UnaryOperator *) e;
char *op = uop->op; // TODO enum
if (streq(op, "+") || streq(op, "-")) {
- v.push_back( new omega::CG_chillRepr( uop->subexpr ));
- }
- else {
+ v.push_back(new omega::CG_chillRepr(uop->subexpr));
+ } else {
CHILL_ERROR("ir_clang.cc IR_clangCode::QueryExpOperand() Unary Operator UNHANDLED op (%s)\n", op);
exit(-1);
}
} // unaryoperator
- else {
+ else {
CHILL_ERROR("UNHANDLED node type %s\n", e->getTypeString());
exit(-1);
}
-
- /*
- Expr *op1, *op2;
- switch(bop->getOpcode()) {
- case BO_Assign:
- op2 = bop->getRHS();
- repr = new omega::CG_chillRepr(op2);
- v.push_back(repr);
- break;
- case BO_Add:
- case BO_Sub:
- case BO_Mul:
- case BO_Div:
- op1 = bop->getLHS();
- repr = new omega::CG_chillRepr(op1);
- v.push_back(repr);
- op2 = bop->getRHS();
- repr = new omega::CG_chillRepr(op2);
- v.push_back(repr);
- break;
- default:
- throw ir_error("operation not supported");
- }
- */
- //} else if(UnaryOperator *uop = dyn_cast<UnaryOperator>(e)) {
- //} else if(e->isUnaryOperator()) {
- /*
- omega::CG_chillRepr *repr;
-
- switch(uop->getOpcode()) {
- case UO_Minus:
- case UO_Plus:
- op1 = uop->getSubExpr();
- repr = new omega::CG_chillRepr(op1);
- v.push_back(repr);
- break;
- default:
- throw ir_error("operation not supported");
- }
- */
- //} else if(ConditionalOperator *cop = dyn_cast<ConditionalOperator>(e)) {
- //omega::CG_chillRepr *repr;
-
- // TODO: Handle conditional operator here
- //} else throw ir_error("operand type UNsupported");
-
+
+ /*
+Expr *op1, *op2;
+ switch(bop->getOpcode()) {
+ case BO_Assign:
+ op2 = bop->getRHS();
+ repr = new omega::CG_chillRepr(op2);
+ v.push_back(repr);
+ break;
+ case BO_Add:
+ case BO_Sub:
+ case BO_Mul:
+ case BO_Div:
+ op1 = bop->getLHS();
+ repr = new omega::CG_chillRepr(op1);
+ v.push_back(repr);
+ op2 = bop->getRHS();
+ repr = new omega::CG_chillRepr(op2);
+ v.push_back(repr);
+ break;
+ default:
+ throw ir_error("operation not supported");
+ }
+ */
+ //} else if(UnaryOperator *uop = dyn_cast<UnaryOperator>(e)) {
+ //} else if(e->isUnaryOperator()) {
+ /*
+ omega::CG_chillRepr *repr;
+
+ switch(uop->getOpcode()) {
+ case UO_Minus:
+ case UO_Plus:
+ op1 = uop->getSubExpr();
+ repr = new omega::CG_chillRepr(op1);
+ v.push_back(repr);
+ break;
+ default:
+ throw ir_error("operation not supported");
+ }
+ */
+ //} else if(ConditionalOperator *cop = dyn_cast<ConditionalOperator>(e)) {
+ //omega::CG_chillRepr *repr;
+
+ // TODO: Handle conditional operator here
+ //} else throw ir_error("operand type UNsupported");
+
return v;
}
IR_Ref *IR_clangCode::Repr2Ref(const omega::CG_outputRepr *repr) const {
- CG_chillRepr *crepr = (CG_chillRepr *) repr;
- chillAST_node *node = crepr->chillnodes[0];
-
+ CG_chillRepr *crepr = (CG_chillRepr *) repr;
+ chillAST_node *node = crepr->chillnodes[0];
+
//Expr *e = static_cast<const omega::CG_chillRep *>(repr)->GetExpression();
- if(node->isIntegerLiteral()) {
+ if (node->isIntegerLiteral()) {
// FIXME: Not sure if it'll work in all cases (long?)
- int val = ((chillAST_IntegerLiteral*)node)->value;
- return new IR_chillConstantRef(this, static_cast<omega::coef_t>(val) );
- } else if(node->isFloatingLiteral()) {
- float val = ((chillAST_FloatingLiteral*)node)->value;
- return new IR_chillConstantRef(this, val );
- } else if(node->isDeclRefExpr()) {
+ int val = ((chillAST_IntegerLiteral *) node)->value;
+ return new IR_chillConstantRef(this, static_cast<omega::coef_t>(val));
+ } else if (node->isFloatingLiteral()) {
+ float val = ((chillAST_FloatingLiteral *) node)->value;
+ return new IR_chillConstantRef(this, val);
+ } else if (node->isDeclRefExpr()) {
//fprintf(stderr, "ir_clang.cc IR_clangCode::Repr2Ref() declrefexpr TODO\n"); exit(-1);
- return new IR_chillScalarRef(this, (chillAST_DeclRefExpr*)node); // uses DRE
- } else {
- fprintf(stderr, "ir_clang.cc IR_clangCode::Repr2Ref() UNHANDLED node type %s\n", node->getTypeString());
- exit(-1);
+ return new IR_chillScalarRef(this, (chillAST_DeclRefExpr *) node); // uses DRE
+ } else {
+ fprintf(stderr, "ir_clang.cc IR_clangCode::Repr2Ref() UNHANDLED node type %s\n", node->getTypeString());
+ exit(-1);
//assert(0);
}
}
-chillAST_node * ConvertMemberExpr( clang::MemberExpr *clangME , chillAST_node *) {
- fprintf(stderr, "ConvertMemberExpr()\n");
-
- clang::Expr *E = clangME->getBase();
+chillAST_node *ConvertMemberExpr(clang::MemberExpr *clangME, chillAST_node *) {
+ fprintf(stderr, "ConvertMemberExpr()\n");
+
+ clang::Expr *E = clangME->getBase();
E->dump();
- chillAST_node *base = ConvertGenericClangAST( clangME->getBase(), NULL );
+ chillAST_node *base = ConvertGenericClangAST(clangME->getBase(), NULL);
- DeclarationNameInfo memnameinfo = clangME->getMemberNameInfo();
+ DeclarationNameInfo memnameinfo = clangME->getMemberNameInfo();
DeclarationName DN = memnameinfo.getName();
const char *member = DN.getAsString().c_str();
//fprintf(stderr, "%s\n", DN.getAsString().c_str());
- chillAST_MemberExpr *ME = new chillAST_MemberExpr( base, member, NULL, clangME );
+ chillAST_MemberExpr *ME = new chillAST_MemberExpr(base, member, NULL, clangME);
- fprintf(stderr, "this is the Member Expresion\n");
- ME->print();
- fprintf(stderr, "\n");
+ fprintf(stderr, "this is the Member Expresion\n");
+ ME->print();
+ fprintf(stderr, "\n");
+
+ return ME;
- return ME;
-
}
diff --git a/src/irtools.cc b/src/irtools.cc
index d8d234f..68c9eac 100644
--- a/src/irtools.cc
+++ b/src/irtools.cc
@@ -23,113 +23,113 @@ using namespace omega;
// Build Chill IR tree from the source code (from the front end compiler's AST).
// Block type node can only be a leaf, i.e., there are no further structures
// inside a block allowed.
-std::vector<ir_tree_node *> build_ir_tree(IR_Control *control,
+std::vector<ir_tree_node *> build_ir_tree(IR_Control *control,
ir_tree_node *parent) {
std::vector<ir_tree_node *> result;
-
+
CHILL_DEBUG_PRINT("building a CHILL IR tree \n");
switch (control->type()) {
- case IR_CONTROL_BLOCK: {
- CHILL_DEBUG_PRINT("case IR_CONTROL_BLOCK\n");
- IR_Block *IRCB = static_cast<IR_Block *>(control);
- std::vector<IR_Control *> controls = control->ir_->FindOneLevelControlStructure(IRCB);
+ case IR_CONTROL_BLOCK: {
+ CHILL_DEBUG_PRINT("case IR_CONTROL_BLOCK\n");
+ IR_Block *IRCB = static_cast<IR_Block *>(control);
+ std::vector<IR_Control *> controls = control->ir_->FindOneLevelControlStructure(IRCB);
+
+
+ CHILL_DEBUG_PRINT("BACK FROM FindOneLevelControlStructure() %d controls\n", controls.size());
+
+ if (controls.size() == 0) {
+ CHILL_DEBUG_PRINT("controls.size() == 0\n");
- CHILL_DEBUG_PRINT( "BACK FROM FindOneLevelControlStructure() %d controls\n", controls.size());
+ ir_tree_node *node = new ir_tree_node;
+ node->content = control;
+ node->parent = parent;
+ node->payload = -1;
+ result.push_back(node);
+ } else {
+ CHILL_DEBUG_PRINT("controls.size() == %d (NONZERO)\n", controls.size());
+ delete control;
+
+ for (int i = 0; i < controls.size(); i++)
+ switch (controls[i]->type()) {
+ case IR_CONTROL_BLOCK: {
+ CHILL_DEBUG_PRINT("controls[%d] is IR_CONTROL_BLOCK\n", i);
+ std::vector<ir_tree_node *> t = build_ir_tree(controls[i], parent);
+ result.insert(result.end(), t.begin(), t.end());
+ break;
+ }
+ case IR_CONTROL_LOOP: {
+ CHILL_DEBUG_PRINT("controls[%d] is IR_CONTROL_LOOP\n", i);
+ ir_tree_node *node = new ir_tree_node;
+ node->content = controls[i];
+ node->parent = parent;
+ node->children = build_ir_tree(static_cast<IR_Loop *>(controls[i])->body(), node); // recurse
+ node->payload = -1;
+ result.push_back(node);
+ break;
+ }
+ case IR_CONTROL_IF: {
+ CHILL_DEBUG_PRINT("controls[%d] is IR_CONTROL_IF\n", i);
+ static int unique_if_identifier = 0;
+
+ IR_If *theif = static_cast<IR_If *>(controls[i]);
+ IR_Block *block = theif->then_body();
+ if (block != NULL) {
+ ir_tree_node *node = new ir_tree_node;
+ node->content = controls[i];
+ node->parent = parent;
+ node->children = build_ir_tree(block, node); // recurse
+ node->payload = unique_if_identifier + 1;
+ result.push_back(node);
+ }
- if (controls.size() == 0) {
- CHILL_DEBUG_PRINT("controls.size() == 0\n");
+ block = theif->else_body();
+ if (block != NULL) {
+ CHILL_DEBUG_PRINT("IF_CONTROL has an else\n");
+ ir_tree_node *node = new ir_tree_node;
+ node->content = controls[i]->clone();
+ node->parent = parent;
+ node->children = build_ir_tree(block, node); // recurse
+ node->payload = unique_if_identifier;
+ result.push_back(node);
+ }
+ unique_if_identifier += 2;
+ break;
+ }
+ default:
+ ir_tree_node *node = new ir_tree_node;
+ node->content = controls[i];
+ node->parent = parent;
+ node->payload = -1;
+ result.push_back(node);
+ break;
+ }
+ }
+ break;
+ }
+ case IR_CONTROL_LOOP: {
+ CHILL_DEBUG_PRINT("case IR_CONTROL_LOOP\n");
ir_tree_node *node = new ir_tree_node;
- node->content = control;
- node->parent = parent;
+ node->content = control;
+ node->parent = parent;
+ CHILL_DEBUG_PRINT("recursing. build_ir_tree() of CONTROL_LOOP creating children L122\n");
+ node->children = build_ir_tree(
+ static_cast<const IR_Loop *>(control)->body(), node);
node->payload = -1;
result.push_back(node);
+ CHILL_DEBUG_PRINT("recursing. build_ir_tree() of CONTROL_LOOP creating children DONE\n");
+ break;
}
- else {
- CHILL_DEBUG_PRINT("controls.size() == %d (NONZERO)\n", controls.size());
- delete control;
-
- for (int i = 0; i < controls.size(); i++)
- switch (controls[i]->type()) {
- case IR_CONTROL_BLOCK: {
- CHILL_DEBUG_PRINT("controls[%d] is IR_CONTROL_BLOCK\n", i);
- std::vector<ir_tree_node *> t = build_ir_tree(controls[i], parent);
- result.insert(result.end(), t.begin(), t.end());
- break;
- }
- case IR_CONTROL_LOOP: {
- CHILL_DEBUG_PRINT("controls[%d] is IR_CONTROL_LOOP\n", i);
- ir_tree_node *node = new ir_tree_node;
- node->content = controls[i];
- node->parent = parent;
- node->children = build_ir_tree(static_cast<IR_Loop *>(controls[i])->body(), node); // recurse
- node->payload = -1;
- result.push_back(node);
- break;
- }
- case IR_CONTROL_IF: {
- CHILL_DEBUG_PRINT("controls[%d] is IR_CONTROL_IF\n", i);
- static int unique_if_identifier = 0;
-
- IR_If* theif = static_cast<IR_If *>(controls[i]);
- IR_Block *block = theif->then_body();
- if (block != NULL) {
- ir_tree_node *node = new ir_tree_node;
- node->content = controls[i];
- node->parent = parent;
- node->children = build_ir_tree(block, node); // recurse
- node->payload = unique_if_identifier+1;
- result.push_back(node);
- }
-
-
- block = theif->else_body();
- if (block != NULL) {
- CHILL_DEBUG_PRINT("IF_CONTROL has an else\n");
- ir_tree_node *node = new ir_tree_node;
- node->content = controls[i]->clone();
- node->parent = parent;
- node->children = build_ir_tree(block, node); // recurse
- node->payload = unique_if_identifier;
- result.push_back(node);
- }
- unique_if_identifier += 2;
- break;
- }
- default:
- ir_tree_node *node = new ir_tree_node;
- node->content = controls[i];
- node->parent = parent;
- node->payload = -1;
- result.push_back(node);
- break;
- }
- }
- break;
- }
- case IR_CONTROL_LOOP: {
- CHILL_DEBUG_PRINT("case IR_CONTROL_LOOP\n");
- ir_tree_node *node = new ir_tree_node;
- node->content = control;
- node->parent = parent;
- CHILL_DEBUG_PRINT("recursing. build_ir_tree() of CONTROL_LOOP creating children L122\n");
- node->children = build_ir_tree(
- static_cast<const IR_Loop *>(control)->body(), node);
- node->payload = -1;
- result.push_back(node);
- CHILL_DEBUG_PRINT("recursing. build_ir_tree() of CONTROL_LOOP creating children DONE\n");
- break;
- }
- default:
- ir_tree_node *node = new ir_tree_node;
- node->content = control;
- node->parent = parent;
- node->payload = -1;
- result.push_back(node);
- break;
+ default:
+ ir_tree_node *node = new ir_tree_node;
+ node->content = control;
+ node->parent = parent;
+ node->payload = -1;
+ result.push_back(node);
+ break;
}
-
+
CHILL_DEBUG_PRINT("build_ir_tree() vector result has %ld parts\n", result.size());
return result;
}
@@ -144,46 +144,51 @@ std::vector<ir_tree_node *> extract_ir_stmts(const std::vector<ir_tree_node *> &
for (int i = 0; i < ir_tree.size(); i++)
switch (ir_tree[i]->content->type()) {
- case IR_CONTROL_BLOCK:
- CHILL_DEBUG_PRINT("IR_CONTROL_BLOCK\n");
- result.push_back(ir_tree[i]);
- break;
+ case IR_CONTROL_BLOCK:
+ CHILL_DEBUG_PRINT("IR_CONTROL_BLOCK\n");
+ result.push_back(ir_tree[i]);
+ break;
- case IR_CONTROL_LOOP: {
- CHILL_DEBUG_PRINT("IR_CONTROL_LOOP( recursing )\n");
- // clear loop payload from previous unsuccessful initialization process
- ir_tree[i]->payload = -1;
-
- std::vector<ir_tree_node *> t = extract_ir_stmts(ir_tree[i]->children);
-
- result.insert(result.end(), t.begin(), t.end());
- break;
- }
- case IR_CONTROL_IF: {
- CHILL_DEBUG_PRINT("IR_CONTROL_IF( recursing )\n");
- std::vector<ir_tree_node *> t = extract_ir_stmts(ir_tree[i]->children);
- result.insert(result.end(), t.begin(), t.end());
- break;
- }
- default:
- throw std::invalid_argument("invalid ir tree");
+ case IR_CONTROL_LOOP: {
+ CHILL_DEBUG_PRINT("IR_CONTROL_LOOP( recursing )\n");
+ // clear loop payload from previous unsuccessful initialization process
+ ir_tree[i]->payload = -1;
+
+ std::vector<ir_tree_node *> t = extract_ir_stmts(ir_tree[i]->children);
+
+ result.insert(result.end(), t.begin(), t.end());
+ break;
+ }
+ case IR_CONTROL_IF: {
+ CHILL_DEBUG_PRINT("IR_CONTROL_IF( recursing )\n");
+ std::vector<ir_tree_node *> t = extract_ir_stmts(ir_tree[i]->children);
+ result.insert(result.end(), t.begin(), t.end());
+ break;
+ }
+ default:
+ throw std::invalid_argument("invalid ir tree");
}
-
+
return result;
}
-std::string chill_ir_control_type_string( IR_CONTROL_TYPE type ) {
- switch(type) {
- case IR_CONTROL_BLOCK: return std::string( "IR_CONTROL_BLOCK");
- case IR_CONTROL_LOOP: return std::string( "IR_CONTROL_LOOP" );
- case IR_CONTROL_IF: return std::string( "IR_CONTROL_IF" );
- case IR_CONTROL_WHILE: return std::string( "IR_CONTROL_WHLIE");
- default: return std::string( "UNKNOWN_IR_NODE_TYPE" );
+std::string chill_ir_control_type_string(IR_CONTROL_TYPE type) {
+ switch (type) {
+ case IR_CONTROL_BLOCK:
+ return std::string("IR_CONTROL_BLOCK");
+ case IR_CONTROL_LOOP:
+ return std::string("IR_CONTROL_LOOP");
+ case IR_CONTROL_IF:
+ return std::string("IR_CONTROL_IF");
+ case IR_CONTROL_WHILE:
+ return std::string("IR_CONTROL_WHLIE");
+ default:
+ return std::string("UNKNOWN_IR_NODE_TYPE");
}
}
-std::string chill_ir_node_type_string( ir_tree_node *node ) {
- return chill_ir_control_type_string( node->content->type() );
+std::string chill_ir_node_type_string(ir_tree_node *node) {
+ return chill_ir_control_type_string(node->content->type());
}
@@ -191,14 +196,14 @@ bool is_dependence_valid(ir_tree_node *src_node, ir_tree_node *dst_node,
const DependenceVector &dv, bool before) {
std::set<ir_tree_node *> loop_nodes;
ir_tree_node *itn = src_node;
-
+
if (!dv.is_scalar_dependence) {
while (itn->parent != NULL) {
itn = itn->parent;
if (itn->content->type() == IR_CONTROL_LOOP)
loop_nodes.insert(itn);
}
-
+
int last_dim = -1;
itn = dst_node;
while (itn->parent != NULL) {
@@ -208,25 +213,25 @@ bool is_dependence_valid(ir_tree_node *src_node, ir_tree_node *dst_node,
&& itn->payload > last_dim)
last_dim = itn->payload;
}
-
+
if (last_dim == -1)
return true;
-
+
for (int i = 0; i <= last_dim; i++) {
if (dv.lbounds[i] > 0)
return true;
else if (dv.lbounds[i] < 0)
return false;
}
-
+
if (before)
return true;
else
return false;
}
-
+
return true;
-
+
}
@@ -234,31 +239,31 @@ bool is_dependence_valid(ir_tree_node *src_node, ir_tree_node *dst_node,
//enclosing a statement
std::vector<omega::CG_outputRepr *> collect_loop_inductive_and_conditionals(
- ir_tree_node * stmt_node) {
-
+ ir_tree_node *stmt_node) {
+
std::vector<omega::CG_outputRepr *> to_return;
ir_tree_node *itn = stmt_node;
-
+
while (itn->parent != NULL) {
itn = itn->parent;
-
+
switch (itn->content->type()) {
- case IR_CONTROL_LOOP: {
- IR_Loop *lp = static_cast<IR_Loop *>(itn->content);
- to_return.push_back(lp->lower_bound());
- to_return.push_back(lp->upper_bound());
-
- break;
- }
- case IR_CONTROL_IF: {
- CG_outputRepr *cond =
- static_cast<IR_If *>(itn->content)->condition();
-
- to_return.push_back(cond);
- break;
- }
- default:
- throw std::invalid_argument("invalid ir tree");
+ case IR_CONTROL_LOOP: {
+ IR_Loop *lp = static_cast<IR_Loop *>(itn->content);
+ to_return.push_back(lp->lower_bound());
+ to_return.push_back(lp->upper_bound());
+
+ break;
+ }
+ case IR_CONTROL_IF: {
+ CG_outputRepr *cond =
+ static_cast<IR_If *>(itn->content)->condition();
+
+ to_return.push_back(cond);
+ break;
+ }
+ default:
+ throw std::invalid_argument("invalid ir tree");
}
}
return to_return;
@@ -271,36 +276,46 @@ std::vector<omega::CG_outputRepr *> collect_loop_inductive_and_conditionals(
// positive. The first vector in returned pair is dependences from the
// first statement to the second statement and the second vector in
// returned pair is in reverse order.
-std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> >
-test_data_dependences(IR_Code *ir,
- const CG_outputRepr *repr1,
+std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> >
+test_data_dependences(IR_Code *ir,
+ const CG_outputRepr *repr1,
const Relation &IS1,
- const CG_outputRepr *repr2,
+ const CG_outputRepr *repr2,
const Relation &IS2,
- std::vector<Free_Var_Decl*> &freevar,
+ std::vector<Free_Var_Decl *> &freevar,
std::vector<std::string> index,
- int nestLeveli,
- int nestLevelj,
- std::map<std::string, std::vector<omega::CG_outputRepr * > > &uninterpreted_symbols,
- std::map<std::string, std::vector<omega::CG_outputRepr * > > &uninterpreted_symbols_stringrepr) {
+ int nestLeveli,
+ int nestLevelj,
+ std::map<std::string, std::vector<omega::CG_outputRepr *> > &uninterpreted_symbols,
+ std::map<std::string, std::vector<omega::CG_outputRepr *> > &uninterpreted_symbols_stringrepr) {
CHILL_DEBUG_BEGIN
fprintf(stderr, "\nirtools.cc test_data_dependences() %d freevars\n", freevar.size());
- fprintf(stderr, "\nrepr1 %p ", repr1); repr1->dump(); fflush(stdout);
- fprintf(stderr, "\nrepr2 %p ", repr2); repr2->dump(); fflush(stdout);
+ fprintf(stderr, "\nrepr1 %p ", repr1);
+ repr1->dump();
+ fflush(stdout);
+ fprintf(stderr, "\nrepr2 %p ", repr2);
+ repr2->dump();
+ fflush(stdout);
- for (int i=0; i<index.size(); i++) fprintf(stderr, "index %d %s\n", i, index[i].c_str());
- Relation *helper = new Relation(IS1); fprintf(stderr, "IS1 "); helper->print(); fflush(stdout);
- helper = new Relation(IS2); fprintf(stderr, "IS2 "); helper->print(); fflush(stdout);
+ for (int i = 0; i < index.size(); i++) fprintf(stderr, "index %d %s\n", i, index[i].c_str());
+ Relation *helper = new Relation(IS1);
+ fprintf(stderr, "IS1 ");
+ helper->print();
+ fflush(stdout);
+ helper = new Relation(IS2);
+ fprintf(stderr, "IS2 ");
+ helper->print();
+ fflush(stdout);
CHILL_DEBUG_END
//for (int i=0; i<freevar.size(); i++) {
// std::string shit = (const std::string)(freevar[i]->base_name());
-
+
// fprintf(stderr, "freevar %d %s\n", i, shit.c_str());
//}
-
+
std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > result;
-
+
if (repr1 == repr2) {
CHILL_DEBUG_BEGIN
fprintf(stderr, "repr1 == repr2\nrepr1->dump()\n");
@@ -312,14 +327,13 @@ test_data_dependences(IR_Code *ir,
CHILL_DEBUG_PRINT("access of size %d\n", access.size());
for (int i = 0; i < access.size(); i++) {
IR_ArrayRef *a = access[i];
-
- if (a->is_write()) {
+
+ if (a->is_write()) {
CHILL_DEBUG_PRINT("WRITE array access %d = %s\n", i, a->name().c_str());
- }
- else {
+ } else {
CHILL_DEBUG_PRINT(" array access %d = %s\n", i, a->name().c_str());
- }
- }
+ }
+ }
CHILL_DEBUG_PRINT("that was the list\n\n");
// Manu:: variables/structures added to identify dependence vectors related to reduction operation
@@ -330,16 +344,16 @@ test_data_dependences(IR_Code *ir,
std::set<int> tnrStmts;
int stmtId = 1;
int tempStmtId = 1;
- std::map<int,std::set<int> > rMap; // This maps statement number to a set of dependences
+ std::map<int, std::set<int> > rMap; // This maps statement number to a set of dependences
std::map<int, std::set<int> >::iterator itMap;
for (int i = 0; i < access.size(); i++) {
ref2Stmt[i] = -1;
}
-
+
// Manu -- changes for identifying possible reduction operation
// The below loop nest is used to classify array references into different statements
CHILL_DEBUG_PRINT("\nbefore mapRefstoStatements()\n");
- mapRefstoStatements(ir,access,ref2Stmt,rMap,tnrStmts,nrStmts);
+ mapRefstoStatements(ir, access, ref2Stmt, rMap, tnrStmts, nrStmts);
CHILL_DEBUG_PRINT("after mapRefstoStatements()\n\n");
//-------------------------------------------------------------
@@ -348,92 +362,98 @@ test_data_dependences(IR_Code *ir,
lbound[0] = lbound[1] = lbound[2] = LLONG_MAX;
ubound[0] = ubound[1] = ubound[2] = LLONG_MIN;
//-------------------------------------------------------------
-
+
for (int i = 0; i < access.size(); i++) {
- fprintf(stderr, "i %d\n", i);
+ fprintf(stderr, "i %d\n", i);
IR_ArrayRef *a = access[i];
IR_ArraySymbol *sym_a = a->symbol();
- fprintf(stderr, "sym_a = %s\n", a->name().c_str());
+ fprintf(stderr, "sym_a = %s\n", a->name().c_str());
for (int j = i; j < access.size(); j++) {
- fprintf(stderr, "irtools.cc j %d\n", j);
+ fprintf(stderr, "irtools.cc j %d\n", j);
IR_ArrayRef *b = access[j];
IR_ArraySymbol *sym_b = b->symbol();
- fprintf(stderr, "sym_b = %s\n", b->name().c_str());
-
- fprintf(stderr, "irtools.cc ij %d %d\n", i, j);
-
- if (*sym_a == *sym_b) fprintf(stderr, "*sym_a == *sym_b\n");
+ fprintf(stderr, "sym_b = %s\n", b->name().c_str());
+
+ fprintf(stderr, "irtools.cc ij %d %d\n", i, j);
+
+ if (*sym_a == *sym_b) fprintf(stderr, "*sym_a == *sym_b\n");
else fprintf(stderr, "*sym_a NOT == *sym_b\n");
- if ( a->is_write()) fprintf(stderr, "%d a->is_write()\n", i);
- else fprintf(stderr, "%d a->is_NOT_write()\n", i);
- if ( b->is_write()) fprintf(stderr, "%d b->is_write()\n", j);
- else fprintf(stderr, "%d b->is_NOT_write()\n", j);
+ if (a->is_write()) fprintf(stderr, "%d a->is_write()\n", i);
+ else fprintf(stderr, "%d a->is_NOT_write()\n", i);
+ if (b->is_write()) fprintf(stderr, "%d b->is_write()\n", j);
+ else fprintf(stderr, "%d b->is_NOT_write()\n", j);
if (*sym_a == *sym_b && (a->is_write() || b->is_write())) {
- Relation r = arrays2relation(ir, freevar, a, IS1, b, IS2,uninterpreted_symbols,uninterpreted_symbols_stringrepr);
+ Relation r = arrays2relation(ir, freevar, a, IS1, b, IS2, uninterpreted_symbols,
+ uninterpreted_symbols_stringrepr);
CHILL_DEBUG_BEGIN
- fprintf(stderr, "\nirtools.cc ij %d %d SYMBOL A == SYMBOL B and one is a write\n", i, j);
- Relation *helper = new Relation(r); fprintf(stderr, "r "); helper->print(); fflush(stdout);
+ fprintf(stderr, "\nirtools.cc ij %d %d SYMBOL A == SYMBOL B and one is a write\n", i, j);
+ Relation *helper = new Relation(r);
+ fprintf(stderr, "r ");
+ helper->print();
+ fflush(stdout);
CHILL_DEBUG_END
- fprintf(stderr, "1\n");
+ fprintf(stderr, "1\n");
std::pair<std::vector<DependenceVector>,
- std::vector<DependenceVector> > dv =
- relation2dependences(a, b, r);
- fprintf(stderr, "\nirtools.cc ij %d %d dv.first %d dv.second %d\n", i, j, dv.first.size(), dv.second.size());
- fprintf(stderr, "2");
- result.first.insert(result.first.end(), dv.first.begin(),
+ std::vector<DependenceVector> > dv =
+ relation2dependences(a, b, r);
+ fprintf(stderr, "\nirtools.cc ij %d %d dv.first %d dv.second %d\n", i, j, dv.first.size(),
+ dv.second.size());
+ fprintf(stderr, "2");
+ result.first.insert(result.first.end(), dv.first.begin(),
dv.first.end());
- fprintf(stderr, "3");
+ fprintf(stderr, "3");
result.second.insert(result.second.end(), dv.second.begin(),
dv.second.end());
- fprintf(stderr, "4");
+ fprintf(stderr, "4");
// Manu:: check if the array references belong to the same statement
// If yes, set the flag in the dependence vector
//----------------------------------------------
- if(DEP_DEBUG){
+ if (DEP_DEBUG) {
std::cout << "Size of the dependence vector '" << a->name().c_str() << "' -- " << dv.first.size() << "\n";
std::cout << "------------ Printing dependence vector START ---------------\n";
-
- for (std::vector<DependenceVector>::iterator itd = dv.first.begin(); itd != dv.first.end(); itd++){
+
+ for (std::vector<DependenceVector>::iterator itd = dv.first.begin(); itd != dv.first.end(); itd++) {
if (itd->type == DEP_R2W)
- std::cout<<"WAR\n";
+ std::cout << "WAR\n";
else if (itd->type == DEP_W2R)
- std::cout<<"RAW\n";
+ std::cout << "RAW\n";
else if (itd->type == DEP_W2W)
- std::cout<<"WAW\n";
-
+ std::cout << "WAW\n";
+
std::vector<omega::coef_t>::iterator itu = itd->ubounds.begin();
- for (std::vector<omega::coef_t>::iterator itl = itd->lbounds.begin(); itl != itd->lbounds.end(); itl++){
+ for (std::vector<omega::coef_t>::iterator itl = itd->lbounds.begin(); itl != itd->lbounds.end(); itl++) {
std::cout << "(" << *itl << ", " << *itu << ")\n";
itu++;
}
}
std::cout << "--------\n";
- for (std::vector<DependenceVector>::iterator itd = dv.second.begin(); itd != dv.second.end(); itd++){
+ for (std::vector<DependenceVector>::iterator itd = dv.second.begin(); itd != dv.second.end(); itd++) {
if (itd->type == DEP_R2W)
- std::cout<<"WAR\n";
+ std::cout << "WAR\n";
else if (itd->type == DEP_W2R)
- std::cout<<"RAW\n";
+ std::cout << "RAW\n";
else if (itd->type == DEP_W2W)
- std::cout<<"WAW\n";
-
+ std::cout << "WAW\n";
+
std::vector<omega::coef_t>::iterator itu = itd->ubounds.begin();
- for (std::vector<omega::coef_t>::iterator itl = itd->lbounds.begin(); itl != itd->lbounds.end(); itl++){
+ for (std::vector<omega::coef_t>::iterator itl = itd->lbounds.begin(); itl != itd->lbounds.end(); itl++) {
std::cout << "(" << *itl << ", " << *itu << ")\n";
itu++;
}
}
std::cout << "------------ Printing dependence vector END---------------\n";
}
- checkReductionDependence(i,j,nestLeveli,lbound,ubound,ref2Stmt,rMap,dv,trMap,nrStmts);
+ checkReductionDependence(i, j, nestLeveli, lbound, ubound, ref2Stmt, rMap, dv, trMap, nrStmts);
//----------------------------------------------
-
+
// // Manu:: original code without the condition
if (((rMap.find(ref2Stmt[i])->second).size() != 3) || (lbound[0] != lbound[1]) || (lbound[1] != lbound[2]) ||
- (lbound[0] != lbound[2]) || (ubound[0] != ubound[1]) || (ubound[1] != ubound[2]) || (ubound[0] != ubound[2])) { // Manu:: original code without the condition
+ (lbound[0] != lbound[2]) || (ubound[0] != ubound[1]) || (ubound[1] != ubound[2]) ||
+ (ubound[0] != ubound[2])) { // Manu:: original code without the condition
result.first.insert(result.first.end(),
dv.first.begin(), dv.first.end());
result.second.insert(result.second.end(),
@@ -446,7 +466,7 @@ test_data_dependences(IR_Code *ir,
}
delete sym_a;
}
-
+
// Manu
for (ittrMap = trMap.begin(); ittrMap != trMap.end(); ittrMap++) {
DVPair tdv = ittrMap->second;
@@ -455,29 +475,30 @@ test_data_dependences(IR_Code *ir,
result.second.insert(result.second.end(), tdv.second.begin(),
tdv.second.end());
}
-
+
for (int i = 0; i < access.size(); i++)
delete access[i];
} else {
- fprintf(stderr, "\nrepr1 != repr2\n");
+ fprintf(stderr, "\nrepr1 != repr2\n");
std::vector<IR_ArrayRef *> access1 = ir->FindArrayRef(repr1);
std::vector<IR_ArrayRef *> access2 = ir->FindArrayRef(repr2);
-
+
for (int i = 0; i < access1.size(); i++) {
- fprintf(stderr, "i %d\n", i);
+ fprintf(stderr, "i %d\n", i);
IR_ArrayRef *a = access1[i];
IR_ArraySymbol *sym_a = a->symbol();
-
+
for (int j = 0; j < access2.size(); j++) {
IR_ArrayRef *b = access2[j];
IR_ArraySymbol *sym_b = b->symbol();
if (*sym_a == *sym_b && (a->is_write() || b->is_write())) {
- Relation r = arrays2relation(ir, freevar, a, IS1, b, IS2, uninterpreted_symbols,uninterpreted_symbols_stringrepr);
+ Relation r = arrays2relation(ir, freevar, a, IS1, b, IS2, uninterpreted_symbols,
+ uninterpreted_symbols_stringrepr);
std::pair<std::vector<DependenceVector>,
- std::vector<DependenceVector> > dv =
- relation2dependences(a, b, r);
-
+ std::vector<DependenceVector> > dv =
+ relation2dependences(a, b, r);
+
result.first.insert(result.first.end(), dv.first.begin(),
dv.first.end());
result.second.insert(result.second.end(), dv.second.begin(),
@@ -487,7 +508,7 @@ test_data_dependences(IR_Code *ir,
}
delete sym_a;
}
-
+
for (int i = 0; i < access1.size(); i++)
delete access1[i];
for (int i = 0; i < access2.size(); i++)
@@ -507,8 +528,9 @@ test_data_dependences(IR_Code *ir,
result.second.insert(result.second.end(), dv.second.begin(),
dv.second.end());
*/
-
- fprintf(stderr, "LEAVING test_data_dependences() first size %d second size %d\n\n", result.first.size(), result.second.size());
+
+ fprintf(stderr, "LEAVING test_data_dependences() first size %d second size %d\n\n", result.first.size(),
+ result.second.size());
return result;
}
@@ -516,13 +538,13 @@ test_data_dependences(IR_Code *ir,
//Manu:: This function tests if two references are from the same statement
//CG_outputRepr * from_same_statement(IR_Code *ir, IR_ArrayRef *a, IR_ArrayRef *b) {
bool from_same_statement(IR_Code *ir, IR_ArrayRef *a, IR_ArrayRef *b) {
- return ir->FromSameStmt(a,b);
+ return ir->FromSameStmt(a, b);
}
// Manu
int stmtType(IR_Code *ir, const CG_outputRepr *repr) {
- fprintf(stderr, "stmtType() DIE \n");
- exit(-1);
+ fprintf(stderr, "stmtType() DIE \n");
+ exit(-1);
return (ir->getStmtType(repr)); /// AIEEE returns a meaningless number encoding rose internals.
}
@@ -532,8 +554,10 @@ IR_OPERATION_TYPE getReductionOperator(IR_Code *ir, const CG_outputRepr *repr) {
}
// Manu:: map references to its corresponding statements
-void mapRefstoStatements(IR_Code *ir, std::vector<IR_ArrayRef *> access, int ref2Stmt[], std::map<int,std::set<int> >& rMap, std::set<int>& tnrStmts, std::set<int>& nrStmts) {
-
+void
+mapRefstoStatements(IR_Code *ir, std::vector<IR_ArrayRef *> access, int ref2Stmt[], std::map<int, std::set<int> > &rMap,
+ std::set<int> &tnrStmts, std::set<int> &nrStmts) {
+
int stmtId = 1;
for (int i = 0; i < access.size(); i++) {
IR_ArrayRef *a = access[i];
@@ -542,7 +566,7 @@ void mapRefstoStatements(IR_Code *ir, std::vector<IR_ArrayRef *> access, int ref
IR_ArrayRef *b = access[j];
IR_ArraySymbol *sym_b = b->symbol();
bool inSameStmt;
- if (from_same_statement(ir,access[i],access[j])) {
+ if (from_same_statement(ir, access[i], access[j])) {
inSameStmt = true;
// std::cout << "Manu:: inSameStmt " << a->name().c_str() << ", " << b->name().c_str() << "\n";
} else {
@@ -553,7 +577,7 @@ void mapRefstoStatements(IR_Code *ir, std::vector<IR_ArrayRef *> access, int ref
if (ref2Stmt[i] == -1)
ref2Stmt[i] = stmtId++;
ref2Stmt[j] = ref2Stmt[i];
- rMap.insert(std::pair<int,std::set<int> >(ref2Stmt[i],std::set<int>()));
+ rMap.insert(std::pair<int, std::set<int> >(ref2Stmt[i], std::set<int>()));
} else {
if (ref2Stmt[i] == -1)
ref2Stmt[i] = stmtId++;
@@ -564,26 +588,28 @@ void mapRefstoStatements(IR_Code *ir, std::vector<IR_ArrayRef *> access, int ref
tnrStmts.insert(j);
}
}
-
+
}
}
std::set<int>::iterator itS;
for (itS = tnrStmts.begin(); itS != tnrStmts.end(); itS++) {
nrStmts.insert(ref2Stmt[*itS]);
}
-
+
}
// Manu:: This function tests reduction dependence and updates corresponding data structures
-void checkReductionDependence(int i, int j, int nestLeveli, omega::coef_t lbound[], omega::coef_t ubound[], int ref2Stmt[], std::map<int,std::set<int> >& rMap, DVPair& dv, tempResultMap& trMap, std::set<int> nrStmts ) {
-
+void
+checkReductionDependence(int i, int j, int nestLeveli, omega::coef_t lbound[], omega::coef_t ubound[], int ref2Stmt[],
+ std::map<int, std::set<int> > &rMap, DVPair &dv, tempResultMap &trMap, std::set<int> nrStmts) {
+
std::map<int, std::set<int> >::iterator itMap;
tempResultMap::iterator ittrMap;
- bool raw,war,waw, flg;
+ bool raw, war, waw, flg;
raw = war = waw = flg = false;
- if ((ref2Stmt[i] == ref2Stmt[j]) && (nrStmts.find(ref2Stmt[i])== nrStmts.end())) {
+ if ((ref2Stmt[i] == ref2Stmt[j]) && (nrStmts.find(ref2Stmt[i]) == nrStmts.end())) {
for (int k = 0; k < dv.first.size(); k++) {
- if ((dv.first[k].lbounds[nestLeveli-1] == 0) && (dv.first[k].ubounds[nestLeveli-1] == 0))
+ if ((dv.first[k].lbounds[nestLeveli - 1] == 0) && (dv.first[k].ubounds[nestLeveli - 1] == 0))
continue;
itMap = rMap.find(ref2Stmt[i]);
if (dv.first[k].type == DEP_R2W) {
@@ -591,15 +617,15 @@ void checkReductionDependence(int i, int j, int nestLeveli, omega::coef_t lbound
std::set<int> s = itMap->second;
s.insert(1); // war == 1
rMap.erase(itMap);
- rMap.insert(std::pair<int,std::set<int> >(ref2Stmt[i],s));
- if (lbound[0] > dv.first[k].lbounds[nestLeveli-1])
- lbound[0] = dv.first[k].lbounds[nestLeveli-1];
- if(ubound[0] < dv.first[k].ubounds[nestLeveli-1])
- ubound[0] = dv.first[k].ubounds[nestLeveli-1];
+ rMap.insert(std::pair<int, std::set<int> >(ref2Stmt[i], s));
+ if (lbound[0] > dv.first[k].lbounds[nestLeveli - 1])
+ lbound[0] = dv.first[k].lbounds[nestLeveli - 1];
+ if (ubound[0] < dv.first[k].ubounds[nestLeveli - 1])
+ ubound[0] = dv.first[k].ubounds[nestLeveli - 1];
} else if (dv.first[k].type == DEP_W2R) {
// for (int k1 = 0; k1 < dv.first[k].lbounds.size(); k1++) {
// omega::coef_t lbound = dv.first[k].lbounds[k1];
- omega::coef_t lbound1 = dv.first[k].lbounds[nestLeveli-1];
+ omega::coef_t lbound1 = dv.first[k].lbounds[nestLeveli - 1];
if (lbound1 > 0) {
flg = true;
// break;
@@ -610,28 +636,28 @@ void checkReductionDependence(int i, int j, int nestLeveli, omega::coef_t lbound
std::set<int> s = itMap->second;
s.insert(2); // raw == 2
rMap.erase(itMap);
- rMap.insert(std::pair<int,std::set<int> >(ref2Stmt[i],s));
- if (lbound[1] > dv.first[k].lbounds[nestLeveli-1])
- lbound[1] = dv.first[k].lbounds[nestLeveli-1];
- if(ubound[1] < dv.first[k].ubounds[nestLeveli-1])
- ubound[1] = dv.first[k].ubounds[nestLeveli-1];
+ rMap.insert(std::pair<int, std::set<int> >(ref2Stmt[i], s));
+ if (lbound[1] > dv.first[k].lbounds[nestLeveli - 1])
+ lbound[1] = dv.first[k].lbounds[nestLeveli - 1];
+ if (ubound[1] < dv.first[k].ubounds[nestLeveli - 1])
+ ubound[1] = dv.first[k].ubounds[nestLeveli - 1];
}
} else if (dv.first[k].type == DEP_W2W) {
waw = true;
std::set<int> s = itMap->second;
s.insert(3); // waw == 3
rMap.erase(itMap);
- rMap.insert(std::pair<int,std::set<int> >(ref2Stmt[i],s));
- if (lbound[2] > dv.first[k].lbounds[nestLeveli-1])
- lbound[2] = dv.first[k].lbounds[nestLeveli-1];
- if(ubound[2] < dv.first[k].ubounds[nestLeveli-1])
- ubound[2] = dv.first[k].ubounds[nestLeveli-1];
+ rMap.insert(std::pair<int, std::set<int> >(ref2Stmt[i], s));
+ if (lbound[2] > dv.first[k].lbounds[nestLeveli - 1])
+ lbound[2] = dv.first[k].lbounds[nestLeveli - 1];
+ if (ubound[2] < dv.first[k].ubounds[nestLeveli - 1])
+ ubound[2] = dv.first[k].ubounds[nestLeveli - 1];
}
// std::cout<< "Manu:: Flags:: " << "raw " << raw << ", war " << war << ", waw " << waw << "\n";
}
flg = false;
for (int k = 0; k < dv.second.size(); k++) {
- if ((dv.second[k].lbounds[nestLeveli-1] == 0) && (dv.second[k].ubounds[nestLeveli-1] == 0))
+ if ((dv.second[k].lbounds[nestLeveli - 1] == 0) && (dv.second[k].ubounds[nestLeveli - 1] == 0))
continue;
itMap = rMap.find(ref2Stmt[i]);
if (dv.second[k].type == DEP_R2W) {
@@ -639,16 +665,16 @@ void checkReductionDependence(int i, int j, int nestLeveli, omega::coef_t lbound
std::set<int> s = itMap->second;
s.insert(1); // war == 1
rMap.erase(itMap);
- rMap.insert(std::pair<int,std::set<int> >(ref2Stmt[i],s));
- if (lbound[0] > dv.second[k].lbounds[nestLeveli-1])
- lbound[0] = dv.second[k].lbounds[nestLeveli-1];
- if (ubound[0] < dv.second[k].ubounds[nestLeveli-1])
- ubound[0] = dv.second[k].ubounds[nestLeveli-1];
-
+ rMap.insert(std::pair<int, std::set<int> >(ref2Stmt[i], s));
+ if (lbound[0] > dv.second[k].lbounds[nestLeveli - 1])
+ lbound[0] = dv.second[k].lbounds[nestLeveli - 1];
+ if (ubound[0] < dv.second[k].ubounds[nestLeveli - 1])
+ ubound[0] = dv.second[k].ubounds[nestLeveli - 1];
+
} else if (dv.second[k].type == DEP_W2R) {
// for (int k1 = 0; k1 < dv.second[k].lbounds.size(); k1++) {
//omega::coef_t lbound = dv.second[k].lbounds[k1];
- omega::coef_t lbound1 = dv.second[k].lbounds[nestLeveli-1];
+ omega::coef_t lbound1 = dv.second[k].lbounds[nestLeveli - 1];
if (lbound1 > 0) {
flg = true;
// break;
@@ -659,33 +685,33 @@ void checkReductionDependence(int i, int j, int nestLeveli, omega::coef_t lbound
std::set<int> s = itMap->second;
s.insert(2); // raw == 2
rMap.erase(itMap);
- rMap.insert(std::pair<int,std::set<int> >(ref2Stmt[i],s));
- if (lbound[1] > dv.second[k].lbounds[nestLeveli-1])
- lbound[1] = dv.second[k].lbounds[nestLeveli-1];
- if (ubound[1] < dv.second[k].ubounds[nestLeveli-1])
- ubound[1] = dv.second[k].ubounds[nestLeveli-1];
-
+ rMap.insert(std::pair<int, std::set<int> >(ref2Stmt[i], s));
+ if (lbound[1] > dv.second[k].lbounds[nestLeveli - 1])
+ lbound[1] = dv.second[k].lbounds[nestLeveli - 1];
+ if (ubound[1] < dv.second[k].ubounds[nestLeveli - 1])
+ ubound[1] = dv.second[k].ubounds[nestLeveli - 1];
+
}
-
+
} else if (dv.second[k].type == DEP_W2W) {
waw = true;
std::set<int> s = itMap->second;
s.insert(3); // waw == 3
rMap.erase(itMap);
- rMap.insert(std::pair<int,std::set<int> >(ref2Stmt[i],s));
- if (lbound[2] > dv.second[k].lbounds[nestLeveli-1])
- lbound[2] = dv.second[k].lbounds[nestLeveli-1];
- if (ubound[2] < dv.second[k].ubounds[nestLeveli-1])
- ubound[2] = dv.second[k].ubounds[nestLeveli-1];
-
+ rMap.insert(std::pair<int, std::set<int> >(ref2Stmt[i], s));
+ if (lbound[2] > dv.second[k].lbounds[nestLeveli - 1])
+ lbound[2] = dv.second[k].lbounds[nestLeveli - 1];
+ if (ubound[2] < dv.second[k].ubounds[nestLeveli - 1])
+ ubound[2] = dv.second[k].ubounds[nestLeveli - 1];
+
}
// std::cout<< "Manu:: Flags:: " << "raw " << raw << ", war " << war << ", waw " << waw << "\n";
}
-
+
// if ((rMap.find(ref2Stmt[i])->second).size() == 3) {
- if(DEP_DEBUG){
- std::cout << "lbounds: " << lbound[0] << ", " << lbound[1] << ", " <<lbound[2] << "\n";
- std::cout << "ubounds: " << ubound[0] << ", " << ubound[1] << ", " <<ubound[2] << "\n";
+ if (DEP_DEBUG) {
+ std::cout << "lbounds: " << lbound[0] << ", " << lbound[1] << ", " << lbound[2] << "\n";
+ std::cout << "ubounds: " << ubound[0] << ", " << ubound[1] << ", " << ubound[2] << "\n";
}
if (((rMap.find(ref2Stmt[i])->second).size() == 3) && (lbound[0] == lbound[1]) && (lbound[1] == lbound[2])
&& (ubound[0] == ubound[1]) && (ubound[1] == ubound[2])) {
@@ -694,7 +720,7 @@ void checkReductionDependence(int i, int j, int nestLeveli, omega::coef_t lbound
dv.second[k].is_reduction_cand = true;
for (int k = 0; k < dv.first.size(); k++)
dv.first[k].is_reduction_cand = true;
- trMap.insert(std::pair<int,DVPair>(ref2Stmt[i],DVPair(dv.first,dv.second)));
+ trMap.insert(std::pair<int, DVPair>(ref2Stmt[i], DVPair(dv.first, dv.second)));
}
} else {
// tempArrayRefId[i] = tempArrayRefId[j] = 0;
@@ -711,24 +737,24 @@ void checkReductionDependence(int i, int j, int nestLeveli, omega::coef_t lbound
for (int k = 0; k < (tdv.second).size(); k++)
tdv.second[k].is_reduction_cand = false;
trMap.erase(ittrMap);
- trMap.insert(std::pair<int,DVPair>(ref2Stmt[i],DVPair(tdv.first,tdv.second)));
+ trMap.insert(std::pair<int, DVPair>(ref2Stmt[i], DVPair(tdv.first, tdv.second)));
}
}
-
-}
+}
-void print_control( IR_Control *con ) {
+void print_control(IR_Control *con) {
IR_CONTROL_TYPE type = con->type();
- fprintf(stderr, "this is IR_Control of type %s\n", chill_ir_control_type_string( type ).c_str());
+ fprintf(stderr, "this is IR_Control of type %s\n", chill_ir_control_type_string(type).c_str());
switch (type) {
- case IR_CONTROL_BLOCK:
- case IR_CONTROL_LOOP:
- case IR_CONTROL_IF:
- case IR_CONTROL_WHILE:
- default: return;
+ case IR_CONTROL_BLOCK:
+ case IR_CONTROL_LOOP:
+ case IR_CONTROL_IF:
+ case IR_CONTROL_WHILE:
+ default:
+ return;
}
}
diff --git a/src/omegatools.cc b/src/omegatools.cc
index 7ebe726..c7233c8 100644
--- a/src/omegatools.cc
+++ b/src/omegatools.cc
@@ -33,58 +33,56 @@ namespace {
// -1:negative, 0: undetermined, 1: postive
std::vector<coef_t> lbounds;
std::vector<coef_t> ubounds;
- DependenceLevel(const Relation &_r, int _dims):
- r(_r), level(0), dir(0), lbounds(_dims), ubounds(_dims) {}
+
+ DependenceLevel(const Relation &_r, int _dims) :
+ r(_r), level(0), dir(0), lbounds(_dims), ubounds(_dims) {}
};
}
-
-
std::string tmp_e() {
static int counter = 1;
- return std::string("e")+to_string(counter++);
+ return std::string("e") + to_string(counter++);
}
-
//-----------------------------------------------------------------------------
// Convert expression tree to omega relation. "destroy" means shallow
// deallocation of "repr", not freeing the actual code inside.
// -----------------------------------------------------------------------------
-void exp2formula(IR_Code *ir,
- Relation &r,
- F_And *f_root,
- std::vector<Free_Var_Decl*> &freevars,
- CG_outputRepr *repr,
- Variable_ID lhs,
- char side,
- IR_CONDITION_TYPE rel,
+void exp2formula(IR_Code *ir,
+ Relation &r,
+ F_And *f_root,
+ std::vector<Free_Var_Decl *> &freevars,
+ CG_outputRepr *repr,
+ Variable_ID lhs,
+ char side,
+ IR_CONDITION_TYPE rel,
bool destroy,
std::map<std::string, std::vector<omega::CG_outputRepr *> > &uninterpreted_symbols,
std::map<std::string, std::vector<omega::CG_outputRepr *> > &uninterpreted_symbols_stringrepr
- ) {
-
+) {
+
fprintf(stderr, "\n*** exp2formula()\n");
//repr->dump(); /* printf("\n"); */fflush(stdout);
- fprintf(stderr, "repr "); r.print(); printf("\n"); fflush(stdout);
-
-
+ fprintf(stderr, "repr ");
+ r.print();
+ printf("\n");
+ fflush(stdout);
+
+
IR_OPERATION_TYPE optype = ir->QueryExpOperation(repr);
-
+
switch (optype) {
-
-
-
-
- case IR_OP_CONSTANT:
- {
+
+
+ case IR_OP_CONSTANT: {
fprintf(stderr, "IR_OP_CONSTANT\n");
std::vector<CG_outputRepr *> v = ir->QueryExpOperand(repr);
IR_ConstantRef *ref = static_cast<IR_ConstantRef *>(ir->Repr2Ref(v[0]));
if (!ref->is_integer())
throw ir_exp_error("non-integer constant coefficient");
-
+
coef_t c = ref->integer();
if (rel == IR_COND_GE || rel == IR_COND_GT) {
GEQ_Handle h = f_root->add_GEQ();
@@ -92,46 +90,42 @@ void exp2formula(IR_Code *ir,
if (rel == IR_COND_GE)
h.update_const(-c);
else
- h.update_const(-c-1);
- }
- else if (rel == IR_COND_LE || rel == IR_COND_LT) {
+ h.update_const(-c - 1);
+ } else if (rel == IR_COND_LE || rel == IR_COND_LT) {
GEQ_Handle h = f_root->add_GEQ();
h.update_coef(lhs, -1);
if (rel == IR_COND_LE)
h.update_const(c);
else
- h.update_const(c-1);
- }
- else if (rel == IR_COND_EQ) {
+ h.update_const(c - 1);
+ } else if (rel == IR_COND_EQ) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(lhs, 1);
h.update_const(-c);
- }
- else
+ } else
throw std::invalid_argument("unsupported condition type");
-
+
delete v[0];
delete ref;
if (destroy)
delete repr;
-
+
break;
}
-
- case IR_OP_VARIABLE:
- {
+
+ case IR_OP_VARIABLE: {
fprintf(stderr, "IR_OP_VARIABLE\n");
//fprintf(stderr, "repr "); repr->dump(); fflush(stdout);
std::vector<CG_outputRepr *> v = ir->QueryExpOperand(repr);
//fprintf(stderr, "v "); v[0]->dump(); fflush(stdout);
IR_ScalarRef *ref = static_cast<IR_ScalarRef *>(ir->Repr2Ref(v[0]));
-
+
//fprintf(stderr, "omegatools.cc calling ref->name()\n");
std::string s = ref->name();
Variable_ID e = find_index(r, s, side);
//fprintf(stderr, "s %s\n", s.c_str());
-
-
+
+
if (e == NULL) { // must be free variable
Free_Var_Decl *t = NULL;
for (unsigned i = 0; i < freevars.size(); i++) {
@@ -141,37 +135,34 @@ void exp2formula(IR_Code *ir,
break;
}
}
-
+
if (t == NULL) {
t = new Free_Var_Decl(s);
freevars.insert(freevars.end(), t);
}
-
+
e = r.get_local(t);
}
-
+
if (rel == IR_COND_GE || rel == IR_COND_GT) {
GEQ_Handle h = f_root->add_GEQ();
h.update_coef(lhs, 1);
h.update_coef(e, -1);
if (rel == IR_COND_GT)
h.update_const(-1);
- }
- else if (rel == IR_COND_LE || rel == IR_COND_LT) {
+ } else if (rel == IR_COND_LE || rel == IR_COND_LT) {
GEQ_Handle h = f_root->add_GEQ();
h.update_coef(lhs, -1);
h.update_coef(e, 1);
if (rel == IR_COND_LT)
h.update_const(-1);
- }
- else if (rel == IR_COND_EQ) {
+ } else if (rel == IR_COND_EQ) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(lhs, 1);
h.update_coef(e, -1);
- }
- else
+ } else
throw std::invalid_argument("unsupported condition type");
-
+
// delete v[0];
delete ref;
if (destroy)
@@ -179,8 +170,7 @@ void exp2formula(IR_Code *ir,
break;
}
- case IR_OP_ASSIGNMENT:
- {
+ case IR_OP_ASSIGNMENT: {
fprintf(stderr, "IR_OP_ASSIGNMENT\n");
std::vector<CG_outputRepr *> v = ir->QueryExpOperand(repr);
exp2formula(ir, r, f_root, freevars, v[0], lhs, side, rel, true,
@@ -189,15 +179,14 @@ void exp2formula(IR_Code *ir,
delete repr;
break;
}
-
- case IR_OP_PLUS:
- {
+
+ case IR_OP_PLUS: {
fprintf(stderr, "IR_OP_PLUS\n");
F_Exists *f_exists = f_root->add_exists();
Variable_ID e1 = f_exists->declare(tmp_e());
Variable_ID e2 = f_exists->declare(tmp_e());
F_And *f_and = f_exists->add_and();
-
+
if (rel == IR_COND_GE || rel == IR_COND_GT) {
GEQ_Handle h = f_and->add_GEQ();
h.update_coef(lhs, 1);
@@ -205,24 +194,21 @@ void exp2formula(IR_Code *ir,
h.update_coef(e2, -1);
if (rel == IR_COND_GT)
h.update_const(-1);
- }
- else if (rel == IR_COND_LE || rel == IR_COND_LT) {
+ } else if (rel == IR_COND_LE || rel == IR_COND_LT) {
GEQ_Handle h = f_and->add_GEQ();
h.update_coef(lhs, -1);
h.update_coef(e1, 1);
h.update_coef(e2, 1);
if (rel == IR_COND_LT)
h.update_const(-1);
- }
- else if (rel == IR_COND_EQ) {
+ } else if (rel == IR_COND_EQ) {
EQ_Handle h = f_and->add_EQ();
h.update_coef(lhs, 1);
h.update_coef(e1, -1);
h.update_coef(e2, -1);
- }
- else
+ } else
throw std::invalid_argument("unsupported condition type");
-
+
std::vector<CG_outputRepr *> v = ir->QueryExpOperand(repr);
exp2formula(ir, r, f_and, freevars, v[0], e1, side, IR_COND_EQ, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
@@ -232,14 +218,13 @@ void exp2formula(IR_Code *ir,
delete repr;
break;
}
- case IR_OP_MINUS:
- {
+ case IR_OP_MINUS: {
fprintf(stderr, "IR_OP_MINUS\n");
F_Exists *f_exists = f_root->add_exists();
Variable_ID e1 = f_exists->declare(tmp_e());
Variable_ID e2 = f_exists->declare(tmp_e());
F_And *f_and = f_exists->add_and();
-
+
if (rel == IR_COND_GE || rel == IR_COND_GT) {
GEQ_Handle h = f_and->add_GEQ();
h.update_coef(lhs, 1);
@@ -247,48 +232,44 @@ void exp2formula(IR_Code *ir,
h.update_coef(e2, 1);
if (rel == IR_COND_GT)
h.update_const(-1);
- }
- else if (rel == IR_COND_LE || rel == IR_COND_LT) {
+ } else if (rel == IR_COND_LE || rel == IR_COND_LT) {
GEQ_Handle h = f_and->add_GEQ();
h.update_coef(lhs, -1);
h.update_coef(e1, 1);
h.update_coef(e2, -1);
if (rel == IR_COND_LT)
h.update_const(-1);
- }
- else if (rel == IR_COND_EQ) {
+ } else if (rel == IR_COND_EQ) {
EQ_Handle h = f_and->add_EQ();
h.update_coef(lhs, 1);
h.update_coef(e1, -1);
h.update_coef(e2, 1);
- }
- else
+ } else
throw std::invalid_argument("unsupported condition type");
-
+
std::vector<CG_outputRepr *> v = ir->QueryExpOperand(repr);
- fprintf(stderr, "IR_OP_MINUS v has %d parts\n", (int)v.size());
- fprintf(stderr, "IR_OP_MINUS recursing 1\n");
+ fprintf(stderr, "IR_OP_MINUS v has %d parts\n", (int) v.size());
+ fprintf(stderr, "IR_OP_MINUS recursing 1\n");
exp2formula(ir, r, f_and, freevars, v[0], e1, side, IR_COND_EQ, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
-
- if (v.size() > 1) {
+
+ if (v.size() > 1) {
fprintf(stderr, "IR_OP_MINUS recursing 2\n"); // dies here because it's unary minus?
exp2formula(ir, r, f_and, freevars, v[1], e2, side, IR_COND_EQ, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
- }
-
-
+ }
+
+
if (destroy)
delete repr;
break;
}
- case IR_OP_MULTIPLY:
- {
+ case IR_OP_MULTIPLY: {
fprintf(stderr, "IR_OP_MULTIPLY\n");
std::vector<CG_outputRepr *> v = ir->QueryExpOperand(repr);
-
+
coef_t coef;
CG_outputRepr *term;
if (ir->QueryExpOperation(v[0]) == IR_OP_CONSTANT) {
@@ -297,43 +278,38 @@ void exp2formula(IR_Code *ir,
delete v[0];
delete ref;
term = v[1];
- }
- else if (ir->QueryExpOperation(v[1]) == IR_OP_CONSTANT) {
+ } else if (ir->QueryExpOperation(v[1]) == IR_OP_CONSTANT) {
IR_ConstantRef *ref = static_cast<IR_ConstantRef *>(ir->Repr2Ref(v[1]));
coef = ref->integer();
delete v[1];
delete ref;
term = v[0];
- }
- else
+ } else
throw ir_exp_error("not presburger expression");
-
+
F_Exists *f_exists = f_root->add_exists();
Variable_ID e = f_exists->declare(tmp_e());
F_And *f_and = f_exists->add_and();
-
+
if (rel == IR_COND_GE || rel == IR_COND_GT) {
GEQ_Handle h = f_and->add_GEQ();
h.update_coef(lhs, 1);
h.update_coef(e, -coef);
if (rel == IR_COND_GT)
h.update_const(-1);
- }
- else if (rel == IR_COND_LE || rel == IR_COND_LT) {
+ } else if (rel == IR_COND_LE || rel == IR_COND_LT) {
GEQ_Handle h = f_and->add_GEQ();
h.update_coef(lhs, -1);
h.update_coef(e, coef);
if (rel == IR_COND_LT)
h.update_const(-1);
- }
- else if (rel == IR_COND_EQ) {
+ } else if (rel == IR_COND_EQ) {
EQ_Handle h = f_and->add_EQ();
h.update_coef(lhs, 1);
h.update_coef(e, -coef);
- }
- else
+ } else
throw std::invalid_argument("unsupported condition type");
-
+
exp2formula(ir, r, f_and, freevars, term, e, side, IR_COND_EQ, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
if (destroy)
@@ -341,155 +317,140 @@ void exp2formula(IR_Code *ir,
break;
}
- case IR_OP_DIVIDE:
- {
+ case IR_OP_DIVIDE: {
fprintf(stderr, "IR_OP_DIVIDE\n");
std::vector<CG_outputRepr *> v = ir->QueryExpOperand(repr);
-
+
assert(ir->QueryExpOperation(v[1]) == IR_OP_CONSTANT);
IR_ConstantRef *ref = static_cast<IR_ConstantRef *>(ir->Repr2Ref(v[1]));
coef_t coef = ref->integer();
delete v[1];
delete ref;
-
+
F_Exists *f_exists = f_root->add_exists();
Variable_ID e = f_exists->declare(tmp_e());
F_And *f_and = f_exists->add_and();
-
+
if (rel == IR_COND_GE || rel == IR_COND_GT) {
GEQ_Handle h = f_and->add_GEQ();
h.update_coef(lhs, coef);
h.update_coef(e, -1);
if (rel == IR_COND_GT)
h.update_const(-1);
- }
- else if (rel == IR_COND_LE || rel == IR_COND_LT) {
+ } else if (rel == IR_COND_LE || rel == IR_COND_LT) {
GEQ_Handle h = f_and->add_GEQ();
h.update_coef(lhs, -coef);
h.update_coef(e, 1);
if (rel == IR_COND_LT)
h.update_const(-1);
- }
- else if (rel == IR_COND_EQ) {
+ } else if (rel == IR_COND_EQ) {
EQ_Handle h = f_and->add_EQ();
h.update_coef(lhs, coef);
h.update_coef(e, -1);
- }
- else
+ } else
throw std::invalid_argument("unsupported condition type");
-
+
exp2formula(ir, r, f_and, freevars, v[0], e, side, IR_COND_EQ, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
if (destroy)
delete repr;
break;
}
-
- case IR_OP_MOD:
- {
+
+ case IR_OP_MOD: {
fprintf(stderr, "IR_OP_MOD\n");
/* the left hand of a mod can be a var but the right must be a const */
std::vector<CG_outputRepr *> v = ir->QueryExpOperand(repr);
-
+
assert(ir->QueryExpOperation(v[1]) == IR_OP_CONSTANT);
IR_ConstantRef *ref = static_cast<IR_ConstantRef *>(ir->Repr2Ref(v[1]));
coef_t coef = ref->integer();
delete v[1];
delete ref;
-
+
F_Exists *f_exists = f_root->add_exists();
Variable_ID e = f_exists->declare(tmp_e());
Variable_ID b = f_exists->declare(tmp_e());
F_And *f_and = f_exists->add_and();
-
-
- if (rel == IR_COND_EQ)
- {
- EQ_Handle h = f_and->add_EQ();
- h.update_coef(lhs, 1);
- h.update_coef(b, coef);
- h.update_coef(e, -1);
- }
-
- else if (rel == IR_COND_GE || rel == IR_COND_GT) {
+
+
+ if (rel == IR_COND_EQ) {
+ EQ_Handle h = f_and->add_EQ();
+ h.update_coef(lhs, 1);
+ h.update_coef(b, coef);
+ h.update_coef(e, -1);
+ } else if (rel == IR_COND_GE || rel == IR_COND_GT) {
//i = CONST alpha + beta && beta >= const ( handled higher up ) && beta < CONST
EQ_Handle h = f_and->add_EQ();
h.update_coef(lhs, 1);
h.update_coef(b, coef);
h.update_coef(e, -1);
-
+
GEQ_Handle k = f_and->add_GEQ();
- k.update_coef(lhs, -1 );
- k.update_const(coef-1);
-
- }
-
- else if (rel == IR_COND_LE || rel == IR_COND_LT) {
+ k.update_coef(lhs, -1);
+ k.update_const(coef - 1);
+
+ } else if (rel == IR_COND_LE || rel == IR_COND_LT) {
//i = CONST alpha + beta && beta <= const ( handled higher up ) && beta >= 0
EQ_Handle h = f_and->add_EQ();
h.update_coef(lhs, 1);
h.update_coef(b, coef);
h.update_coef(e, -1);
-
+
GEQ_Handle k = f_and->add_GEQ();
- k.update_coef(lhs, 1 );
-
+ k.update_coef(lhs, 1);
+
}
-
- exp2formula(ir, r, f_and, freevars, v[0], e, side, IR_COND_EQ, true,
+
+ exp2formula(ir, r, f_and, freevars, v[0], e, side, IR_COND_EQ, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
if (destroy)
delete repr;
-
+
break;
}
-
-
- case IR_OP_POSITIVE:
- {
+
+
+ case IR_OP_POSITIVE: {
fprintf(stderr, "IR_OP_POSITIVE\n");
std::vector<CG_outputRepr *> v = ir->QueryExpOperand(repr);
-
+
exp2formula(ir, r, f_root, freevars, v[0], lhs, side, rel, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
-
+
if (destroy)
delete repr;
break;
- }
-
-
- case IR_OP_NEGATIVE:
- {
+ }
+
+
+ case IR_OP_NEGATIVE: {
fprintf(stderr, "IR_OP_NEGATIVE\n");
std::vector<CG_outputRepr *> v = ir->QueryExpOperand(repr);
-
+
F_Exists *f_exists = f_root->add_exists();
Variable_ID e = f_exists->declare(tmp_e());
F_And *f_and = f_exists->add_and();
-
+
if (rel == IR_COND_GE || rel == IR_COND_GT) {
GEQ_Handle h = f_and->add_GEQ();
h.update_coef(lhs, 1);
h.update_coef(e, 1);
if (rel == IR_COND_GT)
h.update_const(-1);
- }
- else if (rel == IR_COND_LE || rel == IR_COND_LT) {
+ } else if (rel == IR_COND_LE || rel == IR_COND_LT) {
GEQ_Handle h = f_and->add_GEQ();
h.update_coef(lhs, -1);
h.update_coef(e, -1);
if (rel == IR_COND_LT)
h.update_const(-1);
- }
- else if (rel == IR_COND_EQ) {
+ } else if (rel == IR_COND_EQ) {
EQ_Handle h = f_and->add_EQ();
h.update_coef(lhs, 1);
h.update_coef(e, 1);
- }
- else
+ } else
throw std::invalid_argument("unsupported condition type");
-
+
exp2formula(ir, r, f_and, freevars, v[0], e, side, IR_COND_EQ, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
if (destroy)
@@ -498,13 +459,12 @@ void exp2formula(IR_Code *ir,
}
- case IR_OP_MIN:
- {
+ case IR_OP_MIN: {
fprintf(stderr, "IR_OP_MIN\n");
std::vector<CG_outputRepr *> v = ir->QueryExpOperand(repr);
-
+
F_Exists *f_exists = f_root->add_exists();
-
+
if (rel == IR_COND_GE || rel == IR_COND_GT) {
F_Or *f_or = f_exists->add_and()->add_or();
for (int i = 0; i < v.size(); i++) {
@@ -515,69 +475,65 @@ void exp2formula(IR_Code *ir,
h.update_coef(e, -1);
if (rel == IR_COND_GT)
h.update_const(-1);
-
+
exp2formula(ir, r, f_and, freevars, v[i], e, side, IR_COND_EQ, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
}
- }
- else if (rel == IR_COND_LE || rel == IR_COND_LT) {
+ } else if (rel == IR_COND_LE || rel == IR_COND_LT) {
F_And *f_and = f_exists->add_and();
for (int i = 0; i < v.size(); i++) {
- Variable_ID e = f_exists->declare(tmp_e());
+ Variable_ID e = f_exists->declare(tmp_e());
GEQ_Handle h = f_and->add_GEQ();
h.update_coef(lhs, -1);
h.update_coef(e, 1);
if (rel == IR_COND_LT)
h.update_const(-1);
-
+
exp2formula(ir, r, f_and, freevars, v[i], e, side, IR_COND_EQ, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
}
- }
- else if (rel == IR_COND_EQ) {
+ } else if (rel == IR_COND_EQ) {
F_Or *f_or = f_exists->add_and()->add_or();
for (int i = 0; i < v.size(); i++) {
Variable_ID e = f_exists->declare(tmp_e());
F_And *f_and = f_or->add_and();
-
+
EQ_Handle h = f_and->add_EQ();
h.update_coef(lhs, 1);
h.update_coef(e, -1);
-
+
exp2formula(ir, r, f_and, freevars, v[i], e, side, IR_COND_EQ, false,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
-
+
for (int j = 0; j < v.size(); j++)
if (j != i) {
Variable_ID e2 = f_exists->declare(tmp_e());
GEQ_Handle h2 = f_and->add_GEQ();
h2.update_coef(e, -1);
h2.update_coef(e2, 1);
-
- exp2formula(ir, r, f_and, freevars, v[j], e2, side,
+
+ exp2formula(ir, r, f_and, freevars, v[j], e2, side,
IR_COND_EQ, false,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
}
}
-
+
for (int i = 0; i < v.size(); i++)
delete v[i];
- }
- else
+ } else
throw std::invalid_argument("unsupported condition type");
-
+
if (destroy)
delete repr;
break;
}
- case IR_OP_MAX:
- {
+ case IR_OP_MAX: {
fprintf(stderr, "IR_OP_MAX\n");
std::vector<CG_outputRepr *> v = ir->QueryExpOperand(repr);
-
+
F_Exists *f_exists = f_root->add_exists();
-
+
if (rel == IR_COND_LE || rel == IR_COND_LT) {
F_Or *f_or = f_exists->add_and()->add_or();
for (int i = 0; i < v.size(); i++) {
@@ -588,336 +544,331 @@ void exp2formula(IR_Code *ir,
h.update_coef(e, 1);
if (rel == IR_COND_LT)
h.update_const(-1);
-
+
exp2formula(ir, r, f_and, freevars, v[i], e, side, IR_COND_EQ, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
}
- }
- else if (rel == IR_COND_GE || rel == IR_COND_GT) {
+ } else if (rel == IR_COND_GE || rel == IR_COND_GT) {
F_And *f_and = f_exists->add_and();
for (int i = 0; i < v.size(); i++) {
- Variable_ID e = f_exists->declare(tmp_e());
+ Variable_ID e = f_exists->declare(tmp_e());
GEQ_Handle h = f_and->add_GEQ();
h.update_coef(lhs, 1);
h.update_coef(e, -1);
if (rel == IR_COND_GT)
h.update_const(-1);
-
+
exp2formula(ir, r, f_and, freevars, v[i], e, side, IR_COND_EQ, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
-
+
}
- }
- else if (rel == IR_COND_EQ) {
+ } else if (rel == IR_COND_EQ) {
F_Or *f_or = f_exists->add_and()->add_or();
for (int i = 0; i < v.size(); i++) {
Variable_ID e = f_exists->declare(tmp_e());
F_And *f_and = f_or->add_and();
-
+
EQ_Handle h = f_and->add_EQ();
h.update_coef(lhs, 1);
h.update_coef(e, -1);
-
+
exp2formula(ir, r, f_and, freevars, v[i], e, side, IR_COND_EQ, false,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
-
+
for (int j = 0; j < v.size(); j++)
if (j != i) {
Variable_ID e2 = f_exists->declare(tmp_e());
GEQ_Handle h2 = f_and->add_GEQ();
h2.update_coef(e, 1);
h2.update_coef(e2, -1);
-
+
exp2formula(ir, r, f_and, freevars, v[j], e2, side, IR_COND_EQ, false,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
}
}
-
+
for (int i = 0; i < v.size(); i++)
delete v[i];
- }
- else
+ } else
throw std::invalid_argument("unsupported condition type");
-
+
if (destroy)
delete repr;
break;
}
-
- case IR_OP_ARRAY_VARIABLE: { // *****
- fprintf(stderr, "\nomegatools.cc IR_OP_ARRAY_VARIABLE ARRAY! \n");
-
- // temp for printing
- //CG_chillRepr *CR = (CG_chillRepr *)repr;
- //fprintf(stderr, "repr "); CR->dump(); fflush(stdout);
-
- //fprintf(stderr, "repr "); repr->dump(); /* printf("\n"); */fflush(stdout);
-
- std::vector<CG_outputRepr *> v = ir->QueryExpOperand(repr);
- IR_Ref *ref = static_cast<IR_ScalarRef *>(ir->Repr2Ref(v[0]));
-
-
- CG_chillRepr *CR = (CG_chillRepr *)v[0]; // cheat for now. we should not know this is a chillRepr
- //fprintf(stderr, "v "); CR->dump(); fflush(stdout);
- //fprintf(stderr, "v "); v[0]->dump(); /* printf("\n"); */ fflush(stdout);
- chillAST_node* node = CR->GetCode();
-
-
- //fprintf(stderr, "\n**** walking parents!\n");
- //std::vector<chillAST_VarDecl*> loopvars;
- //node->gatherLoopIndeces( loopvars );
- //fprintf(stderr, "in omegatools, %d loop vars\n", (int)loopvars.size());
-
-
- std::string s = ref->name();
- //fprintf(stderr, "array variable s is %s\n", s.c_str());
-
- int max_dim = 0;
- bool need_new_fsymbol = false;
- std::set<std::string> vars;
- //fprintf(stderr, "ref->n_dim %d\n", ref->n_dim());
- for (int i = 0; i < ref->n_dim(); i++) {
- //fprintf(stderr, "dimension %d\n", i);
- Relation temp(r.n_inp());
-
- // r is enclosing relation, we build another that will include this
- r.setup_names();
- if (r.is_set())
- for (int j = 1; j <= r.n_set(); j++) {
- temp.name_set_var(j, r.set_var(j)->name());
- }
- else
- for (int j = 1; j <= r.n_inp(); j++) {
- temp.name_input_var(j, r.input_var(j)->name());
- }
-
- F_And *temp_root = temp.add_and();
-
- CG_outputRepr* repr;
- if(dynamic_cast<IR_PointerArrayRef *>(ref) != NULL)
- repr = dynamic_cast<IR_PointerArrayRef *>(ref)->index(i); // i or i+1
- else if(dynamic_cast<IR_ArrayRef *>(ref) != NULL)
- repr = dynamic_cast<IR_ArrayRef *>(ref)->index(i);
-
- std::vector<Free_Var_Decl*> freevars;
- Free_Var_Decl *t = new Free_Var_Decl(s);
- Variable_ID e = temp.get_local(t);
- freevars.insert(freevars.end(), t);
-
- fprintf(stderr, "exp2formula recursing? \n");
- exp2formula(ir, temp, temp_root, freevars, repr, e, side,
- IR_COND_EQ, false, uninterpreted_symbols,
- uninterpreted_symbols_stringrepr);
- fprintf(stderr, "BACK FROM exp2formula recursing? \n");
-
- // temp is relation for the index of the array ??
- for (DNF_Iterator di(temp.query_DNF()); di; di++) {
- for (EQ_Iterator ei = (*di)->EQs(); ei; ei++) {
-
- if ((*ei).get_const() != 0)
- need_new_fsymbol = true;
- for (Constr_Vars_Iter cvi(*ei); cvi; cvi++)
- if ((*cvi).var->kind() == Input_Var) {
- if ((*cvi).var->get_position() > max_dim)
- max_dim = (*cvi).var->get_position();
- vars.insert(
- r.input_var((*cvi).var->get_position())->name());
-
- }
+
+ case IR_OP_ARRAY_VARIABLE: { // *****
+ fprintf(stderr, "\nomegatools.cc IR_OP_ARRAY_VARIABLE ARRAY! \n");
+
+ // temp for printing
+ //CG_chillRepr *CR = (CG_chillRepr *)repr;
+ //fprintf(stderr, "repr "); CR->dump(); fflush(stdout);
+
+ //fprintf(stderr, "repr "); repr->dump(); /* printf("\n"); */fflush(stdout);
+
+ std::vector<CG_outputRepr *> v = ir->QueryExpOperand(repr);
+ IR_Ref *ref = static_cast<IR_ScalarRef *>(ir->Repr2Ref(v[0]));
+
+
+ CG_chillRepr *CR = (CG_chillRepr *) v[0]; // cheat for now. we should not know this is a chillRepr
+ //fprintf(stderr, "v "); CR->dump(); fflush(stdout);
+ //fprintf(stderr, "v "); v[0]->dump(); /* printf("\n"); */ fflush(stdout);
+ chillAST_node *node = CR->GetCode();
+
+
+ //fprintf(stderr, "\n**** walking parents!\n");
+ //std::vector<chillAST_VarDecl*> loopvars;
+ //node->gatherLoopIndeces( loopvars );
+ //fprintf(stderr, "in omegatools, %d loop vars\n", (int)loopvars.size());
+
+
+ std::string s = ref->name();
+ //fprintf(stderr, "array variable s is %s\n", s.c_str());
+
+ int max_dim = 0;
+ bool need_new_fsymbol = false;
+ std::set<std::string> vars;
+ //fprintf(stderr, "ref->n_dim %d\n", ref->n_dim());
+ for (int i = 0; i < ref->n_dim(); i++) {
+ //fprintf(stderr, "dimension %d\n", i);
+ Relation temp(r.n_inp());
+
+ // r is enclosing relation, we build another that will include this
+ r.setup_names();
+ if (r.is_set())
+ for (int j = 1; j <= r.n_set(); j++) {
+ temp.name_set_var(j, r.set_var(j)->name());
+ }
+ else
+ for (int j = 1; j <= r.n_inp(); j++) {
+ temp.name_input_var(j, r.input_var(j)->name());
+ }
+
+ F_And *temp_root = temp.add_and();
+
+ CG_outputRepr *repr;
+ if (dynamic_cast<IR_PointerArrayRef *>(ref) != NULL)
+ repr = dynamic_cast<IR_PointerArrayRef *>(ref)->index(i); // i or i+1
+ else if (dynamic_cast<IR_ArrayRef *>(ref) != NULL)
+ repr = dynamic_cast<IR_ArrayRef *>(ref)->index(i);
+
+ std::vector<Free_Var_Decl *> freevars;
+ Free_Var_Decl *t = new Free_Var_Decl(s);
+ Variable_ID e = temp.get_local(t);
+ freevars.insert(freevars.end(), t);
+
+ fprintf(stderr, "exp2formula recursing? \n");
+ exp2formula(ir, temp, temp_root, freevars, repr, e, side,
+ IR_COND_EQ, false, uninterpreted_symbols,
+ uninterpreted_symbols_stringrepr);
+ fprintf(stderr, "BACK FROM exp2formula recursing? \n");
+
+ // temp is relation for the index of the array ??
+ for (DNF_Iterator di(temp.query_DNF()); di; di++) {
+ for (EQ_Iterator ei = (*di)->EQs(); ei; ei++) {
+
+ if ((*ei).get_const() != 0)
+ need_new_fsymbol = true;
+ for (Constr_Vars_Iter cvi(*ei); cvi; cvi++)
+ if ((*cvi).var->kind() == Input_Var) {
+ if ((*cvi).var->get_position() > max_dim)
+ max_dim = (*cvi).var->get_position();
+ vars.insert(
+ r.input_var((*cvi).var->get_position())->name());
+
+ }
+ }
+
}
-
+
+ if (max_dim != ref->n_dim())
+ need_new_fsymbol = true;
}
-
- if (max_dim != ref->n_dim())
- need_new_fsymbol = true;
- }
-
- //fprintf(stderr, "%d vars: ", (int)vars.size());
- //for (int i=0; i<vars.size(); i++) fprintf(stderr, "%s", vars[i].c_str());
- //for (std::set<std::string>::iterator it = vars.begin(); it != vars.end(); it++) {
- // fprintf(stderr, "%s ", (*it).c_str());
- //}
- //fprintf(stderr, "\n");
-
- // r is enclosing relation, we build another that will include
- Variable_ID e = find_index(r, s, side); // s is the array named "index"
-
- std::vector<chillAST_node*> internals = ((CG_chillRepr *)v[0])->getChillCode();
- int numnodes = internals.size(); // always 1?
- std::vector<chillAST_DeclRefExpr *>dres;
- std::vector<chillAST_VarDecl*> decls;
- std::vector<chillAST_VarDecl*> sdecls;
- for (int i=0; i<numnodes; i++) {
- internals[i]->gatherScalarVarDecls(sdecls); // vardecls for scalars
- }
-
- //fprintf(stderr, "%d scalar var decls()\n", sdecls.size());
- //for (int i=0; i<sdecls.size(); i++) {
- // fprintf(stderr, "vardecl %2d: ", i);
- // sdecls[i]->print(); printf("\n"); fflush(stdout);
- //}
-
-
- //fprintf(stderr, "omegatools.cc, exp2formula() NOW WHAT\n");
- //exit(0);
-
- if (e == NULL) { // s must be a free variable
- //fprintf(stderr, "'%s' must be free variable\n\n", s.c_str());
- //fprintf(stderr, "SO WE WILL CREATE A MACRO ???\n");
-
- Free_Var_Decl *t = NULL;
-
- // keep adding underscores until we have created a unique name based on the original
- do {
- s += "_";
- t = NULL;
- for (unsigned i = 0; i < freevars.size(); i++) {
- std::string ss = freevars[i]->base_name();
-
- if (s == ss) {
- t = freevars[i];
- break;
+
+ //fprintf(stderr, "%d vars: ", (int)vars.size());
+ //for (int i=0; i<vars.size(); i++) fprintf(stderr, "%s", vars[i].c_str());
+ //for (std::set<std::string>::iterator it = vars.begin(); it != vars.end(); it++) {
+ // fprintf(stderr, "%s ", (*it).c_str());
+ //}
+ //fprintf(stderr, "\n");
+
+ // r is enclosing relation, we build another that will include
+ Variable_ID e = find_index(r, s, side); // s is the array named "index"
+
+ std::vector<chillAST_node *> internals = ((CG_chillRepr *) v[0])->getChillCode();
+ int numnodes = internals.size(); // always 1?
+ std::vector<chillAST_DeclRefExpr *> dres;
+ std::vector<chillAST_VarDecl *> decls;
+ std::vector<chillAST_VarDecl *> sdecls;
+ for (int i = 0; i < numnodes; i++) {
+ internals[i]->gatherScalarVarDecls(sdecls); // vardecls for scalars
+ }
+
+ //fprintf(stderr, "%d scalar var decls()\n", sdecls.size());
+ //for (int i=0; i<sdecls.size(); i++) {
+ // fprintf(stderr, "vardecl %2d: ", i);
+ // sdecls[i]->print(); printf("\n"); fflush(stdout);
+ //}
+
+
+ //fprintf(stderr, "omegatools.cc, exp2formula() NOW WHAT\n");
+ //exit(0);
+
+ if (e == NULL) { // s must be a free variable
+ //fprintf(stderr, "'%s' must be free variable\n\n", s.c_str());
+ //fprintf(stderr, "SO WE WILL CREATE A MACRO ???\n");
+
+ Free_Var_Decl *t = NULL;
+
+ // keep adding underscores until we have created a unique name based on the original
+ do {
+ s += "_";
+ t = NULL;
+ for (unsigned i = 0; i < freevars.size(); i++) {
+ std::string ss = freevars[i]->base_name();
+
+ if (s == ss) {
+ t = freevars[i];
+ break;
+ }
}
+ } while (t != NULL);
+
+ if (!need_new_fsymbol)
+ t = new Free_Var_Decl(s, ref->n_dim());
+ else
+ t = new Free_Var_Decl(s, max_dim);
+ freevars.insert(freevars.end(), t); // add index_____ to freevars
+
+
+ std::vector<std::string> Vargs; // vector of args
+ std::string args;
+ std::vector<omega::CG_outputRepr *> reprs;
+ std::vector<omega::CG_outputRepr *> reprs2;
+ for (std::set<std::string>::iterator it = vars.begin();
+ it != vars.end(); it++) {
+ if (it == vars.begin())
+ args += "(";
+ else
+ args += ",";
+ args += *it;
+ //fprintf(stderr, "an argument to the macro: %s\n", it->c_str());
+ Vargs.push_back((*it));
+ reprs.push_back(ir->builder()->CreateIdent(*it));
+ reprs2.push_back(ir->builder()->CreateIdent(*it));
}
- } while (t != NULL);
-
- if (!need_new_fsymbol)
- t = new Free_Var_Decl(s, ref->n_dim());
- else
- t = new Free_Var_Decl(s, max_dim);
- freevars.insert(freevars.end(), t); // add index_____ to freevars
-
-
- std::vector< std::string > Vargs; // vector of args
- std::string args;
- std::vector<omega::CG_outputRepr *> reprs;
- std::vector<omega::CG_outputRepr *> reprs2;
- for (std::set<std::string>::iterator it = vars.begin();
- it != vars.end(); it++) {
- if (it == vars.begin())
- args += "(";
- else
- args += ",";
- args += *it;
- //fprintf(stderr, "an argument to the macro: %s\n", it->c_str());
- Vargs.push_back( (*it) );
- reprs.push_back(ir->builder()->CreateIdent(*it));
- reprs2.push_back(ir->builder()->CreateIdent(*it));
+ args += ")";
+
+ //fprintf(stderr, "args '%s'\n", args.c_str());
+ //fprintf(stderr, "Vargs ");
+ //for (int i=0; i<Vargs.size(); i++) fprintf(stderr, "%s ",Vargs[i].c_str());
+ //fprintf(stderr, "\n");
+
+ //fprintf(stderr, "omegatools.cc ir->CreateDefineMacro( s (%s), args(%s), repr)\n", s.c_str(), args.c_str());
+
+ // TODO repr, the rhs of the macro, needs to NOT refer to an actual variable ???
+
+
+ ir->CreateDefineMacro(s, Vargs, repr);
+
+
+
+ // index_(i) uses i outputrepr
+ //fprintf(stderr,"omegatools.cc making uninterpreted symbol %s\n",s.c_str());
+ uninterpreted_symbols.insert( // adding to uninterpreted_symbols
+ std::pair<std::string, std::vector<omega::CG_outputRepr *> >(
+ s, reprs));
+ uninterpreted_symbols_stringrepr.insert( // adding to uninterpreted_symbols_stringrepr
+ std::pair<std::string, std::vector<omega::CG_outputRepr *> >(s, reprs2));
+
+
+ e = r.get_local(t, Input_Tuple);
+
+ if (rel == IR_COND_GE || rel == IR_COND_GT) {
+ GEQ_Handle h = f_root->add_GEQ();
+ h.update_coef(lhs, 1);
+ h.update_coef(e, -1);
+ if (rel == IR_COND_GT)
+ h.update_const(-1);
+ } else if (rel == IR_COND_LE || rel == IR_COND_LT) {
+ GEQ_Handle h = f_root->add_GEQ();
+ h.update_coef(lhs, -1);
+ h.update_coef(e, 1);
+ if (rel == IR_COND_LT)
+ h.update_const(-1);
+ } else if (rel == IR_COND_EQ) {
+ EQ_Handle h = f_root->add_EQ();
+ h.update_coef(lhs, 1);
+ h.update_coef(e, -1);
+ } else
+ throw std::invalid_argument("unsupported condition type");
}
- args += ")";
-
- //fprintf(stderr, "args '%s'\n", args.c_str());
- //fprintf(stderr, "Vargs ");
- //for (int i=0; i<Vargs.size(); i++) fprintf(stderr, "%s ",Vargs[i].c_str());
- //fprintf(stderr, "\n");
-
- //fprintf(stderr, "omegatools.cc ir->CreateDefineMacro( s (%s), args(%s), repr)\n", s.c_str(), args.c_str());
-
- // TODO repr, the rhs of the macro, needs to NOT refer to an actual variable ???
-
-
- ir->CreateDefineMacro(s, Vargs, repr);
-
-
-
- // index_(i) uses i outputrepr
- //fprintf(stderr,"omegatools.cc making uninterpreted symbol %s\n",s.c_str());
- uninterpreted_symbols.insert( // adding to uninterpreted_symbols
- std::pair<std::string, std::vector<omega::CG_outputRepr *> >(
- s, reprs));
- uninterpreted_symbols_stringrepr.insert( // adding to uninterpreted_symbols_stringrepr
- std::pair<std::string, std::vector<omega::CG_outputRepr *> >(s, reprs2));
-
-
- e = r.get_local(t, Input_Tuple);
-
- if (rel == IR_COND_GE || rel == IR_COND_GT) {
- GEQ_Handle h = f_root->add_GEQ();
- h.update_coef(lhs, 1);
- h.update_coef(e, -1);
- if (rel == IR_COND_GT)
- h.update_const(-1);
- } else if (rel == IR_COND_LE || rel == IR_COND_LT) {
- GEQ_Handle h = f_root->add_GEQ();
- h.update_coef(lhs, -1);
- h.update_coef(e, 1);
- if (rel == IR_COND_LT)
- h.update_const(-1);
- } else if (rel == IR_COND_EQ) {
- EQ_Handle h = f_root->add_EQ();
- h.update_coef(lhs, 1);
- h.update_coef(e, -1);
- } else
- throw std::invalid_argument("unsupported condition type");
- }
- // delete v[0];
- delete ref;
- if (destroy) delete repr;
-
- //fprintf(stderr, "FINALLY DONE with IR_OP_ARRAY_VARIABLE\n\n");
- break;
- }
+ // delete v[0];
+ delete ref;
+ if (destroy) delete repr;
+
+ //fprintf(stderr, "FINALLY DONE with IR_OP_ARRAY_VARIABLE\n\n");
+ break;
+ }
- case IR_OP_NULL:
- fprintf(stderr, "IR_OP_NULL\n");
- break;
+ case IR_OP_NULL:
+ fprintf(stderr, "IR_OP_NULL\n");
+ break;
- default:
- throw ir_exp_error("unsupported operand type");
+ default:
+ throw ir_exp_error("unsupported operand type");
}
}
-
-
//-----------------------------------------------------------------------------
// Build dependence relation for two array references.
// -----------------------------------------------------------------------------
-Relation arrays2relation(IR_Code *ir, std::vector<Free_Var_Decl*> &freevars,
+Relation arrays2relation(IR_Code *ir, std::vector<Free_Var_Decl *> &freevars,
const IR_ArrayRef *ref_src, const Relation &IS_w,
const IR_ArrayRef *ref_dst, const Relation &IS_r,
std::map<std::string, std::vector<omega::CG_outputRepr *> > &uninterpreted_symbols,
std::map<std::string, std::vector<omega::CG_outputRepr *> > &uninterpreted_symbols_stringrepr) {
-
+
//fprintf(stderr, "arrays2relation()\n");
//fprintf(stderr, "%d freevars\n", freevars.size());
//for (int i=0; i<freevars.size(); i++) fprintf(stderr, "freevar %d %s\n", i, (const char *)(freevars[i]->base_name()));
-
-
+
+
Relation &IS1 = const_cast<Relation &>(IS_w);
Relation &IS2 = const_cast<Relation &>(IS_r);
-
+
//Relation *helper;
//helper = new Relation(IS1); fprintf(stderr, "IS1 "); helper->print(); fflush(stdout);
//helper = new Relation(IS2); fprintf(stderr, "IS2 "); helper->print(); fflush(stdout);
-
+
Relation r(IS1.n_set(), IS2.n_set());
//helper = new Relation(r); fprintf(stderr, "r "); helper->print(); fflush(stdout);
-
+
for (int i = 1; i <= IS1.n_set(); i++)
r.name_input_var(i, IS1.set_var(i)->name());
-
+
for (int i = 1; i <= IS2.n_set(); i++)
- r.name_output_var(i, IS2.set_var(i)->name()+"'");
-
+ r.name_output_var(i, IS2.set_var(i)->name() + "'");
+
//fprintf(stderr, "omegatools.cc sym_src\n");
IR_Symbol *sym_src = ref_src->symbol();
IR_Symbol *sym_dst = ref_dst->symbol();
//fprintf(stderr, "omegatools.cc going to do IR_Symbol operator==\n");
//fprintf(stderr, "omegatools.cc comparing symbol 0x%x to symbol 0x%x\n", sym_src, sym_dst);
-
+
//if (!(*sym_src == *sym_dst)) fprintf(stderr, "!(*sym_src == *sym_dst)\n");
-
+
//fprintf(stderr, "calling !=\n");
//if (*sym_src != *sym_dst) fprintf(stderr, "omegatools.cc (*sym_src != *sym_dst) TRUE\n");
//else fprintf(stderr, "omegatools.cc (*sym_src != *sym_dst) FALSE\n");
-
+
//fprintf(stderr, "calling ==\n");
//if ((*sym_src == *sym_dst)) fprintf(stderr, "(*sym_src == *sym_dst)) TRUE \n");
//else fprintf(stderr, "(*sym_src == *sym_dst) FALSE \n");
-
+
if (*sym_src != *sym_dst) {
//if (!(*sym_src == *sym_dst)) {
//fprintf(stderr, "False Relation\n");
@@ -925,35 +876,34 @@ Relation arrays2relation(IR_Code *ir, std::vector<Free_Var_Decl*> &freevars,
delete sym_src;
delete sym_dst;
return r;
- }
- else {
+ } else {
delete sym_src;
delete sym_dst;
}
-
+
//fprintf(stderr, "f_root\n");
F_And *f_root = r.add_and();
-
+
//fprintf(stderr, "omegatools.cc ref_src->n_dim() %d\n", ref_src->n_dim());
for (int i = 0; i < ref_src->n_dim(); i++) {
//fprintf(stderr, "arrays2 i %d\n", i);
-
+
F_Exists *f_exists = f_root->add_exists();
Variable_ID e1 = f_exists->declare(tmp_e());
Variable_ID e2 = f_exists->declare(tmp_e());
F_And *f_and = f_exists->add_and();
-
+
CG_outputRepr *repr_src = ref_src->index(i);
CG_outputRepr *repr_dst = ref_dst->index(i);
-
+
bool has_complex_formula = false;
-
+
if (ir->QueryExpOperation(repr_src) == IR_OP_ARRAY_VARIABLE
|| ir->QueryExpOperation(repr_dst) == IR_OP_ARRAY_VARIABLE)
has_complex_formula = true;
-
+
if (!has_complex_formula) {
-
+
try {
exp2formula(ir, r, f_and, freevars, repr_src, e1, 'w', IR_COND_EQ, false,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
@@ -963,7 +913,7 @@ Relation arrays2relation(IR_Code *ir, std::vector<Free_Var_Decl*> &freevars,
catch (const ir_exp_error &e) {
has_complex_formula = true;
}
-
+
if (!has_complex_formula) {
EQ_Handle h = f_and->add_EQ();
h.update_coef(e1, 1);
@@ -975,15 +925,15 @@ Relation arrays2relation(IR_Code *ir, std::vector<Free_Var_Decl*> &freevars,
delete repr_src;
delete repr_dst;
}
-
+
// add iteration space restriction
r = Restrict_Domain(r, copy(IS1));
r = Restrict_Range(r, copy(IS2));
-
+
// reset the output variable names lost in restriction
for (int i = 1; i <= IS2.n_set(); i++)
- r.name_output_var(i, IS2.set_var(i)->name()+"'");
-
+ r.name_output_var(i, IS2.set_var(i)->name() + "'");
+
//helper = new Relation(r); fprintf(stderr, "r "); helper->print(); fflush(stdout);
//fprintf(stderr, "leaving arrays2relation\n");
return r;
@@ -994,42 +944,42 @@ Relation arrays2relation(IR_Code *ir, std::vector<Free_Var_Decl*> &freevars,
// Convert array dependence relation into set of dependence vectors, assuming
// ref_w is lexicographically before ref_r in the source code.
// -----------------------------------------------------------------------------
-std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relation2dependences (
- const IR_ArrayRef *ref_src,
- const IR_ArrayRef *ref_dst,
- const Relation &r) {
+std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relation2dependences(
+ const IR_ArrayRef *ref_src,
+ const IR_ArrayRef *ref_dst,
+ const Relation &r) {
//fprintf(stderr, "relation2dependences()\n");
assert(r.n_inp() == r.n_out());
-
- std::vector<DependenceVector> dependences1, dependences2;
+
+ std::vector<DependenceVector> dependences1, dependences2;
//std::vector<DependenceVector*> dep1, dep2;
std::stack<DependenceLevel> working;
working.push(DependenceLevel(r, r.n_inp()));
-
+
while (!working.empty()) {
//fprintf(stderr, "!empty size %d\n", working.size());
-
+
DependenceLevel dep = working.top();
working.pop();
-
+
//if (!dep.r.is_satisfiable()) fprintf(stderr, "NOT dep.r.is_satisfiable()\n");
//else fprintf(stderr, " dep.r.is_satisfiable()\n");
-
+
// No dependence exists, move on.
- if (!dep.r.is_satisfiable()) {
+ if (!dep.r.is_satisfiable()) {
//fprintf(stderr, "No dependence exists, move on.\n");
continue;
}
-
+
//fprintf(stderr, "satisfiable\n");
//fprintf(stderr, "dep.level %d r.n_inp() %d\n", dep.level, r.n_inp());
if (dep.level == r.n_inp()) {
//fprintf(stderr, "dep.level == r.n_inp()\n");
DependenceVector dv;
-
+
//fprintf(stderr, "\ndv created in if ***\n");
//DependenceVector *dv2 = new DependenceVector;
-
+
//fprintf(stderr, "for loop independent dependence dep.dir %d\n", dep.dir);
// for loop independent dependence, use lexical order to
// determine the correct source and destination
@@ -1039,59 +989,54 @@ std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relatio
//fprintf(stderr, "trivial\n");
continue; // trivial self zero-dependence
}
-
+
if (ref_src->is_write()) {
if (ref_dst->is_write())
dv.type = DEP_W2W;
else
dv.type = DEP_W2R;
- }
- else {
+ } else {
if (ref_dst->is_write())
dv.type = DEP_R2W;
else
dv.type = DEP_R2R;
}
-
- }
- else if (dep.dir == 1) {
+
+ } else if (dep.dir == 1) {
//fprintf(stderr, "dep.dir == 1\n");
if (ref_src->is_write()) {
if (ref_dst->is_write())
dv.type = DEP_W2W;
else
dv.type = DEP_W2R;
- }
- else {
+ } else {
if (ref_dst->is_write())
dv.type = DEP_R2W;
else
dv.type = DEP_R2R;
}
- }
- else { // dep.dir == -1
+ } else { // dep.dir == -1
//fprintf(stderr, "dep.dir == -1\n");
if (ref_dst->is_write()) {
if (ref_src->is_write())
dv.type = DEP_W2W;
else
dv.type = DEP_W2R;
- }
- else {
+ } else {
if (ref_src->is_write())
dv.type = DEP_R2W;
else
dv.type = DEP_R2R;
}
}
-
+
dv.lbounds = dep.lbounds;
dv.ubounds = dep.ubounds;
-
+
//fprintf(stderr, "omegatools.cc calling ref_src->symbol();\n");
dv.sym = ref_src->symbol();
//fprintf(stderr, "dv.sym = %p\n", dv.sym);
-
+
//fprintf(stderr, "symbol %s ADDING A DEPENDENCE OF TYPE ", dv.sym->name().c_str());
//switch (dv.type) {
//case DEP_W2W: fprintf(stderr, "DEP_W2W to "); break;
@@ -1102,12 +1047,12 @@ std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relatio
//}
//if (dep.dir == 0 || dep.dir == 1) fprintf(stderr, "dependences1\n");
//else fprintf(stderr, "dependences2\n");
-
+
if (dep.dir == 0 || dep.dir == 1) {
//fprintf(stderr, "pushing dv\n");
dependences1.push_back(dv);
//fprintf(stderr, "DONE pushing dv\n");
-
+
//fprintf(stderr, "now %d dependences1\n", dependences1.size() );
//for (int i=0; i<dependences1.size(); i++) {
// fprintf(stderr, "dependences1[%d]: ", i );
@@ -1116,12 +1061,11 @@ std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relatio
// fprintf(stderr, "%s\n", dependences1[i].sym->name().c_str());
//}
//fprintf(stderr, "\n");
- }
- else {
+ } else {
//fprintf(stderr, "pushing dv\n");
dependences2.push_back(dv);
//fprintf(stderr, "DONE pushing dv\n");
-
+
//fprintf(stderr, "now %d dependences2\n", dependences2.size() );
//for (int i=0; i<dependences2.size(); i++) {
// fprintf(stderr, "dependences2[%d]: ", i);
@@ -1131,113 +1075,111 @@ std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relatio
//}
//fprintf(stderr, "\n");
}
-
+
//fprintf(stderr, "dv goes out of scope ***\n");
- }
- else {
+ } else {
//fprintf(stderr, "now work on the next dimension level\n");
// now work on the next dimension level
int level = ++dep.level;
//fprintf(stderr, "level %d\n", level);
-
+
coef_t lbound, ubound;
Relation delta = Deltas(copy(dep.r));
//delta.print(); fflush(stdout);
delta.query_variable_bounds(delta.set_var(level), lbound, ubound);
//fprintf(stderr, "delta lb " coef_fmt " 0x%llx ub " coef_fmt " 0x%llx\n", lbound,lbound,ubound,ubound);
-
-
+
+
if (dep.dir == 0) {
//fprintf(stderr, "dep.dir == 0\n");
if (lbound > 0) {
dep.dir = 1;
- dep.lbounds[level-1] = lbound;
- dep.ubounds[level-1] = ubound;
-
+ dep.lbounds[level - 1] = lbound;
+ dep.ubounds[level - 1] = ubound;
+
//fprintf(stderr, "push 1\n");
working.push(dep);
- }
- else if (ubound < 0) {
+ } else if (ubound < 0) {
dep.dir = -1;
- dep.lbounds[level-1] = -ubound;
- dep.ubounds[level-1] = -lbound;
-
+ dep.lbounds[level - 1] = -ubound;
+ dep.ubounds[level - 1] = -lbound;
+
//fprintf(stderr, "push 2\n");
working.push(dep);
- }
- else {
+ } else {
// split the dependence vector into flow- and anti-dependence
// for the first non-zero distance, also separate zero distance
// at this level.
{
DependenceLevel dep2 = dep;
-
- dep2.lbounds[level-1] = 0;
- dep2.ubounds[level-1] = 0;
-
+
+ dep2.lbounds[level - 1] = 0;
+ dep2.ubounds[level - 1] = 0;
+
F_And *f_root = dep2.r.and_with_and();
EQ_Handle h = f_root->add_EQ();
h.update_coef(dep2.r.input_var(level), 1);
h.update_coef(dep2.r.output_var(level), -1);
-
+
//fprintf(stderr, "push 3\n");
working.push(dep2);
}
-
+
//fprintf(stderr, "lbound %lld 0x%llx\n", lbound, lbound);
//if (lbound < 0LL) fprintf(stderr, "lbound < 0LL\n");
//if (*ref_src != *ref_dst) fprintf(stderr, "(*ref_src != *ref_dst)\n");
//else fprintf(stderr, "(*ref_src EQUAL *ref_dst)\n");
-
+
if (lbound < 0LL && (*ref_src != *ref_dst)) { // c == c
DependenceLevel dep2 = dep;
-
+
F_And *f_root = dep2.r.and_with_and();
GEQ_Handle h = f_root->add_GEQ();
h.update_coef(dep2.r.input_var(level), 1);
h.update_coef(dep2.r.output_var(level), -1);
h.update_const(-1);
-
+
// get tighter bounds under new constraints
coef_t lbound, ubound;
delta = Deltas(copy(dep2.r));
delta.query_variable_bounds(delta.set_var(level),
lbound, ubound);
-
- dep2.dir = -1;
- dep2.lbounds[level-1] = std::max(-ubound,static_cast<coef_t>(1)); // use max() to avoid Omega retardedness
- dep2.ubounds[level-1] = -lbound;
-
+
+ dep2.dir = -1;
+ dep2.lbounds[level - 1] = std::max(-ubound,
+ static_cast<coef_t>(1)); // use max() to avoid Omega retardedness
+ dep2.ubounds[level - 1] = -lbound;
+
//fprintf(stderr, "push 4\n");
working.push(dep2);
}
-
+
//fprintf(stderr, "ubound %d\n", ubound);
if (ubound > 0) {
DependenceLevel dep2 = dep;
-
+
F_And *f_root = dep2.r.and_with_and();
GEQ_Handle h = f_root->add_GEQ();
h.update_coef(dep2.r.input_var(level), -1);
h.update_coef(dep2.r.output_var(level), 1);
h.update_const(-1);
-
+
// get tighter bonds under new constraints
coef_t lbound, ubound;
delta = Deltas(copy(dep2.r));
delta.query_variable_bounds(delta.set_var(level),
lbound, ubound);
dep2.dir = 1;
- dep2.lbounds[level-1] = std::max(lbound,static_cast<coef_t>(1)); // use max() to avoid Omega retardness
- dep2.ubounds[level-1] = ubound;
-
+ dep2.lbounds[level - 1] = std::max(lbound, static_cast<coef_t>(1)); // use max() to avoid Omega retardness
+ dep2.ubounds[level - 1] = ubound;
+
//fprintf(stderr, "push 5\n");
working.push(dep2);
}
}
}
- // now deal with dependence vector with known direction
- // determined at previous levels
+ // now deal with dependence vector with known direction
+ // determined at previous levels
else {
//fprintf(stderr, "else messy\n");
// For messy bounds, further test to see if the dependence distance
@@ -1250,7 +1192,7 @@ std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relatio
h.update_coef(t.input_var(level), 1);
h.update_coef(t.output_var(level), -1);
h.update_const(-1);
-
+
if (!t.is_satisfiable()) {
lbound = 0;
}
@@ -1262,13 +1204,13 @@ std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relatio
h.update_coef(t.input_var(level), -1);
h.update_coef(t.output_var(level), 1);
h.update_const(-1);
-
+
if (!t.is_satisfiable()) {
ubound = 0;
}
}
}
-
+
// Same thing as above, test to see if zero dependence
// distance possible.
if (lbound == 0 || ubound == 0) {
@@ -1277,7 +1219,7 @@ std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relatio
EQ_Handle h = f_root->add_EQ();
h.update_coef(t.input_var(level), 1);
h.update_coef(t.output_var(level), -1);
-
+
if (!t.is_satisfiable()) {
if (lbound == 0)
lbound = 1;
@@ -1285,31 +1227,30 @@ std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relatio
ubound = -1;
}
}
-
+
if (dep.dir == -1) {
- dep.lbounds[level-1] = -ubound;
- dep.ubounds[level-1] = -lbound;
- }
- else { // dep.dir == 1
- dep.lbounds[level-1] = lbound;
- dep.ubounds[level-1] = ubound;
+ dep.lbounds[level - 1] = -ubound;
+ dep.ubounds[level - 1] = -lbound;
+ } else { // dep.dir == 1
+ dep.lbounds[level - 1] = lbound;
+ dep.ubounds[level - 1] = ubound;
}
-
+
//fprintf(stderr, "push 6\n");
working.push(dep);
}
}
//fprintf(stderr, "at bottom, size %d\n", working.size());
-
+
}
-
+
//fprintf(stderr, "leaving relation2dependences, %d and %d dependences\n", dependences1.size(), dependences2.size());
-
-
+
+
//for (int i=0; i<dependences1.size(); i++) {
//fprintf(stderr, "dependences1[%d]: ", i);
//fprintf(stderr, "symbol %s\n", dependences1[i].sym->name().c_str());
-
+
//fprintf(stderr, "symbol %s HAS A left DEPENDENCE OF TYPE ", dependences1[i].sym->name().c_str());
//switch (dependences1[i].type) {
//case DEP_W2W: fprintf(stderr, "DEP_W2W\n"); break;
@@ -1319,10 +1260,10 @@ std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relatio
//default: fprintf(stderr, "DEP_UNKNOWN\n"); break;
//}
//}
-
-
+
+
//for (int i=0; i<dependences2.size(); i++) {
-
+
//fprintf(stderr, "symbol %s HAS A right DEPENDENCE OF TYPE ", dependences2[i].sym->name().c_str());
//switch (dependences2[i].type) {
//case DEP_W2W: fprintf(stderr, "DEP_W2W\n"); break;
@@ -1332,9 +1273,9 @@ std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relatio
//default: fprintf(stderr, "DEP_UNKNOWN\n"); break;
//}
//}
-
-
-
+
+
+
return std::make_pair(dependences1, dependences2);
}
@@ -1345,19 +1286,17 @@ std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relatio
//-----------------------------------------------------------------------------
void exp2constraint(IR_Code *ir, Relation &r, F_And *f_root,
std::vector<Free_Var_Decl *> &freevars,
- CG_outputRepr *repr,
+ CG_outputRepr *repr,
bool destroy,
std::map<std::string, std::vector<omega::CG_outputRepr *> > &uninterpreted_symbols,
- std::map<std::string, std::vector<omega::CG_outputRepr *> > &uninterpreted_symbols_stringrepr)
-{
+ std::map<std::string, std::vector<omega::CG_outputRepr *> > &uninterpreted_symbols_stringrepr) {
IR_CONDITION_TYPE cond = ir->QueryBooleanExpOperation(repr);
switch (cond) {
- case IR_COND_LT:
- case IR_COND_LE:
- case IR_COND_EQ:
- case IR_COND_GT:
- case IR_COND_GE:
- {
+ case IR_COND_LT:
+ case IR_COND_LE:
+ case IR_COND_EQ:
+ case IR_COND_GT:
+ case IR_COND_GE: {
F_Exists *f_exist = f_root->add_exists();
Variable_ID e = f_exist->declare();
F_And *f_and = f_exist->add_and();
@@ -1366,13 +1305,12 @@ void exp2constraint(IR_Code *ir, Relation &r, F_And *f_root,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
exp2formula(ir, r, f_and, freevars, op[1], e, 's', cond, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
-
+
if (destroy)
delete repr;
break;
}
- case IR_COND_NE:
- {
+ case IR_COND_NE: {
F_Exists *f_exist = f_root->add_exists();
Variable_ID e = f_exist->declare();
F_Or *f_or = f_exist->add_or();
@@ -1382,19 +1320,19 @@ void exp2constraint(IR_Code *ir, Relation &r, F_And *f_root,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
exp2formula(ir, r, f_and, freevars, op[1], e, 's', IR_COND_GT, false,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
-
+
f_and = f_or->add_and();
exp2formula(ir, r, f_and, freevars, op[0], e, 's', IR_COND_EQ, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
exp2formula(ir, r, f_and, freevars, op[1], e, 's', IR_COND_LT, true,
uninterpreted_symbols, uninterpreted_symbols_stringrepr);
-
+
if (destroy)
delete repr;
break;
- }
- default:
- throw ir_exp_error("unrecognized conditional expression");
+ }
+ default:
+ throw ir_exp_error("unrecognized conditional expression");
}
}
@@ -1443,20 +1381,19 @@ void exp2constraint(IR_Code *ir, Relation &r, F_And *f_root,
// Determine whether the loop (starting from 0) in the iteration space
// has only one iteration.
//-----------------------------------------------------------------------------
-bool is_single_loop_iteration(const Relation &r,
- int level,
+bool is_single_loop_iteration(const Relation &r,
+ int level,
const Relation &known) {
int n = r.n_set();
Relation r1;
- if(n > known.n_set()) {
+ if (n > known.n_set()) {
r1 = Intersection(copy(r), Extend_Set(copy(known), n - known.n_set()));
- }
- else{
+ } else {
r1 = Intersection(copy(known), Extend_Set(copy(r), known.n_set() - n));
n = known.n_set();
}
-
-
+
+
Relation mapping(n, n);
F_And *f_root = mapping.add_and();
for (int i = 1; i <= level; i++) {
@@ -1466,7 +1403,7 @@ bool is_single_loop_iteration(const Relation &r,
}
r1 = Range(Restrict_Domain(mapping, r1));
r1.simplify();
-
+
Variable_ID v = r1.set_var(level);
for (DNF_Iterator di(r1.query_DNF()); di; di++) {
bool is_single = false;
@@ -1475,31 +1412,29 @@ bool is_single_loop_iteration(const Relation &r,
is_single = true;
break;
}
-
+
if (!is_single)
return false;
}
-
+
return true;
}
-
-
bool is_single_iteration(const Relation &r, int dim) {
assert(r.is_set());
const int n = r.n_set();
-
+
if (dim >= n)
return true;
-
+
Relation bound = get_loop_bound(r, dim);
-
+
// if (!bound.has_single_conjunct())
// return false;
-
+
// Conjunct *c = bound.query_DNF()->single_conjunct();
-
+
for (DNF_Iterator di(bound.query_DNF()); di; di++) {
bool is_single = false;
for (EQ_Iterator ei((*di)->EQs()); ei; ei++)
@@ -1507,50 +1442,50 @@ bool is_single_iteration(const Relation &r, int dim) {
is_single = true;
break;
}
-
+
if (!is_single)
return false;
}
-
+
return true;
-
-
-
-
+
+
+
+
// Relation r = copy(r_);
// const int n = r.n_set();
-
+
// if (dim >= n)
// return true;
-
+
// Relation bound = get_loop_bound(r, dim);
// bound = Approximate(bound);
// Conjunct *c = bound.query_DNF()->single_conjunct();
-
+
// return c->n_GEQs() == 0;
-
-
-
-
-
+
+
+
+
+
// Relation r = copy(r_);
// r.simplify();
// const int n = r.n_set();
-
+
// if (dim >= n)
// return true;
-
+
// for (DNF_Iterator i(r.query_DNF()); i; i++) {
// std::vector<bool> is_single(n);
// for (int j = 0; j < dim; j++)
// is_single[j] = true;
// for (int j = dim; j < n; j++)
// is_single[j] = false;
-
+
// bool found_new_single = true;
// while (found_new_single) {
// found_new_single = false;
-
+
// for (EQ_Iterator j = (*i)->EQs(); j; j++) {
// int saved_pos = -1;
// for (Constr_Vars_Iter k(*j); k; k++)
@@ -1564,21 +1499,21 @@ bool is_single_iteration(const Relation &r, int dim) {
// break;
// }
// }
-
+
// if (saved_pos != -1) {
// is_single[saved_pos] = true;
// found_new_single = true;
// }
// }
-
+
// if (is_single[dim])
// break;
// }
-
+
// if (!is_single[dim])
// return false;
// }
-
+
// return true;
}
@@ -1587,23 +1522,22 @@ bool is_single_iteration(const Relation &r, int dim) {
//-----------------------------------------------------------------------------
void assign_const(Relation &r, int dim, int val) {
const int n = r.n_out();
-
+
Relation mapping(n, n);
F_And *f_root = mapping.add_and();
-
+
for (int i = 1; i <= n; i++) {
- if (i != dim+1) {
+ if (i != dim + 1) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(mapping.output_var(i), 1);
h.update_coef(mapping.input_var(i), -1);
- }
- else {
+ } else {
EQ_Handle h = f_root->add_EQ();
h.update_coef(mapping.output_var(i), 1);
h.update_const(-val);
}
}
-
+
r = Composition(mapping, r);
}
@@ -1611,46 +1545,42 @@ void assign_const(Relation &r, int dim, int val) {
int get_const(const Relation &r, int dim, Var_Kind type) {
// Relation rr = copy(r);
Relation &rr = const_cast<Relation &>(r);
-
+
Variable_ID v;
switch (type) {
// case Set_Var:
// v = rr.set_var(dim+1);
// break;
- case Input_Var:
- v = rr.input_var(dim+1);
- break;
- case Output_Var:
- v = rr.output_var(dim+1);
- break;
- default:
- throw std::invalid_argument("unsupported variable type");
+ case Input_Var:
+ v = rr.input_var(dim + 1);
+ break;
+ case Output_Var:
+ v = rr.output_var(dim + 1);
+ break;
+ default:
+ throw std::invalid_argument("unsupported variable type");
}
-
+
for (DNF_Iterator di(rr.query_DNF()); di; di++)
for (EQ_Iterator ei = (*di)->EQs(); ei; ei++)
if ((*ei).is_const(v))
return (*ei).get_const();
-
+
throw std::runtime_error("cannot get variable's constant value");
}
-
-
-
-
//---------------------------------------------------------------------------
// Get the bound for a specific loop.
//---------------------------------------------------------------------------
Relation get_loop_bound(const Relation &r, int dim) {
assert(r.is_set());
const int n = r.n_set();
-
+
// Relation r1 = project_onto_levels(copy(r), dim+1, true);
- Relation mapping(n,n);
+ Relation mapping(n, n);
F_And *f_root = mapping.add_and();
- for (int i = 1; i <= dim+1; i++) {
+ for (int i = 1; i <= dim + 1; i++) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(mapping.input_var(i), 1);
h.update_coef(mapping.output_var(i), -1);
@@ -1659,26 +1589,25 @@ Relation get_loop_bound(const Relation &r, int dim) {
for (int i = 1; i <= n; i++)
r1.name_set_var(i, const_cast<Relation &>(r).set_var(i)->name());
r1.setup_names();
- Relation r2 = Project(copy(r1), dim+1, Set_Var);
-
+ Relation r2 = Project(copy(r1), dim + 1, Set_Var);
+
return Gist(r1, r2, 1);
}
-
Relation get_loop_bound(const Relation &r, int level, const Relation &known) {
int n1 = r.n_set();
int n = n1;
Relation r1;
- if(n > known.n_set())
+ if (n > known.n_set())
r1 = Intersection(copy(r),
Extend_Set(copy(known), n - known.n_set()));
- else{
+ else {
r1 = Intersection(copy(known),
Extend_Set(copy(r), known.n_set() - n));
n = known.n_set();
}
-
+
Relation mapping(n, n);
F_And *f_root = mapping.add_and();
for (int i = 1; i <= level; i++) {
@@ -1689,20 +1618,19 @@ Relation get_loop_bound(const Relation &r, int level, const Relation &known) {
r1 = Range(Restrict_Domain(mapping, r1));
Relation r2 = Project(copy(r1), level, Set_Var);
r1 = Gist(r1, r2, 1);
-
+
for (int i = 1; i <= n1; i++)
r1.name_set_var(i, const_cast<Relation &>(r).set_var(i)->name());
r1.setup_names();
-
+
return r1;
}
-
Relation get_max_loop_bound(const std::vector<Relation> &r, int dim) {
if (r.size() == 0)
return Relation::Null();
-
+
const int n = r[0].n_set();
Relation res(Relation::False(n));
for (int i = 0; i < r.size(); i++) {
@@ -1710,16 +1638,16 @@ Relation get_max_loop_bound(const std::vector<Relation> &r, int dim) {
if (t.is_satisfiable())
res = Union(get_loop_bound(t, dim), res);
}
-
+
res.simplify();
-
+
return res;
}
Relation get_min_loop_bound(const std::vector<Relation> &r, int dim) {
if (r.size() == 0)
return Relation::Null();
-
+
const int n = r[0].n_set();
Relation res(Relation::True(n));
for (int i = 0; i < r.size(); i++) {
@@ -1727,9 +1655,9 @@ Relation get_min_loop_bound(const std::vector<Relation> &r, int dim) {
if (t.is_satisfiable())
res = Intersection(get_loop_bound(t, dim), res);
}
-
+
res.simplify();
-
+
return res;
}
@@ -1751,47 +1679,43 @@ void add_loop_stride(Relation &r, const Relation &bound_, int dim, int stride) {
stride_eq.update_coef(e1, 1);
stride_eq.update_coef(e2, stride);
if (!r.is_set())
- stride_eq.update_coef(r.output_var(dim+1), -1);
+ stride_eq.update_coef(r.output_var(dim + 1), -1);
else
- stride_eq.update_coef(r.set_var(dim+1), -1);
+ stride_eq.update_coef(r.set_var(dim + 1), -1);
F_Or *f_or = f_and->add_or();
-
+
for (GEQ_Iterator gi = (*di)->GEQs(); gi; gi++) {
- if ((*gi).get_coef(bound.set_var(dim+1)) > 0) {
+ if ((*gi).get_coef(bound.set_var(dim + 1)) > 0) {
// copy the lower bound constraint
EQ_Handle h1 = f_or->add_and()->add_EQ();
GEQ_Handle h2 = f_and->add_GEQ();
for (Constr_Vars_Iter ci(*gi); ci; ci++) {
switch ((*ci).var->kind()) {
// case Set_Var:
- case Input_Var:
- {
+ case Input_Var: {
int pos = (*ci).var->get_position();
if (pos == dim + 1) {
h1.update_coef(e1, (*ci).coef);
h2.update_coef(e1, (*ci).coef);
- }
- else {
+ } else {
if (!r.is_set()) {
h1.update_coef(r.output_var(pos), (*ci).coef);
h2.update_coef(r.output_var(pos), (*ci).coef);
- }
- else {
+ } else {
h1.update_coef(r.set_var(pos), (*ci).coef);
h2.update_coef(r.set_var(pos), (*ci).coef);
- }
+ }
}
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = (*ci).var->get_global_var();
h1.update_coef(r.get_local(g, (*ci).var->function_of()), (*ci).coef);
h2.update_coef(r.get_local(g, (*ci).var->function_of()), (*ci).coef);
break;
}
- default:
- break;
+ default:
+ break;
}
}
h1.update_const((*gi).get_const());
@@ -1802,35 +1726,35 @@ void add_loop_stride(Relation &r, const Relation &bound_, int dim, int stride) {
}
-bool is_inner_loop_depend_on_level(const Relation &r,
+bool is_inner_loop_depend_on_level(const Relation &r,
int level,
const Relation &known) {
-
+
Relation r1;
- if(r.n_set() > known.n_set())
+ if (r.n_set() > known.n_set())
r1 = Intersection(copy(r),
Extend_Set(copy(known), r.n_set() - known.n_set()));
else
r1 = Intersection(copy(known),
Extend_Set(copy(r), known.n_set() - r.n_set()));
-
+
Relation r2 = copy(r1);
- for (int i = level+1; i <= r2.n_set(); i++)
+ for (int i = level + 1; i <= r2.n_set(); i++)
r2 = Project(r2, r2.set_var(i));
r2.simplify(2, 4);
Relation r3 = Gist(r1, r2);
-
+
Variable_ID v = r3.set_var(level);
for (DNF_Iterator di(r3.query_DNF()); di; di++) {
for (EQ_Iterator ei = (*di)->EQs(); ei; ei++)
if ((*ei).get_coef(v) != 0)
return true;
-
+
for (GEQ_Iterator gi = (*di)->GEQs(); gi; gi++)
if ((*gi).get_coef(v) != 0)
return true;
}
-
+
return false;
}
@@ -1846,14 +1770,14 @@ bool is_inner_loop_depend_on_level(const Relation &r,
Relation adjust_loop_bound(const Relation &r, int level, int adjustment) {
if (adjustment == 0)
return copy(r);
-
+
const int n = r.n_set();
Relation r1 = copy(r);
- for (int i = level+1; i <= r1.n_set(); i++)
+ for (int i = level + 1; i <= r1.n_set(); i++)
r1 = Project(r1, r1.set_var(i));
r1.simplify(2, 4);
Relation r2 = Gist(copy(r), copy(r1));
-
+
Relation mapping(n, n);
F_And *f_root = mapping.add_and();
for (int i = 1; i <= n; i++)
@@ -1862,17 +1786,16 @@ Relation adjust_loop_bound(const Relation &r, int level, int adjustment) {
h.update_coef(mapping.input_var(level), -1);
h.update_coef(mapping.output_var(level), 1);
h.update_const(static_cast<coef_t>(adjustment));
- }
- else {
+ } else {
EQ_Handle h = f_root->add_EQ();
h.update_coef(mapping.input_var(i), -1);
h.update_coef(mapping.output_var(i), 1);
}
-
+
r2 = Range(Restrict_Domain(mapping, r2));
r1 = Intersection(r1, r2);
r1.simplify();
-
+
for (int i = 1; i <= n; i++)
r1.name_set_var(i, const_cast<Relation &>(r).set_var(i)->name());
r1.setup_names();
@@ -2111,28 +2034,27 @@ Relation adjust_loop_bound(const Relation &r, int level, int adjustment) {
//-----------------------------------------------------------------------------
Relation permute_relation(const std::vector<int> &pi) {
const int n = pi.size();
-
+
Relation r(n, n);
F_And *f_root = r.add_and();
-
- for (int i = 0; i < n; i++) {
+
+ for (int i = 0; i < n; i++) {
EQ_Handle h = f_root->add_EQ();
- h.update_coef(r.output_var(i+1), 1);
- h.update_coef(r.input_var(pi[i]+1), -1);
+ h.update_coef(r.output_var(i + 1), 1);
+ h.update_coef(r.input_var(pi[i] + 1), -1);
}
-
+
return r;
}
-
//---------------------------------------------------------------------------
// Find the position index variable in a Relation by name.
//---------------------------------------------------------------------------
Variable_ID find_index(Relation &r, const std::string &s, char side) {
// Omega quirks: assure the names are propagated inside the relation
r.setup_names();
-
+
if (r.is_set()) { // side == 's'
for (int i = 1; i <= r.n_set(); i++) {
std::string ss = r.set_var(i)->name();
@@ -2140,24 +2062,22 @@ Variable_ID find_index(Relation &r, const std::string &s, char side) {
return r.set_var(i);
}
}
- }
- else if (side == 'w') {
+ } else if (side == 'w') {
for (int i = 1; i <= r.n_inp(); i++) {
std::string ss = r.input_var(i)->name();
if (s == ss) {
return r.input_var(i);
}
}
- }
- else { // side == 'r'
+ } else { // side == 'r'
for (int i = 1; i <= r.n_out(); i++) {
std::string ss = r.output_var(i)->name();
- if (s+"'" == ss) {
+ if (s + "'" == ss) {
return r.output_var(i);
}
}
}
-
+
return NULL;
}
@@ -2207,59 +2127,55 @@ bool lowerBoundIsZero(const omega::Relation &bound, int dim) {
if ((*gi).get_coef(v) >= 0 && !(*gi).is_const(v)
&& (*gi).get_const() != 0) {
return false;
- }
- else if ((*gi).get_coef(v) >= 0 && (*gi).is_const(v)
- && (*gi).get_const() == 0)
+ } else if ((*gi).get_coef(v) >= 0 && (*gi).is_const(v)
+ && (*gi).get_const() == 0)
found = true;
}
-
+
return found;
}
-
Relation replicate_IS_and_add_bound(const omega::Relation &R, int level,
omega::Relation &bound) {
-
+
if (!R.is_set())
throw std::invalid_argument("Input R has to be a set not a relation!");
-
+
Relation r(R.n_set());
-
+
for (int i = 1; i <= R.n_set(); i++) {
r.name_set_var(i + 1, const_cast<Relation &>(R).set_var(i)->name());
}
-
+
std::string new_var = bound.set_var(1)->name();
-
+
r.name_set_var(level, new_var);
-
+
F_Exists *f_exists = r.add_and()->add_exists();
F_And *f_root = f_exists->add_and();
std::map<Variable_ID, Variable_ID> exists_mapping;
-
+
for (DNF_Iterator di(const_cast<Relation &>(R).query_DNF()); di; di++) {
for (GEQ_Iterator gi((*di)->GEQs()); gi; gi++) {
GEQ_Handle h = f_root->add_GEQ();
-
+
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
-
- h.update_coef(r.input_var(v->get_position()),
- cvi.curr_coef());
-
- break;
- case Wildcard_Var:
- {
+ case Input_Var:
+
+ h.update_coef(r.input_var(v->get_position()),
+ cvi.curr_coef());
+
+ break;
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -2269,36 +2185,34 @@ Relation replicate_IS_and_add_bound(const omega::Relation &R, int level,
h.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
}
h.update_const((*gi).get_const());
}
}
-
+
for (DNF_Iterator di(const_cast<Relation &>(R).query_DNF()); di; di++) {
for (EQ_Iterator gi((*di)->EQs()); gi; gi++) {
EQ_Handle h1 = f_root->add_EQ();
-
+
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
-
- h1.update_coef(r.input_var(v->get_position()),
- cvi.curr_coef());
-
- break;
- case Wildcard_Var:
- {
+ case Input_Var:
+
+ h1.update_coef(r.input_var(v->get_position()),
+ cvi.curr_coef());
+
+ break;
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h1.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -2308,34 +2222,32 @@ Relation replicate_IS_and_add_bound(const omega::Relation &R, int level,
h1.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
}
h1.update_const((*gi).get_const());
}
}
-
+
for (DNF_Iterator di(bound.query_DNF()); di; di++) {
for (GEQ_Iterator gi((*di)->GEQs()); gi; gi++) {
GEQ_Handle h = f_root->add_GEQ();
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
-
- h.update_coef(r.input_var(level), cvi.curr_coef());
-
- break;
- case Wildcard_Var:
- {
+ case Input_Var:
+
+ h.update_coef(r.input_var(level), cvi.curr_coef());
+
+ break;
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -2345,33 +2257,31 @@ Relation replicate_IS_and_add_bound(const omega::Relation &R, int level,
h.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
}
h.update_const((*gi).get_const());
}
}
-
+
for (DNF_Iterator di(bound.query_DNF()); di; di++) {
for (EQ_Iterator gi((*di)->EQs()); gi; gi++) {
EQ_Handle h = f_root->add_EQ();
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
- h.update_coef(r.input_var(level), cvi.curr_coef());
-
- break;
- case Wildcard_Var:
- {
+ case Input_Var:
+ h.update_coef(r.input_var(level), cvi.curr_coef());
+
+ break;
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -2381,8 +2291,8 @@ Relation replicate_IS_and_add_bound(const omega::Relation &R, int level,
h.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
}
h.update_const((*gi).get_const());
@@ -2394,56 +2304,51 @@ Relation replicate_IS_and_add_bound(const omega::Relation &R, int level,
}
-
-
// Replicates old_relation's bounds for set var at old_pos int o new_relation at new_pos, but position's bounds must involve constants
// only supports GEQs
//
Relation replace_set_var_as_another_set_var(const omega::Relation &new_relation,
const omega::Relation &old_relation, int new_pos, int old_pos) {
-
+
Relation r = copy(new_relation);
r.copy_names(new_relation);
r.setup_names();
-
+
F_Exists *f_exists = r.and_with_and()->add_exists();
F_And *f_root = f_exists->add_and();
std::map<Variable_ID, Variable_ID> exists_mapping;
-
+
for (DNF_Iterator di(const_cast<Relation &>(old_relation).query_DNF()); di;
di++)
for (GEQ_Iterator gi((*di)->GEQs()); gi; gi++) {
GEQ_Handle h = f_root->add_GEQ();
if (((*gi).get_coef(
- const_cast<Relation &>(old_relation).set_var(old_pos)) != 0)
+ const_cast<Relation &>(old_relation).set_var(old_pos)) != 0)
&& (*gi).is_const_except_for_global(
- const_cast<Relation &>(old_relation).set_var(
- old_pos))) {
+ const_cast<Relation &>(old_relation).set_var(
+ old_pos))) {
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
- {
-
+ case Input_Var: {
+
if (v->get_position() == old_pos)
h.update_coef(r.input_var(new_pos),
cvi.curr_coef());
else
throw omega_error(
- "relation contains set vars other than that to be replicated!");
+ "relation contains set vars other than that to be replicated!");
break;
-
+
}
- case Wildcard_Var:
- {
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(
- old_relation, v, r, f_exists, f_root,
- exists_mapping);
+ old_relation, v, r, f_exists, f_root,
+ exists_mapping);
h.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -2453,15 +2358,15 @@ Relation replace_set_var_as_another_set_var(const omega::Relation &new_relation,
h.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
}
h.update_const((*gi).get_const());
}
}
return r;
-
+
}
@@ -2474,28 +2379,28 @@ Relation replace_set_var_as_another_set_var(const omega::Relation &new_relation,
Relation replicate_IS_and_add_at_pos(const omega::Relation &R, int level,
omega::Relation &bound) {
-
+
if (!R.is_set())
throw std::invalid_argument("Input R has to be a set not a relation!");
-
+
Relation r(R.n_set() + 1);
-
+
for (int i = 1; i <= R.n_set(); i++) {
if (i < level)
r.name_set_var(i, const_cast<Relation &>(R).set_var(i)->name());
else
r.name_set_var(i + 1, const_cast<Relation &>(R).set_var(i)->name());
-
+
}
-
+
std::string new_var = bound.set_var(1)->name();
-
+
r.name_set_var(level, new_var);
-
+
F_Exists *f_exists = r.add_and()->add_exists();
F_And *f_root = f_exists->add_and();
std::map<Variable_ID, Variable_ID> exists_mapping;
-
+
for (int i = 1; i <= R.n_set(); i++)
for (DNF_Iterator di(const_cast<Relation &>(R).query_DNF()); di; di++) {
for (GEQ_Iterator gi((*di)->GEQs()); gi; gi++) {
@@ -2504,26 +2409,23 @@ Relation replicate_IS_and_add_at_pos(const omega::Relation &R, int level,
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
- {
+ case Input_Var: {
if (i < level)
h.update_coef(r.input_var(v->get_position()),
cvi.curr_coef());
else
h.update_coef(
- r.input_var(v->get_position() + 1),
- cvi.curr_coef());
+ r.input_var(v->get_position() + 1),
+ cvi.curr_coef());
break;
}
- case Wildcard_Var:
- {
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -2533,16 +2435,16 @@ Relation replicate_IS_and_add_at_pos(const omega::Relation &R, int level,
h.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
-
+
}
h.update_const((*gi).get_const());
}
}
}
-
+
for (int i = 1; i <= R.n_set(); i++)
for (DNF_Iterator di(const_cast<Relation &>(R).query_DNF()); di; di++) {
for (EQ_Iterator gi((*di)->EQs()); gi; gi++) {
@@ -2551,26 +2453,23 @@ Relation replicate_IS_and_add_at_pos(const omega::Relation &R, int level,
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
- {
+ case Input_Var: {
if (i < level)
h1.update_coef(r.input_var(v->get_position()),
cvi.curr_coef());
else
h1.update_coef(
- r.input_var(v->get_position() + 1),
- cvi.curr_coef());
+ r.input_var(v->get_position() + 1),
+ cvi.curr_coef());
break;
}
- case Wildcard_Var:
- {
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h1.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -2580,38 +2479,35 @@ Relation replicate_IS_and_add_at_pos(const omega::Relation &R, int level,
h1.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
}
h1.update_const((*gi).get_const());
}
}
}
-
+
for (DNF_Iterator di(bound.query_DNF()); di; di++) {
for (GEQ_Iterator gi((*di)->GEQs()); gi; gi++) {
GEQ_Handle h = f_root->add_GEQ();
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
- {
+ case Input_Var: {
if (cvi.curr_var()->get_position() < level)
h.update_coef(r.input_var(level), cvi.curr_coef());
else
h.update_coef(r.input_var(level), cvi.curr_coef());
break;
}
- case Wildcard_Var:
- {
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -2621,37 +2517,34 @@ Relation replicate_IS_and_add_at_pos(const omega::Relation &R, int level,
h.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
h.update_const((*gi).get_const());
}
}
}
-
+
for (DNF_Iterator di(bound.query_DNF()); di; di++) {
for (EQ_Iterator gi((*di)->EQs()); gi; gi++) {
EQ_Handle h = f_root->add_EQ();
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
- {
+ case Input_Var: {
if (cvi.curr_var()->get_position() < level)
h.update_coef(r.input_var(level), cvi.curr_coef());
else
h.update_coef(r.input_var(level), cvi.curr_coef());
break;
}
- case Wildcard_Var:
- {
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -2661,8 +2554,8 @@ Relation replicate_IS_and_add_at_pos(const omega::Relation &R, int level,
h.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
}
h.update_const((*gi).get_const());
@@ -2674,59 +2567,53 @@ Relation replicate_IS_and_add_at_pos(const omega::Relation &R, int level,
}
-
-
omega::Relation replace_set_var_as_Global(const omega::Relation &R, int pos,
std::vector<omega::Relation> &bound) {
-
+
if (!R.is_set())
throw std::invalid_argument("Input R has to be a set not a relation!");
-
+
Relation r(R.n_set());
F_Exists *f_exists = r.add_and()->add_exists();
F_And *f_root = f_exists->add_and();
std::map<Variable_ID, Variable_ID> exists_mapping;
int count = 1;
for (int i = 1; i <= R.n_set(); i++) {
-
+
if (i != pos) {
r.name_set_var(i, const_cast<Relation &>(R).set_var(i)->name());
-
- }
- else
+
+ } else
r.name_set_var(i, "void");
}
-
+
Free_Var_Decl *repl = new Free_Var_Decl(
- const_cast<Relation &>(R).set_var(pos)->name());
-
+ const_cast<Relation &>(R).set_var(pos)->name());
+
Variable_ID v3 = r.get_local(repl);
-
+
for (DNF_Iterator di(const_cast<Relation &>(R).query_DNF()); di; di++) {
for (EQ_Iterator gi((*di)->EQs()); gi; gi++) {
EQ_Handle h1 = f_root->add_EQ();
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
- {
+ case Input_Var: {
if (v->get_position() != pos)
h1.update_coef(r.input_var(v->get_position()),
cvi.curr_coef());
else
-
+
h1.update_coef(v3, cvi.curr_coef());
break;
}
- case Wildcard_Var:
- {
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h1.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -2736,14 +2623,14 @@ omega::Relation replace_set_var_as_Global(const omega::Relation &R, int pos,
h1.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
}
h1.update_const((*gi).get_const());
}
}
-
+
for (int i = 0; i < bound.size(); i++)
for (DNF_Iterator di(bound[i].query_DNF()); di; di++) {
for (GEQ_Iterator gi((*di)->GEQs()); gi; gi++) {
@@ -2752,32 +2639,29 @@ omega::Relation replace_set_var_as_Global(const omega::Relation &R, int pos,
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
- {
+ case Input_Var: {
//if (i < level)
if (v->get_position() != pos)
h.update_coef(r.input_var(v->get_position()),
cvi.curr_coef());
else
-
+
h.update_coef(v3, cvi.curr_coef());
break;
-
+
//else
// h.update_coef(
// r.input_var(v->get_position() + 1),
// cvi.curr_coef());
break;
}
- case Wildcard_Var:
- {
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -2787,10 +2671,10 @@ omega::Relation replace_set_var_as_Global(const omega::Relation &R, int pos,
h.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
-
+
}
h.update_const((*gi).get_const());
}
@@ -2800,24 +2684,21 @@ omega::Relation replace_set_var_as_Global(const omega::Relation &R, int pos,
}
-
-
-
//-----------------------------------------------------------------------------
// Replace an input variable's constraints as an existential in order
// to simplify other constraints in Relation
// -----------------------------------------------------------------------------
std::pair<Relation, bool> replace_set_var_as_existential(
- const omega::Relation &R, int pos,
- std::vector<omega::Relation> &bound) {
-
+ const omega::Relation &R, int pos,
+ std::vector<omega::Relation> &bound) {
+
if (!R.is_set())
throw std::invalid_argument("Input R has to be a set not a relation!");
-
+
Relation r(R.n_set());
for (int i = 1; i <= R.n_set(); i++)
r.name_set_var(i, const_cast<Relation &>(R).set_var(i)->name());
-
+
F_Exists *f_exists = r.add_and()->add_exists();
F_And *f_root = f_exists->add_and();
std::map<Variable_ID, Variable_ID> exists_mapping;
@@ -2828,28 +2709,28 @@ std::pair<Relation, bool> replace_set_var_as_existential(
&& (!(*gi).has_wildcards()))
if (coef_in_equality == 0)
coef_in_equality = (*gi).get_coef(
- const_cast<Relation &>(R).set_var(pos));
+ const_cast<Relation &>(R).set_var(pos));
else
return std::pair<Relation, bool>(copy(R), false);
-
+
if (coef_in_equality < 0)
coef_in_equality = -coef_in_equality;
-
+
std::pair<EQ_Handle, Variable_ID> result = find_simplest_stride(
- const_cast<Relation &>(R), const_cast<Relation &>(R).set_var(pos));
-
+ const_cast<Relation &>(R), const_cast<Relation &>(R).set_var(pos));
+
if (result.second == NULL && coef_in_equality != 1)
return std::pair<Relation, bool>(copy(R), false);
-
+
if (result.second != NULL) {
if (result.first.get_coef(const_cast<Relation &>(R).set_var(pos)) != 1)
return std::pair<Relation, bool>(copy(R), false);
-
+
if (result.first.get_coef(result.second) != coef_in_equality)
return std::pair<Relation, bool>(copy(R), false);
}
Variable_ID v3 = f_exists->declare();
-
+
for (DNF_Iterator di(const_cast<Relation &>(R).query_DNF()); di; di++) {
for (EQ_Iterator gi((*di)->EQs()); gi; gi++) {
EQ_Handle h1 = f_root->add_EQ();
@@ -2858,25 +2739,22 @@ std::pair<Relation, bool> replace_set_var_as_existential(
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
- {
+ case Input_Var: {
if (v->get_position() != pos)
h1.update_coef(r.input_var(v->get_position()),
cvi.curr_coef());
else
-
+
h1.update_coef(v3, cvi.curr_coef());
break;
}
- case Wildcard_Var:
- {
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h1.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -2886,15 +2764,15 @@ std::pair<Relation, bool> replace_set_var_as_existential(
h1.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
}
h1.update_const((*gi).get_const());
}
}
}
-
+
for (int i = 0; i < bound.size(); i++)
for (DNF_Iterator di(bound[i].query_DNF()); di; di++) {
for (GEQ_Iterator gi((*di)->GEQs()); gi; gi++) {
@@ -2903,32 +2781,29 @@ std::pair<Relation, bool> replace_set_var_as_existential(
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
- {
+ case Input_Var: {
//if (i < level)
if (v->get_position() != pos)
-
+
h.update_coef(r.set_var(v->get_position()),
cvi.curr_coef());
else
-
+
h.update_coef(v3, cvi.curr_coef());
-
+
//else
// h.update_coef(
// r.input_var(v->get_position() + 1),
// cvi.curr_coef());
break;
}
- case Wildcard_Var:
- {
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -2938,24 +2813,21 @@ std::pair<Relation, bool> replace_set_var_as_existential(
h.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
-
+
}
h.update_const((*gi).get_const());
//}
}
}
-
+
//for (int i = 1; i <= R.n_set(); i++)
return std::pair<Relation, bool>(r, true);
}
-
-
-
//-----------------------------------------------------------------------------
// Copy all relations from r except those for set var v.
// And with GEQ given by g
@@ -2966,9 +2838,9 @@ Relation and_with_relation_and_replace_var(const Relation &R, Variable_ID v1,
Relation &g) {
if (!R.is_set())
throw std::invalid_argument("Input R has to be a set not a relation!");
-
+
Relation r(R.n_set());
-
+
F_Exists *f_exists = r.add_and()->add_exists();
F_And *f_root = f_exists->add_and();
std::map<Variable_ID, Variable_ID> exists_mapping;
@@ -2980,21 +2852,18 @@ Relation and_with_relation_and_replace_var(const Relation &R, Variable_ID v1,
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
- {
+ case Input_Var: {
h.update_coef(r.input_var(v->get_position()),
cvi.curr_coef());
break;
}
- case Wildcard_Var:
- {
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -3004,36 +2873,33 @@ Relation and_with_relation_and_replace_var(const Relation &R, Variable_ID v1,
h.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
}
-
+
h.update_const((*gi).get_const());
}
}
-
+
for (GEQ_Iterator gi((*di)->GEQs()); gi; gi++) {
GEQ_Handle h = f_root->add_GEQ();
if ((*gi).get_coef(v1) == 0) {
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
- {
+ case Input_Var: {
h.update_coef(r.input_var(v->get_position()),
cvi.curr_coef());
break;
}
- case Wildcard_Var:
- {
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -3043,8 +2909,8 @@ Relation and_with_relation_and_replace_var(const Relation &R, Variable_ID v1,
h.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
}
h.update_const((*gi).get_const());
@@ -3054,11 +2920,11 @@ Relation and_with_relation_and_replace_var(const Relation &R, Variable_ID v1,
for (DNF_Iterator di(const_cast<Relation &>(g).query_DNF()); di; di++)
for (GEQ_Iterator gi((*di)->GEQs()); gi; gi++)
r.and_with_GEQ(*gi);
-
+
for (DNF_Iterator di(const_cast<Relation &>(g).query_DNF()); di; di++)
for (EQ_Iterator gi((*di)->EQs()); gi; gi++)
r.and_with_EQ(*gi);
-
+
r.simplify();
r.copy_names(R);
r.setup_names();
@@ -3066,15 +2932,12 @@ Relation and_with_relation_and_replace_var(const Relation &R, Variable_ID v1,
}
-
-
-
omega::Relation extract_upper_bound(const Relation &R, Variable_ID v1) {
if (!R.is_set())
throw std::invalid_argument("Input R has to be a set not a relation!");
-
+
Relation r(R.n_set());
-
+
F_Exists *f_exists = r.add_and()->add_exists();
F_And *f_root = f_exists->add_and();
std::map<Variable_ID, Variable_ID> exists_mapping;
@@ -3082,23 +2945,21 @@ omega::Relation extract_upper_bound(const Relation &R, Variable_ID v1) {
for (DNF_Iterator di(const_cast<Relation &>(R).query_DNF()); di; di++)
for (GEQ_Iterator gi((*di)->GEQs()); gi; gi++)
if ((*gi).get_coef(v1) < 0) {
-
+
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
- case Input_Var:
- h.update_coef(r.input_var(v->get_position()),
- cvi.curr_coef());
- break;
- case Wildcard_Var:
- {
+ case Input_Var:
+ h.update_coef(r.input_var(v->get_position()),
+ cvi.curr_coef());
+ break;
+ case Wildcard_Var: {
Variable_ID v2 = replicate_floor_definition(R, v, r,
f_exists, f_root, exists_mapping);
h.update_coef(v2, cvi.curr_coef());
break;
}
- case Global_Var:
- {
+ case Global_Var: {
Global_Var_ID g = v->get_global_var();
Variable_ID v2;
if (g->arity() == 0)
@@ -3108,17 +2969,17 @@ omega::Relation extract_upper_bound(const Relation &R, Variable_ID v1) {
h.update_coef(v2, cvi.curr_coef());
break;
}
- default:
- assert(false);
+ default:
+ assert(false);
}
}
h.update_const((*gi).get_const());
}
-
+
r.simplify();
-
+
return r;
-
+
}
/*CG_outputRepr * modified_output_subs_repr(CG_outputBuilder * ocg, const Relation &R, const EQ_Handle &h, Variable_ID v,const std::vector<std::pair<CG_outputRepr *, int> > &assigned_on_the_fly,
@@ -3134,17 +2995,17 @@ omega::Relation extract_upper_bound(const Relation &R, Variable_ID v1) {
-CG_outputRepr * construct_int_floor(CG_outputBuilder * ocg, const Relation &R,
- const GEQ_Handle &h, Variable_ID v,
- const std::vector<std::pair<CG_outputRepr *, int> > &assigned_on_the_fly,
- std::map<std::string, std::vector<CG_outputRepr *> > unin) {
-
+CG_outputRepr *construct_int_floor(CG_outputBuilder *ocg, const Relation &R,
+ const GEQ_Handle &h, Variable_ID v,
+ const std::vector<std::pair<CG_outputRepr *, int> > &assigned_on_the_fly,
+ std::map<std::string, std::vector<CG_outputRepr *> > unin) {
+
std::set<Variable_ID> excluded_floor_vars;
const_cast<Relation &>(R).setup_names(); // hack
assert(v->kind() == Set_Var);
-
+
int a = h.get_coef(v);
-
+
CG_outputRepr *lhs = ocg->CreateIdent(v->name());
excluded_floor_vars.insert(v);
std::vector<std::pair<bool, GEQ_Handle> > result2;
@@ -3159,9 +3020,9 @@ CG_outputRepr * construct_int_floor(CG_outputBuilder * ocg, const Relation &R,
coef_t coef_ = cvi.curr_coef();
result2 = find_floor_definition_temp(R, cvi.curr_var(),
excluded_floor_vars);
-
+
for (Constr_Vars_Iter cvi_(
- result2[result2.size() - 1].second); cvi_; cvi_++) {
+ result2[result2.size() - 1].second); cvi_; cvi_++) {
if (cvi_.curr_var()->kind() != Wildcard_Var
&& cvi_.curr_var()->kind() != Set_Var) {
t = output_ident(ocg, R, cvi_.curr_var(),
@@ -3172,20 +3033,20 @@ CG_outputRepr * construct_int_floor(CG_outputBuilder * ocg, const Relation &R,
ocg->CreateInt(-coef_));
repr = ocg->CreateTimes(ocg->CreateInt(-coef_),
repr);
-
+
return repr;
-
+
}
-
+
}
-
+
};
if (!result.first) {
delete repr;
throw omega_error(
- "Can't generate bound expression with wildcard not involved in floor definition");
+ "Can't generate bound expression with wildcard not involved in floor definition");
}
-
+
try {
t = output_inequality_repr(ocg, result.second,
cvi.curr_var(), R, assigned_on_the_fly, unin,
@@ -3194,11 +3055,10 @@ CG_outputRepr * construct_int_floor(CG_outputBuilder * ocg, const Relation &R,
delete repr;
throw e;
}
- }
- else
+ } else
t = output_ident(ocg, R, cvi.curr_var(), assigned_on_the_fly,
unin);
-
+
coef_t coef = cvi.curr_coef();
if (a > 0) {
if (coef > 0) {
@@ -3207,24 +3067,21 @@ CG_outputRepr * construct_int_floor(CG_outputBuilder * ocg, const Relation &R,
else
repr = ocg->CreateMinus(repr,
ocg->CreateTimes(ocg->CreateInt(coef), t));
- }
- else {
+ } else {
if (coef == -1)
repr = ocg->CreatePlus(repr, t);
else
repr = ocg->CreatePlus(repr,
ocg->CreateTimes(ocg->CreateInt(-coef), t));
}
- }
- else {
+ } else {
if (coef > 0) {
if (coef == 1)
repr = ocg->CreatePlus(repr, t);
else
repr = ocg->CreatePlus(repr,
ocg->CreateTimes(ocg->CreateInt(coef), t));
- }
- else {
+ } else {
if (coef == -1)
repr = ocg->CreateMinus(repr, t);
else
@@ -3239,14 +3096,13 @@ CG_outputRepr * construct_int_floor(CG_outputBuilder * ocg, const Relation &R,
repr = ocg->CreateMinus(repr, ocg->CreateInt(c));
else
repr = ocg->CreatePlus(repr, ocg->CreateInt(c));
- }
- else if (c < 0) {
+ } else if (c < 0) {
if (a > 0)
repr = ocg->CreatePlus(repr, ocg->CreateInt(-c));
else
repr = ocg->CreateMinus(repr, ocg->CreateInt(-c));
}
-
+
if (abs(a) == 1)
ocg->CreateAssignment(0, lhs, repr);
else if (a > 0)
@@ -3256,7 +3112,7 @@ CG_outputRepr * construct_int_floor(CG_outputBuilder * ocg, const Relation &R,
// a < 0
return ocg->CreateAssignment(0, lhs,
ocg->CreateIntegerFloor(repr, ocg->CreateInt(-a)));
-
+
}
diff --git a/src/transformations/loop.cc b/src/transformations/loop.cc
index 570bc90..10dc7bb 100644
--- a/src/transformations/loop.cc
+++ b/src/transformations/loop.cc
@@ -43,36 +43,36 @@
#define _DEBUG_ true
-
using namespace omega;
-const std::string Loop::tmp_loop_var_name_prefix = std::string("chill_t"); // Manu:: In fortran, first character of a variable name must be a letter, so this change
+const std::string Loop::tmp_loop_var_name_prefix = std::string(
+ "chill_t"); // Manu:: In fortran, first character of a variable name must be a letter, so this change
const std::string Loop::overflow_var_name_prefix = std::string("over");
-void echocontroltype( const IR_Control *control ) {
- switch(control->type()) {
- case IR_CONTROL_BLOCK: {
- CHILL_DEBUG_PRINT("IR_CONTROL_BLOCK\n");
- break;
- }
- case IR_CONTROL_LOOP: {
- CHILL_DEBUG_PRINT("IR_CONTROL_LOOP\n");
- break;
- }
- case IR_CONTROL_IF: {
- CHILL_DEBUG_PRINT("IR_CONTROL_IF\n");
- break;
- }
- default:
- CHILL_DEBUG_PRINT("just a bunch of statements?\n");
-
+void echocontroltype(const IR_Control *control) {
+ switch (control->type()) {
+ case IR_CONTROL_BLOCK: {
+ CHILL_DEBUG_PRINT("IR_CONTROL_BLOCK\n");
+ break;
+ }
+ case IR_CONTROL_LOOP: {
+ CHILL_DEBUG_PRINT("IR_CONTROL_LOOP\n");
+ break;
+ }
+ case IR_CONTROL_IF: {
+ CHILL_DEBUG_PRINT("IR_CONTROL_IF\n");
+ break;
+ }
+ default:
+ CHILL_DEBUG_PRINT("just a bunch of statements?\n");
+
} // switch
}
omega::Relation Loop::getNewIS(int stmt_num) const {
-
+
omega::Relation result;
-
+
if (stmt[stmt_num].xform.is_null()) {
omega::Relation known = omega::Extend_Set(omega::copy(this->known),
stmt[stmt_num].IS.n_set() - this->known.n_set());
@@ -81,32 +81,31 @@ omega::Relation Loop::getNewIS(int stmt_num) const {
omega::Relation known = omega::Extend_Set(omega::copy(this->known),
stmt[stmt_num].xform.n_out() - this->known.n_set());
result = omega::Intersection(
- omega::Range(
- omega::Restrict_Domain(
- omega::copy(stmt[stmt_num].xform),
- omega::copy(stmt[stmt_num].IS))), known);
+ omega::Range(
+ omega::Restrict_Domain(
+ omega::copy(stmt[stmt_num].xform),
+ omega::copy(stmt[stmt_num].IS))), known);
}
-
+
result.simplify(2, 4);
-
+
return result;
}
-
-void Loop::reduce(int stmt_num,
- std::vector<int> &level,
+void Loop::reduce(int stmt_num,
+ std::vector<int> &level,
int param,
- std::string func_name,
+ std::string func_name,
std::vector<int> &seq_levels,
- std::vector<int> cudaized_levels,
+ std::vector<int> cudaized_levels,
int bound_level) {
// illegal instruction?? fprintf(stderr, " Loop::reduce( stmt %d, param %d, func_name (encrypted)...)\n", stmt, param); // , func_name.c_str());
-
+
//std::cout << "Reducing stmt# " << stmt_num << " at level " << level << "\n";
//ir->printStmt(stmt[stmt_num].code);
-
+
if (stmt[stmt_num].reduction != 1) {
CHILL_DEBUG_PRINT("Cannot reduce this statement\n");
return;
@@ -132,9 +131,9 @@ void Loop::reduce(int stmt_num,
delete last_compute_cg_;
last_compute_cg_ = NULL;
fprintf(stderr, "set last_compute_cg_ = NULL;\n");
-
+
omega::CG_outputBuilder *ocg = ir->builder();
-
+
omega::CG_outputRepr *funCallRepr;
std::vector<omega::CG_outputRepr *> arg_repr_list;
apply_xform(stmt_num);
@@ -144,13 +143,13 @@ void Loop::reduce(int stmt_num,
std::vector<IR_ArrayRef *> access2;
for (int j = 0; j < access[i]->n_dim(); j++) {
std::vector<IR_ArrayRef *> access3 = ir->FindArrayRef(
- access[i]->index(j));
+ access[i]->index(j));
access2.insert(access2.end(), access3.begin(), access3.end());
}
if (access2.size() == 0) {
if (names.find(access[i]->name()) == names.end()) {
arg_repr_list.push_back(
- ocg->CreateAddressOf(access[i]->convert()));
+ ocg->CreateAddressOf(access[i]->convert()));
names.insert(access[i]->name());
if (access[i]->is_write())
reduced_write_refs.insert(access[i]->name());
@@ -165,14 +164,14 @@ void Loop::reduce(int stmt_num,
}
}
}
-
+
for (int i = 0; i < seq_levels.size(); i++)
arg_repr_list.push_back(
- ocg->CreateIdent(
- stmt[stmt_num].IS.set_var(seq_levels[i])->name()));
-
+ ocg->CreateIdent(
+ stmt[stmt_num].IS.set_var(seq_levels[i])->name()));
+
if (bound_level != -1) {
-
+
omega::Relation new_IS = copy(stmt[stmt_num].IS);
new_IS.copy_names(stmt[stmt_num].IS);
new_IS.setup_names();
@@ -181,106 +180,106 @@ void Loop::reduce(int stmt_num,
//omega::Relation r = getNewIS(stmt_num);
for (int j = dim + 1; j <= new_IS.n_set(); j++)
new_IS = omega::Project(new_IS, new_IS.set_var(j));
-
+
new_IS.simplify(2, 4);
-
+
omega::Relation bound_ = get_loop_bound(copy(new_IS), dim - 1);
omega::Variable_ID v = bound_.set_var(dim);
std::vector<omega::CG_outputRepr *> ubList;
for (omega::GEQ_Iterator e(
- const_cast<omega::Relation &>(bound_).single_conjunct()->GEQs());
+ const_cast<omega::Relation &>(bound_).single_conjunct()->GEQs());
e; e++) {
if ((*e).get_coef(v) < 0) {
// && (*e).is_const_except_for_global(v))
omega::CG_outputRepr *UPPERBOUND =
- omega::output_upper_bound_repr(ir->builder(), *e, v,
- bound_,
- std::vector<
- std::pair<omega::CG_outputRepr *, int> >(
- bound_.n_set(),
- std::make_pair(
- static_cast<omega::CG_outputRepr *>(NULL),
- 0)), uninterpreted_symbols[stmt_num]);
+ omega::output_upper_bound_repr(ir->builder(), *e, v,
+ bound_,
+ std::vector<
+ std::pair<omega::CG_outputRepr *, int> >(
+ bound_.n_set(),
+ std::make_pair(
+ static_cast<omega::CG_outputRepr *>(NULL),
+ 0)), uninterpreted_symbols[stmt_num]);
if (UPPERBOUND != NULL)
ubList.push_back(UPPERBOUND);
-
+
}
-
+
}
-
- omega::CG_outputRepr * ubRepr;
+
+ omega::CG_outputRepr *ubRepr;
if (ubList.size() > 1) {
-
+
ubRepr = ir->builder()->CreateInvoke("min", ubList);
arg_repr_list.push_back(ubRepr);
} else if (ubList.size() == 1)
arg_repr_list.push_back(ubList[0]);
}
-
+
funCallRepr = ocg->CreateInvoke(func_name, arg_repr_list);
stmt[stmt_num].code = funCallRepr;
for (int i = 0; i < level.size(); i++) {
//stmt[*i].code = outputStatement(ocg, stmt[*i].code, 0, mapping, known, std::vector<CG_outputRepr *>(mapping.n_out(), NULL));
std::vector<std::string> loop_vars;
loop_vars.push_back(stmt[stmt_num].IS.set_var(level[i])->name());
-
+
std::vector<omega::CG_outputRepr *> subs;
subs.push_back(ocg->CreateInt(0));
-
+
stmt[stmt_num].code = ocg->CreateSubstitutedStmt(0, stmt[stmt_num].code,
loop_vars, subs);
-
+
}
-
+
omega::Relation new_IS = copy(stmt[stmt_num].IS);
new_IS.copy_names(stmt[stmt_num].IS);
new_IS.setup_names();
new_IS.simplify();
int old_size = new_IS.n_set();
-
+
omega::Relation R = omega::copy(stmt[stmt_num].IS);
R.copy_names(stmt[stmt_num].IS);
R.setup_names();
-
+
for (int i = level.size() - 1; i >= 0; i--) {
int j;
-
+
for (j = 0; j < cudaized_levels.size(); j++) {
if (cudaized_levels[j] == level[i])
break;
-
+
}
-
+
if (j == cudaized_levels.size()) {
R = omega::Project(R, level[i], omega::Input_Var);
R.simplify();
-
+
}
//
-
+
}
-
+
omega::F_And *f_Root = R.and_with_and();
for (int i = level.size() - 1; i >= 0; i--) {
int j;
-
+
for (j = 0; j < cudaized_levels.size(); j++) {
if (cudaized_levels[j] == level[i])
break;
-
+
}
-
+
if (j == cudaized_levels.size()) {
-
+
omega::EQ_Handle h = f_Root->add_EQ();
-
+
h.update_coef(R.set_var(level[i]), 1);
h.update_const(-1);
}
//
-
+
}
-
+
R.simplify();
stmt[stmt_num].IS = R;
}
@@ -303,22 +302,22 @@ bool Loop::isInitialized() const {
bool Loop::init_loop(std::vector<ir_tree_node *> &ir_tree,
std::vector<ir_tree_node *> &ir_stmt) {
-
+
CHILL_DEBUG_PRINT("extract_ir_stmts()\n");
CHILL_DEBUG_PRINT("ir_tree has %d statements\n", ir_tree.size());
ir_stmt = extract_ir_stmts(ir_tree);
-
- CHILL_DEBUG_PRINT("nesting level stmt size = %d\n", (int)ir_stmt.size());
+
+ CHILL_DEBUG_PRINT("nesting level stmt size = %d\n", (int) ir_stmt.size());
stmt_nesting_level_.resize(ir_stmt.size());
-
+
std::vector<int> stmt_nesting_level(ir_stmt.size());
-
- CHILL_DEBUG_PRINT("%d statements?\n", (int)ir_stmt.size());
-
+
+ CHILL_DEBUG_PRINT("%d statements?\n", (int) ir_stmt.size());
+
// find out how deeply nested each statement is. (how can these be different?)
for (int i = 0; i < ir_stmt.size(); i++) {
- fprintf(stderr, "i %d\n", i);
+ fprintf(stderr, "i %d\n", i);
ir_stmt[i]->payload = i;
int t = 0;
ir_tree_node *itn = ir_stmt[i];
@@ -331,23 +330,24 @@ bool Loop::init_loop(std::vector<ir_tree_node *> &ir_tree,
stmt_nesting_level[i] = t;
CHILL_DEBUG_PRINT("stmt_nesting_level[%d] = %d\n", i, t);
}
-
+
if (actual_code.size() == 0)
- actual_code = std::vector<CG_outputRepr*>(ir_stmt.size());
-
+ actual_code = std::vector<CG_outputRepr *>(ir_stmt.size());
+
stmt = std::vector<Statement>(ir_stmt.size());
- CHILL_DEBUG_PRINT("in init_loop, made %d stmts\n", (int)ir_stmt.size());
-
- uninterpreted_symbols = std::vector<std::map<std::string, std::vector<omega::CG_outputRepr * > > >(ir_stmt.size());
- uninterpreted_symbols_stringrepr = std::vector<std::map<std::string, std::vector<omega::CG_outputRepr * > > >(ir_stmt.size());
-
+ CHILL_DEBUG_PRINT("in init_loop, made %d stmts\n", (int) ir_stmt.size());
+
+ uninterpreted_symbols = std::vector<std::map<std::string, std::vector<omega::CG_outputRepr *> > >(ir_stmt.size());
+ uninterpreted_symbols_stringrepr = std::vector<std::map<std::string, std::vector<omega::CG_outputRepr *> > >(
+ ir_stmt.size());
+
int n_dim = -1;
int max_loc;
//std::vector<std::string> index;
for (int i = 0; i < ir_stmt.size(); i++) {
int max_nesting_level = -1;
int loc;
-
+
// find the max nesting level and remember the statement that was at that level
for (int j = 0; j < ir_stmt.size(); j++) {
if (stmt_nesting_level[j] > max_nesting_level) {
@@ -355,23 +355,23 @@ bool Loop::init_loop(std::vector<ir_tree_node *> &ir_tree,
loc = j;
}
}
-
+
CHILL_DEBUG_PRINT("max nesting level %d at location %d\n", max_nesting_level, loc);
-
+
// most deeply nested statement acting as a reference point
if (n_dim == -1) {
CHILL_DEBUG_PRINT("n_dim now max_nesting_level %d\n", max_nesting_level);
n_dim = max_nesting_level;
max_loc = loc;
-
+
index = std::vector<std::string>(n_dim);
-
+
ir_tree_node *itn = ir_stmt[loc];
CHILL_DEBUG_PRINT("itn = stmt[%d]\n", loc);
int cur_dim = n_dim - 1;
while (itn->parent != NULL) {
CHILL_DEBUG_PRINT("parent\n");
-
+
itn = itn->parent;
if (itn->content->type() == IR_CONTROL_LOOP) {
CHILL_DEBUG_PRINT("IR_CONTROL_LOOP cur_dim %d\n", cur_dim);
@@ -382,258 +382,264 @@ bool Loop::init_loop(std::vector<ir_tree_node *> &ir_tree,
}
}
}
-
+
CHILL_DEBUG_PRINT("align loops by names,\n");
// align loops by names, temporary solution
ir_tree_node *itn = ir_stmt[loc]; // defined outside loops??
int depth = stmt_nesting_level_[loc] - 1;
-
+
for (int t = depth; t >= 0; t--) {
int y = t;
itn = ir_stmt[loc];
-
+
while ((itn->parent != NULL) && (y >= 0)) {
itn = itn->parent;
if (itn->content->type() == IR_CONTROL_LOOP)
y--;
}
-
+
if (itn->content->type() == IR_CONTROL_LOOP && itn->payload == -1) {
CG_outputBuilder *ocg = ir->builder();
-
+
itn->payload = depth - t;
-
+
CG_outputRepr *code =
- static_cast<IR_Block *>(ir_stmt[loc]->content)->extract();
-
+ static_cast<IR_Block *>(ir_stmt[loc]->content)->extract();
+
std::vector<CG_outputRepr *> index_expr;
std::vector<std::string> old_index;
CG_outputRepr *repl = ocg->CreateIdent(index[itn->payload]);
index_expr.push_back(repl);
old_index.push_back(
- static_cast<IR_Loop *>(itn->content)->index()->name());
+ static_cast<IR_Loop *>(itn->content)->index()->name());
code = ocg->CreateSubstitutedStmt(0, code, old_index,
index_expr);
-
- replace.insert(std::pair<int, CG_outputRepr*>(loc, code));
+
+ replace.insert(std::pair<int, CG_outputRepr *>(loc, code));
//stmt[loc].code = code;
-
+
}
}
-
+
CHILL_DEBUG_PRINT("set relation variable names ****\n");
// set relation variable names
-
+
// this finds the loop variables for loops enclosing this statement and puts
// them in an Omega Relation (just their names, which could fail)
-
+
CHILL_DEBUG_PRINT("Relation r(%d)\n", n_dim);
Relation r(n_dim);
F_And *f_root = r.add_and();
itn = ir_stmt[loc];
int temp_depth = depth;
while (itn->parent != NULL) {
-
+
itn = itn->parent;
if (itn->content->type() == IR_CONTROL_LOOP) {
- fprintf(stderr, "it's a loop. temp_depth %d\n", temp_depth);
+ fprintf(stderr, "it's a loop. temp_depth %d\n", temp_depth);
fprintf(stderr, "r.name_set_var( %d, %s )\n", itn->payload + 1, index[temp_depth].c_str());
r.name_set_var(itn->payload + 1, index[temp_depth]);
-
+
temp_depth--;
}
//static_cast<IR_Loop *>(itn->content)->index()->name());
}
- fprintf(stderr, "Relation r "); r.print(); fflush(stdout);
+ fprintf(stderr, "Relation r ");
+ r.print();
+ fflush(stdout);
//fprintf(stderr, "f_root "); f_root->print(stderr); fprintf(stderr, "\n");
-
+
/*while (itn->parent != NULL) {
itn = itn->parent;
if (itn->content->type() == IR_CONTROL_LOOP)
r.name_set_var(itn->payload+1, static_cast<IR_Loop *>(itn->content)->index()->name());
}*/
-
-
-
-
- fprintf(stderr, "extract information from loop/if structures\n");
+
+
+
+
+ fprintf(stderr, "extract information from loop/if structures\n");
// extract information from loop/if structures
std::vector<bool> processed(n_dim, false);
std::vector<std::string> vars_to_be_reversed;
-
+
std::vector<std::string> insp_lb;
std::vector<std::string> insp_ub;
-
+
itn = ir_stmt[loc];
while (itn->parent != NULL) { // keep heading upward
itn = itn->parent;
-
+
switch (itn->content->type()) {
- case IR_CONTROL_LOOP: {
- fprintf(stderr, "loop.cc l 462 IR_CONTROL_LOOP\n");
- IR_Loop *lp = static_cast<IR_Loop *>(itn->content);
- Variable_ID v = r.set_var(itn->payload + 1);
- int c;
-
- try {
- c = lp->step_size();
- //fprintf(stderr, "step size %d\n", c);
- if (c > 0) {
+ case IR_CONTROL_LOOP: {
+ fprintf(stderr, "loop.cc l 462 IR_CONTROL_LOOP\n");
+ IR_Loop *lp = static_cast<IR_Loop *>(itn->content);
+ Variable_ID v = r.set_var(itn->payload + 1);
+ int c;
+
+ try {
+ c = lp->step_size();
+ //fprintf(stderr, "step size %d\n", c);
+ if (c > 0) {
+ CG_outputRepr *lb = lp->lower_bound();
+ fprintf(stderr, "loop.cc, got the lower bound. it is:\n");
+ lb->dump();
+ printf("\n");
+ fflush(stdout);
+
+ exp2formula(ir, r, f_root, freevar, lb, v, 's',
+ IR_COND_GE, true, uninterpreted_symbols[i], uninterpreted_symbols_stringrepr[i]);
+
+ CG_outputRepr *ub = lp->upper_bound();
+ //fprintf(stderr, "loop.cc, got the upper bound. it is:\n");
+ //ub->dump(); printf("\n"); fflush(stdout);
+
+
+
+ IR_CONDITION_TYPE cond = lp->stop_cond();
+ if (cond == IR_COND_LT || cond == IR_COND_LE)
+ exp2formula(ir, r, f_root, freevar, ub, v, 's',
+ cond, true, uninterpreted_symbols[i], uninterpreted_symbols_stringrepr[i]);
+ else
+ throw ir_error("loop condition not supported");
+
+
+ if ((ir->QueryExpOperation(lp->lower_bound())
+ == IR_OP_ARRAY_VARIABLE)
+ && (ir->QueryExpOperation(lp->lower_bound())
+ == ir->QueryExpOperation(
+ lp->upper_bound()))) {
+
+ fprintf(stderr, "loop.cc lower and upper are both IR_OP_ARRAY_VARIABLE?\n");
+
+ std::vector<CG_outputRepr *> v =
+ ir->QueryExpOperand(lp->lower_bound());
+ IR_ArrayRef *ref =
+ static_cast<IR_ArrayRef *>(ir->Repr2Ref(
+ v[0]));
+ std::string s0 = ref->name();
+ std::vector<CG_outputRepr *> v2 =
+ ir->QueryExpOperand(lp->upper_bound());
+ IR_ArrayRef *ref2 =
+ static_cast<IR_ArrayRef *>(ir->Repr2Ref(
+ v2[0]));
+ std::string s1 = ref2->name();
+
+ if (s0 == s1) {
+ insp_lb.push_back(s0);
+ insp_ub.push_back(s1);
+
+ }
+
+ }
+
+
+ } else if (c < 0) {
+ CG_outputBuilder *ocg = ir->builder();
+ CG_outputRepr *lb = lp->lower_bound();
+ lb = ocg->CreateMinus(NULL, lb);
+ exp2formula(ir, r, f_root, freevar, lb, v, 's',
+ IR_COND_GE, true, uninterpreted_symbols[i], uninterpreted_symbols_stringrepr[i]);
+ CG_outputRepr *ub = lp->upper_bound();
+ ub = ocg->CreateMinus(NULL, ub);
+ IR_CONDITION_TYPE cond = lp->stop_cond();
+ if (cond == IR_COND_GE)
+ exp2formula(ir, r, f_root, freevar, ub, v, 's',
+ IR_COND_LE, true, uninterpreted_symbols[i], uninterpreted_symbols_stringrepr[i]);
+ else if (cond == IR_COND_GT)
+ exp2formula(ir, r, f_root, freevar, ub, v, 's',
+ IR_COND_LT, true, uninterpreted_symbols[i], uninterpreted_symbols_stringrepr[i]);
+ else
+ throw ir_error("loop condition not supported");
+
+ vars_to_be_reversed.push_back(lp->index()->name());
+ } else
+ throw ir_error("loop step size zero");
+ } catch (const ir_error &e) {
+ actual_code[loc] =
+ static_cast<IR_Block *>(ir_stmt[loc]->content)->extract();
+ for (int i = 0; i < itn->children.size(); i++)
+ delete itn->children[i];
+ itn->children = std::vector<ir_tree_node *>();
+ itn->content = itn->content->convert();
+ return false;
+ }
+
+ // check for loop increment or decrement that is not 1
+ //fprintf(stderr, "abs(c)\n");
+ if (abs(c) != 1) {
+ F_Exists *f_exists = f_root->add_exists();
+ Variable_ID e = f_exists->declare();
+ F_And *f_and = f_exists->add_and();
+ Stride_Handle h = f_and->add_stride(abs(c));
+ if (c > 0)
+ h.update_coef(e, 1);
+ else
+ h.update_coef(e, -1);
+ h.update_coef(v, -1);
CG_outputRepr *lb = lp->lower_bound();
- fprintf(stderr, "loop.cc, got the lower bound. it is:\n");
- lb->dump(); printf("\n"); fflush(stdout);
-
- exp2formula(ir, r, f_root, freevar, lb, v, 's',
- IR_COND_GE, true,uninterpreted_symbols[i],uninterpreted_symbols_stringrepr[i]);
-
- CG_outputRepr *ub = lp->upper_bound();
- //fprintf(stderr, "loop.cc, got the upper bound. it is:\n");
- //ub->dump(); printf("\n"); fflush(stdout);
-
-
-
- IR_CONDITION_TYPE cond = lp->stop_cond();
- if (cond == IR_COND_LT || cond == IR_COND_LE)
- exp2formula(ir, r, f_root, freevar, ub, v, 's',
- cond, true,uninterpreted_symbols[i],uninterpreted_symbols_stringrepr[i]);
+ exp2formula(ir, r, f_and, freevar, lb, e, 's', IR_COND_EQ,
+ true, uninterpreted_symbols[i], uninterpreted_symbols_stringrepr[i]);
+ }
+
+ processed[itn->payload] = true;
+ break;
+ }
+
+
+ case IR_CONTROL_IF: {
+ fprintf(stderr, "IR_CONTROL_IF\n");
+ IR_If *theif = static_cast<IR_If *>(itn->content);
+
+ CG_outputRepr *cond =
+ static_cast<IR_If *>(itn->content)->condition();
+
+ try {
+ if (itn->payload % 2 == 1)
+ exp2constraint(ir, r, f_root, freevar, cond, true, uninterpreted_symbols[i],
+ uninterpreted_symbols_stringrepr[i]);
+ else {
+ F_Not *f_not = f_root->add_not();
+ F_And *f_and = f_not->add_and();
+ exp2constraint(ir, r, f_and, freevar, cond, true, uninterpreted_symbols[i],
+ uninterpreted_symbols_stringrepr[i]);
+ }
+ } catch (const ir_error &e) {
+ std::vector<ir_tree_node *> *t;
+ if (itn->parent == NULL)
+ t = &ir_tree;
else
- throw ir_error("loop condition not supported");
-
-
- if ((ir->QueryExpOperation(lp->lower_bound())
- == IR_OP_ARRAY_VARIABLE)
- && (ir->QueryExpOperation(lp->lower_bound())
- == ir->QueryExpOperation(
- lp->upper_bound()))) {
-
- fprintf(stderr, "loop.cc lower and upper are both IR_OP_ARRAY_VARIABLE?\n");
-
- std::vector<CG_outputRepr *> v =
- ir->QueryExpOperand(lp->lower_bound());
- IR_ArrayRef *ref =
- static_cast<IR_ArrayRef *>(ir->Repr2Ref(
- v[0]));
- std::string s0 = ref->name();
- std::vector<CG_outputRepr *> v2 =
- ir->QueryExpOperand(lp->upper_bound());
- IR_ArrayRef *ref2 =
- static_cast<IR_ArrayRef *>(ir->Repr2Ref(
- v2[0]));
- std::string s1 = ref2->name();
-
- if (s0 == s1) {
- insp_lb.push_back(s0);
- insp_ub.push_back(s1);
-
+ t = &(itn->parent->children);
+ int id = itn->payload;
+ int i = t->size() - 1;
+ while (i >= 0) {
+ if ((*t)[i] == itn) {
+ for (int j = 0; j < itn->children.size(); j++)
+ delete itn->children[j];
+ itn->children = std::vector<ir_tree_node *>();
+ itn->content = itn->content->convert();
+ } else if ((*t)[i]->payload >> 1 == id >> 1) {
+ delete (*t)[i];
+ t->erase(t->begin() + i);
}
-
+ i--;
}
-
-
- } else if (c < 0) {
- CG_outputBuilder *ocg = ir->builder();
- CG_outputRepr *lb = lp->lower_bound();
- lb = ocg->CreateMinus(NULL, lb);
- exp2formula(ir, r, f_root, freevar, lb, v, 's',
- IR_COND_GE, true,uninterpreted_symbols[i],uninterpreted_symbols_stringrepr[i]);
- CG_outputRepr *ub = lp->upper_bound();
- ub = ocg->CreateMinus(NULL, ub);
- IR_CONDITION_TYPE cond = lp->stop_cond();
- if (cond == IR_COND_GE)
- exp2formula(ir, r, f_root, freevar, ub, v, 's',
- IR_COND_LE, true,uninterpreted_symbols[i],uninterpreted_symbols_stringrepr[i]);
- else if (cond == IR_COND_GT)
- exp2formula(ir, r, f_root, freevar, ub, v, 's',
- IR_COND_LT, true,uninterpreted_symbols[i],uninterpreted_symbols_stringrepr[i]);
- else
- throw ir_error("loop condition not supported");
-
- vars_to_be_reversed.push_back(lp->index()->name());
- } else
- throw ir_error("loop step size zero");
- } catch (const ir_error &e) {
- actual_code[loc] =
- static_cast<IR_Block *>(ir_stmt[loc]->content)->extract();
+ return false;
+ }
+
+ break;
+ }
+ default:
+ //fprintf(stderr, "default?\n");
for (int i = 0; i < itn->children.size(); i++)
delete itn->children[i];
itn->children = std::vector<ir_tree_node *>();
itn->content = itn->content->convert();
return false;
- }
-
- // check for loop increment or decrement that is not 1
- //fprintf(stderr, "abs(c)\n");
- if (abs(c) != 1) {
- F_Exists *f_exists = f_root->add_exists();
- Variable_ID e = f_exists->declare();
- F_And *f_and = f_exists->add_and();
- Stride_Handle h = f_and->add_stride(abs(c));
- if (c > 0)
- h.update_coef(e, 1);
- else
- h.update_coef(e, -1);
- h.update_coef(v, -1);
- CG_outputRepr *lb = lp->lower_bound();
- exp2formula(ir, r, f_and, freevar, lb, e, 's', IR_COND_EQ,
- true,uninterpreted_symbols[i],uninterpreted_symbols_stringrepr[i]);
- }
-
- processed[itn->payload] = true;
- break;
- }
-
-
- case IR_CONTROL_IF: {
- fprintf(stderr, "IR_CONTROL_IF\n");
- IR_If *theif = static_cast<IR_If *>(itn->content);
-
- CG_outputRepr *cond =
- static_cast<IR_If *>(itn->content)->condition();
-
- try {
- if (itn->payload % 2 == 1)
- exp2constraint(ir, r, f_root, freevar, cond, true,uninterpreted_symbols[i],uninterpreted_symbols_stringrepr[i]);
- else {
- F_Not *f_not = f_root->add_not();
- F_And *f_and = f_not->add_and();
- exp2constraint(ir, r, f_and, freevar, cond, true,uninterpreted_symbols[i],uninterpreted_symbols_stringrepr[i]);
- }
- } catch (const ir_error &e) {
- std::vector<ir_tree_node *> *t;
- if (itn->parent == NULL)
- t = &ir_tree;
- else
- t = &(itn->parent->children);
- int id = itn->payload;
- int i = t->size() - 1;
- while (i >= 0) {
- if ((*t)[i] == itn) {
- for (int j = 0; j < itn->children.size(); j++)
- delete itn->children[j];
- itn->children = std::vector<ir_tree_node *>();
- itn->content = itn->content->convert();
- } else if ((*t)[i]->payload >> 1 == id >> 1) {
- delete (*t)[i];
- t->erase(t->begin() + i);
- }
- i--;
- }
- return false;
- }
-
- break;
- }
- default:
- //fprintf(stderr, "default?\n");
- for (int i = 0; i < itn->children.size(); i++)
- delete itn->children[i];
- itn->children = std::vector<ir_tree_node *>();
- itn->content = itn->content->convert();
- return false;
}
}
-
-
+
+
//fprintf(stderr, "add information for missing loops n_dim(%d)\n", n_dim);
// add information for missing loops
for (int j = 0; j < n_dim; j++)
@@ -645,18 +651,18 @@ bool Loop::init_loop(std::vector<ir_tree_node *> &ir_tree,
&& itn->payload == j)
break;
}
-
+
Variable_ID v = r.set_var(j + 1);
if (loc < max_loc) {
-
+
CG_outputBuilder *ocg = ir->builder();
-
+
CG_outputRepr *lb =
- static_cast<IR_Loop *>(itn->content)->lower_bound();
-
+ static_cast<IR_Loop *>(itn->content)->lower_bound();
+
exp2formula(ir, r, f_root, freevar, lb, v, 's', IR_COND_EQ,
- false,uninterpreted_symbols[i],uninterpreted_symbols_stringrepr[i]);
-
+ false, uninterpreted_symbols[i], uninterpreted_symbols_stringrepr[i]);
+
/* if (ir->QueryExpOperation(
static_cast<IR_Loop *>(itn->content)->lower_bound())
== IR_OP_VARIABLE) {
@@ -684,15 +690,15 @@ bool Loop::init_loop(std::vector<ir_tree_node *> &ir_tree,
}
*/
-
+
} else { // loc > max_loc
-
+
CG_outputBuilder *ocg = ir->builder();
CG_outputRepr *ub =
- static_cast<IR_Loop *>(itn->content)->upper_bound();
-
+ static_cast<IR_Loop *>(itn->content)->upper_bound();
+
exp2formula(ir, r, f_root, freevar, ub, v, 's', IR_COND_EQ,
- false,uninterpreted_symbols[i],uninterpreted_symbols_stringrepr[i]);
+ false, uninterpreted_symbols[i], uninterpreted_symbols_stringrepr[i]);
/*if (ir->QueryExpOperation(
static_cast<IR_Loop *>(itn->content)->upper_bound())
== IR_OP_VARIABLE) {
@@ -724,29 +730,29 @@ bool Loop::init_loop(std::vector<ir_tree_node *> &ir_tree,
*/
}
}
-
+
r.setup_names();
r.simplify();
-
+
// THIS IS MISSING IN PROTONU's
for (int j = 0; j < insp_lb.size(); j++) {
-
+
std::string lb = insp_lb[j] + "_";
std::string ub = lb + "_";
-
+
Global_Var_ID u, l;
bool found_ub = false;
bool found_lb = false;
for (DNF_Iterator di(copy(r).query_DNF()); di; di++)
for (Constraint_Iterator ci = (*di)->constraints(); ci; ci++)
-
+
for (Constr_Vars_Iter cvi(*ci); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
if (v->kind() == Global_Var)
if (v->get_global_var()->arity() > 0) {
-
+
std::string name =
- v->get_global_var()->base_name();
+ v->get_global_var()->base_name();
if (name == lb) {
l = v->get_global_var();
found_lb = true;
@@ -755,9 +761,9 @@ bool Loop::init_loop(std::vector<ir_tree_node *> &ir_tree,
found_ub = true;
}
}
-
+
}
-
+
if (found_lb && found_ub) {
Relation known_(copy(r).n_set());
known_.copy_names(copy(r));
@@ -770,12 +776,12 @@ bool Loop::init_loop(std::vector<ir_tree_node *> &ir_tree,
g.update_coef(index_lb, -1);
g.update_const(-1);
addKnown(known_);
-
+
}
-
+
}
-
-
+
+
fprintf(stderr, "loop.cc L441 insert the statement\n");
// insert the statement
CG_outputBuilder *ocg = ir->builder();
@@ -785,36 +791,38 @@ bool Loop::init_loop(std::vector<ir_tree_node *> &ir_tree,
repl = ocg->CreateMinus(NULL, repl);
reverse_expr.push_back(repl);
}
- fprintf(stderr, "loop.cc before extract\n");
+ fprintf(stderr, "loop.cc before extract\n");
CG_outputRepr *code =
- static_cast<IR_Block *>(ir_stmt[loc]->content)->extract();
+ static_cast<IR_Block *>(ir_stmt[loc]->content)->extract();
fprintf(stderr, "code = ocg->CreateSubstitutedStmt(...)\n");
- ((CG_chillRepr *)code)->Dump(); fflush(stdout);
-
+ ((CG_chillRepr *) code)->Dump();
+ fflush(stdout);
+
code = ocg->CreateSubstitutedStmt(0, code, vars_to_be_reversed,
reverse_expr);
fprintf(stderr, "stmt\n");
- ((CG_chillRepr *)code)->Dump(); fflush(stdout);
+ ((CG_chillRepr *) code)->Dump();
+ fflush(stdout);
stmt[loc].code = code;
stmt[loc].IS = r;
-
+
//Anand: Add Information on uninterpreted function constraints to
//Known relation
-
- fprintf(stderr, "loop.cc stmt[%d].loop_level has size n_dim %d\n", loc, n_dim);
+
+ fprintf(stderr, "loop.cc stmt[%d].loop_level has size n_dim %d\n", loc, n_dim);
stmt[loc].loop_level = std::vector<LoopLevel>(n_dim);
stmt[loc].ir_stmt_node = ir_stmt[loc];
stmt[loc].has_inspector = false;
- fprintf(stderr, "for int i < n_dim(%d)\n", n_dim);
+ fprintf(stderr, "for int i < n_dim(%d)\n", n_dim);
for (int ii = 0; ii < n_dim; ii++) {
stmt[loc].loop_level[ii].type = LoopLevelOriginal;
stmt[loc].loop_level[ii].payload = ii;
stmt[loc].loop_level[ii].parallel_level = 0;
}
- fprintf(stderr, "whew\n");
-
+ fprintf(stderr, "whew\n");
+
stmt_nesting_level[loc] = -1;
}
dump();
@@ -824,36 +832,35 @@ bool Loop::init_loop(std::vector<ir_tree_node *> &ir_tree,
}
-
Loop::Loop(const IR_Control *control) {
-
- CHILL_DEBUG_PRINT("control type is %d ", control->type());
+
+ CHILL_DEBUG_PRINT("control type is %d \n", control->type());
echocontroltype(control);
- CHILL_DEBUG_PRINT("2set last_compute_cg_ = NULL; \n");
+ CHILL_DEBUG_PRINT("set last_compute_cg_ = NULL; \n");
last_compute_cgr_ = NULL;
last_compute_cg_ = NULL;
ir = const_cast<IR_Code *>(control->ir_); // point to the CHILL IR that this loop came from
- if (ir == 0) {
- CHILL_DEBUG_PRINT("ir gotten from control = 0x%x\n", (long)ir);
- CHILL_DEBUG_PRINT("loop.cc GONNA DIE SOON *******************************\n\n");
+ if (ir == 0) {
+ CHILL_DEBUG_PRINT("ir gotten from control = 0x%x\n", (long) ir);
+ CHILL_DEBUG_PRINT("GONNA DIE SOON *******************************\n\n");
}
-
+
init_code = NULL;
cleanup_code = NULL;
tmp_loop_var_name_counter = 1;
overflow_var_name_counter = 1;
known = Relation::True(0);
-
+
CHILL_DEBUG_PRINT("calling build_ir_tree()\n");
CHILL_DEBUG_PRINT("about to clone control\n");
ir_tree = build_ir_tree(control->clone(), NULL);
//fprintf(stderr,"in Loop::Loop. ir_tree has %ld parts\n", ir_tree.size());
-
+
// std::vector<ir_tree_node *> ir_stmt;
//fprintf(stderr, "loop.cc after build_ir_tree() %ld statements\n", stmt.size());
-
+
int count = 0;
//fprintf(stderr, "before init_loops, %d freevar\n", freevar.size());
//fprintf(stderr, "count %d\n", count++);
@@ -861,19 +868,19 @@ Loop::Loop(const IR_Control *control) {
while (!init_loop(ir_tree, ir_stmt)) {
//fprintf(stderr, "count %d\n", count++);
}
- fprintf(stderr, "after init_loop, %d freevar\n", (int)freevar.size());
-
-
- fprintf(stderr, "loop.cc after init_loop, %d statements\n", (int)stmt.size());
+ fprintf(stderr, "after init_loop, %d freevar\n", (int) freevar.size());
+
+
+ fprintf(stderr, "loop.cc after init_loop, %d statements\n", (int) stmt.size());
for (int i = 0; i < stmt.size(); i++) {
- std::map<int, CG_outputRepr*>::iterator it = replace.find(i);
-
+ std::map<int, CG_outputRepr *>::iterator it = replace.find(i);
+
if (it != replace.end())
stmt[i].code = it->second;
else
stmt[i].code = stmt[i].code;
}
-
+
if (stmt.size() != 0)
dep = DependenceGraph(stmt[0].IS.n_set());
else
@@ -881,42 +888,42 @@ Loop::Loop(const IR_Control *control) {
// init the dependence graph
for (int i = 0; i < stmt.size(); i++)
dep.insert();
-
- fprintf(stderr, "this really REALLY needs some comments\n");
+
+ fprintf(stderr, "this really REALLY needs some comments\n");
// this really REALLY needs some comments
for (int i = 0; i < stmt.size(); i++) {
- fprintf(stderr, "i %d\n", i);
+ fprintf(stderr, "i %d\n", i);
stmt[i].reduction = 0; // Manu -- initialization
for (int j = i; j < stmt.size(); j++) {
- fprintf(stderr, "j %d\n", j);
+ fprintf(stderr, "j %d\n", j);
std::pair<std::vector<DependenceVector>,
- std::vector<DependenceVector> > dv = test_data_dependences(
- ir,
- stmt[i].code,
- stmt[i].IS,
- stmt[j].code,
- stmt[j].IS,
- freevar,
- index,
- stmt_nesting_level_[i],
- stmt_nesting_level_[j],
- uninterpreted_symbols[ i ],
- uninterpreted_symbols_stringrepr[ i ]);
-
- fprintf(stderr, "dv.first.size() %d\n", (int)dv.first.size());
+ std::vector<DependenceVector> > dv = test_data_dependences(
+ ir,
+ stmt[i].code,
+ stmt[i].IS,
+ stmt[j].code,
+ stmt[j].IS,
+ freevar,
+ index,
+ stmt_nesting_level_[i],
+ stmt_nesting_level_[j],
+ uninterpreted_symbols[i],
+ uninterpreted_symbols_stringrepr[i]);
+
+ fprintf(stderr, "dv.first.size() %d\n", (int) dv.first.size());
for (int k = 0; k < dv.first.size(); k++) {
- fprintf(stderr, "k1 %d\n", k);
+ fprintf(stderr, "k1 %d\n", k);
if (is_dependence_valid(ir_stmt[i], ir_stmt[j], dv.first[k],
true))
dep.connect(i, j, dv.first[k]);
else {
dep.connect(j, i, dv.first[k].reverse());
}
-
+
}
-
- for (int k = 0; k < dv.second.size(); k++) {
- fprintf(stderr, "k2 %d\n", k);
+
+ for (int k = 0; k < dv.second.size(); k++) {
+ fprintf(stderr, "k2 %d\n", k);
if (is_dependence_valid(ir_stmt[j], ir_stmt[i], dv.second[k],
false))
dep.connect(j, i, dv.second[k]);
@@ -926,64 +933,64 @@ Loop::Loop(const IR_Control *control) {
}
}
}
-
- fprintf(stderr, "\n\n*** LOTS OF REDUCTIONS ***\n\n");
-
+
+ fprintf(stderr, "\n\n*** LOTS OF REDUCTIONS ***\n\n");
+
// TODO: Reduction check
// Manu:: Initial implementation / algorithm
std::set<int> reducCand = std::set<int>();
std::vector<int> canReduce = std::vector<int>();
- fprintf(stderr, "\ni range %d\n", stmt.size());
+ fprintf(stderr, "\ni range %d\n", stmt.size());
for (int i = 0; i < stmt.size(); i++) {
- fprintf(stderr, "i %d\n", i);
+ fprintf(stderr, "i %d\n", i);
if (!dep.hasEdge(i, i)) {
continue;
}
- fprintf(stderr, "dep.hasEdge(%d, %d)\n", i, i);
+ fprintf(stderr, "dep.hasEdge(%d, %d)\n", i, i);
// for each statement check if it has all the three dependences (RAW, WAR, WAW)
// If there is such a statement, it is a reduction candidate. Mark all reduction candidates.
std::vector<DependenceVector> tdv = dep.getEdge(i, i);
- fprintf(stderr, "tdv size %d\n", tdv.size());
+ fprintf(stderr, "tdv size %d\n", tdv.size());
for (int j = 0; j < tdv.size(); j++) {
- fprintf(stderr, "ij %d %d\n", i, j);
- if (tdv[j].is_reduction_cand) {
- fprintf(stderr, "reducCand.insert( %d )\n", i);
+ fprintf(stderr, "ij %d %d\n", i, j);
+ if (tdv[j].is_reduction_cand) {
+ fprintf(stderr, "reducCand.insert( %d )\n", i);
reducCand.insert(i);
}
}
}
-
- fprintf(stderr, "loop.cc reducCand.size() %d\n", reducCand.size());
+
+ fprintf(stderr, "loop.cc reducCand.size() %d\n", reducCand.size());
bool reduc;
std::set<int>::iterator it;
- int counter = 0;
+ int counter = 0;
for (it = reducCand.begin(); it != reducCand.end(); it++) {
- fprintf(stderr, "counter %d\n", counter);
+ fprintf(stderr, "counter %d\n", counter);
reduc = true;
for (int j = 0; j < stmt.size(); j++) {
- fprintf(stderr, "j %d\n", j);
+ fprintf(stderr, "j %d\n", j);
if ((*it != j)
&& (stmt_nesting_level_[*it] < stmt_nesting_level_[j])) {
if (dep.hasEdge(*it, j) || dep.hasEdge(j, *it)) {
- fprintf(stderr, "counter %d j %d reduc = false\n", counter, j);
+ fprintf(stderr, "counter %d j %d reduc = false\n", counter, j);
reduc = false;
break;
}
}
counter += 1;
}
-
+
if (reduc) {
- fprintf(stderr, "canReduce.push_back()\n");
+ fprintf(stderr, "canReduce.push_back()\n");
canReduce.push_back(*it);
stmt[*it].reduction = 2; // First, assume that reduction is possible with some processing
}
}
-
-
+
+
// If reduction is possible without processing, update the value of the reduction variable to 1
- fprintf(stderr, "loop.cc canReduce.size() %d\n", canReduce.size());
+ fprintf(stderr, "loop.cc canReduce.size() %d\n", canReduce.size());
for (int i = 0; i < canReduce.size(); i++) {
// Here, assuming that stmtType returns 1 when there is a single statement within stmt[i]
if (stmtType(ir, stmt[canReduce[i]].code) == 1) {
@@ -993,9 +1000,9 @@ Loop::Loop(const IR_Control *control) {
stmt[canReduce[i]].reductionOp = opType;
}
}
-
+
// printing out stuff for debugging
-
+
if (DEP_DEBUG) {
std::cout << "STATEMENTS THAT CAN BE REDUCED: \n";
for (int i = 0; i < canReduce.size(); i++) {
@@ -1015,21 +1022,21 @@ Loop::Loop(const IR_Control *control) {
}
}
// cleanup the IR tree
-
- fprintf(stderr, "init dumb transformation relations\n");
+
+ fprintf(stderr, "init dumb transformation relations\n");
// init dumb transformation relations e.g. [i, j] -> [ 0, i, 0, j, 0]
for (int i = 0; i < stmt.size(); i++) {
int n = stmt[i].IS.n_set();
stmt[i].xform = Relation(n, 2 * n + 1);
F_And *f_root = stmt[i].xform.add_and();
-
+
for (int j = 1; j <= n; j++) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(stmt[i].xform.output_var(2 * j), 1);
h.update_coef(stmt[i].xform.input_var(j), -1);
}
-
+
for (int j = 1; j <= 2 * n + 1; j += 2) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(stmt[i].xform.output_var(j), 1);
@@ -1037,7 +1044,7 @@ Loop::Loop(const IR_Control *control) {
stmt[i].xform.simplify();
}
//fprintf(stderr, "done with dumb\n");
-
+
if (stmt.size() != 0)
num_dep_dim = stmt[0].IS.n_set();
else
@@ -1056,19 +1063,19 @@ Loop::Loop(const IR_Control *control) {
}
Loop::~Loop() {
-
+
delete last_compute_cgr_;
delete last_compute_cg_;
-
+
for (int i = 0; i < stmt.size(); i++)
if (stmt[i].code != NULL) {
stmt[i].code->clear();
delete stmt[i].code;
}
-
+
for (int i = 0; i < ir_tree.size(); i++)
delete ir_tree[i];
-
+
if (init_code != NULL) {
init_code->clear();
delete init_code;
@@ -1080,54 +1087,52 @@ Loop::~Loop() {
}
-
-
int Loop::get_dep_dim_of(int stmt_num, int level) const {
if (stmt_num < 0 || stmt_num >= stmt.size())
throw std::invalid_argument("invaid statement " + to_string(stmt_num));
-
+
if (level < 1 || level > stmt[stmt_num].loop_level.size())
return -1;
-
+
int trip_count = 0;
while (true) {
switch (stmt[stmt_num].loop_level[level - 1].type) {
- case LoopLevelOriginal:
- return stmt[stmt_num].loop_level[level - 1].payload;
- case LoopLevelTile:
- level = stmt[stmt_num].loop_level[level - 1].payload;
- if (level < 1)
- return -1;
- if (level > stmt[stmt_num].loop_level.size())
- throw loop_error("incorrect loop level information for statement "
- + to_string(stmt_num));
- break;
- default:
- throw loop_error(
- "unknown loop level information for statement "
- + to_string(stmt_num));
+ case LoopLevelOriginal:
+ return stmt[stmt_num].loop_level[level - 1].payload;
+ case LoopLevelTile:
+ level = stmt[stmt_num].loop_level[level - 1].payload;
+ if (level < 1)
+ return -1;
+ if (level > stmt[stmt_num].loop_level.size())
+ throw loop_error("incorrect loop level information for statement "
+ + to_string(stmt_num));
+ break;
+ default:
+ throw loop_error(
+ "unknown loop level information for statement "
+ + to_string(stmt_num));
}
trip_count++;
if (trip_count >= stmt[stmt_num].loop_level.size())
throw loop_error(
- "incorrect loop level information for statement "
- + to_string(stmt_num));
+ "incorrect loop level information for statement "
+ + to_string(stmt_num));
}
}
int Loop::get_last_dep_dim_before(int stmt_num, int level) const {
if (stmt_num < 0 || stmt_num >= stmt.size())
throw std::invalid_argument("invaid statement " + to_string(stmt_num));
-
+
if (level < 1)
return -1;
if (level > stmt[stmt_num].loop_level.size())
level = stmt[stmt_num].loop_level.size() + 1;
-
+
for (int i = level - 1; i >= 1; i--)
if (stmt[stmt_num].loop_level[i - 1].type == LoopLevelOriginal)
return stmt[stmt_num].loop_level[i - 1].payload;
-
+
return -1;
}
@@ -1139,14 +1144,14 @@ void Loop::print_internal_loop_structure() const {
if (2 * j < lex.size())
std::cout << lex[2 * j];
switch (stmt[i].loop_level[j].type) {
- case LoopLevelOriginal:
- std::cout << "(dim:" << stmt[i].loop_level[j].payload << ")";
- break;
- case LoopLevelTile:
- std::cout << "(tile:" << stmt[i].loop_level[j].payload << ")";
- break;
- default:
- std::cout << "(unknown)";
+ case LoopLevelOriginal:
+ std::cout << "(dim:" << stmt[i].loop_level[j].payload << ")";
+ break;
+ case LoopLevelTile:
+ std::cout << "(tile:" << stmt[i].loop_level[j].payload << ")";
+ break;
+ default:
+ std::cout << "(unknown)";
}
std::cout << ' ';
}
@@ -1159,96 +1164,102 @@ void Loop::print_internal_loop_structure() const {
}
}
-void Loop::debugRelations() const {
- const int m = stmt.size();
+void Loop::debugRelations() const {
+ const int m = stmt.size();
{
std::vector<Relation> IS(m);
std::vector<Relation> xforms(m);
-
+
for (int i = 0; i < m; i++) {
IS[i] = stmt[i].IS;
xforms[i] = stmt[i].xform; // const stucks
}
-
- printf("\nxforms:\n");
- for (int i = 0; i < m; i++) { xforms[i].print(); printf("\n"); }
- printf("\nIS:\n");
- for (int i = 0; i < m; i++) { IS[i].print(); printf("\n"); }
- fflush(stdout);
+
+ printf("\nxforms:\n");
+ for (int i = 0; i < m; i++) {
+ xforms[i].print();
+ printf("\n");
+ }
+ printf("\nIS:\n");
+ for (int i = 0; i < m; i++) {
+ IS[i].print();
+ printf("\n");
+ }
+ fflush(stdout);
}
}
CG_outputRepr *Loop::getCode(int effort) const {
- fprintf(stderr,"\nloop.cc Loop::getCode( effort %d )\n", effort );
-
+ fprintf(stderr, "\nloop.cc Loop::getCode( effort %d )\n", effort);
+
const int m = stmt.size();
if (m == 0)
return NULL;
const int n = stmt[0].xform.n_out();
-
+
if (last_compute_cg_ == NULL) {
- fprintf(stderr, "Loop::getCode() last_compute_cg_ == NULL\n");
-
+ fprintf(stderr, "Loop::getCode() last_compute_cg_ == NULL\n");
+
std::vector<Relation> IS(m);
std::vector<Relation> xforms(m);
for (int i = 0; i < m; i++) {
IS[i] = stmt[i].IS;
xforms[i] = stmt[i].xform;
}
-
- debugRelations();
-
-
+
+ debugRelations();
+
+
Relation known = Extend_Set(copy(this->known), n - this->known.n_set());
- printf("\nknown:\n"); known.print(); printf("\n\n"); fflush(stdout);
-
+ printf("\nknown:\n");
+ known.print();
+ printf("\n\n");
+ fflush(stdout);
+
last_compute_cg_ = new CodeGen(xforms, IS, known);
delete last_compute_cgr_;
last_compute_cgr_ = NULL;
- }
- else {
- fprintf(stderr, "Loop::getCode() last_compute_cg_ NOT NULL\n");
+ } else {
+ fprintf(stderr, "Loop::getCode() last_compute_cg_ NOT NULL\n");
}
-
+
if (last_compute_cgr_ == NULL || last_compute_effort_ != effort) {
delete last_compute_cgr_;
last_compute_cgr_ = last_compute_cg_->buildAST(effort);
last_compute_effort_ = effort;
}
-
+
std::vector<CG_outputRepr *> stmts(m);
- fprintf(stderr, "%d stmts\n", m);
+ fprintf(stderr, "%d stmts\n", m);
for (int i = 0; i < m; i++)
stmts[i] = stmt[i].code;
CG_outputBuilder *ocg = ir->builder();
- fprintf(stderr, "calling last_compute_cgr_->printRepr()\n");
- CG_outputRepr *repr = last_compute_cgr_->printRepr(ocg, stmts,
+ fprintf(stderr, "calling last_compute_cgr_->printRepr()\n");
+ CG_outputRepr *repr = last_compute_cgr_->printRepr(ocg, stmts,
uninterpreted_symbols);
-
+
if (init_code != NULL)
repr = ocg->StmtListAppend(init_code->clone(), repr);
if (cleanup_code != NULL)
repr = ocg->StmtListAppend(repr, cleanup_code->clone());
-
- fprintf(stderr,"\nloop.cc Loop::getCode( effort %d ) DONE\n", effort );
+
+ fprintf(stderr, "\nloop.cc Loop::getCode( effort %d ) DONE\n", effort);
return repr;
}
-
-
void Loop::printCode(int effort) const {
- fprintf(stderr,"\nloop.cc Loop::printCode( effort %d )\n", effort );
+ fprintf(stderr, "\nloop.cc Loop::printCode( effort %d )\n", effort);
const int m = stmt.size();
if (m == 0)
return;
const int n = stmt[0].xform.n_out();
-
+
if (last_compute_cg_ == NULL) {
- fprintf(stderr, "Loop::printCode(), last_compute_cg_ == NULL\n");
+ fprintf(stderr, "Loop::printCode(), last_compute_cg_ == NULL\n");
std::vector<Relation> IS(m);
std::vector<Relation> xforms(m);
for (int i = 0; i < m; i++) {
@@ -1256,22 +1267,21 @@ void Loop::printCode(int effort) const {
xforms[i] = stmt[i].xform;
}
Relation known = Extend_Set(copy(this->known), n - this->known.n_set());
-
+
last_compute_cg_ = new CodeGen(xforms, IS, known);
delete last_compute_cgr_;
last_compute_cgr_ = NULL;
- }
- else fprintf(stderr, "Loop::printCode(), last_compute_cg_ NOT NULL\n");
-
+ } else fprintf(stderr, "Loop::printCode(), last_compute_cg_ NOT NULL\n");
+
if (last_compute_cgr_ == NULL || last_compute_effort_ != effort) {
delete last_compute_cgr_;
last_compute_cgr_ = last_compute_cg_->buildAST(effort);
last_compute_effort_ = effort;
}
-
+
std::string repr = last_compute_cgr_->printString(
- uninterpreted_symbols_stringrepr);
- fprintf(stderr, "leaving Loop::printCode()\n");
+ uninterpreted_symbols_stringrepr);
+ fprintf(stderr, "leaving Loop::printCode()\n");
std::cout << repr << std::endl;
}
@@ -1297,20 +1307,20 @@ void Loop::printDependenceGraph() const {
std::vector<Relation> Loop::getNewIS() const {
const int m = stmt.size();
-
+
std::vector<Relation> new_IS(m);
for (int i = 0; i < m; i++)
new_IS[i] = getNewIS(i);
-
+
return new_IS;
}
// pragmas are tied to loops only ???
void Loop::pragma(int stmt_num, int level, const std::string &pragmaText) {
// check sanity of parameters
- if(stmt_num < 0)
+ if (stmt_num < 0)
throw std::invalid_argument("invalid statement " + to_string(stmt_num));
-
+
CG_outputBuilder *ocg = ir->builder();
CG_outputRepr *code = stmt[stmt_num].code;
ocg->CreatePragmaAttribute(code, level, pragmaText);
@@ -1331,9 +1341,9 @@ void Loop::pragma(int stmt_num, int level, const std::string &pragmaText) {
void Loop::prefetch(int stmt_num, int level, const std::string &arrName, int hint) {
// check sanity of parameters
- if(stmt_num < 0)
+ if (stmt_num < 0)
throw std::invalid_argument("invalid statement " + to_string(stmt_num));
-
+
CG_outputBuilder *ocg = ir->builder();
CG_outputRepr *code = stmt[stmt_num].code;
ocg->CreatePrefetchAttribute(code, level, arrName, hint);
@@ -1341,13 +1351,13 @@ void Loop::prefetch(int stmt_num, int level, const std::string &arrName, int hin
std::vector<int> Loop::getLexicalOrder(int stmt_num) const {
assert(stmt_num < stmt.size());
-
+
const int n = stmt[stmt_num].xform.n_out();
std::vector<int> lex(n, 0);
-
+
for (int i = 0; i < n; i += 2)
lex[i] = get_const(stmt[stmt_num].xform, i, Output_Var);
-
+
return lex;
}
@@ -1356,13 +1366,13 @@ std::vector<int> Loop::getLexicalOrder(int stmt_num) const {
std::set<int> Loop::getSubLoopNest(int stmt_num, int level) const {
assert(stmt_num >= 0 && stmt_num < stmt.size());
assert(level > 0 && level <= stmt[stmt_num].loop_level.size());
-
+
std::set<int> working;
for (int i = 0; i < stmt.size(); i++)
if (const_cast<Loop *>(this)->stmt[i].IS.is_upper_bound_satisfiable()
&& stmt[i].loop_level.size() >= level)
working.insert(i);
-
+
for (int i = 1; i <= level; i++) {
int a = getLexicalOrder(stmt_num, i);
for (std::set<int>::iterator j = working.begin(); j != working.end();) {
@@ -1373,14 +1383,14 @@ std::set<int> Loop::getSubLoopNest(int stmt_num, int level) const {
++j;
}
}
-
+
return working;
}
int Loop::getLexicalOrder(int stmt_num, int level) const {
assert(stmt_num >= 0 && stmt_num < stmt.size());
- assert(level > 0 && level <= stmt[stmt_num].loop_level.size()+1);
-
+ assert(level > 0 && level <= stmt[stmt_num].loop_level.size() + 1);
+
Relation &r = const_cast<Loop *>(this)->stmt[stmt_num].xform;
for (EQ_Iterator e(r.single_conjunct()->EQs()); e; e++)
if (abs((*e).get_coef(r.output_var(2 * level - 1))) == 1) {
@@ -1395,15 +1405,15 @@ int Loop::getLexicalOrder(int stmt_num, int level) const {
return (*e).get_coef(r.output_var(2 * level - 1)) > 0 ? -t : t;
}
}
-
+
throw loop_error(
- "can't find lexical order for statement " + to_string(stmt_num)
- + "'s loop level " + to_string(level));
+ "can't find lexical order for statement " + to_string(stmt_num)
+ + "'s loop level " + to_string(level));
}
std::set<int> Loop::getStatements(const std::vector<int> &lex, int dim) const {
const int m = stmt.size();
-
+
std::set<int> same_loops;
for (int i = 0; i < m; i++) {
if (dim < 0)
@@ -1417,32 +1427,32 @@ std::set<int> Loop::getStatements(const std::vector<int> &lex, int dim) const {
if (j > dim)
same_loops.insert(i);
}
-
+
}
-
+
return same_loops;
}
void Loop::shiftLexicalOrder(const std::vector<int> &lex, int dim, int amount) {
const int m = stmt.size();
-
+
if (amount == 0)
return;
-
+
for (int i = 0; i < m; i++) {
std::vector<int> lex2 = getLexicalOrder(i);
-
+
bool need_shift = true;
-
+
for (int j = 0; j < dim; j++)
if (lex2[j] != lex[j]) {
need_shift = false;
break;
}
-
+
if (!need_shift)
continue;
-
+
if (amount > 0) {
if (lex2[dim] < lex[dim])
continue;
@@ -1450,94 +1460,94 @@ void Loop::shiftLexicalOrder(const std::vector<int> &lex, int dim, int amount) {
if (lex2[dim] > lex[dim])
continue;
}
-
+
assign_const(stmt[i].xform, dim, lex2[dim] + amount);
}
}
std::vector<std::set<int> > Loop::sort_by_same_loops(std::set<int> active,
int level) {
-
+
std::set<int> not_nested_at_this_level;
- std::map<ir_tree_node*, std::set<int> > sorted_by_loop;
+ std::map<ir_tree_node *, std::set<int> > sorted_by_loop;
std::map<int, std::set<int> > sorted_by_lex_order;
std::vector<std::set<int> > to_return;
bool lex_order_already_set = false;
for (std::set<int>::iterator it = active.begin(); it != active.end();
it++) {
-
+
if (stmt[*it].ir_stmt_node == NULL)
lex_order_already_set = true;
}
-
+
if (lex_order_already_set) {
-
+
for (std::set<int>::iterator it = active.begin(); it != active.end();
it++) {
std::map<int, std::set<int> >::iterator it2 =
- sorted_by_lex_order.find(
- get_const(stmt[*it].xform, 2 * (level - 1),
- Output_Var));
-
+ sorted_by_lex_order.find(
+ get_const(stmt[*it].xform, 2 * (level - 1),
+ Output_Var));
+
if (it2 != sorted_by_lex_order.end())
it2->second.insert(*it);
else {
-
+
std::set<int> to_insert;
-
+
to_insert.insert(*it);
-
+
sorted_by_lex_order.insert(
- std::pair<int, std::set<int> >(
- get_const(stmt[*it].xform, 2 * (level - 1),
- Output_Var), to_insert));
-
+ std::pair<int, std::set<int> >(
+ get_const(stmt[*it].xform, 2 * (level - 1),
+ Output_Var), to_insert));
+
}
-
+
}
-
+
for (std::map<int, std::set<int> >::iterator it2 =
- sorted_by_lex_order.begin(); it2 != sorted_by_lex_order.end();
+ sorted_by_lex_order.begin(); it2 != sorted_by_lex_order.end();
it2++)
to_return.push_back(it2->second);
-
+
} else {
-
+
for (std::set<int>::iterator it = active.begin(); it != active.end();
it++) {
-
- ir_tree_node* itn = stmt[*it].ir_stmt_node;
+
+ ir_tree_node *itn = stmt[*it].ir_stmt_node;
itn = itn->parent;
//while (itn->content->type() != IR_CONTROL_LOOP && itn != NULL)
// itn = itn->parent;
-
+
while ((itn != NULL) && (itn->payload != level - 1)) {
itn = itn->parent;
- while (itn != NULL && itn->content->type() != IR_CONTROL_LOOP )
+ while (itn != NULL && itn->content->type() != IR_CONTROL_LOOP)
itn = itn->parent;
}
-
+
if (itn == NULL)
not_nested_at_this_level.insert(*it);
else {
- std::map<ir_tree_node*, std::set<int> >::iterator it2 =
- sorted_by_loop.find(itn);
-
+ std::map<ir_tree_node *, std::set<int> >::iterator it2 =
+ sorted_by_loop.find(itn);
+
if (it2 != sorted_by_loop.end())
it2->second.insert(*it);
else {
std::set<int> to_insert;
-
+
to_insert.insert(*it);
-
+
sorted_by_loop.insert(
- std::pair<ir_tree_node*, std::set<int> >(itn,
- to_insert));
-
+ std::pair<ir_tree_node *, std::set<int> >(itn,
+ to_insert));
+
}
-
+
}
-
+
}
if (not_nested_at_this_level.size() > 0) {
for (std::set<int>::iterator it = not_nested_at_this_level.begin();
@@ -1545,34 +1555,34 @@ std::vector<std::set<int> > Loop::sort_by_same_loops(std::set<int> active,
std::set<int> temp;
temp.insert(*it);
to_return.push_back(temp);
-
+
}
}
- for (std::map<ir_tree_node*, std::set<int> >::iterator it2 =
- sorted_by_loop.begin(); it2 != sorted_by_loop.end(); it2++)
+ for (std::map<ir_tree_node *, std::set<int> >::iterator it2 =
+ sorted_by_loop.begin(); it2 != sorted_by_loop.end(); it2++)
to_return.push_back(it2->second);
}
return to_return;
}
-void update_successors(int n,
- int node_num[],
+void update_successors(int n,
+ int node_num[],
int cant_fuse_with[],
- Graph<std::set<int>, bool> &g,
+ Graph<std::set<int>, bool> &g,
std::list<int> &work_list,
- std::list<bool> &type_list,
+ std::list<bool> &type_list,
std::vector<bool> types) {
-
+
std::set<int> disconnect;
for (Graph<std::set<int>, bool>::EdgeList::iterator i =
- g.vertex[n].second.begin(); i != g.vertex[n].second.end(); i++) {
+ g.vertex[n].second.begin(); i != g.vertex[n].second.end(); i++) {
int m = i->first;
-
+
if (node_num[m] != -1)
throw loop_error("Graph input for fusion has cycles not a DAG!!");
-
+
std::vector<bool> check_ = g.getEdge(n, m);
-
+
bool has_bad_edge_path = false;
for (int i = 0; i < check_.size(); i++)
if (!check_[i]) {
@@ -1589,12 +1599,12 @@ void update_successors(int n,
}
disconnect.insert(m);
}
-
-
+
+
for (std::set<int>::iterator i = disconnect.begin(); i != disconnect.end();
i++) {
g.disconnect(n, *i);
-
+
bool no_incoming_edges = true;
for (int j = 0; j < g.vertex.size(); j++)
if (j != *i)
@@ -1602,7 +1612,7 @@ void update_successors(int n,
no_incoming_edges = false;
break;
}
-
+
if (no_incoming_edges) {
work_list.push_back(*i);
type_list.push_back(types[*i]);
@@ -1611,35 +1621,32 @@ void update_successors(int n,
}
-
int Loop::getMinLexValue(std::set<int> stmts, int level) {
-
+
int min;
-
+
std::set<int>::iterator it = stmts.begin();
min = getLexicalOrder(*it, level);
-
+
for (; it != stmts.end(); it++) {
int curr = getLexicalOrder(*it, level);
if (curr < min)
min = curr;
}
-
+
return min;
}
-
-
Graph<std::set<int>, bool> Loop::construct_induced_graph_at_level(
- std::vector<std::set<int> > s, DependenceGraph dep, int dep_dim) {
+ std::vector<std::set<int> > s, DependenceGraph dep, int dep_dim) {
Graph<std::set<int>, bool> g;
-
+
for (int i = 0; i < s.size(); i++)
g.insert(s[i]);
-
+
for (int i = 0; i < s.size(); i++) {
-
+
for (int j = i + 1; j < s.size(); j++) {
bool has_true_edge_i_to_j = false;
bool has_true_edge_j_to_i = false;
@@ -1647,32 +1654,32 @@ Graph<std::set<int>, bool> Loop::construct_induced_graph_at_level(
bool is_connected_j_to_i = false;
for (std::set<int>::iterator ii = s[i].begin(); ii != s[i].end();
ii++) {
-
+
for (std::set<int>::iterator jj = s[j].begin();
jj != s[j].end(); jj++) {
-
+
std::vector<DependenceVector> dvs = dep.getEdge(*ii, *jj);
for (int k = 0; k < dvs.size(); k++)
if (dvs[k].is_control_dependence()
|| (dvs[k].is_data_dependence()
&& dvs[k].has_been_carried_at(dep_dim))) {
-
+
if (dvs[k].is_data_dependence()
&& dvs[k].has_negative_been_carried_at(
- dep_dim)) {
+ dep_dim)) {
//g.connect(i, j, false);
is_connected_i_to_j = true;
break;
} else {
//g.connect(i, j, true);
-
+
has_true_edge_i_to_j = true;
//break
}
}
-
+
//if (is_connected)
-
+
// break;
// if (has_true_edge_i_to_j && !is_connected_i_to_j)
// g.connect(i, j, true);
@@ -1681,72 +1688,71 @@ Graph<std::set<int>, bool> Loop::construct_induced_graph_at_level(
if (dvs[k].is_control_dependence()
|| (dvs[k].is_data_dependence()
&& dvs[k].has_been_carried_at(dep_dim))) {
-
+
if (is_connected_i_to_j || has_true_edge_i_to_j)
throw loop_error(
- "Graph input for fusion has cycles not a DAG!!");
-
+ "Graph input for fusion has cycles not a DAG!!");
+
if (dvs[k].is_data_dependence()
&& dvs[k].has_negative_been_carried_at(
- dep_dim)) {
+ dep_dim)) {
//g.connect(i, j, false);
is_connected_j_to_i = true;
break;
} else {
//g.connect(i, j, true);
-
+
has_true_edge_j_to_i = true;
//break;
}
}
-
+
// if (is_connected)
//break;
// if (is_connected)
//break;
}
-
+
//if (is_connected)
// break;
}
-
-
+
+
if (is_connected_i_to_j)
g.connect(i, j, false);
else if (has_true_edge_i_to_j)
g.connect(i, j, true);
-
+
if (is_connected_j_to_i)
g.connect(j, i, false);
else if (has_true_edge_j_to_i)
g.connect(j, i, true);
-
+
}
}
return g;
}
-
std::vector<std::set<int> > Loop::typed_fusion(Graph<std::set<int>, bool> g,
std::vector<bool> &types) {
-
+
bool roots[g.vertex.size()];
-
+
for (int i = 0; i < g.vertex.size(); i++)
roots[i] = true;
-
+
for (int i = 0; i < g.vertex.size(); i++)
for (int j = i + 1; j < g.vertex.size(); j++) {
-
+
if (g.hasEdge(i, j))
roots[j] = false;
-
+
if (g.hasEdge(j, i))
roots[i] = false;
-
+
}
-
+
std::list<int> work_list;
std::list<bool> type_list;
int cant_fuse_with[g.vertex.size()];
@@ -1755,11 +1761,11 @@ std::vector<std::set<int> > Loop::typed_fusion(Graph<std::set<int>, bool> g,
int lastnum = 0;
std::vector<std::set<int> > s;
//Each Fused set's representative node
-
+
int node_to_fused_nodes[g.vertex.size()];
int node_num[g.vertex.size()];
int next[g.vertex.size()];
-
+
for (int i = 0; i < g.vertex.size(); i++) {
if (roots[i] == true) {
work_list.push_back(i);
@@ -1770,17 +1776,17 @@ std::vector<std::set<int> > Loop::typed_fusion(Graph<std::set<int>, bool> g,
node_num[i] = -1;
next[i] = 0;
}
-
-
+
+
// topological sort according to chun's permute algorithm
// std::vector<std::set<int> > s = g.topoSort();
std::vector<std::set<int> > s2 = g.topoSort();
if (work_list.empty() || (s2.size() != g.vertex.size())) {
-
+
std::cout << s2.size() << "\t" << g.vertex.size() << std::endl;
throw loop_error("Input for fusion not a DAG!!");
-
-
+
+
}
int fused_nodes_counter = 0;
while (!work_list.empty()) {
@@ -1802,19 +1808,19 @@ std::vector<std::set<int> > Loop::typed_fusion(Graph<std::set<int>, bool> g,
p = fused;
else
p = next[cant_fuse_with[n]];
-
+
if (p != 0) {
int rep_node = node_to_fused_nodes[p];
node_num[n] = node_num[rep_node];
-
+
try {
update_successors(n, node_num, cant_fuse_with, g, work_list,
type_list, types);
} catch (const loop_error &e) {
-
+
throw loop_error(
- "statements cannot be fused together due to negative dependence");
-
+ "statements cannot be fused together due to negative dependence");
+
}
for (std::set<int>::iterator it = g.vertex[n].first.begin();
it != g.vertex[n].first.end(); it++)
@@ -1826,81 +1832,80 @@ std::vector<std::set<int> > Loop::typed_fusion(Graph<std::set<int>, bool> g,
lastnum = lastnum + 1;
node_num[n] = lastnum;
node_to_fused_nodes[node_num[n]] = n;
-
+
if (lastfused == 0) {
fused = lastnum;
lastfused = fused;
} else {
next[lastfused] = lastnum;
lastfused = lastnum;
-
+
}
-
+
try {
update_successors(n, node_num, cant_fuse_with, g, work_list,
type_list, types);
} catch (const loop_error &e) {
-
+
throw loop_error(
- "statements cannot be fused together due to negative dependence");
-
+ "statements cannot be fused together due to negative dependence");
+
}
fused_nodes_counter++;
}
-
+
} else {
s.push_back(g.vertex[n].first);
lastnum = lastnum + 1;
node_num[n] = lastnum;
node_to_fused_nodes[node_num[n]] = n;
-
+
try {
update_successors(n, node_num, cant_fuse_with, g, work_list,
type_list, types);
} catch (const loop_error &e) {
-
+
throw loop_error(
- "statements cannot be fused together due to negative dependence");
-
+ "statements cannot be fused together due to negative dependence");
+
}
//fused_nodes_counter++;
-
+
}
-
+
}
-
+
return s;
}
-
-
void Loop::setLexicalOrder(int dim, const std::set<int> &active,
int starting_order, std::vector<std::vector<std::string> > idxNames) {
- fprintf(stderr, "Loop::setLexicalOrder() %d idxNames active size %d starting_order %d\n", idxNames.size(), active.size(), starting_order);
+ fprintf(stderr, "Loop::setLexicalOrder() %d idxNames active size %d starting_order %d\n", idxNames.size(),
+ active.size(), starting_order);
if (active.size() == 0)
return;
- for (int i=0; i< idxNames.size(); i++) {
+ for (int i = 0; i < idxNames.size(); i++) {
std::vector<std::string> what = idxNames[i];
- for (int j=0; j<what.size(); j++) {
- fprintf(stderr, "%2d %2d %s\n", i,j, what[j].c_str());
+ for (int j = 0; j < what.size(); j++) {
+ fprintf(stderr, "%2d %2d %s\n", i, j, what[j].c_str());
}
}
// check for sanity of parameters
if (dim < 0 || dim % 2 != 0)
throw std::invalid_argument(
- "invalid constant loop level to set lexicographical order");
+ "invalid constant loop level to set lexicographical order");
std::vector<int> lex;
int ref_stmt_num;
for (std::set<int>::iterator i = active.begin(); i != active.end(); i++) {
if ((*i) < 0 || (*i) >= stmt.size())
throw std::invalid_argument(
- "invalid statement number " + to_string(*i));
+ "invalid statement number " + to_string(*i));
if (dim >= stmt[*i].xform.n_out())
throw std::invalid_argument(
- "invalid constant loop level to set lexicographical order");
+ "invalid constant loop level to set lexicographical order");
if (i == active.begin()) {
lex = getLexicalOrder(*i);
ref_stmt_num = *i;
@@ -1909,10 +1914,10 @@ void Loop::setLexicalOrder(int dim, const std::set<int> &active,
for (int j = 0; j < dim; j += 2)
if (lex[j] != lex2[j])
throw std::invalid_argument(
- "statements are not in the same sub loop nest");
+ "statements are not in the same sub loop nest");
}
}
-
+
// separate statements by current loop level types
int level = (dim + 2) / 2;
std::map<std::pair<LoopLevelType, int>, std::set<int> > active_by_level_type;
@@ -1922,21 +1927,21 @@ void Loop::setLexicalOrder(int dim, const std::set<int> &active,
active_by_no_level.insert(*i);
else
active_by_level_type[std::make_pair(
- stmt[*i].loop_level[level - 1].type,
- stmt[*i].loop_level[level - 1].payload)].insert(*i);
+ stmt[*i].loop_level[level - 1].type,
+ stmt[*i].loop_level[level - 1].payload)].insert(*i);
}
-
+
// further separate statements due to control dependences
std::vector<std::set<int> > active_by_level_type_splitted;
for (std::map<std::pair<LoopLevelType, int>, std::set<int> >::iterator i =
- active_by_level_type.begin(); i != active_by_level_type.end(); i++)
+ active_by_level_type.begin(); i != active_by_level_type.end(); i++)
active_by_level_type_splitted.push_back(i->second);
for (std::set<int>::iterator i = active_by_no_level.begin();
i != active_by_no_level.end(); i++)
for (int j = active_by_level_type_splitted.size() - 1; j >= 0; j--) {
std::set<int> controlled, not_controlled;
for (std::set<int>::iterator k =
- active_by_level_type_splitted[j].begin();
+ active_by_level_type_splitted[j].begin();
k != active_by_level_type_splitted[j].end(); k++) {
std::vector<DependenceVector> dvs = dep.getEdge(*i, *k);
bool is_controlled = false;
@@ -1952,19 +1957,19 @@ void Loop::setLexicalOrder(int dim, const std::set<int> &active,
}
if (controlled.size() != 0 && not_controlled.size() != 0) {
active_by_level_type_splitted.erase(
- active_by_level_type_splitted.begin() + j);
+ active_by_level_type_splitted.begin() + j);
active_by_level_type_splitted.push_back(controlled);
active_by_level_type_splitted.push_back(not_controlled);
}
}
-
+
// set lexical order separating loops with different loop types first
if (active_by_level_type_splitted.size() + active_by_no_level.size() > 1) {
int dep_dim = get_last_dep_dim_before(ref_stmt_num, level) + 1;
-
+
Graph<std::set<int>, Empty> g;
for (std::vector<std::set<int> >::iterator i =
- active_by_level_type_splitted.begin();
+ active_by_level_type_splitted.begin();
i != active_by_level_type_splitted.end(); i++)
g.insert(*i);
for (std::set<int>::iterator i = active_by_no_level.begin();
@@ -1986,7 +1991,7 @@ void Loop::setLexicalOrder(int dim, const std::set<int> &active,
if (dvs[k].is_control_dependence()
|| (dvs[k].is_data_dependence()
&& !dvs[k].has_been_carried_before(
- dep_dim))) {
+ dep_dim))) {
g.connect(i, j);
connected = true;
break;
@@ -2010,7 +2015,7 @@ void Loop::setLexicalOrder(int dim, const std::set<int> &active,
if (dvs[k].is_control_dependence()
|| (dvs[k].is_data_dependence()
&& !dvs[k].has_been_carried_before(
- dep_dim))) {
+ dep_dim))) {
g.connect(j, i);
connected = true;
break;
@@ -2022,13 +2027,13 @@ void Loop::setLexicalOrder(int dim, const std::set<int> &active,
break;
}
}
-
+
std::vector<std::set<int> > s = g.topoSort();
if (s.size() != g.vertex.size())
throw loop_error(
- "cannot separate statements with different loop types at loop level "
- + to_string(level));
-
+ "cannot separate statements with different loop types at loop level "
+ + to_string(level));
+
// assign lexical order
int order = starting_order;
for (int i = 0; i < s.size(); i++) {
@@ -2041,19 +2046,18 @@ void Loop::setLexicalOrder(int dim, const std::set<int> &active,
assign_const(stmt[cur_stmt].xform, j, 0);
order++;
} else { // recurse !
- fprintf(stderr, "Loop:setLexicalOrder() recursing\n");
+ fprintf(stderr, "Loop:setLexicalOrder() recursing\n");
setLexicalOrder(dim, cur_scc, order, idxNames);
order += sz;
}
}
- }
- else { // set lexical order separating single iteration statements and loops
+ } else { // set lexical order separating single iteration statements and loops
std::set<int> true_singles;
std::set<int> nonsingles;
std::map<coef_t, std::set<int> > fake_singles;
std::set<int> fake_singles_;
-
+
// sort out statements that do not require loops
for (std::set<int>::iterator i = active.begin(); i != active.end();
i++) {
@@ -2071,7 +2075,7 @@ void Loop::setLexicalOrder(int dim, const std::set<int> &active,
fake_singles_.insert(*i);
try {
fake_singles[get_const(cur_IS, dim + 1, Set_Var)].insert(
- *i);
+ *i);
} catch (const std::exception &e) {
fake_singles[posInfinity].insert(*i);
}
@@ -2079,60 +2083,60 @@ void Loop::setLexicalOrder(int dim, const std::set<int> &active,
} else
nonsingles.insert(*i);
}
-
-
+
+
// split nonsingles forcibly according to negative dependences present (loop unfusible)
int dep_dim = get_dep_dim_of(ref_stmt_num, level);
-
+
if (dim < stmt[ref_stmt_num].xform.n_out() - 1) {
-
+
bool dummy_level_found = false;
-
+
std::vector<std::set<int> > s;
-
+
s = sort_by_same_loops(active, level);
bool further_levels_exist = false;
-
+
if (!idxNames.empty())
if (level <= idxNames[ref_stmt_num].size())
if (idxNames[ref_stmt_num][level - 1].length() == 0) {
// && s.size() == 1) {
int order1 = 0;
dummy_level_found = true;
-
+
for (int i = level; i < idxNames[ref_stmt_num].size();
i++)
if (idxNames[ref_stmt_num][i].length() > 0)
further_levels_exist = true;
-
+
}
-
+
//if (!dummy_level_found) {
-
+
if (s.size() > 1) {
-
+
std::vector<bool> types;
for (int i = 0; i < s.size(); i++)
types.push_back(true);
-
+
Graph<std::set<int>, bool> g = construct_induced_graph_at_level(
- s, dep, dep_dim);
+ s, dep, dep_dim);
s = typed_fusion(g, types);
}
int order = starting_order;
for (int i = 0; i < s.size(); i++) {
-
+
for (std::set<int>::iterator it = s[i].begin();
it != s[i].end(); it++) {
assign_const(stmt[*it].xform, dim, order);
stmt[*it].xform.simplify();
}
-
+
if ((dim + 2) <= (stmt[ref_stmt_num].xform.n_out() - 1)) { // recurse !
- fprintf(stderr, "Loop:setLexicalOrder() recursing\n");
+ fprintf(stderr, "Loop:setLexicalOrder() recursing\n");
setLexicalOrder(dim + 2, s[i], order, idxNames);
}
-
+
order++;
}
//}
@@ -2231,8 +2235,8 @@ void Loop::setLexicalOrder(int dim, const std::set<int> &active,
break;
}
*/
-
-
+
+
// assign lexical order
/*int order = starting_order;
for (int i = 0; i < s.size(); i++) {
@@ -2261,17 +2265,16 @@ void Loop::setLexicalOrder(int dim, const std::set<int> &active,
*/
}
- fprintf(stderr, "LEAVING Loop::setLexicalOrder() %d idxNames\n", idxNames.size());
- for (int i=0; i< idxNames.size(); i++) {
+ fprintf(stderr, "LEAVING Loop::setLexicalOrder() %d idxNames\n", idxNames.size());
+ for (int i = 0; i < idxNames.size(); i++) {
std::vector<std::string> what = idxNames[i];
- for (int j=0; j<what.size(); j++) {
- fprintf(stderr, "%2d %2d %s\n", i,j, what[j].c_str());
+ for (int j = 0; j < what.size(); j++) {
+ fprintf(stderr, "%2d %2d %s\n", i, j, what[j].c_str());
}
}
}
-
void Loop::apply_xform() {
std::set<int> active;
for (int i = 0; i < stmt.size(); i++)
@@ -2280,26 +2283,26 @@ void Loop::apply_xform() {
}
void Loop::apply_xform(int stmt_num) {
- fprintf(stderr, "apply_xform( %d )\n", stmt_num);
+ fprintf(stderr, "apply_xform( %d )\n", stmt_num);
std::set<int> active;
active.insert(stmt_num);
apply_xform(active);
}
void Loop::apply_xform(std::set<int> &active) {
- fflush(stdout);
+ fflush(stdout);
fprintf(stderr, "loop.cc apply_xform( set )\n");
-
+
int max_n = 0;
-
+
omega::CG_outputBuilder *ocg = ir->builder();
for (std::set<int>::iterator i = active.begin(); i != active.end(); i++) {
int n = stmt[*i].loop_level.size();
if (n > max_n)
max_n = n;
-
+
std::vector<int> lex = getLexicalOrder(*i);
-
+
omega::Relation mapping(2 * n + 1, n);
omega::F_And *f_root = mapping.add_and();
for (int j = 1; j <= n; j++) {
@@ -2309,7 +2312,7 @@ void Loop::apply_xform(std::set<int> &active) {
}
mapping = omega::Composition(mapping, stmt[*i].xform);
mapping.simplify();
-
+
// match omega input/output variables to variable names in the code
for (int j = 1; j <= stmt[*i].IS.n_set(); j++)
mapping.name_input_var(j, stmt[*i].IS.set_var(j)->name());
@@ -2317,28 +2320,28 @@ void Loop::apply_xform(std::set<int> &active) {
mapping.name_output_var(j,
tmp_loop_var_name_prefix
+ omega::to_string(
- tmp_loop_var_name_counter + j - 1));
+ tmp_loop_var_name_counter + j - 1));
mapping.setup_names();
mapping.print(); // "{[I] -> [_t1] : I = _t1 }
- fflush(stdout);
-
+ fflush(stdout);
+
omega::Relation known = Extend_Set(copy(this->known),
mapping.n_out() - this->known.n_set());
//stmt[*i].code = outputStatement(ocg, stmt[*i].code, 0, mapping, known, std::vector<CG_outputRepr *>(mapping.n_out(), NULL));
-
- omega::CG_outputBuilder *ocgr = ir->builder();
-
-
+
+ omega::CG_outputBuilder *ocgr = ir->builder();
+
+
//this is probably CG_chillBuilder;
-
+
omega::CG_stringBuilder *ocgs = new omega::CG_stringBuilder;
if (uninterpreted_symbols[*i].size() == 0) {
-
-
+
+
std::set<std::string> globals;
-
+
for (omega::DNF_Iterator di(stmt[*i].IS.query_DNF()); di; di++) {
-
+
for (omega::Constraint_Iterator e(*di); e; e++) {
for (omega::Constr_Vars_Iter cvi(*e); cvi; cvi++) {
omega::Variable_ID v = cvi.curr_var();
@@ -2349,105 +2352,106 @@ void Loop::apply_xform(std::set<int> &active) {
globals.insert(v->name());
std::vector<omega::CG_outputRepr *> reprs;
std::vector<omega::CG_outputRepr *> reprs2;
-
+
for (int l = 1; l <= g->arity(); l++) {
omega::CG_outputRepr *temp = ocgr->CreateIdent(
- stmt[*i].IS.set_var(l)->name());
+ stmt[*i].IS.set_var(l)->name());
omega::CG_outputRepr *temp2 = ocgs->CreateIdent(
- stmt[*i].IS.set_var(l)->name());
-
+ stmt[*i].IS.set_var(l)->name());
+
reprs.push_back(temp);
reprs2.push_back(temp2);
}
uninterpreted_symbols[*i].insert(
- std::pair<std::string,
- std::vector<omega::CG_outputRepr *> >(
- v->get_global_var()->base_name(),
- reprs));
+ std::pair<std::string,
+ std::vector<omega::CG_outputRepr *> >(
+ v->get_global_var()->base_name(),
+ reprs));
uninterpreted_symbols_stringrepr[*i].insert(
- std::pair<std::string,
- std::vector<omega::CG_outputRepr *> >(
- v->get_global_var()->base_name(),
- reprs2));
+ std::pair<std::string,
+ std::vector<omega::CG_outputRepr *> >(
+ v->get_global_var()->base_name(),
+ reprs2));
}
}
}
}
}
-
+
std::vector<std::string> loop_vars;
for (int j = 1; j <= stmt[*i].IS.n_set(); j++) {
loop_vars.push_back(stmt[*i].IS.set_var(j)->name());
}
- for (int j = 0; j<loop_vars.size(); j++) {
- fprintf(stderr, "loop vars %d %s\n", j, loop_vars[j].c_str());
+ for (int j = 0; j < loop_vars.size(); j++) {
+ fprintf(stderr, "loop vars %d %s\n", j, loop_vars[j].c_str());
}
std::vector<CG_outputRepr *> subs = output_substitutions(ocg,
Inverse(copy(mapping)),
std::vector<std::pair<CG_outputRepr *, int> >(
- mapping.n_out(),
- std::make_pair(
- static_cast<CG_outputRepr *>(NULL), 0)),
+ mapping.n_out(),
+ std::make_pair(
+ static_cast<CG_outputRepr *>(NULL), 0)),
uninterpreted_symbols[*i]);
-
+
std::vector<CG_outputRepr *> subs2;
for (int l = 0; l < subs.size(); l++)
subs2.push_back(subs[l]->clone());
-
- fprintf(stderr, "%d uninterpreted symbols\n", (int)uninterpreted_symbols.size());
- for (int j = 0; j<loop_vars.size(); j++) {
- fprintf(stderr, "loop vars %d %s\n", j, loop_vars[j].c_str());
- }
-
-
- int count = 0;
+
+ fprintf(stderr, "%d uninterpreted symbols\n", (int) uninterpreted_symbols.size());
+ for (int j = 0; j < loop_vars.size(); j++) {
+ fprintf(stderr, "loop vars %d %s\n", j, loop_vars[j].c_str());
+ }
+
+
+ int count = 0;
for (std::map<std::string, std::vector<CG_outputRepr *> >::iterator it =
- uninterpreted_symbols[*i].begin();
+ uninterpreted_symbols[*i].begin();
it != uninterpreted_symbols[*i].end(); it++) {
- fprintf(stderr, "\ncount %d\n", count);
-
+ fprintf(stderr, "\ncount %d\n", count);
+
std::vector<CG_outputRepr *> reprs_ = it->second;
- fprintf(stderr, "%d reprs_\n", (int)reprs_.size());
-
+ fprintf(stderr, "%d reprs_\n", (int) reprs_.size());
+
std::vector<CG_outputRepr *> reprs_2;
for (int k = 0; k < reprs_.size(); k++) {
- fprintf(stderr, "k %d\n", k);
+ fprintf(stderr, "k %d\n", k);
std::vector<CG_outputRepr *> subs;
for (int l = 0; l < subs2.size(); l++) {
- fprintf(stderr, "l %d\n", l);
+ fprintf(stderr, "l %d\n", l);
subs.push_back(subs2[l]->clone());
}
-
+
fprintf(stderr, "clone\n");
- CG_outputRepr *c = reprs_[k]->clone();
- c->dump(); fflush(stdout);
-
- fprintf(stderr, "createsub\n");
+ CG_outputRepr *c = reprs_[k]->clone();
+ c->dump();
+ fflush(stdout);
+
+ fprintf(stderr, "createsub\n");
CG_outputRepr *s = ocgr->CreateSubstitutedStmt(0, c,
loop_vars, subs, true);
-
- fprintf(stderr, "push back\n");
- reprs_2.push_back( s );
-
+
+ fprintf(stderr, "push back\n");
+ reprs_2.push_back(s);
+
}
-
+
it->second = reprs_2;
count++;
- fprintf(stderr, "bottom\n");
+ fprintf(stderr, "bottom\n");
}
-
+
std::vector<CG_outputRepr *> subs3 = output_substitutions(
- ocgs, Inverse(copy(mapping)),
- std::vector<std::pair<CG_outputRepr *, int> >(
- mapping.n_out(),
- std::make_pair(
- static_cast<CG_outputRepr *>(NULL), 0)),
- uninterpreted_symbols_stringrepr[*i]);
-
+ ocgs, Inverse(copy(mapping)),
+ std::vector<std::pair<CG_outputRepr *, int> >(
+ mapping.n_out(),
+ std::make_pair(
+ static_cast<CG_outputRepr *>(NULL), 0)),
+ uninterpreted_symbols_stringrepr[*i]);
+
for (std::map<std::string, std::vector<CG_outputRepr *> >::iterator it =
- uninterpreted_symbols_stringrepr[*i].begin();
+ uninterpreted_symbols_stringrepr[*i].begin();
it != uninterpreted_symbols_stringrepr[*i].end(); it++) {
-
+
std::vector<CG_outputRepr *> reprs_ = it->second;
std::vector<CG_outputRepr *> reprs_2;
for (int k = 0; k < reprs_.size(); k++) {
@@ -2460,13 +2464,13 @@ void Loop::apply_xform(std::set<int> &active) {
*/
reprs_2.push_back(subs3[k]->clone());
}
-
+
it->second = reprs_2;
-
+
}
-
-
- fprintf(stderr, "loop.cc stmt[*i].code =\n");
+
+
+ fprintf(stderr, "loop.cc stmt[*i].code =\n");
//stmt[*i].code->dump();
//fprintf(stderr, "\n");
stmt[*i].code = ocg->CreateSubstitutedStmt(0, stmt[*i].code, loop_vars,
@@ -2474,10 +2478,10 @@ void Loop::apply_xform(std::set<int> &active) {
//fprintf(stderr, "loop.cc substituted code =\n");
//stmt[*i].code->dump();
//fprintf(stderr, "\n");
-
+
stmt[*i].IS = omega::Range(Restrict_Domain(mapping, stmt[*i].IS));
stmt[*i].IS.simplify();
-
+
// replace original transformation relation with straight 1-1 mapping
//fprintf(stderr, "replace original transformation relation with straight 1-1 mapping\n");
mapping = Relation(n, 2 * n + 1);
@@ -2493,46 +2497,44 @@ void Loop::apply_xform(std::set<int> &active) {
h.update_const(-lex[j - 1]);
}
stmt[*i].xform = mapping;
-
+
//fprintf(stderr, "\ncode is: \n");
//stmt[*i].code->dump();
//fprintf(stderr, "\n\n");
-
+
}
-
+
tmp_loop_var_name_counter += max_n;
- fflush(stdout);
- fprintf(stderr, "loop.cc LEAVING apply_xform( set )\n\n");
+ fflush(stdout);
+ fprintf(stderr, "loop.cc LEAVING apply_xform( set )\n\n");
//for (std::set<int>::iterator i = active.begin(); i != active.end(); i++) {
// fprintf(stderr, "\nloop.cc stmt[i].code =\n");
// stmt[*i].code->dump();
// fprintf(stderr, "\n\n");
//}
-
-}
-
+}
void Loop::addKnown(const Relation &cond) {
-
+
// invalidate saved codegen computation
delete last_compute_cgr_;
last_compute_cgr_ = NULL;
delete last_compute_cg_;
last_compute_cg_ = NULL;
fprintf(stderr, "Loop::addKnown(), SETTING last_compute_cg_ = NULL\n");
-
+
int n1 = this->known.n_set();
-
+
Relation r = copy(cond);
int n2 = r.n_set();
-
+
if (n1 < n2)
this->known = Extend_Set(this->known, n2 - n1);
else if (n1 > n2)
r = Extend_Set(r, n1 - n2);
-
+
this->known = Intersection(this->known, r);
}
@@ -2540,11 +2542,11 @@ void Loop::removeDependence(int stmt_num_from, int stmt_num_to) {
// check for sanity of parameters
if (stmt_num_from >= stmt.size())
throw std::invalid_argument(
- "invalid statement number " + to_string(stmt_num_from));
+ "invalid statement number " + to_string(stmt_num_from));
if (stmt_num_to >= stmt.size())
throw std::invalid_argument(
- "invalid statement number " + to_string(stmt_num_to));
-
+ "invalid statement number " + to_string(stmt_num_to));
+
dep.disconnect(stmt_num_from, stmt_num_to);
}
@@ -2556,14 +2558,14 @@ void Loop::dump() const {
if (2 * j < lex.size())
std::cout << lex[2 * j];
switch (stmt[i].loop_level[j].type) {
- case LoopLevelOriginal:
- std::cout << "(dim:" << stmt[i].loop_level[j].payload << ")";
- break;
- case LoopLevelTile:
- std::cout << "(tile:" << stmt[i].loop_level[j].payload << ")";
- break;
- default:
- std::cout << "(unknown)";
+ case LoopLevelOriginal:
+ std::cout << "(dim:" << stmt[i].loop_level[j].payload << ")";
+ break;
+ case LoopLevelTile:
+ std::cout << "(tile:" << stmt[i].loop_level[j].payload << ")";
+ break;
+ default:
+ std::cout << "(unknown)";
}
std::cout << ' ';
}
@@ -2579,16 +2581,16 @@ void Loop::dump() const {
bool Loop::nonsingular(const std::vector<std::vector<int> > &T) {
if (stmt.size() == 0)
return true;
-
+
// check for sanity of parameters
for (int i = 0; i < stmt.size(); i++) {
if (stmt[i].loop_level.size() != num_dep_dim)
throw std::invalid_argument(
- "nonsingular loop transformations must be applied to original perfect loop nest");
+ "nonsingular loop transformations must be applied to original perfect loop nest");
for (int j = 0; j < stmt[i].loop_level.size(); j++)
if (stmt[i].loop_level[j].type != LoopLevelOriginal)
throw std::invalid_argument(
- "nonsingular loop transformations must be applied to original perfect loop nest");
+ "nonsingular loop transformations must be applied to original perfect loop nest");
}
if (T.size() != num_dep_dim)
throw std::invalid_argument("invalid transformation matrix");
@@ -2619,81 +2621,80 @@ bool Loop::nonsingular(const std::vector<std::vector<int> > &T) {
h.update_coef(mapping.output_var(i), -1);
h.update_coef(mapping.input_var(i), 1);
}
-
+
// update transformation relations
for (int i = 0; i < stmt.size(); i++)
stmt[i].xform = Composition(copy(mapping), stmt[i].xform);
-
+
// update dependence graph
for (int i = 0; i < dep.vertex.size(); i++)
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[i].second.begin(); j != dep.vertex[i].second.end();
+ dep.vertex[i].second.begin(); j != dep.vertex[i].second.end();
j++) {
std::vector<DependenceVector> dvs = j->second;
for (int k = 0; k < dvs.size(); k++) {
DependenceVector &dv = dvs[k];
switch (dv.type) {
- case DEP_W2R:
- case DEP_R2W:
- case DEP_W2W:
- case DEP_R2R: {
- std::vector<coef_t> lbounds(num_dep_dim), ubounds(
- num_dep_dim);
- for (int p = 0; p < num_dep_dim; p++) {
- coef_t lb = 0;
- coef_t ub = 0;
- for (int q = 0; q < num_dep_dim; q++) {
- if (T[p][q] > 0) {
- if (lb == -posInfinity
- || dv.lbounds[q] == -posInfinity)
- lb = -posInfinity;
- else
- lb += T[p][q] * dv.lbounds[q];
- if (ub == posInfinity
- || dv.ubounds[q] == posInfinity)
- ub = posInfinity;
- else
- ub += T[p][q] * dv.ubounds[q];
- } else if (T[p][q] < 0) {
- if (lb == -posInfinity
- || dv.ubounds[q] == posInfinity)
- lb = -posInfinity;
- else
- lb += T[p][q] * dv.ubounds[q];
- if (ub == posInfinity
- || dv.lbounds[q] == -posInfinity)
- ub = posInfinity;
- else
- ub += T[p][q] * dv.lbounds[q];
+ case DEP_W2R:
+ case DEP_R2W:
+ case DEP_W2W:
+ case DEP_R2R: {
+ std::vector<coef_t> lbounds(num_dep_dim), ubounds(
+ num_dep_dim);
+ for (int p = 0; p < num_dep_dim; p++) {
+ coef_t lb = 0;
+ coef_t ub = 0;
+ for (int q = 0; q < num_dep_dim; q++) {
+ if (T[p][q] > 0) {
+ if (lb == -posInfinity
+ || dv.lbounds[q] == -posInfinity)
+ lb = -posInfinity;
+ else
+ lb += T[p][q] * dv.lbounds[q];
+ if (ub == posInfinity
+ || dv.ubounds[q] == posInfinity)
+ ub = posInfinity;
+ else
+ ub += T[p][q] * dv.ubounds[q];
+ } else if (T[p][q] < 0) {
+ if (lb == -posInfinity
+ || dv.ubounds[q] == posInfinity)
+ lb = -posInfinity;
+ else
+ lb += T[p][q] * dv.ubounds[q];
+ if (ub == posInfinity
+ || dv.lbounds[q] == -posInfinity)
+ ub = posInfinity;
+ else
+ ub += T[p][q] * dv.lbounds[q];
+ }
}
+ if (T[p].size() == num_dep_dim + 1) {
+ if (lb != -posInfinity)
+ lb += T[p][num_dep_dim];
+ if (ub != posInfinity)
+ ub += T[p][num_dep_dim];
+ }
+ lbounds[p] = lb;
+ ubounds[p] = ub;
}
- if (T[p].size() == num_dep_dim + 1) {
- if (lb != -posInfinity)
- lb += T[p][num_dep_dim];
- if (ub != posInfinity)
- ub += T[p][num_dep_dim];
- }
- lbounds[p] = lb;
- ubounds[p] = ub;
+ dv.lbounds = lbounds;
+ dv.ubounds = ubounds;
+
+ break;
}
- dv.lbounds = lbounds;
- dv.ubounds = ubounds;
-
- break;
- }
- default:
- ;
+ default:;
}
}
j->second = dvs;
}
-
+
// set constant loop values
std::set<int> active;
for (int i = 0; i < stmt.size(); i++)
active.insert(i);
setLexicalOrder(0, active);
-
+
return true;
}
@@ -2706,12 +2707,11 @@ bool Loop::is_dependence_valid_based_on_lex_order(int i, int j,
if (!dv.is_scalar_dependence) {
for (last_dim = 0;
last_dim < lex_i.size() && (lex_i[last_dim] == lex_j[last_dim]);
- last_dim++)
- ;
+ last_dim++);
last_dim = last_dim / 2;
if (last_dim == 0)
return true;
-
+
for (int i = 0; i < last_dim; i++) {
if (dv.lbounds[i] > 0)
return true;
@@ -2721,9 +2721,9 @@ bool Loop::is_dependence_valid_based_on_lex_order(int i, int j,
}
if (before)
return true;
-
+
return false;
-
+
}
// Manu:: reduction operation
@@ -2731,7 +2731,7 @@ bool Loop::is_dependence_valid_based_on_lex_order(int i, int j,
void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
std::string arrName, int memory_type, int padding_alignment,
int assign_then_accumulate, int padding_stride) {
-
+
//std::cout << "In scalar_expand function: " << stmt_num << ", " << arrName << "\n";
//std::cout.flush();
@@ -2744,10 +2744,10 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
// check for sanity of parameters
bool found_non_constant_size_dimension = false;
-
+
if (stmt_num < 0 || stmt_num >= stmt.size())
throw std::invalid_argument(
- "invalid statement number " + to_string(stmt_num));
+ "invalid statement number " + to_string(stmt_num));
//Anand: adding check for privatized levels
//if (arrName != "RHS")
// throw std::invalid_argument(
@@ -2755,34 +2755,33 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
for (int i = 0; i < levels.size(); i++) {
if (levels[i] <= 0 || levels[i] > stmt[stmt_num].loop_level.size())
throw std::invalid_argument(
- "1invalid loop level " + to_string(levels[i]));
-
+ "1invalid loop level " + to_string(levels[i]));
+
if (i > 0) {
if (levels[i] < levels[i - 1])
throw std::invalid_argument(
- "loop levels must be in ascending order");
+ "loop levels must be in ascending order");
}
}
//end --adding check for privatized levels
-
+
delete last_compute_cgr_;
last_compute_cgr_ = NULL;
delete last_compute_cg_;
last_compute_cg_ = NULL;
fprintf(stderr, "Loop::scalar_expand(), SETTING last_compute_cg_ = NULL\n");
- fprintf(stderr, "\nloop.cc finding array accesses in stmt %d of the code\n",stmt_num );
+ fprintf(stderr, "\nloop.cc finding array accesses in stmt %d of the code\n", stmt_num);
std::vector<IR_ArrayRef *> access = ir->FindArrayRef(stmt[stmt_num].code);
- fprintf(stderr, "loop.cc L2726 %d access\n", access.size());
+ fprintf(stderr, "loop.cc L2726 %d access\n", access.size());
IR_ArraySymbol *sym = NULL;
- fprintf(stderr, "arrName %s\n", arrName.c_str());
- if (arrName == "RHS") {
- fprintf(stderr, "sym RHS\n");
+ fprintf(stderr, "arrName %s\n", arrName.c_str());
+ if (arrName == "RHS") {
+ fprintf(stderr, "sym RHS\n");
sym = access[0]->symbol();
- }
- else {
- fprintf(stderr, "looking for array %s in access\n", arrName.c_str());
+ } else {
+ fprintf(stderr, "looking for array %s in access\n", arrName.c_str());
for (int k = 0; k < access.size(); k++) { // BUH
//fprintf(stderr, "access[%d] = %s ", k, access[k]->getTypeString()); access[k]->print(0,stderr); fprintf(stderr, "\n");
@@ -2791,34 +2790,34 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
//fprintf(stderr, "comparing %s to %s\n", name.c_str(), arrName.c_str());
if (access[k]->symbol()->name() == arrName) {
- fprintf(stderr, "found it sym access[ k=%d ]\n", k);
+ fprintf(stderr, "found it sym access[ k=%d ]\n", k);
sym = access[k]->symbol();
- }
+ }
}
}
- if (!sym) fprintf(stderr, "DIDN'T FIND IT\n");
- fprintf(stderr, "sym %p\n", sym);
+ if (!sym) fprintf(stderr, "DIDN'T FIND IT\n");
+ fprintf(stderr, "sym %p\n", sym);
// collect array references by name
std::vector<int> lex = getLexicalOrder(stmt_num);
int dim = 2 * levels[levels.size() - 1] - 1;
std::set<int> same_loop = getStatements(lex, dim - 1);
-
+
//Anand: shifting this down
// assign_const(stmt[newStmt_num].xform, 2*level+1, 1);
-
+
// std::cout << " before temp array name \n ";
// create a temporary variable
IR_Symbol *tmp_sym;
-
+
// get the loop upperbound, that would be the size of the temp array.
omega::coef_t lb[levels.size()], ub[levels.size()], size[levels.size()];
-
+
//Anand Adding apply xform so that tiled loop bounds are reflected
fprintf(stderr, "Adding apply xform so that tiled loop bounds are reflected\n");
apply_xform(same_loop);
- fprintf(stderr, "loop.cc, back from apply_xform()\n");
-
+ fprintf(stderr, "loop.cc, back from apply_xform()\n");
+
//Anand commenting out the folowing 4 lines
/* copy(stmt[stmt_num].IS).query_variable_bounds(
copy(stmt[stmt_num].IS).set_var(level), lb, ub);
@@ -2890,32 +2889,32 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
std::vector<int> size_int;
Relation xform = copy(stmt[stmt_num].xform);
for (int i = 0; i < n_dim; i++) {
-
+
dim = 2 * levels[i] - 1;
//Anand: Commenting out the lines below: not required
// if (i != 0)
// reduced_copy_is = Project(reduced_copy_is, level - 1 + i, Set_Var);
Relation bound = get_loop_bound(copy(reduced_copy_is), levels[i] - 1);
-
+
// extract stride
std::pair<EQ_Handle, Variable_ID> result = find_simplest_stride(bound,
bound.set_var(levels[i]));
if (result.second != NULL)
index_stride[i] = abs(result.first.get_coef(result.second))
- / gcd(abs(result.first.get_coef(result.second)),
- abs(
- result.first.get_coef(
- bound.set_var(levels[i]))));
+ / gcd(abs(result.first.get_coef(result.second)),
+ abs(
+ result.first.get_coef(
+ bound.set_var(levels[i]))));
else
index_stride[i] = 1;
// std::cout << "simplest_stride 11:: " << index_stride[i] << "\n";
-
+
// check if this array index requires loop
Conjunct *c = bound.query_DNF()->single_conjunct();
for (EQ_Iterator ei(c->EQs()); ei; ei++) {
if ((*ei).has_wildcards())
continue;
-
+
int coef = (*ei).get_coef(bound.set_var(levels[i]));
if (coef != 0) {
int sign = 1;
@@ -2923,59 +2922,58 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
coef = -coef;
sign = -1;
}
-
+
CG_outputRepr *op = NULL;
for (Constr_Vars_Iter ci(*ei); ci; ci++) {
switch ((*ci).var->kind()) {
- case Input_Var: {
- if ((*ci).var != bound.set_var(levels[i]))
+ case Input_Var: {
+ if ((*ci).var != bound.set_var(levels[i]))
+ if ((*ci).coef * sign == 1)
+ op = ocg1->CreateMinus(op,
+ ocg1->CreateIdent((*ci).var->name()));
+ else if ((*ci).coef * sign == -1)
+ op = ocg1->CreatePlus(op,
+ ocg1->CreateIdent((*ci).var->name()));
+ else if ((*ci).coef * sign > 1) {
+ op = ocg1->CreateMinus(op,
+ ocg1->CreateTimes(
+ ocg1->CreateInt(
+ abs((*ci).coef)),
+ ocg1->CreateIdent(
+ (*ci).var->name())));
+ } else
+ // (*ci).coef*sign < -1
+ op = ocg1->CreatePlus(op,
+ ocg1->CreateTimes(
+ ocg1->CreateInt(
+ abs((*ci).coef)),
+ ocg1->CreateIdent(
+ (*ci).var->name())));
+ break;
+ }
+ case Global_Var: {
+ Global_Var_ID g = (*ci).var->get_global_var();
if ((*ci).coef * sign == 1)
op = ocg1->CreateMinus(op,
- ocg1->CreateIdent((*ci).var->name()));
+ ocg1->CreateIdent(g->base_name()));
else if ((*ci).coef * sign == -1)
op = ocg1->CreatePlus(op,
- ocg1->CreateIdent((*ci).var->name()));
- else if ((*ci).coef * sign > 1) {
+ ocg1->CreateIdent(g->base_name()));
+ else if ((*ci).coef * sign > 1)
op = ocg1->CreateMinus(op,
ocg1->CreateTimes(
- ocg1->CreateInt(
- abs((*ci).coef)),
- ocg1->CreateIdent(
- (*ci).var->name())));
- }
+ ocg1->CreateInt(abs((*ci).coef)),
+ ocg1->CreateIdent(g->base_name())));
else
// (*ci).coef*sign < -1
op = ocg1->CreatePlus(op,
ocg1->CreateTimes(
- ocg1->CreateInt(
- abs((*ci).coef)),
- ocg1->CreateIdent(
- (*ci).var->name())));
- break;
- }
- case Global_Var: {
- Global_Var_ID g = (*ci).var->get_global_var();
- if ((*ci).coef * sign == 1)
- op = ocg1->CreateMinus(op,
- ocg1->CreateIdent(g->base_name()));
- else if ((*ci).coef * sign == -1)
- op = ocg1->CreatePlus(op,
- ocg1->CreateIdent(g->base_name()));
- else if ((*ci).coef * sign > 1)
- op = ocg1->CreateMinus(op,
- ocg1->CreateTimes(
- ocg1->CreateInt(abs((*ci).coef)),
- ocg1->CreateIdent(g->base_name())));
- else
- // (*ci).coef*sign < -1
- op = ocg1->CreatePlus(op,
- ocg1->CreateTimes(
- ocg1->CreateInt(abs((*ci).coef)),
- ocg1->CreateIdent(g->base_name())));
- break;
- }
- default:
- throw loop_error("unsupported array index expression");
+ ocg1->CreateInt(abs((*ci).coef)),
+ ocg1->CreateIdent(g->base_name())));
+ break;
+ }
+ default:
+ throw loop_error("unsupported array index expression");
}
}
if ((*ei).get_const() != 0)
@@ -2983,7 +2981,7 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
ocg1->CreateInt(-sign * ((*ei).get_const())));
if (coef != 1)
op = ocg1->CreateIntegerFloor(op, ocg1->CreateInt(coef));
-
+
index_lb[i] = op;
is_index_eq[i] = true;
break;
@@ -2991,7 +2989,7 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
}
if (is_index_eq[i])
continue;
-
+
// separate lower and upper bounds
std::vector<GEQ_Handle> lb_list, ub_list;
std::set<Variable_ID> excluded_floor_vars;
@@ -3006,23 +3004,22 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
excluded_floor_vars).first) {
clean_bound = false;
break;
- }
- else
- h= find_floor_definition(bound, (*cvi).var,
- excluded_floor_vars).second;
-
+ } else
+ h = find_floor_definition(bound, (*cvi).var,
+ excluded_floor_vars).second;
+
if (!clean_bound)
continue;
- else{
+ else {
if (coef > 0)
lb_list.push_back(h);
else if (coef < 0)
ub_list.push_back(h);
- continue;
- }
-
+ continue;
+ }
+
}
-
+
if (coef > 0)
lb_list.push_back(*gi);
else if (coef < 0)
@@ -3030,7 +3027,7 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
}
if (lb_list.size() == 0 || ub_list.size() == 0)
throw loop_error("failed to calcuate array footprint size");
-
+
// build lower bound representation
std::vector<CG_outputRepr *> lb_repr_list;
/* for (int j = 0; j < lb_list.size(); j++){
@@ -3045,7 +3042,7 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
index_lb[i] = ocg1->CreateInvoke("max", lb_repr_list);
else if (lb_repr_list.size() == 1)
index_lb[i] = lb_repr_list[0];
-
+
// build temporary array size representation
{
Relation cal(copy_is.n_set(), 1);
@@ -3053,65 +3050,65 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
for (int j = 0; j < ub_list.size(); j++)
for (int k = 0; k < lb_list.size(); k++) {
GEQ_Handle h = f_root->add_GEQ();
-
+
for (Constr_Vars_Iter ci(ub_list[j]); ci; ci++) {
switch ((*ci).var->kind()) {
- case Input_Var: {
- int pos = (*ci).var->get_position();
- h.update_coef(cal.input_var(pos), (*ci).coef);
- break;
- }
- case Global_Var: {
- Global_Var_ID g = (*ci).var->get_global_var();
- Variable_ID v;
- if (g->arity() == 0)
- v = cal.get_local(g);
- else
- v = cal.get_local(g, (*ci).var->function_of());
- h.update_coef(v, (*ci).coef);
- break;
- }
- default:
- throw loop_error(
- "cannot calculate temporay array size statically");
+ case Input_Var: {
+ int pos = (*ci).var->get_position();
+ h.update_coef(cal.input_var(pos), (*ci).coef);
+ break;
+ }
+ case Global_Var: {
+ Global_Var_ID g = (*ci).var->get_global_var();
+ Variable_ID v;
+ if (g->arity() == 0)
+ v = cal.get_local(g);
+ else
+ v = cal.get_local(g, (*ci).var->function_of());
+ h.update_coef(v, (*ci).coef);
+ break;
+ }
+ default:
+ throw loop_error(
+ "cannot calculate temporay array size statically");
}
}
h.update_const(ub_list[j].get_const());
-
+
for (Constr_Vars_Iter ci(lb_list[k]); ci; ci++) {
switch ((*ci).var->kind()) {
- case Input_Var: {
- int pos = (*ci).var->get_position();
- h.update_coef(cal.input_var(pos), (*ci).coef);
- break;
- }
- case Global_Var: {
- Global_Var_ID g = (*ci).var->get_global_var();
- Variable_ID v;
- if (g->arity() == 0)
- v = cal.get_local(g);
- else
- v = cal.get_local(g, (*ci).var->function_of());
- h.update_coef(v, (*ci).coef);
- break;
- }
- default:
- throw loop_error(
- "cannot calculate temporay array size statically");
+ case Input_Var: {
+ int pos = (*ci).var->get_position();
+ h.update_coef(cal.input_var(pos), (*ci).coef);
+ break;
+ }
+ case Global_Var: {
+ Global_Var_ID g = (*ci).var->get_global_var();
+ Variable_ID v;
+ if (g->arity() == 0)
+ v = cal.get_local(g);
+ else
+ v = cal.get_local(g, (*ci).var->function_of());
+ h.update_coef(v, (*ci).coef);
+ break;
+ }
+ default:
+ throw loop_error(
+ "cannot calculate temporay array size statically");
}
}
h.update_const(lb_list[k].get_const());
-
+
h.update_const(1);
h.update_coef(cal.output_var(1), -1);
}
-
+
cal = Restrict_Domain(cal, copy(copy_is));
for (int j = 1; j <= cal.n_inp(); j++) {
cal = Project(cal, j, Input_Var);
}
cal.simplify();
-
+
// pad temporary array size
// TODO: for variable array size, create padding formula
//int padding_stride = 0;
@@ -3125,50 +3122,50 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
gi++)
if ((*gi).is_const(cal.output_var(1))) {
coef_t size = (*gi).get_const()
- / (-(*gi).get_coef(cal.output_var(1)));
-
+ / (-(*gi).get_coef(cal.output_var(1)));
+
if (padding_alignment > 1 && i == n_dim - 1) { // align to boundary for data packing
int residue = size % padding_alignment;
if (residue)
size = size + padding_alignment - residue;
}
-
+
index_sz.push_back(
- std::make_pair(i, ocg1->CreateInt(size)));
+ std::make_pair(i, ocg1->CreateInt(size)));
is_index_bound_const = true;
size_int.push_back(size);
size_repr.push_back(ocg1->CreateInt(size));
-
+
// std::cout << "============================== size :: "
// << size << "\n";
-
+
}
-
+
if (!is_index_bound_const) {
-
+
found_non_constant_size_dimension = true;
Conjunct *c = bound.query_DNF()->single_conjunct();
for (GEQ_Iterator gi(c->GEQs());
gi && !is_index_bound_const; gi++) {
int coef = (*gi).get_coef(bound.set_var(levels[i]));
if (coef < 0) {
-
+
size_repr.push_back(
- ocg1->CreatePlus(
- output_upper_bound_repr(ocg1, *gi,
- bound.set_var(levels[i]),
- bound,
- std::vector<
- std::pair<
- CG_outputRepr *,
- int> >(
- bound.n_set(),
- std::make_pair(
- static_cast<CG_outputRepr *>(NULL),
- 0)),
- uninterpreted_symbols[stmt_num]),
- ocg1->CreateInt(1)));
-
+ ocg1->CreatePlus(
+ output_upper_bound_repr(ocg1, *gi,
+ bound.set_var(levels[i]),
+ bound,
+ std::vector<
+ std::pair<
+ CG_outputRepr *,
+ int> >(
+ bound.n_set(),
+ std::make_pair(
+ static_cast<CG_outputRepr *>(NULL),
+ 0)),
+ uninterpreted_symbols[stmt_num]),
+ ocg1->CreateInt(1)));
+
/*CG_outputRepr *op = NULL;
for (Constr_Vars_Iter ci(*gi); ci; ci++) {
if ((*ci).var != cal.output_var(1)) {
@@ -3238,13 +3235,13 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
}
}
//size[i] = ub[i];
-
+
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//
-
+
//Anand: Creating IS of new statement
-
+
//for(int l = dim; l < stmt[stmt_num].xform.n_out(); l+=2)
//std::cout << "In scalar_expand function 3: " << stmt_num << ", " << arrName << "\n";
//std::cout.flush();
@@ -3256,16 +3253,16 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
//}
//fprintf(stderr, "\n");
-
+
shiftLexicalOrder(lex, dim + 1, 1);
Statement s = stmt[stmt_num];
s.ir_stmt_node = NULL;
int newStmt_num = stmt.size();
- fprintf(stderr, "loop.cc L3249 adding stmt %d\n", stmt.size());
+ fprintf(stderr, "loop.cc L3249 adding stmt %d\n", stmt.size());
stmt.push_back(s);
-
- fprintf(stderr, "uninterpreted_symbols.push_back() newStmt_num %d\n", newStmt_num);
+
+ fprintf(stderr, "uninterpreted_symbols.push_back() newStmt_num %d\n", newStmt_num);
uninterpreted_symbols.push_back(uninterpreted_symbols[stmt_num]);
uninterpreted_symbols_stringrepr.push_back(uninterpreted_symbols_stringrepr[stmt_num]);
stmt[newStmt_num].code = stmt[stmt_num].code->clone();
@@ -3286,16 +3283,16 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
//assign_const(stmt[newStmt_num].xform, stmt[stmt_num].xform.n_out(), 1);//Anand: change from 2*level + 1 to stmt[stmt_num].xform.size()
//Anand-End creating IS of new statement
-
- CG_outputRepr * tmpArrSz;
+
+ CG_outputRepr *tmpArrSz;
CG_outputBuilder *ocg = ir->builder();
-
+
//for(int k =0; k < levels.size(); k++ )
// size_repr.push_back(ocg->CreateInt(size[k]));//Anand: copying apply_xform functionality to prevent IS modification
//due to side effects with uninterpreted function symbols and failures in omega
-
+
//int n = stmt[stmt_num].loop_level.size();
-
+
/*Relation mapping(2 * n + 1, n);
F_And *f_root = mapping.add_and();
for (int j = 1; j <= n; j++) {
@@ -3318,64 +3315,68 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
Relation size_ = omega::Range(Restrict_Domain(mapping, copy(stmt[stmt_num].IS)));
size_.simplify();
*/
-
+
//Anand -commenting out tmp sym creation as symbol may have more than one dimension
//tmp_sym = ir->CreateArraySymbol(tmpArrSz, sym);
std::vector<CG_outputRepr *> lhs_index;
CG_outputRepr *arr_ref_repr;
arr_ref_repr = ocg->CreateIdent(
- stmt[stmt_num].IS.set_var(levels[levels.size() - 1])->name());
-
+ stmt[stmt_num].IS.set_var(levels[levels.size() - 1])->name());
+
CG_outputRepr *total_size = size_repr[0];
- fprintf(stderr, "total_size = "); total_size->dump(); fflush(stdout);
+ fprintf(stderr, "total_size = ");
+ total_size->dump();
+ fflush(stdout);
for (int i = 1; i < size_repr.size(); i++) {
- fprintf(stderr, "total_size now "); total_size->dump(); fflush(stdout); fprintf(stderr, " times something\n\n");
+ fprintf(stderr, "total_size now ");
+ total_size->dump();
+ fflush(stdout);
+ fprintf(stderr, " times something\n\n");
total_size = ocg->CreateTimes(total_size->clone(),
size_repr[i]->clone());
-
+
}
-
+
// COMMENT NEEDED
//fprintf(stderr, "\nloop.cc COMMENT NEEDED\n");
for (int k = levels.size() - 2; k >= 0; k--) {
- CG_outputRepr *temp_repr =ocg->CreateIdent(stmt[stmt_num].IS.set_var(levels[k])->name());
- for (int l = k + 1; l < levels.size(); l++) {
+ CG_outputRepr *temp_repr = ocg->CreateIdent(stmt[stmt_num].IS.set_var(levels[k])->name());
+ for (int l = k + 1; l < levels.size(); l++) {
//fprintf(stderr, "\nloop.cc CREATETIMES\n");
temp_repr = ocg->CreateTimes(temp_repr->clone(),
size_repr[l]->clone());
}
-
+
//fprintf(stderr, "\nloop.cc CREATEPLUS\n");
arr_ref_repr = ocg->CreatePlus(arr_ref_repr->clone(),
temp_repr->clone());
}
-
+
//fprintf(stderr, "loop.cc, about to die\n");
std::vector<CG_outputRepr *> to_push;
to_push.push_back(total_size);
- if (!found_non_constant_size_dimension) {
- fprintf(stderr, "constant size dimension\n");
+ if (!found_non_constant_size_dimension) {
+ fprintf(stderr, "constant size dimension\n");
tmp_sym = ir->CreateArraySymbol(sym, to_push, memory_type);
- }
- else {
- fprintf(stderr, "NON constant size dimension?\n");
+ } else {
+ fprintf(stderr, "NON constant size dimension?\n");
//tmp_sym = ir->CreatePointerSymbol(sym, to_push);
tmp_sym = ir->CreatePointerSymbol(sym, to_push);
static_cast<IR_PointerSymbol *>(tmp_sym)->set_size(0, total_size); // ??
ptr_variables.push_back(static_cast<IR_PointerSymbol *>(tmp_sym));
- fprintf(stderr, "ptr_variables now has %d entries\n", ptr_variables.size());
+ fprintf(stderr, "ptr_variables now has %d entries\n", ptr_variables.size());
}
-
+
// add tmp_sym to Loop symtables ??
-
+
// std::cout << " temp array name == " << tmp_sym->name().c_str() << "\n";
-
+
// get loop index variable at the given "level"
// Relation R = omega::Range(Restrict_Domain(copy(stmt[stmt_num].xform), copy(stmt[stmt_num].IS)));
// stmt[stmt_num].IS.print();
@@ -3383,9 +3384,9 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
// std::cout << stmt[stmt_num].IS.n_set() << std::endl;
// std::string v = stmt[stmt_num].IS.set_var(level)->name();
// std::cout << "loop index variable is '" << v.c_str() << "'\n";
-
+
// create a reference for the temporary array
- fprintf(stderr, "create a reference for the temporary array\n");
+ fprintf(stderr, "create a reference for the temporary array\n");
//std::cout << "In scalar_expand function 4: " << stmt_num << ", " << arrName << "\n";
//std::cout.flush();
@@ -3396,7 +3397,7 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
//}
//fprintf(stderr, "\n");
-
+
std::vector<CG_outputRepr *> to_push2;
to_push2.push_back(arr_ref_repr); // can have only one entry
@@ -3405,21 +3406,20 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
IR_ArrayRef *tmp_array_ref;
- IR_PointerArrayRef * tmp_ptr_array_ref; // was IR_PointerArrayref
+ IR_PointerArrayRef *tmp_ptr_array_ref; // was IR_PointerArrayref
if (!found_non_constant_size_dimension) {
fprintf(stderr, "constant size\n");
tmp_array_ref = ir->CreateArrayRef(
- static_cast<IR_ArraySymbol *>(tmp_sym), to_push2);
- }
- else {
- fprintf(stderr, "NON constant size\n");
+ static_cast<IR_ArraySymbol *>(tmp_sym), to_push2);
+ } else {
+ fprintf(stderr, "NON constant size\n");
tmp_ptr_array_ref = ir->CreatePointerArrayRef(
- static_cast<IR_PointerSymbol *>(tmp_sym), to_push2);
+ static_cast<IR_PointerSymbol *>(tmp_sym), to_push2);
// TODO static_cast<IR_PointerSymbol *>(tmp_sym), to_push2);
}
- fflush(stdout);
+ fflush(stdout);
//fprintf(stderr, "\n%d statements\n", stmt.size());
//for (int i=0; i<stmt.size(); i++) {
@@ -3432,22 +3432,22 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
//std::string stemp;
//stemp = tmp_array_ref->name();
//std::cout << "Created array reference --> " << stemp.c_str() << "\n";
-
+
// get the RHS expression
- fprintf(stderr, "get the RHS expression arrName %s\n", arrName.c_str());
+ fprintf(stderr, "get the RHS expression arrName %s\n", arrName.c_str());
CG_outputRepr *rhs;
if (arrName == "RHS") {
rhs = ir->GetRHSExpression(stmt[stmt_num].code);
-
+
std::vector<IR_ArrayRef *> symbols = ir->FindArrayRef(rhs);
}
std::set<std::string> sym_names;
-
+
//for (int i = 0; i < symbols.size(); i++)
// sym_names.insert(symbols[i]->symbol()->name());
-
- fflush(stdout);
+
+ fflush(stdout);
//fprintf(stderr, "\nbefore if (arrName == RHS)\n%d statements\n", stmt.size()); // problem is after here
//for (int i=0; i<stmt.size(); i++) {
@@ -3457,15 +3457,14 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
//fprintf(stderr, "\n");
if (arrName == "RHS") {
-
+
std::vector<IR_ArrayRef *> symbols = ir->FindArrayRef(rhs);
-
+
for (int i = 0; i < symbols.size(); i++)
sym_names.insert(symbols[i]->symbol()->name());
- }
- else {
+ } else {
- fprintf(stderr, "finding array refs in stmt_num %d\n", stmt_num);
+ fprintf(stderr, "finding array refs in stmt_num %d\n", stmt_num);
//fprintf(stderr, "\n%d statements\n", stmt.size());
//for (int i=0; i<stmt.size(); i++) {
// fprintf(stderr, "%2d ", i);
@@ -3474,15 +3473,15 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
//fprintf(stderr, "\n");
std::vector<IR_ArrayRef *> refs = ir->FindArrayRef(stmt[stmt_num].code);
- fprintf(stderr, "\n%d refs\n", refs.size());
+ fprintf(stderr, "\n%d refs\n", refs.size());
+
-
bool found = false;
for (int j = 0; j < refs.size(); j++) {
- CG_outputRepr* to_replace;
+ CG_outputRepr *to_replace;
- fprintf(stderr, "j %d build new assignment statement with temporary array\n",j);
+ fprintf(stderr, "j %d build new assignment statement with temporary array\n", j);
// build new assignment statement with temporary array
if (!found_non_constant_size_dimension) {
to_replace = tmp_array_ref->convert();
@@ -3494,7 +3493,7 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
//CR->Dump();
if (refs[j]->name() == arrName) {
- fflush(stdout);
+ fflush(stdout);
fprintf(stderr, "loop.cc L353\n"); // problem is after here
//fprintf(stderr, "\n%d statements\n", stmt.size());
//for (int i=0; i<stmt.size(); i++) {
@@ -3502,15 +3501,15 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
// ((CG_chillRepr *)stmt[i].code)->Dump();
//}
//fprintf(stderr, "\n");
-
+
sym_names.insert(refs[j]->symbol()->name());
-
+
if (!found) {
- if (!found_non_constant_size_dimension) {
- fprintf(stderr, "constant size2\n");
- omega::CG_outputRepr * t = tmp_array_ref->convert();
- omega::CG_outputRepr * r = refs[j]->convert()->clone();
+ if (!found_non_constant_size_dimension) {
+ fprintf(stderr, "constant size2\n");
+ omega::CG_outputRepr *t = tmp_array_ref->convert();
+ omega::CG_outputRepr *r = refs[j]->convert()->clone();
//CR = (CG_chillRepr *) t;
//CR->Dump();
//CR = (CG_chillRepr *) r;
@@ -3518,14 +3517,13 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
//fprintf(stderr, "lhs t %p lhs r %p\n", t, r);
stmt[newStmt_num].code =
- ir->builder()->CreateAssignment(0,
- t, // tmp_array_ref->convert(),
- r); // refs[j]->convert()->clone()
- }
- else {
- fprintf(stderr, "NON constant size2\n");
- omega::CG_outputRepr * t = tmp_ptr_array_ref->convert(); // this fails
- omega::CG_outputRepr * r = refs[j]->convert()->clone();
+ ir->builder()->CreateAssignment(0,
+ t, // tmp_array_ref->convert(),
+ r); // refs[j]->convert()->clone()
+ } else {
+ fprintf(stderr, "NON constant size2\n");
+ omega::CG_outputRepr *t = tmp_ptr_array_ref->convert(); // this fails
+ omega::CG_outputRepr *r = refs[j]->convert()->clone();
//omega::CG_chillRepr *CR = (omega::CG_chillRepr *) t;
//CR->Dump();
@@ -3534,21 +3532,21 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
//fprintf(stderr, "lhs t %p lhs r %p\n", t, r);
stmt[newStmt_num].code =
- ir->builder()->CreateAssignment(0,
- t, // tmp_ptr_array_ref->convert(),
- r ); // refs[j]->convert()->clone());
+ ir->builder()->CreateAssignment(0,
+ t, // tmp_ptr_array_ref->convert(),
+ r); // refs[j]->convert()->clone());
}
found = true;
-
+
}
-
+
// refs[j] has no parent?
- fprintf(stderr, "replacing refs[%d]\n", j );
+ fprintf(stderr, "replacing refs[%d]\n", j);
ir->ReplaceExpression(refs[j], to_replace);
}
-
+
}
-
+
}
//ToDo need to update the dependence graph
//Anand adding dependence graph update
@@ -3561,10 +3559,10 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
//fprintf(stderr, "\n");
dep.insert();
-
+
//Anand:Copying Dependence checks from datacopy code, might need to be a separate function/module
// in the future
-
+
/*for (int i = 0; i < newStmt_num; i++) {
std::vector<std::vector<DependenceVector> > D;
@@ -3615,41 +3613,41 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
*/
//Anand--end dependence check
if (arrName == "RHS") {
-
+
// build new assignment statement with temporary array
if (!found_non_constant_size_dimension) {
if (assign_then_accumulate) {
stmt[newStmt_num].code = ir->builder()->CreateAssignment(0,
tmp_array_ref->convert(), rhs);
- fprintf(stderr, "ir->ReplaceRHSExpression( stmt_ num %d )\n", stmt_num);
+ fprintf(stderr, "ir->ReplaceRHSExpression( stmt_ num %d )\n", stmt_num);
ir->ReplaceRHSExpression(stmt[stmt_num].code, tmp_array_ref);
} else {
CG_outputRepr *temp = tmp_array_ref->convert()->clone();
if (ir->QueryExpOperation(stmt[stmt_num].code)
!= IR_OP_PLUS_ASSIGNMENT)
throw ir_error(
- "Statement is not a += accumulation statement");
+ "Statement is not a += accumulation statement");
- fprintf(stderr, "replacing in a +=\n");
+ fprintf(stderr, "replacing in a +=\n");
stmt[newStmt_num].code = ir->builder()->CreatePlusAssignment(0,
temp->clone(), rhs);
-
- CG_outputRepr * lhs = ir->GetLHSExpression(stmt[stmt_num].code);
-
+
+ CG_outputRepr *lhs = ir->GetLHSExpression(stmt[stmt_num].code);
+
CG_outputRepr *assignment = ir->builder()->CreateAssignment(0,
lhs, temp->clone());
Statement init_ = stmt[newStmt_num]; // copy ??
init_.ir_stmt_node = NULL;
-
+
init_.code = stmt[newStmt_num].code->clone();
init_.IS = copy(stmt[newStmt_num].IS);
init_.xform = copy(stmt[newStmt_num].xform);
init_.has_inspector = false; // ??
Relation mapping(init_.IS.n_set(), init_.IS.n_set());
-
+
F_And *f_root = mapping.add_and();
-
+
for (int i = 1; i <= mapping.n_inp(); i++) {
EQ_Handle h = f_root->add_EQ();
//if (i < levels[0]) {
@@ -3660,7 +3658,7 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
h.update_const(-1);
h.update_coef(mapping.output_var(i), 1);
}
-
+
/*else {
int j;
for (j = 0; j < levels.size(); j++)
@@ -3683,18 +3681,18 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
*/
//}
}
-
+
mapping.simplify();
// match omega input/output variables to variable names in the code
for (int j = 1; j <= init_.IS.n_set(); j++)
mapping.name_output_var(j, init_.IS.set_var(j)->name());
for (int j = 1; j <= init_.IS.n_set(); j++)
mapping.name_input_var(j, init_.IS.set_var(j)->name());
-
+
mapping.setup_names();
-
+
init_.IS = omega::Range(
- omega::Restrict_Domain(mapping, init_.IS));
+ omega::Restrict_Domain(mapping, init_.IS));
std::vector<int> lex = getLexicalOrder(newStmt_num);
int dim = 2 * levels[0] - 1;
//init_.IS.print();
@@ -3704,11 +3702,11 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
shiftLexicalOrder(lex, dim + 1, 1);
init_.reduction = stmt[newStmt_num].reduction;
init_.reductionOp = stmt[newStmt_num].reductionOp;
-
+
init_.code = ir->builder()->CreateAssignment(0, temp->clone(),
ir->builder()->CreateInt(0));
- fprintf(stderr, "loop.cc L3693 adding stmt %d\n", stmt.size());
+ fprintf(stderr, "loop.cc L3693 adding stmt %d\n", stmt.size());
stmt.push_back(init_);
uninterpreted_symbols.push_back(uninterpreted_symbols[newStmt_num]);
@@ -3726,47 +3724,45 @@ void Loop::scalar_expand(int stmt_num, const std::vector<int> &levels,
if (ir->QueryExpOperation(stmt[stmt_num].code)
!= IR_OP_PLUS_ASSIGNMENT)
throw ir_error(
- "Statement is not a += accumulation statement");
+ "Statement is not a += accumulation statement");
stmt[newStmt_num].code = ir->builder()->CreatePlusAssignment(0,
temp->clone(), rhs);
-
- CG_outputRepr * lhs = ir->GetLHSExpression(stmt[stmt_num].code);
-
+
+ CG_outputRepr *lhs = ir->GetLHSExpression(stmt[stmt_num].code);
+
CG_outputRepr *assignment = ir->builder()->CreateAssignment(0,
lhs, temp->clone());
-
+
stmt[stmt_num].code = assignment;
}
// call function to replace rhs with temporary array
}
}
-
+
//std::cout << "End of scalar_expand function!! \n";
-
+
// if(arrName == "RHS"){
DependenceVector dv;
std::vector<DependenceVector> E;
dv.lbounds = std::vector<omega::coef_t>(4);
dv.ubounds = std::vector<omega::coef_t>(4);
dv.type = DEP_W2R;
-
+
for (int k = 0; k < 4; k++) {
dv.lbounds[k] = 0;
dv.ubounds[k] = 0;
-
+
}
-
+
//std::vector<IR_ArrayRef*> array_refs = ir->FindArrayRef(stmt[newStmt_num].code);
dv.sym = tmp_sym->clone();
-
+
E.push_back(dv);
-
+
dep.connect(newStmt_num, stmt_num, E);
// }
-
-}
-
+}
std::pair<Relation, Relation> createCSRstyleISandXFORM(CG_outputBuilder *ocg,
@@ -3775,98 +3771,98 @@ std::pair<Relation, Relation> createCSRstyleISandXFORM(CG_outputBuilder *ocg,
std::map<std::string, std::vector<omega::CG_outputRepr *> > &uninterpreted_symbols,
std::map<std::string, std::vector<omega::CG_outputRepr *> > &uninterpreted_symbols_string,
Loop *this_loop) {
-
+
Relation IS(outer_loop_bounds.size() + 1 + zero_loop_bounds.size());
Relation XFORM(outer_loop_bounds.size() + 1 + zero_loop_bounds.size(),
2 * (outer_loop_bounds.size() + 1 + zero_loop_bounds.size()) + 1);
-
- F_And * f_r_ = IS.add_and();
- F_And * f_root = XFORM.add_and();
-
+
+ F_And *f_r_ = IS.add_and();
+ F_And *f_root = XFORM.add_and();
+
if (outer_loop_bounds.size() > 0) {
for (int it = 0; it < IS.n_set(); it++) {
IS.name_set_var(it + 1,
const_cast<Relation &>(outer_loop_bounds[0]).set_var(it + 1)->name());
XFORM.name_input_var(it + 1,
const_cast<Relation &>(outer_loop_bounds[0]).set_var(it + 1)->name());
-
+
}
} else if (zero_loop_bounds.size() > 0) {
for (int it = 0; it < IS.n_set(); it++) {
IS.name_set_var(it + 1,
const_cast<Relation &>(zero_loop_bounds.begin()->second).set_var(
- it + 1)->name());
+ it + 1)->name());
XFORM.name_input_var(it + 1,
const_cast<Relation &>(zero_loop_bounds.begin()->second).set_var(
- it + 1)->name());
-
+ it + 1)->name());
+
}
-
+
}
-
+
for (int i = 0; i < outer_loop_bounds.size(); i++)
IS = replace_set_var_as_another_set_var(IS, outer_loop_bounds[i], i + 1,
i + 1);
-
+
int count = 1;
for (std::map<int, Relation>::iterator i = zero_loop_bounds.begin();
i != zero_loop_bounds.end(); i++, count++)
IS = replace_set_var_as_another_set_var(IS, i->second,
outer_loop_bounds.size() + 1 + count, i->first);
-
+
if (outer_loop_bounds.size() > 0) {
Free_Var_Decl *lb = new Free_Var_Decl(index_name + "_", 1); // index_
Variable_ID csr_lb = IS.get_local(lb, Input_Tuple);
-
+
Free_Var_Decl *ub = new Free_Var_Decl(index_name + "__", 1); // index__
Variable_ID csr_ub = IS.get_local(ub, Input_Tuple);
-
+
//lower bound
-
- F_And * f_r = IS.and_with_and();
+
+ F_And *f_r = IS.and_with_and();
GEQ_Handle lower_bound = f_r->add_GEQ();
lower_bound.update_coef(csr_lb, -1);
lower_bound.update_coef(IS.set_var(outer_loop_bounds.size() + 1), 1);
-
+
//upper bound
-
+
GEQ_Handle upper_bound = f_r->add_GEQ();
upper_bound.update_coef(csr_ub, 1);
upper_bound.update_coef(IS.set_var(outer_loop_bounds.size() + 1), -1);
upper_bound.update_const(-1);
-
+
omega::CG_stringBuilder *ocgs = new CG_stringBuilder;
-
+
std::vector<omega::CG_outputRepr *> reprs;
std::vector<omega::CG_outputRepr *> reprs2;
-
+
std::vector<omega::CG_outputRepr *> reprs3;
std::vector<omega::CG_outputRepr *> reprs4;
-
+
reprs.push_back(
- ocg->CreateIdent(IS.set_var(outer_loop_bounds.size())->name()));
+ ocg->CreateIdent(IS.set_var(outer_loop_bounds.size())->name()));
reprs2.push_back(
- ocgs->CreateIdent(
- IS.set_var(outer_loop_bounds.size())->name()));
+ ocgs->CreateIdent(
+ IS.set_var(outer_loop_bounds.size())->name()));
uninterpreted_symbols.insert(
- std::pair<std::string, std::vector<CG_outputRepr *> >(
- index_name + "_", reprs));
+ std::pair<std::string, std::vector<CG_outputRepr *> >(
+ index_name + "_", reprs));
uninterpreted_symbols_string.insert(
- std::pair<std::string, std::vector<CG_outputRepr *> >(
- index_name + "_", reprs2));
-
+ std::pair<std::string, std::vector<CG_outputRepr *> >(
+ index_name + "_", reprs2));
+
std::string arg = "(" + IS.set_var(outer_loop_bounds.size())->name()
- + ")";
- std::vector< std::string > argvec;
- argvec.push_back( arg );
-
+ + ")";
+ std::vector<std::string> argvec;
+ argvec.push_back(arg);
+
CG_outputRepr *repr = ocg->CreateArrayRefExpression(index_name,
ocg->CreateIdent(IS.set_var(outer_loop_bounds.size())->name()));
-
+
//fprintf(stderr, "( VECTOR _)\n");
//fprintf(stderr, "loop.cc calling CreateDefineMacro( %s, argvec, repr)\n", (index_name + "_").c_str());
this_loop->ir->CreateDefineMacro(index_name + "_", argvec, repr);
-
+
Relation known_(copy(IS).n_set());
known_.copy_names(copy(IS));
known_.setup_names();
@@ -3878,80 +3874,81 @@ std::pair<Relation, Relation> createCSRstyleISandXFORM(CG_outputBuilder *ocg,
g.update_coef(index_lb, -1);
g.update_const(-1);
this_loop->addKnown(known_);
-
+
reprs3.push_back(
-
- ocg->CreateIdent(IS.set_var(outer_loop_bounds.size())->name()));
+
+ ocg->CreateIdent(IS.set_var(outer_loop_bounds.size())->name()));
reprs4.push_back(
-
- ocgs->CreateIdent(IS.set_var(outer_loop_bounds.size())->name()));
-
+
+ ocgs->CreateIdent(IS.set_var(outer_loop_bounds.size())->name()));
+
CG_outputRepr *repr2 = ocg->CreateArrayRefExpression(index_name,
ocg->CreatePlus(
- ocg->CreateIdent(
- IS.set_var(outer_loop_bounds.size())->name()),
- ocg->CreateInt(1)));
-
+ ocg->CreateIdent(
+ IS.set_var(outer_loop_bounds.size())->name()),
+ ocg->CreateInt(1)));
+
//fprintf(stderr, "( VECTOR __)\n");
//fprintf(stderr, "loop.cc calling CreateDefineMacro( %s, argvec, repr)\n", (index_name + "__").c_str());
-
+
this_loop->ir->CreateDefineMacro(index_name + "__", argvec, repr2);
-
+
uninterpreted_symbols.insert(
- std::pair<std::string, std::vector<CG_outputRepr *> >(
- index_name + "__", reprs3));
+ std::pair<std::string, std::vector<CG_outputRepr *> >(
+ index_name + "__", reprs3));
uninterpreted_symbols_string.insert(
- std::pair<std::string, std::vector<CG_outputRepr *> >(
- index_name + "__", reprs4));
+ std::pair<std::string, std::vector<CG_outputRepr *> >(
+ index_name + "__", reprs4));
} else {
Free_Var_Decl *ub = new Free_Var_Decl(index_name);
Variable_ID csr_ub = IS.get_local(ub);
- F_And * f_r = IS.and_with_and();
+ F_And *f_r = IS.and_with_and();
GEQ_Handle upper_bound = f_r->add_GEQ();
upper_bound.update_coef(csr_ub, 1);
upper_bound.update_coef(IS.set_var(outer_loop_bounds.size() + 1), -1);
upper_bound.update_const(-1);
-
+
GEQ_Handle lower_bound = f_r->add_GEQ();
lower_bound.update_coef(IS.set_var(outer_loop_bounds.size() + 1), 1);
-
+
}
-
+
for (int j = 1; j <= XFORM.n_inp(); j++) {
omega::EQ_Handle h = f_root->add_EQ();
h.update_coef(XFORM.output_var(2 * j), 1);
h.update_coef(XFORM.input_var(j), -1);
}
-
+
for (int j = 1; j <= XFORM.n_out(); j += 2) {
omega::EQ_Handle h = f_root->add_EQ();
h.update_coef(XFORM.output_var(j), 1);
}
-
+
if (_DEBUG_) {
IS.print();
XFORM.print();
-
+
}
-
+
return std::pair<Relation, Relation>(IS, XFORM);
-
+
}
std::pair<Relation, Relation> construct_reduced_IS_And_XFORM(IR_Code *ir,
- const Relation &is, const Relation &xform, const std::vector<int> loops,
+ const Relation &is, const Relation &xform,
+ const std::vector<int> loops,
std::vector<int> &lex_order, Relation &known,
std::map<std::string, std::vector<CG_outputRepr *> > &uninterpreted_symbols) {
-
+
Relation IS(loops.size());
Relation XFORM(loops.size(), 2 * loops.size() + 1);
int count_ = 1;
std::map<int, int> pos_mapping;
-
+
int n = is.n_set();
Relation is_and_known = Intersection(copy(is),
Extend_Set(copy(known), n - known.n_set()));
-
+
for (int it = 0; it < loops.size(); it++, count_++) {
IS.name_set_var(count_,
const_cast<Relation &>(is).set_var(loops[it])->name());
@@ -3963,11 +3960,11 @@ std::pair<Relation, Relation> construct_reduced_IS_And_XFORM(IR_Code *ir,
const_cast<Relation &>(xform).output_var((loops[it]) * 2 - 1)->name());
pos_mapping.insert(std::pair<int, int>(count_, loops[it]));
}
-
+
XFORM.name_output_var(2 * loops.size() + 1,
const_cast<Relation &>(xform).output_var(is.n_set() * 2 + 1)->name());
-
- F_And * f_r = IS.add_and();
+
+ F_And *f_r = IS.add_and();
for (std::map<int, int>::iterator it = pos_mapping.begin();
it != pos_mapping.end(); it++)
IS = replace_set_var_as_another_set_var(IS, is_and_known, it->first,
@@ -4012,9 +4009,9 @@ std::pair<Relation, Relation> construct_reduced_IS_And_XFORM(IR_Code *ir,
CHILL_DEBUG_END
F_And *f_root = XFORM.add_and();
-
+
count_ = 1;
-
+
for (int j = 1; j <= loops.size(); j++) {
omega::EQ_Handle h = f_root->add_EQ();
h.update_coef(XFORM.output_var(2 * j), 1);
@@ -4025,7 +4022,7 @@ std::pair<Relation, Relation> construct_reduced_IS_And_XFORM(IR_Code *ir,
h.update_coef(XFORM.output_var(count_ * 2 - 1), 1);
h.update_const(-lex_order[count_ * 2 - 2]);
}
-
+
omega::EQ_Handle h = f_root->add_EQ();
h.update_coef(XFORM.output_var((loops.size()) * 2 + 1), 1);
h.update_const(-lex_order[xform.n_out() - 1]);
@@ -4035,34 +4032,34 @@ std::pair<Relation, Relation> construct_reduced_IS_And_XFORM(IR_Code *ir,
IS.print();
XFORM.print();
CHILL_DEBUG_END
-
+
return std::pair<Relation, Relation>(IS, XFORM);
-
+
}
std::set<std::string> inspect_repr_for_scalars(IR_Code *ir,
- CG_outputRepr * repr, std::set<std::string> ignore) {
-
+ CG_outputRepr *repr, std::set<std::string> ignore) {
+
std::vector<IR_ScalarRef *> refs = ir->FindScalarRef(repr);
std::set<std::string> loop_vars;
-
+
for (int i = 0; i < refs.size(); i++)
if (ignore.find(refs[i]->name()) == ignore.end())
loop_vars.insert(refs[i]->name());
-
+
return loop_vars;
-
+
}
std::set<std::string> inspect_loop_bounds(IR_Code *ir, const Relation &R,
int pos,
std::map<std::string, std::vector<omega::CG_outputRepr *> > &uninterpreted_symbols) {
-
+
if (!R.is_set())
throw loop_error("Input R has to be a set not a relation!");
-
+
std::set<std::string> vars;
-
+
std::vector<CG_outputRepr *> refs;
Variable_ID v = const_cast<Relation &>(R).set_var(pos);
for (DNF_Iterator di(const_cast<Relation &>(R).query_DNF()); di; di++) {
@@ -4071,48 +4068,48 @@ std::set<std::string> inspect_loop_bounds(IR_Code *ir, const Relation &R,
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
-
- case Global_Var: {
- Global_Var_ID g = v->get_global_var();
- Variable_ID v2;
- if (g->arity() > 0) {
-
- std::string s = g->base_name();
- std::copy(
- uninterpreted_symbols.find(s)->second.begin(),
- uninterpreted_symbols.find(s)->second.end(),
- back_inserter(refs));
-
+
+ case Global_Var: {
+ Global_Var_ID g = v->get_global_var();
+ Variable_ID v2;
+ if (g->arity() > 0) {
+
+ std::string s = g->base_name();
+ std::copy(
+ uninterpreted_symbols.find(s)->second.begin(),
+ uninterpreted_symbols.find(s)->second.end(),
+ back_inserter(refs));
+
+ }
+
+ break;
}
-
- break;
- }
- default:
- break;
+ default:
+ break;
}
}
-
+
}
}
}
-
+
for (int i = 0; i < refs.size(); i++) {
std::vector<IR_ScalarRef *> refs_ = ir->FindScalarRef(refs[i]);
-
+
for (int j = 0; j < refs_.size(); j++)
vars.insert(refs_[j]->name());
-
+
}
return vars;
}
-CG_outputRepr * create_counting_loop_body(IR_Code *ir, const Relation &R,
- int pos, CG_outputRepr * count,
- std::map<std::string, std::vector<omega::CG_outputRepr *> > &uninterpreted_symbols) {
-
+CG_outputRepr *create_counting_loop_body(IR_Code *ir, const Relation &R,
+ int pos, CG_outputRepr *count,
+ std::map<std::string, std::vector<omega::CG_outputRepr *> > &uninterpreted_symbols) {
+
if (!R.is_set())
throw loop_error("Input R has to be a set not a relation!");
-
+
CG_outputRepr *ub, *lb;
ub = NULL;
lb = NULL;
@@ -4126,42 +4123,42 @@ CG_outputRepr * create_counting_loop_body(IR_Code *ir, const Relation &R,
for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) {
Variable_ID v = cvi.curr_var();
switch (v->kind()) {
-
- case Global_Var: {
- Global_Var_ID g = v->get_global_var();
- Variable_ID v2;
- if (g->arity() > 0) {
-
- std::string s = g->base_name();
-
- if ((*gi).get_coef(v) > 0) {
- if (ub != NULL)
- throw ir_error(
- "bound expression too complex!");
-
- ub = ir->builder()->CreateInvoke(s,
- uninterpreted_symbols.find(s)->second);
- //ub = ir->builder()->CreateMinus(ub->clone(), ir->builder()->CreateInt(-(*gi).get_const()));
- same_ge_1 = true;
-
- } else {
- if (lb != NULL)
- throw ir_error(
- "bound expression too complex!");
- lb = ir->builder()->CreateInvoke(s,
- uninterpreted_symbols.find(s)->second);
- same_ge_2 = true;
-
+
+ case Global_Var: {
+ Global_Var_ID g = v->get_global_var();
+ Variable_ID v2;
+ if (g->arity() > 0) {
+
+ std::string s = g->base_name();
+
+ if ((*gi).get_coef(v) > 0) {
+ if (ub != NULL)
+ throw ir_error(
+ "bound expression too complex!");
+
+ ub = ir->builder()->CreateInvoke(s,
+ uninterpreted_symbols.find(s)->second);
+ //ub = ir->builder()->CreateMinus(ub->clone(), ir->builder()->CreateInt(-(*gi).get_const()));
+ same_ge_1 = true;
+
+ } else {
+ if (lb != NULL)
+ throw ir_error(
+ "bound expression too complex!");
+ lb = ir->builder()->CreateInvoke(s,
+ uninterpreted_symbols.find(s)->second);
+ same_ge_2 = true;
+
+ }
}
+
+ break;
}
-
- break;
- }
- default:
- break;
+ default:
+ break;
}
}
-
+
if (same_ge_1 && same_ge_2)
lb = ir->builder()->CreatePlus(lb->clone(),
ir->builder()->CreateInt(-(*gi).get_const()));
@@ -4173,181 +4170,179 @@ CG_outputRepr * create_counting_loop_body(IR_Code *ir, const Relation &R,
ir->builder()->CreateInt(-(*gi).get_const()));
}
}
-
+
}
-
+
return ir->builder()->CreatePlusAssignment(0, count,
ir->builder()->CreatePlus(
- ir->builder()->CreateMinus(ub->clone(), lb->clone()),
- ir->builder()->CreateInt(1)));
+ ir->builder()->CreateMinus(ub->clone(), lb->clone()),
+ ir->builder()->CreateInt(1)));
}
-
std::map<std::string, std::vector<std::string> > recurse_on_exp_for_arrays(
- IR_Code * ir, CG_outputRepr * exp) {
-
+ IR_Code *ir, CG_outputRepr *exp) {
+
std::map<std::string, std::vector<std::string> > arr_index_to_ref;
switch (ir->QueryExpOperation(exp)) {
-
- case IR_OP_ARRAY_VARIABLE: {
- IR_ArrayRef *ref = dynamic_cast<IR_ArrayRef *>(ir->Repr2Ref(exp));
- IR_PointerArrayRef *ref_ =
- dynamic_cast<IR_PointerArrayRef *>(ir->Repr2Ref(exp));
- if (ref == NULL && ref_ == NULL)
- throw loop_error("Array symbol unidentifiable!");
-
- if (ref != NULL) {
- std::vector<std::string> s0;
-
- for (int i = 0; i < ref->n_dim(); i++) {
- CG_outputRepr * index = ref->index(i);
- std::map<std::string, std::vector<std::string> > a0 =
- recurse_on_exp_for_arrays(ir, index);
- std::vector<std::string> s;
- for (std::map<std::string, std::vector<std::string> >::iterator j =
- a0.begin(); j != a0.end(); j++) {
- if (j->second.size() != 1 && (j->second)[0] != "")
- throw loop_error(
- "indirect array references not allowed in guard!");
- s.push_back(j->first);
+
+ case IR_OP_ARRAY_VARIABLE: {
+ IR_ArrayRef *ref = dynamic_cast<IR_ArrayRef *>(ir->Repr2Ref(exp));
+ IR_PointerArrayRef *ref_ =
+ dynamic_cast<IR_PointerArrayRef *>(ir->Repr2Ref(exp));
+ if (ref == NULL && ref_ == NULL)
+ throw loop_error("Array symbol unidentifiable!");
+
+ if (ref != NULL) {
+ std::vector<std::string> s0;
+
+ for (int i = 0; i < ref->n_dim(); i++) {
+ CG_outputRepr *index = ref->index(i);
+ std::map<std::string, std::vector<std::string> > a0 =
+ recurse_on_exp_for_arrays(ir, index);
+ std::vector<std::string> s;
+ for (std::map<std::string, std::vector<std::string> >::iterator j =
+ a0.begin(); j != a0.end(); j++) {
+ if (j->second.size() != 1 && (j->second)[0] != "")
+ throw loop_error(
+ "indirect array references not allowed in guard!");
+ s.push_back(j->first);
+ }
+ std::copy(s.begin(), s.end(), back_inserter(s0));
}
- std::copy(s.begin(), s.end(), back_inserter(s0));
- }
- arr_index_to_ref.insert(
- std::pair<std::string, std::vector<std::string> >(
- ref->name(), s0));
- } else {
- std::vector<std::string> s0;
- for (int i = 0; i < ref_->n_dim(); i++) {
- CG_outputRepr * index = ref_->index(i);
- std::map<std::string, std::vector<std::string> > a0 =
- recurse_on_exp_for_arrays(ir, index);
- std::vector<std::string> s;
- for (std::map<std::string, std::vector<std::string> >::iterator j =
- a0.begin(); j != a0.end(); j++) {
- if (j->second.size() != 1 && (j->second)[0] != "")
- throw loop_error(
- "indirect array references not allowed in guard!");
- s.push_back(j->first);
+ arr_index_to_ref.insert(
+ std::pair<std::string, std::vector<std::string> >(
+ ref->name(), s0));
+ } else {
+ std::vector<std::string> s0;
+ for (int i = 0; i < ref_->n_dim(); i++) {
+ CG_outputRepr *index = ref_->index(i);
+ std::map<std::string, std::vector<std::string> > a0 =
+ recurse_on_exp_for_arrays(ir, index);
+ std::vector<std::string> s;
+ for (std::map<std::string, std::vector<std::string> >::iterator j =
+ a0.begin(); j != a0.end(); j++) {
+ if (j->second.size() != 1 && (j->second)[0] != "")
+ throw loop_error(
+ "indirect array references not allowed in guard!");
+ s.push_back(j->first);
+ }
+ std::copy(s.begin(), s.end(), back_inserter(s0));
}
- std::copy(s.begin(), s.end(), back_inserter(s0));
+ arr_index_to_ref.insert(
+ std::pair<std::string, std::vector<std::string> >(
+ ref_->name(), s0));
}
- arr_index_to_ref.insert(
- std::pair<std::string, std::vector<std::string> >(
- ref_->name(), s0));
+ break;
}
- break;
- }
- case IR_OP_PLUS:
- case IR_OP_MINUS:
- case IR_OP_MULTIPLY:
- case IR_OP_DIVIDE: {
- std::vector<CG_outputRepr *> v = ir->QueryExpOperand(exp);
- std::map<std::string, std::vector<std::string> > a0 =
- recurse_on_exp_for_arrays(ir, v[0]);
- std::map<std::string, std::vector<std::string> > a1 =
- recurse_on_exp_for_arrays(ir, v[1]);
- arr_index_to_ref.insert(a0.begin(), a0.end());
- arr_index_to_ref.insert(a1.begin(), a1.end());
- break;
-
- }
- case IR_OP_POSITIVE:
- case IR_OP_NEGATIVE: {
- std::vector<CG_outputRepr *> v = ir->QueryExpOperand(exp);
- std::map<std::string, std::vector<std::string> > a0 =
- recurse_on_exp_for_arrays(ir, v[0]);
-
- arr_index_to_ref.insert(a0.begin(), a0.end());
- break;
-
- }
- case IR_OP_VARIABLE: {
- std::vector<CG_outputRepr *> v = ir->QueryExpOperand(exp);
- IR_ScalarRef *ref = static_cast<IR_ScalarRef *>(ir->Repr2Ref(v[0]));
-
- std::string s = ref->name();
- std::vector<std::string> to_insert;
- to_insert.push_back("");
- arr_index_to_ref.insert(
- std::pair<std::string, std::vector<std::string> >(s,
- to_insert));
- break;
- }
- case IR_OP_CONSTANT:
- break;
-
- default: {
- std::vector<CG_outputRepr *> v = ir->QueryExpOperand(exp);
-
- for (int i = 0; i < v.size(); i++) {
+ case IR_OP_PLUS:
+ case IR_OP_MINUS:
+ case IR_OP_MULTIPLY:
+ case IR_OP_DIVIDE: {
+ std::vector<CG_outputRepr *> v = ir->QueryExpOperand(exp);
std::map<std::string, std::vector<std::string> > a0 =
- recurse_on_exp_for_arrays(ir, v[i]);
-
+ recurse_on_exp_for_arrays(ir, v[0]);
+ std::map<std::string, std::vector<std::string> > a1 =
+ recurse_on_exp_for_arrays(ir, v[1]);
arr_index_to_ref.insert(a0.begin(), a0.end());
+ arr_index_to_ref.insert(a1.begin(), a1.end());
+ break;
+
+ }
+ case IR_OP_POSITIVE:
+ case IR_OP_NEGATIVE: {
+ std::vector<CG_outputRepr *> v = ir->QueryExpOperand(exp);
+ std::map<std::string, std::vector<std::string> > a0 =
+ recurse_on_exp_for_arrays(ir, v[0]);
+
+ arr_index_to_ref.insert(a0.begin(), a0.end());
+ break;
+
+ }
+ case IR_OP_VARIABLE: {
+ std::vector<CG_outputRepr *> v = ir->QueryExpOperand(exp);
+ IR_ScalarRef *ref = static_cast<IR_ScalarRef *>(ir->Repr2Ref(v[0]));
+
+ std::string s = ref->name();
+ std::vector<std::string> to_insert;
+ to_insert.push_back("");
+ arr_index_to_ref.insert(
+ std::pair<std::string, std::vector<std::string> >(s,
+ to_insert));
+ break;
+ }
+ case IR_OP_CONSTANT:
+ break;
+
+ default: {
+ std::vector<CG_outputRepr *> v = ir->QueryExpOperand(exp);
+
+ for (int i = 0; i < v.size(); i++) {
+ std::map<std::string, std::vector<std::string> > a0 =
+ recurse_on_exp_for_arrays(ir, v[i]);
+
+ arr_index_to_ref.insert(a0.begin(), a0.end());
+ }
+
+ break;
}
-
- break;
- }
}
return arr_index_to_ref;
}
-
std::vector<CG_outputRepr *> find_guards(IR_Code *ir, IR_Control *code) {
CHILL_DEBUG_PRINT("find_guards()\n");
std::vector<CG_outputRepr *> guards;
switch (code->type()) {
- case IR_CONTROL_IF: {
- CHILL_DEBUG_PRINT("find_guards() it's an if\n");
- CG_outputRepr *cond = dynamic_cast<IR_If*>(code)->condition();
-
- std::vector<CG_outputRepr *> then_body;
- std::vector<CG_outputRepr *> else_body;
- IR_Block *ORTB = dynamic_cast<IR_If*>(code)->then_body();
- if (ORTB != NULL) {
- CHILL_DEBUG_PRINT("recursing on then\n");
- then_body = find_guards(ir, ORTB);
- //dynamic_cast<IR_If*>(code)->then_body());
- }
- if (dynamic_cast<IR_If*>(code)->else_body() != NULL) {
- CHILL_DEBUG_PRINT("recursing on then\n");
- else_body = find_guards(ir,
- dynamic_cast<IR_If*>(code)->else_body());
+ case IR_CONTROL_IF: {
+ CHILL_DEBUG_PRINT("find_guards() it's an if\n");
+ CG_outputRepr *cond = dynamic_cast<IR_If *>(code)->condition();
+
+ std::vector<CG_outputRepr *> then_body;
+ std::vector<CG_outputRepr *> else_body;
+ IR_Block *ORTB = dynamic_cast<IR_If *>(code)->then_body();
+ if (ORTB != NULL) {
+ CHILL_DEBUG_PRINT("recursing on then\n");
+ then_body = find_guards(ir, ORTB);
+ //dynamic_cast<IR_If*>(code)->then_body());
+ }
+ if (dynamic_cast<IR_If *>(code)->else_body() != NULL) {
+ CHILL_DEBUG_PRINT("recursing on then\n");
+ else_body = find_guards(ir,
+ dynamic_cast<IR_If *>(code)->else_body());
+ }
+
+ guards.push_back(cond);
+ if (then_body.size() > 0)
+ std::copy(then_body.begin(), then_body.end(),
+ back_inserter(guards));
+ if (else_body.size() > 0)
+ std::copy(else_body.begin(), else_body.end(),
+ back_inserter(guards));
+ break;
}
-
- guards.push_back(cond);
- if (then_body.size() > 0)
- std::copy(then_body.begin(), then_body.end(),
- back_inserter(guards));
- if (else_body.size() > 0)
- std::copy(else_body.begin(), else_body.end(),
- back_inserter(guards));
- break;
- }
- case IR_CONTROL_BLOCK: {
- CHILL_DEBUG_PRINT("it's a control block\n");
- IR_Block* IRCB = dynamic_cast<IR_Block*>(code);
- CHILL_DEBUG_PRINT("calling ir->FindOneLevelControlStructure(IRCB);\n");
- std::vector<IR_Control *> stmts = ir->FindOneLevelControlStructure(IRCB);
-
- for (int i = 0; i < stmts.size(); i++) {
- std::vector<CG_outputRepr *> stmt_repr = find_guards(ir, stmts[i]);
- std::copy(stmt_repr.begin(), stmt_repr.end(),
- back_inserter(guards));
+ case IR_CONTROL_BLOCK: {
+ CHILL_DEBUG_PRINT("it's a control block\n");
+ IR_Block *IRCB = dynamic_cast<IR_Block *>(code);
+ CHILL_DEBUG_PRINT("calling ir->FindOneLevelControlStructure(IRCB);\n");
+ std::vector<IR_Control *> stmts = ir->FindOneLevelControlStructure(IRCB);
+
+ for (int i = 0; i < stmts.size(); i++) {
+ std::vector<CG_outputRepr *> stmt_repr = find_guards(ir, stmts[i]);
+ std::copy(stmt_repr.begin(), stmt_repr.end(),
+ back_inserter(guards));
+ }
+ break;
}
- break;
- }
- case IR_CONTROL_LOOP: {
- CHILL_DEBUG_PRINT("it's a control loop\n");
- std::vector<CG_outputRepr *> body = find_guards(ir,
- dynamic_cast<IR_Loop*>(code)->body());
- if (body.size() > 0)
- std::copy(body.begin(), body.end(), back_inserter(guards));
- break;
- } // loop
+ case IR_CONTROL_LOOP: {
+ CHILL_DEBUG_PRINT("it's a control loop\n");
+ std::vector<CG_outputRepr *> body = find_guards(ir,
+ dynamic_cast<IR_Loop *>(code)->body());
+ if (body.size() > 0)
+ std::copy(body.begin(), body.end(), back_inserter(guards));
+ break;
+ } // loop
} // switch
return guards;
}
@@ -4359,43 +4354,43 @@ bool sort_helper(std::pair<std::string, std::vector<std::string> > i,
for (int k = 0; k < i.second.size(); k++)
if (i.second[k] != "")
c1++;
-
+
for (int k = 0; k < j.second.size(); k++)
if (j.second[k] != "")
c2++;
return (c1 < c2);
-
+
}
bool sort_helper_2(std::pair<int, int> i, std::pair<int, int> j) {
-
+
return (i.second < j.second);
-
+
}
std::vector<std::string> construct_iteration_order(
- std::map<std::string, std::vector<std::string> > & input) {
+ std::map<std::string, std::vector<std::string> > &input) {
std::vector<std::string> arrays;
std::vector<std::string> scalars;
std::vector<std::pair<std::string, std::vector<std::string> > > input_aid;
-
+
for (std::map<std::string, std::vector<std::string> >::iterator j =
- input.begin(); j != input.end(); j++)
+ input.begin(); j != input.end(); j++)
input_aid.push_back(
- std::pair<std::string, std::vector<std::string> >(j->first,
- j->second));
-
+ std::pair<std::string, std::vector<std::string> >(j->first,
+ j->second));
+
std::sort(input_aid.begin(), input_aid.end(), sort_helper);
-
+
for (int j = 0; j < input_aid[input_aid.size() - 1].second.size(); j++)
if (input_aid[input_aid.size() - 1].second[j] != "") {
arrays.push_back(input_aid[input_aid.size() - 1].second[j]);
-
+
}
-
+
if (arrays.size() > 0) {
for (int i = input_aid.size() - 2; i >= 0; i--) {
-
+
int max_count = 0;
for (int j = 0; j < input_aid[i].second.size(); j++)
if (input_aid[i].second[j] != "") {
@@ -4421,7 +4416,7 @@ std::vector<std::string> construct_iteration_order(
}
}
} else {
-
+
for (int i = input_aid.size() - 1; i >= 0; i--) {
arrays.push_back(input_aid[i].first);
}
diff --git a/src/transformations/loop_basic.cc b/src/transformations/loop_basic.cc
index a058598..1be0981 100644
--- a/src/transformations/loop_basic.cc
+++ b/src/transformations/loop_basic.cc
@@ -19,7 +19,7 @@ void Loop::permute(const std::vector<int> &pi) {
std::set<int> active;
for (int i = 0; i < stmt.size(); i++)
active.insert(i);
-
+
permute(active, pi);
}
@@ -30,12 +30,13 @@ void Loop::original() {
setLexicalOrder(0, active);
//apply_xform();
}
+
void Loop::permute(int stmt_num, int level, const std::vector<int> &pi) {
// check for sanity of parameters
int starting_order;
if (stmt_num < 0 || stmt_num >= stmt.size())
throw std::invalid_argument(
- "invalid statement number " + to_string(stmt_num));
+ "invalid statement number " + to_string(stmt_num));
std::set<int> active;
if (level < 0 || level > stmt[stmt_num].loop_level.size())
throw std::invalid_argument("3invalid loop level " + to_string(level));
@@ -61,14 +62,14 @@ void Loop::permute(int stmt_num, int level, const std::vector<int> &pi) {
for (std::set<int>::iterator i = active.begin(); i != active.end(); i++)
if (level + pi.size() - 1 > stmt[*i].loop_level.size())
throw std::invalid_argument(
- "invalid permutation for statement " + to_string(*i));
-
+ "invalid permutation for statement " + to_string(*i));
+
// invalidate saved codegen computation
delete last_compute_cgr_;
last_compute_cgr_ = NULL;
delete last_compute_cg_;
last_compute_cg_ = NULL;
-
+
// Update transformation relations
for (std::set<int>::iterator i = active.begin(); i != active.end(); i++) {
int n = stmt[*i].xform.n_out();
@@ -97,7 +98,7 @@ void Loop::permute(int stmt_num, int level, const std::vector<int> &pi) {
stmt[*i].xform = Composition(mapping, stmt[*i].xform);
stmt[*i].xform.simplify();
}
-
+
// get the permuation for dependence vectors
std::vector<int> t;
for (int i = 0; i < pi.size(); i++)
@@ -122,41 +123,41 @@ void Loop::permute(int stmt_num, int level, const std::vector<int> &pi) {
dep_pi[i] = t[i - min_dep_dim];
for (int i = max_dep_dim + 1; i < dep.num_dim(); i++)
dep_pi[i] = i;
-
+
dep.permute(dep_pi, active);
-
+
// update the dependence graph
DependenceGraph g(dep.num_dim());
for (int i = 0; i < dep.vertex.size(); i++)
g.insert();
for (int i = 0; i < dep.vertex.size(); i++)
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[i].second.begin(); j != dep.vertex[i].second.end();
+ dep.vertex[i].second.begin(); j != dep.vertex[i].second.end();
j++) {
if ((active.find(i) != active.end()
&& active.find(j->first) != active.end())) {
std::vector<DependenceVector> dv = j->second;
for (int k = 0; k < dv.size(); k++) {
switch (dv[k].type) {
- case DEP_W2R:
- case DEP_R2W:
- case DEP_W2W:
- case DEP_R2R: {
- std::vector<coef_t> lbounds(dep.num_dim());
- std::vector<coef_t> ubounds(dep.num_dim());
- for (int d = 0; d < dep.num_dim(); d++) {
- lbounds[d] = dv[k].lbounds[dep_pi[d]];
- ubounds[d] = dv[k].ubounds[dep_pi[d]];
+ case DEP_W2R:
+ case DEP_R2W:
+ case DEP_W2W:
+ case DEP_R2R: {
+ std::vector<coef_t> lbounds(dep.num_dim());
+ std::vector<coef_t> ubounds(dep.num_dim());
+ for (int d = 0; d < dep.num_dim(); d++) {
+ lbounds[d] = dv[k].lbounds[dep_pi[d]];
+ ubounds[d] = dv[k].ubounds[dep_pi[d]];
+ }
+ dv[k].lbounds = lbounds;
+ dv[k].ubounds = ubounds;
+ break;
}
- dv[k].lbounds = lbounds;
- dv[k].ubounds = ubounds;
- break;
- }
- case DEP_CONTROL: {
- break;
- }
- default:
- throw loop_error("unknown dependence type");
+ case DEP_CONTROL: {
+ break;
+ }
+ default:
+ throw loop_error("unknown dependence type");
}
}
g.connect(i, j->first, dv);
@@ -168,27 +169,27 @@ void Loop::permute(int stmt_num, int level, const std::vector<int> &pi) {
std::vector<DependenceVector> dv = j->second;
for (int k = 0; k < dv.size(); k++)
switch (dv[k].type) {
- case DEP_W2R:
- case DEP_R2W:
- case DEP_W2W:
- case DEP_R2R: {
- for (int d = 0; d < dep.num_dim(); d++)
- if (dep_pi[d] != d) {
- dv[k].lbounds[d] = -posInfinity;
- dv[k].ubounds[d] = posInfinity;
- }
- break;
- }
- case DEP_CONTROL:
- break;
- default:
- throw loop_error("unknown dependence type");
+ case DEP_W2R:
+ case DEP_R2W:
+ case DEP_W2W:
+ case DEP_R2R: {
+ for (int d = 0; d < dep.num_dim(); d++)
+ if (dep_pi[d] != d) {
+ dv[k].lbounds[d] = -posInfinity;
+ dv[k].ubounds[d] = posInfinity;
+ }
+ break;
+ }
+ case DEP_CONTROL:
+ break;
+ default:
+ throw loop_error("unknown dependence type");
}
g.connect(i, j->first, dv);
}
}
dep = g;
-
+
// update loop level information
for (std::set<int>::iterator i = active.begin(); i != active.end(); i++) {
int cur_dep_dim = min_dep_dim;
@@ -196,66 +197,67 @@ void Loop::permute(int stmt_num, int level, const std::vector<int> &pi) {
for (int j = 1; j <= stmt[*i].loop_level.size(); j++)
if (j >= level && j < level + pi.size()) {
switch (stmt[*i].loop_level[pi_inverse[j - level] - 1].type) {
- case LoopLevelOriginal:
- new_loop_level[j - 1].type = LoopLevelOriginal;
- new_loop_level[j - 1].payload = cur_dep_dim++;
- new_loop_level[j - 1].parallel_level =
- stmt[*i].loop_level[pi_inverse[j - level] - 1].parallel_level;
- break;
- case LoopLevelTile: {
- new_loop_level[j - 1].type = LoopLevelTile;
- int ref_level = stmt[*i].loop_level[pi_inverse[j - level]
- - 1].payload;
- if (ref_level >= level && ref_level < level + pi.size())
- new_loop_level[j - 1].payload = pi_inverse[ref_level
- - level];
- else
- new_loop_level[j - 1].payload = ref_level;
- new_loop_level[j - 1].parallel_level = stmt[*i].loop_level[j
- - 1].parallel_level;
- break;
- }
- default:
- throw loop_error(
- "unknown loop level information for statement "
- + to_string(*i));
+ case LoopLevelOriginal:
+ new_loop_level[j - 1].type = LoopLevelOriginal;
+ new_loop_level[j - 1].payload = cur_dep_dim++;
+ new_loop_level[j - 1].parallel_level =
+ stmt[*i].loop_level[pi_inverse[j - level] - 1].parallel_level;
+ break;
+ case LoopLevelTile: {
+ new_loop_level[j - 1].type = LoopLevelTile;
+ int ref_level = stmt[*i].loop_level[pi_inverse[j - level]
+ - 1].payload;
+ if (ref_level >= level && ref_level < level + pi.size())
+ new_loop_level[j - 1].payload = pi_inverse[ref_level
+ - level];
+ else
+ new_loop_level[j - 1].payload = ref_level;
+ new_loop_level[j - 1].parallel_level = stmt[*i].loop_level[j
+ - 1].parallel_level;
+ break;
+ }
+ default:
+ throw loop_error(
+ "unknown loop level information for statement "
+ + to_string(*i));
}
} else {
switch (stmt[*i].loop_level[j - 1].type) {
- case LoopLevelOriginal:
- new_loop_level[j - 1].type = LoopLevelOriginal;
- new_loop_level[j - 1].payload =
- stmt[*i].loop_level[j - 1].payload;
- new_loop_level[j - 1].parallel_level = stmt[*i].loop_level[j
- - 1].parallel_level;
- break;
- case LoopLevelTile: {
- new_loop_level[j - 1].type = LoopLevelTile;
- int ref_level = stmt[*i].loop_level[j - 1].payload;
- if (ref_level >= level && ref_level < level + pi.size())
- new_loop_level[j - 1].payload = pi_inverse[ref_level
- - level];
- else
- new_loop_level[j - 1].payload = ref_level;
- new_loop_level[j - 1].parallel_level = stmt[*i].loop_level[j
- - 1].parallel_level;
- break;
- }
- default:
- throw loop_error(
- "unknown loop level information for statement "
- + to_string(*i));
+ case LoopLevelOriginal:
+ new_loop_level[j - 1].type = LoopLevelOriginal;
+ new_loop_level[j - 1].payload =
+ stmt[*i].loop_level[j - 1].payload;
+ new_loop_level[j - 1].parallel_level = stmt[*i].loop_level[j
+ - 1].parallel_level;
+ break;
+ case LoopLevelTile: {
+ new_loop_level[j - 1].type = LoopLevelTile;
+ int ref_level = stmt[*i].loop_level[j - 1].payload;
+ if (ref_level >= level && ref_level < level + pi.size())
+ new_loop_level[j - 1].payload = pi_inverse[ref_level
+ - level];
+ else
+ new_loop_level[j - 1].payload = ref_level;
+ new_loop_level[j - 1].parallel_level = stmt[*i].loop_level[j
+ - 1].parallel_level;
+ break;
+ }
+ default:
+ throw loop_error(
+ "unknown loop level information for statement "
+ + to_string(*i));
}
}
stmt[*i].loop_level = new_loop_level;
}
-
+
setLexicalOrder(2 * level - 2, active, starting_order);
}
+
void Loop::permute(const std::set<int> &active, const std::vector<int> &pi) {
if (active.size() == 0 || pi.size() == 0)
return;
-
+
// check for sanity of parameters
int level = pi[0];
for (int i = 1; i < pi.size(); i++)
@@ -287,14 +289,14 @@ void Loop::permute(const std::set<int> &active, const std::vector<int> &pi) {
for (int j = 0; j < 2 * level - 3; j += 2)
if (lex[j] != lex2[j])
throw std::invalid_argument(
- "statements to permute must be in the same subloop");
+ "statements to permute must be in the same subloop");
for (int j = 0; j < pi.size(); j++)
if (!(stmt[*i].loop_level[level + j - 1].type
== stmt[ref_stmt_num].loop_level[level + j - 1].type
&& stmt[*i].loop_level[level + j - 1].payload
- == stmt[ref_stmt_num].loop_level[level + j - 1].payload))
+ == stmt[ref_stmt_num].loop_level[level + j - 1].payload))
throw std::invalid_argument(
- "permuted loops must have the same loop level types");
+ "permuted loops must have the same loop level types");
}
}
// invalidate saved codegen computation
@@ -302,7 +304,7 @@ void Loop::permute(const std::set<int> &active, const std::vector<int> &pi) {
last_compute_cgr_ = NULL;
delete last_compute_cg_;
last_compute_cg_ = NULL;
-
+
// Update transformation relations
for (std::set<int>::iterator i = active.begin(); i != active.end(); i++) {
int n = stmt[*i].xform.n_out();
@@ -328,11 +330,11 @@ void Loop::permute(const std::set<int> &active, const std::vector<int> &pi) {
h.update_coef(mapping.output_var(2 * j), 1);
h.update_coef(mapping.input_var(2 * j), -1);
}
-
+
stmt[*i].xform = Composition(mapping, stmt[*i].xform);
stmt[*i].xform.simplify();
}
-
+
// get the permuation for dependence vectors
std::vector<int> t;
for (int i = 0; i < pi.size(); i++)
@@ -357,41 +359,41 @@ void Loop::permute(const std::set<int> &active, const std::vector<int> &pi) {
dep_pi[i] = t[i - min_dep_dim];
for (int i = max_dep_dim + 1; i < num_dep_dim; i++)
dep_pi[i] = i;
-
+
dep.permute(dep_pi, active);
-
+
// update the dependence graph
DependenceGraph g(dep.num_dim());
for (int i = 0; i < dep.vertex.size(); i++)
g.insert();
for (int i = 0; i < dep.vertex.size(); i++)
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[i].second.begin(); j != dep.vertex[i].second.end();
+ dep.vertex[i].second.begin(); j != dep.vertex[i].second.end();
j++) { //
if ((active.find(i) != active.end()
&& active.find(j->first) != active.end())) {
std::vector<DependenceVector> dv = j->second;
for (int k = 0; k < dv.size(); k++) {
switch (dv[k].type) {
- case DEP_W2R:
- case DEP_R2W:
- case DEP_W2W:
- case DEP_R2R: {
- std::vector<coef_t> lbounds(num_dep_dim);
- std::vector<coef_t> ubounds(num_dep_dim);
- for (int d = 0; d < num_dep_dim; d++) {
- lbounds[d] = dv[k].lbounds[dep_pi[d]];
- ubounds[d] = dv[k].ubounds[dep_pi[d]];
+ case DEP_W2R:
+ case DEP_R2W:
+ case DEP_W2W:
+ case DEP_R2R: {
+ std::vector<coef_t> lbounds(num_dep_dim);
+ std::vector<coef_t> ubounds(num_dep_dim);
+ for (int d = 0; d < num_dep_dim; d++) {
+ lbounds[d] = dv[k].lbounds[dep_pi[d]];
+ ubounds[d] = dv[k].ubounds[dep_pi[d]];
+ }
+ dv[k].lbounds = lbounds;
+ dv[k].ubounds = ubounds;
+ break;
}
- dv[k].lbounds = lbounds;
- dv[k].ubounds = ubounds;
- break;
- }
- case DEP_CONTROL: {
- break;
- }
- default:
- throw loop_error("unknown dependence type");
+ case DEP_CONTROL: {
+ break;
+ }
+ default:
+ throw loop_error("unknown dependence type");
}
}
g.connect(i, j->first, dv);
@@ -403,27 +405,27 @@ void Loop::permute(const std::set<int> &active, const std::vector<int> &pi) {
std::vector<DependenceVector> dv = j->second;
for (int k = 0; k < dv.size(); k++)
switch (dv[k].type) {
- case DEP_W2R:
- case DEP_R2W:
- case DEP_W2W:
- case DEP_R2R: {
- for (int d = 0; d < num_dep_dim; d++)
- if (dep_pi[d] != d) {
- dv[k].lbounds[d] = -posInfinity;
- dv[k].ubounds[d] = posInfinity;
- }
- break;
- }
- case DEP_CONTROL:
- break;
- default:
- throw loop_error("unknown dependence type");
+ case DEP_W2R:
+ case DEP_R2W:
+ case DEP_W2W:
+ case DEP_R2R: {
+ for (int d = 0; d < num_dep_dim; d++)
+ if (dep_pi[d] != d) {
+ dv[k].lbounds[d] = -posInfinity;
+ dv[k].ubounds[d] = posInfinity;
+ }
+ break;
+ }
+ case DEP_CONTROL:
+ break;
+ default:
+ throw loop_error("unknown dependence type");
}
g.connect(i, j->first, dv);
}
}
dep = g;
-
+
// update loop level information
for (std::set<int>::iterator i = active.begin(); i != active.end(); i++) {
int cur_dep_dim = min_dep_dim;
@@ -431,65 +433,65 @@ void Loop::permute(const std::set<int> &active, const std::vector<int> &pi) {
for (int j = 1; j <= stmt[*i].loop_level.size(); j++)
if (j >= level && j < level + pi.size()) {
switch (stmt[*i].loop_level[reverse_pi[j - level] - 1].type) {
- case LoopLevelOriginal:
- new_loop_level[j - 1].type = LoopLevelOriginal;
- new_loop_level[j - 1].payload = cur_dep_dim++;
- new_loop_level[j - 1].parallel_level =
- stmt[*i].loop_level[reverse_pi[j - level] - 1].parallel_level;
- break;
- case LoopLevelTile: {
- new_loop_level[j - 1].type = LoopLevelTile;
- int ref_level = stmt[*i].loop_level[reverse_pi[j - level]-1].payload;
- if (ref_level >= level && ref_level < level + pi.size())
- new_loop_level[j - 1].payload = reverse_pi[ref_level
- - level];
- else
- new_loop_level[j - 1].payload = ref_level;
- new_loop_level[j - 1].parallel_level =
- stmt[*i].loop_level[reverse_pi[j - level] - 1].parallel_level;
- break;
- }
- default:
- throw loop_error(
- "unknown loop level information for statement "
- + to_string(*i));
+ case LoopLevelOriginal:
+ new_loop_level[j - 1].type = LoopLevelOriginal;
+ new_loop_level[j - 1].payload = cur_dep_dim++;
+ new_loop_level[j - 1].parallel_level =
+ stmt[*i].loop_level[reverse_pi[j - level] - 1].parallel_level;
+ break;
+ case LoopLevelTile: {
+ new_loop_level[j - 1].type = LoopLevelTile;
+ int ref_level = stmt[*i].loop_level[reverse_pi[j - level] - 1].payload;
+ if (ref_level >= level && ref_level < level + pi.size())
+ new_loop_level[j - 1].payload = reverse_pi[ref_level
+ - level];
+ else
+ new_loop_level[j - 1].payload = ref_level;
+ new_loop_level[j - 1].parallel_level =
+ stmt[*i].loop_level[reverse_pi[j - level] - 1].parallel_level;
+ break;
+ }
+ default:
+ throw loop_error(
+ "unknown loop level information for statement "
+ + to_string(*i));
}
} else {
switch (stmt[*i].loop_level[j - 1].type) {
- case LoopLevelOriginal:
- new_loop_level[j - 1].type = LoopLevelOriginal;
- new_loop_level[j - 1].payload =
- stmt[*i].loop_level[j - 1].payload;
- new_loop_level[j - 1].parallel_level = stmt[*i].loop_level[j
- - 1].parallel_level;
- break;
- case LoopLevelTile: {
- new_loop_level[j - 1].type = LoopLevelTile;
- int ref_level = stmt[*i].loop_level[j - 1].payload;
- if (ref_level >= level && ref_level < level + pi.size())
- new_loop_level[j - 1].payload = reverse_pi[ref_level
- - level];
- else
- new_loop_level[j - 1].payload = ref_level;
- new_loop_level[j - 1].parallel_level = stmt[*i].loop_level[j
- - 1].parallel_level;
- break;
- }
- default:
- throw loop_error(
- "unknown loop level information for statement "
- + to_string(*i));
+ case LoopLevelOriginal:
+ new_loop_level[j - 1].type = LoopLevelOriginal;
+ new_loop_level[j - 1].payload =
+ stmt[*i].loop_level[j - 1].payload;
+ new_loop_level[j - 1].parallel_level = stmt[*i].loop_level[j
+ - 1].parallel_level;
+ break;
+ case LoopLevelTile: {
+ new_loop_level[j - 1].type = LoopLevelTile;
+ int ref_level = stmt[*i].loop_level[j - 1].payload;
+ if (ref_level >= level && ref_level < level + pi.size())
+ new_loop_level[j - 1].payload = reverse_pi[ref_level
+ - level];
+ else
+ new_loop_level[j - 1].payload = ref_level;
+ new_loop_level[j - 1].parallel_level = stmt[*i].loop_level[j
+ - 1].parallel_level;
+ break;
+ }
+ default:
+ throw loop_error(
+ "unknown loop level information for statement "
+ + to_string(*i));
}
}
stmt[*i].loop_level = new_loop_level;
}
-
+
setLexicalOrder(2 * level - 2, active);
}
-void Loop::set_array_size(std::string name, int size ){
- array_dims.insert(std::pair<std::string, int >(name, size));
+void Loop::set_array_size(std::string name, int size) {
+ array_dims.insert(std::pair<std::string, int>(name, size));
}
@@ -499,23 +501,23 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
throw std::invalid_argument("invalid statement " + to_string(stmt_num));
if (level <= 0 || level > stmt[stmt_num].loop_level.size())
throw std::invalid_argument("4invalid loop level " + to_string(level));
-
+
std::set<int> result;
int dim = 2 * level - 1;
std::vector<int> lex = getLexicalOrder(stmt_num);
std::set<int> same_loop = getStatements(lex, dim - 1);
-
+
Relation cond2 = copy(cond);
cond2.simplify();
cond2 = EQs_to_GEQs(cond2);
Conjunct *c = cond2.single_conjunct();
int cur_lex = lex[dim - 1];
-
+
for (GEQ_Iterator gi(c->GEQs()); gi; gi++) {
int max_level = (*gi).max_tuple_pos();
Relation single_cond(max_level);
single_cond.and_with_GEQ(*gi);
-
+
// TODO: should decide where to place newly created statements with
// complementary split condition from dependence graph.
bool place_after;
@@ -525,7 +527,7 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
place_after = true;
else
place_after = false;
-
+
bool temp_place_after; // = place_after;
bool assigned = false;
int part1_to_part2;
@@ -549,11 +551,11 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
Extend_Set(Complement(copy(single_cond)),
n - max_level));
}
-
+
//split dependence check
-
+
if (max_level > level) {
-
+
DNF_Iterator di1(stmt[*i].IS.query_DNF());
DNF_Iterator di2(part1.query_DNF());
for (; di1 && di2; di1++, di2++) {
@@ -569,34 +571,34 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
bool identical = false;
if (identical = !strcmp((*cvi1).var->char_name(),
(*cvi2).var->char_name())) {
-
+
for (; cvi1 && cvi2; cvi1++, cvi2++) {
-
+
if (((*cvi1).coef != (*cvi2).coef
|| (*ei1).get_const()
- != (*ei2).get_const())
+ != (*ei2).get_const())
|| (strcmp((*cvi1).var->char_name(),
(*cvi2).var->char_name()))) {
-
+
same++;
}
}
}
if ((same != 0) || !identical) {
-
+
dimension = dimension - 1;
-
+
while (stmt[*i].loop_level[dimension].type
== LoopLevelTile)
dimension =
- stmt[*i].loop_level[dimension].payload;
-
+ stmt[*i].loop_level[dimension].payload;
+
dimension = stmt[*i].loop_level[dimension].payload;
-
+
for (int i = 0; i < stmt.size(); i++) {
std::vector<std::pair<int, DependenceVector> > D;
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[i].second.begin();
+ dep.vertex[i].second.begin();
j != dep.vertex[i].second.end(); j++) {
for (int k = 0; k < j->second.size(); k++) {
DependenceVector dv = j->second[k];
@@ -604,19 +606,19 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
if (dv.hasNegative(dimension)
&& !dv.quasi)
throw loop_error(
- "loop error: Split is illegal, dependence violation!");
-
+ "loop error: Split is illegal, dependence violation!");
+
}
}
}
-
+
}
-
+
GEQ_Iterator gi1 = (*di1)->GEQs();
GEQ_Iterator gi2 = (*di2)->GEQs();
-
+
for (; gi1 && gi2; gi++, gi2++) {
-
+
Constr_Vars_Iter cvi1(*gi1);
Constr_Vars_Iter cvi2(*gi2);
int dimension = (*cvi1).var->get_position();
@@ -624,33 +626,33 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
bool identical = false;
if (identical = !strcmp((*cvi1).var->char_name(),
(*cvi2).var->char_name())) {
-
+
for (; cvi1 && cvi2; cvi1++, cvi2++) {
-
+
if (((*cvi1).coef != (*cvi2).coef
|| (*gi1).get_const()
- != (*gi2).get_const())
+ != (*gi2).get_const())
|| (strcmp((*cvi1).var->char_name(),
(*cvi2).var->char_name()))) {
-
+
same++;
}
}
}
if ((same != 0) || !identical) {
dimension = dimension - 1;
-
+
while (stmt[*i].loop_level[dimension].type
== LoopLevelTile)
stmt[*i].loop_level[dimension].payload;
-
+
dimension =
- stmt[*i].loop_level[dimension].payload;
-
+ stmt[*i].loop_level[dimension].payload;
+
for (int i = 0; i < stmt.size(); i++) {
std::vector<std::pair<int, DependenceVector> > D;
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[i].second.begin();
+ dep.vertex[i].second.begin();
j != dep.vertex[i].second.end();
j++) {
for (int k = 0; k < j->second.size();
@@ -659,22 +661,22 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
if (dv.type != DEP_CONTROL)
if (dv.hasNegative(dimension)
&& !dv.quasi)
-
+
throw loop_error(
- "loop error: Split is illegal, dependence violation!");
-
+ "loop error: Split is illegal, dependence violation!");
+
}
}
}
-
+
}
-
+
}
-
+
}
-
+
}
-
+
DNF_Iterator di3(stmt[*i].IS.query_DNF());
DNF_Iterator di4(part2.query_DNF()); //
for (; di3 && di4; di3++, di4++) {
@@ -688,52 +690,52 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
bool identical = false;
if (identical = !strcmp((*cvi1).var->char_name(),
(*cvi2).var->char_name())) {
-
+
for (; cvi1 && cvi2; cvi1++, cvi2++) {
-
+
if (((*cvi1).coef != (*cvi2).coef
|| (*ei1).get_const()
- != (*ei2).get_const())
+ != (*ei2).get_const())
|| (strcmp((*cvi1).var->char_name(),
(*cvi2).var->char_name()))) {
-
+
same++;
}
}
}
if ((same != 0) || !identical) {
dimension = dimension - 1;
-
+
while (stmt[*i].loop_level[dimension].type
== LoopLevelTile)
stmt[*i].loop_level[dimension].payload;
-
+
dimension = stmt[*i].loop_level[dimension].payload;
-
+
for (int i = 0; i < stmt.size(); i++) {
std::vector<std::pair<int, DependenceVector> > D;
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[i].second.begin();
+ dep.vertex[i].second.begin();
j != dep.vertex[i].second.end(); j++) {
for (int k = 0; k < j->second.size(); k++) {
DependenceVector dv = j->second[k];
if (dv.type != DEP_CONTROL)
if (dv.hasNegative(dimension)
&& !dv.quasi)
-
+
throw loop_error(
- "loop error: Split is illegal, dependence violation!");
-
+ "loop error: Split is illegal, dependence violation!");
+
}
}
}
-
+
}
-
+
}
GEQ_Iterator gi1 = (*di3)->GEQs();
GEQ_Iterator gi2 = (*di4)->GEQs();
-
+
for (; gi1 && gi2; gi++, gi2++) {
Constr_Vars_Iter cvi1(*gi1);
Constr_Vars_Iter cvi2(*gi2);
@@ -742,66 +744,66 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
bool identical = false;
if (identical = !strcmp((*cvi1).var->char_name(),
(*cvi2).var->char_name())) {
-
+
for (; cvi1 && cvi2; cvi1++, cvi2++) {
-
+
if (((*cvi1).coef != (*cvi2).coef
|| (*gi1).get_const()
- != (*gi2).get_const())
+ != (*gi2).get_const())
|| (strcmp((*cvi1).var->char_name(),
(*cvi2).var->char_name()))) {
-
+
same++;
}
}
}
if ((same != 0) || !identical) {
dimension = dimension - 1;
-
+
while (stmt[*i].loop_level[dimension].type //
== LoopLevelTile)
stmt[*i].loop_level[dimension].payload;
-
+
dimension = stmt[*i].loop_level[dimension].payload;
-
+
for (int i = 0; i < stmt.size(); i++) {
std::vector<std::pair<int, DependenceVector> > D;
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[i].second.begin();
+ dep.vertex[i].second.begin();
j != dep.vertex[i].second.end(); j++) {
for (int k = 0; k < j->second.size(); k++) {
DependenceVector dv = j->second[k];
if (dv.type != DEP_CONTROL)
if (dv.hasNegative(dimension)
&& !dv.quasi)
-
+
throw loop_error(
- "loop error: Split is illegal, dependence violation!");
-
+ "loop error: Split is illegal, dependence violation!");
+
}
}
}
-
+
}
-
+
}
-
+
}
-
+
}
-
+
stmt[*i].IS = part1;
-
+
int n1 = part2.n_set();
int m = this->known.n_set();
Relation test;
- if(m > n1)
+ if (m > n1)
test = Intersection(copy(this->known),
Extend_Set(copy(part2), m - part2.n_set()));
else
test = Intersection(copy(part2),
Extend_Set(copy(this->known), n1 - this->known.n_set()));
-
+
if (test.is_upper_bound_satisfiable()) {
Statement new_stmt;
new_stmt.code = stmt[*i].code->clone();
@@ -809,20 +811,20 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
new_stmt.xform = copy(stmt[*i].xform);
new_stmt.ir_stmt_node = NULL;
new_stmt.loop_level = stmt[*i].loop_level;
-
+
new_stmt.has_inspector = stmt[*i].has_inspector;
new_stmt.reduction = stmt[*i].reduction;
new_stmt.reductionOp = stmt[*i].reductionOp;
-
+
stmt_nesting_level_.push_back(stmt_nesting_level_[*i]);
-
-
+
+
if (place_after)
assign_const(new_stmt.xform, dim - 1, cur_lex + 1);
else
assign_const(new_stmt.xform, dim - 1, cur_lex - 1);
-
- fprintf(stderr, "loop_basic.cc L828 adding stmt %d\n", stmt.size());
+
+ fprintf(stderr, "loop_basic.cc L828 adding stmt %d\n", stmt.size());
stmt.push_back(new_stmt);
uninterpreted_symbols.push_back(uninterpreted_symbols[stmt_num]);
@@ -832,7 +834,7 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
if (*i == stmt_num)
result.insert(stmt.size() - 1);
}
-
+
}
// make adjacent lexical number available for new statements
if (place_after) {
@@ -846,20 +848,20 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
int dep_dim = get_dep_dim_of(stmt_num, level);
for (int i = 0; i < old_num_stmt; i++) {
std::vector<std::pair<int, std::vector<DependenceVector> > > D;
-
+
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[i].second.begin();
+ dep.vertex[i].second.begin();
j != dep.vertex[i].second.end(); j++) {
if (same_loop.find(i) != same_loop.end()) {
if (same_loop.find(j->first) != same_loop.end()) {
if (what_stmt_num.find(i) != what_stmt_num.end()
&& what_stmt_num.find(j->first)
- != what_stmt_num.end())
+ != what_stmt_num.end())
dep.connect(what_stmt_num[i],
what_stmt_num[j->first], j->second);
if (place_after
&& what_stmt_num.find(j->first)
- != what_stmt_num.end()) {
+ != what_stmt_num.end()) {
std::vector<DependenceVector> dvs;
for (int k = 0; k < j->second.size(); k++) {
DependenceVector dv = j->second[k];
@@ -871,11 +873,11 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
}
if (dvs.size() > 0)
D.push_back(
- std::make_pair(what_stmt_num[j->first],
- dvs));
+ std::make_pair(what_stmt_num[j->first],
+ dvs));
} else if (!place_after
&& what_stmt_num.find(i)
- != what_stmt_num.end()) {
+ != what_stmt_num.end()) {
std::vector<DependenceVector> dvs;
for (int k = 0; k < j->second.size(); k++) {
DependenceVector dv = j->second[k];
@@ -887,7 +889,7 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
}
if (dvs.size() > 0)
dep.connect(what_stmt_num[i], j->first, dvs);
-
+
}
} else {
if (what_stmt_num.find(i) != what_stmt_num.end())
@@ -896,17 +898,17 @@ std::set<int> Loop::split(int stmt_num, int level, const Relation &cond) {
} else if (same_loop.find(j->first) != same_loop.end()) {
if (what_stmt_num.find(j->first) != what_stmt_num.end())
D.push_back(
- std::make_pair(what_stmt_num[j->first],
- j->second));
+ std::make_pair(what_stmt_num[j->first],
+ j->second));
}
}
-
+
for (int j = 0; j < D.size(); j++)
dep.connect(i, D[j].first, D[j].second);
}
-
+
}
-
+
return result;
}
@@ -914,28 +916,28 @@ void Loop::skew(const std::set<int> &stmt_nums, int level,
const std::vector<int> &skew_amount) {
if (stmt_nums.size() == 0)
return;
-
+
// check for sanity of parameters
int ref_stmt_num = *(stmt_nums.begin());
for (std::set<int>::const_iterator i = stmt_nums.begin();
i != stmt_nums.end(); i++) {
if (*i < 0 || *i >= stmt.size())
throw std::invalid_argument(
- "invalid statement number " + to_string(*i));
+ "invalid statement number " + to_string(*i));
if (level < 1 || level > stmt[*i].loop_level.size())
throw std::invalid_argument(
- "5invalid loop level " + to_string(level));
+ "5invalid loop level " + to_string(level));
for (int j = stmt[*i].loop_level.size(); j < skew_amount.size(); j++)
if (skew_amount[j] != 0)
throw std::invalid_argument("invalid skewing formula");
}
-
+
// invalidate saved codegen computation
delete last_compute_cgr_;
last_compute_cgr_ = NULL;
delete last_compute_cg_;
last_compute_cg_ = NULL;
-
+
// set trasformation relations
for (std::set<int>::const_iterator i = stmt_nums.begin();
i != stmt_nums.end(); i++) {
@@ -953,18 +955,18 @@ void Loop::skew(const std::set<int> &stmt_nums, int level,
for (int j = 0; j < skew_amount.size(); j++)
if (skew_amount[j] != 0)
h.update_coef(r.input_var(2 * (j + 1)), skew_amount[j]);
-
+
stmt[*i].xform = Composition(r, stmt[*i].xform);
stmt[*i].xform.simplify();
}
-
+
// update dependence graph
if (stmt[ref_stmt_num].loop_level[level - 1].type == LoopLevelOriginal) {
int dep_dim = stmt[ref_stmt_num].loop_level[level - 1].payload;
for (std::set<int>::const_iterator i = stmt_nums.begin();
i != stmt_nums.end(); i++)
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[*i].second.begin();
+ dep.vertex[*i].second.begin();
j != dep.vertex[*i].second.end(); j++)
if (stmt_nums.find(j->first) != stmt_nums.end()) {
// dependence between skewed statements
@@ -984,7 +986,7 @@ void Loop::skew(const std::set<int> &stmt_nums, int level,
else {
if (cur_dep_dim != -1
&& !(dv.lbounds[cur_dep_dim] == 0
- && dv.ubounds[cur_dep_dim]== 0))
+ && dv.ubounds[cur_dep_dim] == 0))
lb = -posInfinity;
}
if (ub != posInfinity
@@ -1022,24 +1024,24 @@ void Loop::skew(const std::set<int> &stmt_nums, int level,
}
dv.lbounds[dep_dim] = lb;
dv.ubounds[dep_dim] = ub;
- if ((dv.isCarried(dep_dim) && dv.hasPositive(dep_dim))
+ if ((dv.isCarried(dep_dim) && dv.hasPositive(dep_dim))
&& dv.quasi)
dv.quasi = false;
-
- if ((dv.isCarried(dep_dim) && dv.hasNegative(dep_dim))
+
+ if ((dv.isCarried(dep_dim) && dv.hasNegative(dep_dim))
&& !dv.quasi)
throw loop_error(
- "loop error: Skewing is illegal, dependence violation!");
+ "loop error: Skewing is illegal, dependence violation!");
dv.lbounds[dep_dim] = lb;
dv.ubounds[dep_dim] = ub;
if ((dv.isCarried(dep_dim)
&& dv.hasPositive(dep_dim)) && dv.quasi)
dv.quasi = false;
-
+
if ((dv.isCarried(dep_dim)
&& dv.hasNegative(dep_dim)) && !dv.quasi)
throw loop_error(
- "loop error: Skewing is illegal, dependence violation!");
+ "loop error: Skewing is illegal, dependence violation!");
}
}
j->second = dvs;
@@ -1059,7 +1061,7 @@ void Loop::skew(const std::set<int> &stmt_nums, int level,
for (int i = 0; i < dep.vertex.size(); i++)
if (stmt_nums.find(i) == stmt_nums.end())
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[i].second.begin();
+ dep.vertex[i].second.begin();
j != dep.vertex[i].second.end(); j++)
if (stmt_nums.find(j->first) != stmt_nums.end()) {
// dependence from unskewed statement to skewed statement becomes jumbled,
@@ -1081,34 +1083,34 @@ void Loop::skew(const std::set<int> &stmt_nums, int level,
void Loop::shift(const std::set<int> &stmt_nums, int level, int shift_amount) {
if (stmt_nums.size() == 0)
return;
-
+
// check for sanity of parameters
int ref_stmt_num = *(stmt_nums.begin());
for (std::set<int>::const_iterator i = stmt_nums.begin();
i != stmt_nums.end(); i++) {
if (*i < 0 || *i >= stmt.size())
throw std::invalid_argument(
- "invalid statement number " + to_string(*i));
+ "invalid statement number " + to_string(*i));
if (level < 1 || level > stmt[*i].loop_level.size())
throw std::invalid_argument(
- "6invalid loop level " + to_string(level));
+ "6invalid loop level " + to_string(level));
}
-
+
// do nothing
if (shift_amount == 0)
return;
-
+
// invalidate saved codegen computation
delete last_compute_cgr_;
last_compute_cgr_ = NULL;
delete last_compute_cg_;
last_compute_cg_ = NULL;
-
+
// set trasformation relations
for (std::set<int>::const_iterator i = stmt_nums.begin();
i != stmt_nums.end(); i++) {
int n = stmt[*i].xform.n_out();
-
+
Relation r(n, n);
F_And *f_root = r.add_and();
for (int j = 1; j <= n; j++) {
@@ -1118,18 +1120,18 @@ void Loop::shift(const std::set<int> &stmt_nums, int level, int shift_amount) {
if (j == 2 * level)
h.update_const(shift_amount);
}
-
+
stmt[*i].xform = Composition(r, stmt[*i].xform);
stmt[*i].xform.simplify();
}
-
+
// update dependence graph
if (stmt[ref_stmt_num].loop_level[level - 1].type == LoopLevelOriginal) {
int dep_dim = stmt[ref_stmt_num].loop_level[level - 1].payload;
for (std::set<int>::const_iterator i = stmt_nums.begin();
i != stmt_nums.end(); i++)
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[*i].second.begin();
+ dep.vertex[*i].second.begin();
j != dep.vertex[*i].second.end(); j++)
if (stmt_nums.find(j->first) == stmt_nums.end()) {
// dependence from shifted statement to unshifted statement
@@ -1148,7 +1150,7 @@ void Loop::shift(const std::set<int> &stmt_nums, int level, int shift_amount) {
for (int i = 0; i < dep.vertex.size(); i++)
if (stmt_nums.find(i) == stmt_nums.end())
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[i].second.begin();
+ dep.vertex[i].second.begin();
j != dep.vertex[i].second.end(); j++)
if (stmt_nums.find(j->first) != stmt_nums.end()) {
// dependence from unshifted statement to shifted statement
@@ -1180,35 +1182,36 @@ void Loop::reverse(const std::set<int> &stmt_nums, int level) {
void Loop::fuse(const std::set<int> &stmt_nums, int level) {
if (stmt_nums.size() == 0 || stmt_nums.size() == 1)
return;
-
+
// invalidate saved codegen computation
delete last_compute_cgr_;
last_compute_cgr_ = NULL;
delete last_compute_cg_;
last_compute_cg_ = NULL;
-
+
int dim = 2 * level - 1;
// check for sanity of parameters
std::vector<int> ref_lex;
int ref_stmt_num;
- apply_xform();
+ apply_xform();
for (std::set<int>::const_iterator i = stmt_nums.begin();
i != stmt_nums.end(); i++) {
if (*i < 0 || *i >= stmt.size()) {
- fprintf(stderr, "statement number %d should be in [0, %d)\n", *i, stmt.size());
+ fprintf(stderr, "statement number %d should be in [0, %d)\n", *i, stmt.size());
throw std::invalid_argument(
- "FUSE invalid statement number " + to_string(*i));
+ "FUSE invalid statement number " + to_string(*i));
}
if (level <= 0
- // || (level > (stmt[*i].xform.n_out() - 1) / 2
- // || level > stmt[*i].loop_level.size())
- ) {
+ // || (level > (stmt[*i].xform.n_out() - 1) / 2
+ // || level > stmt[*i].loop_level.size())
+ ) {
fprintf(stderr, "FUSE level %d ", level);
fprintf(stderr, "must be greater than zero and \n");
- fprintf(stderr, "must NOT be greater than (%d - 1)/2 == %d and\n", stmt[*i].xform.n_out(), (stmt[*i].xform.n_out() - 1) / 2);
+ fprintf(stderr, "must NOT be greater than (%d - 1)/2 == %d and\n", stmt[*i].xform.n_out(),
+ (stmt[*i].xform.n_out() - 1) / 2);
fprintf(stderr, "must NOT be greater than %d\n", stmt[*i].loop_level.size());
throw std::invalid_argument(
- "FUSE invalid loop level " + to_string(level));
+ "FUSE invalid loop level " + to_string(level));
}
if (ref_lex.size() == 0) {
ref_lex = getLexicalOrder(*i);
@@ -1218,11 +1221,11 @@ void Loop::fuse(const std::set<int> &stmt_nums, int level) {
for (int j = 0; j < dim - 1; j += 2)
if (lex[j] != ref_lex[j])
throw std::invalid_argument(
- "statements for fusion must be in the same level-"
- + to_string(level - 1) + " subloop");
+ "statements for fusion must be in the same level-"
+ + to_string(level - 1) + " subloop");
}
}
-
+
// collect lexicographical order values from to-be-fused statements
std::set<int> lex_values;
for (std::set<int>::const_iterator i = stmt_nums.begin();
@@ -1233,9 +1236,9 @@ void Loop::fuse(const std::set<int> &stmt_nums, int level) {
if (lex_values.size() == 1)
return;
// negative dependence would prevent fusion
-
+
int dep_dim = get_dep_dim_of(ref_stmt_num, level);
-
+
for (std::set<int>::iterator i = lex_values.begin(); i != lex_values.end();
i++) {
ref_lex[dim - 1] = *i;
@@ -1254,25 +1257,25 @@ void Loop::fuse(const std::set<int> &stmt_nums, int level) {
if (dvs[k].isCarried(dep_dim)
&& dvs[k].hasNegative(dep_dim))
throw loop_error(
- "loop error: statements " + to_string(*ii)
- + " and " + to_string(*jj)
- + " cannot be fused together due to negative dependence");
+ "loop error: statements " + to_string(*ii)
+ + " and " + to_string(*jj)
+ + " cannot be fused together due to negative dependence");
dvs = dep.getEdge(*jj, *ii);
for (int k = 0; k < dvs.size(); k++)
if (dvs[k].isCarried(dep_dim)
&& dvs[k].hasNegative(dep_dim))
throw loop_error(
- "loop error: statements " + to_string(*jj)
- + " and " + to_string(*ii)
- + " cannot be fused together due to negative dependence");
+ "loop error: statements " + to_string(*jj)
+ + " and " + to_string(*ii)
+ + " cannot be fused together due to negative dependence");
}
}
}
-
+
std::set<int> same_loop = getStatements(ref_lex, dim - 3);
-
+
std::vector<std::set<int> > s = sort_by_same_loops(same_loop, level);
-
+
std::vector<bool> s2;
for (int i = 0; i < s.size(); i++) {
@@ -1283,27 +1286,27 @@ void Loop::fuse(const std::set<int> &stmt_nums, int level) {
kk++)
for (int i = 0; i < s.size(); i++)
if (s[i].find(*kk) != s[i].end()) {
-
+
s2[i] = true;
}
-
+
try {
-
+
//Dependence Check for Ordering Constraint
//Graph<std::set<int>, bool> dummy = construct_induced_graph_at_level(s5,
// dep, dep_dim);
-
+
Graph<std::set<int>, bool> g = construct_induced_graph_at_level(s, dep,
dep_dim);
std::cout << g;
s = typed_fusion(g, s2);
} catch (const loop_error &e) {
-
+
throw loop_error(
- "statements cannot be fused together due to negative dependence");
-
+ "statements cannot be fused together due to negative dependence");
+
}
-
+
int order = 0;
for (int i = 0; i < s.size(); i++) {
for (std::set<int>::iterator it = s[i].begin(); it != s[i].end(); it++) {
@@ -1314,7 +1317,7 @@ void Loop::fuse(const std::set<int> &stmt_nums, int level) {
//plan for selective typed fusion
-
+
/*
1. sort the lex values of the statements
2. construct induced graph on sorted statements
@@ -1419,7 +1422,6 @@ void Loop::fuse(const std::set<int> &stmt_nums, int level) {
}
-
void Loop::distribute(const std::set<int> &stmt_nums, int level) {
if (stmt_nums.size() == 0 || stmt_nums.size() == 1)
return;
@@ -1439,13 +1441,13 @@ void Loop::distribute(const std::set<int> &stmt_nums, int level) {
i != stmt_nums.end(); i++) {
if (*i < 0 || *i >= stmt.size())
throw std::invalid_argument(
- "invalid statement number " + to_string(*i));
-
+ "invalid statement number " + to_string(*i));
+
if (level < 1
|| (level > (stmt[*i].xform.n_out() - 1) / 2
|| level > stmt[*i].loop_level.size()))
throw std::invalid_argument(
- "8invalid loop level " + to_string(level));
+ "8invalid loop level " + to_string(level));
if (ref_lex.size() == 0) {
ref_lex = getLexicalOrder(*i);
ref_stmt_num = *i;
@@ -1454,8 +1456,8 @@ void Loop::distribute(const std::set<int> &stmt_nums, int level) {
for (int j = 0; j <= dim - 1; j += 2)
if (lex[j] != ref_lex[j])
throw std::invalid_argument(
- "statements for distribution must be in the same level-"
- + to_string(level) + " subloop");
+ "statements for distribution must be in the same level-"
+ + to_string(level) + " subloop");
}
}
@@ -1517,7 +1519,7 @@ void Loop::distribute(const std::set<int> &stmt_nums, int level) {
// nothing to distribute
if (s2.size() == 1)
throw loop_error(
- "loop error: no statement can be distributed due to dependence cycle");
+ "loop error: no statement can be distributed due to dependence cycle");
std::vector<std::set<int> > s3;
for (int i = 0; i < s2.size(); i++) {
std::set<int> t;
@@ -1564,16 +1566,14 @@ void Loop::distribute(const std::set<int> &stmt_nums, int level) {
order++;
}
// no need to update dependence graph
-
+
return;
}
-
-
std::vector<IR_ArrayRef *> FindOuterArrayRefs(IR_Code *ir,
std::vector<IR_ArrayRef *> &arr_refs) {
- std::vector<IR_ArrayRef *> to_return;
+ std::vector<IR_ArrayRef *> to_return;
for (int i = 0; i < arr_refs.size(); i++)
if (!ir->parent_is_array(arr_refs[i])) {
int j;
@@ -1587,38 +1587,36 @@ std::vector<IR_ArrayRef *> FindOuterArrayRefs(IR_Code *ir,
}
-
-
-
std::vector<std::vector<std::string> > constructInspectorVariables(IR_Code *ir,
- std::set<IR_ArrayRef *> &arr, std::vector<std::string> &index) {
-
- fprintf(stderr, "constructInspectorVariables()\n");
+ std::set<IR_ArrayRef *> &arr,
+ std::vector<std::string> &index) {
+
+ fprintf(stderr, "constructInspectorVariables()\n");
std::vector<std::vector<std::string> > to_return;
-
+
for (std::set<IR_ArrayRef *>::iterator i = arr.begin(); i != arr.end();
i++) {
-
+
std::vector<std::string> per_index;
-
+
CG_outputRepr *subscript = (*i)->index(0);
-
+
if ((*i)->n_dim() > 1)
throw ir_error(
- "multi-dimensional array support non-existent for flattening currently");
-
+ "multi-dimensional array support non-existent for flattening currently");
+
while (ir->QueryExpOperation(subscript) == IR_OP_ARRAY_VARIABLE) {
-
+
std::vector<CG_outputRepr *> v = ir->QueryExpOperand(subscript);
-
+
IR_ArrayRef *ref = static_cast<IR_ArrayRef *>(ir->Repr2Ref(v[0]));
//per_index.push_back(ref->name());
-
+
subscript = ref->index(0);
-
+
}
-
+
if (ir->QueryExpOperation(subscript) == IR_OP_VARIABLE) {
std::vector<CG_outputRepr *> v = ir->QueryExpOperand(subscript);
IR_ScalarRef *ref = static_cast<IR_ScalarRef *>(ir->Repr2Ref(v[0]));
@@ -1627,25 +1625,25 @@ std::vector<std::vector<std::string> > constructInspectorVariables(IR_Code *ir,
for (j = 0; j < index.size(); j++)
if (index[j] == ref->name())
break;
-
+
if (j == index.size())
throw ir_error("Non index variable in array expression");
-
+
int k;
for (k = 0; k < to_return.size(); k++)
if (to_return[k][0] == ref->name())
break;
- if (k == to_return.size()) {
+ if (k == to_return.size()) {
to_return.push_back(per_index);
- fprintf(stderr, "adding index %s\n", ref->name().c_str());
+ fprintf(stderr, "adding index %s\n", ref->name().c_str());
}
-
+
}
-
+
}
-
+
return to_return;
-
+
}
/*std::vector<CG_outputRepr *> constructInspectorData(IR_Code *ir, std::vector<std::vector<std::string> > &indices){
@@ -1669,99 +1667,99 @@ std::vector<std::vector<std::string> > constructInspectorVariables(IR_Code *ir,
*/
-CG_outputRepr * checkAndGenerateIndirectMappings(CG_outputBuilder * ocg,
- std::vector<std::vector<std::string> > &indices,
- CG_outputRepr * instance, CG_outputRepr * class_def,
- CG_outputRepr * count_var) {
-
+CG_outputRepr *checkAndGenerateIndirectMappings(CG_outputBuilder *ocg,
+ std::vector<std::vector<std::string> > &indices,
+ CG_outputRepr *instance, CG_outputRepr *class_def,
+ CG_outputRepr *count_var) {
+
CG_outputRepr *to_return = NULL;
-
+
for (int i = 0; i < indices.size(); i++)
if (indices[i].size() > 1) {
std::string index = indices[i][indices[i].size() - 1];
CG_outputRepr *rep = ocg->CreateArrayRefExpression(
- ocg->CreateDotExpression(instance,
- ocg->lookup_member_data(class_def, index, instance)),
- count_var);
+ ocg->CreateDotExpression(instance,
+ ocg->lookup_member_data(class_def, index, instance)),
+ count_var);
for (int j = indices[i].size() - 2; j >= 0; j--)
rep = ocg->CreateArrayRefExpression(indices[i][j], rep);
-
+
CG_outputRepr *lhs = ocg->CreateArrayRefExpression(
- ocg->CreateDotExpression(instance,
- ocg->lookup_member_data(class_def, indices[i][0], instance)),
- count_var);
-
+ ocg->CreateDotExpression(instance,
+ ocg->lookup_member_data(class_def, indices[i][0], instance)),
+ count_var);
+
to_return = ocg->StmtListAppend(to_return,
ocg->CreateAssignment(0, lhs, rep));
-
+
}
-
+
return to_return;
-
+
}
CG_outputRepr *generatePointerAssignments(CG_outputBuilder *ocg,
std::string prefix_name,
std::vector<std::vector<std::string> > &indices,
- CG_outputRepr *instance,
+ CG_outputRepr *instance,
CG_outputRepr *class_def) {
-
+
fprintf(stderr, "generatePointerAssignments()\n");
CG_outputRepr *list = NULL;
- fprintf(stderr, "prefix '%s', %d indices\n", prefix_name.c_str(), indices.size());
+ fprintf(stderr, "prefix '%s', %d indices\n", prefix_name.c_str(), indices.size());
for (int i = 0; i < indices.size(); i++) {
-
+
std::string s = prefix_name + "_" + indices[i][0];
- fprintf(stderr, "s %s\n", s.c_str());
-
+ fprintf(stderr, "s %s\n", s.c_str());
+
// create a variable definition for a pointer to int with this name
// that seems to be the only actual result of this routine ...
//chillAST_VarDecl *vd = new chillAST_VarDecl( "int", prefix_name.c_str(), "*", NULL);
//vd->print(); printf("\n"); fflush(stdout);
//vd->dump(); printf("\n"); fflush(stdout);
-
+
CG_outputRepr *ptr_exp = ocg->CreatePointer(s); // but dropped on the floor. unused
//fprintf(stderr, "ptr_exp created\n");
-
+
//CG_outputRepr *rhs = ocg->CreateDotExpression(instance,
// ocg->lookup_member_data(class_def, indices[i][0], instance));
-
+
//CG_outputRepr *ptr_assignment = ocg->CreateAssignment(0, ptr_exp, rhs);
-
+
//list = ocg->StmtListAppend(list, ptr_assignment);
-
+
}
-
+
fprintf(stderr, "generatePointerAssignments() DONE\n\n");
return list;
}
void Loop::normalize(int stmt_num, int loop_level) {
-
+
if (stmt_num < 0 || stmt_num >= stmt.size())
throw std::invalid_argument(
-
- "invalid statement number " + to_string(stmt_num));
-
+
+ "invalid statement number " + to_string(stmt_num));
+
if (loop_level <= 0)
throw std::invalid_argument(
- "12invalid loop level " + to_string(loop_level));
+ "12invalid loop level " + to_string(loop_level));
if (loop_level > stmt[stmt_num].loop_level.size())
throw std::invalid_argument(
- "there is no loop level " + to_string(loop_level)
- + " for statement " + to_string(stmt_num));
-
+ "there is no loop level " + to_string(loop_level)
+ + " for statement " + to_string(stmt_num));
+
apply_xform(stmt_num);
-
+
Relation r = copy(stmt[stmt_num].IS);
-
+
Relation bound = get_loop_bound(r, loop_level, this->known);
if (!bound.has_single_conjunct() || !bound.is_satisfiable()
|| bound.is_tautology())
throw loop_error("unable to extract loop bound for normalize");
-
+
// extract the loop stride
coef_t stride;
std::pair<EQ_Handle, Variable_ID> result = find_simplest_stride(bound,
@@ -1770,31 +1768,31 @@ void Loop::normalize(int stmt_num, int loop_level) {
stride = 1;
else
stride = abs(result.first.get_coef(result.second))
- / gcd(abs(result.first.get_coef(result.second)),
- abs(result.first.get_coef(bound.set_var(loop_level))));
-
+ / gcd(abs(result.first.get_coef(result.second)),
+ abs(result.first.get_coef(bound.set_var(loop_level))));
+
if (stride != 1)
throw loop_error(
- "normalize currently only handles unit stride, non unit stride present in loop bounds");
-
+ "normalize currently only handles unit stride, non unit stride present in loop bounds");
+
GEQ_Handle lb;
-
+
Conjunct *c = bound.query_DNF()->single_conjunct();
for (GEQ_Iterator gi(c->GEQs()); gi; gi++) {
int coef = (*gi).get_coef(bound.set_var(loop_level));
if (coef > 0)
lb = *gi;
}
-
+
//Loop bound already zero
//Nothing to do.
if (lb.is_const(bound.set_var(loop_level)) && lb.get_const() == 0)
return;
-
+
if (lb.is_const_except_for_global(bound.set_var(loop_level))) {
-
+
int n = stmt[stmt_num].xform.n_out();
-
+
Relation r(n, n);
F_And *f_root = r.add_and();
for (int j = 1; j <= n; j++)
@@ -1803,10 +1801,10 @@ void Loop::normalize(int stmt_num, int loop_level) {
h.update_coef(r.input_var(j), 1);
h.update_coef(r.output_var(j), -1);
}
-
+
stmt[stmt_num].xform = Composition(r, stmt[stmt_num].xform);
stmt[stmt_num].xform.simplify();
-
+
for (Constr_Vars_Iter ci(lb); ci; ci++) {
if ((*ci).var->kind() == Global_Var) {
Global_Var_ID g = (*ci).var->get_global_var();
@@ -1816,24 +1814,24 @@ void Loop::normalize(int stmt_num, int loop_level) {
else
v = stmt[stmt_num].xform.get_local(g,
(*ci).var->function_of());
-
+
F_And *f_super_root = stmt[stmt_num].xform.and_with_and();
F_Exists *f_exists = f_super_root->add_exists();
F_And *f_root = f_exists->add_and();
-
+
EQ_Handle h = f_root->add_EQ();
h.update_coef(stmt[stmt_num].xform.output_var(2 * loop_level),
1);
h.update_coef(stmt[stmt_num].xform.input_var(loop_level), -1);
h.update_coef(v, 1);
-
+
stmt[stmt_num].xform.simplify();
}
-
+
}
-
+
} else
throw loop_error("loop bounds too complex for normalize!");
-
+
}
diff --git a/src/transformations/loop_datacopy.cc b/src/transformations/loop_datacopy.cc
index 12d74fd..69fbd5b 100644
--- a/src/transformations/loop_datacopy.cc
+++ b/src/transformations/loop_datacopy.cc
@@ -27,7 +27,8 @@ using namespace omega;
// parameter array_ref_num=[0,2] means to copy data touched by A[i-1] and A[i]
//
bool Loop::datacopy(const std::vector<std::pair<int, std::vector<int> > > &array_ref_nums, int level,
- bool allow_extra_read, int fastest_changing_dimension, int padding_stride, int padding_alignment, int memory_type) {
+ bool allow_extra_read, int fastest_changing_dimension, int padding_stride, int padding_alignment,
+ int memory_type) {
//fprintf(stderr, "Loop::datacopy()\n");
// check for sanity of parameters
@@ -40,18 +41,17 @@ bool Loop::datacopy(const std::vector<std::pair<int, std::vector<int> > > &array
throw std::invalid_argument("invalid loop level " + to_string(level));
if (i == 0) {
std::vector<int> lex = getLexicalOrder(stmt_num);
- same_loop = getStatements(lex, 2*level-2);
- }
- else if (same_loop.find(stmt_num) == same_loop.end())
+ same_loop = getStatements(lex, 2 * level - 2);
+ } else if (same_loop.find(stmt_num) == same_loop.end())
throw std::invalid_argument("array references for data copy must be located in the same subloop");
}
-
+
// convert array reference numbering scheme to actual array references
std::vector<std::pair<int, std::vector<IR_ArrayRef *> > > selected_refs;
for (int i = 0; i < array_ref_nums.size(); i++) {
if (array_ref_nums[i].second.size() == 0)
continue;
-
+
int stmt_num = array_ref_nums[i].first;
selected_refs.push_back(std::make_pair(stmt_num, std::vector<IR_ArrayRef *>()));
std::vector<IR_ArrayRef *> refs = ir->FindArrayRef(stmt[stmt_num].code);
@@ -61,9 +61,10 @@ bool Loop::datacopy(const std::vector<std::pair<int, std::vector<int> > > &array
if (ref_num < 0 || ref_num >= refs.size()) {
for (int k = 0; k < refs.size(); k++)
delete refs[k];
- throw std::invalid_argument("invalid array reference number " + to_string(ref_num) + " in statement " + to_string(stmt_num));
+ throw std::invalid_argument(
+ "invalid array reference number " + to_string(ref_num) + " in statement " + to_string(stmt_num));
}
- selected_refs[selected_refs.size()-1].second.push_back(refs[ref_num]);
+ selected_refs[selected_refs.size() - 1].second.push_back(refs[ref_num]);
selected[ref_num] = true;
}
for (int j = 0; j < refs.size(); j++)
@@ -72,9 +73,10 @@ bool Loop::datacopy(const std::vector<std::pair<int, std::vector<int> > > &array
}
if (selected_refs.size() == 0)
throw std::invalid_argument("found no array references to copy");
-
+
// do the copy
- bool whatever = datacopy_privatized(selected_refs, level, std::vector<int>(), allow_extra_read, fastest_changing_dimension, padding_stride, padding_alignment, memory_type);
+ bool whatever = datacopy_privatized(selected_refs, level, std::vector<int>(), allow_extra_read,
+ fastest_changing_dimension, padding_stride, padding_alignment, memory_type);
return whatever;
}
@@ -84,9 +86,10 @@ bool Loop::datacopy(const std::vector<std::pair<int, std::vector<int> > > &array
// parameter array_name=A means to copy data touched by A[i-1] and A[i]
//
bool Loop::datacopy(int stmt_num, int level, const std::string &array_name,
- bool allow_extra_read, int fastest_changing_dimension, int padding_stride, int padding_alignment, int memory_type) {
+ bool allow_extra_read, int fastest_changing_dimension, int padding_stride, int padding_alignment,
+ int memory_type) {
- fflush(stdout);
+ fflush(stdout);
//fprintf(stderr, "Loop::datacopy2()\n");
//fprintf(stderr, "array name %s stmt num %d\n", array_name.c_str(), stmt_num);
@@ -95,23 +98,23 @@ bool Loop::datacopy(int stmt_num, int level, const std::string &array_name,
throw std::invalid_argument("invalid statement number " + to_string(stmt_num));
if (level <= 0 || level > stmt[stmt_num].loop_level.size())
throw std::invalid_argument("invalid loop level " + to_string(level));
-
+
// collect array references by name
std::vector<int> lex = getLexicalOrder(stmt_num);
- int dim = 2*level - 1;
- std::set<int> same_loop = getStatements(lex, dim-1);
-
+ int dim = 2 * level - 1;
+ std::set<int> same_loop = getStatements(lex, dim - 1);
+
std::vector<std::pair<int, std::vector<IR_ArrayRef *> > > selected_refs;
for (std::set<int>::iterator i = same_loop.begin(); i != same_loop.end(); i++) {
std::vector<IR_ArrayRef *> t;
- std::vector<IR_ArrayRef *> refs = ir->FindArrayRef(stmt[*i].code);
+ std::vector<IR_ArrayRef *> refs = ir->FindArrayRef(stmt[*i].code);
for (int j = 0; j < refs.size(); j++)
if (refs[j]->name() == array_name)
t.push_back(refs[j]);
else
delete refs[j];
if (t.size() != 0)
- selected_refs.push_back(std::make_pair(*i, t));
+ selected_refs.push_back(std::make_pair(*i, t));
}
//fprintf(stderr, "selected refs:\n");
@@ -122,27 +125,30 @@ bool Loop::datacopy(int stmt_num, int level, const std::string &array_name,
if (selected_refs.size() == 0)
throw std::invalid_argument("found no array references with name " + to_string(array_name) + " to copy");
-
+
IR_ArrayRef *AR = selected_refs[0].second[0];
//IR_roseArrayRef *RAR = (IR_roseArrayRef *)AR;
//fprintf(stderr, "before datacopy_privatized, ");
//AR->Dump();
-
+
// do the copy
//fprintf(stderr, "\nLoop::datacopy2 calling privatized\n");
- bool whatever = datacopy_privatized(selected_refs, level, std::vector<int>(), allow_extra_read, fastest_changing_dimension, padding_stride, padding_alignment, memory_type);
+ bool whatever = datacopy_privatized(selected_refs, level, std::vector<int>(), allow_extra_read,
+ fastest_changing_dimension, padding_stride, padding_alignment, memory_type);
//AR = selected_refs[0].second[0];
//fprintf(stderr, "after datacopy_privatized, ");
//AR->Dump();
-
+
return whatever;
}
-bool Loop::datacopy_privatized(int stmt_num, int level, const std::string &array_name, const std::vector<int> &privatized_levels,
- bool allow_extra_read, int fastest_changing_dimension, int padding_stride, int padding_alignment, int memory_type) {
+bool Loop::datacopy_privatized(int stmt_num, int level, const std::string &array_name,
+ const std::vector<int> &privatized_levels,
+ bool allow_extra_read, int fastest_changing_dimension, int padding_stride,
+ int padding_alignment, int memory_type) {
//fprintf(stderr, "Loop::datacopy_privatized()\n");
// check for sanity of parameters
@@ -150,33 +156,37 @@ bool Loop::datacopy_privatized(int stmt_num, int level, const std::string &array
throw std::invalid_argument("invalid statement number " + to_string(stmt_num));
if (level <= 0 || level > stmt[stmt_num].loop_level.size())
throw std::invalid_argument("invalid loop level " + to_string(level));
-
+
// collect array references by name
std::vector<int> lex = getLexicalOrder(stmt_num);
- int dim = 2*level - 1;
- std::set<int> same_loop = getStatements(lex, dim-1);
-
+ int dim = 2 * level - 1;
+ std::set<int> same_loop = getStatements(lex, dim - 1);
+
std::vector<std::pair<int, std::vector<IR_ArrayRef *> > > selected_refs;
for (std::set<int>::iterator i = same_loop.begin(); i != same_loop.end(); i++) {
selected_refs.push_back(std::make_pair(*i, std::vector<IR_ArrayRef *>()));
-
- std::vector<IR_ArrayRef *> refs = ir->FindArrayRef(stmt[*i].code);
+
+ std::vector<IR_ArrayRef *> refs = ir->FindArrayRef(stmt[*i].code);
for (int j = 0; j < refs.size(); j++)
if (refs[j]->name() == array_name)
- selected_refs[selected_refs.size()-1].second.push_back(refs[j]);
+ selected_refs[selected_refs.size() - 1].second.push_back(refs[j]);
else
delete refs[j];
}
if (selected_refs.size() == 0)
throw std::invalid_argument("found no array references with name " + to_string(array_name) + " to copy");
-
+
// do the copy
- bool whatever = datacopy_privatized(selected_refs, level, privatized_levels, allow_extra_read, fastest_changing_dimension, padding_stride, padding_alignment, memory_type);
+ bool whatever = datacopy_privatized(selected_refs, level, privatized_levels, allow_extra_read,
+ fastest_changing_dimension, padding_stride, padding_alignment, memory_type);
return whatever;
}
-bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<int> > > &array_ref_nums, int level, const std::vector<int> &privatized_levels, bool allow_extra_read, int fastest_changing_dimension, int padding_stride, int padding_alignment, int memory_type) {
+bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<int> > > &array_ref_nums, int level,
+ const std::vector<int> &privatized_levels, bool allow_extra_read,
+ int fastest_changing_dimension, int padding_stride, int padding_alignment,
+ int memory_type) {
//fprintf(stderr, "Loop::datacopy_privatized2()\n");
// check for sanity of parameters
@@ -189,18 +199,17 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<int>
throw std::invalid_argument("invalid loop level " + to_string(level));
if (i == 0) {
std::vector<int> lex = getLexicalOrder(stmt_num);
- same_loop = getStatements(lex, 2*level-2);
- }
- else if (same_loop.find(stmt_num) == same_loop.end())
+ same_loop = getStatements(lex, 2 * level - 2);
+ } else if (same_loop.find(stmt_num) == same_loop.end())
throw std::invalid_argument("array references for data copy must be located in the same subloop");
}
-
+
// convert array reference numbering scheme to actual array references
std::vector<std::pair<int, std::vector<IR_ArrayRef *> > > selected_refs;
for (int i = 0; i < array_ref_nums.size(); i++) {
if (array_ref_nums[i].second.size() == 0)
continue;
-
+
int stmt_num = array_ref_nums[i].first;
selected_refs.push_back(std::make_pair(stmt_num, std::vector<IR_ArrayRef *>()));
std::vector<IR_ArrayRef *> refs = ir->FindArrayRef(stmt[stmt_num].code);
@@ -210,9 +219,10 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<int>
if (ref_num < 0 || ref_num >= refs.size()) {
for (int k = 0; k < refs.size(); k++)
delete refs[k];
- throw std::invalid_argument("invalid array reference number " + to_string(ref_num) + " in statement " + to_string(stmt_num));
+ throw std::invalid_argument(
+ "invalid array reference number " + to_string(ref_num) + " in statement " + to_string(stmt_num));
}
- selected_refs[selected_refs.size()-1].second.push_back(refs[ref_num]);
+ selected_refs[selected_refs.size() - 1].second.push_back(refs[ref_num]);
selected[ref_num] = true;
}
for (int j = 0; j < refs.size(); j++)
@@ -221,10 +231,11 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<int>
}
if (selected_refs.size() == 0)
throw std::invalid_argument("found no array references to copy");
-
+
// do the copy
- bool whatever = datacopy_privatized(selected_refs, level, privatized_levels, allow_extra_read, fastest_changing_dimension, padding_stride, padding_alignment, memory_type);
- return whatever;
+ bool whatever = datacopy_privatized(selected_refs, level, privatized_levels, allow_extra_read,
+ fastest_changing_dimension, padding_stride, padding_alignment, memory_type);
+ return whatever;
}
@@ -232,13 +243,13 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<int>
// Implement low level datacopy function with lots of options.
//
-bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_ArrayRef *> > > &stmt_refs,
+bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_ArrayRef *> > > &stmt_refs,
int level,
const std::vector<int> &privatized_levels,
- bool allow_extra_read,
+ bool allow_extra_read,
int fastest_changing_dimension,
- int padding_stride,
- int padding_alignment,
+ int padding_stride,
+ int padding_alignment,
int memory_type) {
//fprintf(stderr, "\nLoop::datacopy_privatized3() *****\n");
@@ -247,7 +258,7 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
if (stmt_refs.size() == 0)
return true;
-
+
// check for sanity of parameters
IR_ArraySymbol *sym = NULL;
std::vector<int> lex;
@@ -258,8 +269,7 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
if (i == 0) {
if (privatized_levels[i] < level)
throw std::invalid_argument("privatized loop levels must be no less than level " + to_string(level));
- }
- else if (privatized_levels[i] <= privatized_levels[i-1])
+ } else if (privatized_levels[i] <= privatized_levels[i - 1])
throw std::invalid_argument("privatized loop levels must be in ascending order");
}
for (int i = 0; i < stmt_refs.size(); i++) {
@@ -268,10 +278,11 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
if (stmt_num < 0 || stmt_num >= stmt.size())
throw std::invalid_argument("invalid statement number " + to_string(stmt_num));
if (privatized_levels.size() != 0) {
- if (privatized_levels[privatized_levels.size()-1] > stmt[stmt_num].loop_level.size())
- throw std::invalid_argument("invalid loop level " + to_string(privatized_levels[privatized_levels.size()-1]) + " for statement " + to_string(stmt_num));
- }
- else {
+ if (privatized_levels[privatized_levels.size() - 1] > stmt[stmt_num].loop_level.size())
+ throw std::invalid_argument(
+ "invalid loop level " + to_string(privatized_levels[privatized_levels.size() - 1]) + " for statement " +
+ to_string(stmt_num));
+ } else {
if (level > stmt[stmt_num].loop_level.size())
throw std::invalid_argument("invalid loop level " + to_string(level) + " for statement " + to_string(stmt_num));
}
@@ -279,8 +290,7 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
if (sym == NULL) {
sym = stmt_refs[i].second[j]->symbol();
lex = getLexicalOrder(stmt_num);
- }
- else {
+ } else {
IR_ArraySymbol *t = stmt_refs[i].second[j]->symbol();
if (t->name() != sym->name()) {
delete t;
@@ -293,8 +303,10 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
}
//fprintf(stderr, "sym %p\n", sym);
- if (!sym) {
- fprintf(stderr, "sym NULL, gonna die\n"); int *i=0; int j=i[0];
+ if (!sym) {
+ fprintf(stderr, "sym NULL, gonna die\n");
+ int *i = 0;
+ int j = i[0];
}
if (!(fastest_changing_dimension >= -1 && fastest_changing_dimension < sym->n_dim()))
@@ -303,31 +315,31 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
throw std::invalid_argument("invalid temporary array stride requirement");
if (padding_alignment == -1 || padding_alignment == 0)
throw std::invalid_argument("invalid temporary array alignment requirement");
-
- int dim = 2*level - 1;
+
+ int dim = 2 * level - 1;
int n_dim = sym->n_dim();
-
+
if (fastest_changing_dimension == -1)
switch (sym->layout_type()) {
- case IR_ARRAY_LAYOUT_ROW_MAJOR:
- fastest_changing_dimension = n_dim - 1;
- break;
- case IR_ARRAY_LAYOUT_COLUMN_MAJOR:
- fastest_changing_dimension = 0;
- break;
- default:
- throw loop_error("unsupported array layout");
+ case IR_ARRAY_LAYOUT_ROW_MAJOR:
+ fastest_changing_dimension = n_dim - 1;
+ break;
+ case IR_ARRAY_LAYOUT_COLUMN_MAJOR:
+ fastest_changing_dimension = 0;
+ break;
+ default:
+ throw loop_error("unsupported array layout");
}
// OK, parameter sanity checked
-
+
// invalidate saved codegen computation
delete last_compute_cgr_;
last_compute_cgr_ = NULL;
delete last_compute_cg_;
last_compute_cg_ = NULL;
-
+
// build iteration spaces for all reads and for all writes separately
//fprintf(stderr, "dp3: before apply_xform() ARRAY REFS\n");
//for (int i = 0; i < stmt_refs.size(); i++) {
@@ -360,29 +372,30 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
// fprintf(stderr, "\n");
//}
-
+
bool has_write_refs = false;
bool has_read_refs = false;
- Relation wo_copy_is = Relation::False(level-1+privatized_levels.size()+n_dim);
- Relation ro_copy_is = Relation::False(level-1+privatized_levels.size()+n_dim);
+ Relation wo_copy_is = Relation::False(level - 1 + privatized_levels.size() + n_dim);
+ Relation ro_copy_is = Relation::False(level - 1 + privatized_levels.size() + n_dim);
//fprintf(stderr, "\n\ni range: 0-%d\n", -1 + stmt_refs.size());
int stmt_num = stmt_refs[0].first;
for (int i = 0; i < stmt_refs.size(); i++) {
int stmt_num = stmt_refs[i].first;
-
+
//fprintf(stderr, "j range: 0-%d\n", -1 + stmt_refs[i].second.size());
for (int j = 0; j < stmt_refs[i].second.size(); j++) {
//fprintf(stderr, "ij %d %d\n", i, j);
- Relation mapping(stmt[stmt_num].IS.n_set(), level-1+privatized_levels.size()+n_dim);
+ Relation mapping(stmt[stmt_num].IS.n_set(), level - 1 + privatized_levels.size() + n_dim);
for (int k = 1; k <= mapping.n_inp(); k++)
mapping.name_input_var(k, stmt[stmt_num].IS.set_var(k)->name());
mapping.setup_names();
- mapping.print(); fflush(stdout); // "{[I] -> [_t1] : I = _t1 }
+ mapping.print();
+ fflush(stdout); // "{[I] -> [_t1] : I = _t1 }
F_And *f_root = mapping.add_and();
- for (int k = 1; k <= level-1; k++) {
+ for (int k = 1; k <= level - 1; k++) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(mapping.input_var(k), 1);
h.update_coef(mapping.output_var(k), -1);
@@ -390,7 +403,7 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
for (int k = 0; k < privatized_levels.size(); k++) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(mapping.input_var(privatized_levels[k]), 1);
- h.update_coef(mapping.output_var(level+k), -1);
+ h.update_coef(mapping.output_var(level + k), -1);
}
for (int k = 0; k < n_dim; k++) {
IR_ArrayRef *AR = stmt_refs[i].second[j];
@@ -400,37 +413,39 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
CG_outputRepr *repr = stmt_refs[i].second[j]->index(k);
//fprintf(stderr, "k %d j %d repr ", k, j); repr->dump(); fflush(stdout);
- exp2formula(ir,
- mapping,
- f_root,
- freevar,
- repr,
- mapping.output_var(level-1+privatized_levels.size()+k+1),
- 'w',
- IR_COND_EQ,
+ exp2formula(ir,
+ mapping,
+ f_root,
+ freevar,
+ repr,
+ mapping.output_var(level - 1 + privatized_levels.size() + k + 1),
+ 'w',
+ IR_COND_EQ,
false,
uninterpreted_symbols[stmt_num],
uninterpreted_symbols_stringrepr[stmt_num]);
repr->clear();
delete repr;
}
- Relation r = omega::Range(Restrict_Domain(mapping, Intersection(copy(stmt[stmt_num].IS), Extend_Set(copy(this->known), stmt[stmt_num].IS.n_set() - this->known.n_set()))));
+ Relation r = omega::Range(Restrict_Domain(mapping, Intersection(copy(stmt[stmt_num].IS),
+ Extend_Set(copy(this->known),
+ stmt[stmt_num].IS.n_set() -
+ this->known.n_set()))));
if (stmt_refs[i].second[j]->is_write()) {
has_write_refs = true;
wo_copy_is = Union(wo_copy_is, r);
wo_copy_is.simplify(2, 4);
-
-
- }
- else {
+
+
+ } else {
has_read_refs = true;
ro_copy_is = Union(ro_copy_is, r);
ro_copy_is.simplify(2, 4);
-
+
}
}
}
-
+
//fprintf(stderr, "dp3: simplify\n");
// simplify read and write footprint iteration space
{
@@ -438,7 +453,7 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
ro_copy_is = SimpleHull(ro_copy_is, true, true);
else
ro_copy_is = ConvexRepresentation(ro_copy_is);
-
+
wo_copy_is = ConvexRepresentation(wo_copy_is);
if (wo_copy_is.number_of_conjuncts() > 1) {
Relation t = SimpleHull(wo_copy_is, true, true);
@@ -448,7 +463,7 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
wo_copy_is = ro_copy_is;
}
}
-
+
// make copy statement variable names match the ones in the original statements which
// already have the same names due to apply_xform
{
@@ -463,11 +478,12 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
}
for (int i = 0; i < privatized_levels.size(); i++) {
std::string s = stmt[ref_stmt].IS.input_var(privatized_levels[i])->name();
- wo_copy_is.name_set_var(level+i, s);
- ro_copy_is.name_set_var(level+i, s);
+ wo_copy_is.name_set_var(level + i, s);
+ ro_copy_is.name_set_var(level + i, s);
}
- for (int i = level+privatized_levels.size(); i < level+privatized_levels.size()+n_dim; i++) {
- std::string s = tmp_loop_var_name_prefix + to_string(tmp_loop_var_name_counter+i-level-privatized_levels.size());
+ for (int i = level + privatized_levels.size(); i < level + privatized_levels.size() + n_dim; i++) {
+ std::string s =
+ tmp_loop_var_name_prefix + to_string(tmp_loop_var_name_counter + i - level - privatized_levels.size());
wo_copy_is.name_set_var(i, s);
ro_copy_is.name_set_var(i, s);
}
@@ -475,11 +491,11 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
wo_copy_is.setup_names();
ro_copy_is.setup_names();
}
-
+
//fprintf(stderr, "\ndp3: build merged\n");
// build merged footprint iteration space for calculating temporary array size
Relation copy_is = SimpleHull(Union(copy(ro_copy_is), copy(wo_copy_is)), true, true);
-
+
// extract temporary array information
CG_outputBuilder *ocg = ir->builder();
std::vector<CG_outputRepr *> index_lb(n_dim); // initialized to NULL
@@ -487,31 +503,35 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
std::vector<bool> is_index_eq(n_dim, false);
std::vector<std::pair<int, CG_outputRepr *> > index_sz(0);
Relation reduced_copy_is = copy(copy_is);
-
+
for (int i = 0; i < n_dim; i++) {
//fprintf(stderr, "i %d/%d\n", i, n_dim);
if (i != 0)
- reduced_copy_is = Project(reduced_copy_is, level-1+privatized_levels.size()+i, Set_Var);
- Relation bound = get_loop_bound(reduced_copy_is, level-1+privatized_levels.size()+i);
-
+ reduced_copy_is = Project(reduced_copy_is, level - 1 + privatized_levels.size() + i, Set_Var);
+ Relation bound = get_loop_bound(reduced_copy_is, level - 1 + privatized_levels.size() + i);
+
//fprintf(stderr, "dp3: extract stride\n");
// extract stride
- std::pair<EQ_Handle, Variable_ID> result = find_simplest_stride(bound, bound.set_var(level-1+privatized_levels.size()+i+1));
+ std::pair<EQ_Handle, Variable_ID> result = find_simplest_stride(bound, bound.set_var(
+ level - 1 + privatized_levels.size() + i + 1));
if (result.second != NULL)
- index_stride[i] = abs(result.first.get_coef(result.second))/gcd(abs(result.first.get_coef(result.second)), abs(result.first.get_coef(bound.set_var(level-1+privatized_levels.size()+i+1))));
+ index_stride[i] = abs(result.first.get_coef(result.second)) / gcd(abs(result.first.get_coef(result.second)),
+ abs(result.first.get_coef(bound.set_var(
+ level - 1 + privatized_levels.size() + i +
+ 1))));
else
index_stride[i] = 1;
//fprintf(stderr, "dp3: index_stride[%d] = %d\n", i, index_stride[i]);
-
+
// check if this array index requires loop
Conjunct *c = bound.query_DNF()->single_conjunct();
for (EQ_Iterator ei(c->EQs()); ei; ei++) {
//fprintf(stderr, "dp3: for\n");
if ((*ei).has_wildcards())
continue;
-
+
//fprintf(stderr, "dp3: no wildcards\n");
- int coef = (*ei).get_coef(bound.set_var(level-1+privatized_levels.size()+i+1));
+ int coef = (*ei).get_coef(bound.set_var(level - 1 + privatized_levels.size() + i + 1));
if (coef != 0) {
//fprintf(stderr, "coef != 0\n");
int sign = 1;
@@ -520,51 +540,53 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
coef = -coef;
sign = -1;
}
-
+
CG_outputRepr *op = NULL;
for (Constr_Vars_Iter ci(*ei); ci; ci++) {
//fprintf(stderr, "dp3: ci\n");
switch ((*ci).var->kind()) {
- case Input_Var:
- {
- //fprintf(stderr, "dp3: Input_Var\n");
- if ((*ci).var != bound.set_var(level-1+privatized_levels.size()+i+1)) {
- //fprintf(stderr, "dp3: IF sign %d\n",(*ci).coef*sign);
-
- if ((*ci).coef*sign == 1)
- op = ocg->CreateMinus(op, ocg->CreateIdent((*ci).var->name()));
- else if ((*ci).coef*sign == -1)
- op = ocg->CreatePlus(op, ocg->CreateIdent((*ci).var->name()));
- else if ((*ci).coef*sign > 1)
- op = ocg->CreateMinus(op, ocg->CreateTimes(ocg->CreateInt(abs((*ci).coef)), ocg->CreateIdent((*ci).var->name())));
+ case Input_Var: {
+ //fprintf(stderr, "dp3: Input_Var\n");
+ if ((*ci).var != bound.set_var(level - 1 + privatized_levels.size() + i + 1)) {
+ //fprintf(stderr, "dp3: IF sign %d\n",(*ci).coef*sign);
+
+ if ((*ci).coef * sign == 1)
+ op = ocg->CreateMinus(op, ocg->CreateIdent((*ci).var->name()));
+ else if ((*ci).coef * sign == -1)
+ op = ocg->CreatePlus(op, ocg->CreateIdent((*ci).var->name()));
+ else if ((*ci).coef * sign > 1)
+ op = ocg->CreateMinus(op, ocg->CreateTimes(ocg->CreateInt(abs((*ci).coef)),
+ ocg->CreateIdent((*ci).var->name())));
+ else // (*ci).coef*sign < -1
+ op = ocg->CreatePlus(op, ocg->CreateTimes(ocg->CreateInt(abs((*ci).coef)),
+ ocg->CreateIdent((*ci).var->name())));
+ }
+ break;
+ }
+ case Global_Var: {
+ //fprintf(stderr, "dp3: Global_Var\n");
+ Global_Var_ID g = (*ci).var->get_global_var();
+ if ((*ci).coef * sign == 1)
+ op = ocg->CreateMinus(op, ocg->CreateIdent(g->base_name()));
+ else if ((*ci).coef * sign == -1)
+ op = ocg->CreatePlus(op, ocg->CreateIdent(g->base_name()));
+ else if ((*ci).coef * sign > 1)
+ op = ocg->CreateMinus(op, ocg->CreateTimes(ocg->CreateInt(abs((*ci).coef)),
+ ocg->CreateIdent(g->base_name())));
else // (*ci).coef*sign < -1
- op = ocg->CreatePlus(op, ocg->CreateTimes(ocg->CreateInt(abs((*ci).coef)), ocg->CreateIdent((*ci).var->name())));
+ op = ocg->CreatePlus(op, ocg->CreateTimes(ocg->CreateInt(abs((*ci).coef)),
+ ocg->CreateIdent(g->base_name())));
+ break;
}
- break;
- }
- case Global_Var:
- {
- //fprintf(stderr, "dp3: Global_Var\n");
- Global_Var_ID g = (*ci).var->get_global_var();
- if ((*ci).coef*sign == 1)
- op = ocg->CreateMinus(op, ocg->CreateIdent(g->base_name()));
- else if ((*ci).coef*sign == -1)
- op = ocg->CreatePlus(op, ocg->CreateIdent(g->base_name()));
- else if ((*ci).coef*sign > 1)
- op = ocg->CreateMinus(op, ocg->CreateTimes(ocg->CreateInt(abs((*ci).coef)), ocg->CreateIdent(g->base_name())));
- else // (*ci).coef*sign < -1
- op = ocg->CreatePlus(op, ocg->CreateTimes(ocg->CreateInt(abs((*ci).coef)), ocg->CreateIdent(g->base_name())));
- break;
- }
- default:
- throw loop_error("unsupported array index expression");
+ default:
+ throw loop_error("unsupported array index expression");
}
}
if ((*ei).get_const() != 0)
- op = ocg->CreatePlus(op, ocg->CreateInt(-sign*((*ei).get_const())));
+ op = ocg->CreatePlus(op, ocg->CreateInt(-sign * ((*ei).get_const())));
if (coef != 1)
op = ocg->CreateIntegerFloor(op, ocg->CreateInt(coef));
-
+
index_lb[i] = op;
is_index_eq[i] = true;
break;
@@ -572,14 +594,14 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
}
if (is_index_eq[i])
continue;
-
+
//fprintf(stderr, "dp3: separate lower and upper bounds\n");
// separate lower and upper bounds
std::vector<GEQ_Handle> lb_list, ub_list;
std::set<Variable_ID> excluded_floor_vars;
- excluded_floor_vars.insert(bound.set_var(level-1+privatized_levels.size()+i+1));
+ excluded_floor_vars.insert(bound.set_var(level - 1 + privatized_levels.size() + i + 1));
for (GEQ_Iterator gi(c->GEQs()); gi; gi++) {
- int coef = (*gi).get_coef(bound.set_var(level-1+privatized_levels.size()+i+1));
+ int coef = (*gi).get_coef(bound.set_var(level - 1 + privatized_levels.size() + i + 1));
if (coef != 0 && (*gi).has_wildcards()) {
bool clean_bound = true;
GEQ_Handle h;
@@ -591,7 +613,7 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
if (!clean_bound)
continue;
}
-
+
if (coef > 0)
lb_list.push_back(*gi);
else if (coef < 0)
@@ -599,41 +621,45 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
}
if (lb_list.size() == 0 || ub_list.size() == 0)
throw loop_error("failed to calcuate array footprint size");
-
+
//fprintf(stderr, "dp3: build lower bound representation\n");
// build lower bound representation
std::vector<CG_outputRepr *> lb_repr_list;
- for (int j = 0; j < lb_list.size(); j++){
- if(this->known.n_set() == 0) {
- lb_repr_list.push_back(output_lower_bound_repr(ocg,
- lb_list[j],
- bound.set_var(level-1+privatized_levels.size()+i+1),
- result.first,
- result.second,
- bound,
- Relation::True(bound.n_set()),
- std::vector<std::pair<CG_outputRepr *, int> >(bound.n_set(), std::make_pair(static_cast<CG_outputRepr *>(NULL), 0)),
+ for (int j = 0; j < lb_list.size(); j++) {
+ if (this->known.n_set() == 0) {
+ lb_repr_list.push_back(output_lower_bound_repr(ocg,
+ lb_list[j],
+ bound.set_var(level - 1 + privatized_levels.size() + i + 1),
+ result.first,
+ result.second,
+ bound,
+ Relation::True(bound.n_set()),
+ std::vector<std::pair<CG_outputRepr *, int> >(bound.n_set(),
+ std::make_pair(
+ static_cast<CG_outputRepr *>(NULL),
+ 0)),
uninterpreted_symbols[stmt_num]));
- }
- else {
- lb_repr_list.push_back(output_lower_bound_repr(ocg,
- lb_list[j],
- bound.set_var(level-1+privatized_levels.size()+i+1),
- result.first,
- result.second,
- bound,
- this->known,
- std::vector<std::pair<CG_outputRepr *, int> >(bound.n_set(), std::make_pair(static_cast<CG_outputRepr *>(NULL), 0)),
+ } else {
+ lb_repr_list.push_back(output_lower_bound_repr(ocg,
+ lb_list[j],
+ bound.set_var(level - 1 + privatized_levels.size() + i + 1),
+ result.first,
+ result.second,
+ bound,
+ this->known,
+ std::vector<std::pair<CG_outputRepr *, int> >(bound.n_set(),
+ std::make_pair(
+ static_cast<CG_outputRepr *>(NULL),
+ 0)),
uninterpreted_symbols[stmt_num]));
}
}
- if (lb_repr_list.size() > 1) {
+ if (lb_repr_list.size() > 1) {
//fprintf(stderr, "loop_datacopy.cc dp3 createInvoke( max )\n");
index_lb[i] = ocg->CreateInvoke("max", lb_repr_list);
- }
- else if (lb_repr_list.size() == 1)
+ } else if (lb_repr_list.size() == 1)
index_lb[i] = lb_repr_list[0];
-
+
//fprintf(stderr, "dp3: build temporary array size representation\n");
// build temporary array size representation
{
@@ -642,66 +668,62 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
for (int j = 0; j < ub_list.size(); j++)
for (int k = 0; k < lb_list.size(); k++) {
GEQ_Handle h = f_root->add_GEQ();
-
+
for (Constr_Vars_Iter ci(ub_list[j]); ci; ci++) {
switch ((*ci).var->kind()) {
- case Input_Var:
- {
- int pos = (*ci).var->get_position();
- h.update_coef(cal.input_var(pos), (*ci).coef);
- break;
- }
- case Global_Var:
- {
- Global_Var_ID g = (*ci).var->get_global_var();
- Variable_ID v;
- if (g->arity() == 0)
- v = cal.get_local(g);
- else
- v = cal.get_local(g, (*ci).var->function_of());
- h.update_coef(v, (*ci).coef);
- break;
- }
- default:
- throw loop_error("cannot calculate temporay array size statically");
+ case Input_Var: {
+ int pos = (*ci).var->get_position();
+ h.update_coef(cal.input_var(pos), (*ci).coef);
+ break;
+ }
+ case Global_Var: {
+ Global_Var_ID g = (*ci).var->get_global_var();
+ Variable_ID v;
+ if (g->arity() == 0)
+ v = cal.get_local(g);
+ else
+ v = cal.get_local(g, (*ci).var->function_of());
+ h.update_coef(v, (*ci).coef);
+ break;
+ }
+ default:
+ throw loop_error("cannot calculate temporay array size statically");
}
}
h.update_const(ub_list[j].get_const());
-
+
for (Constr_Vars_Iter ci(lb_list[k]); ci; ci++) {
switch ((*ci).var->kind()) {
- case Input_Var:
- {
- int pos = (*ci).var->get_position();
- h.update_coef(cal.input_var(pos), (*ci).coef);
- break;
- }
- case Global_Var:
- {
- Global_Var_ID g = (*ci).var->get_global_var();
- Variable_ID v;
- if (g->arity() == 0)
- v = cal.get_local(g);
- else
- v = cal.get_local(g, (*ci).var->function_of());
- h.update_coef(v, (*ci).coef);
- break;
- }
- default:
- throw loop_error("cannot calculate temporay array size statically");
+ case Input_Var: {
+ int pos = (*ci).var->get_position();
+ h.update_coef(cal.input_var(pos), (*ci).coef);
+ break;
+ }
+ case Global_Var: {
+ Global_Var_ID g = (*ci).var->get_global_var();
+ Variable_ID v;
+ if (g->arity() == 0)
+ v = cal.get_local(g);
+ else
+ v = cal.get_local(g, (*ci).var->function_of());
+ h.update_coef(v, (*ci).coef);
+ break;
+ }
+ default:
+ throw loop_error("cannot calculate temporay array size statically");
}
}
h.update_const(lb_list[k].get_const());
-
+
h.update_const(1);
h.update_coef(cal.output_var(1), -1);
}
-
+
cal = Restrict_Domain(cal, copy(copy_is));
for (int j = 1; j <= cal.n_inp(); j++)
cal = Project(cal, j, Input_Var);
cal.simplify();
-
+
//fprintf(stderr, "dp3: pad temporary array size\n");
// pad temporary array size
// TODO: for variable array size, create padding formula
@@ -719,9 +741,8 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
if (padding_alignment > 1) { // align to boundary for data packing
int residue = size % padding_alignment;
if (residue)
- size = size+padding_alignment-residue;
- }
- else if (padding_alignment < -1) { // un-alignment for memory bank conflicts
+ size = size + padding_alignment - residue;
+ } else if (padding_alignment < -1) { // un-alignment for memory bank conflicts
while (gcd(size, static_cast<coef_t>(-padding_alignment)) != 1)
size++;
}
@@ -729,7 +750,7 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
index_sz.push_back(std::make_pair(i, ocg->CreateInt(size)));
is_index_bound_const = true;
}
-
+
if (!is_index_bound_const) {
for (GEQ_Iterator gi(c->GEQs()); gi && !is_index_bound_const; gi++) {
int coef = (*gi).get_coef(cal.output_var(1));
@@ -737,22 +758,23 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
CG_outputRepr *op = NULL;
for (Constr_Vars_Iter ci(*gi); ci; ci++) {
if ((*ci).var != cal.output_var(1)) {
- switch((*ci).var->kind()) {
- case Global_Var:
- {
- Global_Var_ID g = (*ci).var->get_global_var();
- if ((*ci).coef == 1)
- op = ocg->CreatePlus(op, ocg->CreateIdent(g->base_name()));
- else if ((*ci).coef == -1)
- op = ocg->CreateMinus(op, ocg->CreateIdent(g->base_name()));
- else if ((*ci).coef > 1)
- op = ocg->CreatePlus(op, ocg->CreateTimes(ocg->CreateInt((*ci).coef), ocg->CreateIdent(g->base_name())));
- else // (*ci).coef < -1
- op = ocg->CreateMinus(op, ocg->CreateTimes(ocg->CreateInt(-(*ci).coef), ocg->CreateIdent(g->base_name())));
- break;
- }
- default:
- throw loop_error("failed to generate array index bound code");
+ switch ((*ci).var->kind()) {
+ case Global_Var: {
+ Global_Var_ID g = (*ci).var->get_global_var();
+ if ((*ci).coef == 1)
+ op = ocg->CreatePlus(op, ocg->CreateIdent(g->base_name()));
+ else if ((*ci).coef == -1)
+ op = ocg->CreateMinus(op, ocg->CreateIdent(g->base_name()));
+ else if ((*ci).coef > 1)
+ op = ocg->CreatePlus(op, ocg->CreateTimes(ocg->CreateInt((*ci).coef),
+ ocg->CreateIdent(g->base_name())));
+ else // (*ci).coef < -1
+ op = ocg->CreateMinus(op, ocg->CreateTimes(ocg->CreateInt(-(*ci).coef),
+ ocg->CreateIdent(g->base_name())));
+ break;
+ }
+ default:
+ throw loop_error("failed to generate array index bound code");
}
}
}
@@ -766,16 +788,16 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
coef_t g = gcd(index_stride[i], static_cast<coef_t>(padding_stride));
coef_t t1 = index_stride[i] / g;
if (t1 != 1)
- op = ocg->CreateIntegerFloor(ocg->CreatePlus(op, ocg->CreateInt(t1-1)), ocg->CreateInt(t1));
+ op = ocg->CreateIntegerFloor(ocg->CreatePlus(op, ocg->CreateInt(t1 - 1)), ocg->CreateInt(t1));
coef_t t2 = padding_stride / g;
if (t2 != 1)
op = ocg->CreateTimes(op, ocg->CreateInt(t2));
- }
- else if (index_stride[i] != 1) {
- op = ocg->CreateIntegerFloor(ocg->CreatePlus(op, ocg->CreateInt(index_stride[i]-1)), ocg->CreateInt(index_stride[i]));
+ } else if (index_stride[i] != 1) {
+ op = ocg->CreateIntegerFloor(ocg->CreatePlus(op, ocg->CreateInt(index_stride[i] - 1)),
+ ocg->CreateInt(index_stride[i]));
}
}
-
+
index_sz.push_back(std::make_pair(i, op));
break;
}
@@ -783,20 +805,20 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
}
}
}
-
+
//fprintf(stderr, "dp3: change the temporary array index order\n");
// change the temporary array index order
for (int i = 0; i < index_sz.size(); i++) {
if (index_sz[i].first == fastest_changing_dimension)
switch (sym->layout_type()) {
- case IR_ARRAY_LAYOUT_ROW_MAJOR:
- std::swap(index_sz[index_sz.size()-1], index_sz[i]);
- break;
- case IR_ARRAY_LAYOUT_COLUMN_MAJOR:
- std::swap(index_sz[0], index_sz[i]);
- break;
- default:
- throw loop_error("unsupported array layout");
+ case IR_ARRAY_LAYOUT_ROW_MAJOR:
+ std::swap(index_sz[index_sz.size() - 1], index_sz[i]);
+ break;
+ case IR_ARRAY_LAYOUT_COLUMN_MAJOR:
+ std::swap(index_sz[0], index_sz[i]);
+ break;
+ default:
+ throw loop_error("unsupported array layout");
}
}
@@ -806,51 +828,53 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
if (index_sz.size() == 0) {
//fprintf(stderr, "tmp_sym is a scalar\n");
tmp_sym = ir->CreateScalarSymbol(sym, memory_type);
- }
- else {
+ } else {
//fprintf(stderr, "tmp_sym is an array\n");
std::vector<CG_outputRepr *> tmp_array_size(index_sz.size());
- for (int i = 0; i < index_sz.size(); i++) {
+ for (int i = 0; i < index_sz.size(); i++) {
tmp_array_size[i] = index_sz[i].second->clone();
index_sz[i].second->dump(); // THIS PRINTF
}
tmp_sym = ir->CreateArraySymbol(sym, tmp_array_size, memory_type);
}
-
+
//fprintf(stderr, "dp3: create temporary array read initialization code\n");
// create temporary array read initialization code
CG_outputRepr *copy_code_read;
- if (has_read_refs) {
+ if (has_read_refs) {
//fprintf(stderr, "has read refs\n");
if (index_sz.size() == 0) {
- //fprintf(stderr, "if\n");
-
+ //fprintf(stderr, "if\n");
+
//fprintf(stderr, "tmp sym %s\n", tmp_sym->name().c_str());
- IR_ScalarRef *tmp_scalar_ref = ir->CreateScalarRef(static_cast<IR_ScalarSymbol *>(tmp_sym)); // create ref from symbol
+ IR_ScalarRef *tmp_scalar_ref = ir->CreateScalarRef(
+ static_cast<IR_ScalarSymbol *>(tmp_sym)); // create ref from symbol
// tmp_scalar_ref is incomplete
std::vector<CG_outputRepr *> rhs_index(n_dim);
- for (int i = 0; i < index_lb.size(); i++) {
+ for (int i = 0; i < index_lb.size(); i++) {
//fprintf(stderr, "i %d\n", i);
if (is_index_eq[i])
rhs_index[i] = index_lb[i]->clone();
else
- rhs_index[i] = ir->builder()->CreateIdent(copy_is.set_var(level-1+privatized_levels.size()+i+1)->name());
+ rhs_index[i] = ir->builder()->CreateIdent(
+ copy_is.set_var(level - 1 + privatized_levels.size() + i + 1)->name());
}
IR_ArrayRef *copied_array_ref = ir->CreateArrayRef(sym, rhs_index);
-
+
// IR_ScalarRef tmp_scalar_ref has no actual reference yet. It only has the variable definition.
copy_code_read = ir->builder()->CreateAssignment(0, tmp_scalar_ref->convert(), copied_array_ref->convert());
//fprintf(stderr, "if ends\n");
- }
- else {
+ } else {
//fprintf(stderr, "else\n");
std::vector<CG_outputRepr *> lhs_index(index_sz.size());
for (int i = 0; i < index_sz.size(); i++) {
int cur_index_num = index_sz[i].first;
- CG_outputRepr *cur_index_repr = ocg->CreateMinus(ocg->CreateIdent(copy_is.set_var(level-1+privatized_levels.size()+cur_index_num+1)->name()), index_lb[cur_index_num]->clone());
+ CG_outputRepr *cur_index_repr = ocg->CreateMinus(
+ ocg->CreateIdent(copy_is.set_var(level - 1 + privatized_levels.size() + cur_index_num + 1)->name()),
+ index_lb[cur_index_num]->clone());
if (padding_stride != 0) {
- if (i == n_dim-1) {
+ if (i == n_dim - 1) {
coef_t g = gcd(index_stride[cur_index_num], static_cast<coef_t>(padding_stride));
coef_t t1 = index_stride[cur_index_num] / g;
if (t1 != 1)
@@ -858,74 +882,78 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
coef_t t2 = padding_stride / g;
if (t2 != 1)
cur_index_repr = ocg->CreateTimes(cur_index_repr, ocg->CreateInt(t2));
- }
- else if (index_stride[cur_index_num] != 1) {
+ } else if (index_stride[cur_index_num] != 1) {
cur_index_repr = ocg->CreateIntegerFloor(cur_index_repr, ocg->CreateInt(index_stride[cur_index_num]));
}
}
-
+
if (ir->ArrayIndexStartAt() != 0)
cur_index_repr = ocg->CreatePlus(cur_index_repr, ocg->CreateInt(ir->ArrayIndexStartAt()));
lhs_index[i] = cur_index_repr;
}
-
+
//fprintf(stderr, "dp3: making tmp_array_ref\n");
IR_ArrayRef *tmp_array_ref = ir->CreateArrayRef(static_cast<IR_ArraySymbol *>(tmp_sym), lhs_index);
//fprintf(stderr, "dp3: DONE making tmp_array_ref\n");
-
+
std::vector<CG_outputRepr *> rhs_index(n_dim);
for (int i = 0; i < index_lb.size(); i++)
if (is_index_eq[i])
rhs_index[i] = index_lb[i]->clone();
else
- rhs_index[i] = ir->builder()->CreateIdent(copy_is.set_var(level-1+privatized_levels.size()+i+1)->name());
+ rhs_index[i] = ir->builder()->CreateIdent(
+ copy_is.set_var(level - 1 + privatized_levels.size() + i + 1)->name());
IR_ArrayRef *copied_array_ref = ir->CreateArrayRef(sym, rhs_index);
-
+
//fprintf(stderr, "dp3: loop_datacopy.cc copy_code_read = CreateAssignment\n");
//copy_code_read = ir->builder()->CreateAssignment(0, tmp_array_ref->convert(), copied_array_ref->convert());
CG_outputRepr *lhs = tmp_array_ref->convert();
CG_outputRepr *rhs = copied_array_ref->convert();
- copy_code_read = ir->builder()->CreateAssignment(0, lhs, rhs); //tmp_array_ref->convert(), copied_array_ref->convert());
+ copy_code_read = ir->builder()->CreateAssignment(0, lhs,
+ rhs); //tmp_array_ref->convert(), copied_array_ref->convert());
//fprintf(stderr, "dp3: loop_datacopy.cc copy_code_read = CreateAssignment DONE\n\n");
}
} // has read refs
-
+
//fprintf(stderr, "dp3: create temporary array write back code\n");
// create temporary array write back code
CG_outputRepr *copy_code_write;
- if (has_write_refs) {
+ if (has_write_refs) {
//fprintf(stderr, "has_write_refs\n");
if (index_sz.size() == 0) {
//fprintf(stderr, "index_sz.size() == 0\n");
IR_ScalarRef *tmp_scalar_ref = ir->CreateScalarRef(static_cast<IR_ScalarSymbol *>(tmp_sym));
-
+
std::vector<CG_outputRepr *> rhs_index(n_dim);
for (int i = 0; i < index_lb.size(); i++)
if (is_index_eq[i])
rhs_index[i] = index_lb[i]->clone();
else
- rhs_index[i] = ir->builder()->CreateIdent(copy_is.set_var(level-1+privatized_levels.size()+i+1)->name());
+ rhs_index[i] = ir->builder()->CreateIdent(
+ copy_is.set_var(level - 1 + privatized_levels.size() + i + 1)->name());
IR_ArrayRef *copied_array_ref = ir->CreateArrayRef(sym, rhs_index);
-
+
copy_code_write = ir->builder()->CreateAssignment(0, copied_array_ref->convert(), tmp_scalar_ref->convert());
- }
- else {
+ } else {
//fprintf(stderr, "index_sz.size() NOT = 0\n");
-
+
std::vector<CG_outputRepr *> lhs_index(n_dim);
for (int i = 0; i < index_lb.size(); i++)
if (is_index_eq[i])
lhs_index[i] = index_lb[i]->clone();
else
- lhs_index[i] = ir->builder()->CreateIdent(copy_is.set_var(level-1+privatized_levels.size()+i+1)->name());
+ lhs_index[i] = ir->builder()->CreateIdent(
+ copy_is.set_var(level - 1 + privatized_levels.size() + i + 1)->name());
IR_ArrayRef *copied_array_ref = ir->CreateArrayRef(sym, lhs_index);
-
+
std::vector<CG_outputRepr *> rhs_index(index_sz.size());
for (int i = 0; i < index_sz.size(); i++) {
int cur_index_num = index_sz[i].first;
- CG_outputRepr *cur_index_repr = ocg->CreateMinus(ocg->CreateIdent(copy_is.set_var(level-1+privatized_levels.size()+cur_index_num+1)->name()), index_lb[cur_index_num]->clone());
+ CG_outputRepr *cur_index_repr = ocg->CreateMinus(
+ ocg->CreateIdent(copy_is.set_var(level - 1 + privatized_levels.size() + cur_index_num + 1)->name()),
+ index_lb[cur_index_num]->clone());
if (padding_stride != 0) {
- if (i == n_dim-1) {
+ if (i == n_dim - 1) {
coef_t g = gcd(index_stride[cur_index_num], static_cast<coef_t>(padding_stride));
coef_t t1 = index_stride[cur_index_num] / g;
if (t1 != 1)
@@ -933,96 +961,98 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
coef_t t2 = padding_stride / g;
if (t2 != 1)
cur_index_repr = ocg->CreateTimes(cur_index_repr, ocg->CreateInt(t2));
- }
- else if (index_stride[cur_index_num] != 1) {
+ } else if (index_stride[cur_index_num] != 1) {
cur_index_repr = ocg->CreateIntegerFloor(cur_index_repr, ocg->CreateInt(index_stride[cur_index_num]));
}
}
-
+
if (ir->ArrayIndexStartAt() != 0)
cur_index_repr = ocg->CreatePlus(cur_index_repr, ocg->CreateInt(ir->ArrayIndexStartAt()));
rhs_index[i] = cur_index_repr;
}
IR_ArrayRef *tmp_array_ref = ir->CreateArrayRef(static_cast<IR_ArraySymbol *>(tmp_sym), rhs_index);
-
+
copy_code_write = ir->builder()->CreateAssignment(0, copied_array_ref->convert(), tmp_array_ref->convert());
}
} // has write refs
-
+
// now we can remove those loops for array indexes that are
// dependent on others
//fprintf(stderr, "dp3: now we can remove those loops\n");
if (!(index_sz.size() == n_dim && (sym->layout_type() == IR_ARRAY_LAYOUT_ROW_MAJOR || n_dim <= 1))) {
- Relation mapping(level-1+privatized_levels.size()+n_dim, level-1+privatized_levels.size()+index_sz.size());
+ Relation mapping(level - 1 + privatized_levels.size() + n_dim,
+ level - 1 + privatized_levels.size() + index_sz.size());
F_And *f_root = mapping.add_and();
- for (int i = 1; i <= level-1+privatized_levels.size(); i++) {
+ for (int i = 1; i <= level - 1 + privatized_levels.size(); i++) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(mapping.input_var(i), 1);
h.update_coef(mapping.output_var(i), -1);
}
-
+
int cur_index = 0;
std::vector<int> mapped_index(index_sz.size());
for (int i = 0; i < n_dim; i++)
if (!is_index_eq[i]) {
EQ_Handle h = f_root->add_EQ();
- h.update_coef(mapping.input_var(level-1+privatized_levels.size()+i+1), 1);
+ h.update_coef(mapping.input_var(level - 1 + privatized_levels.size() + i + 1), 1);
switch (sym->layout_type()) {
- case IR_ARRAY_LAYOUT_COLUMN_MAJOR: {
- h.update_coef(mapping.output_var(level-1+privatized_levels.size()+index_sz.size()-cur_index), -1);
- mapped_index[index_sz.size()-cur_index-1] = i;
- break;
- }
- case IR_ARRAY_LAYOUT_ROW_MAJOR: {
- h.update_coef(mapping.output_var(level-1+privatized_levels.size()+cur_index+1), -1);
- mapped_index[cur_index] = i;
- break;
- }
- default:
- throw loop_error("unsupported array layout");
+ case IR_ARRAY_LAYOUT_COLUMN_MAJOR: {
+ h.update_coef(mapping.output_var(level - 1 + privatized_levels.size() + index_sz.size() - cur_index), -1);
+ mapped_index[index_sz.size() - cur_index - 1] = i;
+ break;
+ }
+ case IR_ARRAY_LAYOUT_ROW_MAJOR: {
+ h.update_coef(mapping.output_var(level - 1 + privatized_levels.size() + cur_index + 1), -1);
+ mapped_index[cur_index] = i;
+ break;
+ }
+ default:
+ throw loop_error("unsupported array layout");
}
cur_index++;
}
-
+
wo_copy_is = omega::Range(Restrict_Domain(copy(mapping), wo_copy_is));
ro_copy_is = omega::Range(Restrict_Domain(copy(mapping), ro_copy_is));
- for (int i = 1; i <= level-1+privatized_levels.size(); i++) {
+ for (int i = 1; i <= level - 1 + privatized_levels.size(); i++) {
wo_copy_is.name_set_var(i, copy_is.set_var(i)->name());
ro_copy_is.name_set_var(i, copy_is.set_var(i)->name());
}
for (int i = 0; i < index_sz.size(); i++) {
- wo_copy_is.name_set_var(level-1+privatized_levels.size()+i+1, copy_is.set_var(level-1+privatized_levels.size()+mapped_index[i]+1)->name());
- ro_copy_is.name_set_var(level-1+privatized_levels.size()+i+1, copy_is.set_var(level-1+privatized_levels.size()+mapped_index[i]+1)->name());
+ wo_copy_is.name_set_var(level - 1 + privatized_levels.size() + i + 1,
+ copy_is.set_var(level - 1 + privatized_levels.size() + mapped_index[i] + 1)->name());
+ ro_copy_is.name_set_var(level - 1 + privatized_levels.size() + i + 1,
+ copy_is.set_var(level - 1 + privatized_levels.size() + mapped_index[i] + 1)->name());
}
wo_copy_is.setup_names();
ro_copy_is.setup_names();
}
-
+
// insert read copy statement
//fprintf(stderr, "dp3: insert read copy statement\n");
-
+
int old_num_stmt = stmt.size();
int ro_copy_stmt_num = -1;
if (has_read_refs) {
- Relation copy_xform(ro_copy_is.n_set(), 2*ro_copy_is.n_set()+1);
+ Relation copy_xform(ro_copy_is.n_set(), 2 * ro_copy_is.n_set() + 1);
{
F_And *f_root = copy_xform.add_and();
for (int i = 1; i <= ro_copy_is.n_set(); i++) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(copy_xform.input_var(i), 1);
- h.update_coef(copy_xform.output_var(2*i), -1);
+ h.update_coef(copy_xform.output_var(2 * i), -1);
}
- for (int i = 1; i <= dim; i+=2) {
+ for (int i = 1; i <= dim; i += 2) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(copy_xform.output_var(i), -1);
- h.update_const(lex[i-1]);
+ h.update_const(lex[i - 1]);
}
- for (int i = dim+2; i <= copy_xform.n_out(); i+=2) {
+ for (int i = dim + 2; i <= copy_xform.n_out(); i += 2) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(copy_xform.output_var(i), 1);
}
}
-
+
Statement copy_stmt_read;
copy_stmt_read.IS = ro_copy_is;
copy_stmt_read.xform = copy_xform;
@@ -1031,7 +1061,7 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
copy_stmt_read.loop_level = std::vector<LoopLevel>(ro_copy_is.n_set());
copy_stmt_read.ir_stmt_node = NULL;
copy_stmt_read.has_inspector = false;
- for (int i = 0; i < level-1; i++) {
+ for (int i = 0; i < level - 1; i++) {
copy_stmt_read.loop_level[i].type = stmt[*(active.begin())].loop_level[i].type;
if (stmt[*(active.begin())].loop_level[i].type == LoopLevelTile &&
stmt[*(active.begin())].loop_level[i].payload >= level) {
@@ -1043,32 +1073,33 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
copy_stmt_read.loop_level[i].payload = -1;
else
copy_stmt_read.loop_level[i].payload = level + j;
- }
- else
+ } else
copy_stmt_read.loop_level[i].payload = stmt[*(active.begin())].loop_level[i].payload;
copy_stmt_read.loop_level[i].parallel_level = stmt[*(active.begin())].loop_level[i].parallel_level;
}
for (int i = 0; i < privatized_levels.size(); i++) {
- copy_stmt_read.loop_level[level-1+i].type = stmt[*(active.begin())].loop_level[privatized_levels[i]].type;
- copy_stmt_read.loop_level[level-1+i].payload = stmt[*(active.begin())].loop_level[privatized_levels[i]].payload;
- copy_stmt_read.loop_level[level-1+i].parallel_level = stmt[*(active.begin())].loop_level[privatized_levels[i]].parallel_level;
+ copy_stmt_read.loop_level[level - 1 + i].type = stmt[*(active.begin())].loop_level[privatized_levels[i]].type;
+ copy_stmt_read.loop_level[level - 1 +
+ i].payload = stmt[*(active.begin())].loop_level[privatized_levels[i]].payload;
+ copy_stmt_read.loop_level[level - 1 +
+ i].parallel_level = stmt[*(active.begin())].loop_level[privatized_levels[i]].parallel_level;
}
int left_num_dim = num_dep_dim - (get_last_dep_dim_before(*(active.begin()), level) + 1);
for (int i = 0; i < std::min(left_num_dim, static_cast<int>(index_sz.size())); i++) {
- copy_stmt_read.loop_level[level-1+privatized_levels.size()+i].type = LoopLevelOriginal;
- copy_stmt_read.loop_level[level-1+privatized_levels.size()+i].payload = num_dep_dim-left_num_dim+i;
- copy_stmt_read.loop_level[level-1+privatized_levels.size()+i].parallel_level = 0;
+ copy_stmt_read.loop_level[level - 1 + privatized_levels.size() + i].type = LoopLevelOriginal;
+ copy_stmt_read.loop_level[level - 1 + privatized_levels.size() + i].payload = num_dep_dim - left_num_dim + i;
+ copy_stmt_read.loop_level[level - 1 + privatized_levels.size() + i].parallel_level = 0;
}
for (int i = std::min(left_num_dim, static_cast<int>(index_sz.size())); i < index_sz.size(); i++) {
- copy_stmt_read.loop_level[level-1+privatized_levels.size()+i].type = LoopLevelUnknown;
- copy_stmt_read.loop_level[level-1+privatized_levels.size()+i].payload = -1;
- copy_stmt_read.loop_level[level-1+privatized_levels.size()+i].parallel_level = 0;
+ copy_stmt_read.loop_level[level - 1 + privatized_levels.size() + i].type = LoopLevelUnknown;
+ copy_stmt_read.loop_level[level - 1 + privatized_levels.size() + i].payload = -1;
+ copy_stmt_read.loop_level[level - 1 + privatized_levels.size() + i].parallel_level = 0;
}
-
-
- shiftLexicalOrder(lex, dim-1, 1);
- fprintf(stderr, "loop_datacopy.cc L1071 adding stmt %d\n", stmt.size());
+
+ shiftLexicalOrder(lex, dim - 1, 1);
+
+ fprintf(stderr, "loop_datacopy.cc L1071 adding stmt %d\n", stmt.size());
stmt.push_back(copy_stmt_read);
uninterpreted_symbols.push_back(uninterpreted_symbols[*(active.begin())]);
@@ -1076,30 +1107,30 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
ro_copy_stmt_num = stmt.size() - 1;
dep.insert();
}
-
+
//fprintf(stderr, "dp3: insert write copy statement\n");
// insert write copy statement
int wo_copy_stmt_num = -1;
if (has_write_refs) {
- Relation copy_xform(wo_copy_is.n_set(), 2*wo_copy_is.n_set()+1);
+ Relation copy_xform(wo_copy_is.n_set(), 2 * wo_copy_is.n_set() + 1);
{
F_And *f_root = copy_xform.add_and();
for (int i = 1; i <= wo_copy_is.n_set(); i++) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(copy_xform.input_var(i), 1);
- h.update_coef(copy_xform.output_var(2*i), -1);
+ h.update_coef(copy_xform.output_var(2 * i), -1);
}
- for (int i = 1; i <= dim; i+=2) {
+ for (int i = 1; i <= dim; i += 2) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(copy_xform.output_var(i), -1);
- h.update_const(lex[i-1]);
+ h.update_const(lex[i - 1]);
}
- for (int i = dim+2; i <= copy_xform.n_out(); i+=2) {
+ for (int i = dim + 2; i <= copy_xform.n_out(); i += 2) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(copy_xform.output_var(i), 1);
}
}
-
+
Statement copy_stmt_write;
copy_stmt_write.IS = wo_copy_is;
copy_stmt_write.xform = copy_xform;
@@ -1107,8 +1138,8 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
copy_stmt_write.loop_level = std::vector<LoopLevel>(wo_copy_is.n_set());
copy_stmt_write.ir_stmt_node = NULL;
copy_stmt_write.has_inspector = false;
-
- for (int i = 0; i < level-1; i++) {
+
+ for (int i = 0; i < level - 1; i++) {
copy_stmt_write.loop_level[i].type = stmt[*(active.begin())].loop_level[i].type;
if (stmt[*(active.begin())].loop_level[i].type == LoopLevelTile &&
stmt[*(active.begin())].loop_level[i].payload >= level) {
@@ -1120,31 +1151,32 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
copy_stmt_write.loop_level[i].payload = -1;
else
copy_stmt_write.loop_level[i].payload = level + j;
- }
- else
+ } else
copy_stmt_write.loop_level[i].payload = stmt[*(active.begin())].loop_level[i].payload;
copy_stmt_write.loop_level[i].parallel_level = stmt[*(active.begin())].loop_level[i].parallel_level;
}
for (int i = 0; i < privatized_levels.size(); i++) {
- copy_stmt_write.loop_level[level-1+i].type = stmt[*(active.begin())].loop_level[privatized_levels[i]].type;
- copy_stmt_write.loop_level[level-1+i].payload = stmt[*(active.begin())].loop_level[privatized_levels[i]].payload;
- copy_stmt_write.loop_level[level-1+i].parallel_level = stmt[*(active.begin())].loop_level[privatized_levels[i]].parallel_level;
+ copy_stmt_write.loop_level[level - 1 + i].type = stmt[*(active.begin())].loop_level[privatized_levels[i]].type;
+ copy_stmt_write.loop_level[level - 1 +
+ i].payload = stmt[*(active.begin())].loop_level[privatized_levels[i]].payload;
+ copy_stmt_write.loop_level[level - 1 +
+ i].parallel_level = stmt[*(active.begin())].loop_level[privatized_levels[i]].parallel_level;
}
int left_num_dim = num_dep_dim - (get_last_dep_dim_before(*(active.begin()), level) + 1);
for (int i = 0; i < std::min(left_num_dim, static_cast<int>(index_sz.size())); i++) {
- copy_stmt_write.loop_level[level-1+privatized_levels.size()+i].type = LoopLevelOriginal;
- copy_stmt_write.loop_level[level-1+privatized_levels.size()+i].payload = num_dep_dim-left_num_dim+i;
- copy_stmt_write.loop_level[level-1+privatized_levels.size()+i].parallel_level = 0;
+ copy_stmt_write.loop_level[level - 1 + privatized_levels.size() + i].type = LoopLevelOriginal;
+ copy_stmt_write.loop_level[level - 1 + privatized_levels.size() + i].payload = num_dep_dim - left_num_dim + i;
+ copy_stmt_write.loop_level[level - 1 + privatized_levels.size() + i].parallel_level = 0;
}
for (int i = std::min(left_num_dim, static_cast<int>(index_sz.size())); i < index_sz.size(); i++) {
- copy_stmt_write.loop_level[level-1+privatized_levels.size()+i].type = LoopLevelUnknown;
- copy_stmt_write.loop_level[level-1+privatized_levels.size()+i].payload = -1;
- copy_stmt_write.loop_level[level-1+privatized_levels.size()+i].parallel_level = 0;
+ copy_stmt_write.loop_level[level - 1 + privatized_levels.size() + i].type = LoopLevelUnknown;
+ copy_stmt_write.loop_level[level - 1 + privatized_levels.size() + i].payload = -1;
+ copy_stmt_write.loop_level[level - 1 + privatized_levels.size() + i].parallel_level = 0;
}
- lex[dim-1]++;
- shiftLexicalOrder(lex, dim-1, -2);
+ lex[dim - 1]++;
+ shiftLexicalOrder(lex, dim - 1, -2);
- fprintf(stderr, "loop_datacopy.cc L1147 adding stmt %d\n", stmt.size());
+ fprintf(stderr, "loop_datacopy.cc L1147 adding stmt %d\n", stmt.size());
stmt.push_back(copy_stmt_write);
uninterpreted_symbols.push_back(uninterpreted_symbols[*(active.begin())]);
@@ -1152,24 +1184,24 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
wo_copy_stmt_num = stmt.size() - 1;
dep.insert();
}
-
+
//fprintf(stderr, "replace original array accesses with temporary array accesses\n");
// replace original array accesses with temporary array accesses
- for (int i =0; i < stmt_refs.size(); i++)
+ for (int i = 0; i < stmt_refs.size(); i++)
for (int j = 0; j < stmt_refs[i].second.size(); j++) {
if (index_sz.size() == 0) {
IR_ScalarRef *tmp_scalar_ref = ir->CreateScalarRef(static_cast<IR_ScalarSymbol *>(tmp_sym));
//fprintf(stderr, "dp3: loop_datacopy.cc calling ReplaceExpression i%d j%d\n", i, j);
ir->ReplaceExpression(stmt_refs[i].second[j], tmp_scalar_ref->convert());
- }
- else {
+ } else {
std::vector<CG_outputRepr *> index_repr(index_sz.size());
for (int k = 0; k < index_sz.size(); k++) {
int cur_index_num = index_sz[k].first;
-
- CG_outputRepr *cur_index_repr = ocg->CreateMinus(stmt_refs[i].second[j]->index(cur_index_num), index_lb[cur_index_num]->clone());
+
+ CG_outputRepr *cur_index_repr = ocg->CreateMinus(stmt_refs[i].second[j]->index(cur_index_num),
+ index_lb[cur_index_num]->clone());
if (padding_stride != 0) {
- if (k == n_dim-1) {
+ if (k == n_dim - 1) {
coef_t g = gcd(index_stride[cur_index_num], static_cast<coef_t>(padding_stride));
coef_t t1 = index_stride[cur_index_num] / g;
if (t1 != 1)
@@ -1177,23 +1209,22 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
coef_t t2 = padding_stride / g;
if (t2 != 1)
cur_index_repr = ocg->CreateTimes(cur_index_repr, ocg->CreateInt(t2));
- }
- else if (index_stride[cur_index_num] != 1) {
+ } else if (index_stride[cur_index_num] != 1) {
cur_index_repr = ocg->CreateIntegerFloor(cur_index_repr, ocg->CreateInt(index_stride[cur_index_num]));
}
}
-
+
if (ir->ArrayIndexStartAt() != 0)
cur_index_repr = ocg->CreatePlus(cur_index_repr, ocg->CreateInt(ir->ArrayIndexStartAt()));
index_repr[k] = cur_index_repr;
}
-
+
IR_ArrayRef *tmp_array_ref = ir->CreateArrayRef(static_cast<IR_ArraySymbol *>(tmp_sym), index_repr);
//fprintf(stderr, "loop_datacopy.cc ir->ReplaceExpression( ... )\n");
ir->ReplaceExpression(stmt_refs[i].second[j], tmp_array_ref->convert());
}
}
-
+
// update dependence graph
//fprintf(stderr, "update dependence graph\n");
@@ -1201,7 +1232,7 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
if (ro_copy_stmt_num != -1) {
for (int i = 0; i < old_num_stmt; i++) {
std::vector<std::vector<DependenceVector> > D;
-
+
for (DependenceGraph::EdgeList::iterator j = dep.vertex[i].second.begin(); j != dep.vertex[i].second.end();) {
if (active.find(i) != active.end() && active.find(j->first) == active.end()) {
std::vector<DependenceVector> dvs1, dvs2;
@@ -1215,8 +1246,7 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
j->second = dvs2;
if (dvs1.size() > 0)
dep.connect(ro_copy_stmt_num, j->first, dvs1);
- }
- else if (active.find(i) == active.end() && active.find(j->first) != active.end()) {
+ } else if (active.find(i) == active.end() && active.find(j->first) != active.end()) {
std::vector<DependenceVector> dvs1, dvs2;
for (int k = 0; k < j->second.size(); k++) {
DependenceVector dv = j->second[k];
@@ -1229,17 +1259,17 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
if (dvs1.size() > 0)
D.push_back(dvs1);
}
-
+
if (j->second.size() == 0)
dep.vertex[i].second.erase(j++);
else
j++;
}
-
+
for (int j = 0; j < D.size(); j++)
dep.connect(i, ro_copy_stmt_num, D[j]);
}
-
+
// insert dependences from copy statement loop to copied statements
//fprintf(stderr, "insert dependences from copy statement loop to copied statements\n");
@@ -1255,11 +1285,11 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
for (std::set<int>::iterator i = active.begin(); i != active.end(); i++)
dep.connect(ro_copy_stmt_num, *i, dv);
}
-
+
if (wo_copy_stmt_num != -1) {
for (int i = 0; i < old_num_stmt; i++) {
std::vector<std::vector<DependenceVector> > D;
-
+
for (DependenceGraph::EdgeList::iterator j = dep.vertex[i].second.begin(); j != dep.vertex[i].second.end();) {
if (active.find(i) != active.end() && active.find(j->first) == active.end()) {
std::vector<DependenceVector> dvs1, dvs2;
@@ -1273,8 +1303,7 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
j->second = dvs2;
if (dvs1.size() > 0)
dep.connect(wo_copy_stmt_num, j->first, dvs1);
- }
- else if (active.find(i) == active.end() && active.find(j->first) != active.end()) {
+ } else if (active.find(i) == active.end() && active.find(j->first) != active.end()) {
std::vector<DependenceVector> dvs1, dvs2;
for (int k = 0; k < j->second.size(); k++) {
DependenceVector dv = j->second[k];
@@ -1287,17 +1316,17 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
if (dvs1.size() > 0)
D.push_back(dvs1);
}
-
+
if (j->second.size() == 0)
dep.vertex[i].second.erase(j++);
else
j++;
}
-
+
for (int j = 0; j < D.size(); j++)
dep.connect(i, wo_copy_stmt_num, D[j]);
}
-
+
// insert dependences from copied statements to write statements
//fprintf(stderr, "dp3: insert dependences from copied statements to write statements\n");
@@ -1312,9 +1341,9 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
}
for (std::set<int>::iterator i = active.begin(); i != active.end(); i++)
dep.connect(*i, wo_copy_stmt_num, dv);
-
+
}
-
+
// update variable name for dependences among copied statements
for (int i = 0; i < old_num_stmt; i++) {
if (active.find(i) != active.end())
@@ -1325,7 +1354,7 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
j->second[k].sym = s;
}
}
-
+
// insert anti-dependence from write statement to read statement
if (ro_copy_stmt_num != -1 && wo_copy_stmt_num != -1)
if (dep_dim >= 0) {
@@ -1340,15 +1369,15 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
}
for (int k = 0; k < dep_dim; k++) {
if (k != 0) {
- dv.lbounds[k-1] = 0;
- dv.ubounds[k-1] = 0;
+ dv.lbounds[k - 1] = 0;
+ dv.ubounds[k - 1] = 0;
}
dv.lbounds[k] = 1;
dv.ubounds[k] = posInfinity;
dep.connect(wo_copy_stmt_num, ro_copy_stmt_num, dv);
}
}
-
+
//fprintf(stderr, "Loop::datacopy_privatized3() cleanup\n");
// cleanup
delete sym;
@@ -1361,7 +1390,7 @@ bool Loop::datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_A
index_sz[i].second->clear();
delete index_sz[i].second;
}
-
+
return true;
}
diff --git a/src/transformations/loop_extra.cc b/src/transformations/loop_extra.cc
index dac05bf..ee54815 100644
--- a/src/transformations/loop_extra.cc
+++ b/src/transformations/loop_extra.cc
@@ -25,43 +25,44 @@ void Loop::shift_to(int stmt_num, int level, int absolute_position) {
// combo
tile(stmt_num, level, 1, level, CountedTile);
std::vector<int> lex = getLexicalOrder(stmt_num);
- std::set<int> active = getStatements(lex, 2*level-2);
+ std::set<int> active = getStatements(lex, 2 * level - 2);
shift(active, level, absolute_position);
-
+
// remove unnecessary tiled loop since tile size is one
for (std::set<int>::iterator i = active.begin(); i != active.end(); i++) {
int n = stmt[*i].xform.n_out();
- Relation mapping(n, n-2);
+ Relation mapping(n, n - 2);
F_And *f_root = mapping.add_and();
- for (int j = 1; j <= 2*level; j++) {
+ for (int j = 1; j <= 2 * level; j++) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(mapping.output_var(j), 1);
h.update_coef(mapping.input_var(j), -1);
}
- for (int j = 2*level+3; j <= n; j++) {
+ for (int j = 2 * level + 3; j <= n; j++) {
EQ_Handle h = f_root->add_EQ();
- h.update_coef(mapping.output_var(j-2), 1);
+ h.update_coef(mapping.output_var(j - 2), 1);
h.update_coef(mapping.input_var(j), -1);
}
stmt[*i].xform = Composition(mapping, stmt[*i].xform);
stmt[*i].xform.simplify();
-
+
for (int j = 0; j < stmt[*i].loop_level.size(); j++)
- if (j != level-1 &&
+ if (j != level - 1 &&
stmt[*i].loop_level[j].type == LoopLevelTile &&
stmt[*i].loop_level[j].payload >= level)
stmt[*i].loop_level[j].payload--;
-
- stmt[*i].loop_level.erase(stmt[*i].loop_level.begin()+level-1);
+
+ stmt[*i].loop_level.erase(stmt[*i].loop_level.begin() + level - 1);
}
}
std::set<int> Loop::unroll_extra(int stmt_num, int level, int unroll_amount, int cleanup_split_level) {
- std::set<int> cleanup_stmts = unroll(stmt_num, level, unroll_amount,std::vector< std::vector<std::string> >(), cleanup_split_level);
+ std::set<int> cleanup_stmts = unroll(stmt_num, level, unroll_amount, std::vector<std::vector<std::string> >(),
+ cleanup_split_level);
for (std::set<int>::iterator i = cleanup_stmts.begin(); i != cleanup_stmts.end(); i++)
unroll(*i, level, 0);
-
+
return cleanup_stmts;
}
@@ -71,10 +72,10 @@ void Loop::peel(int stmt_num, int level, int peel_amount) {
throw std::invalid_argument("invalid statement number " + to_string(stmt_num));
if (level <= 0 || level > stmt[stmt_num].loop_level.size())
throw std::invalid_argument("invalid loop level " + to_string(level));
-
+
if (peel_amount == 0)
return;
-
+
std::set<int> subloop = getSubLoopNest(stmt_num, level);
std::vector<Relation> Rs;
for (std::set<int>::iterator i = subloop.begin(); i != subloop.end(); i++) {
@@ -83,7 +84,7 @@ void Loop::peel(int stmt_num, int level, int peel_amount) {
F_And *f_root = f.add_and();
for (int j = 1; j <= level; j++) {
EQ_Handle h = f_root->add_EQ();
- h.update_coef(f.input_var(2*j), 1);
+ h.update_coef(f.input_var(2 * j), 1);
h.update_coef(f.output_var(j), -1);
}
r = Composition(f, r);
@@ -91,7 +92,7 @@ void Loop::peel(int stmt_num, int level, int peel_amount) {
Rs.push_back(r);
}
Relation hull = SimpleHull(Rs);
-
+
if (peel_amount > 0) {
GEQ_Handle bound_eq;
bool found_bound = false;
@@ -120,7 +121,7 @@ void Loop::peel(int stmt_num, int level, int peel_amount) {
}
if (!found_bound)
throw loop_error("can't find lower bound for peeling at loop level " + to_string(level));
-
+
for (int i = 1; i <= peel_amount; i++) {
Relation r(level);
F_Exists *f_exists = r.add_and()->add_exists();
@@ -129,34 +130,33 @@ void Loop::peel(int stmt_num, int level, int peel_amount) {
std::map<Variable_ID, Variable_ID> exists_mapping;
for (Constr_Vars_Iter cvi(bound_eq); cvi; cvi++)
switch (cvi.curr_var()->kind()) {
- case Input_Var:
- h.update_coef(r.set_var(cvi.curr_var()->get_position()), cvi.curr_coef());
- break;
- case Wildcard_Var: {
- Variable_ID v = replicate_floor_definition(hull, cvi.curr_var(), r, f_exists, f_root, exists_mapping);
- h.update_coef(v, cvi.curr_coef());
- break;
- }
- case Global_Var: {
- Global_Var_ID g = cvi.curr_var()->get_global_var();
- Variable_ID v;
- if (g->arity() == 0)
- v = r.get_local(g);
- else
- v = r.get_local(g, cvi.curr_var()->function_of());
- h.update_coef(v, cvi.curr_coef());
- break;
- }
- default:
- assert(false);
+ case Input_Var:
+ h.update_coef(r.set_var(cvi.curr_var()->get_position()), cvi.curr_coef());
+ break;
+ case Wildcard_Var: {
+ Variable_ID v = replicate_floor_definition(hull, cvi.curr_var(), r, f_exists, f_root, exists_mapping);
+ h.update_coef(v, cvi.curr_coef());
+ break;
+ }
+ case Global_Var: {
+ Global_Var_ID g = cvi.curr_var()->get_global_var();
+ Variable_ID v;
+ if (g->arity() == 0)
+ v = r.get_local(g);
+ else
+ v = r.get_local(g, cvi.curr_var()->function_of());
+ h.update_coef(v, cvi.curr_coef());
+ break;
+ }
+ default:
+ assert(false);
}
h.update_const(bound_eq.get_const() - i);
r.simplify();
-
+
split(stmt_num, level, r);
}
- }
- else { // peel_amount < 0
+ } else { // peel_amount < 0
GEQ_Handle bound_eq;
bool found_bound = false;
for (GEQ_Iterator e(hull.single_conjunct()->GEQs()); e; e++)
@@ -184,7 +184,7 @@ void Loop::peel(int stmt_num, int level, int peel_amount) {
}
if (!found_bound)
throw loop_error("can't find upper bound for peeling at loop level " + to_string(level));
-
+
for (int i = 1; i <= -peel_amount; i++) {
Relation r(level);
F_Exists *f_exists = r.add_and()->add_exists();
@@ -193,30 +193,30 @@ void Loop::peel(int stmt_num, int level, int peel_amount) {
std::map<Variable_ID, Variable_ID> exists_mapping;
for (Constr_Vars_Iter cvi(bound_eq); cvi; cvi++)
switch (cvi.curr_var()->kind()) {
- case Input_Var:
- h.update_coef(r.set_var(cvi.curr_var()->get_position()), cvi.curr_coef());
- break;
- case Wildcard_Var: {
- Variable_ID v = replicate_floor_definition(hull, cvi.curr_var(), r, f_exists, f_root, exists_mapping);
- h.update_coef(v, cvi.curr_coef());
- break;
- }
- case Global_Var: {
- Global_Var_ID g = cvi.curr_var()->get_global_var();
- Variable_ID v;
- if (g->arity() == 0)
- v = r.get_local(g);
- else
- v = r.get_local(g, cvi.curr_var()->function_of());
- h.update_coef(v, cvi.curr_coef());
- break;
- }
- default:
- assert(false);
+ case Input_Var:
+ h.update_coef(r.set_var(cvi.curr_var()->get_position()), cvi.curr_coef());
+ break;
+ case Wildcard_Var: {
+ Variable_ID v = replicate_floor_definition(hull, cvi.curr_var(), r, f_exists, f_root, exists_mapping);
+ h.update_coef(v, cvi.curr_coef());
+ break;
+ }
+ case Global_Var: {
+ Global_Var_ID g = cvi.curr_var()->get_global_var();
+ Variable_ID v;
+ if (g->arity() == 0)
+ v = r.get_local(g);
+ else
+ v = r.get_local(g, cvi.curr_var()->function_of());
+ h.update_coef(v, cvi.curr_coef());
+ break;
+ }
+ default:
+ assert(false);
}
h.update_const(bound_eq.get_const() - i);
r.simplify();
-
+
split(stmt_num, level, r);
}
}
diff --git a/src/transformations/loop_tile.cc b/src/transformations/loop_tile.cc
index 41c3e7f..0a1808b 100644
--- a/src/transformations/loop_tile.cc
+++ b/src/transformations/loop_tile.cc
@@ -14,8 +14,6 @@
using namespace omega;
-
-
void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
TilingMethodType method, int alignment_offset, int alignment_multiple) {
// check for sanity of parameters
@@ -29,30 +27,30 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
throw std::invalid_argument("invalid loop level " + to_string(level));
if (level > stmt[stmt_num].loop_level.size())
throw std::invalid_argument(
- "there is no loop level " + to_string(level) + " for statement "
- + to_string(stmt_num));
+ "there is no loop level " + to_string(level) + " for statement "
+ + to_string(stmt_num));
if (outer_level <= 0 || outer_level > level)
throw std::invalid_argument(
- "invalid tile controlling loop level "
- + to_string(outer_level));
-
+ "invalid tile controlling loop level "
+ + to_string(outer_level));
+
// invalidate saved codegen computation
delete last_compute_cgr_;
last_compute_cgr_ = NULL;
delete last_compute_cg_;
last_compute_cg_ = NULL;
-
+
int dim = 2 * level - 1;
int outer_dim = 2 * outer_level - 1;
std::vector<int> lex = getLexicalOrder(stmt_num);
std::set<int> same_tiled_loop = getStatements(lex, dim - 1);
std::set<int> same_tile_controlling_loop = getStatements(lex,
outer_dim - 1);
-
+
for (std::set<int>::iterator i = same_tiled_loop.begin();
i != same_tiled_loop.end(); i++) {
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[*i].second.begin(); j != dep.vertex[*i].second.end();
+ dep.vertex[*i].second.begin(); j != dep.vertex[*i].second.end();
j++) {
if (same_tiled_loop.find(j->first) != same_tiled_loop.end())
for (int k = 0; k < j->second.size(); k++) {
@@ -63,34 +61,34 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
dim2 = stmt[*i].loop_level[dim2].payload - 1;
}
dim2 = stmt[*i].loop_level[dim2].payload;
-
+
if (dv.hasNegative(dim2) && (!dv.quasi)) {
for (int l = outer_level; l < level; l++)
if (stmt[*i].loop_level[l - 1].type
!= LoopLevelTile) {
if (dv.isCarried(
- stmt[*i].loop_level[l - 1].payload)
+ stmt[*i].loop_level[l - 1].payload)
&& dv.hasPositive(
- stmt[*i].loop_level[l - 1].payload))
+ stmt[*i].loop_level[l - 1].payload))
throw loop_error(
- "loop error: Tiling is illegal, dependence violation!");
+ "loop error: Tiling is illegal, dependence violation!");
} else {
-
+
int dim3 = l - 1;
while (stmt[*i].loop_level[l - 1].type
!= LoopLevelTile) {
dim3 =
- stmt[*i].loop_level[l - 1].payload
- - 1;
-
+ stmt[*i].loop_level[l - 1].payload
+ - 1;
+
}
-
+
dim3 = stmt[*i].loop_level[l - 1].payload;
if (dim3 < level - 1)
if (dv.isCarried(dim3)
&& dv.hasPositive(dim3))
throw loop_error(
- "loop error: Tiling is illegal, dependence violation!");
+ "loop error: Tiling is illegal, dependence violation!");
}
}
}
@@ -117,11 +115,11 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
h.update_coef(r.input_var(j), 1);
h.update_coef(r.output_var(j + 2), -1);
}
-
+
stmt[*i].xform = Composition(copy(r), stmt[*i].xform);
}
}
- // normal tiling
+ // normal tiling
else {
std::set<int> private_stmt;
for (std::set<int>::iterator i = same_tile_controlling_loop.begin();
@@ -131,12 +129,12 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
&& overflow.find(*i) != overflow.end())
private_stmt.insert(*i);
}
-
+
// extract the union of the iteration space to be considered
Relation hull;
{
std::vector<Relation> r_list;
-
+
for (std::set<int>::iterator i = same_tile_controlling_loop.begin();
i != same_tile_controlling_loop.end(); i++)
if (private_stmt.find(*i) == private_stmt.end()) {
@@ -150,28 +148,28 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
r.simplify(2, 4);
r_list.push_back(r);
}
-
+
hull = SimpleHull(r_list);
}
-
+
// extract the bound of the dimension to be tiled
Relation bound = get_loop_bound(hull, dim);
if (!bound.has_single_conjunct()) {
// further simplify the bound
hull = Approximate(hull);
bound = get_loop_bound(hull, dim);
-
+
int i = outer_dim - 2;
while (!bound.has_single_conjunct() && i >= 0) {
hull = Project(hull, i + 1, Set_Var);
bound = get_loop_bound(hull, dim);
i -= 2;
}
-
+
if (!bound.has_single_conjunct())
throw loop_error("cannot handle tile bounds");
}
-
+
// separate lower and upper bounds
std::vector<GEQ_Handle> lb_list, ub_list;
{
@@ -186,11 +184,11 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
}
if (lb_list.size() == 0)
throw loop_error(
- "unable to calculate tile controlling loop lower bound");
+ "unable to calculate tile controlling loop lower bound");
if (ub_list.size() == 0)
throw loop_error(
- "unable to calculate tile controlling loop upper bound");
-
+ "unable to calculate tile controlling loop upper bound");
+
// find the simplest lower bound for StridedTile or simplest iteration count for CountedTile
int simplest_lb = 0, simplest_ub = 0;
if (method == StridedTile) {
@@ -199,20 +197,20 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
int cost = 0;
for (Constr_Vars_Iter ci(lb_list[i]); ci; ci++) {
switch ((*ci).var->kind()) {
- case Input_Var: {
- cost += 5;
- break;
- }
- case Global_Var: {
- cost += 2;
- break;
- }
- default:
- cost += 15;
- break;
+ case Input_Var: {
+ cost += 5;
+ break;
+ }
+ case Global_Var: {
+ cost += 2;
+ break;
+ }
+ default:
+ cost += 15;
+ break;
}
}
-
+
if (cost < best_cost) {
best_cost = cost;
simplest_lb = i;
@@ -224,67 +222,67 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
for (int i = 0; i < lb_list.size(); i++)
for (int j = 0; j < ub_list.size(); j++) {
int cost = 0;
-
+
for (Constr_Vars_Iter ci(lb_list[i]); ci; ci++) {
switch ((*ci).var->kind()) {
- case Input_Var: {
- s1[(*ci).var] += (*ci).coef;
- break;
- }
- case Global_Var: {
- s2[(*ci).var] += (*ci).coef;
- break;
- }
- case Exists_Var:
- case Wildcard_Var: {
- s3[(*ci).var] += (*ci).coef;
- break;
- }
- default:
- cost = INT_MAX - 2;
- break;
+ case Input_Var: {
+ s1[(*ci).var] += (*ci).coef;
+ break;
+ }
+ case Global_Var: {
+ s2[(*ci).var] += (*ci).coef;
+ break;
+ }
+ case Exists_Var:
+ case Wildcard_Var: {
+ s3[(*ci).var] += (*ci).coef;
+ break;
+ }
+ default:
+ cost = INT_MAX - 2;
+ break;
}
}
-
+
for (Constr_Vars_Iter ci(ub_list[j]); ci; ci++) {
switch ((*ci).var->kind()) {
- case Input_Var: {
- s1[(*ci).var] += (*ci).coef;
- break;
- }
- case Global_Var: {
- s2[(*ci).var] += (*ci).coef;
- break;
- }
- case Exists_Var:
- case Wildcard_Var: {
- s3[(*ci).var] += (*ci).coef;
- break;
- }
- default:
- if (cost == INT_MAX - 2)
- cost = INT_MAX - 1;
- else
- cost = INT_MAX - 3;
- break;
+ case Input_Var: {
+ s1[(*ci).var] += (*ci).coef;
+ break;
+ }
+ case Global_Var: {
+ s2[(*ci).var] += (*ci).coef;
+ break;
+ }
+ case Exists_Var:
+ case Wildcard_Var: {
+ s3[(*ci).var] += (*ci).coef;
+ break;
+ }
+ default:
+ if (cost == INT_MAX - 2)
+ cost = INT_MAX - 1;
+ else
+ cost = INT_MAX - 3;
+ break;
}
}
-
+
if (cost == 0) {
for (std::map<Variable_ID, coef_t>::iterator k =
- s1.begin(); k != s1.end(); k++)
+ s1.begin(); k != s1.end(); k++)
if ((*k).second != 0)
cost += 5;
for (std::map<Variable_ID, coef_t>::iterator k =
- s2.begin(); k != s2.end(); k++)
+ s2.begin(); k != s2.end(); k++)
if ((*k).second != 0)
cost += 2;
for (std::map<Variable_ID, coef_t>::iterator k =
- s3.begin(); k != s3.end(); k++)
+ s3.begin(); k != s3.end(); k++)
if ((*k).second != 0)
cost += 15;
}
-
+
if (cost < best_cost) {
best_cost = cost;
simplest_lb = i;
@@ -292,7 +290,7 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
}
}
}
-
+
// prepare the new transformation relations
for (std::set<int>::iterator i = same_tile_controlling_loop.begin();
i != same_tile_controlling_loop.end(); i++) {
@@ -303,58 +301,58 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
h.update_coef(r.output_var(j + 1), 1);
h.update_coef(r.input_var(j + 1), -1);
}
-
+
for (int j = outer_dim - 1; j < stmt[*i].xform.n_out(); j++) {
EQ_Handle h = f_root->add_EQ();
h.update_coef(r.output_var(j + 3), 1);
h.update_coef(r.input_var(j + 1), -1);
}
-
+
EQ_Handle h = f_root->add_EQ();
h.update_coef(r.output_var(outer_dim), 1);
h.update_const(-lex[outer_dim - 1]);
-
+
stmt[*i].xform = Composition(r, stmt[*i].xform);
}
-
+
// add tiling constraints.
for (std::set<int>::iterator i = same_tile_controlling_loop.begin();
i != same_tile_controlling_loop.end(); i++) {
F_And *f_super_root = stmt[*i].xform.and_with_and();
F_Exists *f_exists = f_super_root->add_exists();
F_And *f_root = f_exists->add_and();
-
+
// create a lower bound variable for easy formula creation later
Variable_ID aligned_lb;
{
Variable_ID lb = f_exists->declare();
coef_t coef = lb_list[simplest_lb].get_coef(
- bound.set_var(dim + 1));
+ bound.set_var(dim + 1));
if (coef == 1) { // e.g. if i >= m+5, then LB = m+5
EQ_Handle h = f_root->add_EQ();
h.update_coef(lb, 1);
for (Constr_Vars_Iter ci(lb_list[simplest_lb]); ci; ci++) {
switch ((*ci).var->kind()) {
- case Input_Var: {
- int pos = (*ci).var->get_position();
- if (pos != dim + 1)
- h.update_coef(stmt[*i].xform.output_var(pos),
- (*ci).coef);
- break;
- }
- case Global_Var: {
- Global_Var_ID g = (*ci).var->get_global_var();
- Variable_ID v;
- if (g->arity() == 0)
- v = stmt[*i].xform.get_local(g);
- else
- v = stmt[*i].xform.get_local(g,
- (*ci).var->function_of());
- h.update_coef(v, (*ci).coef);
- break;
- }
- default:
- throw loop_error("cannot handle tile bounds");
+ case Input_Var: {
+ int pos = (*ci).var->get_position();
+ if (pos != dim + 1)
+ h.update_coef(stmt[*i].xform.output_var(pos),
+ (*ci).coef);
+ break;
+ }
+ case Global_Var: {
+ Global_Var_ID g = (*ci).var->get_global_var();
+ Variable_ID v;
+ if (g->arity() == 0)
+ v = stmt[*i].xform.get_local(g);
+ else
+ v = stmt[*i].xform.get_local(g,
+ (*ci).var->function_of());
+ h.update_coef(v, (*ci).coef);
+ break;
+ }
+ default:
+ throw loop_error("cannot handle tile bounds");
}
}
h.update_const(lb_list[simplest_lb].get_const());
@@ -363,40 +361,40 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
GEQ_Handle h2 = f_root->add_GEQ();
for (Constr_Vars_Iter ci(lb_list[simplest_lb]); ci; ci++) {
switch ((*ci).var->kind()) {
- case Input_Var: {
- int pos = (*ci).var->get_position();
- if (pos == dim + 1) {
- h1.update_coef(lb, (*ci).coef);
- h2.update_coef(lb, -(*ci).coef);
- } else {
- h1.update_coef(stmt[*i].xform.output_var(pos),
- (*ci).coef);
- h2.update_coef(stmt[*i].xform.output_var(pos),
- -(*ci).coef);
+ case Input_Var: {
+ int pos = (*ci).var->get_position();
+ if (pos == dim + 1) {
+ h1.update_coef(lb, (*ci).coef);
+ h2.update_coef(lb, -(*ci).coef);
+ } else {
+ h1.update_coef(stmt[*i].xform.output_var(pos),
+ (*ci).coef);
+ h2.update_coef(stmt[*i].xform.output_var(pos),
+ -(*ci).coef);
+ }
+ break;
}
- break;
- }
- case Global_Var: {
- Global_Var_ID g = (*ci).var->get_global_var();
- Variable_ID v;
- if (g->arity() == 0)
- v = stmt[*i].xform.get_local(g);
- else
- v = stmt[*i].xform.get_local(g,
- (*ci).var->function_of());
- h1.update_coef(v, (*ci).coef);
- h2.update_coef(v, -(*ci).coef);
- break;
- }
- default:
- throw loop_error("cannot handle tile bounds");
+ case Global_Var: {
+ Global_Var_ID g = (*ci).var->get_global_var();
+ Variable_ID v;
+ if (g->arity() == 0)
+ v = stmt[*i].xform.get_local(g);
+ else
+ v = stmt[*i].xform.get_local(g,
+ (*ci).var->function_of());
+ h1.update_coef(v, (*ci).coef);
+ h2.update_coef(v, -(*ci).coef);
+ break;
+ }
+ default:
+ throw loop_error("cannot handle tile bounds");
}
}
h1.update_const(lb_list[simplest_lb].get_const());
h2.update_const(-lb_list[simplest_lb].get_const());
h2.update_const(coef - 1);
}
-
+
Variable_ID offset_lb;
if (alignment_offset == 0)
offset_lb = lb;
@@ -407,17 +405,17 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
h.update_coef(lb, -1);
h.update_const(alignment_offset);
}
-
+
if (alignment_multiple == 1) { // trivial
aligned_lb = offset_lb;
} else { // e.g. to align at 4, aligned_lb = 4*alpha && LB-4 < 4*alpha <= LB
aligned_lb = f_exists->declare();
Variable_ID e = f_exists->declare();
-
+
EQ_Handle h = f_root->add_EQ();
h.update_coef(aligned_lb, 1);
h.update_coef(e, -alignment_multiple);
-
+
GEQ_Handle h1 = f_root->add_GEQ();
GEQ_Handle h2 = f_root->add_GEQ();
h1.update_coef(e, alignment_multiple);
@@ -427,37 +425,37 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
h1.update_const(alignment_multiple - 1);
}
}
-
+
// create an upper bound variable for easy formula creation later
Variable_ID ub = f_exists->declare();
{
coef_t coef = -ub_list[simplest_ub].get_coef(
- bound.set_var(dim + 1));
+ bound.set_var(dim + 1));
if (coef == 1) { // e.g. if i <= m+5, then UB = m+5
EQ_Handle h = f_root->add_EQ();
h.update_coef(ub, -1);
for (Constr_Vars_Iter ci(ub_list[simplest_ub]); ci; ci++) {
switch ((*ci).var->kind()) {
- case Input_Var: {
- int pos = (*ci).var->get_position();
- if (pos != dim + 1)
- h.update_coef(stmt[*i].xform.output_var(pos),
- (*ci).coef);
- break;
- }
- case Global_Var: {
- Global_Var_ID g = (*ci).var->get_global_var();
- Variable_ID v;
- if (g->arity() == 0)
- v = stmt[*i].xform.get_local(g);
- else
- v = stmt[*i].xform.get_local(g,
- (*ci).var->function_of());
- h.update_coef(v, (*ci).coef);
- break;
- }
- default:
- throw loop_error("cannot handle tile bounds");
+ case Input_Var: {
+ int pos = (*ci).var->get_position();
+ if (pos != dim + 1)
+ h.update_coef(stmt[*i].xform.output_var(pos),
+ (*ci).coef);
+ break;
+ }
+ case Global_Var: {
+ Global_Var_ID g = (*ci).var->get_global_var();
+ Variable_ID v;
+ if (g->arity() == 0)
+ v = stmt[*i].xform.get_local(g);
+ else
+ v = stmt[*i].xform.get_local(g,
+ (*ci).var->function_of());
+ h.update_coef(v, (*ci).coef);
+ break;
+ }
+ default:
+ throw loop_error("cannot handle tile bounds");
}
}
h.update_const(ub_list[simplest_ub].get_const());
@@ -466,33 +464,33 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
GEQ_Handle h2 = f_root->add_GEQ();
for (Constr_Vars_Iter ci(ub_list[simplest_ub]); ci; ci++) {
switch ((*ci).var->kind()) {
- case Input_Var: {
- int pos = (*ci).var->get_position();
- if (pos == dim + 1) {
- h1.update_coef(ub, -(*ci).coef);
- h2.update_coef(ub, (*ci).coef);
- } else {
- h1.update_coef(stmt[*i].xform.output_var(pos),
- -(*ci).coef);
- h2.update_coef(stmt[*i].xform.output_var(pos),
- (*ci).coef);
+ case Input_Var: {
+ int pos = (*ci).var->get_position();
+ if (pos == dim + 1) {
+ h1.update_coef(ub, -(*ci).coef);
+ h2.update_coef(ub, (*ci).coef);
+ } else {
+ h1.update_coef(stmt[*i].xform.output_var(pos),
+ -(*ci).coef);
+ h2.update_coef(stmt[*i].xform.output_var(pos),
+ (*ci).coef);
+ }
+ break;
}
- break;
- }
- case Global_Var: {
- Global_Var_ID g = (*ci).var->get_global_var();
- Variable_ID v;
- if (g->arity() == 0)
- v = stmt[*i].xform.get_local(g);
- else
- v = stmt[*i].xform.get_local(g,
- (*ci).var->function_of());
- h1.update_coef(v, -(*ci).coef);
- h2.update_coef(v, (*ci).coef);
- break;
- }
- default:
- throw loop_error("cannot handle tile bounds");
+ case Global_Var: {
+ Global_Var_ID g = (*ci).var->get_global_var();
+ Variable_ID v;
+ if (g->arity() == 0)
+ v = stmt[*i].xform.get_local(g);
+ else
+ v = stmt[*i].xform.get_local(g,
+ (*ci).var->function_of());
+ h1.update_coef(v, -(*ci).coef);
+ h2.update_coef(v, (*ci).coef);
+ break;
+ }
+ default:
+ throw loop_error("cannot handle tile bounds");
}
}
h1.update_const(-ub_list[simplest_ub].get_const());
@@ -500,13 +498,13 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
h1.update_const(coef - 1);
}
}
-
+
// insert tile controlling loop constraints
if (method == StridedTile) { // e.g. ii = LB + 32 * alpha && alpha >= 0
Variable_ID e = f_exists->declare();
GEQ_Handle h1 = f_root->add_GEQ();
h1.update_coef(e, 1);
-
+
EQ_Handle h2 = f_root->add_EQ();
h2.update_coef(stmt[*i].xform.output_var(outer_dim + 1), 1);
h2.update_coef(e, -tile_size);
@@ -514,14 +512,14 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
} else if (method == CountedTile) { // e.g. 0 <= ii < ceiling((UB-LB+1)/32)
GEQ_Handle h1 = f_root->add_GEQ();
h1.update_coef(stmt[*i].xform.output_var(outer_dim + 1), 1);
-
+
GEQ_Handle h2 = f_root->add_GEQ();
h2.update_coef(stmt[*i].xform.output_var(outer_dim + 1),
-tile_size);
h2.update_coef(aligned_lb, -1);
h2.update_coef(ub, 1);
}
-
+
// special care for private statements like overflow assignment
if (private_stmt.find(*i) != private_stmt.end()) { // e.g. ii <= UB
GEQ_Handle h = f_root->add_GEQ();
@@ -529,14 +527,14 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
h.update_coef(ub, 1);
}
- // restrict original loop index inside the tile
+ // restrict original loop index inside the tile
else {
if (method == StridedTile) { // e.g. ii <= i < ii + tile_size
GEQ_Handle h1 = f_root->add_GEQ();
h1.update_coef(stmt[*i].xform.output_var(dim + 3), 1);
h1.update_coef(stmt[*i].xform.output_var(outer_dim + 1),
-1);
-
+
GEQ_Handle h2 = f_root->add_GEQ();
h2.update_coef(stmt[*i].xform.output_var(dim + 3), -1);
h2.update_coef(stmt[*i].xform.output_var(outer_dim + 1), 1);
@@ -547,7 +545,7 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
-tile_size);
h1.update_coef(stmt[*i].xform.output_var(dim + 3), 1);
h1.update_coef(aligned_lb, -1);
-
+
GEQ_Handle h2 = f_root->add_GEQ();
h2.update_coef(stmt[*i].xform.output_var(outer_dim + 1),
tile_size);
@@ -558,30 +556,30 @@ void Loop::tile(int stmt_num, int level, int tile_size, int outer_level,
}
}
}
-
+
// update loop level information
for (std::set<int>::iterator i = same_tile_controlling_loop.begin();
i != same_tile_controlling_loop.end(); i++) {
for (int j = 1; j <= stmt[*i].loop_level.size(); j++)
switch (stmt[*i].loop_level[j - 1].type) {
- case LoopLevelOriginal:
- break;
- case LoopLevelTile:
- if (stmt[*i].loop_level[j - 1].payload >= outer_level)
- stmt[*i].loop_level[j - 1].payload++;
- break;
- default:
- throw loop_error(
- "unknown loop level type for statement "
- + to_string(*i));
+ case LoopLevelOriginal:
+ break;
+ case LoopLevelTile:
+ if (stmt[*i].loop_level[j - 1].payload >= outer_level)
+ stmt[*i].loop_level[j - 1].payload++;
+ break;
+ default:
+ throw loop_error(
+ "unknown loop level type for statement "
+ + to_string(*i));
}
-
+
LoopLevel ll;
ll.type = LoopLevelTile;
ll.payload = level + 1;
ll.parallel_level = 0;
stmt[*i].loop_level.insert(
- stmt[*i].loop_level.begin() + (outer_level - 1), ll);
+ stmt[*i].loop_level.begin() + (outer_level - 1), ll);
}
}
diff --git a/src/transformations/loop_unroll.cc b/src/transformations/loop_unroll.cc
index 86ffd84..3238d50 100644
--- a/src/transformations/loop_unroll.cc
+++ b/src/transformations/loop_unroll.cc
@@ -23,54 +23,54 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
// check for sanity of parameters
if (unroll_amount < 0)
throw std::invalid_argument(
- "invalid unroll amount " + to_string(unroll_amount));
+ "invalid unroll amount " + to_string(unroll_amount));
if (stmt_num < 0 || stmt_num >= stmt.size())
throw std::invalid_argument("invalid statement " + to_string(stmt_num));
if (level <= 0 || level > stmt[stmt_num].loop_level.size())
throw std::invalid_argument("invalid loop level " + to_string(level));
-
+
if (cleanup_split_level == 0)
cleanup_split_level = level;
if (cleanup_split_level > level)
throw std::invalid_argument(
- "cleanup code must be split at or outside the unrolled loop level "
- + to_string(level));
+ "cleanup code must be split at or outside the unrolled loop level "
+ + to_string(level));
if (cleanup_split_level <= 0)
throw std::invalid_argument(
- "invalid split loop level " + to_string(cleanup_split_level));
-
+ "invalid split loop level " + to_string(cleanup_split_level));
+
// invalidate saved codegen computation
delete last_compute_cgr_;
last_compute_cgr_ = NULL;
delete last_compute_cg_;
last_compute_cg_ = NULL;
-
+
int dim = 2 * level - 1;
std::vector<int> lex = getLexicalOrder(stmt_num);
std::set<int> same_loop = getStatements(lex, dim - 1);
-
+
// nothing to do
if (unroll_amount == 1)
return std::set<int>();
-
+
for (std::set<int>::iterator i = same_loop.begin(); i != same_loop.end();
i++) {
std::vector<std::pair<int, DependenceVector> > D;
int n = stmt[*i].xform.n_out();
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[*i].second.begin(); j != dep.vertex[*i].second.end();
+ dep.vertex[*i].second.begin(); j != dep.vertex[*i].second.end();
j++) {
if (same_loop.find(j->first) != same_loop.end())
for (int k = 0; k < j->second.size(); k++) {
DependenceVector dv = j->second[k];
int dim2 = level - 1;
if (dv.type != DEP_CONTROL) {
-
+
while (stmt[*i].loop_level[dim2].type == LoopLevelTile) {
dim2 = stmt[*i].loop_level[dim2].payload - 1;
}
dim2 = stmt[*i].loop_level[dim2].payload;
-
+
/*if (dv.isCarried(dim2)
&& (dv.hasNegative(dim2) && !dv.quasi))
throw loop_error(
@@ -82,11 +82,11 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
"loop error: Unrolling is illegal, dependence violation!");
*/
bool safe = false;
-
+
if (dv.isCarried(dim2) && dv.hasPositive(dim2)) {
if (dv.quasi)
throw loop_error(
- "loop error: a quasi dependence with a positive carried distance");
+ "loop error: a quasi dependence with a positive carried distance");
if (!dv.quasi) {
if (dv.lbounds[dim2] != posInfinity) {
//if (dv.lbounds[dim2] != negInfinity)
@@ -102,33 +102,33 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
} else
safe = true;
}*/
-
+
if (!safe) {
for (int l = level + 1; l <= (n - 1) / 2; l++) {
int dim3 = l - 1;
-
+
if (stmt[*i].loop_level[dim3].type
!= LoopLevelTile)
dim3 =
- stmt[*i].loop_level[dim3].payload;
+ stmt[*i].loop_level[dim3].payload;
else {
while (stmt[*i].loop_level[dim3].type
== LoopLevelTile) {
dim3 =
- stmt[*i].loop_level[dim3].payload
- - 1;
+ stmt[*i].loop_level[dim3].payload
+ - 1;
}
dim3 =
- stmt[*i].loop_level[dim3].payload;
+ stmt[*i].loop_level[dim3].payload;
}
-
+
if (dim3 > dim2) {
-
+
if (dv.hasPositive(dim3))
break;
else if (dv.hasNegative(dim3))
throw loop_error(
- "loop error: Unrolling is illegal, dependence violation!");
+ "loop error: Unrolling is illegal, dependence violation!");
}
}
}
@@ -153,7 +153,7 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
hull = Intersection(hull,
omega::Range(Restrict_Domain(mapping, copy(stmt[*i].IS))));
hull.simplify(2, 4);
-
+
}
}
for (int i = 1; i <= level; i++) {
@@ -161,7 +161,7 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
hull.name_set_var(i, name);
}
hull.setup_names();
-
+
// extract the exact loop bound of the dimension to be unrolled
if (is_single_loop_iteration(hull, level, this->known))
return std::set<int>();
@@ -169,7 +169,7 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
if (!bound.has_single_conjunct() || !bound.is_satisfiable()
|| bound.is_tautology())
throw loop_error("unable to extract loop bound for unrolling");
-
+
// extract the loop stride
coef_t stride;
std::pair<EQ_Handle, Variable_ID> result = find_simplest_stride(bound,
@@ -178,9 +178,9 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
stride = 1;
else
stride = abs(result.first.get_coef(result.second))
- / gcd(abs(result.first.get_coef(result.second)),
- abs(result.first.get_coef(bound.set_var(level))));
-
+ / gcd(abs(result.first.get_coef(result.second)),
+ abs(result.first.get_coef(bound.set_var(level))));
+
// separate lower and upper bounds
std::vector<GEQ_Handle> lb_list, ub_list;
{
@@ -193,17 +193,17 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
lb_list.push_back(*gi);
}
}
-
+
// simplify overflow expression for each pair of upper and lower bounds
std::vector<std::vector<std::map<Variable_ID, int> > > overflow_table(
- lb_list.size(),
- std::vector<std::map<Variable_ID, int> >(ub_list.size(),
- std::map<Variable_ID, int>()));
+ lb_list.size(),
+ std::vector<std::map<Variable_ID, int> >(ub_list.size(),
+ std::map<Variable_ID, int>()));
bool is_overflow_simplifiable = true;
for (int i = 0; i < lb_list.size(); i++) {
if (!is_overflow_simplifiable)
break;
-
+
for (int j = 0; j < ub_list.size(); j++) {
// lower bound or upper bound has non-unit coefficient, can't simplify
if (ub_list[j].get_coef(bound.set_var(level)) != -1
@@ -211,81 +211,81 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
is_overflow_simplifiable = false;
break;
}
-
+
for (Constr_Vars_Iter ci(ub_list[j]); ci; ci++) {
switch ((*ci).var->kind()) {
- case Input_Var: {
- if ((*ci).var != bound.set_var(level))
+ case Input_Var: {
+ if ((*ci).var != bound.set_var(level))
+ overflow_table[i][j][(*ci).var] += (*ci).coef;
+
+ break;
+ }
+ case Global_Var: {
+ Global_Var_ID g = (*ci).var->get_global_var();
+ Variable_ID v;
+ if (g->arity() == 0)
+ v = bound.get_local(g);
+ else
+ v = bound.get_local(g, (*ci).var->function_of());
overflow_table[i][j][(*ci).var] += (*ci).coef;
-
- break;
- }
- case Global_Var: {
- Global_Var_ID g = (*ci).var->get_global_var();
- Variable_ID v;
- if (g->arity() == 0)
- v = bound.get_local(g);
- else
- v = bound.get_local(g, (*ci).var->function_of());
- overflow_table[i][j][(*ci).var] += (*ci).coef;
- break;
- }
- default:
- throw loop_error("failed to calculate overflow amount");
+ break;
+ }
+ default:
+ throw loop_error("failed to calculate overflow amount");
}
}
overflow_table[i][j][NULL] += ub_list[j].get_const();
-
+
for (Constr_Vars_Iter ci(lb_list[i]); ci; ci++) {
switch ((*ci).var->kind()) {
- case Input_Var: {
- if ((*ci).var != bound.set_var(level)) {
+ case Input_Var: {
+ if ((*ci).var != bound.set_var(level)) {
+ overflow_table[i][j][(*ci).var] += (*ci).coef;
+ if (overflow_table[i][j][(*ci).var] == 0)
+ overflow_table[i][j].erase(
+ overflow_table[i][j].find((*ci).var));
+ }
+ break;
+ }
+ case Global_Var: {
+ Global_Var_ID g = (*ci).var->get_global_var();
+ Variable_ID v;
+ if (g->arity() == 0)
+ v = bound.get_local(g);
+ else
+ v = bound.get_local(g, (*ci).var->function_of());
overflow_table[i][j][(*ci).var] += (*ci).coef;
if (overflow_table[i][j][(*ci).var] == 0)
overflow_table[i][j].erase(
- overflow_table[i][j].find((*ci).var));
+ overflow_table[i][j].find((*ci).var));
+ break;
}
- break;
- }
- case Global_Var: {
- Global_Var_ID g = (*ci).var->get_global_var();
- Variable_ID v;
- if (g->arity() == 0)
- v = bound.get_local(g);
- else
- v = bound.get_local(g, (*ci).var->function_of());
- overflow_table[i][j][(*ci).var] += (*ci).coef;
- if (overflow_table[i][j][(*ci).var] == 0)
- overflow_table[i][j].erase(
- overflow_table[i][j].find((*ci).var));
- break;
- }
- default:
- throw loop_error("failed to calculate overflow amount");
+ default:
+ throw loop_error("failed to calculate overflow amount");
}
}
overflow_table[i][j][NULL] += lb_list[i].get_const();
-
+
overflow_table[i][j][NULL] += stride;
if (unroll_amount == 0
|| (overflow_table[i][j].size() == 1
&& overflow_table[i][j][NULL] / stride
- < unroll_amount))
+ < unroll_amount))
unroll_amount = overflow_table[i][j][NULL] / stride;
}
}
-
+
// loop iteration count can't be determined, bail out gracefully
if (unroll_amount == 0)
return std::set<int>();
-
+
// further simply overflow calculation using coefficients' modular
if (is_overflow_simplifiable) {
for (int i = 0; i < lb_list.size(); i++)
for (int j = 0; j < ub_list.size(); j++)
if (stride == 1) {
for (std::map<Variable_ID, int>::iterator k =
- overflow_table[i][j].begin();
+ overflow_table[i][j].begin();
k != overflow_table[i][j].end();)
if ((*k).first != NULL) {
int t = int_mod_hat((*k).second, unroll_amount);
@@ -304,20 +304,20 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
}
} else
k++;
-
+
overflow_table[i][j][NULL] = int_mod_hat(
- overflow_table[i][j][NULL], unroll_amount);
-
+ overflow_table[i][j][NULL], unroll_amount);
+
// Since we don't have MODULO instruction in SUIF yet (only MOD),
// make all coef positive in the final formula
for (std::map<Variable_ID, int>::iterator k =
- overflow_table[i][j].begin();
+ overflow_table[i][j].begin();
k != overflow_table[i][j].end(); k++)
if ((*k).second < 0)
(*k).second += unroll_amount;
}
}
-
+
// build overflow statement
CG_outputBuilder *ocg = ir->builder();
CG_outputRepr *overflow_code = NULL;
@@ -331,17 +331,17 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
// upper splitting condition
GEQ_Handle h = cond_upper.and_with_GEQ(ub_list[i]);
h.update_const(
- ((overflow_table[0][i][NULL] / stride) % unroll_amount)
- * -stride);
+ ((overflow_table[0][i][NULL] / stride) % unroll_amount)
+ * -stride);
} else {
// upper splitting condition
std::string over_name = overflow_var_name_prefix
- + to_string(overflow_var_name_counter++);
+ + to_string(overflow_var_name_counter++);
Free_Var_Decl *over_free_var = new Free_Var_Decl(over_name);
over_var_list.push_back(over_free_var);
GEQ_Handle h = cond_upper.and_with_GEQ(ub_list[i]);
h.update_coef(cond_upper.get_local(over_free_var), -stride);
-
+
// insert constraint 0 <= overflow < unroll_amount
Variable_ID v = overflow_constraint.get_local(over_free_var);
GEQ_Handle h1 = overflow_constraint_root->add_GEQ();
@@ -349,20 +349,20 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
GEQ_Handle h2 = overflow_constraint_root->add_GEQ();
h2.update_coef(v, -1);
h2.update_const(unroll_amount - 1);
-
+
// create overflow assignment
bound.setup_names(); // hack to fix omega relation variable names issue
CG_outputRepr *rhs = NULL;
bool is_split_illegal = false;
for (std::map<Variable_ID, int>::iterator j =
- overflow_table[0][i].begin();
+ overflow_table[0][i].begin();
j != overflow_table[0][i].end(); j++)
if ((*j).first != NULL) {
if ((*j).first->kind() == Input_Var
&& (*j).first->get_position()
- >= cleanup_split_level)
+ >= cleanup_split_level)
is_split_illegal = true;
-
+
CG_outputRepr *t = ocg->CreateIdent((*j).first->name());
if ((*j).second != 1)
t = ocg->CreateTimes(ocg->CreateInt((*j).second),
@@ -370,20 +370,20 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
rhs = ocg->CreatePlus(rhs, t);
} else if ((*j).second != 0)
rhs = ocg->CreatePlus(rhs, ocg->CreateInt((*j).second));
-
+
if (is_split_illegal) {
rhs->clear();
delete rhs;
throw loop_error(
- "cannot split cleanup code at loop level "
- + to_string(cleanup_split_level)
- + " due to overflow variable data dependence");
+ "cannot split cleanup code at loop level "
+ + to_string(cleanup_split_level)
+ + " due to overflow variable data dependence");
}
-
+
if (stride != 1)
rhs = ocg->CreateIntegerCeil(rhs, ocg->CreateInt(stride));
rhs = ocg->CreateIntegerMod(rhs, ocg->CreateInt(unroll_amount));
-
+
CG_outputRepr *lhs = ocg->CreateIdent(over_name);
init_code = ocg->StmtListAppend(init_code,
ocg->CreateAssignment(0, lhs, ocg->CreateInt(0)));
@@ -392,12 +392,12 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
ocg->CreateAssignment(0, lhs, rhs));
}
}
-
+
// lower splitting condition
GEQ_Handle h = cond_lower.and_with_GEQ(lb_list[0]);
} else if (is_overflow_simplifiable && ub_list.size() == 1) {
for (int i = 0; i < lb_list.size(); i++) {
-
+
if (overflow_table[i][0].size() == 1) {
// lower splitting condition
GEQ_Handle h = cond_lower.and_with_GEQ(lb_list[i]);
@@ -405,12 +405,12 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
} else {
// lower splitting condition
std::string over_name = overflow_var_name_prefix
- + to_string(overflow_var_name_counter++);
+ + to_string(overflow_var_name_counter++);
Free_Var_Decl *over_free_var = new Free_Var_Decl(over_name);
over_var_list.push_back(over_free_var);
GEQ_Handle h = cond_lower.and_with_GEQ(lb_list[i]);
h.update_coef(cond_lower.get_local(over_free_var), -stride);
-
+
// insert constraint 0 <= overflow < unroll_amount
Variable_ID v = overflow_constraint.get_local(over_free_var);
GEQ_Handle h1 = overflow_constraint_root->add_GEQ();
@@ -418,12 +418,12 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
GEQ_Handle h2 = overflow_constraint_root->add_GEQ();
h2.update_coef(v, -1);
h2.update_const(unroll_amount - 1);
-
+
// create overflow assignment
bound.setup_names(); // hack to fix omega relation variable names issue
CG_outputRepr *rhs = NULL;
for (std::map<Variable_ID, int>::iterator j =
- overflow_table[0][i].begin();
+ overflow_table[0][i].begin();
j != overflow_table[0][i].end(); j++)
if ((*j).first != NULL) {
CG_outputRepr *t = ocg->CreateIdent((*j).first->name());
@@ -433,11 +433,11 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
rhs = ocg->CreatePlus(rhs, t);
} else if ((*j).second != 0)
rhs = ocg->CreatePlus(rhs, ocg->CreateInt((*j).second));
-
+
if (stride != 1)
rhs = ocg->CreateIntegerCeil(rhs, ocg->CreateInt(stride));
rhs = ocg->CreateIntegerMod(rhs, ocg->CreateInt(unroll_amount));
-
+
CG_outputRepr *lhs = ocg->CreateIdent(over_name);
init_code = ocg->StmtListAppend(init_code,
ocg->CreateAssignment(0, lhs, ocg->CreateInt(0)));
@@ -446,61 +446,59 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
ocg->CreateAssignment(0, lhs, rhs));
}
}
-
+
// upper splitting condition
GEQ_Handle h = cond_upper.and_with_GEQ(ub_list[0]);
} else {
std::string over_name = overflow_var_name_prefix
- + to_string(overflow_var_name_counter++);
+ + to_string(overflow_var_name_counter++);
Free_Var_Decl *over_free_var = new Free_Var_Decl(over_name);
over_var_list.push_back(over_free_var);
-
+
std::vector<CG_outputRepr *> lb_repr_list, ub_repr_list;
for (int i = 0; i < lb_list.size(); i++) {
lb_repr_list.push_back(
- output_lower_bound_repr(ocg,
- lb_list[i],
- bound.set_var(dim + 1), result.first, result.second,
- bound, Relation::True(bound.n_set()),
- std::vector<std::pair<CG_outputRepr *, int> >(
- bound.n_set(),
- std::make_pair(
- static_cast<CG_outputRepr *>(NULL),
- 0)),
- uninterpreted_symbols[stmt_num]));
+ output_lower_bound_repr(ocg,
+ lb_list[i],
+ bound.set_var(dim + 1), result.first, result.second,
+ bound, Relation::True(bound.n_set()),
+ std::vector<std::pair<CG_outputRepr *, int> >(
+ bound.n_set(),
+ std::make_pair(
+ static_cast<CG_outputRepr *>(NULL),
+ 0)),
+ uninterpreted_symbols[stmt_num]));
GEQ_Handle h = cond_lower.and_with_GEQ(lb_list[i]);
}
for (int i = 0; i < ub_list.size(); i++) {
ub_repr_list.push_back(
- output_upper_bound_repr(ocg, ub_list[i],
- bound.set_var(dim + 1), bound,
- std::vector<std::pair<CG_outputRepr *, int> >(
- bound.n_set(),
- std::make_pair(
- static_cast<CG_outputRepr *>(NULL),
- 0)),
- uninterpreted_symbols[stmt_num]));
+ output_upper_bound_repr(ocg, ub_list[i],
+ bound.set_var(dim + 1), bound,
+ std::vector<std::pair<CG_outputRepr *, int> >(
+ bound.n_set(),
+ std::make_pair(
+ static_cast<CG_outputRepr *>(NULL),
+ 0)),
+ uninterpreted_symbols[stmt_num]));
GEQ_Handle h = cond_upper.and_with_GEQ(ub_list[i]);
h.update_coef(cond_upper.get_local(over_free_var), -stride);
}
-
- CG_outputRepr *lbRepr, *ubRepr;
+
+ CG_outputRepr *lbRepr, *ubRepr;
if (lb_repr_list.size() > 1) {
//fprintf(stderr, "loop_unroll.cc createInvoke( max )\n");
lbRepr = ocg->CreateInvoke("max", lb_repr_list);
- }
- else if (lb_repr_list.size() == 1) {
+ } else if (lb_repr_list.size() == 1) {
lbRepr = lb_repr_list[0];
}
-
+
if (ub_repr_list.size() > 1) {
//fprintf(stderr, "loop_unroll.cc createInvoke( min )\n");
ubRepr = ocg->CreateInvoke("min", ub_repr_list);
- }
- else if (ub_repr_list.size() == 1) {
+ } else if (ub_repr_list.size() == 1) {
ubRepr = ub_repr_list[0];
}
-
+
// create overflow assignment
CG_outputRepr *rhs = ocg->CreatePlus(ocg->CreateMinus(ubRepr, lbRepr),
ocg->CreateInt(1));
@@ -512,7 +510,7 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
ocg->CreateAssignment(0, lhs, ocg->CreateInt(0)));
lhs = ocg->CreateIdent(over_name);
overflow_code = ocg->CreateAssignment(0, lhs, rhs);
-
+
// insert constraint 0 <= overflow < unroll_amount
Variable_ID v = overflow_constraint.get_local(over_free_var);
GEQ_Handle h1 = overflow_constraint_root->add_GEQ();
@@ -521,7 +519,7 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
h2.update_coef(v, -1);
h2.update_const(unroll_amount - 1);
}
-
+
// insert overflow statement
int overflow_stmt_num = -1;
if (overflow_code != NULL) {
@@ -537,7 +535,7 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
for (int i = 1; i < cleanup_split_level; i++)
overflow_IS.name_set_var(i, hull.set_var(i)->name());
overflow_IS.setup_names();
-
+
// build dumb transformation relation for overflow statement
Relation overflow_xform(cleanup_split_level - 1,
2 * (cleanup_split_level - 1) + 1);
@@ -546,20 +544,20 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
EQ_Handle h = f_root->add_EQ();
h.update_coef(overflow_xform.output_var(2 * i), 1);
h.update_coef(overflow_xform.input_var(i), -1);
-
+
h = f_root->add_EQ();
h.update_coef(overflow_xform.output_var(2 * i - 1), 1);
h.update_const(-lex[2 * i - 2]);
}
EQ_Handle h = f_root->add_EQ();
h.update_coef(
- overflow_xform.output_var(2 * (cleanup_split_level - 1) + 1),
- 1);
+ overflow_xform.output_var(2 * (cleanup_split_level - 1) + 1),
+ 1);
h.update_const(-lex[2 * (cleanup_split_level - 1)]);
-
+
shiftLexicalOrder(lex, 2 * cleanup_split_level - 2, 1);
Statement overflow_stmt;
-
+
overflow_stmt.code = overflow_code;
overflow_stmt.IS = overflow_IS;
overflow_stmt.xform = overflow_xform;
@@ -567,18 +565,18 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
overflow_stmt.ir_stmt_node = NULL;
for (int i = 0; i < level - 1; i++) {
overflow_stmt.loop_level[i].type =
- stmt[stmt_num].loop_level[i].type;
+ stmt[stmt_num].loop_level[i].type;
if (stmt[stmt_num].loop_level[i].type == LoopLevelTile
&& stmt[stmt_num].loop_level[i].payload >= level)
overflow_stmt.loop_level[i].payload = -1;
else
overflow_stmt.loop_level[i].payload =
- stmt[stmt_num].loop_level[i].payload;
+ stmt[stmt_num].loop_level[i].payload;
overflow_stmt.loop_level[i].parallel_level =
- stmt[stmt_num].loop_level[i].parallel_level;
+ stmt[stmt_num].loop_level[i].parallel_level;
}
-
- fprintf(stderr, "loop_unroll.cc L581 adding stmt %d\n", stmt.size());
+
+ fprintf(stderr, "loop_unroll.cc L581 adding stmt %d\n", stmt.size());
stmt.push_back(overflow_stmt);
uninterpreted_symbols.push_back(uninterpreted_symbols[stmt_num]);
@@ -586,12 +584,12 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
dep.insert();
overflow_stmt_num = stmt.size() - 1;
overflow[overflow_stmt_num] = over_var_list;
-
+
// update the global known information on overflow variable
this->known = Intersection(this->known,
Extend_Set(copy(overflow_constraint),
this->known.n_set() - overflow_constraint.n_set()));
-
+
// update dependence graph
DependenceVector dv;
dv.type = DEP_CONTROL;
@@ -628,12 +626,12 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
dep.connect(overflow_stmt_num, overflow_stmt_num, dv);
}
}
-
+
// split the loop so it can be fully unrolled
std::set<int> new_stmts = split(stmt_num, cleanup_split_level, cond_upper);
std::set<int> new_stmts2 = split(stmt_num, cleanup_split_level, cond_lower);
new_stmts.insert(new_stmts2.begin(), new_stmts2.end());
-
+
// check if unrolled statements can be trivially lumped together as one statement
bool can_be_lumped = true;
if (can_be_lumped) {
@@ -649,7 +647,7 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
if (!(stmt[*i].loop_level[j].type
== stmt[stmt_num].loop_level[j].type
&& stmt[*i].loop_level[j].payload
- == stmt[stmt_num].loop_level[j].payload)) {
+ == stmt[stmt_num].loop_level[j].payload)) {
can_be_lumped = false;
break;
}
@@ -690,7 +688,7 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
for (std::set<int>::iterator i = same_loop.begin();
i != same_loop.end(); i++) {
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[*i].second.begin();
+ dep.vertex[*i].second.begin();
j != dep.vertex[*i].second.end(); j++)
if (same_loop.find(j->first) != same_loop.end()) {
for (int k = 0; k < j->second.size(); k++)
@@ -706,38 +704,38 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
break;
}
}
-
+
// insert unrolled statements
int old_num_stmt = stmt.size();
if (!can_be_lumped) {
std::map<int, std::vector<int> > what_stmt_num;
-
+
for (int j = 1; j < unroll_amount; j++) {
for (std::set<int>::iterator i = same_loop.begin();
i != same_loop.end(); i++) {
Statement new_stmt;
-
+
std::vector<std::string> loop_vars;
std::vector<CG_outputRepr *> subs;
loop_vars.push_back(stmt[*i].IS.set_var(level)->name());
subs.push_back(
- ocg->CreatePlus(
- ocg->CreateIdent(
- stmt[*i].IS.set_var(level)->name()),
- ocg->CreateInt(j * stride)));
+ ocg->CreatePlus(
+ ocg->CreateIdent(
+ stmt[*i].IS.set_var(level)->name()),
+ ocg->CreateInt(j * stride)));
new_stmt.code = ocg->CreateSubstitutedStmt(0,
stmt[*i].code->clone(), loop_vars, subs);
-
+
new_stmt.IS = adjust_loop_bound(stmt[*i].IS, level, j * stride);
add_loop_stride(new_stmt.IS, bound, level - 1,
unroll_amount * stride);
-
+
new_stmt.xform = copy(stmt[*i].xform);
-
+
new_stmt.loop_level = stmt[*i].loop_level;
new_stmt.ir_stmt_node = NULL;
- fprintf(stderr, "loop_unroll.cc L740 adding stmt %d\n", stmt.size());
+ fprintf(stderr, "loop_unroll.cc L740 adding stmt %d\n", stmt.size());
stmt.push_back(new_stmt);
uninterpreted_symbols.push_back(uninterpreted_symbols[stmt_num]);
@@ -750,16 +748,16 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
i != same_loop.end(); i++)
add_loop_stride(stmt[*i].IS, bound, level - 1,
unroll_amount * stride);
-
+
// update dependence graph
if (stmt[stmt_num].loop_level[level - 1].type == LoopLevelOriginal) {
int dep_dim = stmt[stmt_num].loop_level[level - 1].payload;
int new_stride = unroll_amount * stride;
for (int i = 0; i < old_num_stmt; i++) {
std::vector<std::pair<int, DependenceVector> > D;
-
+
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[i].second.begin();
+ dep.vertex[i].second.begin();
j != dep.vertex[i].second.end();) {
if (same_loop.find(i) != same_loop.end()) {
if (same_loop.find(j->first) != same_loop.end()) {
@@ -772,7 +770,7 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
kk++)
if (what_stmt_num[i][kk] != -1
&& what_stmt_num[j->first][kk]
- != -1)
+ != -1)
dep.connect(what_stmt_num[i][kk],
what_stmt_num[j->first][kk],
dv);
@@ -782,35 +780,35 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
if (ub == lb
&& int_mod(lb,
static_cast<coef_t>(new_stride))
- == 0) {
+ == 0) {
D.push_back(
- std::make_pair(j->first, dv));
+ std::make_pair(j->first, dv));
for (int kk = 0; kk < unroll_amount - 1;
kk++)
if (what_stmt_num[i][kk] != -1
&& what_stmt_num[j->first][kk]
- != -1)
+ != -1)
dep.connect(
- what_stmt_num[i][kk],
- what_stmt_num[j->first][kk],
- dv);
+ what_stmt_num[i][kk],
+ what_stmt_num[j->first][kk],
+ dv);
} else if (lb == -posInfinity
&& ub == posInfinity) {
D.push_back(
- std::make_pair(j->first, dv));
+ std::make_pair(j->first, dv));
for (int kk = 0; kk < unroll_amount;
kk++)
if (kk == 0)
D.push_back(
- std::make_pair(j->first,
- dv));
+ std::make_pair(j->first,
+ dv));
else if (what_stmt_num[j->first][kk
- 1] != -1)
D.push_back(
- std::make_pair(
- what_stmt_num[j->first][kk
- - 1],
- dv));
+ std::make_pair(
+ what_stmt_num[j->first][kk
+ - 1],
+ dv));
for (int t = 0; t < unroll_amount - 1;
t++)
if (what_stmt_num[i][t] != -1)
@@ -819,15 +817,15 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
kk++)
if (kk == 0)
dep.connect(
- what_stmt_num[i][t],
- j->first, dv);
+ what_stmt_num[i][t],
+ j->first, dv);
else if (what_stmt_num[j->first][kk
- 1] != -1)
dep.connect(
- what_stmt_num[i][t],
- what_stmt_num[j->first][kk
- - 1],
- dv);
+ what_stmt_num[i][t],
+ what_stmt_num[j->first][kk
+ - 1],
+ dv);
} else {
for (int kk = 0; kk < unroll_amount;
kk++) {
@@ -836,49 +834,49 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
< int_mod(lb,
static_cast<coef_t>(new_stride)))
dv.lbounds[dep_dim] =
- floor(
- static_cast<double>(lb)
- / new_stride)
- * new_stride
- + new_stride;
+ floor(
+ static_cast<double>(lb)
+ / new_stride)
+ * new_stride
+ + new_stride;
else
dv.lbounds[dep_dim] =
- floor(
- static_cast<double>(lb)
- / new_stride)
- * new_stride;
+ floor(
+ static_cast<double>(lb)
+ / new_stride)
+ * new_stride;
}
if (ub != posInfinity) {
if (kk * stride
> int_mod(ub,
static_cast<coef_t>(new_stride)))
dv.ubounds[dep_dim] =
- floor(
- static_cast<double>(ub)
- / new_stride)
- * new_stride
- - new_stride;
+ floor(
+ static_cast<double>(ub)
+ / new_stride)
+ * new_stride
+ - new_stride;
else
dv.ubounds[dep_dim] =
- floor(
- static_cast<double>(ub)
- / new_stride)
- * new_stride;
+ floor(
+ static_cast<double>(ub)
+ / new_stride)
+ * new_stride;
}
if (dv.ubounds[dep_dim]
>= dv.lbounds[dep_dim]) {
if (kk == 0)
D.push_back(
- std::make_pair(
- j->first,
- dv));
+ std::make_pair(
+ j->first,
+ dv));
else if (what_stmt_num[j->first][kk
- 1] != -1)
D.push_back(
- std::make_pair(
- what_stmt_num[j->first][kk
- - 1],
- dv));
+ std::make_pair(
+ what_stmt_num[j->first][kk
+ - 1],
+ dv));
}
}
for (int t = 0; t < unroll_amount - 1;
@@ -890,80 +888,80 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
if (lb != -posInfinity) {
if (kk * stride
< int_mod(
- lb + t
- + 1,
- static_cast<coef_t>(new_stride)))
+ lb + t
+ + 1,
+ static_cast<coef_t>(new_stride)))
dv.lbounds[dep_dim] =
- floor(
- static_cast<double>(lb
- + (t
- + 1)
- * stride)
- / new_stride)
- * new_stride
- + new_stride;
+ floor(
+ static_cast<double>(lb
+ + (t
+ + 1)
+ * stride)
+ / new_stride)
+ * new_stride
+ + new_stride;
else
dv.lbounds[dep_dim] =
- floor(
- static_cast<double>(lb
- + (t
- + 1)
- * stride)
- / new_stride)
- * new_stride;
+ floor(
+ static_cast<double>(lb
+ + (t
+ + 1)
+ * stride)
+ / new_stride)
+ * new_stride;
}
if (ub != posInfinity) {
if (kk * stride
> int_mod(
- ub + t
- + 1,
- static_cast<coef_t>(new_stride)))
+ ub + t
+ + 1,
+ static_cast<coef_t>(new_stride)))
dv.ubounds[dep_dim] =
- floor(
- static_cast<double>(ub
- + (t
- + 1)
- * stride)
- / new_stride)
- * new_stride
- - new_stride;
+ floor(
+ static_cast<double>(ub
+ + (t
+ + 1)
+ * stride)
+ / new_stride)
+ * new_stride
+ - new_stride;
else
dv.ubounds[dep_dim] =
- floor(
- static_cast<double>(ub
- + (t
- + 1)
- * stride)
- / new_stride)
- * new_stride;
+ floor(
+ static_cast<double>(ub
+ + (t
+ + 1)
+ * stride)
+ / new_stride)
+ * new_stride;
}
if (dv.ubounds[dep_dim]
>= dv.lbounds[dep_dim]) {
if (kk == 0)
dep.connect(
- what_stmt_num[i][t],
- j->first,
- dv);
+ what_stmt_num[i][t],
+ j->first,
+ dv);
else if (what_stmt_num[j->first][kk
- 1] != -1)
dep.connect(
- what_stmt_num[i][t],
- what_stmt_num[j->first][kk
- - 1],
- dv);
+ what_stmt_num[i][t],
+ what_stmt_num[j->first][kk
+ - 1],
+ dv);
}
}
}
}
}
-
+
dep.vertex[i].second.erase(j++);
} else {
for (int kk = 0; kk < unroll_amount - 1; kk++)
if (what_stmt_num[i][kk] != -1)
dep.connect(what_stmt_num[i][kk], j->first,
j->second);
-
+
j++;
}
} else {
@@ -972,26 +970,26 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
for (int kk = 0; kk < unroll_amount - 1; kk++)
if (what_stmt_num[j->first][kk] != -1)
D.push_back(
- std::make_pair(
- what_stmt_num[j->first][kk],
- j->second[k]));
+ std::make_pair(
+ what_stmt_num[j->first][kk],
+ j->second[k]));
j++;
}
}
-
+
for (int j = 0; j < D.size(); j++)
dep.connect(i, D[j].first, D[j].second);
}
}
-
+
// reset lexical order for the unrolled loop body
std::set<int> new_same_loop;
-
+
int count = 0;
-
+
for (std::map<int, std::vector<int> >::iterator i =
- what_stmt_num.begin(); i != what_stmt_num.end(); i++) {
-
+ what_stmt_num.begin(); i != what_stmt_num.end(); i++) {
+
new_same_loop.insert(i->first);
for (int k = dim + 1; k < stmt[i->first].xform.n_out(); k += 2)
assign_const(stmt[i->first].xform, k,
@@ -1001,11 +999,11 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
for (int j = 0; j < i->second.size(); j++) {
new_same_loop.insert(i->second[j]);
for (int k = dim + 1; k < stmt[i->second[j]].xform.n_out(); k +=
- 2)
+ 2)
assign_const(stmt[i->second[j]].xform, k,
get_const(
- stmt[(what_stmt_num.begin())->first].xform,
- k, Output_Var) + count);
+ stmt[(what_stmt_num.begin())->first].xform,
+ k, Output_Var) + count);
count++;
}
}
@@ -1015,20 +1013,20 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
i != same_loop.end(); i++)
add_loop_stride(stmt[*i].IS, bound, level - 1,
unroll_amount * stride);
-
+
int max_level = stmt[stmt_num].loop_level.size();
std::vector<std::pair<int, int> > stmt_order;
for (std::set<int>::iterator i = same_loop.begin();
i != same_loop.end(); i++)
stmt_order.push_back(
- std::make_pair(
- get_const(stmt[*i].xform, 2 * max_level,
- Output_Var), *i));
+ std::make_pair(
+ get_const(stmt[*i].xform, 2 * max_level,
+ Output_Var), *i));
sort(stmt_order.begin(), stmt_order.end());
-
+
Statement new_stmt;
new_stmt.code = NULL;
- for (int j = 1; j < unroll_amount; j++) {
+ for (int j = 1; j < unroll_amount; j++) {
for (int i = 0; i < stmt_order.size(); i++) {
std::vector<std::string> loop_vars;
std::vector<CG_outputRepr *> subs;
@@ -1036,12 +1034,12 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
//fprintf(stderr, "loop_unroll.cc, will replace '%s with '%s+%d' ??\n",
// stmt[stmt_order[i].second].IS.set_var(level)->name().c_str(),
// stmt[stmt_order[i].second].IS.set_var(level)->name().c_str(), j * stride);
-
+
loop_vars.push_back(
- stmt[stmt_order[i].second].IS.set_var(level)->name());
+ stmt[stmt_order[i].second].IS.set_var(level)->name());
subs.push_back(
- ocg->CreatePlus(ocg->CreateIdent(stmt[stmt_order[i].second].IS.set_var(level)->name()),
- ocg->CreateInt(j * stride))); // BUG HERE
+ ocg->CreatePlus(ocg->CreateIdent(stmt[stmt_order[i].second].IS.set_var(level)->name()),
+ ocg->CreateInt(j * stride))); // BUG HERE
//fprintf(stderr, "loop_unroll.cc subs now has %d parts\n", subs.size());
//for (int k=0; k< subs.size(); k++) //fprintf(stderr, "subs[%d] = 0x%x\n", k, subs[k]);
@@ -1052,7 +1050,7 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
CG_outputRepr *code = ocg->CreateSubstitutedStmt(0,
- stmt[stmt_order[i].second].code->clone(),
+ stmt[stmt_order[i].second].code->clone(),
loop_vars,
subs);
@@ -1069,7 +1067,7 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
}
}
-
+
//fprintf(stderr, "new_stmt.IS = \n");
@@ -1084,13 +1082,13 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
if (stmt[stmt_num].has_inspector) fprintf(stderr, "OLD STMT HAS INSPECTOR\n");
else fprintf(stderr, "OLD STMT DOES NOT HAVE INSPECTOR\n");
- fprintf(stderr, "loop_unroll.cc L1083 adding stmt %d\n", stmt.size());
+ fprintf(stderr, "loop_unroll.cc L1083 adding stmt %d\n", stmt.size());
stmt.push_back(new_stmt);
uninterpreted_symbols.push_back(uninterpreted_symbols[stmt_num]);
uninterpreted_symbols_stringrepr.push_back(uninterpreted_symbols_stringrepr[stmt_num]);
dep.insert();
-
+
//fprintf(stderr, "update dependence graph\n");
// update dependence graph
if (stmt[stmt_num].loop_level[level - 1].type == LoopLevelOriginal) {
@@ -1098,14 +1096,14 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
int new_stride = unroll_amount * stride;
for (int i = 0; i < old_num_stmt; i++) {
std::vector<std::pair<int, std::vector<DependenceVector> > > D;
-
+
for (DependenceGraph::EdgeList::iterator j =
- dep.vertex[i].second.begin();
+ dep.vertex[i].second.begin();
j != dep.vertex[i].second.end();) {
if (same_loop.find(i) != same_loop.end()) {
if (same_loop.find(j->first) != same_loop.end()) {
std::vector<DependenceVector> dvs11, dvs12, dvs22,
- dvs21;
+ dvs21;
for (int k = 0; k < j->second.size(); k++) {
DependenceVector dv = j->second[k];
if (dv.type == DEP_CONTROL
@@ -1115,71 +1113,71 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
dvs22.push_back(dv);
} else
throw loop_error(
- "unrolled statements lumped together illegally");
+ "unrolled statements lumped together illegally");
} else {
coef_t lb = dv.lbounds[dep_dim];
coef_t ub = dv.ubounds[dep_dim];
if (ub == lb
&& int_mod(lb,
static_cast<coef_t>(new_stride))
- == 0) {
+ == 0) {
dvs11.push_back(dv);
dvs22.push_back(dv);
} else {
if (lb != -posInfinity)
dv.lbounds[dep_dim] = ceil(
- static_cast<double>(lb)
- / new_stride)
- * new_stride;
+ static_cast<double>(lb)
+ / new_stride)
+ * new_stride;
if (ub != posInfinity)
dv.ubounds[dep_dim] = floor(
- static_cast<double>(ub)
- / new_stride)
- * new_stride;
+ static_cast<double>(ub)
+ / new_stride)
+ * new_stride;
if (dv.ubounds[dep_dim]
>= dv.lbounds[dep_dim])
dvs11.push_back(dv);
-
+
if (lb != -posInfinity)
dv.lbounds[dep_dim] = ceil(
- static_cast<double>(lb)
- / new_stride)
- * new_stride;
+ static_cast<double>(lb)
+ / new_stride)
+ * new_stride;
if (ub != posInfinity)
dv.ubounds[dep_dim] = ceil(
- static_cast<double>(ub)
- / new_stride)
- * new_stride;
+ static_cast<double>(ub)
+ / new_stride)
+ * new_stride;
if (dv.ubounds[dep_dim]
>= dv.lbounds[dep_dim])
dvs21.push_back(dv);
-
+
if (lb != -posInfinity)
dv.lbounds[dep_dim] = floor(
- static_cast<double>(lb)
- / new_stride)
- * new_stride;
+ static_cast<double>(lb)
+ / new_stride)
+ * new_stride;
if (ub != posInfinity)
dv.ubounds[dep_dim] = floor(
- static_cast<double>(ub
- - stride)
- / new_stride)
- * new_stride;
+ static_cast<double>(ub
+ - stride)
+ / new_stride)
+ * new_stride;
if (dv.ubounds[dep_dim]
>= dv.lbounds[dep_dim])
dvs12.push_back(dv);
-
+
if (lb != -posInfinity)
dv.lbounds[dep_dim] = floor(
- static_cast<double>(lb)
- / new_stride)
- * new_stride;
+ static_cast<double>(lb)
+ / new_stride)
+ * new_stride;
if (ub != posInfinity)
dv.ubounds[dep_dim] = ceil(
- static_cast<double>(ub
- - stride)
- / new_stride)
- * new_stride;
+ static_cast<double>(ub
+ - stride)
+ / new_stride)
+ * new_stride;
if (dv.ubounds[dep_dim]
>= dv.lbounds[dep_dim])
dvs22.push_back(dv);
@@ -1192,10 +1190,10 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
dep.connect(old_num_stmt, old_num_stmt, dvs22);
if (dvs12.size() > 0)
D.push_back(
- std::make_pair(old_num_stmt, dvs12));
+ std::make_pair(old_num_stmt, dvs12));
if (dvs21.size() > 0)
dep.connect(old_num_stmt, i, dvs21);
-
+
dep.vertex[i].second.erase(j++);
} else {
dep.connect(old_num_stmt, j->first, j->second);
@@ -1204,17 +1202,17 @@ std::set<int> Loop::unroll(int stmt_num, int level, int unroll_amount,
} else {
if (same_loop.find(j->first) != same_loop.end())
D.push_back(
- std::make_pair(old_num_stmt, j->second));
+ std::make_pair(old_num_stmt, j->second));
j++;
}
}
-
+
for (int j = 0; j < D.size(); j++)
dep.connect(i, D[j].first, D[j].second);
}
}
}
-
+
//fprintf(stderr, " loop_unroll.cc returning new_stmts\n");
return new_stmts;
}