////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////  includes for data dep information ////////////////////////
////// FB July 94 Indiana University ///////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////

// the set class
#include "set.h"

#include "definesValues.h"


//////////////////////////////////////////////////////////////////////////////////
// external for the anotation system
//////////////////////////////////////////////////////////////////////////////////
#include "annotationDriver.h"
extern SgAnnotation *getTheAnnotationThatApply(SgStatement *stmt, char *kind);
extern SgAnnotation * getTheAnnotationWithString(char *kind);
extern int isAnnotationWithString(SgStatement *stmt, char *kind, int len);
extern void initAnnotationSystem(int printann);


//////////////////////////////////////////////////////////////////////////////////
// some external from loop transformations
//////////////////////////////////////////////////////////////////////////////////

extern int tileLoops(SgStatement *func, SgStatement *b, int *size, int nb);
extern int distributeLoopSCC(SgStatement *b, int *sccTable, int leadingdim, int numSCC);
extern int loopFusion(SgStatement *loop1,SgStatement *loop2);

///////////////////////////////////////////////////////////////////////////////////////
// Control FLOW part of declaration
///////////////////////////////////////////////////////////////////////////////////////

extern void controlFlow(SgStatement *stmt, SgStatement *func, 
                        SgStatement **pred, SgStatement **suc, 
                        int *predin,int *sucint);

///////////////////////////////////////////////////////////////////////////////////////
// declaration for the  data flow  framework
///////////////////////////////////////////////////////////////////////////////////////

extern Set *genSet[MAXNODE];
extern Set *killSet[MAXNODE];
extern Set *inSet[MAXNODE];  
extern Set *outSet[MAXNODE];

extern void iterativeForwardFlowAnalysis(SgFile *file, 
                                  SgStatement *func, 
                                  Set *(*giveGenSet)(SgStatement *func,SgStatement *stmt),
                                  Set *(*giveKillSet)(SgStatement *func,SgStatement *stmt),
                                  int (*feq)(void *e1, void *e2), 
                                  void *(*fcomb)(void *e1, void *e2),
                                  void (*fp)(void *e1));

extern void generalIterativeFlowAnalysis(SgFile *file, 
                                  SgStatement *func, 
                                  Set *(*transfertSet)(SgStatement *func,SgStatement *stmt, Set *setin),
                                  int (*feq)(void *e1, void *e2), 
                                  void* (*fcomb)(void *e1, void *e2),
                                  void (*fp)(void *e1));

///////////////////////////////////////////////////////////////////////////////////////
// declaration for defuse and reaching definition
///////////////////////////////////////////////////////////////////////////////////////

#include "definitionSet.h"
extern Set *makeGenSet(SgStatement *func,SgStatement *stmt);
extern Set *makeKillSet(SgStatement *func,SgStatement *stmt);
extern int symbRefEqual(void *e1, void *e2);
extern void myPrint(void *e1);

///////////////////////////////////////////////////////////////////////////////////////
// Part for constante propagation.....
///////////////////////////////////////////////////////////////////////////////////////

#include "constanteSet.h"
extern int constPropEqual(void *e1, void *e2);
extern void constPropPrint(void *e1);
extern void * constPropCombine(void *e1, void *e2);
extern Set *transConstante(SgStatement *func,SgStatement *stmt, Set *setin);

///////////////////////////////////////////////////////////////////////////////////////
// Part for induction variable
///////////////////////////////////////////////////////////////////////////////////////

#include "inducVar.h"
extern int inducVarEqual(void *e1, void *e2);
extern void inducVarPrint(void *e1);
extern int definitionInStmt(SgStatement *func,SgStatement *stmtin, SgExpression *defvar);
extern Set *computeConstanteInStmt(SgStatement *func,SgStatement *stmtin);
extern Set *computeInductionVariables(SgStatement *func,SgStatement *stmt);
extern Set *getAllInductionVar(SgStatement *func,
                               SgStatement *stmt,int level, int *num,int include);

///////////////////////////////////////////////////////////////////////////////////////
// Part for computing array reference
///////////////////////////////////////////////////////////////////////////////////////

#include "arrayRef.h"
extern int NbLinearRef;
extern int NbNonLinearRef;
extern int linearRepArray(SgExpression  *ex1, SgSymbol **symb, 
                          int size, 
                          int linear[MAXDIMARRAY][MAXNESTEDLOOP], 
                          int *cst);
extern int arrayEqual(void *e1, void *e2);
extern void arrayPrint(void *e1);
extern Set *loopArrayAccessAnalysis(SgStatement *func,SgStatement *stmt, 
                                    SgSymbol **tsymb, Set **induc);

///////////////////////////////////////////////////////////////////////////////////////
// for data dependence computation (uses omega Test)
///////////////////////////////////////////////////////////////////////////////////////

#include "dependence.h"
extern Set *computeLoopDependencies(SgStatement *func,Set *inset, SgSymbol **tsymb, Set *induc);
extern "C" void SetOmegaDebug();

///////////////////////////////////////////////////////////////////////////////////////
// for data dependence computation (uses omega Test)
///////////////////////////////////////////////////////////////////////////////////////

#include "depGraph.h"

///////////////////////////////////////////////////////////////////////////////////////
// from intrinsic.C
///////////////////////////////////////////////////////////////////////////////////////

extern int isStmtCallToFuncNotIntrinsic(SgStatement *stmt);
extern int isSymbolIntrinsic(SgSymbol *symb);
extern int isExprCallToFuncNotIntrinsic(SgExpression *exp);



