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
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 #ifndef opt_wn_INCLUDED
00055 #define opt_wn_INCLUDED "opt_wn.h"
00056 #ifdef _KEEP_RCS_ID
00057 static char *opt_wnrcs_id = opt_wn_INCLUDED"$Revision: 1.5 $";
00058 #endif
00059
00060 #ifndef optimizer_INCLUDED
00061 #include "optimizer.h"
00062 #endif
00063 #include "defs.h"
00064 #include "opt_defs.h"
00065 #include "wn.h"
00066 #include "opt_alias_interface.h"
00067 #include "region_util.h"
00068
00069
00070 class ALIAS_MANAGER;
00071 class AUX_STAB_ENTRY;
00072 class CHI_LIST;
00073 class CODEREP;
00074 class MU_LIST;
00075 class OPT_STAB;
00076 class POINTS_TO;
00077 class VAR_LIST;
00078
00079 typedef struct pf_pointer PF_POINTER;
00080 typedef struct region_id RID;
00081
00082
00083 class STMT_CONTAINER {
00084 private:
00085 WN *head;
00086 WN *tail;
00087
00088 STMT_CONTAINER(const STMT_CONTAINER&);
00089 STMT_CONTAINER& operator = (const STMT_CONTAINER&);
00090
00091 public:
00092 STMT_CONTAINER(void) { head=NULL; tail=NULL; }
00093 STMT_CONTAINER(WN *f);
00094 STMT_CONTAINER(WN *f, WN *l) { head=f; tail=l; }
00095
00096 ~STMT_CONTAINER(void) {}
00097
00098 WN *Head(void) { return head; }
00099 WN *Tail(void) { return tail; }
00100
00101 void Insert_before(WN *me, WN *wn);
00102 void Insert_after (WN *me, WN *wn);
00103 void Insert_lst_before(WN *,
00104 WN *, WN *);
00105 void Insert_lst_after (WN *,
00106 WN *, WN *);
00107 void Prepend(WN *wn)
00108 { if (head) Insert_before(head, wn);
00109 else head = tail = wn;
00110 }
00111 void Append(WN *wn)
00112 { if (tail) Insert_after(tail, wn);
00113 else head = tail = wn;
00114 }
00115 void Append_list(WN *f, WN *l)
00116 { if (tail) { Insert_lst_after(tail, f, l); }
00117 else { head = f; tail = l; }
00118 }
00119 void Remove(WN *me);
00120
00121
00122 void Set_head(WN *wn) { head = wn; }
00123 void Set_tail(WN *wn) { tail = wn; }
00124
00125 void Print(FILE *fp=stderr);
00126 };
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 class STMT_ITER {
00140 private:
00141 WN *head;
00142 WN *tail;
00143 WN *cur;
00144
00145 STMT_ITER(const STMT_ITER&);
00146 STMT_ITER& operator = (const STMT_ITER&);
00147
00148 public:
00149 STMT_ITER(void) { head=NULL; tail=NULL; cur=NULL; }
00150 STMT_ITER(WN *f);
00151 STMT_ITER(WN *f, WN *l) { head=f; tail=l; cur=f; }
00152
00153 ~STMT_ITER(void) {}
00154
00155 void Init(WN *h, WN *t) { head=h; tail=t; cur=h; }
00156 WN *First(void) { return (cur = head); }
00157 WN *Last(void) { return (cur = tail); }
00158 WN *Next(void) { return (cur=(cur==NULL||cur==tail)?NULL:WN_next(cur)); }
00159 WN *Prev(void) { return (cur=(cur==NULL||cur==head)?NULL:WN_prev(cur)); }
00160 WN *Peek_next(void) { return (cur==NULL||cur==tail)?NULL:WN_next(cur); }
00161 WN *Peek_prev(void) { return (cur==NULL||cur==head)?NULL:WN_prev(cur); }
00162 WN *Cur(void) { return cur; }
00163 WN *First_elem(void) { return (cur = head); }
00164 WN *Last_elem(void) { return (cur = tail); }
00165 WN *Next_elem(void) { return (cur=(cur==NULL||cur==tail)?NULL:WN_next(cur)); }
00166 WN *Prev_elem(void) { return (cur=(cur==NULL||cur==head)?NULL:WN_prev(cur)); }
00167 BOOL Is_Empty(void) { return cur == NULL; }
00168 BOOL Is_Empty_Reverse(void) { return cur == NULL; }
00169 BOOL No_stmt(void) { return head == NULL; }
00170 BOOL Validate(void) { return head != NULL && tail != NULL; }
00171 void Print(FILE *fp=stderr);
00172 };
00173
00174
00175
00176 enum WN_FLAG_TYPE {
00177 WN_ST_IS_SYM = 0,
00178 WN_ST_IS_AUX = 1,
00179 WN_ST_IS_VER = 2,
00180 WN_FLAG_ST_TYPE = 0x3,
00181 WN_FLAG_DO_LOOP = 0x8,
00182 WN_FLAG_PROMOTED_DO_LOOP = 0x16
00183 };
00184
00185
00186 extern void WN_init_flags(MEM_POOL *pool);
00187 extern void WN_fini_flags(void);
00188
00189
00190 extern void Set_wn_flags(WN *wn, INT32 flag);
00191 extern INT32 Wn_flags(const WN *wn);
00192
00193
00194
00195
00196
00197 extern BOOL OPCODE_has_chi( OPCODE );
00198 extern BOOL OPERATOR_has_chi( OPERATOR );
00199 extern BOOL WN_has_chi(const WN *, REGION_LEVEL );
00200
00201
00202
00203
00204 extern BOOL OPCODE_has_mu( OPCODE );
00205 extern BOOL OPERATOR_has_mu( OPERATOR );
00206 extern BOOL WN_has_mu( const WN *, REGION_LEVEL );
00207
00208
00209
00210
00211 extern BOOL WN_has_ver(const WN *wn);
00212
00213
00214
00215 extern BOOL WN_has_aux(const WN *wn);
00216
00217
00218
00219 extern BOOL OPERATOR_has_aux(const OPERATOR opr);
00220
00221
00222 extern BOOL OPCODE_has_aux(const OPCODE opc);
00223
00224
00225 extern ST *WN_sym(const WN *wn);
00226
00227
00228 extern AUX_ID WN_aux(const WN *wn);
00229
00230
00231 extern VER_ID WN_ver(const WN *wn);
00232
00233
00234 extern void WN_set_aux(WN *wn, AUX_ID s);
00235
00236
00237 extern void WN_set_ver(WN *wn, VER_ID v);
00238
00239
00240 extern INT32 Get_mtype_class(MTYPE);
00241
00242
00243 extern OPCODE Ldid_from_mtype( MTYPE mtype );
00244
00245
00246 extern MTYPE Mtype_from_mtype_class_and_size( INT mtype_class, INT bytes );
00247
00248
00249
00250 extern OPCODE Ldid_from_mtype_class_and_size(INT mtype_class,INT bytes);
00251
00252
00253
00254 extern OPCODE Stid_from_mtype_class_and_size(INT mtype_class,INT bytes);
00255
00256
00257 extern void Init_lno_info_for_main_emitter(void);
00258
00259
00260 extern INT32 WN_get_dep_graph_vertex(WN *);
00261
00262
00263 extern void WN_detach_wn_from_dep_graph(INT32);
00264
00265
00266 extern void WN_add_lno_info(WN *, CODEREP *);
00267
00268
00269 extern void WN_dup_dep_vertex(WN *oldwn, WN *newwn);
00270
00271
00272 extern void Print_dep_graph(FILE *);
00273
00274
00275 extern PF_POINTER *WN_get_pf_pointer(WN *wn);
00276
00277
00278 extern void Print_pf_pointer(FILE *, PF_POINTER *);
00279
00280
00281 extern BOOL Ilod_TY_is_volatile(TY_IDX);
00282
00283
00284 extern BOOL Lod_TY_is_volatile(TY_IDX);
00285
00286
00287 extern INT64 WN_get_const_val(WN *);
00288
00289 enum { SIGN_UNKNOWN = 0x0,
00290 SIGN_1_EXTD = 0x1,
00291 SIGN_0_EXTD = 0x2,
00292 };
00293
00294 extern UINT Actual_data_size(CODEREP *cr, OPT_STAB *opt_stab, INT &signess);
00295 extern BOOL No_truncation_by_value_size(MTYPE to_mtype, BOOL sign_extd, CODEREP *rhs, OPT_STAB *opt_stab, BOOL trace_phi = TRUE);
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308 extern BOOL Is_hi_sign_extended(MTYPE result_ty, MTYPE desc_ty);
00309
00310
00311
00312 extern BOOL Is_lo_sign_extended(MTYPE result_ty, MTYPE desc_ty);
00313
00314
00315
00316 extern MTYPE Type_for_saved_load(BOOL hi_sign_ext, BOOL lo_sign_ext,
00317 MTYPE lod_type);
00318
00319
00320 extern WN *Create_identity_assignment(AUX_STAB_ENTRY *sym, AUX_ID aux_id, TY_IDX ty);
00321
00322
00323
00324 extern TY_IDX Identity_assignment_type( AUX_STAB_ENTRY *sym, OPT_PHASE phase );
00325
00326
00327 extern READ_WRITE Get_MP_modref(const WN *pragma_list, const POINTS_TO *pt,
00328 const ALIAS_RULE *rule);
00329
00330
00331 extern WN *Get_MP_accessed_id_list(const ST *st);
00332
00333
00334 extern BOOL Op_can_be_propagated(OPCODE op, OPT_PHASE phase);
00335
00336
00337 extern BOOL Is_region_with_pragma(WN *wn, WN_PRAGMA_ID pragma_id);
00338
00339 extern void Connect_cr_wn(WN_MAP *cr_wn_map, CODEREP *cr, WN *wn);
00340
00341 extern MTYPE Rebuild_rtype(MTYPE rtype, INT bits);
00342
00343 extern BOOL OPERATOR_is_fake(OPERATOR oper);
00344 extern BOOL OPCODE_is_fake(OPCODE opc);
00345 extern BOOL OPERATOR_is_volatile(OPERATOR oper);
00346 extern BOOL OPCODE_is_volatile(OPCODE opc);
00347
00348 static inline BOOL
00349 OPERATOR_is_scalar_load (OPERATOR opr)
00350 {
00351 return (opr == OPR_LDID || opr == OPR_LDBITS);
00352 }
00353 static inline BOOL
00354 OPERATOR_is_scalar_store (OPERATOR opr)
00355 {
00356 return (opr == OPR_STID || opr == OPR_STBITS);
00357 }
00358 static inline BOOL
00359 OPERATOR_is_scalar_iload (OPERATOR opr)
00360 {
00361 return (opr == OPR_ILOAD || opr == OPR_ILDBITS || opr == OPR_ILOADX);
00362 }
00363 static inline BOOL
00364 OPERATOR_is_scalar_istore (OPERATOR opr)
00365 {
00366 return (opr == OPR_ISTORE || opr == OPR_ISTBITS || opr == OPR_ISTOREX);
00367 }
00368
00369 WN * WN_copy(WN *wn);
00370 WN * WN_copy_with_map (WN *wn);
00371 MTYPE Mtype_from_class_size(MTYPE t1, MTYPE t2);
00372 void fdump_tree(FILE *f, WN *wn);
00373 void fdump_wn(FILE *f,WN *wn);
00374 void fdump_wn_no_st(FILE *fp,WN *wn);
00375 void fdump_tree_no_st(FILE *fp,WN *wn);
00376 void WN_copy_stmap(WN *src, WN *dst);
00377
00378
00379
00380
00381
00382
00383
00384 #define WN_Pragma_is_Parallel(pragma) \
00385 (pragma == WN_PRAGMA_PARALLEL_BEGIN ||\
00386 pragma == WN_PRAGMA_PFOR_BEGIN ||\
00387 pragma == WN_PRAGMA_PDO_BEGIN ||\
00388 pragma == WN_PRAGMA_PARALLEL_DO ||\
00389 pragma == WN_PRAGMA_DOACROSS ||\
00390 pragma == WN_PRAGMA_SINGLE_PROCESS_BEGIN)
00391
00392 #endif // opt_wn_INCLUDED
00393
00394