00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00191 #ifndef fission_INCLUDED
00192 #define fission_INCLUDED
00193
00194 #include "defs.h"
00195 #include "cxx_base.h"
00196 #include "cxx_memory.h"
00197 #include "wn.h"
00198 #include "dep_graph.h"
00199 #include "ff_utils.h"
00200
00201 extern const mUINT16 FISSION_BIT_STMT_REORDERING;
00202 extern const mUINT16 FISSION_BIT_PERFECT_NESTING;
00203 extern const mUINT16 FISSION_BIT_SCALAR_EXPANSION;
00204 extern const mUINT16 FISSION_BIT_EXPRESSION_BASED;
00205 extern const mUINT16 FISSION_BIT_TEST_ONLY;
00206
00207 extern const mUINT16 OPT_FLAG_STMT_SIMPLE;
00208 extern const mUINT16 OPT_FLAG_STMT_PERFECT;
00209 extern const mUINT16 OPT_FLAG_STMT_EXPANSION;
00210 extern const mUINT16 OPT_FLAG_STMT_REORDERING;
00211 extern const mUINT16 OPT_FLAG_STMT_REORDERING_PERFECT;
00212 extern const mUINT16 OPT_FLAG_STMT_BEST;
00213
00214 class FF_STMT_NODE: public SLIST_NODE {
00215 DECLARE_SLIST_NODE_CLASS( FF_STMT_NODE);
00216 private:
00217 WN *_stmt;
00218 public:
00219 FF_STMT_NODE() { _stmt = NULL; };
00220 FF_STMT_NODE(WN *stmt) { _stmt = stmt; };
00221 ~FF_STMT_NODE() {};
00222 void Set_Stmt(WN *stmt) { _stmt = stmt; }
00223 WN *Get_Stmt() const { return _stmt; }
00224 };
00225
00226 class FF_STMT_LIST: public SLIST {
00227 DECLARE_SLIST_CLASS( FF_STMT_LIST, FF_STMT_NODE )
00228 public:
00229
00230 ~FF_STMT_LIST(void){};
00231 void Append(WN *stmt, MEM_POOL *mpool) {
00232 Append(CXX_NEW(FF_STMT_NODE(stmt), mpool));
00233 }
00234 void Prepend(WN *stmt, MEM_POOL *mpool) {
00235 Prepend(CXX_NEW(FF_STMT_NODE(stmt), mpool));
00236 }
00237 };
00238
00239 class FF_STMT_ITER: public SLIST_ITER {
00240 DECLARE_SLIST_ITER_CLASS( FF_STMT_ITER, FF_STMT_NODE, FF_STMT_LIST )
00241 public:
00242
00243 ~FF_STMT_ITER() {};
00244 };
00245
00246
00247
00248
00249
00250
00251 extern void Separate(WN* in_loop,WN* in_stmt, UINT8 level, WN** new_loop,
00252 BOOL create_empty_loop=FALSE);
00253
00254
00255 extern UINT32 Fission_Test(WN* in_loop, mUINT16 opt_flag, UINT8 fission_level,
00256 WN_MAP loop_map, FF_STMT_LIST *stl_1=NULL, FF_STMT_LIST *stl_2=NULL);
00257
00258
00259
00260
00261 extern void Form_Loops(WN* in_loop, mUINT16 opt_flag, UINT8 fission_level,
00262 FF_STMT_LIST *stl_1, FF_STMT_LIST *stl_2,
00263 ARRAY_DIRECTED_GRAPH16* sdg, DYN_ARRAY<FF_STMT_LIST>& loop,
00264 MEM_POOL* pool);
00265
00266
00267 extern FISSION_FUSION_STATUS
00268 Fission(WN* in_loop, mUINT16 opt_flag, UINT8 fission_level,
00269 WN_MAP loop_map= WN_MAP_UNDEFINED, UINT32 total_loops= 0,
00270 FF_STMT_LIST *stl_1=NULL, FF_STMT_LIST *stl_2=NULL);
00271
00272
00273 extern FISSION_FUSION_STATUS
00274 Fission(WN* in_loop, WN* stmt, UINT8 fission_level);
00275
00276
00277
00278 extern FISSION_FUSION_STATUS
00279 Fission(WN* in_loop, WN* stmt1, WN* stmt2, UINT8 fission_level);
00280
00281
00282 extern void Fission_Init();
00283
00284
00285 extern void Fission_Finish();
00286
00287 extern void Separate_And_Update(WN* in_loop,DYN_ARRAY<FF_STMT_LIST>& loop,
00288 UINT fission_level, BOOL rename_loop_var=TRUE);
00289
00290
00291 #endif // fission_INCLUDED
00292