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 static const char *source_file = __FILE__;
00067
00068
00069
00070 #include "defs.h"
00071 #include "glob.h"
00072 #include "symtab.h"
00073 #include "errors.h"
00074 #include "wn.h"
00075 #include "wn_util.h"
00076 #include "ir_reader.h"
00077
00078
00079
00080 #include "cwh_defines.h"
00081 #include "cwh_stmt.h"
00082 #include "cwh_directive.h"
00083 #include "cwh_block.h"
00084 #include "cwh_block.i"
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 extern void
00095 cwh_block_push_block(WN *deferred, WN *append, BOOL is_top_pdo)
00096 {
00097 cwh_block_bump();
00098
00099 block_stack[block_stack_top].wn = cwh_block_current_inline();
00100 block_stack[block_stack_top].u.block.deferred = deferred;
00101 block_stack[block_stack_top].u.block.append = append;
00102
00103 if (parallel_do_count) {
00104 block_stack[block_stack_top].is_parallel_do = TRUE;
00105 parallel_do_count--;
00106
00107 } else {
00108 block_stack[block_stack_top].is_parallel_do = FALSE;
00109 }
00110
00111 block_stack[block_stack_top].is_top_pdo = is_top_pdo;
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126 extern void
00127 cwh_block_pop_block(void)
00128 {
00129 WN *block, *append;
00130 BOOL is_parallel_do, is_top_pdo;
00131
00132 DevAssert((block_stack_top >= 0),("block stack underflow"));
00133
00134 block = block_stack[block_stack_top].wn;
00135 is_parallel_do = block_stack[block_stack_top].is_parallel_do;
00136 is_top_pdo = block_stack[block_stack_top].is_top_pdo;
00137
00138 DevAssert((WN_opcode(block)!=OPC_REGION),("stack mismatch, expected BLOCK"));
00139
00140 if (block_stack[block_stack_top].u.block.deferred) {
00141 cwh_block_append(block_stack[block_stack_top].u.block.deferred);
00142 }
00143
00144 append = block_stack[block_stack_top].u.block.append;
00145 cwh_block_set_current(block);
00146 --block_stack_top;
00147
00148 if (append)
00149 cwh_block_append(append);
00150
00151
00152
00153
00154
00155 if (is_parallel_do && !is_top_pdo)
00156 cwh_block_pop_region();
00157 }
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167 extern WN *
00168 cwh_block_pop_region(void)
00169 {
00170 WN *region, *block;
00171 DevAssert((block_stack_top >= 0),("region stack underflow"));
00172
00173 region = block_stack[block_stack_top].wn;
00174 block = block_stack[block_stack_top].u.region_parent;
00175
00176 DevAssert((WN_opcode(region)==OPC_REGION),("stack mismatch, expected REGION"));
00177
00178 --block_stack_top;
00179
00180
00181
00182 cwh_block_set_current(block);
00183 return region;
00184 }
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200 extern WN *
00201 cwh_block_set_region_pragmas(BOOL assert)
00202 {
00203 int i;
00204 WN *wn;
00205 for (i=block_stack_top; i>=0; i--) {
00206 wn = block_stack[i].wn;
00207 if (WN_operator(wn)==OPR_REGION) {
00208 return (cwh_block_exchange_current(WN_region_pragmas(wn)));
00209 }
00210 }
00211
00212 if (assert) {
00213 DevAssert((0),("no enclosing region"));
00214 return cwh_block_current_inline() ;
00215 }
00216 return NULL;
00217 }
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228 extern void
00229 cwh_block_add_to_enclosing_regions(WN_PRAGMA_ID id, ST * st)
00230 {
00231 int i;
00232
00233 WN_VECTOR regions ;
00234
00235 DevAssert((id == WN_PRAGMA_LOCAL), ("only local required just now"));
00236
00237 for (i = block_stack_top; i>=0 ; i--) {
00238 WN * wn = block_stack[i].wn;
00239
00240 if (WN_operator(wn)==OPR_REGION) {
00241 if (WN_region_kind(wn) == REGION_KIND_MP)
00242 regions.insert(regions.end(),wn);
00243 }
00244 }
00245
00246 Add_Pragma_To_MP_Regions (®ions,
00247 id,
00248 st,
00249 0,
00250 0,
00251 FALSE);
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 extern void
00263 cwh_block_push_region(WN *region)
00264 {
00265 DevAssert((WN_opcode(region)==OPC_REGION),(" not region")) ;
00266
00267 cwh_block_bump();
00268
00269 block_stack[block_stack_top].wn = region;
00270 block_stack[block_stack_top].u.region_parent = cwh_block_current_inline();
00271 }
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 extern void
00282 cwh_block_dump(void)
00283 {
00284 WN * wn ;
00285 int i ;
00286
00287 printf ("\n Block Stack --- \n\n");
00288
00289 for (i = block_stack_top ; i >= 0 ; i-- ) {
00290
00291 wn = block_stack[i].wn ;
00292
00293 dump_wn(wn);
00294
00295 if (WN_opcode(wn) == OPC_REGION) {
00296
00297 printf (" parent %p \n",
00298 block_stack[i].u.region_parent);
00299
00300 } else {
00301
00302 printf (" deferred %p, append %p, pdo %d, top pdo %d \n",
00303 block_stack[i].u.block.deferred,
00304 block_stack[i].u.block.append,
00305 block_stack[i].is_parallel_do,
00306 block_stack[i].is_top_pdo);
00307 }
00308 }
00309 }
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321 static void
00322 cwh_block_bump(void)
00323 {
00324 ++block_stack_top;
00325
00326 if (block_stack_size == 0) {
00327
00328 block_stack = (block_stack_t *) malloc(BLOCK_CHUNK_SIZE * sizeof(block_stack_t));
00329 block_stack_size = BLOCK_CHUNK_SIZE;
00330
00331 } else if (block_stack_top >= block_stack_size) {
00332
00333 block_stack_size += BLOCK_CHUNK_SIZE;
00334 block_stack = (block_stack_t *) realloc(block_stack, block_stack_size * sizeof(block_stack_t));
00335 }
00336 }
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346 extern WN *
00347 cwh_block_current(void)
00348 {
00349 return WN_block;
00350 }
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361 extern void
00362 cwh_block_set_current(WN * blk )
00363 {
00364 WN_block = blk;
00365 }
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376 extern WN *
00377 cwh_block_new_and_current(void)
00378 {
00379 WN * wn ;
00380
00381 wn = cwh_block_current_inline();
00382 cwh_block_set_current(WN_CreateBlock()) ;
00383
00384 return (wn);
00385 }
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395 extern WN *
00396 cwh_block_exchange_current(WN * blk )
00397 {
00398 WN * rtrn = cwh_block_current_inline();
00399 cwh_block_set_current(blk);
00400 return rtrn;
00401 }
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412 extern void
00413 cwh_block_append(WN *wn)
00414 {
00415 cwh_block_append_given_block(wn,cwh_block_current_inline());
00416 }
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426 extern void
00427 cwh_block_append_given_block(WN *wn, WN* block)
00428 {
00429 if (WN_opcode(wn) != OPC_BLOCK) {
00430 if (cwh_block_add_debug_line)
00431 WN_Set_Linenum (wn, USRCPOS_srcpos(current_srcpos) );
00432 else
00433 WN_Set_Linenum (wn, 0);
00434 }
00435
00436 WN_INSERT_BlockLast(block,wn) ;
00437 }
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447 extern void
00448 cwh_block_insert_after(WN *wn, WN*in)
00449 {
00450
00451 if (cwh_block_add_debug_line)
00452 WN_Set_Linenum (in, USRCPOS_srcpos(current_srcpos) );
00453 else
00454 WN_Set_Linenum (in, 0);
00455
00456
00457 WN_INSERT_BlockAfter(cwh_block_current_inline(), wn, in);
00458 }
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473 extern void
00474 cwh_block_append_given_id(WN* wn, enum block_id id, BOOL first)
00475 {
00476 WN ** block ;
00477
00478 block = cwh_block_find_address(id) ;
00479
00480 if (!(*block))
00481 *block = WN_CreateBlock();
00482
00483
00484 if (first)
00485 WN_INSERT_BlockFirst(*block,wn);
00486 else
00487 WN_INSERT_BlockLast(*block,wn);
00488 }
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499 extern void
00500 cwh_block_append_given(enum block_id id)
00501 {
00502 WN ** block ;
00503
00504 block = cwh_block_find_address(id) ;
00505
00506 if (*block != NULL) {
00507 cwh_block_append(*block);
00508 *block = NULL;
00509 }
00510 }
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521 static WN **
00522 cwh_block_find_address(enum block_id id)
00523 {
00524 #ifdef KEY
00525 WN ** block = 0;
00526 #else
00527 WN ** block ;
00528 #endif
00529
00530 switch (id) {
00531 case Defer_Block:
00532 block = &WN_defer_block;
00533 break;
00534
00535 case Preamble_Block:
00536 block = &WN_copyin_block;
00537 break;
00538
00539 case First_Block:
00540 block = &WN_decl_block;
00541 break;
00542
00543 case Top_of_Loop_Block:
00544 block = &WN_top_of_loop_block;
00545 break;
00546
00547 default:
00548 DevAssert((0),("odd block"));
00549 }
00550 return block;
00551 }
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561 extern void
00562 cwh_block_init_pu()
00563 {
00564 WN_defer_block = NULL;
00565 WN_decl_block = NULL;
00566 WN_copyin_block = NULL;
00567 WN_top_of_loop_block = NULL;
00568 cwh_block_add_debug_line = FALSE;
00569
00570 }
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581 extern BOOL
00582 cwh_block_toggle_debug(BOOL debug)
00583 {
00584 BOOL old = cwh_block_add_debug_line;
00585 cwh_block_add_debug_line = debug;
00586 return old;
00587 }