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 #ifndef region_util_INCLUDED
00053 #define region_util_INCLUDED
00054
00055 #include "defs.h"
00056 #include "mempool.h"
00057 #include "opcode.h"
00058 #include "opcode_core.h"
00059 #include "opcode_gen_core.h"
00060 #include "srcpos.h"
00061 #include "wn_core.h"
00062 #include "wn_map.h"
00063 #include "preg_list.h"
00064 #include "stab.h"
00065 #include "wn_lower.h"
00066 #ifdef __cplusplus
00067 class POINTS_TO;
00068 #else
00069 #define POINTS_TO void
00070 #endif
00071
00072 #ifdef __cplusplus
00073 extern "C" {
00074 #endif
00075
00076
00077 struct cgrin;
00078
00079
00080
00081 typedef enum {
00082 RL_UNKNOWN,
00083 RL_SRC,
00084 RL_MP,
00085 RL_RGN_INIT,
00086 RL_IPA_PREOPT,
00087 RL_LNO_PREOPT,
00088 RL_LNO,
00089 RL_DU_PREOPT,
00090 RL_RAIL,
00091 RL_RBI,
00092 RL_PREOPT,
00093 RL_MAINOPT,
00094 RL_RVI1,
00095 RL_RVI2,
00096 RL_CG,
00097 RL_CGSCHED,
00098 RL_LAST
00099 } REGION_LEVEL;
00100
00101 struct region_flags_struct {
00102 mUINT16 level : 4;
00103 mUINT16 gra_flags : 4;
00104 mUINT16 return_flag : 1;
00105 mUINT16 glue_code_flag : 1;
00106 mUINT16 contains_black : 1;
00107 mUINT16 contains_bounds : 1;
00108 mUINT16 bounds_exist : 1;
00109 mUINT16 aliased_to_globals : 1;
00110 mUINT16 aliased_to_indirects : 1;
00111 mUINT16 contains_uplevel : 1;
00112 mUINT16 contains_barrier : 1;
00113 mUINT16 unused : 3;
00114 };
00115
00116 typedef enum {
00117 RID_FLAGS_has_reg_alloc = 0x1,
00118 RID_FLAGS_was_gra = 0x2
00119 } REGION_FLAGS;
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 typedef enum {
00133 RID_TYPE_undefined = 0x00,
00134 RID_TYPE_func_entry = 0x01,
00135 RID_TYPE_loop = 0x02,
00136 RID_TYPE_pragma = 0x04,
00137 RID_TYPE_olimit = 0x08,
00138 RID_TYPE_mp = 0x10,
00139 RID_TYPE_rpi = 0x20,
00140 RID_TYPE_cold = 0x40,
00141 RID_TYPE_swp = 0x80,
00142 #ifdef TARG_SL2 //fork_joint
00143 RID_TYPE_major = 0x100,
00144 RID_TYPE_minor = 0x200,
00145 #endif
00146 RID_TYPE_eh = 0x3f000,
00147 RID_TYPE_try = 0x01000,
00148 RID_TYPE_cleanup = 0x02000,
00149 RID_TYPE_exc_spec = 0x04000,
00150 RID_TYPE_mask = 0x08000,
00151 RID_TYPE_guard = 0x10000,
00152 RID_TYPE_null_cleanup = 0x20000
00153 } RID_TYPE;
00154
00155
00156 typedef enum {
00157 TT_REGION_USER_DEBUG = 0x0001,
00158 TT_REGION_LARGE_PU_DEBUG = 0x0002,
00159 TT_REGION_LARGE_PU_OFF = 0x0004,
00160 TT_REGION_RGN_INIT_DEBUG = 0x0008,
00161 TT_REGION_LNO_DEBUG = 0x0010,
00162 TT_REGION_RAIL_DEBUG = 0x0020,
00163 TT_REGION_RBI_DEBUG = 0x0040,
00164 TT_REGION_WOPT_DEBUG = 0x0080,
00165 TT_REGION_CG_DEBUG = 0x0100,
00166 TT_REGION_BOUND_DEBUG = 0x0200,
00167 TT_REGION_ALL = 0xffffffff
00168 } REGION_DEBUG_FLAGS;
00169
00170
00171
00172
00173 typedef enum {
00174 REGION_BOUND_UNKNOWN = FALSE,
00175 REGION_BOUND_EXISTS = TRUE
00176 } REGION_BOUND_EXIST;
00177
00178
00179
00180
00181 typedef enum {
00182 REGION_NO_RETURN = FALSE,
00183 REGION_RETURN = TRUE
00184 } REGION_RETURN_ENUM;
00185
00186 typedef union region_flags_union {
00187 UINT32 flags;
00188 struct region_flags_struct rfs;
00189 } URFLAG;
00190
00191
00192 #define RID_CREATE_NEW_ID -1
00193
00194 #define URFLAG_flags(r) ((r).flags)
00195 #define URFLAG_clear(r) ( (r).flags = 0 )
00196 #define URFLAG_rfs(r) ((r).rfs)
00197 #define URFLAG_level(r) ((r).rfs.level)
00198 #define URFLAG_type(r) ((r).rfs.type)
00199 #define URFLAG_gra_flags(r) ((r).rfs.gra_flags)
00200 #define URFLAG_return_flag(r) ((r).rfs.return_flag)
00201 #define URFLAG_glue_code_flag(r) ((r).rfs.glue_code_flag)
00202 #define URFLAG_contains_black(r) ((r).rfs.contains_black)
00203 #define URFLAG_contains_bounds(r) ((r).rfs.contains_bounds)
00204 #define URFLAG_bounds_exist(r) ((r).rfs.bounds_exist)
00205 #define URFLAG_aliased_to_globals(r) ((r).rfs.aliased_to_globals)
00206 #define URFLAG_aliased_to_indirects(r) ((r).rfs.aliased_to_indirects)
00207 #define URFLAG_contains_uplevel(r) ((r).rfs.contains_uplevel)
00208 #define URFLAG_contains_barrier(r) ((r).rfs.contains_barrier)
00209
00210 typedef struct points_to_ref {
00211 POINTS_TO *Pt;
00212 struct points_to_ref *Next;
00213 } POINTS_TO_SET;
00214
00215 struct EH_RANGE;
00216
00217
00218 typedef struct region_id {
00219 INT id;
00220
00221 RID_TYPE rid_type;
00222 INT depth;
00223
00224 SRCPOS srcpos;
00225
00226 UINT32 flags;
00227 struct cgrin *cginfo;
00228 INT32 num_exits;
00229
00230
00231 PREG_LIST *pregs_in;
00232 PREG_LIST **pregs_out;
00233
00234
00235
00236
00237 PREG_LIST *pregs_quad;
00238 PREG_LIST *pregs_complex_quad;
00239 POINTS_TO_SET *used_in;
00240 POINTS_TO_SET *def_in_live_out;
00241
00242 char *options;
00243
00244 WN *rwn;
00245
00246
00247 WN *parent_block;
00248
00249
00250
00251 struct region_id *parent;
00252 struct region_id *first_kid;
00253 struct region_id *next;
00254
00255 LOWER_ACTIONS lowered;
00256 struct EH_RANGE *eh_range_ptr;
00257
00258 } RID;
00259
00260
00261 #define RID_id(r) ((r)->id)
00262 #define RID_depth(r) ((r)->depth)
00263 #define RID_srcpos(r) ((r)->srcpos)
00264 #define RID_flags(r) ((r)->flags)
00265 #define RID_cginfo(r) ((r)->cginfo)
00266 #define RID_num_exits(r) ((r)->num_exits)
00267 #define RID_options(r) ((r)->options)
00268 #define RID_rwn(r) ((r)->rwn)
00269 #define RID_parent(r) ((r)->parent)
00270 #define RID_parent_block(r) ((r)->parent_block)
00271 #define RID_first_kid(r) ((r)->first_kid)
00272 #define RID_next(r) ((r)->next)
00273 #define RID_rloop(r) ((r)->rloop)
00274 #define RID_lowered(r) ((r)->lowered)
00275 #define RID_eh_range_ptr(r) ((r)->eh_range_ptr)
00276 #define RID_type(r) ((r)->rid_type)
00277
00278
00279 #define RID_level(r) (URFLAG_level(*((URFLAG *)(&RID_flags(r)))))
00280 #define RID_gra_flags(r) (URFLAG_gra_flags(*((URFLAG *)(&RID_flags(r)))))
00281 #define RID_has_return(r) (URFLAG_return_flag(*((URFLAG *)(&RID_flags(r)))))
00282 #define RID_is_glue_code(r) (URFLAG_glue_code_flag(*((URFLAG *)(&RID_flags(r)))))
00283 #define RID_contains_black(r) (URFLAG_contains_black(*((URFLAG *)(&RID_flags(r)))))
00284 #define RID_contains_bounds(r) (URFLAG_contains_bounds(*((URFLAG *)(&RID_flags(r)))))
00285 #define RID_bounds_exist(r) (URFLAG_bounds_exist(*((URFLAG *)(&RID_flags(r)))))
00286 #define RID_aliased_to_globals(r) (URFLAG_aliased_to_globals(*((URFLAG *)(&RID_flags(r)))))
00287 #define RID_aliased_to_indirects(r) (URFLAG_aliased_to_indirects(*((URFLAG *)(&RID_flags(r)))))
00288 #define RID_contains_uplevel(r) (URFLAG_contains_uplevel(*((URFLAG *)(&RID_flags(r)))))
00289 #define RID_contains_barrier(r) (URFLAG_contains_barrier(*((URFLAG *)(&RID_flags(r)))))
00290
00291
00292 #define RID_pregs_in(r) ((r)->pregs_in)
00293 #define RID_pregs_quad(r) ((r)->pregs_quad)
00294 #define RID_pregs_complex_quad(r) ((r)->pregs_complex_quad)
00295 #define RID_pregs_out(r) ((r)->pregs_out)
00296 #define RID_pregs_out_i(r,i) (((r)->pregs_out)?(((r)->pregs_out)[(i)]):((PREG_LIST *)NULL))
00297 #define RID_pregs_set_out_i(r,i) (((r)->pregs_out)[(i)])
00298 #define RID_used_in(r) ((r)->used_in)
00299 #define RID_def_in_live_out(r) ((r)->def_in_live_out)
00300
00301
00302 #define RID_has_reg_alloc(r) (RID_gra_flags(r) & RID_FLAGS_has_reg_alloc)
00303 #define RID_has_reg_alloc_Set(r) (RID_gra_flags(r) |= RID_FLAGS_has_reg_alloc)
00304 #define RID_has_reg_alloc_Reset(r) (RID_gra_flags(r) &= ~RID_FLAGS_has_reg_alloc)
00305 #define RID_was_gra(r) (RID_gra_flags(r) & RID_FLAGS_was_gra)
00306 #define RID_was_gra_Set(r) (RID_gra_flags(r) |= RID_FLAGS_was_gra)
00307 #define RID_was_gra__Reset(r) (RID_gra_flags(r) &= ~RID_FLAGS_was_gra)
00308
00309
00310 #define RID_TYPE_func_entry(r) (RID_type(r) & RID_TYPE_func_entry)
00311 #define RID_TYPE_func_entry_Set(r) (RID_type(r) = \
00312 (RID_TYPE)(RID_type(r) | RID_TYPE_func_entry))
00313 #define RID_TYPE_func_entry_Reset(r) (RID_type(r) = \
00314 (RID_TYPE)(RID_type(r) & ~RID_TYPE_func_entry))
00315
00316 #define RID_TYPE_loop(r) (RID_type(r) & RID_TYPE_loop)
00317 #define RID_TYPE_loop_Set(r) (RID_type(r) = \
00318 (RID_TYPE)(RID_type(r) | RID_TYPE_loop))
00319 #define RID_TYPE_loop_Reset(r) (RID_type(r) = \
00320 (RID_TYPE)(RID_type(r) & ~RID_TYPE_loop))
00321
00322 #define RID_TYPE_pragma(r) (RID_type(r) & RID_TYPE_pragma)
00323 #define RID_TYPE_pragma_Set(r) (RID_type(r) = \
00324 (RID_TYPE)(RID_type(r) | RID_TYPE_pragma))
00325 #define RID_TYPE_pragma_Reset(r) (RID_type(r) = \
00326 (RID_TYPE)(RID_type(r) & ~RID_TYPE_pragma))
00327
00328 #define RID_TYPE_olimit(r) (RID_type(r) & RID_TYPE_olimit)
00329 #define RID_TYPE_olimit_Set(r) (RID_type(r) = \
00330 (RID_TYPE)(RID_type(r) | RID_TYPE_olimit))
00331 #define RID_TYPE_olimit_Reset(r) (RID_type(r) = \
00332 (RID_TYPE)(RID_type(r) & ~RID_TYPE_olimit))
00333
00334 #define RID_TYPE_mp(r) (RID_type(r) & RID_TYPE_mp)
00335 #define RID_TYPE_mp_Set(r) (RID_type(r) = \
00336 (RID_TYPE)(RID_type(r) | RID_TYPE_mp))
00337 #define RID_TYPE_mp_Reset(r) (RID_type(r) = \
00338 (RID_TYPE)(RID_type(r) & ~RID_TYPE_mp))
00339
00340 #define RID_TYPE_rpi(r) (RID_type(r) & RID_TYPE_rpi)
00341 #define RID_TYPE_rpi_Set(r) (RID_type(r) = \
00342 (RID_TYPE)(RID_type(r) | RID_TYPE_rpi))
00343 #define RID_TYPE_rpi_Reset(r) (RID_type(r) = \
00344 (RID_TYPE)(RID_type(r) & ~RID_TYPE_rpi))
00345
00346 #define RID_TYPE_cold(r) (RID_type(r) & RID_TYPE_cold)
00347 #define RID_TYPE_cold_Set(r) (RID_type(r) = \
00348 (RID_TYPE)(RID_type(r) | RID_TYPE_cold))
00349 #define RID_TYPE_cold_Reset(r) (RID_type(r) = \
00350 (RID_TYPE)(RID_type(r) & ~RID_TYPE_cold))
00351
00352 #define RID_TYPE_swp(r) (RID_type(r) & RID_TYPE_swp)
00353 #define RID_TYPE_swp_Set(r) (RID_type(r) = \
00354 (RID_TYPE)(RID_type(r) | RID_TYPE_swp))
00355 #define RID_TYPE_swp_Reset(r) (RID_type(r) = \
00356 (RID_TYPE)(RID_type(r) & ~RID_TYPE_swp))
00357
00358 #ifdef TARG_SL2 //fork_joint
00359 #define RID_TYPE_major(r) (RID_type(r) & RID_TYPE_major)
00360 #define RID_TYPE_major_Set(r) (RID_type(r) = \
00361 (RID_TYPE)(RID_type(r) | RID_TYPE_major))
00362 #define RID_TYPE_major_Reset(r) (RID_type(r) = \
00363 (RID_TYPE)(RID_type(r) & ~RID_TYPE_major))
00364 #define RID_TYPE_minor(r) (RID_type(r) & RID_TYPE_minor)
00365 #define RID_TYPE_minor_Set(r) (RID_type(r) = \
00366 (RID_TYPE)(RID_type(r) | RID_TYPE_minor))
00367 #define RID_TYPE_minor_Reset(r) (RID_type(r) = \
00368 (RID_TYPE)(RID_type(r) & ~RID_TYPE_minor))
00369 #endif
00370
00371
00372 #define RID_TYPE_eh(r) (RID_type(r) & RID_TYPE_eh)
00373
00374
00375 #define RID_TYPE_try(r) (RID_type(r) & RID_TYPE_try)
00376 #define RID_TYPE_try_Set(r) (RID_type(r) = \
00377 (RID_TYPE)(RID_type(r) | RID_TYPE_try))
00378 #define RID_TYPE_try_Reset(r) (RID_type(r) = \
00379 (RID_TYPE)(RID_type(r) & ~RID_TYPE_try))
00380
00381 #define RID_TYPE_cleanup(r) (RID_type(r) & RID_TYPE_cleanup)
00382 #define RID_TYPE_cleanup_Set(r) (RID_type(r) = \
00383 (RID_TYPE)(RID_type(r) | RID_TYPE_cleanup))
00384 #define RID_TYPE_cleanup_Reset(r) (RID_type(r) = \
00385 (RID_TYPE)(RID_type(r) & ~RID_TYPE_cleanup))
00386
00387 #define RID_TYPE_exc_spec(r) (RID_type(r) & RID_TYPE_exc_spec)
00388 #define RID_TYPE_exc_spec_Set(r) (RID_type(r) = \
00389 (RID_TYPE)(RID_type(r) | RID_TYPE_exc_spec))
00390 #define RID_TYPE_exc_spec_Reset(r) (RID_type(r) = \
00391 (RID_TYPE)(RID_type(r) & ~RID_TYPE_exc_spec))
00392
00393 #define RID_TYPE_mask(r) (RID_type(r) & RID_TYPE_mask)
00394 #define RID_TYPE_mask_Set(r) (RID_type(r) = \
00395 (RID_TYPE)(RID_type(r) | RID_TYPE_mask))
00396 #define RID_TYPE_mask_Reset(r) (RID_type(r) = \
00397 (RID_TYPE)(RID_type(r) & ~RID_TYPE_mask))
00398
00399 #define RID_TYPE_guard(r) (RID_type(r) & RID_TYPE_guard)
00400 #define RID_TYPE_guard_Set(r) (RID_type(r) = \
00401 (RID_TYPE)(RID_type(r) | RID_TYPE_guard))
00402 #define RID_TYPE_guard_Reset(r) (RID_type(r) = \
00403 (RID_TYPE)(RID_type(r) & ~RID_TYPE_guard))
00404
00405 #define RID_TYPE_null_cleanup(r) (RID_type(r) & RID_TYPE_null_cleanup)
00406 #define RID_TYPE_null_cleanup_Set(r) (RID_type(r) = \
00407 (RID_TYPE)(RID_type(r) | RID_TYPE_null_cleanup))
00408 #define RID_TYPE_null_cleanup_Reset(r) (RID_type(r) = \
00409 (RID_TYPE)(RID_type(r) & ~RID_TYPE_guard))
00410
00411
00412 #define RID_TYPE_transparent(r) ( RID_TYPE_func_entry(r) \
00413 || RID_TYPE_mp(r) \
00414 || RID_TYPE_eh(r) \
00415 || RID_TYPE_swp(r) \
00416 || RID_TYPE_cold(r))
00417
00418 #if defined(TARG_SL2)
00419 #define RID_TYPE_sl2_para(r) ( RID_TYPE_major(r) \
00420 || RID_TYPE_minor(r))
00421 #endif
00422
00423
00424
00425
00426
00427
00428 #define REGION_STACK_SIZE 10
00429 typedef struct region_cs_iter {
00430 RID *me;
00431 RID *kid;
00432 RID_TYPE type;
00433 WN *parent_block;
00434 WN *region_marker[REGION_STACK_SIZE];
00435 INT32 region_marker_sp;
00436 BOOL is_pu;
00437 BOOL is_not_stacked;
00438 } REGION_CS_ITER;
00439
00440 #define REGION_CS_ITER_me(i) ((i)->me)
00441 #define REGION_CS_ITER_kid(i) ((i)->kid)
00442 #define REGION_CS_ITER_type(i) ((i)->type)
00443 #define REGION_CS_ITER_parent_block(i) ((i)->parent_block)
00444 #define REGION_CS_ITER_sp(i) ((i)->region_marker_sp)
00445 #define REGION_CS_ITER_marker(i,j) ((i)->region_marker[j])
00446 #define REGION_CS_ITER_is_pu(i) ((i)->is_pu)
00447 #define REGION_CS_ITER_is_not_stacked(i) ((i)->is_not_stacked)
00448 #define REGION_CS_ITER_wn(i) (RID_rwn((i)->kid))
00449
00450
00451
00452 extern WN_MAP RID_map;
00453 extern MEM_POOL REGION_mem_pool;
00454
00455
00456 extern INT32 New_Region_Id(void);
00457 extern INT32 Last_Region_Id(void);
00458
00459
00460 extern void REGION_new_wn(WN *, WN *);
00461
00462
00463 extern BOOL REGION_consistency_check(WN *);
00464
00465
00466 extern void REGION_update_alias_info(WN *, struct ALIAS_MANAGER *);
00467
00468
00469 extern RID *REGION_get_rid(const WN *);
00470
00471
00472 extern WN *REGION_find_pu(WN *);
00473
00474
00475 extern BOOL REGION_has_black_regions(RID *);
00476
00477
00478 extern void REGION_set_level(RID *, REGION_LEVEL);
00479
00480
00481 extern BOOL REGION_count_exits(WN *);
00482
00483
00484 extern void REGION_fix_up_exits(RID *, WN *);
00485
00486
00487 extern BOOL REGION_scan_exits(WN *, INT32);
00488
00489
00490
00491
00492 extern RID *RID_Create(INT, INT, WN *);
00493
00494
00495 extern void RID_Add_kid(RID *, RID *);
00496
00497
00498 extern void RID_unlink(RID *);
00499
00500
00501 extern void RID_replace(RID *old_rid, RID *new_rid);
00502
00503
00504 extern void RID_Delete(WN_MAP_TAB *, WN *);
00505 extern void RID_Delete2(RID *);
00506
00507
00508 extern void REGION_clone(WN *, WN *, WN *);
00509
00510
00511 extern void REGION_emit(RID *, WN *, INT32, INT32, INT64);
00512
00513
00514 extern void RID_copy_sets(RID *, RID *);
00515
00516
00517 extern REGION_LEVEL RID_preopt_level(INT);
00518
00519
00520 extern BOOL REGION_search_preg_set(PREG_LIST *, PREG_NUM);
00521
00522
00523 extern void REGION_add_wn_points_to(POINTS_TO_SET **, WN *,
00524 struct ALIAS_MANAGER *);
00525
00526
00527 extern void REGION_add_points_to(POINTS_TO_SET **, POINTS_TO *,
00528 struct ALIAS_MANAGER *);
00529
00530
00531 extern POINTS_TO *Points_to_copy(POINTS_TO *, MEM_POOL *);
00532
00533 extern void Get_symbol_info_for_cvt_io(POINTS_TO *, WN *);
00534
00535 extern POINTS_TO *Points_to(struct ALIAS_MANAGER *, WN *);
00536
00537
00538
00539 extern BOOL REGION_add_preg_in(RID *rid, PREG_NUM pr, TYPE_ID quad);
00540 extern BOOL REGION_add_preg_out(RID *rid, INT32 which_set, PREG_NUM pr,
00541 TYPE_ID quad);
00542
00543
00544
00545 extern BOOL REGION_remove_preg(RID *rid, PREG_NUM pr, BOOL outset);
00546
00547
00548 extern WN *REGION_add_exit(WN *, WN *, WN *);
00549
00550
00551 extern void REGION_delete_exit(RID *, INT32, WN *, BOOL);
00552
00553
00554 extern char *REGION_get_options_string(WN *);
00555
00556
00557 extern BOOL REGION_is_EH(WN *);
00558
00559
00560 extern BOOL REGION_is_mp(WN *);
00561
00562 #if defined(TARG_SL2)
00563
00564 extern BOOL REGION_is_sl2_para(WN*);
00565 #endif
00566
00567
00568 extern BOOL REGION_is_EH(WN *);
00569
00570
00571 extern BOOL WN_Fake_Call_EH_Region(WN *,WN_MAP);
00572
00573
00574
00575 extern REGION_KIND REGION_type_to_kind(RID *);
00576
00577
00578 extern void REGION_kind_to_type(WN *, RID *);
00579
00580
00581 extern void REGION_propagate_return(RID *);
00582
00583
00584 extern char *RID_level_str(RID *rid);
00585
00586
00587 extern char *RID_type_str(RID_TYPE type);
00588
00589
00590
00591 extern void RID_set_print(FILE *, RID *);
00592
00593 extern void Print_points_to(FILE *, POINTS_TO *);
00594
00595
00596 extern void RID_Fprint(FILE *, RID *);
00597
00598
00599 extern void RID_Tree_Print(FILE *, RID *);
00600
00601
00602 extern void RID_WN_Tree_Print(FILE *, WN *);
00603
00604 #ifdef __cplusplus
00605 }
00606 #endif
00607
00608 #endif