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
00142 #ifndef _defs_INCLUDED
00143 #include "defs.h"
00144 #endif
00145
00146 #ifndef access_vector_INCLUDED
00147 #include "access_vector.h"
00148 #endif
00149
00150 #ifndef soe_INCLUDED
00151 #include "soe.h"
00152 #endif
00153
00154 #ifndef fb_whirl_INCLUDED
00155 #include "fb_whirl.h"
00156 #endif
00157
00158 #ifndef cond_INCLUDED
00159 #define cond_INCLUDED "cond.h"
00160
00161 class WN;
00162 typedef struct mem_pool MEM_POOL;
00163
00164 #ifdef _KEEP_RCS_ID
00165 static char *cond_rcs_id = cond_INCLUDED "$Revision: 1.6 $";
00166 #endif
00167
00168 enum COND_IF_INFO {COND_IF_THEN_ONLY, COND_IF_ELSE_ONLY, COND_IF_NOT_SURE};
00169 enum COND_DO_INFO {COND_DO_AT_LEAST_ONCE, COND_DO_NEVER, COND_DO_MAYBE};
00170
00171 extern COND_IF_INFO COND_If_Info(WN* wn_if, MEM_POOL* =0);
00172 extern COND_DO_INFO COND_Do_Info(WN* wn_do, MEM_POOL* = 0);
00173
00174 extern void COND_Test(WN*);
00175 extern BOOL Eliminate_Dead_SCF(WN *wn, void Remove_Region(WN *));
00176 void Guard_Dos(WN *func_nd);
00177 BOOL Hoist_Conditionals(WN *func_nd);
00178 BOOL Is_Consistent_Condition(ACCESS_VECTOR *av, WN *expr);
00179 extern WN* Guard_A_Do(WN *do_wn);
00180 extern void Canonicalize_Unsigned_Loops(WN* func_nd);
00181 extern void Update_Guarded_Do_FB(WN *if_wn, WN *do_wn, FEEDBACK *feedback);
00182 #ifdef KEY
00183 extern BOOL Loop_Unswitch_SCF(WN *wn);
00184 #endif
00185
00210
00211
00212
00213
00214
00215
00216 class COND_SYMBOL_INFO {
00217
00218 public:
00219
00220 SYMBOL Symbol;
00221 WN* Outer_Nondef;
00222 COND_SYMBOL_INFO(SYMBOL s, WN* o) : Symbol(s), Outer_Nondef(o) {}
00223 COND_SYMBOL_INFO() : Symbol(), Outer_Nondef(NULL) {}
00224 COND_SYMBOL_INFO& operator = (const COND_SYMBOL_INFO& a)
00225 {Symbol = a.Symbol; Outer_Nondef = a.Outer_Nondef; return *this;}
00226 ~COND_SYMBOL_INFO() {}
00227 void Print(FILE*) const;
00228 };
00229
00230 class COND_BOUNDS_INFO {
00231
00232 public:
00233
00234 COND_BOUNDS_INFO(MEM_POOL*);
00235 ~COND_BOUNDS_INFO();
00236
00237 void Collect_Outer_Info(WN* parent, WN* child = NULL);
00238 void Collect_Do_Info(WN* wn_do);
00239 void Collect_If_Info(WN* wn_if, BOOL);
00240
00241
00242
00243
00244 SYSTEM_OF_EQUATIONS& Bounds() {return _bounds;}
00245 const SYSTEM_OF_EQUATIONS& Bounds() const {return _bounds;}
00246
00247 STACK<COND_SYMBOL_INFO>& Symbol_Info() {return _symbol_info;}
00248 const STACK<COND_SYMBOL_INFO>&Symbol_Info() const {return _symbol_info;}
00249
00250 MEM_POOL* Pool() const {return _pool;}
00251
00252
00253
00254 INT Add_Access(ACCESS_VECTOR* av, WN* code, WN* control);
00255 INT Add_Access(ACCESS_ARRAY* ai, WN* code, WN* control);
00256
00257 void Reset_Bounds_To(INT, INT, INT, DYN_ARRAY<WN*>*);
00258 void Print(FILE*) const;
00259
00260 private:
00261
00262 void Reset_Varcount_To(INT cols);
00263
00264
00265
00266 INT Lookup_Entry(SYMBOL, WN*);
00267 void Kill_Written_Symbols(ACCESS_VECTOR*, WN* code, WN* control);
00268
00269
00270 COND_BOUNDS_INFO();
00271 COND_BOUNDS_INFO& operator = (const COND_BOUNDS_INFO&);
00272 COND_BOUNDS_INFO(const COND_BOUNDS_INFO&);
00273
00274 SYSTEM_OF_EQUATIONS _bounds;
00275 STACK<COND_SYMBOL_INFO> _symbol_info;
00276 MEM_POOL* _pool;
00277 };
00278
00279 extern BOOL Redundant_Condition(COND_BOUNDS_INFO* info, WN* wn_cond,
00280 WN* wn_if);
00281
00282 #ifdef TARG_X8664
00283 extern BOOL Is_Vectorizable_Loop(WN* loop);
00284 #endif
00285 #endif