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
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 #ifndef _LEGO_UTIL_INCLUDED_
00186 #define _LEGO_UTIL_INCLUDED_
00187
00188 #include "defs.h"
00189 #include "stab.h"
00190 #include "wn.h"
00191 #include "stab.h"
00192 #include "access_vector.h"
00193
00194
00195
00196
00197
00198
00199
00200
00201 #define HT_Push 0
00202 #define HT_Pop 1
00203 #define HT_Top 2
00204 #define HT_Check 3
00205 #define HT_Replace 4
00206 #define Initialize_Dart 5
00207 #define Allocate_Dart 6
00208 #define Alloc_Reshape 7
00209 #define Dealloc_Reshape 8
00210 #define Migrate_Array 9
00211 #define Unmigrate_Array 10
00212 #define Migrate_Pages 11
00213 #define Proc_Pool_Push 12
00214 #define Proc_Pool_Pop 13
00215 #define Cyclic_Bounds 14
00216 #define Simple_Bounds 15
00217 #define Processor_Layout 16
00218 #define Processor_Coordinates 17
00219 #define Dynamic_Affinity_Bounds 18
00220 #define mp_sug_numthreads 19
00221 #define mp_cur_numthreads 20
00222 #define mp_my_threadnum 21
00223 #define mp_numthreads_fn 22
00224 #define Deallocate_Dart 23
00225 #define Compare_Darts 24
00226 #define ECHT_Push 25
00227 #define ECHT_Pop 26
00228 #define ECHT_Check 27
00229 #define ECHT_Compare 28
00230 #ifndef KEY // Pathscale does not have this
00231 #define mp_cur_numthreads_func 29
00232 #endif
00233 #define DST_MAX 30
00234
00235
00236 extern ST* distr_st_entries[DST_MAX];
00237
00238
00239 #define RT_dim_struct 0
00240 #define RT_dim_ptr 1
00241 #define RT_struct 2
00242 #define RT_ptr 3
00243 #define VOID_ptr 4
00244 #define DTY_MAX 5
00245 extern TY_IDX distr_ty_entries[DTY_MAX];
00246
00247
00248
00249
00250 #define dart_offset_num_dim 0
00251 #define dart_offset_element_size 8
00252 #define dart_offset_flags 16
00253 #define dart_offset_distr_n 24
00254 #define dart_offset_distr_p 32
00255 #define dart_offset_distr_k 40
00256 #define dart_offset_distr_lb 48
00257
00258
00259 #define dart_base_size 3
00260 #define dart_distr_size 4
00261
00262 extern "C" {
00263 void Mp_File_Init (void);
00264 }
00265
00266
00267
00268
00269
00270
00271
00272 class DISTR_ARRAY;
00273 extern DISTR_ARRAY *Lookup_DACT(ST *array_st);
00274 extern TY_IDX DART_ptr_TY;
00275
00276
00277
00278
00279
00280
00281
00282
00283 typedef enum { var_local, var_global, var_formal, var_common } VAR_KIND;
00284
00285 extern VAR_KIND ST_Var_Kind (ST*);
00286
00287 #define ST_isGlobal(st) (ST_Var_Kind(st) == var_global)
00288 #define ST_isLocal(st) (ST_Var_Kind(st) == var_local)
00289 #define ST_isFormal(st) (ST_Var_Kind(st) == var_formal)
00290 #define ST_isCommon(st) (ST_Var_Kind(st) == var_common)
00291
00292 extern TY_IDX Get_Original_Type(ST* st);
00293 extern TY_IDX Get_Array_Type(ST* st);
00294
00295
00296
00297
00298
00299
00300
00301 extern WN *AWN_Binary (OPERATOR opr, TYPE_ID rtype, WN *kid0, WN *kid1,
00302 BOOL can_speculate = FALSE);
00303 extern WN* AWN_LdidSym (SYMBOL *var);
00304 extern WN *AWN_StidIntoSym(SYMBOL *var, WN *val);
00305 extern WN *Create_Positive_Divceil(TYPE_ID type, WN *kid0, WN *kid1,
00306 BOOL can_speculate);
00307 extern void Set_Array_Dim(WN *array_expr, INT dim, WN *bound, WN *index);
00308 extern void Replace_WN (WN *old_wn, WN *new_wn);
00309
00310 class LEGO_INFO;
00311 extern WN* Get_Numthreads_Ldid (LEGO_INFO* li);
00312 extern WN* Get_Runtime_Numthreads_Ldid ();
00313 extern WN* Get_Runtime_Cur_Numthreads_Ldid ();
00314 extern void Set_Runtime_Call_Side_Effects (WN* call_wn);
00315 extern void Freeze_Numthreads_Ldid(WN* wn_loop);
00316 extern void Freeze_Cur_Numthreads_Func(WN* wn_loop);
00317 extern WN* Get_Frozen_Numthreads_Ldid(WN* wn_loop);
00318 extern WN* Get_Runtime_Cur_Numthreads_Func(WN* wn_loop);
00319 extern WN* Loop_Step(WN* wn_loop);
00320
00321 extern SYMBOL* Create_Local_Symbol (char* name, TYPE_ID mtype);
00322 extern WN* Get_MP_Region (WN* wn);
00323 extern BOOL Fixed_Size_Array_Is_Stride_One(ST* array_st);
00324
00325 extern ST *Find_Return_Registers(TYPE_ID type,PREG_NUM *rreg1,PREG_NUM *rreg2);
00326
00327 extern BOOL PU_has_reshaped_commons;
00328 extern WN_MAP Safe_Spec_Map;
00329
00330 #define AWN_Mpy(rtype, l, r) AWN_Binary(OPR_MPY, rtype, l, r, FALSE)
00331 #define AWN_Mod(rtype, l, r) AWN_Binary(OPR_MOD, rtype, l, r, FALSE)
00332 #define AWN_Rem(rtype, l, r) AWN_Binary(OPR_REM, rtype, l, r, FALSE)
00333 #define AWN_Sub(rtype, l, r) AWN_Binary(OPR_SUB, rtype, l, r, FALSE)
00334 #define AWN_Add(rtype, l, r) AWN_Binary(OPR_ADD, rtype, l, r, FALSE)
00335 #define AWN_Div(rtype, l, r) AWN_Binary(OPR_DIV, rtype, l, r, FALSE)
00336 #define AWN_Max(rtype, l, r) AWN_Binary(OPR_MAX, rtype, l, r, FALSE)
00337 #define AWN_Min(rtype, l, r) AWN_Binary(OPR_MIN, rtype, l, r, FALSE)
00338
00339 #define AWN_Rem_Safe(rtype, l, r) AWN_Binary(OPR_REM, rtype, l, r, TRUE)
00340 #define AWN_Div_Safe(rtype, l, r) AWN_Binary(OPR_DIV, rtype, l, r, TRUE)
00341 #define AWN_Mod_Safe(rtype, l, r) AWN_Binary(OPR_MOD, rtype, l, r, TRUE)
00342
00343 extern WN* Lego_Find_Node(SYMBOL sym, WN* wn_tree);
00344
00345 extern void Lego_Find_Nodes(OPERATOR opr, SYMBOL sym, WN* wn_tree,
00346 STACK<WN*>* stack);
00347
00348 extern mBOOL Single_Loop_Coeff(ACCESS_VECTOR *av, INT64 *stride, INT64 *offset,
00349 mINT32 *depth);
00350
00351 extern INT Get_New_Lego_Mp_Tile_Key(void);
00352
00353 enum MP_SCHED_TYPE {MP_SCHED_UNKNOWN,
00354 MP_SCHED_SIMPLE,
00355 MP_SCHED_DYNAMIC,
00356 MP_SCHED_GSS,
00357 MP_SCHED_INTERLEAVE,
00358 MP_SCHED_RUNTIME,
00359 MP_SCHED_PSEUDOLOWERED};
00360 class MP_INFO {
00361 MP_SCHED_TYPE _sched_type;
00362 SYMBOL* _pid_sym0;
00363 SYMBOL* _pid_sym1;
00364 INT _nest_index;
00365 INT _nest_total;
00366 SYMBOL* _nest_layout;
00367 BOOL _is_pdo;
00368 BOOL _plower_disabled;
00369 SYMBOL* _sym_frozen;
00370 public:
00371 MP_INFO(MP_SCHED_TYPE sched_type, BOOL is_pdo);
00372 MP_INFO(WN* wn_pragmas);
00373 MP_INFO(MP_INFO* mp_info);
00374 MP_SCHED_TYPE Sched_Type() const { return _sched_type; }
00375 SYMBOL* Pid_Sym0() const { return _pid_sym0; }
00376 SYMBOL* Pid_Sym1() const { return _pid_sym1; }
00377 void Set_Pid0(SYMBOL *pid_sym) { _pid_sym0 = pid_sym; }
00378 void Set_Pid1(SYMBOL *pid_sym) { _pid_sym1 = pid_sym; }
00379 INT Nest_Index() { return _nest_index; }
00380 INT Nest_Total() { return _nest_total; }
00381 void Set_Nest_Total(INT nest_total) { _nest_total = nest_total; }
00382 SYMBOL* Nest_Layout() { return _nest_layout; }
00383 void Set_Nest_Layout(SYMBOL* sym_layout)
00384 { _nest_layout = sym_layout; }
00385 BOOL Is_Pdo() { return _is_pdo; }
00386 BOOL Plower_Disabled() const { return _plower_disabled; }
00387 void Disable_Plowering () { _plower_disabled = TRUE; }
00388 SYMBOL* Sym_Frozen() { return _sym_frozen; }
00389 void Set_Sym_Frozen(SYMBOL* sym_frozen) { _sym_frozen = sym_frozen; }
00390 void Print(FILE* fp);
00391 };
00392
00393
00394
00395
00396
00397
00398
00399
00400 extern BOOL Debug_Lego;
00401 extern BOOL Verbose_Lego;
00402 #ifdef Is_True_On
00403 #define DB_PRINT(x) if (Debug_Lego) { x; }
00404 #else
00405 #define DB_PRINT(x)
00406 #endif
00407
00408 #ifdef Is_True_On
00409 #define VB_PRINT(x) if (Verbose_Lego) { x; }
00410 #else
00411 #define VB_PRINT(x)
00412 #endif
00413
00414 #endif // _LEGO_UTIL_INCLUDED_