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 #ifdef USE_PCH
00155 #include "lno_pch.h"
00156 #endif // USE_PCH
00157 #pragma hdrstop
00158
00159 #include <stdarg.h>
00160 #include <alloca.h>
00161 #include <sys/types.h>
00162 #include <ctype.h>
00163 #include <limits.h>
00164
00165 #include "pu_info.h"
00166 #include "lego_gen.h"
00167 #include "lego_util.h"
00168 #include "wn_pragmas.h"
00169 #include "cxx_memory.h"
00170 #include "lwn_util.h"
00171 #include "lego.h"
00172 #include "strtab.h"
00173 #include "config_targ.h"
00174 #include "const.h"
00175 #include "dra_demangle.h"
00176 #include "lnoutils.h"
00177 #include "opt_du.h"
00178 #include "opt_alias_interface.h"
00179 #include "irbdata.h"
00180 #include "data_layout.h"
00181 #include "lnopt_main.h"
00182 #include "errors.h"
00183 #include "erbe.h"
00184
00185
00186
00187
00188
00189
00190 extern void Lower_Distr_Pragmas (WN* func_nd);
00191 extern DU_MANAGER *Du_Mgr;
00192 extern class ALIAS_MANAGER *Alias_Mgr;
00193 extern ST *Find_Return_Registers(TYPE_ID type,PREG_NUM *rreg1,PREG_NUM *rreg2);
00194 extern WN *AWN_LdidSym(SYMBOL *var);
00195 extern WN *AWN_StidIntoSym(SYMBOL *var, WN *val);
00196 extern WN *Create_Positive_Divceil(TYPE_ID type, WN *kid0, WN *kid1,
00197 BOOL can_speculate);
00198 extern WN *AWN_Binary(OPERATOR opr, TYPE_ID rtype, WN *kid0, WN *kid1);
00199 extern WN* Create_Array_Store(ST* st_array,
00200 TYPE_ID mtype,
00201 INT index,
00202 INT element_size,
00203 INT element_count,
00204 WN* wn_value);
00205
00206 extern BOOL Run_Dsm_Check;
00207 extern WN* Find_SCF_Inside(WN* parent_wn, OPCODE opc);
00208
00209
00210
00211
00212
00213
00214
00215
00216 extern ST* distr_st_entries[DST_MAX];
00217 extern TY_IDX distr_ty_entries[DTY_MAX];
00218 ST* distr_st_entries[DST_MAX];
00219 TY_IDX distr_ty_entries[DTY_MAX];
00220
00221
00222
00223
00224
00225
00226 typedef STACK<WN *> STACK_OF_WN;
00227 static WN* exit_wn = NULL;
00228 static STACK_OF_WN *altentry_stack = NULL;
00229
00230 static void Lower_Distr_Array (DISTR_INFO* dinfo);
00231 static void Lower_Pragma_Distribute (DISTR_ARRAY* dact);
00232 static void Lower_Pragma_Redistribute (DISTR_ARRAY* dact);
00233 static void Lower_Pragma_Distribute_Reshape (DISTR_ARRAY* dact);
00234
00235 static WN* Process_Alt_Entries_Local (DISTR_ARRAY* dact, WN* prev_wn);
00236 static WN* Process_Alt_Entries_Formal (DISTR_ARRAY* dact, WN* prev_wn);
00237 static WN* Gen_Symbols_In_DINFO (DISTR_ARRAY* dact, WN* prev_wn);
00238 static WN* Gen_Init_DART (DISTR_ARRAY* dact, WN* prev_wn, ST* st = NULL);
00239 static WN* Gen_Migrate_Array (DISTR_INFO* dinfo, BOOL do_exit, WN *prev_wn);
00240 static WN* Gen_HT_DART (DISTR_INFO* dinfo, BOOL do_exit, BOOL is_redistr,
00241 WN* prev_wn);
00242 static void Process_Global_Distribute (DISTR_ARRAY* dact);
00243 static WN* Gen_Alloc_Reshape (DISTR_ARRAY* dact, BOOL do_exit, WN* prev_wn);
00244
00245 static WN* Gen_EC_Reshaped_Array(DISTR_ARRAY *dact, WN* prev_wn);
00246 static WN* Gen_Compare_DARTS (WN* dart_ldid, WN* ec_dart_ldid, WN* prev_wn,
00247 char* array_name);
00248 static WN* Gen_Dealloc_DART (DISTR_ARRAY* dact, WN* prev_wn, ST* st = NULL);
00249
00250 static ST* Create_Local_ST (ST* dart_st);
00251 static void Insert_Exit_Code (STACK_OF_WN* exit_stack);
00252 static void Reshape_ST_Entry (DISTR_INFO* dinfo);
00253 static WN* Gen_CheckNo_DART (DISTR_ARRAY* dact, WN* prev_wn);
00254 static WN* Gen_Lookup_DART (DISTR_ARRAY* dact, WN* prev_wn, ST* func_st);
00255 static WN* Gen_Alloc_DART (DISTR_ARRAY* dact, WN* prev_wn, ST* st = NULL);
00256 static WN* Gen_Call_Array_Dart_Args(DISTR_INFO* dinfo, ST *func_st);
00257 static WN* Gen_Call_Array_Arg(DISTR_INFO* dinfo, ST *func_st);
00258
00259
00260 static WN* Get_Array_Dimension_LB (TY_IDX array_ty, INT i);
00261
00262 #define fl_offset_sz 0
00263 #define fl_offset_chunk 4
00264 #define fl_offset_flist 8
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 extern void Lower_Distr_Pragmas (WN* func_nd) {
00275 WN* wn = func_nd;
00276
00277
00278 exit_wn = WN_CreateBlock ();
00279 LWN_Set_Parent(exit_wn, NULL);
00280
00281
00282 STACK_OF_WN *exit_stack = CXX_NEW(STACK_OF_WN(LEGO_pool), LEGO_pool);
00283
00284
00285 if (PU_has_altentry(Get_Current_PU()))
00286 altentry_stack = CXX_NEW (STACK_OF_WN(LEGO_pool), LEGO_pool);
00287
00288
00289
00290 while (wn) {
00291 if (WN_operator(wn) == OPR_RETURN
00292 #ifdef KEY
00293 || WN_operator(wn) == OPR_GOTO_OUTER_BLOCK
00294 #endif
00295 ) {
00296 exit_stack->Push(wn);
00297 wn = LWN_Get_Next_Stmt_Node (wn);
00298 } else if ((WN_operator(wn) == OPR_PRAGMA) &&
00299 (WN_pragma(wn) == WN_PRAGMA_REDISTRIBUTE)) {
00300
00301 wn = Read_Pragma_Redistribute (wn, TRUE);
00302 } else if (WN_operator(wn) == OPR_ALTENTRY) {
00303 altentry_stack->Push (wn);
00304 wn = LWN_Get_Next_Stmt_Node (wn);
00305 }
00306 else wn = LWN_Get_Next_Stmt_Node (wn);
00307 }
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319 BOOL local_reshapes = FALSE;
00320 for (INT i=0; i<da_stack->Elements(); i++) {
00321 DISTR_INFO* dinfo = da_stack->Bottom_nth(i);
00322 Lower_Distr_Array (dinfo);
00323 if (dinfo->IsReshaped() && (ST_Var_Kind(dinfo->Array_ST()) == var_local))
00324 local_reshapes = TRUE;
00325 }
00326
00327
00328
00329
00330 if (local_reshapes && exit_stack->Elements()) {
00331
00332 OPCODE callop = OPCODE_make_op (OPR_CALL, MTYPE_V, MTYPE_V);
00333 WN* call_wn = WN_Create (callop, 0);
00334 WN_st_idx(call_wn) = ST_st_idx(distr_st_entries[Proc_Pool_Push]);
00335 Set_Runtime_Call_Side_Effects (call_wn);
00336 LWN_Insert_Block_Before
00337 (NULL,
00338 da_stack->Bottom_nth(0)->Get_Dact(0)-> First_Pragma_WN(),
00339 call_wn);
00340
00341
00342 if (altentry_stack) {
00343 for (INT i=0; i<altentry_stack->Elements(); i++) {
00344 wn = altentry_stack->Bottom_nth(i);
00345 while (wn) {
00346 if (WN_opcode(wn) == OPC_PRAGMA &&
00347 WN_pragma(wn) == WN_PRAGMA_PREAMBLE_END)
00348 break;
00349 wn = WN_next(wn);
00350 }
00351 LWN_Insert_Block_After (NULL, wn, LWN_Copy_Tree(call_wn));
00352 }
00353 }
00354
00355
00356 call_wn = WN_Create (callop, 0);
00357 WN_st_idx(call_wn) = ST_st_idx(distr_st_entries[Proc_Pool_Pop]);
00358 Set_Runtime_Call_Side_Effects (call_wn);
00359 LWN_Insert_Block_Before (exit_wn, NULL, call_wn);
00360 }
00361
00362 Insert_Exit_Code (exit_stack);
00363 if (altentry_stack) {
00364 CXX_DELETE (altentry_stack, LEGO_pool);
00365 altentry_stack = NULL;
00366 }
00367 CXX_DELETE(exit_stack, LEGO_pool);
00368 }
00369
00370 static void Lower_Distr_Array (DISTR_INFO* dinfo) {
00371 INT i;
00372 for (i=0; i<dinfo->Num_Dact(); i++) {
00373 DISTR_ARRAY* dact = dinfo->Get_Dact(i);
00374 if (dinfo->IsReshaped()) Lower_Pragma_Distribute_Reshape (dact);
00375 else Lower_Pragma_Distribute (dact);
00376 }
00377 for (i=0; i<dinfo->Num_Gen_Redistr(); i++) {
00378 DISTR_ARRAY* dact = dinfo->Get_Gen_Redistr(i);
00379 Lower_Pragma_Redistribute (dact);
00380 }
00381 }
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404 static void Lower_Pragma_Distribute (DISTR_ARRAY* dact) {
00405
00406 DISTR_INFO *dinfo = dact->Dinfo();
00407
00408 ST* array_st = dinfo->Array_ST();
00409 WN* pwn = dact->Last_Pragma_WN ();
00410
00411 TY_IDX array_ty = Get_Array_Type(array_st);
00412
00413 if (TY_kind(array_ty) != KIND_ARRAY) {
00414 printf ("Pragma Distribute on a non-array\n");
00415 return;
00416 }
00417
00418 WN *prev_wn = NULL;
00419
00420 switch (ST_Var_Kind(array_st)) {
00421 case var_global:
00422 case var_common:
00423 Process_Global_Distribute (dact);
00424 break;
00425 case var_formal:
00426 prev_wn = pwn;
00427
00428
00429
00430 if (altentry_stack) prev_wn = Process_Alt_Entries_Formal (dact, prev_wn);
00431 else {
00432
00433
00434
00435 prev_wn = Gen_Lookup_DART (dact, prev_wn, distr_st_entries[HT_Check]);
00436 Is_True (!dinfo->IsReshaped(),
00437 ("Lower_Pragma_Distribute on a reshaped array\n"));
00438 prev_wn = Gen_CheckNo_DART (dact, prev_wn);
00439 prev_wn = Gen_Symbols_In_DINFO (dact,prev_wn);
00440 }
00441 break;
00442 case var_local:
00443 prev_wn = pwn;
00444
00445
00446
00447 if (altentry_stack) prev_wn = Process_Alt_Entries_Local (dact, prev_wn);
00448 else {
00449 prev_wn = Gen_Alloc_DART (dact, prev_wn);
00450 prev_wn = Gen_Init_DART (dact, prev_wn);
00451 prev_wn = Gen_Symbols_In_DINFO (dact, prev_wn);
00452 if (TY_kind(array_ty) == KIND_POINTER) {
00453
00454
00455 dinfo->Find_Alloca ();
00456 }
00457 prev_wn = Gen_Migrate_Array (dinfo, TRUE, prev_wn);
00458 prev_wn = Gen_HT_DART(dinfo, TRUE, FALSE, prev_wn);
00459 }
00460 break;
00461 default:
00462 FmtAssert (FALSE, ("Weird variable kind %s\n", ST_name(array_st)));
00463 break;
00464 }
00465
00466 return;
00467 }
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499 static void Lower_Pragma_Distribute_Reshape (DISTR_ARRAY* dact) {
00500 DISTR_INFO *dinfo = dact->Dinfo();
00501
00502 ST* array_st = dinfo->Array_ST();
00503 TY_IDX array_ty = Get_Array_Type(array_st);
00504 WN* pwn = dact->Last_Pragma_WN ();
00505
00506 if (TY_kind(array_ty) != KIND_ARRAY) {
00507 FmtAssert (FALSE, ("Pragma Distribute-Reshape on a non-array (%s)\n",
00508 ST_name(array_st)));
00509 return;
00510 }
00511
00512 FmtAssert (ST_class(array_st) == CLASS_VAR,
00513 ("Distributed array is not a variable"));
00514
00515 FmtAssert (TY_AR_ndims(array_ty) > 0, ("Array with zero dimensions?\n"));
00516
00517 if (ST_is_initialized(array_st)) {
00518
00519 DevWarn ("Cannot reshaped initialized data (%s) for now, ignoring",
00520 ST_name(array_st));
00521 return;
00522 }
00523
00524 WN *prev_wn = NULL;
00525
00526 switch (ST_Var_Kind(array_st)) {
00527 case var_global:
00528 case var_common:
00529 Process_Global_Distribute (dact);
00530 break;
00531 case var_formal:
00532 prev_wn = pwn;
00533 if (altentry_stack) prev_wn = Process_Alt_Entries_Formal (dact, prev_wn);
00534 else {
00535 prev_wn = Gen_Lookup_DART (dact, prev_wn, distr_st_entries[HT_Top]);
00536 if (Run_Dsm_Check) {
00537 prev_wn = Gen_EC_Reshaped_Array(dact, prev_wn);
00538 }
00539 prev_wn = Gen_Symbols_In_DINFO (dact, prev_wn);
00540 Reshape_ST_Entry (dinfo);
00541 }
00542 break;
00543 case var_local:
00544 prev_wn = pwn;
00545 if (altentry_stack) prev_wn = Process_Alt_Entries_Local (dact, prev_wn);
00546 else {
00547 prev_wn = Gen_Alloc_DART (dact, prev_wn);
00548 prev_wn = Gen_Init_DART (dact, prev_wn);
00549 prev_wn = Gen_Symbols_In_DINFO (dact, prev_wn);
00550 Reshape_ST_Entry (dinfo);
00551 prev_wn = Gen_Alloc_Reshape(dact, TRUE, prev_wn);
00552 prev_wn = Gen_HT_DART(dinfo, TRUE, FALSE, prev_wn);
00553 }
00554 break;
00555 default:
00556 FmtAssert (FALSE, ("Weird variable kind %s\n", ST_name(array_st)));
00557 break;
00558 }
00559 return;
00560 }
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579 static void Lower_Pragma_Redistribute (DISTR_ARRAY* dact) {
00580
00581
00582
00583
00584
00585
00586 DISTR_INFO *dinfo = dact->Dinfo();
00587
00588 ST* array_st = dinfo->Array_ST();
00589 TY_IDX array_ty = Get_Array_Type(array_st);
00590 WN* pwn = dact->Last_Pragma_WN ();
00591
00592 if (TY_kind(array_ty) != KIND_ARRAY) {
00593 printf ("Pragma Distribute on a non-array\n");
00594 return;
00595 }
00596
00597 WN *prev_wn = pwn;
00598
00599
00600
00601 prev_wn = Gen_Alloc_DART (dact, prev_wn);
00602 prev_wn = Gen_Init_DART (dact, prev_wn);
00603 prev_wn = Gen_Symbols_In_DINFO (dact, prev_wn);
00604 if ((ST_Var_Kind(array_st) == var_local) &&
00605 TY_kind(array_ty) == KIND_POINTER) {
00606
00607
00608 dinfo->Find_Alloca ();
00609 }
00610
00611 prev_wn = Gen_Migrate_Array (dinfo, FALSE, prev_wn);
00612 prev_wn = Gen_HT_DART(dinfo, FALSE, TRUE, prev_wn);
00613 return;
00614 }
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625 static void Hack_AltEntry_Rewrite_Formals (WN* rhs) {
00626 if (rhs == NULL) return;
00627 if (WN_operator(rhs) == OPR_LDID) {
00628 ST* st = WN_st(rhs);
00629 #ifdef _NEW_SYMTAB
00630 if (ST_sclass(st) == SCLASS_AUTO && ST_is_temp_var(st)) {
00631 #else
00632 if (ST_sclass(st) == SCLASS_AUTO && ST_temp(st)) {
00633 #endif
00634
00635
00636 ST* fst;
00637 #ifdef _NEW_SYMTAB
00638 INT i;
00639 FOREACH_SYMBOL (CURRENT_SYMTAB,fst,i) {
00640 #else
00641 FOR_ALL_SYMBOLS(Current_Symtab, fst) {
00642 #endif
00643 if (ST_class(fst) == CLASS_VAR &&
00644 ST_type(fst) == ST_type(st) &&
00645 strcmp(ST_name(fst), ST_name(st)) == 0 &&
00646 ST_sclass(fst) == SCLASS_FORMAL_REF) {
00647 WN_st_idx(rhs) = ST_st_idx(fst);
00648 break;
00649 }
00650 }
00651 }
00652 return;
00653 }
00654
00655 for (INT i=0; i<WN_kid_count(rhs); i++) {
00656 Hack_AltEntry_Rewrite_Formals (WN_kid(rhs, i));
00657 }
00658 }
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669 static WN* Gen_CheckNo_DART (DISTR_ARRAY* dact, WN* prev_wn) {
00670 DISTR_INFO* dinfo = dact->Dinfo();
00671 Is_True (!dinfo->IsReshaped(),
00672 ("Gen_CheckNo_DART should not be called on reshaped arrays\n"));
00673
00674 WN* dart_ldid = dinfo->DART_Ldid();
00675 WN* if_wn = WN_CreateIf(dart_ldid, WN_CreateBlock(), WN_CreateBlock());
00676 LWN_Copy_Linenumber (prev_wn, if_wn);
00677 LWN_Parentize(if_wn);
00678
00679
00680 WN* gross_wn = WN_CreatePragma(WN_PRAGMA_LOCAL, dinfo->Array_ST(), 0, 0);
00681 LWN_Insert_Block_After (WN_else(if_wn), NULL, gross_wn);
00682 WN* else_wn = Gen_Alloc_DART (dact, gross_wn);
00683 else_wn = Gen_Init_DART (dact, else_wn);
00684
00685
00686 LWN_Delete_Tree_From_Block (gross_wn);
00687 LWN_Insert_Block_After (NULL, prev_wn, if_wn);
00688 prev_wn = if_wn;
00689
00690
00691 IF_INFO *ii=CXX_NEW (IF_INFO(&LNO_default_pool,TRUE,
00692 Find_SCF_Inside(if_wn,OPC_REGION)!=NULL),
00693 &LNO_default_pool);
00694 WN_MAP_Set(LNO_Info_Map,if_wn,(void *)ii);
00695 DOLOOP_STACK* stack = CXX_NEW(DOLOOP_STACK(&LNO_local_pool),
00696 &LNO_local_pool);
00697 Build_Doloop_Stack(if_wn, stack);
00698 LNO_Build_If_Access(if_wn, stack);
00699 CXX_DELETE(stack, &LNO_local_pool);
00700 return prev_wn;
00701 }
00702
00703
00704
00705
00706
00707
00708
00709
00710 static void Hack_AltEntry_Formals (WN* start_wn, WN* end_wn) {
00711 WN* wn = start_wn;
00712 while (wn != end_wn) {
00713
00714
00715 if (WN_operator(wn) == OPR_CALL) break;
00716
00717 Is_True (WN_operator(wn) == OPR_ISTORE,
00718 ("Hack_AltEntry_Formals: expected an ISTORE\n"));
00719 WN* rhs = WN_kid0(wn);
00720 Hack_AltEntry_Rewrite_Formals(rhs);
00721
00722 wn = WN_next(wn);
00723 }
00724 }
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745 static WN* Process_Alt_Entries_Local (DISTR_ARRAY* dact, WN* prev_wn) {
00746
00747 DISTR_INFO* dinfo = dact->Dinfo();
00748 ST* array_st = dinfo->Array_ST();
00749 TY_IDX array_ty = Get_Original_Type(array_st);
00750 Is_True (altentry_stack, ("Process_Alt_Entries: no alt entries\n"));
00751 Is_True (ST_Var_Kind(array_st) == var_local,
00752 ("Process_Alt_Entries_Local: ST %s is not local\n",
00753 ST_name(array_st)));
00754
00755
00756 prev_wn = Gen_Alloc_DART (dact, prev_wn);
00757 prev_wn = Gen_Init_DART (dact, prev_wn);
00758 prev_wn = Gen_Symbols_In_DINFO (dact, prev_wn);
00759 if (dinfo->IsReshaped()) {
00760 Reshape_ST_Entry (dinfo);
00761 prev_wn = Gen_Alloc_Reshape(dact, TRUE, prev_wn);
00762 }
00763 else {
00764 if (TY_kind(array_ty) == KIND_POINTER) {
00765
00766
00767 dinfo->Find_Alloca ();
00768 }
00769 prev_wn = Gen_Migrate_Array (dinfo, TRUE, prev_wn);
00770 }
00771 prev_wn = Gen_HT_DART(dinfo, TRUE, FALSE, prev_wn);
00772
00773
00774 WN* wn;
00775 for (INT i=0; i<altentry_stack->Elements(); i++) {
00776 wn = altentry_stack->Bottom_nth(i);
00777 while (wn) {
00778 if (WN_opcode(wn) == OPC_PRAGMA &&
00779 WN_pragma(wn) == WN_PRAGMA_PREAMBLE_END)
00780 break;
00781 wn = WN_next(wn);
00782 }
00783 Is_True (wn, ("Alt_Entry: Could not find PREAMBLE_END\n"));
00784
00785
00786 wn = Gen_Alloc_DART (dact, wn);
00787 WN* save_wn = wn;
00788 wn = Gen_Init_DART (dact, wn);
00789 Hack_AltEntry_Formals (WN_next(save_wn), wn);
00790 wn = Gen_Symbols_In_DINFO (dact, wn);
00791 if (dinfo->IsReshaped()) {
00792 wn = Gen_Alloc_Reshape(dact, FALSE, wn);
00793 }
00794 else {
00795 wn = Gen_Migrate_Array (dinfo, FALSE, wn);
00796 }
00797 wn = Gen_HT_DART(dinfo, FALSE, FALSE, wn);
00798 }
00799 return prev_wn;
00800 }
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817 static WN* Process_Alt_Entries_Formal (DISTR_ARRAY* dact, WN* prev_wn) {
00818 DISTR_INFO* dinfo = dact->Dinfo();
00819 ST* array_st = dinfo->Array_ST();
00820 INT i;
00821 Is_True (altentry_stack, ("Process_Alt_Entries: no alt entries\n"));
00822 Is_True (ST_Var_Kind(array_st) == var_formal,
00823 ("Process_Alt_Entries_Formal: ST %s is not formal\n",
00824 ST_name(array_st)));
00825
00826
00827 for (i=0; i<WN_num_formals(Current_Func_Node); i++) {
00828 WN* formal_wn = WN_formal(Current_Func_Node, i);
00829 if (WN_st(formal_wn) == array_st) {
00830
00831 if (dinfo->IsReshaped()) {
00832 prev_wn = Gen_Lookup_DART (dact, prev_wn, distr_st_entries[HT_Top]);
00833 }
00834 else {
00835 prev_wn = Gen_Lookup_DART (dact, prev_wn, distr_st_entries[HT_Check]);
00836 prev_wn = Gen_CheckNo_DART (dact, prev_wn);
00837 }
00838 if (Run_Dsm_Check) {
00839 prev_wn = Gen_EC_Reshaped_Array(dact, prev_wn);
00840 }
00841 prev_wn = Gen_Symbols_In_DINFO (dact,prev_wn);
00842 break;
00843 }
00844 }
00845
00846
00847 for (i=0; i<altentry_stack->Elements(); i++) {
00848 WN* wn = altentry_stack->Bottom_nth(i);
00849 WN* formal_wn;
00850 for (INT i=0; i<WN_kid_count(wn); i++) {
00851 WN* formal_wn = WN_kid(wn, i);
00852 Is_True (WN_opcode(formal_wn) == OPC_IDNAME,
00853 ("Alt_Entries: Expected OPC_IDNAME\n"));
00854 if (WN_st(formal_wn) == array_st) {
00855
00856 while (wn) {
00857 if (WN_opcode(wn) == OPC_PRAGMA &&
00858 WN_pragma(wn) == WN_PRAGMA_PREAMBLE_END)
00859 break;
00860 wn = WN_next(wn);
00861 }
00862 Is_True (wn, ("Alt_Entry: Could not find PREAMBLE_END\n"));
00863
00864 if (dinfo->IsReshaped()) {
00865 wn = Gen_Lookup_DART (dact, wn, distr_st_entries[HT_Top]);
00866 }
00867 else {
00868 wn = Gen_Lookup_DART (dact, wn, distr_st_entries[HT_Check]);
00869 wn = Gen_CheckNo_DART (dact, wn);
00870 }
00871 if (Run_Dsm_Check) {
00872 wn = Gen_EC_Reshaped_Array(dact, wn);
00873 }
00874 wn = Gen_Symbols_In_DINFO (dact,wn);
00875 break;
00876 }
00877 }
00878 }
00879
00880
00881 if (dinfo->IsReshaped()) Reshape_ST_Entry (dinfo);
00882 return prev_wn;
00883 }
00884
00885
00886
00887
00888
00889
00890
00891
00892 extern void Rewrite_Reshaped_Commons (WN* wn) {
00893 WN *kid;
00894
00895 if (!wn) return;
00896
00897 if (WN_operator(wn) == OPR_LDID) {
00898
00899
00900
00901 ST* st = WN_st(wn);
00902 #ifdef _NEW_SYMTAB
00903 if (ST_base_idx(st) != ST_st_idx(st) &&
00904 #else
00905 if (ST_sclass(st) == SCLASS_BASED &&
00906 #endif
00907 ST_sclass(ST_base(st)) == SCLASS_COMMON) {
00908
00909 DISTR_INFO* dinfo = da_hash->Find(st);
00910 if (dinfo && dinfo->IsReshaped()) {
00911
00912 WN* ldid_wn = dinfo->Load_New_Distr_Array ();
00913 Replace_WN (wn, ldid_wn);
00914 }
00915 }
00916 return;
00917 }
00918
00919 if (WN_operator(wn) == OPR_LDA ||
00920 ((OPCODE_is_load(WN_opcode(wn)) || OPCODE_is_store(WN_opcode(wn))) &&
00921 WN_operator(wn) != OPR_ILOAD && WN_operator(wn) != OPR_ISTORE)) {
00922
00923 ST* st = WN_st(wn);
00924 #ifdef _NEW_SYMTAB
00925 if (ST_base_idx(st) != ST_st_idx(st) &&
00926 #else
00927 if (ST_sclass(st) == SCLASS_BASED &&
00928 #endif
00929 ST_sclass(ST_base(st)) == SCLASS_COMMON) {
00930
00931 DISTR_INFO* dinfo = da_hash->Find(st);
00932 if (dinfo && dinfo->IsReshaped()) {
00933
00934 ErrMsgSrcpos (EC_LNO_Generic2String, LWN_Get_Linenum(wn),
00935 "Bad reference to reshaped common array",
00936 ST_name(st));
00937 }
00938 }
00939 }
00940
00941 if (WN_opcode(wn) == OPC_BLOCK) {
00942 kid = WN_first(wn);
00943 while (kid) {
00944 Rewrite_Reshaped_Commons(kid);
00945 kid = WN_next(kid);
00946 }
00947 return;
00948 }
00949
00950 for (INT kidno = 0; kidno < WN_kid_count(wn); kidno++) {
00951 kid = WN_kid(wn, kidno);
00952 Rewrite_Reshaped_Commons(kid);
00953 }
00954 return;
00955 }
00956
00957
00958
00959
00960
00961
00962
00963 WN* LWN_Get_Next_Expr_Node (WN* wn) {
00964 if (wn) {
00965 do {
00966 wn = LWN_Get_Next_Tree_Node (wn);
00967 } while (wn && !OPCODE_is_expression(WN_opcode(wn)));
00968 }
00969 return wn;
00970 }
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981 BOOL Is_Child (WN* child, WN* parent) {
00982 if ((child == NULL) || (parent == NULL)) return FALSE;
00983 printf ("Is_Child: 0x%p, 0x%p\n", child, parent);
00984 if (child == parent) return TRUE;
00985 if (WN_opcode(parent) == OPC_BLOCK) {
00986 WN* kid_wn = WN_first(parent);
00987 while (kid_wn) {
00988 if (Is_Child (child, kid_wn)) return TRUE;
00989 kid_wn = WN_next(kid_wn);
00990 }
00991 return FALSE;
00992 }
00993 else {
00994 for (INT i=0; i<WN_kid_count(parent); i++)
00995 if (Is_Child (child, WN_kid(parent,i))) return TRUE;
00996 return FALSE;
00997 }
00998 }
00999
01000
01001
01002
01003
01004
01005
01006
01007 static void Expr_DU_Copy (WN* orig, WN* copy) {
01008
01009 FmtAssert (orig, ("Expr_DU_Copy: exit_wn (orig) is NULL"));
01010 orig = LWN_Get_Next_Expr_Node (orig);
01011 copy = LWN_Get_Next_Expr_Node (copy);
01012
01013
01014
01015 while (orig) {
01016 OPCODE fop = WN_opcode(orig);
01017 OPCODE top = WN_opcode(copy);
01018
01019 FmtAssert(fop == top && OPCODE_is_expression(fop),
01020 ("Opcodes unequal Expr_DU_Copy(%d,%d) or not expr", fop, top));
01021
01022 if (OPCODE_is_expression(WN_opcode(orig))) {
01023 DEF_LIST* deflist = Du_Mgr->Ud_Get_Def(orig);
01024 if (deflist) {
01025 DEF_LIST_ITER iter(deflist);
01026 for (DU_NODE* n = iter.First(); !iter.Is_Empty(); n = iter.Next()) {
01027 WN* def = n->Wn();
01028 Du_Mgr->Add_Def_Use(def, copy);
01029 }
01030 DEF_LIST* deflist2 = Du_Mgr->Ud_Get_Def(copy);
01031 if (deflist2) deflist2->Set_loop_stmt(deflist->Loop_stmt());
01032 if (deflist->Incomplete()) deflist2->Set_Incomplete();
01033 }
01034 }
01035 orig = LWN_Get_Next_Expr_Node (orig);
01036 copy = LWN_Get_Next_Expr_Node (copy);
01037 }
01038 }
01039
01040
01041
01042
01043
01044
01045 static void Insert_Exit_Code (STACK_OF_WN* exit_stack) {
01046 WN *pwn;
01047
01048 if (WN_first(exit_wn) != NULL) {
01049
01050 for (INT i=0; i < exit_stack->Elements(); i++) {
01051 pwn = exit_stack->Bottom_nth(i);
01052 FmtAssert (WN_operator(pwn) == OPR_RETURN
01053 #ifdef KEY
01054 || WN_operator(pwn) == OPR_GOTO_OUTER_BLOCK
01055 #endif
01056 ,
01057 ("Insert_Exit_Code found non-return node (got opcode=%d)\n",
01058 WN_opcode(pwn)));
01059
01060 WN* copy_wn = LWN_Copy_Tree(exit_wn);
01061
01062 Expr_DU_Copy (exit_wn, copy_wn);
01063
01064 {
01065 WN* tmp_wn = WN_first(copy_wn);
01066 while (tmp_wn) {
01067 WN_linenum(tmp_wn) = LWN_Get_Linenum(pwn);
01068 tmp_wn = WN_next(tmp_wn);
01069 }
01070 }
01071 LWN_Insert_Block_Before (NULL, pwn, copy_wn);
01072 }
01073 } else {
01074 FmtAssert (WN_last(exit_wn) == NULL, ("exit_wn block should be NULL"));
01075 }
01076
01077 LWN_Update_Def_Use_Delete_Tree (exit_wn, Du_Mgr);
01078 LWN_Delete_Tree (exit_wn);
01079 }
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093 static WN *Gen_Alloc_DART (DISTR_ARRAY* dact, WN* prev_wn, ST* st) {
01094
01095 DISTR_INFO* dinfo = dact->Dinfo();
01096 ST* dart_st = (st ? st : dinfo->Dart_ST());
01097 INT ndims = dinfo->Num_Dim();
01098
01099 OPCODE callop = OPCODE_make_op(OPR_CALL, Pointer_type, MTYPE_V);
01100 WN *call_wn = WN_Create(callop, 1);
01101 WN *dims_wn = LWN_Make_Icon (MTYPE_I8, ndims);
01102 WN_st_idx(call_wn) = ST_st_idx(distr_st_entries[Allocate_Dart]);
01103 Set_Runtime_Call_Side_Effects (call_wn);
01104 if (LNO_Use_Parm) {
01105 WN* parm_wn = WN_CreateParm (MTYPE_I8, dims_wn, Be_Type_Tbl(MTYPE_I8),
01106 WN_PARM_BY_VALUE);
01107 LWN_Set_Parent (dims_wn, parm_wn);
01108 dims_wn = parm_wn;
01109 }
01110 WN_kid0(call_wn) = dims_wn;
01111 LWN_Set_Parent(dims_wn, call_wn);
01112 LWN_Insert_Block_After (NULL, prev_wn, call_wn);
01113 WN_linenum(call_wn) = LWN_Get_Linenum(prev_wn);
01114 prev_wn = call_wn;
01115
01116
01117 PREG_NUM rreg1, rreg2;
01118 ST* rst = Find_Return_Registers (Pointer_type, &rreg1, &rreg2);
01119 FmtAssert(rreg1 != 0 && rreg2 == 0, ("Bad pointer type ret regs"));
01120
01121
01122
01123
01124 WN *ldid_wn = WN_CreateLdid (OPCODE_make_op(OPR_LDID,
01125 Pointer_type,
01126 Pointer_type),
01127 rreg1, rst, Be_Type_Tbl(Pointer_type));
01128 Create_alias (Alias_Mgr, ldid_wn);
01129 Du_Mgr->Add_Def_Use (call_wn, ldid_wn);
01130 WN *stid_wn = LWN_CreateStid (OPCODE_make_op(OPR_STID,
01131 MTYPE_V,
01132 Pointer_type),
01133 0,
01134 dart_st,
01135 distr_ty_entries[RT_ptr],
01136 ldid_wn);
01137 dinfo->DART_Stid (stid_wn, st);
01138 LWN_Insert_Block_After (NULL, prev_wn, stid_wn);
01139 WN_linenum(stid_wn) = LWN_Get_Linenum(prev_wn);
01140 prev_wn = stid_wn;
01141 return prev_wn;
01142 }
01143
01144
01145
01146
01147
01148
01149 static WN *Gen_Lookup_DART (DISTR_ARRAY* dact, WN* prev_wn, ST* func_st) {
01150
01151 DISTR_INFO *dinfo = dact->Dinfo();
01152 ST* dart_st = dinfo->Dart_ST();
01153
01154 Is_True (func_st == distr_st_entries[HT_Top] ||
01155 func_st == distr_st_entries[HT_Check],
01156 ("Gen_Lookup_DART must be called with HT_Top or HT_Check\n"));
01157
01158 OPCODE call_op = OPCODE_make_op (OPR_CALL, MTYPE_V, MTYPE_V);
01159
01160 WN *call_wn = WN_Create(call_op, 1);
01161 WN *array_load_wn = dinfo->Load_Distr_Array ();
01162
01163 if (LNO_Use_Parm) {
01164 WN* parm_wn = WN_CreateParm (Pointer_type, array_load_wn,
01165 Be_Type_Tbl(Pointer_type),
01166 WN_PARM_BY_VALUE);
01167 LWN_Set_Parent (array_load_wn, parm_wn);
01168 array_load_wn = parm_wn;
01169 }
01170 WN_kid(call_wn, 0) = array_load_wn;
01171 WN_st_idx(call_wn) = ST_st_idx(func_st);
01172 Set_Runtime_Call_Side_Effects (call_wn);
01173 LWN_Set_Parent(array_load_wn, call_wn);
01174 LWN_Insert_Block_After (NULL, prev_wn, call_wn);
01175 WN *wn;
01176 for (wn = call_wn; wn != NULL; wn = LWN_Get_Parent(wn))
01177 if (WN_opcode(wn) == OPC_DO_LOOP)
01178 break;
01179 if (wn != NULL)
01180 Array_Dependence_Graph->Add_Vertex(call_wn);
01181 WN_linenum(call_wn) = LWN_Get_Linenum(prev_wn);
01182 prev_wn = call_wn;
01183
01184
01185 PREG_NUM rreg1, rreg2;
01186 ST* rst = Find_Return_Registers (Pointer_type, &rreg1, &rreg2);
01187 FmtAssert(rreg1 != 0 && rreg2 == 0, ("Bad pointer type ret regs"));
01188
01189
01190
01191
01192 WN *ldid_wn = WN_CreateLdid (OPCODE_make_op(OPR_LDID,
01193 Pointer_type,
01194 Pointer_type),
01195 rreg1, rst, Be_Type_Tbl(Pointer_type));
01196 Create_alias (Alias_Mgr, ldid_wn);
01197 Du_Mgr->Add_Def_Use (call_wn, ldid_wn);
01198 WN *stid_wn = LWN_CreateStid (OPCODE_make_op(OPR_STID,
01199 MTYPE_V,
01200 Pointer_type),
01201 0,
01202 dart_st,
01203 distr_ty_entries[RT_ptr],
01204 ldid_wn);
01205 dinfo->DART_Stid(stid_wn);
01206 LWN_Insert_Block_After (NULL, prev_wn, stid_wn);
01207 WN_linenum(stid_wn) = LWN_Get_Linenum(prev_wn);
01208 prev_wn = stid_wn;
01209 return prev_wn;
01210 }
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220 static WN* Gen_EC_Reshaped_Array(DISTR_ARRAY *dact, WN* prev_wn)
01221 {
01222 DISTR_INFO* dinfo = dact->Dinfo();
01223
01224 WN *dart_ldid_wn = dinfo->DART_Ldid ();
01225 ST *ec_dart_st = Create_Local_ST (dinfo->Dart_ST());
01226
01227 prev_wn = Gen_Alloc_DART (dact, prev_wn, ec_dart_st);
01228 prev_wn = Gen_Init_DART (dact, prev_wn, ec_dart_st);
01229
01230 WN *ec_dart_ldid_wn = dinfo->DART_Ldid (ec_dart_st);
01231
01232 prev_wn = Gen_Compare_DARTS (dart_ldid_wn,
01233 ec_dart_ldid_wn,
01234 prev_wn,
01235 ST_name(dinfo->Array_ST()));
01236 prev_wn = Gen_Dealloc_DART (dact, prev_wn, ec_dart_st);
01237
01238 return prev_wn;
01239 }
01240
01241
01242
01243
01244
01245
01246
01247
01248 static WN*
01249 Gen_Compare_DARTS (WN* dart1_ldid,
01250 WN* dart2_ldid,
01251 WN* prev_wn,
01252 char* array_name)
01253 {
01254
01255 OPCODE call_op = OPCODE_make_op(OPR_CALL,MTYPE_V,MTYPE_V);
01256 WN *call_wn = WN_Create(call_op, 4);
01257 WN_st_idx(call_wn) = ST_st_idx(distr_st_entries[Compare_Darts]);
01258 Set_Runtime_Call_Side_Effects (call_wn);
01259
01260 TCON tcon;
01261 OPCODE lda_op = OPCODE_make_op (OPR_LDA, Pointer_type, MTYPE_V);
01262 TY_IDX string_ty = Make_Pointer_Type(Be_Type_Tbl(MTYPE_U1), TRUE);
01263
01264 char *func_name = DRA_Demangle_Func(ST_name(WN_st(Current_Func_Node)));
01265 if (func_name == NULL) func_name = ST_name(WN_st(Current_Func_Node));
01266 tcon = Host_To_Targ_String (MTYPE_STRING, func_name, strlen(func_name)+1);
01267 ST *rt_func_name = Gen_String_Sym (&tcon, Be_Type_Tbl(MTYPE_STRING), FALSE);
01268 WN *func_name_wn = WN_CreateLda(lda_op, 0, string_ty, rt_func_name);
01269
01270 tcon = Host_To_Targ_String (MTYPE_STRING, array_name, strlen(array_name)+1);
01271 ST *rt_array_name = Gen_String_Sym (&tcon, Be_Type_Tbl(MTYPE_STRING), FALSE);
01272 WN *array_name_wn = WN_CreateLda(lda_op, 0, string_ty, rt_array_name);
01273
01274 if (LNO_Use_Parm) {
01275 WN* parm_wn = WN_CreateParm (Pointer_type,
01276 dart1_ldid,
01277 Be_Type_Tbl(Pointer_type),
01278 WN_PARM_BY_REFERENCE);
01279 LWN_Set_Parent (dart1_ldid, parm_wn);
01280 dart1_ldid = parm_wn;
01281
01282 parm_wn = WN_CreateParm (Pointer_type,
01283 dart2_ldid,
01284 Be_Type_Tbl(Pointer_type),
01285 WN_PARM_BY_REFERENCE);
01286 LWN_Set_Parent (dart2_ldid, parm_wn);
01287 dart2_ldid = parm_wn;
01288
01289 parm_wn = WN_CreateParm (Pointer_type,
01290 func_name_wn,
01291 Be_Type_Tbl(Pointer_type),
01292 WN_PARM_BY_REFERENCE);
01293 LWN_Set_Parent (func_name_wn, parm_wn);
01294 func_name_wn = parm_wn;
01295
01296 parm_wn = WN_CreateParm (Pointer_type,
01297 array_name_wn,
01298 Be_Type_Tbl(Pointer_type),
01299 WN_PARM_BY_REFERENCE);
01300 LWN_Set_Parent (array_name_wn, parm_wn);
01301 array_name_wn = parm_wn;
01302 }
01303
01304 WN_kid0(call_wn) = dart1_ldid;
01305 WN_kid1(call_wn) = dart2_ldid;
01306 WN_kid2(call_wn) = func_name_wn;
01307 WN_kid3(call_wn) = array_name_wn;
01308 LWN_Set_Parent(dart1_ldid, call_wn);
01309 LWN_Set_Parent(dart2_ldid, call_wn);
01310 LWN_Set_Parent(func_name_wn, call_wn);
01311 LWN_Set_Parent(array_name_wn, call_wn);
01312 LWN_Insert_Block_After (NULL, prev_wn, call_wn);
01313 WN_linenum(call_wn) = LWN_Get_Linenum(prev_wn);
01314 prev_wn = call_wn;
01315 return prev_wn;
01316 }
01317
01318
01319
01320
01321
01322
01323
01324
01325 static WN* Gen_Dealloc_DART (DISTR_ARRAY* dact, WN* prev_wn, ST* st) {
01326
01327 DISTR_INFO* dinfo = dact->Dinfo();
01328
01329
01330 OPCODE call_op = OPCODE_make_op(OPR_CALL,MTYPE_V,MTYPE_V);
01331 WN *call_wn = WN_Create(call_op, 1);
01332 WN_st_idx(call_wn) = ST_st_idx(distr_st_entries[Deallocate_Dart]);
01333 Set_Runtime_Call_Side_Effects (call_wn);
01334 WN *dart_ldid_wn = dinfo->DART_Ldid (st);
01335 if (LNO_Use_Parm) {
01336 WN* parm_wn = WN_CreateParm (Pointer_type, dart_ldid_wn,
01337 Be_Type_Tbl(Pointer_type),
01338 WN_PARM_BY_REFERENCE);
01339 LWN_Set_Parent (dart_ldid_wn, parm_wn);
01340 dart_ldid_wn = parm_wn;
01341 }
01342 WN_kid0(call_wn) = dart_ldid_wn;
01343 LWN_Set_Parent(dart_ldid_wn, call_wn);
01344 LWN_Insert_Block_After (NULL, prev_wn, call_wn);
01345 WN_linenum(call_wn) = LWN_Get_Linenum(prev_wn);
01346 prev_wn = call_wn;
01347 return prev_wn;
01348 }
01349
01350
01351
01352
01353
01354
01355
01356
01357 static WN* Get_Array_Dimension_LB (TY_IDX array_ty, INT i) {
01358
01359 if (TY_AR_const_lbnd(array_ty, i))
01360 return LWN_Make_Icon (MTYPE_I8, TY_AR_lbnd_val(array_ty,i));
01361 #ifdef _NEW_SYMTAB
01362 else {
01363 ST_IDX st_idx = TY_AR_lbnd_var(array_ty,i);
01364 TYPE_ID type = TY_mtype(ST_type(st_idx));
01365
01366 return WN_CreateLdid(OPCODE_make_op(OPR_LDID,Promote_Type(type),type),
01367 0, ST_ptr(st_idx),type);
01368 }
01369 #else
01370 else return LWN_Copy_Tree (TY_AR_lbnd_tree(array_ty, i));
01371 #endif
01372 }
01373
01374
01375
01376
01377
01378
01379
01380 extern WN* Get_Array_Dimension_Size (TY_IDX array_ty, INT i) {
01381 WN *ret_wn;
01382 INT elem_size = TY_size(TY_AR_etype(array_ty));
01383
01384
01385
01386
01387
01388
01389
01390
01391 if (TY_AR_const_ubnd(array_ty, i) &&
01392 TY_AR_const_lbnd(array_ty, i) &&
01393 TY_AR_const_stride(array_ty, i)) {
01394
01395 ret_wn = LWN_Make_Icon (MTYPE_I8, (TY_AR_ubnd_val(array_ty,i) -
01396 TY_AR_lbnd_val(array_ty,i) + 1));
01397
01398 #if 0
01399 if (TY_AR_stride_val(array_ty, i) == elem_size) {
01400 ret_wn = LWN_Make_Icon (MTYPE_I8,(TY_AR_ubnd_val(array_ty,i) -
01401 TY_AR_lbnd_val(array_ty,i) + 1));
01402 }
01403 else {
01404 ret_wn = LWN_Make_Icon(MTYPE_I8, ((TY_AR_ubnd_val(array_ty,i) -
01405 TY_AR_lbnd_val(array_ty,i) + 1)/
01406 (TY_AR_stride_val(array_ty,i)/
01407 elem_size)));
01408 DevWarn ("Stride on distributed array is not 1");
01409 }
01410 #endif
01411 }
01412 else {
01413
01414 WN *ubnd_wn, *lbnd_wn, *stride_wn;
01415 if (TY_AR_const_ubnd(array_ty,i))
01416 ubnd_wn = LWN_Make_Icon(MTYPE_I8, TY_AR_ubnd_val(array_ty, i));
01417 #ifdef _NEW_SYMTAB
01418 else {
01419 ST_IDX st_idx = TY_AR_ubnd_var(array_ty,i);
01420 TYPE_ID type = TY_mtype(ST_type(st_idx));
01421
01422 ubnd_wn=WN_CreateLdid(OPCODE_make_op(OPR_LDID,Promote_Type(type),type),
01423 0, ST_ptr(st_idx),type);
01424 }
01425 #else
01426 else ubnd_wn = LWN_Copy_Tree (TY_AR_ubnd_tree(array_ty, i));
01427 #endif
01428
01429 if (TY_AR_const_lbnd(array_ty, i))
01430 if (TY_AR_lbnd_val(array_ty, i) == 1) lbnd_wn = NULL;
01431 else lbnd_wn = LWN_Make_Icon(MTYPE_I8,
01432 TY_AR_lbnd_val(array_ty,i));
01433 #ifdef _NEW_SYMTAB
01434 else {
01435 ST_IDX st_idx = TY_AR_lbnd_var(array_ty,i);
01436 TYPE_ID type = TY_mtype(ST_type(st_idx));
01437
01438 lbnd_wn = WN_CreateLdid(OPCODE_make_op(OPR_LDID,Promote_Type(type),type),
01439 0, ST_ptr(st_idx),type);
01440 }
01441 #else
01442 else lbnd_wn = LWN_Copy_Tree (TY_AR_lbnd_tree(array_ty, i));
01443 #endif
01444
01445 if (TY_AR_const_stride(array_ty, i))
01446 if (TY_AR_stride_val(array_ty, i) == elem_size)
01447 stride_wn = NULL;
01448 else {
01449 stride_wn =
01450 LWN_Make_Icon(MTYPE_I8, TY_AR_stride_val(array_ty,i));
01451 stride_wn = AWN_Div_Safe (MTYPE_I8,
01452 stride_wn,
01453 LWN_Make_Icon(MTYPE_I8,elem_size));
01454 DevWarn ("Stride on distributed array is not 1");
01455 }
01456 else {
01457 #ifdef _NEW_SYMTAB
01458 ST_IDX st_idx = TY_AR_stride_var(array_ty,i);
01459 TYPE_ID type = TY_mtype(ST_type(st_idx));
01460
01461 stride_wn=WN_CreateLdid(OPCODE_make_op(OPR_LDID,Promote_Type(type),type),
01462 0, ST_ptr(st_idx),type);
01463 #else
01464 stride_wn = LWN_Copy_Tree (TY_AR_stride_tree(array_ty, i));
01465 #endif
01466 stride_wn = AWN_Div_Safe (MTYPE_I8,
01467 stride_wn,
01468 LWN_Make_Icon(MTYPE_I8,elem_size));
01469 DevWarn ("Stride on distributed array is not constant, maybe not 1");
01470 }
01471
01472 if (lbnd_wn == NULL) ret_wn = ubnd_wn;
01473 else {
01474 ret_wn = AWN_Sub (MTYPE_I8, ubnd_wn, lbnd_wn);
01475 ret_wn = AWN_Add (MTYPE_I8, ret_wn, LWN_Make_Icon(MTYPE_I8, 1));
01476 }
01477 if (stride_wn != NULL) ret_wn = AWN_Div_Safe (MTYPE_I8, ret_wn, stride_wn);
01478 }
01479 return ret_wn;
01480 }
01481
01482
01483
01484
01485
01486
01487
01488
01489
01490
01491 static WN* Gen_Init_DART (DISTR_ARRAY* dact, WN* prev_wn, ST* st) {
01492
01493 INT i;
01494 DISTR_INFO* dinfo = dact->Dinfo();
01495 ST* array_st = dinfo->Array_ST();
01496 INT ndims = dinfo->Num_Dim();
01497
01498 TY_IDX array_ty = dinfo->Orig_TY();
01499 TY_IDX I8ptr_ty = Make_Pointer_Type(Be_Type_Tbl(MTYPE_I8));
01500 OPCODE const_op = OPCODE_make_op(OPR_INTCONST, MTYPE_I8, MTYPE_V);
01501 WN *dart_ldid_wn = dinfo->DART_Ldid (st);
01502
01503 WN *const_wn = WN_CreateIntconst(const_op, ndims);
01504 OPCODE istore_op = OPCODE_make_op(OPR_ISTORE, MTYPE_V, MTYPE_I8);
01505 WN* istore_wn = LWN_CreateIstore (istore_op, dart_offset_num_dim,
01506 I8ptr_ty,
01507 const_wn,
01508 dart_ldid_wn);
01509 dinfo->DART_Ptr_Ref (istore_wn, st);
01510 LWN_Insert_Block_After (NULL, prev_wn, istore_wn);
01511 WN_linenum(istore_wn) = LWN_Get_Linenum(prev_wn);
01512 prev_wn = istore_wn;
01513
01514
01515 const_wn = WN_CreateIntconst (const_op,
01516 TY_size(TY_AR_etype(array_ty)));
01517 dart_ldid_wn = dinfo->DART_Ldid (st);
01518 istore_wn = LWN_CreateIstore (istore_op, dart_offset_element_size,
01519 I8ptr_ty,
01520 const_wn, dart_ldid_wn);
01521 dinfo->DART_Ptr_Ref (istore_wn, st);
01522 LWN_Insert_Block_After (NULL, prev_wn, istore_wn);
01523 WN_linenum(istore_wn) = LWN_Get_Linenum(prev_wn);
01524 prev_wn = istore_wn;
01525
01526
01527 const_wn = WN_CreateIntconst (const_op,
01528 (dinfo->IsReshaped() ? 1 : 0));
01529 dart_ldid_wn = dinfo->DART_Ldid (st);
01530 istore_wn = LWN_CreateIstore (istore_op, dart_offset_flags,
01531 I8ptr_ty,
01532 const_wn, dart_ldid_wn);
01533 dinfo->DART_Ptr_Ref (istore_wn, st);
01534 LWN_Insert_Block_After (NULL, prev_wn, istore_wn);
01535 WN_linenum(istore_wn) = LWN_Get_Linenum(prev_wn);
01536 prev_wn = istore_wn;
01537
01538
01539 istore_op = OPCODE_make_op (OPR_ISTORE, MTYPE_V, MTYPE_I8);
01540 for (i=0; i<ndims; i++) {
01541 WN *n_wn, *p_wn;
01542
01543
01544 n_wn = LWN_Copy_Tree(dinfo->Get_Array_Dim_Size(i));
01545 dart_ldid_wn = dinfo->DART_Ldid (st);
01546 istore_wn = LWN_CreateIstore
01547 (istore_op,
01548 dart_offset_distr_n+i*TY_size(distr_ty_entries[RT_dim_struct]),
01549 I8ptr_ty,
01550 n_wn,
01551 dart_ldid_wn);
01552 dinfo->DART_Ptr_Ref (istore_wn, st);
01553 LWN_Insert_Block_After (NULL, prev_wn, istore_wn);
01554 WN_linenum(istore_wn) = LWN_Get_Linenum(prev_wn);
01555 prev_wn = istore_wn;
01556
01557
01558
01559
01560
01561 WN* k_wn;
01562 DISTR_DIM* dd = dact->Get_Dim(i);
01563 DISTRIBUTE_TYPE dt = dd->Distr_Type();
01564 switch (dt) {
01565 case DISTRIBUTE_STAR:
01566 k_wn = WN_CreateIntconst (const_op, -1);
01567 break;
01568 case DISTRIBUTE_BLOCK:
01569 k_wn = WN_CreateIntconst (const_op, 0);
01570 break;
01571 default:
01572 k_wn = dd->Chunksize();
01573 break;
01574 }
01575 dart_ldid_wn = dinfo->DART_Ldid(st);
01576 istore_wn = LWN_CreateIstore
01577 (istore_op,
01578 dart_offset_distr_k+i*TY_size(distr_ty_entries[RT_dim_struct]),
01579 I8ptr_ty,
01580 k_wn,
01581 dart_ldid_wn);
01582 dinfo->DART_Ptr_Ref (istore_wn, st);
01583 LWN_Insert_Block_After (NULL, prev_wn, istore_wn);
01584 WN_linenum(istore_wn) = LWN_Get_Linenum(prev_wn);
01585 prev_wn = istore_wn;
01586
01587
01588
01589
01590 WN *lb_wn = Get_Array_Dimension_LB (array_ty, i);
01591 dart_ldid_wn = dinfo->DART_Ldid (st);
01592 istore_wn = LWN_CreateIstore
01593 (istore_op,
01594 dart_offset_distr_lb+i*TY_size(distr_ty_entries[RT_dim_struct]),
01595 I8ptr_ty,
01596 lb_wn, dart_ldid_wn);
01597 dinfo->DART_Ptr_Ref (istore_wn, st);
01598 LWN_Insert_Block_After (NULL, prev_wn, istore_wn);
01599 WN_linenum(istore_wn) = LWN_Get_Linenum(prev_wn);
01600 prev_wn = istore_wn;
01601 }
01602
01603
01604
01605 OPCODE call_op = OPCODE_make_op(OPR_CALL,MTYPE_V,MTYPE_V);
01606 WN *call_wn = WN_Create(call_op, 2);
01607 WN_st_idx(call_wn) = ST_st_idx(distr_st_entries[Initialize_Dart]);
01608 Set_Runtime_Call_Side_Effects (call_wn);
01609 dart_ldid_wn = dinfo->DART_Ldid (st);
01610
01611 WN* onto_wn;
01612 if (dact->Has_Onto()) {
01613 char name[64];
01614 sprintf (name, "$onto_%s", ST_name(array_st));
01615 ST* onto_st = Create_Local_Array_ST(name, Be_Type_Tbl(MTYPE_I8), ndims);
01616
01617 for (i=0; i<ndims; i++) {
01618 istore_wn = Create_Array_Store (onto_st, MTYPE_I8, i, 8, ndims,
01619 LWN_Make_Icon(MTYPE_I8, dact->Onto(i)));
01620 LWN_Insert_Block_After (NULL, prev_wn, istore_wn);
01621 LWN_Copy_Linenumber (prev_wn, istore_wn);
01622 prev_wn = istore_wn;
01623 }
01624 OPCODE op_lda = OPCODE_make_op(OPR_LDA, Pointer_type, MTYPE_V);
01625 onto_wn = WN_CreateLda(op_lda, 0,
01626 Make_Pointer_Type(ST_type(onto_st)),
01627 onto_st);
01628 Add_Pragma_To_MP_Region (prev_wn, onto_st, 0, WN_PRAGMA_LOCAL);
01629 }
01630 else {
01631
01632 onto_wn = LWN_Make_Icon (Pointer_type, 0);
01633 }
01634
01635
01636 WN* parm_wn = WN_CreateParm (Pointer_type, dart_ldid_wn,
01637 Be_Type_Tbl(Pointer_type),
01638 WN_PARM_BY_REFERENCE);
01639 LWN_Set_Parent (dart_ldid_wn, parm_wn);
01640 WN_kid(call_wn, 0) = parm_wn;
01641 LWN_Set_Parent(parm_wn, call_wn);
01642
01643 parm_wn = WN_CreateParm (Pointer_type, onto_wn,
01644 Be_Type_Tbl(Pointer_type),
01645 WN_PARM_BY_REFERENCE);
01646 LWN_Set_Parent (onto_wn, parm_wn);
01647 WN_kid(call_wn, 1) = parm_wn;
01648 LWN_Set_Parent(parm_wn, call_wn);
01649
01650 LWN_Insert_Block_After (NULL, prev_wn, call_wn);
01651 WN_linenum(call_wn) = LWN_Get_Linenum(prev_wn);
01652 prev_wn = call_wn;
01653 return prev_wn;
01654 }
01655
01656
01657
01658
01659
01660
01661
01662
01663
01664
01665 static WN* Gen_Symbols_In_DINFO (DISTR_ARRAY* dact, WN* prev_wn) {
01666
01667 DISTR_INFO* dinfo = dact->Dinfo();
01668 ST* array_st = dinfo->Array_ST();
01669 INT ndims = dinfo->Num_Dim();
01670
01671 INT i;
01672
01673 OPCODE iload_op = OPCODE_make_op(OPR_ILOAD, MTYPE_I8, MTYPE_I8);
01674 OPCODE stid_op = OPCODE_make_op(OPR_STID, MTYPE_V, MTYPE_I8);
01675
01676
01677
01678 for (i=0; i<ndims; i++) {
01679
01680
01681 WN* stid_wn;
01682 SYMBOL *numprocs = dinfo->Get_Numprocs(i);
01683
01684
01685 FmtAssert (numprocs, ("Could not find numprocs variable for array (%s)\n",
01686 ST_name(array_st)));
01687 WN* dart_ldid_wn = dinfo->DART_Ldid();
01688 WN* dart_p_wn = LWN_CreateIload
01689 (iload_op,
01690 dart_offset_distr_p+i*TY_size(distr_ty_entries[RT_dim_struct]),
01691 Be_Type_Tbl(MTYPE_I8),
01692 Make_Pointer_Type(Be_Type_Tbl(MTYPE_I8)),
01693 dart_ldid_wn);
01694 dinfo->DART_Ptr_Ref (dart_p_wn);
01695 stid_wn = LWN_CreateStid (stid_op,
01696 numprocs->WN_Offset(), numprocs->St(),
01697 Be_Type_Tbl(MTYPE_I8),
01698 dart_p_wn);
01699 LWN_Check_Parentize (stid_wn);
01700 LWN_Insert_Block_After (NULL, prev_wn, stid_wn);
01701 WN_linenum(stid_wn) = LWN_Get_Linenum(prev_wn);
01702 prev_wn = stid_wn;
01703 dinfo->Numprocs_Stid (i, stid_wn);
01704
01705
01706
01707 DISTR_DIM* dd = dact->Get_Dim(i);
01708 DISTRIBUTE_TYPE dt = dd->Distr_Type();
01709 if (dt == DISTRIBUTE_STAR) {
01710 continue;
01711 }
01712
01713
01714 SYMBOL *dimsize = dinfo->Get_Dimsize(i);
01715 FmtAssert (dimsize, ("Could not find dimsize variable for array (%s)\n",
01716 ST_name(array_st)));
01717 WN *n_wn, *p_wn;
01718
01719 n_wn = dinfo->Get_Array_Dim_Size(i);
01720 p_wn = dinfo->Numprocs(i);
01721
01722 if ((dt == DISTRIBUTE_BLOCK) ||
01723 ((dt == DISTRIBUTE_CYCLIC_CONST) &&
01724 (dd->Chunk_Const_Val() == 1))) {
01725
01726
01727 WN *divceil_wn;
01728 if (dinfo->Small_Index())
01729 divceil_wn = Create_Positive_Divceil (MTYPE_I4, n_wn, p_wn, TRUE);
01730 else divceil_wn = Create_Positive_Divceil (MTYPE_I8, n_wn, p_wn, TRUE);
01731 stid_wn = AWN_StidIntoSym (dimsize, divceil_wn);
01732 }
01733 else {
01734
01735
01736 WN *k_wn, *nk_wn, *divceil_wn;
01737 k_wn = dd->Chunksize ();
01738 if (dinfo->Small_Index()) {
01739 nk_wn = Create_Positive_Divceil (MTYPE_I4, n_wn, k_wn, TRUE);
01740 divceil_wn = Create_Positive_Divceil (MTYPE_I4, nk_wn, p_wn, TRUE);
01741 }
01742 else {
01743 nk_wn = Create_Positive_Divceil (MTYPE_I8, n_wn, k_wn, TRUE);
01744 divceil_wn = Create_Positive_Divceil (MTYPE_I8, nk_wn, p_wn, TRUE);
01745 }
01746 stid_wn = AWN_StidIntoSym (dimsize, divceil_wn);
01747 }
01748 LWN_Insert_Block_After (NULL, prev_wn, stid_wn);
01749 WN_linenum(stid_wn) = LWN_Get_Linenum(prev_wn);
01750 prev_wn = stid_wn;
01751 dinfo->Dimsize_Stid(i, stid_wn);
01752 }
01753 return prev_wn;
01754 }
01755
01756
01757
01758
01759
01760
01761
01762
01763
01764 static WN* Gen_Call_Array_Dart_Args(DISTR_INFO* dinfo, ST *func_st) {
01765
01766 OPCODE call_op = OPCODE_make_op (OPR_CALL, MTYPE_V, MTYPE_V);
01767
01768 WN *call_wn = WN_Create(call_op, 2);
01769 WN *array_load_wn = dinfo->Load_Distr_Array();
01770
01771 WN* dart_ldid_wn = dinfo->DART_Ldid();
01772
01773
01774
01775
01776
01777 if (LNO_Use_Parm) {
01778 WN* parm_wn = WN_CreateParm (Pointer_type, array_load_wn,
01779 Be_Type_Tbl(Pointer_type),
01780 WN_PARM_BY_VALUE);
01781 LWN_Set_Parent (array_load_wn, parm_wn);
01782 array_load_wn = parm_wn;
01783
01784 if ((func_st == distr_st_entries[Migrate_Array]) ||
01785 (func_st == distr_st_entries[Unmigrate_Array])) {
01786
01787 parm_wn = WN_CreateParm (Pointer_type, dart_ldid_wn,
01788 Be_Type_Tbl(Pointer_type),
01789 WN_PARM_BY_REFERENCE);
01790 } else {
01791 parm_wn = WN_CreateParm (Pointer_type, dart_ldid_wn,
01792 Be_Type_Tbl(Pointer_type),
01793 WN_PARM_BY_VALUE);
01794 }
01795 LWN_Set_Parent (dart_ldid_wn, parm_wn);
01796 dart_ldid_wn = parm_wn;
01797 }
01798
01799 WN_kid(call_wn, 0) = array_load_wn;
01800 WN_kid(call_wn, 1) = dart_ldid_wn;
01801 WN_st_idx(call_wn) = ST_st_idx(func_st);
01802
01803 LWN_Set_Parent(array_load_wn, call_wn);
01804 LWN_Set_Parent(dart_ldid_wn, call_wn);
01805
01806 return call_wn;
01807 }
01808
01809
01810
01811
01812
01813
01814
01815 static WN* Gen_Call_Array_Arg(DISTR_INFO* dinfo, ST *func_st) {
01816 OPCODE call_op = OPCODE_make_op (OPR_CALL, MTYPE_V, MTYPE_V);
01817
01818 WN *call_wn = WN_Create(call_op, 1);
01819 WN *array_load_wn = dinfo->Load_Distr_Array ();
01820
01821 if (LNO_Use_Parm) {
01822 WN* parm_wn = WN_CreateParm (Pointer_type, array_load_wn,
01823 Be_Type_Tbl(Pointer_type),
01824 WN_PARM_BY_VALUE);
01825 LWN_Set_Parent (array_load_wn, parm_wn);
01826 array_load_wn = parm_wn;
01827 }
01828 WN_kid(call_wn, 0) = array_load_wn;
01829 WN_st_idx(call_wn) = ST_st_idx(func_st);
01830 LWN_Set_Parent(array_load_wn, call_wn);
01831
01832 return call_wn;
01833 }
01834
01835
01836
01837
01838
01839
01840
01841
01842
01843
01844
01845 static WN* Gen_HT_DART (DISTR_INFO* dinfo, BOOL do_exit, BOOL is_redistr,
01846 WN* prev_wn) {
01847 ST* array_st = dinfo->Array_ST();
01848 WN *call_wn;
01849
01850 if (is_redistr) {
01851 call_wn = Gen_Call_Array_Dart_Args(dinfo, distr_st_entries[HT_Replace]);
01852 } else {
01853 call_wn = Gen_Call_Array_Dart_Args(dinfo, distr_st_entries[HT_Push]);
01854 }
01855 Set_Runtime_Call_Side_Effects (call_wn);
01856
01857 LWN_Insert_Block_After (NULL, prev_wn, call_wn);
01858 WN_linenum(call_wn) = LWN_Get_Linenum(prev_wn);
01859 prev_wn = call_wn;
01860
01861
01862
01863
01864
01865 if (!do_exit) return prev_wn;
01866
01867
01868 call_wn = Gen_Call_Array_Arg(dinfo, distr_st_entries[HT_Pop]);
01869 Set_Runtime_Call_Side_Effects (call_wn);
01870 LWN_Insert_Block_Before (exit_wn, NULL, call_wn);
01871
01872 return prev_wn;
01873 }
01874
01875
01876
01877
01878
01879
01880
01881 static WN* Gen_Migrate_Array (DISTR_INFO* dinfo, BOOL do_exit, WN *prev_wn)
01882 {
01883 WN *call_wn=Gen_Call_Array_Dart_Args(dinfo,distr_st_entries[Migrate_Array]);
01884 Set_Runtime_Call_Side_Effects (call_wn);
01885 LWN_Insert_Block_After (NULL, prev_wn, call_wn);
01886 WN_linenum(call_wn) = LWN_Get_Linenum(prev_wn);
01887
01888
01889
01890
01891 if (!do_exit) return call_wn;
01892
01893
01894 WN* unmigr_wn =
01895 Gen_Call_Array_Dart_Args (dinfo, distr_st_entries[Unmigrate_Array]);
01896 Set_Runtime_Call_Side_Effects (unmigr_wn);
01897 LWN_Insert_Block_Before (exit_wn, NULL, unmigr_wn);
01898 return call_wn;
01899 }
01900
01901
01902
01903
01904
01905
01906
01907
01908 static TY_IDX Section_Variable_TY (INT ndim, INT32 name_length) {
01909 static TY_IDX* da_ty = NULL;
01910
01911
01912 static INT idx = 0;
01913
01914 INT sz = (2*Pointer_Size +
01915 4*4 +
01916 ndim * (dart_distr_size*8 +
01917 8 +
01918 2*Pointer_Size) +
01919 name_length);
01920
01921 if (da_ty == NULL) {
01922
01923
01924
01925 idx = sz+10;
01926 da_ty = CXX_NEW_ARRAY (TY_IDX, idx, Malloc_Mem_Pool);
01927 for (INT i=0; i<idx; i++) da_ty[i] = (TY_IDX) NULL;
01928 }
01929
01930 if (sz >= idx) {
01931
01932 INT new_size = sz+10;
01933 da_ty = (TY_IDX*) MEM_POOL_Realloc (Malloc_Mem_Pool, da_ty, idx*sizeof(TY_IDX),
01934 new_size*sizeof(TY_IDX));
01935 for (INT i=idx; i<new_size; i++) da_ty[i] = (TY_IDX) NULL;
01936 idx = new_size;
01937 }
01938
01939 if (da_ty[sz] == (TY_IDX) NULL) {
01940
01941 char ty_name[64];
01942 sprintf (ty_name, "distr_array_data_ty_%d", sz);
01943
01944 #ifdef _NEW_SYMTAB
01945 TY& new_ty = New_TY (da_ty[sz]);
01946 TY_Init (new_ty,
01947 sz,
01948 KIND_ARRAY,
01949 MTYPE_UNKNOWN,
01950 Save_Str(ty_name));
01951
01952 ARB_HANDLE arb = New_ARB();
01953 ARB_Init(arb,0,sz,1);
01954 Set_ARB_first_dimen (arb);
01955 Set_ARB_last_dimen (arb);
01956
01957 Set_TY_align(da_ty[sz],8);
01958 Set_TY_arb(new_ty,arb);
01959 Set_TY_etype(new_ty,Be_Type_Tbl(MTYPE_I1));
01960
01961 #else
01962 da_ty[sz] = New_TY (TRUE);
01963 TY_kind(da_ty[sz]) = KIND_ARRAY;
01964
01965 ARI* ari = New_ARI (1, TRUE);
01966 ARI_etype (ari) = Be_Type_Tbl(MTYPE_I1);
01967 ARI_const_zofst(ari) = TRUE;
01968 ARI_zofst_val(ari) = 0;
01969
01970 ARB_const_lbnd(ARI_bnd(ari,0)) = TRUE;
01971 ARB_lbnd_val(ARI_bnd(ari,0)) = 0;
01972 ARB_const_ubnd(ARI_bnd(ari,0)) = TRUE;
01973 ARB_ubnd_val(ARI_bnd(ari,0)) = sz;
01974 ARB_const_stride(ARI_bnd(ari,0)) = TRUE;
01975 ARB_stride_val(ARI_bnd(ari,0)) = 1;
01976
01977 TY_size(da_ty[sz]) = sz;
01978 TY_align(da_ty[sz]) = 8;
01979 TY_name(da_ty[sz]) = Save_Str (ty_name);
01980 TY_arinfo(da_ty[sz]) = ari;
01981 #endif
01982 Enter_TY (da_ty[sz]);
01983 }
01984 return da_ty[sz];
01985 }
01986
01987
01988
01989
01990
01991
01992
01993
01994 extern ST* Section_Variable_ST (char* name, TY_IDX daty, BOOL is_global) {
01995 ST* st;
01996 st = New_ST(is_global ? GLOBAL_SYMTAB : CURRENT_SYMTAB);
01997 ST_Init (st,
01998 Save_Str(name),
01999 CLASS_VAR,
02000 SCLASS_DISTR_ARRAY,
02001 EXPORT_LOCAL,
02002 daty);
02003 return st;
02004 }
02005
02006
02007
02008
02009
02010
02011
02012
02013
02014
02015 static void Process_Global_Distribute (DISTR_ARRAY* dact) {
02016
02017
02018
02019
02020
02021
02022
02023
02024
02025
02026
02027
02028
02029
02030
02031
02032
02033
02034
02035
02036
02037 DISTR_INFO *dinfo = dact->Dinfo();
02038
02039 ST* array_st = dinfo->Array_ST();
02040 TY_IDX array_ty = Get_Array_Type(array_st);
02041 INT ndims = TY_AR_ndims(array_ty);
02042 extern INT32 da_count;
02043 da_count++;
02044 ST* dast;
02045 {
02046
02047 TY_IDX daty = Section_Variable_TY (ndims, strlen(ST_name(array_st))+1);
02048 char name[64];
02049 sprintf (name, "_%s_da_spec", ((strlen(ST_name(array_st)) < 50) ?
02050 ST_name(array_st) : "LongName"));
02051 dast = Section_Variable_ST (name, daty, TRUE);
02052
02053
02054 }
02055
02056 INITO_IDX ino = New_INITO (dast);
02057 Set_ST_is_initialized(dast);
02058 INITV_IDX inv = (INITV_IDX) NULL;
02059 if (dinfo->IsReshaped() && (ST_Var_Kind(array_st) == var_common)) {
02060 SYMBOL* array_common = dinfo->Array_Common_Symbol();
02061 inv = Irb_Init_Symoff (ino, inv, 1, array_common->St(),
02062 array_common->WN_Offset());
02063 }
02064 else inv = Irb_Init_Symoff (ino, inv, 1, array_st, 0);
02065 ST* dart_st = dinfo->Dart_ST();
02066 inv = Irb_Init_Symoff (ino, inv, 1, dart_st, 0);
02067 inv = Irb_Init_Integer (4, (dinfo->IsReshaped() ? 1 : 0),
02068 1, ino, inv);
02069 inv = Irb_Init_Integer (4, TY_size(TY_AR_etype(Get_Array_Type(array_st))),
02070 1, ino, inv);
02071
02072 inv = Irb_Init_Integer (4, ndims, 1, ino, inv);
02073 if (dact->Is_Compiler_Generated()) {
02074 inv = Irb_Init_Integer (4, 1, 1, ino, inv);
02075 }
02076 else {
02077 inv = Irb_Init_Integer (4, 0, 1, ino, inv);
02078 }
02079 for (INT i=0; i<ndims; i++) {
02080 FmtAssert (TY_AR_const_lbnd(array_ty, i) &&
02081 TY_AR_const_ubnd(array_ty, i) &&
02082 TY_AR_const_stride(array_ty, i),
02083 ("Global array (%s) must have constant %s\n",
02084 ST_name(array_st),
02085 (!TY_AR_const_lbnd(array_ty,i) ? "lbnd" :
02086 (!TY_AR_const_ubnd(array_ty,i) ? "ubnd" :
02087 "stride"))));
02088 #ifdef Is_True_On
02089 {
02090 INT stride = TY_size(TY_AR_etype(array_ty));
02091 for (INT j=i+1; j<ndims; j++)
02092 stride = (stride * (TY_AR_ubnd_val(array_ty, j) -
02093 TY_AR_lbnd_val(array_ty, j) + 1));
02094 if (TY_AR_stride_val(array_ty, i) != stride)
02095 DevWarn ("Global array (%s): stride (%lld) != expected stride (%d)\n",
02096 ST_name(array_st),
02097 TY_AR_stride_val(array_ty, i), stride);
02098 }
02099 #endif
02100 inv = Irb_Init_Integer (8, (TY_AR_ubnd_val(array_ty, i)-
02101 TY_AR_lbnd_val(array_ty, i)+1),
02102 1, ino, inv);
02103
02104
02105 DISTR_DIM* dd = dact->Get_Dim(i);
02106 DISTRIBUTE_TYPE dt = dd->Distr_Type();
02107 INT32 p_val = 0, k_val = 0;
02108 switch (dt) {
02109 case DISTRIBUTE_STAR:
02110 k_val = -1;
02111 break;
02112 case DISTRIBUTE_BLOCK:
02113 k_val = 0;
02114 break;
02115 case DISTRIBUTE_CYCLIC_CONST:
02116 k_val = dd->Chunk_Const_Val();
02117 break;
02118 case DISTRIBUTE_CYCLIC_EXPR:
02119 FmtAssert (FALSE,("Variable chunk-size disallowed for global arrays"));
02120 default:
02121 FmtAssert (FALSE, ("Unknown distribution type"));
02122 }
02123 inv = Irb_Init_Integer (8, p_val, 1, ino, inv);
02124
02125
02126 inv = Irb_Init_Integer (8, k_val, 1, ino, inv);
02127
02128
02129 inv = Irb_Init_Integer(8, TY_AR_lbnd_val(array_ty,i), 1, ino, inv);
02130
02131
02132 inv = Irb_Init_Integer(8, (dact->Has_Onto()?dact->Onto(i):0), 1, ino, inv);
02133
02134
02135
02136 ST * numprocs_st = dinfo->Get_Numprocs(i)->St();
02137 ST* dimsize_st = dinfo->Get_Dimsize(i)->St();
02138 inv = Irb_Init_Symoff (ino, inv, 1, numprocs_st, 0);
02139 inv = Irb_Init_Symoff (ino, inv, 1, dimsize_st, 0);
02140 }
02141 inv = Irb_Init_String (strlen(ST_name(array_st))+1,
02142 ST_name(array_st),
02143 1, ino, inv);
02144 if (dinfo->IsReshaped()) {
02145 Reshape_ST_Entry (dinfo);
02146 #ifdef _NEW_SYMTAB
02147 if (ST_level(array_st) == GLOBAL_SYMTAB) {
02148 #else
02149 if (ST_is_global(array_st)) {
02150 #endif
02151
02152
02153
02154 FmtAssert (ST_is_reshaped(array_st),
02155 ("ST (%s) is reshaped, but symbol table doesn't think so",
02156 ST_name(array_st)));
02157 if (Has_Base_Block(array_st)) Allocate_Object(ST_base(array_st));
02158 else Allocate_Object (array_st);
02159 }
02160 }
02161
02162
02163
02164
02165
02166
02167
02168
02169
02170
02171
02172
02173
02174 Allocate_Object (dast);
02175 }
02176
02177
02178
02179
02180
02181
02182
02183 static ST* Create_Local_ST (ST* dart_st) {
02184 char name[64];
02185 char* tmps = ST_name(dart_st);
02186 sprintf (name, "_ec%s", ((strlen(tmps) < 60) ? tmps : "LongName"));
02187 ST *st = New_ST(CURRENT_SYMTAB);
02188 ST_Init (st,
02189 Save_Str(name),
02190 CLASS_VAR,
02191 SCLASS_AUTO,
02192 EXPORT_LOCAL,
02193 ST_type(dart_st));
02194 Set_ST_is_temp_var(st);
02195 Set_ST_pt_to_unique_mem(st);
02196 Set_ST_pt_to_compiler_generated_mem(st);
02197 return st;
02198 }
02199
02200 extern ST* Create_Local_Array_ST (char* array_name,
02201 TY_IDX ty,
02202 INT num) {
02203 char name[64];
02204 ST* st;
02205
02206 #ifdef _NEW_SYMTAB
02207 ARB_HANDLE arb = New_ARB();
02208 ARB_Init(arb,0,num-1,1);
02209 Set_ARB_first_dimen (arb);
02210 Set_ARB_last_dimen (arb);
02211 TY_IDX ty_idx;
02212
02213 sprintf (name, "_%s_ty%d", ((strlen(array_name)<50)?
02214 array_name : "LongName") , num);
02215
02216 TY& arr_ty = New_TY(ty_idx);
02217 TY_Init (arr_ty,
02218 TY_size(ty)*num,
02219 KIND_ARRAY,
02220 MTYPE_UNKNOWN,
02221 Save_Str(name));
02222 Set_TY_arb(arr_ty,arb);
02223 Set_TY_align(ty_idx,8);
02224 Set_TY_etype(arr_ty,ty);
02225
02226 #else
02227
02228 ARI *ari;
02229 ari = New_ARI (1, FALSE);
02230 ARI_etype(ari) = ty;
02231 ARB_const_lbnd(ARI_bnd(ari, 0)) = TRUE;
02232 ARB_const_ubnd(ARI_bnd(ari, 0)) = TRUE;
02233 ARB_const_stride(ARI_bnd(ari, 0)) = TRUE;
02234 ARB_lbnd_val(ARI_bnd(ari, 0)) = 0;
02235 ARB_ubnd_val(ARI_bnd(ari, 0)) = num-1;
02236 ARB_stride_val(ARI_bnd(ari, 0)) = 1;
02237
02238
02239 TY_IDX arr_ty = New_TY(FALSE);
02240 TY_kind(arr_ty) = KIND_ARRAY;
02241 TY_btype(arr_ty) = MTYPE_M;
02242 TY_arinfo(arr_ty) = ari;
02243 sprintf (name, "_%s_ty%d", ((strlen(array_name)<50)?
02244 array_name : "LongName") , num);
02245 TY_name(arr_ty) = Save_Str(name);
02246 TY_size(arr_ty) = TY_size(ty)*num;
02247 TY_align(arr_ty) = 8;
02248 #endif
02249 Enter_TY(arr_ty);
02250
02251
02252 sprintf (name, "_%s",
02253 ((strlen(array_name)<50) ? array_name : "LongName"));
02254 st = New_ST(CURRENT_SYMTAB);
02255 ST_Init (st,
02256 Save_Str(name),
02257 CLASS_VAR,
02258 SCLASS_AUTO,
02259 EXPORT_LOCAL,
02260 ty_idx);
02261 Set_ST_pt_to_unique_mem(st);
02262 Set_ST_pt_to_compiler_generated_mem(st);
02263 Set_ST_is_temp_var(st);
02264 return st;
02265 }
02266
02267
02268
02269
02270
02271
02272
02273
02274
02275 static WN* Gen_Alloc_Reshape (DISTR_ARRAY* dact, BOOL do_exit, WN* prev_wn) {
02276
02277 DISTR_INFO* dinfo = dact->Dinfo();
02278 ST* array_st = dinfo->Array_ST();
02279
02280 WN *dart_ldid_wn = dinfo->DART_Ldid();
02281 OPCODE call_op = OPCODE_make_op(OPR_CALL, Pointer_type, MTYPE_V);
02282 WN *call_wn = WN_Create(call_op, 1);
02283 WN_st_idx(call_wn) = ST_st_idx(distr_st_entries[Alloc_Reshape]);
02284 Set_Runtime_Call_Side_Effects (call_wn);
02285 if (LNO_Use_Parm) {
02286 WN* parm_wn = WN_CreateParm (Pointer_type, dart_ldid_wn,
02287 Be_Type_Tbl(Pointer_type),
02288 WN_PARM_BY_REFERENCE);
02289 LWN_Set_Parent(dart_ldid_wn, parm_wn);
02290 dart_ldid_wn = parm_wn;
02291 }
02292 WN_kid0(call_wn) = dart_ldid_wn;
02293 LWN_Set_Parent (dart_ldid_wn, call_wn);
02294 LWN_Insert_Block_After (NULL, prev_wn, call_wn);
02295 WN_linenum(call_wn) = LWN_Get_Linenum(prev_wn);
02296 prev_wn = call_wn;
02297
02298
02299 PREG_NUM rreg1, rreg2;
02300 ST* rst = Find_Return_Registers (Pointer_type, &rreg1, &rreg2);
02301 FmtAssert(rreg1 != 0 && rreg2 == 0, ("Bad pointer type ret regs"));
02302
02303 WN *ldid_wn = WN_CreateLdid (OPCODE_make_op(OPR_LDID,
02304 Pointer_type,
02305 Pointer_type),
02306 rreg1, rst, Be_Type_Tbl(Pointer_type));
02307 Create_alias (Alias_Mgr, ldid_wn);
02308 Du_Mgr->Add_Def_Use (call_wn, ldid_wn);
02309 WN *stid_wn = LWN_CreateStid (OPCODE_make_op(OPR_STID,
02310 MTYPE_V,
02311 Pointer_type),
02312 0,
02313 array_st,
02314 ST_type(array_st),
02315 ldid_wn);
02316 Set_ST_pt_to_unique_mem(array_st);
02317 Set_ST_pt_to_compiler_generated_mem(array_st);
02318 Create_unique_pointer_alias (Alias_Mgr, array_st, stid_wn, NULL);
02319 WN* copy_wn = LWN_Copy_Tree(stid_wn);
02320 Copy_alias_info (Alias_Mgr, stid_wn, copy_wn);
02321 dinfo->Set_Array_Alias_WN (copy_wn);
02322 dinfo->Set_Array_Def_WN (stid_wn);
02323 LWN_Insert_Block_After (NULL, prev_wn, stid_wn);
02324 WN_linenum(stid_wn) = LWN_Get_Linenum(prev_wn);
02325 prev_wn = stid_wn;
02326
02327 if (!do_exit) return prev_wn;
02328
02329
02330 OPCODE ldid_op = OPCODE_make_op(OPR_LDID, Pointer_type, Pointer_type);
02331 WN *array_ldid_wn = WN_CreateLdid (ldid_op, 0, array_st, ST_type(array_st));
02332 Copy_alias_info (Alias_Mgr, stid_wn, array_ldid_wn);
02333 Du_Mgr->Add_Def_Use (stid_wn, array_ldid_wn);
02334 call_wn = WN_Create(OPCODE_make_op(OPR_CALL, MTYPE_V, MTYPE_V), 2);
02335
02336 dart_ldid_wn = dinfo->DART_Ldid();
02337
02338 if (LNO_Use_Parm) {
02339 WN* parm_wn = WN_CreateParm (Pointer_type, dart_ldid_wn,
02340 Be_Type_Tbl(Pointer_type),
02341 WN_PARM_BY_REFERENCE);
02342 LWN_Set_Parent(dart_ldid_wn, parm_wn);
02343 dart_ldid_wn = parm_wn;
02344
02345 parm_wn = WN_CreateParm (Pointer_type, array_ldid_wn,
02346 Be_Type_Tbl(Pointer_type),
02347 WN_PARM_BY_REFERENCE);
02348 LWN_Set_Parent(array_ldid_wn, parm_wn);
02349 array_ldid_wn = parm_wn;
02350 }
02351 WN_kid(call_wn, 0) = dart_ldid_wn;
02352 WN_kid(call_wn, 1) = array_ldid_wn;
02353
02354
02355
02356 WN_st_idx(call_wn) = ST_st_idx(distr_st_entries[Dealloc_Reshape]);
02357 Set_Runtime_Call_Side_Effects (call_wn);
02358 LWN_Set_Parent(dart_ldid_wn, call_wn);
02359 LWN_Set_Parent(array_ldid_wn, call_wn);
02360 LWN_Insert_Block_After (exit_wn, NULL, call_wn);
02361
02362 return prev_wn;
02363 }
02364
02365
02366
02367
02368
02369
02370
02371 static void Reshape_ST_Entry (DISTR_INFO* dinfo) {
02372 ST* array_st = dinfo->Array_ST();
02373
02374 #ifdef _NEW_SYMTAB
02375 if (ST_level(array_st) == GLOBAL_SYMTAB &&
02376 #else
02377 if (ST_is_global(array_st) &&
02378 #endif
02379 (da_global->Find(array_st)) &&
02380 (TY_kind(ST_type(array_st)) == KIND_POINTER)) {
02381
02382 return;
02383 }
02384
02385 FmtAssert ((TY_kind(ST_type(array_st)) == KIND_ARRAY) ||
02386 ((TY_kind(ST_type(array_st)) == KIND_POINTER) &&
02387 (ST_isFormal(array_st) || ST_isLocal(array_st))),
02388 ("Reshape_ST_Entry: ST (%s) not an array, and not formal/local",
02389 ST_name(array_st)));
02390 TY_IDX array_ty = Get_Array_Type(array_st);
02391
02392
02393
02394 TY_IDX new_ty = Make_Pointer_Type(Make_Pointer_Type(TY_AR_etype(array_ty)));
02395
02396
02397
02398
02399
02400 if (Has_Base_Block(array_st)) {
02401 #ifdef _NEW_SYMTAB
02402 if (ST_base_idx(array_st) != ST_st_idx(array_st)) {
02403 #else
02404 if (ST_sclass(array_st) == SCLASS_BASED) {
02405 #endif
02406 if (ST_sclass(ST_base(array_st)) == SCLASS_COMMON) {
02407
02408 ST* st;
02409
02410
02411
02412
02413
02414 #ifdef _NEW_SYMTAB
02415 mINT64 delta = (TY_size(ST_type(array_st))/16)*16;
02416 if (delta == TY_size(ST_type(array_st))) {
02417 #else
02418 mINT64 delta = (ST_size(array_st)/16)*16;
02419 if (delta == ST_size(array_st)) {
02420 #endif
02421
02422
02423 delta = delta - 16;
02424 }
02425 if (delta > 0) {
02426 #ifdef _NEW_SYMTAB
02427 INT i;
02428 FOREACH_SYMBOL (GLOBAL_SYMTAB,st,i)
02429 #else
02430 FOR_ALL_SYMBOLS(Current_Symtab, st)
02431 #endif
02432 {
02433 if ((ST_base(st) == ST_base(array_st)) && (st != array_st)) {
02434 VB_PRINT(printf ("Reshape_ST_Entry: ");
02435 printf ("Var %s in same common as reshaped array %s\n",
02436 ST_name(st), ST_name (array_st)));
02437
02438 if (ST_ofst(st) > ST_ofst(array_st)) {
02439 Set_ST_ofst(st, ST_ofst(st) - delta);
02440 }
02441 else {
02442
02443 continue;
02444 }
02445 }
02446 }
02447
02448
02449
02450 TY_IDX struct_ty = ST_type(ST_base(array_st));
02451 Is_True (TY_kind(struct_ty) == KIND_STRUCT,
02452 ("Expected KIND_STRUCT for base of COMMON block %s",
02453 ST_name(ST_base(array_st))));
02454
02455 FLD_ITER fld_iter = Make_fld_iter (TY_fld(struct_ty));
02456 do {
02457 FLD_HANDLE fld (fld_iter);
02458 if (FLD_ofst(fld) == ST_ofst(array_st)) {
02459 Set_FLD_type(fld, new_ty);
02460 }
02461 else if (FLD_ofst(fld) > ST_ofst(array_st)) {
02462 Set_FLD_ofst(fld, FLD_ofst(fld)-delta);
02463 }
02464 } while (!FLD_last_field(fld_iter++));
02465
02466
02467 TY_IDX ty = ST_type(ST_base(array_st));
02468 Set_TY_size(ty,TY_size(ty) - delta);
02469 }
02470 else {
02471 DevWarn ("Reshape_ST_Entry (%s): delta is <= 0", ST_name(array_st));
02472 }
02473 }
02474 else {
02475 FmtAssert (ST_sclass(ST_base(array_st)) == SCLASS_AUTO,
02476 ("ST (%s) is BASED, but not common/auto\n",
02477 ST_name(array_st)));
02478
02479
02480
02481 Set_ST_sclass(array_st, SCLASS_AUTO);
02482 }
02483 }
02484 else {
02485 DevWarn ("ST (%s) has base block, but is not BASED", ST_name(array_st));
02486 FmtAssert ((ST_sclass(array_st) == SCLASS_AUTO),
02487 ("ST (%s) has base block, but is not sclass_based\n",
02488 ST_name(array_st)));
02489 }
02490 }
02491
02492 #ifdef _NEW_SYMTAB
02493 Set_ST_type(array_st,new_ty);
02494 Set_TY_ptr_as_array(new_ty);
02495 Set_TY_ptr_as_array(TY_pointed(new_ty));
02496 #else
02497 ST_type(array_st) = Make_Pointer_Type(Make_Pointer_Type
02498 (TY_AR_etype(array_ty),
02499 ST_is_global(array_st)),
02500 ST_is_global(array_st));
02501 Set_TY_ptr_as_array(ST_type(array_st));
02502 Set_TY_ptr_as_array(TY_pointed(ST_type(array_st)));
02503 #endif
02504 Set_ST_pt_to_unique_mem(array_st);
02505 Set_ST_pt_to_compiler_generated_mem(array_st);
02506 }
02507
02508
02509 static ST* Declare_Func_Zero_Arg (const char* ty_name, const char* st_name,
02510 TY_IDX ret_ty) {
02511 ST* func_st;
02512 TY_IDX func_ty;
02513 INT nparms = 0;
02514 TY_IDX voidpty = Make_Pointer_Type (Be_Type_Tbl(MTYPE_V));
02515
02516 #ifdef _NEW_SYMTAB
02517 TY& new_ty = New_TY(func_ty);
02518 TY_Init (new_ty, 0, KIND_FUNCTION, MTYPE_UNKNOWN, Save_Str(ty_name));
02519 Set_TY_has_prototype(func_ty);
02520 Set_TY_align(func_ty,TY_align(voidpty));
02521
02522 TYLIST_IDX tylist_idx;
02523 TYLIST& tylist_head = New_TYLIST (tylist_idx);
02524 Tylist_Table [tylist_idx] = ret_ty;
02525 TYLIST_IDX first_tylist_idx = tylist_idx;
02526 TYLIST& tylist_tail = New_TYLIST (tylist_idx);
02527 Tylist_Table [tylist_idx] = 0;
02528 Set_TY_tylist (new_ty, first_tylist_idx);
02529
02530 #else
02531 func_ty = New_TY(TRUE);
02532 TY_kind(func_ty) = KIND_FUNCTION;
02533 TY_btype(func_ty) = MTYPE_UNKNOWN;
02534 Set_TY_has_prototype(func_ty);
02535 TY_ftinfo(func_ty) = New_FTI (nparms, TRUE );
02536 TY_name(func_ty) = Save_Str(ty_name);
02537 TY_size(func_ty) = TY_size(voidpty);
02538 TY_align(func_ty) = TY_align(voidpty);
02539 TY_ret_type(func_ty) = ret_ty;
02540 Enter_TY (func_ty);
02541 #endif
02542
02543
02544 PU_IDX pu_idx;
02545 PU& pu = New_PU (pu_idx);
02546 PU_Init (pu, func_ty, GLOBAL_SYMTAB + 1);
02547
02548
02549 func_st = New_ST (GLOBAL_SYMTAB);
02550 ST_Init (func_st,
02551 Save_Str(st_name),
02552 CLASS_FUNC,
02553 SCLASS_EXTERN,
02554 EXPORT_PREEMPTIBLE,
02555 pu_idx);
02556 return func_st;
02557 }
02558
02559 static ST* Declare_Func_One_Arg (const char* ty_name, const char* st_name,
02560 TY_IDX ret_ty, TY_IDX arg1_ty) {
02561 ST* func_st;
02562 TY_IDX func_ty;
02563 INT nparms = 1;
02564 TYLIST* parms;
02565 TY_IDX voidpty = Make_Pointer_Type (Be_Type_Tbl(MTYPE_V));
02566
02567 #ifdef _NEW_SYMTAB
02568 TY& new_ty = New_TY(func_ty);
02569 TY_Init (new_ty, 0, KIND_FUNCTION, MTYPE_UNKNOWN, Save_Str(ty_name));
02570 Set_TY_has_prototype(func_ty);
02571 Set_TY_align(func_ty,TY_align(voidpty));
02572
02573 TYLIST_IDX tylist_idx;
02574 TYLIST& tylist_head = New_TYLIST (tylist_idx);
02575 Tylist_Table [tylist_idx] = ret_ty;
02576 TYLIST_IDX first_tylist_idx = tylist_idx;
02577
02578 TYLIST &tylist_arg = New_TYLIST (tylist_idx);
02579 Tylist_Table [tylist_idx] = arg1_ty;
02580
02581 TYLIST& tylist_tail = New_TYLIST (tylist_idx);
02582 Tylist_Table [tylist_idx] = 0;
02583 Set_TY_tylist (new_ty, first_tylist_idx);
02584
02585 #else
02586 func_ty = New_TY(TRUE);
02587 TY_kind(func_ty) = KIND_FUNCTION;
02588 TY_btype(func_ty) = MTYPE_UNKNOWN;
02589 Set_TY_has_prototype(func_ty);
02590 TY_ftinfo(func_ty) = New_FTI (nparms, TRUE );
02591 parms = TY_parms(func_ty);
02592 TYLIST_item(&parms[0]) = arg1_ty;
02593 TY_name(func_ty) = Save_Str(ty_name);
02594 TY_size(func_ty) = TY_size(voidpty);
02595 TY_align(func_ty) = TY_align(voidpty);
02596 TY_ret_type(func_ty) = ret_ty;
02597 Enter_TY (func_ty);
02598
02599 #endif
02600
02601
02602 PU_IDX pu_idx;
02603 PU& pu = New_PU (pu_idx);
02604 PU_Init (pu, func_ty, GLOBAL_SYMTAB + 1);
02605
02606
02607 func_st = New_ST (GLOBAL_SYMTAB);
02608 ST_Init (func_st,
02609 Save_Str(st_name),
02610 CLASS_FUNC,
02611 SCLASS_EXTERN,
02612 EXPORT_PREEMPTIBLE,
02613 pu_idx);
02614 return func_st;
02615 }
02616
02617 static ST* Declare_Func_Two_Arg (const char* ty_name, const char* st_name,
02618 TY_IDX ret_ty, TY_IDX arg1_ty, TY_IDX arg2_ty) {
02619
02620 ST* func_st;
02621 TY_IDX func_ty;
02622 INT nparms = 2;
02623 TYLIST* parms;
02624 TY_IDX voidpty = Make_Pointer_Type (Be_Type_Tbl(MTYPE_V));
02625
02626 #ifdef _NEW_SYMTAB
02627 TY& new_ty = New_TY(func_ty);
02628 TY_Init (new_ty, 0, KIND_FUNCTION, MTYPE_UNKNOWN, Save_Str(ty_name));
02629 Set_TY_has_prototype(func_ty);
02630 Set_TY_align(func_ty,TY_align(voidpty));
02631
02632 TYLIST_IDX tylist_idx;
02633 TYLIST& tylist_head = New_TYLIST (tylist_idx);
02634 Tylist_Table [tylist_idx] = ret_ty;
02635 TYLIST_IDX first_tylist_idx = tylist_idx;
02636
02637 TYLIST &tylist_arg = New_TYLIST (tylist_idx);
02638 Tylist_Table [tylist_idx] = arg1_ty;
02639
02640 TYLIST &tylist_arg2 = New_TYLIST (tylist_idx);
02641 Tylist_Table [tylist_idx] = arg2_ty;
02642
02643 TYLIST& tylist_tail = New_TYLIST (tylist_idx);
02644 Tylist_Table [tylist_idx] = 0;
02645 Set_TY_tylist (new_ty, first_tylist_idx);
02646 #else
02647
02648 func_ty = New_TY(TRUE);
02649 TY_kind(func_ty) = KIND_FUNCTION;
02650 TY_btype(func_ty) = MTYPE_UNKNOWN;
02651 Set_TY_has_prototype(func_ty);
02652 TY_ftinfo(func_ty) = New_FTI (nparms, TRUE );
02653 parms = TY_parms(func_ty);
02654 TYLIST_item(&parms[0]) = arg1_ty;
02655 TYLIST_item(&parms[1]) = arg2_ty;
02656 TY_name(func_ty) = Save_Str(ty_name);
02657 TY_size(func_ty) = TY_size(voidpty);
02658 TY_align(func_ty) = TY_align(voidpty);
02659 TY_ret_type(func_ty) = ret_ty;
02660 Enter_TY (func_ty);
02661 #endif
02662
02663
02664 PU_IDX pu_idx;
02665 PU& pu = New_PU (pu_idx);
02666 PU_Init (pu, func_ty, GLOBAL_SYMTAB + 1);
02667
02668
02669 func_st = New_ST (GLOBAL_SYMTAB);
02670 ST_Init (func_st,
02671 Save_Str(st_name),
02672 CLASS_FUNC,
02673 SCLASS_EXTERN,
02674 EXPORT_PREEMPTIBLE,
02675 pu_idx);
02676 return func_st;
02677 }
02678
02679 static ST* Declare_Func_Three_Arg (const char* ty_name, const char* st_name,
02680 TY_IDX ret_ty,
02681 TY_IDX arg1_ty, TY_IDX arg2_ty, TY_IDX arg3_ty) {
02682 ST* func_st;
02683 TY_IDX func_ty;
02684 INT nparms = 3;
02685 TYLIST* parms;
02686 TY_IDX voidpty = Make_Pointer_Type (Be_Type_Tbl(MTYPE_V));
02687
02688 #ifdef _NEW_SYMTAB
02689 TY& new_ty = New_TY(func_ty);
02690 TY_Init (new_ty, 0, KIND_FUNCTION, MTYPE_UNKNOWN, Save_Str(ty_name));
02691 Set_TY_has_prototype(func_ty);
02692 Set_TY_align(func_ty,TY_align(voidpty));
02693
02694 TYLIST_IDX tylist_idx;
02695 TYLIST& tylist_head = New_TYLIST (tylist_idx);
02696 Tylist_Table [tylist_idx] = ret_ty;
02697 TYLIST_IDX first_tylist_idx = tylist_idx;
02698
02699 TYLIST &tylist_arg = New_TYLIST (tylist_idx);
02700 Tylist_Table [tylist_idx] = arg1_ty;
02701
02702 TYLIST tylist_arg2 = New_TYLIST (tylist_idx);
02703 Tylist_Table [tylist_idx] = arg2_ty;
02704
02705 TYLIST tylist_arg3 = New_TYLIST (tylist_idx);
02706 Tylist_Table [tylist_idx] = arg3_ty;
02707
02708 TYLIST& tylist_tail = New_TYLIST (tylist_idx);
02709 Tylist_Table [tylist_idx] = 0;
02710 Set_TY_tylist (new_ty, first_tylist_idx);
02711
02712 #else
02713
02714 func_ty = New_TY(TRUE);
02715 TY_kind(func_ty) = KIND_FUNCTION;
02716 TY_btype(func_ty) = MTYPE_UNKNOWN;
02717 Set_TY_has_prototype(func_ty);
02718 TY_ftinfo(func_ty) = New_FTI (nparms, TRUE );
02719 parms = TY_parms(func_ty);
02720 TYLIST_item(&parms[0]) = arg1_ty;
02721 TYLIST_item(&parms[1]) = arg2_ty;
02722 TYLIST_item(&parms[2]) = arg3_ty;
02723 TY_name(func_ty) = Save_Str(ty_name);
02724 TY_size(func_ty) = TY_size(voidpty);
02725 TY_align(func_ty) = TY_align(voidpty);
02726 TY_ret_type(func_ty) = ret_ty;
02727 Enter_TY (func_ty);
02728 #endif
02729
02730
02731 PU_IDX pu_idx;
02732 PU& pu = New_PU (pu_idx);
02733 PU_Init (pu, func_ty, GLOBAL_SYMTAB + 1);
02734
02735
02736 func_st = New_ST (GLOBAL_SYMTAB);
02737 ST_Init (func_st,
02738 Save_Str(st_name),
02739 CLASS_FUNC,
02740 SCLASS_EXTERN,
02741 EXPORT_PREEMPTIBLE,
02742 pu_idx);
02743 return func_st;
02744 }
02745
02746 static ST* Declare_Func_N_Arg (const char* ty_name, const char* st_name,
02747 TY_IDX ret_ty, INT nargs, TY_IDX ty_array[])
02748
02749 {
02750 ST* func_st;
02751 TY_IDX func_ty;
02752 INT nparms = nargs;
02753 TYLIST* parms;
02754 TY_IDX voidpty = Make_Pointer_Type (Be_Type_Tbl(MTYPE_V));
02755
02756 #ifdef _NEW_SYMTAB
02757 TY& new_ty = New_TY(func_ty);
02758 TY_Init (new_ty, 0, KIND_FUNCTION, MTYPE_UNKNOWN, Save_Str(ty_name));
02759 Set_TY_has_prototype(func_ty);
02760 Set_TY_align(func_ty,TY_align(voidpty));
02761
02762 TYLIST_IDX tylist_idx;
02763 TYLIST& tylist_head = New_TYLIST (tylist_idx);
02764 Tylist_Table [tylist_idx] = ret_ty;
02765 TYLIST_IDX first_tylist_idx = tylist_idx;
02766
02767 for (INT i=0; i<nargs; i++) {
02768 TYLIST &tylist_arg = New_TYLIST (tylist_idx);
02769 Tylist_Table [tylist_idx] = ty_array[i];
02770 }
02771
02772 TYLIST& tylist_tail = New_TYLIST (tylist_idx);
02773 Tylist_Table [tylist_idx] = 0;
02774 Set_TY_tylist (new_ty, first_tylist_idx);
02775
02776 #else
02777
02778
02779 func_ty = New_TY(TRUE);
02780 TY_kind(func_ty) = KIND_FUNCTION;
02781 TY_btype(func_ty) = MTYPE_UNKNOWN;
02782 Set_TY_has_prototype(func_ty);
02783 TY_ftinfo(func_ty) = New_FTI (nparms, TRUE );
02784 parms = TY_parms(func_ty);
02785
02786 for (INT i = 0; i < nargs; i++) {
02787 TYLIST_item(&parms[i]) = ty_array[i];
02788 }
02789
02790 TY_name(func_ty) = Save_Str(ty_name);
02791 TY_size(func_ty) = TY_size(voidpty);
02792 TY_align(func_ty) = TY_align(voidpty);
02793 TY_ret_type(func_ty) = ret_ty;
02794 Enter_TY (func_ty);
02795 #endif
02796
02797
02798 PU_IDX pu_idx;
02799 PU& pu = New_PU (pu_idx);
02800 PU_Init (pu, func_ty, GLOBAL_SYMTAB + 1);
02801
02802
02803 func_st = New_ST (GLOBAL_SYMTAB);
02804 ST_Init (func_st,
02805 Save_Str(st_name),
02806 CLASS_FUNC,
02807 SCLASS_EXTERN,
02808 EXPORT_PREEMPTIBLE,
02809 pu_idx);
02810 return func_st;
02811 }
02812
02813 extern void Init_Special_Lego_Mp_Call() {
02814 {
02815 TY_IDX i4_ptr_ty = Make_Pointer_Type(Be_Type_Tbl(MTYPE_I4));
02816 TY_IDX i8_ptr_ty = Make_Pointer_Type(Be_Type_Tbl(MTYPE_I8));
02817 TY_IDX ty_array[8];
02818
02819 ty_array[0] = Be_Type_Tbl(MTYPE_I8);
02820 ty_array[1] = Be_Type_Tbl(MTYPE_I8);
02821 ty_array[2] = Be_Type_Tbl(MTYPE_I8);
02822 ty_array[3] = Be_Type_Tbl(MTYPE_I8);
02823 ty_array[4] = Be_Type_Tbl(MTYPE_I8);
02824 ty_array[5] = i8_ptr_ty;
02825 ty_array[6] = i8_ptr_ty;
02826 ty_array[7] = i4_ptr_ty;
02827
02828 ST* st = Declare_Func_N_Arg (".__dsm_simple_bounds", "__dsm_simple_bounds",
02829 Be_Type_Tbl(MTYPE_V),
02830 8,
02831 ty_array);
02832
02833 distr_st_entries[Simple_Bounds] = st;
02834 }
02835 {
02836 TY_IDX i4_ptr_ty = Make_Pointer_Type(Be_Type_Tbl(MTYPE_I4));
02837 TY_IDX i8_ptr_ty = Make_Pointer_Type(Be_Type_Tbl(MTYPE_I8));
02838 TY_IDX ty_array[4];
02839
02840 ty_array[0] = Be_Type_Tbl(MTYPE_I8);
02841 ty_array[1] = Be_Type_Tbl(MTYPE_I8);
02842 ty_array[2] = i8_ptr_ty;
02843 ty_array[3] = i8_ptr_ty;
02844
02845 ST* st = Declare_Func_N_Arg (".__dsm_processor_layout",
02846 "__dsm_processor_layout",
02847 Be_Type_Tbl(MTYPE_V),
02848 4,
02849 ty_array);
02850
02851 distr_st_entries[Processor_Layout] = st;
02852 }
02853 {
02854 TY_IDX i4_ptr_ty = Make_Pointer_Type(Be_Type_Tbl(MTYPE_I4));
02855 TY_IDX i8_ptr_ty = Make_Pointer_Type(Be_Type_Tbl(MTYPE_I8));
02856 TY_IDX ty_array[4];
02857
02858 ty_array[0] = i8_ptr_ty;
02859 ty_array[1] = Be_Type_Tbl(MTYPE_I8);
02860 ty_array[2] = Be_Type_Tbl(MTYPE_I8);
02861 ty_array[3] = i8_ptr_ty;
02862
02863 ST* st = Declare_Func_N_Arg (".__dsm_processor_coordinates",
02864 "__dsm_processor_coordinates",
02865 Be_Type_Tbl(MTYPE_V),
02866 4,
02867 ty_array);
02868 distr_st_entries[Processor_Coordinates] = st;
02869 }
02870 {
02871 TY_IDX i4_ptr_ty = Make_Pointer_Type(Be_Type_Tbl(MTYPE_I4));
02872 TY_IDX i8_ptr_ty = Make_Pointer_Type(Be_Type_Tbl(MTYPE_I8));
02873 TY_IDX ty_array[14];
02874
02875 ty_array[0] = Be_Type_Tbl(Pointer_type);
02876 ty_array[1] = Be_Type_Tbl(MTYPE_I8);
02877 ty_array[2] = Be_Type_Tbl(MTYPE_I8);
02878 ty_array[3] = Be_Type_Tbl(MTYPE_I8);
02879 ty_array[4] = Be_Type_Tbl(MTYPE_I8);
02880 ty_array[5] = Be_Type_Tbl(MTYPE_I8);
02881 ty_array[6] = Be_Type_Tbl(MTYPE_I8);
02882 ty_array[7] = Be_Type_Tbl(MTYPE_I8);
02883 ty_array[8] = Be_Type_Tbl(MTYPE_I8);
02884 ty_array[9] = Be_Type_Tbl(MTYPE_I8);
02885 ty_array[10] = i8_ptr_ty;
02886 ty_array[11] = i8_ptr_ty;
02887 ty_array[12] = i8_ptr_ty;
02888 ty_array[13] = i4_ptr_ty;
02889
02890 ST* st = Declare_Func_N_Arg (".__dsm_dynamic_affinity_bounds",
02891 "__dsm_dynamic_affinity_bounds",
02892 Be_Type_Tbl(MTYPE_V),
02893 14,
02894 ty_array);
02895
02896 distr_st_entries[Dynamic_Affinity_Bounds] = st;
02897 }
02898
02899 {
02900 #ifdef _NEW_SYMTAB
02901 TY_IDX vi4_ty = Copy_TY(Be_Type_Tbl(MTYPE_I4));
02902 #else
02903 TY_IDX vi4_ty = Copy_TY(Be_Type_Tbl(MTYPE_I4), TRUE);
02904 #endif
02905 Set_TY_is_volatile(vi4_ty);
02906 ST* st;
02907 st = New_ST(GLOBAL_SYMTAB);
02908 ST_Init (st,
02909 #ifndef KEY
02910 Save_Str("__mp_sug_numthreads"),
02911 #else
02912 Save_Str("__ompc_sug_numthreads"),
02913 #endif
02914 CLASS_VAR,
02915 SCLASS_EXTERN,
02916 EXPORT_PREEMPTIBLE,
02917 vi4_ty);
02918 Set_ST_not_gprel(st);
02919 distr_st_entries[mp_sug_numthreads] = st;
02920
02921 st = New_ST(GLOBAL_SYMTAB);
02922 ST_Init (st,
02923 #ifndef KEY
02924 Save_Str("__mp_cur_numthreads"),
02925 #else
02926 Save_Str("__ompc_cur_numthreads"),
02927 #endif
02928 CLASS_VAR,
02929 SCLASS_EXTERN,
02930 EXPORT_PREEMPTIBLE,
02931 vi4_ty);
02932 Set_ST_not_gprel(st);
02933 distr_st_entries[mp_cur_numthreads] = st;
02934 }
02935 {
02936 distr_st_entries[mp_numthreads_fn] =
02937 #ifndef KEY
02938 Declare_Func_Zero_Arg (".__mp_numthreads", "__mp_numthreads",
02939 Be_Type_Tbl(MTYPE_I4));
02940 #else
02941 Declare_Func_Zero_Arg (".omp_get_num_threads", "omp_get_num_threads",
02942 Be_Type_Tbl(MTYPE_I4));
02943 #endif
02944 }
02945 #ifndef KEY // Pathscale does not have this
02946 {
02947 distr_st_entries[mp_cur_numthreads_func] =
02948 Declare_Func_Zero_Arg (".__mp_cur_numthreads_func",
02949 "__mp_cur_numthreads_func",
02950 Be_Type_Tbl(MTYPE_I4));
02951 }
02952 #endif
02953 {
02954 distr_st_entries[mp_my_threadnum] =
02955 #ifndef KEY
02956 Declare_Func_Zero_Arg (".mp_my_threadnum", "mp_my_threadnum",
02957 Be_Type_Tbl(MTYPE_I4));
02958 #else
02959 Declare_Func_Zero_Arg (".omp_get_thread_num", "omp_get_thread_num",
02960 Be_Type_Tbl(MTYPE_I4));
02961 #endif
02962 }
02963 }
02964
02965 extern BOOL Special_Lego_Or_Mp_Call(ST* st_call)
02966 {
02967 if ((st_call == distr_st_entries[Simple_Bounds]) ||
02968 (st_call == distr_st_entries[Processor_Layout]) ||
02969 (st_call == distr_st_entries[Processor_Coordinates]) ||
02970 (st_call == distr_st_entries[Cyclic_Bounds]) ||
02971 (st_call == distr_st_entries[Dynamic_Affinity_Bounds]) ||
02972 (st_call == distr_st_entries[mp_my_threadnum]))
02973 return TRUE;
02974 return FALSE;
02975 }
02976
02977
02978
02979
02980
02981
02982
02983
02984 void Generate_Runtime_Stuff () {
02985 TY_IDX rt_struct_ty_idx;
02986 TY_IDX rt_ptr_ty;
02987 TY_IDX rt_dim_struct_ty;
02988 TY_IDX rt_dim_ptr_ty;
02989
02990 TY_IDX voidpty;
02991 TY_IDX voidppty;
02992 TY_IDX func_ty;
02993 ST* func_st;
02994 TYLIST *parms;
02995 INT32 nparms = 2;
02996
02997
02998
02999 voidpty = Make_Pointer_Type (Be_Type_Tbl(MTYPE_V));
03000 distr_ty_entries[VOID_ptr] = voidpty;
03001
03002
03003 voidppty = Make_Pointer_Type (voidpty);
03004
03005
03006
03007
03008
03009
03010
03011
03012
03013
03014
03015
03016
03017
03018
03019
03020
03021
03022
03023
03024
03025 #ifdef _NEW_SYMTAB
03026 FLD_HANDLE fld = New_FLD ();
03027 FLD_HANDLE first_fld = fld;
03028 FLD_Init(fld,Save_Str("n"),Be_Type_Tbl(MTYPE_I8),0);
03029 FmtAssert (dart_offset_distr_n == dart_offset_flags+8,
03030 ("Mismatch in n offset in DISTR_DIM_RT type decl\n"));
03031
03032 fld = New_FLD ();
03033 FLD_Init(fld,Save_Str("p"),Be_Type_Tbl(MTYPE_I8),
03034 TY_size(Be_Type_Tbl(MTYPE_I8)));
03035
03036 fld = New_FLD ();
03037 FLD_Init(fld,Save_Str("k"),Be_Type_Tbl(MTYPE_I8),
03038 TY_size(Be_Type_Tbl(MTYPE_I8)) *2);
03039
03040 fld = New_FLD ();
03041 FLD_Init(fld,Save_Str("lb"),Be_Type_Tbl(MTYPE_I8),
03042 TY_size(Be_Type_Tbl(MTYPE_I8)) *3);
03043 Set_FLD_last_field (fld);
03044
03045 TY &ty = New_TY(rt_dim_struct_ty);
03046 TY_Init (ty,
03047 dart_distr_size*TY_size(Be_Type_Tbl(MTYPE_I8)),
03048 KIND_STRUCT,
03049 MTYPE_M,
03050 Save_Str("DISTR_DIM_RT"));
03051 Set_TY_fld(ty, first_fld);
03052 Set_TY_align(rt_dim_struct_ty,8);
03053 #else
03054 FLD *field, *next;
03055 field = New_FLD (4, TRUE);
03056 FLD_name(field) = Save_Str("n");
03057 FLD_type(field) = Be_Type_Tbl(MTYPE_I8);
03058 FLD_ofst(field) = 0;
03059 FmtAssert (dart_offset_distr_n == dart_offset_flags+8,
03060 ("Mismatch in n offset in DISTR_DIM_RT type decl\n"));
03061 FLD_flags(field) = 0;
03062 next = FLD_next(field);
03063 FLD_name(next) = Save_Str("p");
03064 FLD_type(next) = Be_Type_Tbl(MTYPE_I8);
03065 FLD_ofst(next) = TY_size(Be_Type_Tbl(MTYPE_I8));
03066 FmtAssert (dart_offset_distr_p-dart_offset_distr_n == FLD_ofst(next),
03067 ("Mismatch in p offset in DISTR_DIM_RT type decl\n"));
03068 FLD_flags(next) = 0;
03069 next = FLD_next(next);
03070 FLD_name(next) = Save_Str("k");
03071 FLD_type(next) = Be_Type_Tbl(MTYPE_I8);
03072 FLD_ofst(next) = TY_size(Be_Type_Tbl(MTYPE_I8)) * 2;
03073 FmtAssert (dart_offset_distr_k-dart_offset_distr_n == FLD_ofst(next),
03074 ("Mismatch in k offset in DISTR_DIM_RT type decl\n"));
03075 FLD_flags(next) = 0;
03076 next = FLD_next(next);
03077 FLD_name(next) = Save_Str("lb");
03078 FLD_type(next) = Be_Type_Tbl(MTYPE_I8);
03079 FLD_ofst(next) = TY_size(Be_Type_Tbl(MTYPE_I8)) * 3;
03080 FmtAssert (dart_offset_distr_lb-dart_offset_distr_n == FLD_ofst(next),
03081 ("Mismatch in lb offset in DISTR_DIM_RT type decl\n"));
03082 FLD_flags(next) = 0;
03083
03084 rt_dim_struct_ty = New_TY(TRUE);
03085 TY_kind(rt_dim_struct_ty) = KIND_STRUCT;
03086 TY_btype(rt_dim_struct_ty) = MTYPE_M;
03087 TY_name(rt_dim_struct_ty) = Save_Str("DISTR_DIM_RT");
03088 TY_flist(rt_dim_struct_ty) = field;
03089 TY_size(rt_dim_struct_ty) = dart_distr_size*TY_size(Be_Type_Tbl(MTYPE_I8));
03090 TY_align(rt_dim_struct_ty) = 8;
03091 #endif
03092
03093 Enter_TY (rt_dim_struct_ty);
03094 distr_ty_entries[RT_dim_struct] = rt_dim_struct_ty;
03095
03096
03097 rt_dim_ptr_ty = Make_Pointer_Type ( rt_dim_struct_ty);
03098 Set_TY_ptr_as_array(rt_dim_ptr_ty);
03099 distr_ty_entries[RT_dim_ptr] = rt_dim_ptr_ty;
03100
03101
03102
03103 #ifdef _NEW_SYMTAB
03104 TY_IDX arr_dim_struct_ty_idx;
03105 TY& arr_dim_struct_ty = New_TY(arr_dim_struct_ty_idx);
03106 TY_Init (arr_dim_struct_ty,
03107 9*TY_size(rt_dim_struct_ty),
03108 KIND_ARRAY,
03109 MTYPE_UNKNOWN,
03110 Save_Str("DISTR_DIM_RT_ARRAY"));
03111 ARB_HANDLE new_arb = New_ARB();
03112 ARB_Init(new_arb,0,9,TY_size(rt_dim_struct_ty));
03113 Set_ARB_first_dimen (new_arb);
03114 Set_ARB_last_dimen (new_arb);
03115
03116 Set_TY_etype(arr_dim_struct_ty,rt_dim_struct_ty);
03117 Set_TY_arb (arr_dim_struct_ty, new_arb);
03118 Set_TY_align(arr_dim_struct_ty_idx,8);
03119
03120 #else
03121
03122 TY_IDX arr_dim_struct_ty = New_TY (TRUE);
03123 TY_btype(arr_dim_struct_ty) = MTYPE_M;
03124 Set_TY_kind(arr_dim_struct_ty,KIND_ARRAY);
03125 ARI* new_ari = New_ARI (1, TRUE);
03126 ARI_etype(new_ari) = rt_dim_struct_ty;
03127 ARI_const_zofst(new_ari) = TRUE;
03128 ARI_zofst_val(new_ari) = 0;
03129 ARB_const_lbnd(ARI_bnd(new_ari,0)) = TRUE;
03130 ARB_lbnd_val(ARI_bnd(new_ari,0)) = 0;
03131 ARB_const_ubnd(ARI_bnd(new_ari,0)) = TRUE;
03132 ARB_ubnd_val(ARI_bnd(new_ari,0)) = 9;
03133 ARB_const_stride(ARI_bnd(new_ari,0)) = TRUE;
03134 ARB_stride_val(ARI_bnd(new_ari,0)) = TY_size(rt_dim_struct_ty);
03135 TY_arinfo(arr_dim_struct_ty) = new_ari;
03136 TY_align(arr_dim_struct_ty) = 8;
03137 TY_name(arr_dim_struct_ty) = Save_Str("DISTR_DIM_RT_ARRAY");
03138 Set_TY_size(arr_dim_struct_ty,9*TY_size(rt_dim_struct_ty));
03139 Enter_TY(arr_dim_struct_ty);
03140 #endif
03141
03142 #ifdef _NEW_SYMTAB
03143 fld = New_FLD ();
03144 first_fld = fld;
03145 FLD_Init(fld,
03146 Save_Str("num_dim"),
03147 Be_Type_Tbl(MTYPE_I8),
03148 dart_offset_num_dim);
03149
03150 fld = New_FLD ();
03151 FLD_Init(fld,Save_Str("element_size"),Be_Type_Tbl(MTYPE_I8),
03152 dart_offset_element_size);
03153 FmtAssert (dart_offset_element_size == TY_size(Be_Type_Tbl(MTYPE_I8)),
03154 ("Mismatch in element_size offset in DISTR_ARRAY_RT decl\n"));
03155
03156 fld = New_FLD ();
03157 FLD_Init(fld,Save_Str("flags"),Be_Type_Tbl(MTYPE_I8),dart_offset_flags);
03158 FmtAssert (dart_offset_flags == 2*TY_size(Be_Type_Tbl(MTYPE_I8)),
03159 ("Mismatch in element_size offset in DISTR_ARRAY_RT decl\n"));
03160
03161 fld = New_FLD ();
03162 FLD_Init(fld,Save_Str("distr"),arr_dim_struct_ty_idx,
03163 dart_offset_distr_n);
03164 Set_FLD_last_field(fld);
03165 FmtAssert (dart_offset_distr_n == TY_size(Be_Type_Tbl(MTYPE_I8))*3,
03166 ("Mismatch in element_size offset in DISTR_ARRAY_RT decl\n"));
03167
03168 TY& rt_struct_ty = New_TY(rt_struct_ty_idx);
03169 TY_Init (rt_struct_ty,
03170 (dart_base_size*TY_size(Be_Type_Tbl(MTYPE_I8)) +
03171 TY_size(arr_dim_struct_ty)),
03172 KIND_STRUCT,
03173 MTYPE_M,
03174 Save_Str("DISTR_ARRAY_RT"));
03175 Set_TY_fld(rt_struct_ty, first_fld);
03176 Set_TY_align(rt_struct_ty_idx,8);
03177
03178 #else
03179
03180 field = New_FLD (4, TRUE);
03181 FLD_name(field) = Save_Str("num_dim");
03182 FLD_type(field) = Be_Type_Tbl(MTYPE_I8);
03183 FLD_ofst(field) = dart_offset_num_dim;
03184 FLD_flags(field) = 0;
03185 next = FLD_next(field);
03186 FLD_name(next) = Save_Str("element_size");
03187 FLD_type(next) = Be_Type_Tbl(MTYPE_I8);
03188 FLD_ofst(next) = dart_offset_element_size;
03189 FmtAssert (dart_offset_element_size == TY_size(Be_Type_Tbl(MTYPE_I8)),
03190 ("Mismatch in element_size offset in DISTR_ARRAY_RT decl\n"));
03191 FLD_flags(next) = 0;
03192 next = FLD_next(next);
03193 FLD_name(next) = Save_Str("flags");
03194 FLD_type(next) = Be_Type_Tbl(MTYPE_I8);
03195 FLD_ofst(next) = dart_offset_flags;
03196 FmtAssert (dart_offset_flags == 2*TY_size(Be_Type_Tbl(MTYPE_I8)),
03197 ("Mismatch in element_size offset in DISTR_ARRAY_RT decl\n"));
03198 FLD_flags(next) = 0;
03199 next = FLD_next(next);
03200 FLD_name(next) = Save_Str("distr");
03201 FLD_type(next) = arr_dim_struct_ty;
03202 FLD_ofst(next) = dart_offset_distr_n;
03203 FmtAssert (dart_offset_distr_n == TY_size(Be_Type_Tbl(MTYPE_I8))*3,
03204 ("Mismatch in element_size offset in DISTR_ARRAY_RT decl\n"));
03205 FLD_flags(next) = 0;
03206
03207 rt_struct_ty_idx = New_TY(TRUE);
03208 TY_kind(rt_struct_ty_idx) = KIND_STRUCT;
03209 TY_btype(rt_struct_ty_idx) = MTYPE_M;
03210 TY_name(rt_struct_ty_idx) = Save_Str("DISTR_ARRAY_RT");
03211 TY_flist(rt_struct_ty_idx) = field;
03212 TY_size(rt_struct_ty_idx) =
03213 dart_base_size*TY_size(Be_Type_Tbl(MTYPE_I8)) + TY_size(arr_dim_struct_ty);
03214 TY_align(rt_struct_ty_idx) = 8;
03215 Enter_TY (rt_struct_ty_idx);
03216 #endif
03217 distr_ty_entries[RT_struct] = rt_struct_ty_idx;
03218
03219
03220
03221 rt_ptr_ty = Make_Pointer_Type ( rt_struct_ty_idx);
03222 Set_TY_ptr_as_array(rt_ptr_ty);
03223 distr_ty_entries[RT_ptr] = rt_ptr_ty;
03224
03225
03226
03227
03228 DART_ptr_TY = rt_ptr_ty;
03229
03230
03231
03232
03233
03234
03235 distr_st_entries[HT_Push] =
03236 Declare_Func_Two_Arg (".__dsm_ht_push", "__dsm_ht_push",
03237 Be_Type_Tbl(MTYPE_V),
03238 voidpty, rt_ptr_ty);
03239
03240 distr_st_entries[HT_Pop] =
03241 Declare_Func_One_Arg (".__dsm_ht_pop", "__dsm_ht_pop",
03242 Be_Type_Tbl(MTYPE_V),
03243 voidpty);
03244
03245 distr_st_entries[HT_Top] =
03246 Declare_Func_One_Arg (".__dsm_ht_top", "__dsm_ht_top",
03247 rt_ptr_ty,
03248 voidpty);
03249
03250 distr_st_entries[HT_Check] =
03251 Declare_Func_One_Arg (".__dsm_ht_check", "__dsm_ht_check",
03252 rt_ptr_ty,
03253 voidpty);
03254
03255 distr_st_entries[HT_Replace] =
03256 Declare_Func_Two_Arg (".__dsm_ht_replace", "__dsm_ht_replace",
03257 Be_Type_Tbl(MTYPE_V),
03258 voidpty, rt_ptr_ty);
03259
03260 TY_IDX i8_ptr_ty = Make_Pointer_Type(Be_Type_Tbl(MTYPE_I8));
03261 distr_st_entries[Initialize_Dart] =
03262 Declare_Func_Two_Arg (".__dsm_initialize_dart", "__dsm_initialize_dart",
03263 Be_Type_Tbl(MTYPE_V),
03264 rt_ptr_ty, i8_ptr_ty);
03265
03266 distr_st_entries[Allocate_Dart] =
03267 Declare_Func_One_Arg (".__dsm_allocate_dart", "__dsm_allocate_dart",
03268 rt_ptr_ty,
03269 Be_Type_Tbl(MTYPE_I4));
03270
03271 distr_st_entries[Alloc_Reshape] =
03272 Declare_Func_One_Arg (".__dsm_alloc_reshaped_array", "__dsm_alloc_reshaped_array",
03273 voidppty,
03274 rt_ptr_ty);
03275
03276 distr_st_entries[Dealloc_Reshape] =
03277 Declare_Func_Two_Arg (".__dsm_dealloc_reshaped_array", "__dsm_dealloc_reshaped_array",
03278 Be_Type_Tbl(MTYPE_V),
03279 rt_ptr_ty, voidppty);
03280
03281 distr_st_entries[Migrate_Array] =
03282 Declare_Func_Two_Arg (".__dsm_migrate_array", "__dsm_migrate_array",
03283 Be_Type_Tbl(MTYPE_V),
03284 voidpty, rt_ptr_ty);
03285
03286 distr_st_entries[Unmigrate_Array] =
03287 Declare_Func_Two_Arg (".__dsm_unmigrate_array", "__dsm_unmigrate_array",
03288 Be_Type_Tbl(MTYPE_V),
03289 voidpty, rt_ptr_ty);
03290
03291 distr_st_entries[Migrate_Pages] =
03292 Declare_Func_Three_Arg (".__dsm_migrate_pages", "__dsm_migrate_pages",
03293 Be_Type_Tbl(MTYPE_V),
03294 voidpty,
03295 Be_Type_Tbl(MTYPE_I8),
03296 Be_Type_Tbl(MTYPE_I8));
03297
03298 distr_st_entries[mp_my_threadnum] =
03299 Declare_Func_Zero_Arg (".mp_my_threadnum", "mp_my_threadnum",
03300 Be_Type_Tbl(MTYPE_I4));
03301
03302 distr_st_entries[Proc_Pool_Push] =
03303 Declare_Func_Zero_Arg (".__dsm_proc_pool_push", "__dsm_proc_pool_push",
03304 Be_Type_Tbl(MTYPE_V));
03305
03306 distr_st_entries[Proc_Pool_Pop] =
03307 Declare_Func_Zero_Arg (".__dsm_proc_pool_pop", "__dsm_proc_pool_pop",
03308 Be_Type_Tbl(MTYPE_V));
03309
03310 TY_IDX ty_array[11];
03311 ty_array[0] = rt_ptr_ty;
03312 ty_array[1] = Be_Type_Tbl(MTYPE_I8);
03313 ty_array[2] = Be_Type_Tbl(MTYPE_I8);
03314 ty_array[3] = Be_Type_Tbl(MTYPE_I8);
03315 ty_array[4] = Be_Type_Tbl(MTYPE_I8);
03316 ty_array[5] = Be_Type_Tbl(MTYPE_I8);
03317 ty_array[6] = Be_Type_Tbl(MTYPE_I8);
03318 ty_array[7] = Be_Type_Tbl(MTYPE_I8);
03319 ty_array[8] = i8_ptr_ty;
03320 ty_array[9] = i8_ptr_ty;
03321 ty_array[10] = i8_ptr_ty;
03322
03323 distr_st_entries[Cyclic_Bounds] =
03324 Declare_Func_N_Arg (".__dsm_cyclic_bounds", "__dsm_cyclic_bounds",
03325 Be_Type_Tbl(MTYPE_V),
03326 11,
03327 ty_array);
03328
03329 distr_st_entries[Deallocate_Dart] =
03330 Declare_Func_One_Arg (".__dsm_deallocate_dart", "__dsm_deallocate_dart",
03331 Be_Type_Tbl(MTYPE_V),
03332 rt_ptr_ty);
03333
03334
03335 TY_IDX string_ty = Make_Pointer_Type(Be_Type_Tbl(MTYPE_U1));
03336 TY_IDX arg_ty[4] = {rt_ptr_ty, rt_ptr_ty, string_ty, string_ty};
03337
03338 distr_st_entries[Compare_Darts] =
03339 Declare_Func_N_Arg (".__dsm_ec_compare_darts",
03340 "__dsm_ec_compare_darts",
03341 Be_Type_Tbl(MTYPE_V),
03342 4,
03343 arg_ty);
03344
03345
03346 distr_st_entries[ECHT_Push] =
03347 Declare_Func_Two_Arg (".__dsm_echt_push", "__dsm_echt_push",
03348 Be_Type_Tbl(MTYPE_V),
03349 voidpty, voidpty);
03350
03351 distr_st_entries[ECHT_Pop] =
03352 Declare_Func_One_Arg (".__dsm_echt_pop", "__dsm_echt_pop",
03353 Be_Type_Tbl(MTYPE_V),
03354 voidpty);
03355
03356 #if 0
03357
03358
03359 distr_st_entries[ECHT_Check] =
03360 Declare_Func_One_Arg (".__dsm_echt_check", "__dsm_echt_check",
03361 voidpty,
03362 voidpty);
03363
03364 arg_ty[0] = arg_ty[1] = voidpty;
03365 distr_st_entries[ECHT_Compare] =
03366 Declare_Func_N_Arg (".__dsm_echt_compare", "__dsm_echt_compare",
03367 Be_Type_Tbl(MTYPE_V),
03368 4,
03369 arg_ty);
03370 #endif
03371 }