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 #ifndef FIZ_FUSE_RCS_ID
00038 #define FIZ_FUSE_RCS_ID
00039 #ifdef _KEEP_RCS_ID
00040 static char *fiz_fuse_rcs_id = "$Source$ $Revision$";
00041 #endif
00042 #endif
00043
00044 #ifndef _fiz_fuse_INCLUDED
00045 #define _fiz_fuse_INCLUDED
00046
00047 #include "defs.h"
00048 #include "cxx_template.h"
00049 #include "wn.h"
00050 #include "lnopt_main.h"
00051 #include "lnoutils.h"
00052 #include "ff_utils.h"
00053
00054 typedef enum {
00055 Invalid=0,
00056 Non_SNL=1,
00057 Not_Inner=2,
00058 Inner=3
00059 } SNL_TYPE;
00060
00061 class SNL_INFO {
00062 INT8 _depth;
00063 WN* _wn;
00064 SNL_TYPE _type;
00065 public:
00066 friend class FIZ_FUSE_INFO;
00067 SNL_INFO() { _depth=0; _wn=NULL; _type=Invalid; };
00068 ~SNL_INFO(){};
00069 SNL_INFO(WN* wn);
00070 };
00071
00072 class FIZ_FUSE_INFO {
00073 DYN_ARRAY<SNL_INFO> _snl_info;
00074 MEM_POOL *_mpool;
00075 public:
00076
00077 FIZ_FUSE_INFO& operator += (const FIZ_FUSE_INFO& in_info) {
00078 INT i,j;
00079 for (i=0; i<=in_info._snl_info.Lastidx(); i++) {
00080 j = _snl_info.Newidx();
00081 _snl_info[j]._depth=in_info._snl_info[i]._depth;
00082 _snl_info[j]._wn=in_info._snl_info[i]._wn;
00083 _snl_info[j]._type=in_info._snl_info[i]._type;
00084 }
00085
00086 return *this;
00087 }
00088
00089 FIZ_FUSE_INFO(MEM_POOL* pool){
00090 _snl_info.Set_Mem_Pool(pool);
00091 _mpool = pool;
00092 };
00093 ~FIZ_FUSE_INFO(){ _snl_info.Free_array(); };
00094 INT8 Get_Depth(INT i) {
00095 Is_True(i<=_snl_info.Lastidx(), ("Index to Get_Depth() out of bound.\n"));
00096 return _snl_info[i]._depth;
00097 }
00098 void Set_Depth(INT i, INT8 depth) {
00099 Is_True(i<=_snl_info.Lastidx(), ("Index to Set_Depth() out of bound.\n"));
00100 _snl_info[i]._depth=depth;
00101 }
00102 WN* Get_Wn(INT i) {
00103 Is_True(i<=_snl_info.Lastidx(), ("Index to Get_Wn() out of bound.\n"));
00104 return _snl_info[i]._wn;
00105 }
00106 void Set_Wn(INT i, WN* wn) {
00107 Is_True(i<=_snl_info.Lastidx(), ("Index to Set_Depth() out of bound.\n"));
00108 _snl_info[i]._wn=wn;
00109 }
00110 SNL_TYPE Get_Type(INT i) {
00111 Is_True(i<=_snl_info.Lastidx(), ("Index to Get_Wn() out of bound.\n"));
00112 return _snl_info[i]._type;
00113 }
00114 void Set_Type(INT i, SNL_TYPE type) {
00115 Is_True(i<=_snl_info.Lastidx(), ("Index to Set_Depth() out of bound.\n"));
00116 _snl_info[i]._type=type;
00117 }
00118 INT Num_Snl() { return _snl_info.Lastidx()+1; }
00119 INT New_Snl(WN* wn, INT8 depth, SNL_TYPE type) {
00120 INT i = _snl_info.Newidx();
00121 _snl_info[i]._wn = wn;
00122 _snl_info[i]._depth = depth;
00123 _snl_info[i]._type = type;
00124 return i;
00125 }
00126 INT New_Snl(SNL_INFO& snl_info) {
00127 return New_Snl(snl_info._wn, snl_info._depth, snl_info._type);
00128 }
00129 INT Copy_Snl(FIZ_FUSE_INFO *info, INT id) {
00130 INT i = _snl_info.Newidx();
00131 _snl_info[i]._wn = info->_snl_info[id]._wn;
00132 _snl_info[i]._depth = info->_snl_info[id]._depth;
00133 _snl_info[i]._type = info->_snl_info[id]._type;
00134 return i;
00135 }
00136 void Delete_Last_Snl() {
00137 _snl_info.Decidx();
00138 }
00139 void Print(FILE *fp=stdout) {
00140 fprintf(fp,"Print FIZ_FUSE_INFO:\n");
00141 for (INT i=0; i<=_snl_info.Lastidx(); i++) {
00142 Print(i, fp);
00143 }
00144 }
00145 void Print(INT i, FILE* fp=stdout);
00146 void Check();
00147 void Build(WN* func_nd, BOOL all_loops=FALSE);
00148 };
00149
00150 extern FISSION_FUSION_STATUS
00151 Fuse_Level_By_Level(WN* loop1, WN* loop2, UINT* fusion_level,
00152 UINT peeling_limit, BOOL allow_partial_fusion=FALSE,
00153 BOOL allow_outer_peeling=FALSE, FIZ_FUSE_INFO* ffi=NULL);
00154
00155 extern FIZ_FUSE_INFO* Fiz_Fuse(WN* loop, FIZ_FUSE_INFO* snls, MEM_POOL *mpool);
00156
00157 extern FIZ_FUSE_INFO*
00158 If_While_Region_Fiz_Fuse(WN* wn, FIZ_FUSE_INFO* snls, MEM_POOL* mpool);
00159
00160 #endif
00161