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
00038
00039
00040
00041
00042 #ifndef cxx_ipa_cprop_INCLUDED
00043 #define cxx_ipa_cprop_INCLUDED
00044
00045 #ifndef cxx_hash_INCLUDED
00046 #include "cxx_hash.h"
00047 #endif
00048
00049 #ifndef cxx_template_INCLUDED
00050 #include "cxx_template.h"
00051 #endif
00052
00053 #ifndef cxx_ipa_df_INCLUDED
00054 #include "ipa_df.h"
00055 #endif
00056
00057 extern INT IPA_Constant_Count;
00058 extern void Init_Cprop_Annotations (IPA_NODE *);
00059
00060 extern MEM_POOL Ipa_cprop_pool;
00061 extern MEM_POOL local_cprop_pool;
00062 extern MEM_POOL Global_mem_pool;
00063
00064
00065 extern UINT32 IPA_Max_Total_Clones;
00066 extern UINT32 IPA_Num_Total_Clones;
00067
00068 typedef DYN_ARRAY<SUMMARY_VALUE> VALUE_DYN_ARRAY;
00069
00070
00071
00072
00073 class GLOBAL_VALUE
00074 {
00075 private:
00076 mUINT64 _offset;
00077 mUINT32 _size;
00078 SUMMARY_VALUE* _value;
00079
00080 public:
00081
00082 GLOBAL_VALUE (UINT64 offset, UINT32 size, SUMMARY_VALUE* value) :
00083 _offset (offset),
00084 _size (size),
00085 _value (value)
00086 {}
00087
00088 UINT64 Offset () const { return _offset; }
00089 UINT32 Size () const { return _size; }
00090 SUMMARY_VALUE* Value () const { return _value; }
00091
00092 BOOL Union (SUMMARY_VALUE* value, BOOL overwrite);
00093 };
00094
00095 typedef DYN_ARRAY<GLOBAL_VALUE> GLOBAL_DYN_ARRAY;
00096
00097
00098
00099
00100 struct OFFSET_SIZE
00101 {
00102 OFFSET_SIZE (UINT64 o, UINT32 s) : offset(o), size(s) {}
00103
00104 UINT64 offset;
00105 UINT32 size;
00106 };
00107
00108 namespace __gnu_cxx {
00109
00110 template<> struct hash<OFFSET_SIZE>
00111 {
00112 size_t operator()(OFFSET_SIZE x) const { return x.offset + x.size; }
00113 };
00114
00115 }
00116
00117 struct OFFSET_SIZE_EQ
00118 {
00119 bool operator()(OFFSET_SIZE os1, OFFSET_SIZE os2) const
00120 {
00121 return (os1.offset == os2.offset && os1.size == os2.size);
00122 }
00123 };
00124
00125 typedef __gnu_cxx::hash_map<OFFSET_SIZE, ST_IDX, __gnu_cxx::hash<OFFSET_SIZE>, OFFSET_SIZE_EQ>
00126 OFFSET_SIZE_TO_ST_IDX_MAP;
00127
00128
00129
00130
00131
00132
00133 class GLOBAL_ANNOT
00134 {
00135 private:
00136 MEM_POOL* _pool;
00137 GLOBAL_DYN_ARRAY** _gvals_array;
00138
00139 public:
00140
00141 static UINT32 Size;
00142 static ST_IDX* Common_ST;
00143 static OFFSET_SIZE_TO_ST_IDX_MAP* Offset_Size_To_ST;
00144
00145
00146 static INT32 Index (ST_IDX);
00147
00148
00149 GLOBAL_ANNOT (MEM_POOL* mem_pool) :
00150 _pool (mem_pool)
00151 {
00152 _gvals_array = CXX_NEW_ARRAY (GLOBAL_DYN_ARRAY*, Size, mem_pool);
00153 BZERO (_gvals_array, Size * sizeof(GLOBAL_DYN_ARRAY*));
00154 }
00155
00156 GLOBAL_ANNOT (const GLOBAL_ANNOT* gannot, MEM_POOL* mem_pool) :
00157 _pool (mem_pool)
00158 {
00159 _gvals_array = CXX_NEW_ARRAY (GLOBAL_DYN_ARRAY*, Size, mem_pool);
00160 BZERO (_gvals_array, Size * sizeof(GLOBAL_DYN_ARRAY*));
00161
00162 for (UINT32 i = 0; i < Size; ++i) {
00163 if (!gannot->Top(i)) {
00164 if (gannot->Bottom(i)) {
00165 Set_Bottom(i);
00166 }
00167 else {
00168 _gvals_array[i] = CXX_NEW(GLOBAL_DYN_ARRAY(_pool), _pool);
00169 *(_gvals_array[i]) = gannot->Global_Value_Array(i);
00170 }
00171 }
00172 }
00173 }
00174
00175
00176 const GLOBAL_DYN_ARRAY& Global_Value_Array(INT32 idx) const {
00177 return *(_gvals_array[idx]);
00178 }
00179
00180 BOOL Top (UINT32 idx) const { return _gvals_array[idx] == 0; }
00181 BOOL Bottom (UINT32 idx) const { return _gvals_array[idx] == (void*) -1; }
00182 void Set_Bottom (UINT32 idx) {
00183 if (_gvals_array[idx] != 0 && _gvals_array[idx] != (void*) -1) {
00184 CXX_DELETE(_gvals_array[idx], _pool);
00185 }
00186 _gvals_array[idx] = (GLOBAL_DYN_ARRAY*) -1;
00187 }
00188
00189 BOOL Bottom () const {
00190 for (UINT32 i = 0; i < Size; ++i) {
00191 if (!Bottom(i)) {
00192 return FALSE;
00193 }
00194 }
00195 return TRUE;
00196 }
00197
00198 void Set_Bottom () {
00199 for (UINT32 i = 0; i < Size; ++i) {
00200 Set_Bottom(i);
00201 }
00202 }
00203
00204
00205 const GLOBAL_VALUE* Find(INT32 common_idx, UINT64 offset, UINT32 size) const;
00206
00207 BOOL Union (UINT32 common_idx,
00208 const GLOBAL_VALUE& gval,
00209 BOOL overwrite_when_found,
00210 BOOL add_when_not_found);
00211
00212 BOOL Union (const GLOBAL_ANNOT* gannot);
00213
00214 void Print (FILE* fp);
00215 };
00216
00217
00218 class IPA_CPROP_DF_FLOW : public IPA_DATA_FLOW
00219 {
00220 protected:
00221 virtual void* Meet(void* in, void* vertex, INT *change);
00222 virtual void* Trans(void* in, void* out, void* vertex, INT *change);
00223
00224 public:
00225 IPA_CPROP_DF_FLOW (DF_DIRECTION ddf, MEM_POOL* m);
00226
00227 virtual void InitializeNode(void *n);
00228 virtual void Print_entry(FILE *fp, void* out, void* n);
00229 virtual void PostProcessIO(void *node);
00230
00231 #if _UPDATEMODINFO_IS_NON_EMPTY_
00232 void InitializeEdge(IPA_EDGE*);
00233 void UpdateModInfo(IPA_EDGE*);
00234 #endif // _UPDATEMODINFO_IS_NON_EMPTY_
00235
00236 BOOL Valid_predecessors(IPA_NODE*);
00237 BOOL Valid_successors_without_cprop(IPA_NODE*);
00238 void Delete_dead_call(IPA_NODE*);
00239 void PerformCloning(IPA_NODE*);
00240 void Print_constants(FILE*, IPA_NODE*);
00241
00242 };
00243
00244 #endif // cxx_ipa_cprop_INCLUDED