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 #define __STDC_LIMIT_MACROS
00041 #include <stdint.h>
00042 #ifdef USE_PCH
00043 #include "be_com_pch.h"
00044 #endif
00045 #pragma hdrstop
00046 #include <sys/types.h>
00047 #if defined(BUILD_OS_DARWIN)
00048 #include <darwin_elf.h>
00049 #else
00050 #include <elf.h>
00051 #endif
00052 #include <stdio.h>
00053
00054 #define USE_STANDARD_TYPES
00055 #include "wn.h"
00056 #include "stab.h"
00057 #include "cxx_template.h"
00058 #include "cxx_memory.h"
00059 #include "anl_driver.h"
00060 #include "prompf.h"
00061 #include "ir_reader.h"
00062 #include "targ_sim.h"
00063
00064 #ifndef BUILD_SKIP_PROMPF
00065 #ifdef SHARED_BUILD
00066 #pragma weak New_Construct_Id
00067 #pragma weak Get_Next_Construct_Id
00068 #pragma weak Anl_File_Path
00069 #endif //SHARED_BUILD
00070 #else
00071 extern "C" INT64 Get_Next_Construct_Id()
00072 {
00073 FmtAssert(FALSE, ("NYI"));
00074 return 0;
00075 }
00076 extern "C" INT64 New_Construct_Id()
00077 {
00078 FmtAssert(FALSE, ("NYI"));
00079 return 0;
00080 }
00081 extern "C" const char* Anl_File_Path()
00082 {
00083 FmtAssert(FALSE, ("NYI"));
00084 return 0;
00085 }
00086 #endif
00087
00088 PROMPF_INFO* Prompf_Info = NULL;
00089 MEM_POOL PROMPF_pool;
00090 FILE* STDOUT = stdout;
00091
00092
00093
00094
00095
00096
00097
00098 PROMPF_CHAIN_TYPE prompf_chain[] = {
00099 MPF_CHAIN_INVALID,
00100 MPF_CHAIN_TRANSMIT,
00101 MPF_CHAIN_TRANSMIT,
00102 MPF_CHAIN_TRANSMIT,
00103 MPF_CHAIN_TRANSMIT,
00104 MPF_CHAIN_TRANSMIT,
00105 MPF_CHAIN_TRANSFORM,
00106 MPF_CHAIN_TRANSFORM,
00107 MPF_CHAIN_TRANSFORM,
00108 MPF_CHAIN_TRANSFORM,
00109 MPF_CHAIN_TRANSMIT,
00110 MPF_CHAIN_TRANSFORM,
00111 MPF_CHAIN_TRANSFORM,
00112 MPF_CHAIN_TRANSFORM,
00113 MPF_CHAIN_TRANSFORM,
00114 MPF_CHAIN_TRANSFORM,
00115 MPF_CHAIN_TRANSFORM,
00116 MPF_CHAIN_TRANSFORM,
00117 MPF_CHAIN_TRANSFORM,
00118 MPF_CHAIN_TRANSFORM,
00119 MPF_CHAIN_TRANSFORM,
00120 MPF_CHAIN_TRANSFORM,
00121 MPF_CHAIN_TRANSFORM,
00122 MPF_CHAIN_TRANSFORM,
00123 MPF_CHAIN_TRANSFORM,
00124 MPF_CHAIN_TRANSFORM,
00125 MPF_CHAIN_TRANSFORM,
00126 MPF_CHAIN_TRANSFORM,
00127 MPF_CHAIN_TRANSFORM,
00128 MPF_CHAIN_TRANSFORM,
00129 MPF_CHAIN_TRANSFORM,
00130 MPF_CHAIN_TRANSFORM,
00131 MPF_CHAIN_TRANSFORM,
00132 MPF_CHAIN_TRANSMIT,
00133 MPF_CHAIN_TRANSFORM,
00134 MPF_CHAIN_TRANSFORM,
00135 MPF_CHAIN_TRANSFORM,
00136 MPF_CHAIN_TRANSFORM,
00137 MPF_CHAIN_TRANSFORM,
00138 MPF_CHAIN_TRANSFORM,
00139 MPF_CHAIN_TRANSFORM,
00140 MPF_CHAIN_TRANSFORM,
00141 MPF_CHAIN_TRANSMIT,
00142 MPF_CHAIN_TRANSFORM,
00143 MPF_CHAIN_TRANSMIT,
00144 MPF_CHAIN_TRANSFORM,
00145 MPF_CHAIN_TRANSFORM,
00146 MPF_CHAIN_TRANSFORM,
00147 MPF_CHAIN_TRANSFORM,
00148 MPF_CHAIN_TRANSFORM,
00149 MPF_CHAIN_TRANSFORM,
00150 MPF_CHAIN_TRANSFORM,
00151 MPF_CHAIN_TRANSFORM,
00152 };
00153
00154
00155
00156
00157
00158
00159
00160 void PROMPF_LINES::Add_Lines(WN* wn_tree)
00161 {
00162 if (wn_tree == NULL)
00163 return;
00164
00165 if (OPCODE_has_next_prev(WN_opcode(wn_tree)))
00166 Add_Line(WN_linenum(wn_tree));
00167
00168 if (OPCODE_is_expression(WN_opcode(wn_tree)))
00169 return;
00170
00171 if (WN_opcode(wn_tree) == OPC_BLOCK) {
00172 for (WN* wn = WN_first(wn_tree); wn != NULL; wn = WN_next(wn))
00173 Add_Lines(wn);
00174 } else {
00175 INT i;
00176 for (i = 0; i < WN_kid_count(wn_tree); i++)
00177 Add_Lines(WN_kid(wn_tree, i));
00178 }
00179 }
00180
00181
00182
00183
00184
00185
00186
00187
00188 PROMPF_LINES::PROMPF_LINES(WN* wn_tree,
00189 MEM_POOL* pool):
00190 _pool(pool), _low(pool), _high(pool)
00191 {
00192 Add_Lines(wn_tree);
00193 }
00194
00195
00196
00197
00198
00199
00200
00201
00202 INT PROMPF_LINES::Sections()
00203 {
00204 FmtAssert(_low.Elements() == _high.Elements(),
00205 ("PROMPF_LINES::Sections: high and low range counts do not match"));
00206 return _low.Elements();
00207 }
00208
00209
00210
00211
00212
00213
00214
00215 INT PROMPF_LINES::Low(INT i)
00216 {
00217 FmtAssert(i >= 0 && i <= _low.Elements(),
00218 ("PROMPF_LINES::Low: Low part of section does not exist"));
00219 return _low.Bottom_nth(i);
00220 }
00221
00222
00223
00224
00225
00226
00227
00228 INT PROMPF_LINES::High(INT i)
00229 {
00230 FmtAssert(i >= 0 && i <= _high.Elements(),
00231 ("PROMPF_LINES::High: High part of section does not exist"));
00232 return _high.Bottom_nth(i);
00233 }
00234
00235
00236
00237
00238
00239
00240 void PROMPF_LINES::Print(FILE* fp)
00241 {
00242 INT i;
00243 for (i = 0; i < Sections(); i++) {
00244 fprintf(fp, "<%d:%d>", Low(i), High(i));
00245 if (i < Sections() - 1)
00246 fprintf(fp, ",");
00247 }
00248 }
00249
00250
00251
00252
00253
00254
00255
00256 INT PROMPF_LINES::Print_Compact(FILE* fp,
00257 BOOL print_brackets)
00258
00259 {
00260 INT field_count = 0;
00261 field_count += fprintf(fp, "lines ");
00262 if (print_brackets)
00263 fprintf(fp, "[");
00264 INT i;
00265 for (i = 0; i < Sections(); i++) {
00266 if (Low(i) == High(i))
00267 field_count += fprintf(fp, "%d", Low(i));
00268 else
00269 field_count += fprintf(fp, "%d-%d", Low(i), High(i));
00270 if (i < Sections() - 1)
00271 field_count += fprintf(fp, ",");
00272 }
00273 if (print_brackets)
00274 fprintf(fp, "]");
00275 return field_count;
00276 }
00277
00278
00279
00280
00281
00282
00283 void PROMPF_LINES::Add_Line(INT line)
00284 {
00285 FmtAssert(line >= 0,
00286 ("PROMPF_LINES::Add_Line: Line number should not be negative"));
00287 if (line == 0)
00288 return;
00289 if (Sections() == 0) {
00290 _low.Push(line);
00291 _high.Push(line);
00292 return;
00293 }
00294 INT i;
00295 for (i = 0; i < Sections(); i++) {
00296 if (line < Low(i))
00297 break;
00298 if (line >= Low(i) && line <= High(i)) {
00299 return;
00300 }
00301 }
00302 BOOL adjacent_low = i < Sections() && line == Low(i) - 1;
00303 BOOL adjacent_high = i > 0 && line == High(i-1) + 1;
00304 if (adjacent_low) {
00305 if (!adjacent_high) {
00306 _low.Bottom_nth(i)--;
00307 } else {
00308 _high.Bottom_nth(i-1) = High(i);
00309 STACK<INT> new_low(_pool);
00310 STACK<INT> new_high(_pool);
00311 INT replace_count = Sections() - i - 1;
00312 INT j;
00313 for (j = 0; j < replace_count; j++) {
00314 INT lowpop = _low.Pop();
00315 new_low.Push(lowpop);
00316 INT highpop = _high.Pop();
00317 new_high.Push(highpop);
00318 }
00319 _low.Pop();
00320 _high.Pop();
00321 for (j = 0; j < replace_count; j++) {
00322 INT newlowpop = new_low.Pop();
00323 _low.Push(newlowpop);
00324 INT newhighpop = new_high.Pop();
00325 _high.Push(newhighpop);
00326 }
00327 }
00328 } else {
00329 if (adjacent_high) {
00330 _high.Bottom_nth(i-1)++;
00331 } else {
00332 STACK<INT> new_low(_pool);
00333 STACK<INT> new_high(_pool);
00334 INT replace_count = Sections() - i;
00335 INT j;
00336 for (j = 0; j < replace_count; j++) {
00337 INT lowpop = _low.Pop();
00338 new_low.Push(lowpop);
00339 INT highpop = _high.Pop();
00340 new_high.Push(highpop);
00341 }
00342 _low.Push(line);
00343 _high.Push(line);
00344 for (j = 0; j < replace_count; j++) {
00345 INT newlowpop = new_low.Pop();
00346 _low.Push(newlowpop);
00347 INT newhighpop = new_high.Pop();
00348 _high.Push(newhighpop);
00349 }
00350 }
00351 }
00352 }
00353
00354
00355
00356
00357
00358
00359 INT PROMPF_TRANS::Old_Loop(INT i)
00360 {
00361 FmtAssert(i >= 0 && i < _old_loops.Elements(),
00362 ("PROMPF_TRANS::Old_Loop() index out of range"));
00363 return _old_loops.Bottom_nth(i);
00364 }
00365
00366
00367
00368
00369
00370
00371 INT PROMPF_TRANS::New_Loop(INT i)
00372 {
00373 FmtAssert(i >= 0 && i < _new_loops.Elements(),
00374 ("PROMPF_TRANS::New_Loop() index out of range"));
00375 return _new_loops.Bottom_nth(i);
00376 }
00377
00378
00379
00380
00381
00382
00383
00384
00385 INT PROMPF_TRANS::Prev_Loop(INT i)
00386 {
00387 FmtAssert(i >= 0 && i < _prev_loops.Elements(),
00388 ("PROMPF_TRANS::Prev_Loop() index out of range"));
00389 return _prev_loops.Bottom_nth(i);
00390 }
00391
00392
00393
00394
00395
00396
00397
00398 void PROMPF_TRANS::Add_Index_Name(char* index_name)
00399 {
00400 char* name = (char*) CXX_NEW_ARRAY(char, strlen(index_name) + 1, _pool);
00401 strcpy(name, index_name);
00402 _index_name = name;
00403 }
00404
00405
00406
00407
00408
00409
00410 void PROMPF_TRANS::Print(FILE* fp)
00411 {
00412 const INT MIDDLE_FIELD_COUNT = 30;
00413 switch (_type) {
00414 case MPF_UNKNOWN:
00415 fprintf(fp, "UNKNOWN ");
00416 break;
00417 case MPF_MARK_OMP:
00418 fprintf(fp, "MARK OMP ");
00419 break;
00420 case MPF_MARK_PREOPT:
00421 fprintf(fp, "MARK PREOPT ");
00422 break;
00423 case MPF_MARK_PRELNO:
00424 fprintf(fp, "MARK PRELNO ");
00425 break;
00426 case MPF_MARK_POSTLNO:
00427 fprintf(fp, "MARK POSTLNO ");
00428 break;
00429 case MPF_ELIMINATION:
00430 fprintf(fp, "ELIMINATION ");
00431 break;
00432 case MPF_FUSION:
00433 fprintf(fp, "FUSION ");
00434 break;
00435 case MPF_FISSION:
00436 fprintf(fp, "FISSION ");
00437 break;
00438 case MPF_DISTRIBUTION:
00439 fprintf(fp, "DISTRIBUTION ");
00440 break;
00441 case MPF_INTERCHANGE:
00442 fprintf(fp, "INTERCHANGE ");
00443 break;
00444 case MPF_PRE_PEEL:
00445 fprintf(fp, "PRE-LOOP PEELING ");
00446 break;
00447 case MPF_POST_PEEL:
00448 fprintf(fp, "POST-LOOP PEELING ");
00449 break;
00450 case MPF_MP_TILE:
00451 fprintf(fp, "MP TILE ");
00452 break;
00453 case MPF_DSM_TILE:
00454 fprintf(fp, "DSM TILE ");
00455 break;
00456 case MPF_DONEST_OUTER_TILE:
00457 fprintf(fp, "DONEST OUTER TILE ");
00458 break;
00459 case MPF_DONEST_MIDDLE_TILE:
00460 fprintf(fp, "DONEST MIDDLE TILE ");
00461 break;
00462 case MPF_DSM_LOCAL:
00463 fprintf(fp, "DSM LOCAL ");
00464 break;
00465 case MPF_DSM_IO:
00466 fprintf(fp, "DSM IO ");
00467 break;
00468 case MPF_SINGLE_PROCESS:
00469 fprintf(fp, "SINGLE PROCESS ");
00470 break;
00471 case MPF_MP_VERSION:
00472 fprintf(fp, "MP VERSION ");
00473 break;
00474 case MPF_PARALLEL_REGION:
00475 fprintf(fp, "PARALLEL REGION ");
00476 break;
00477 case MPF_HOIST_MESSY_BOUNDS:
00478 fprintf(fp, "HOIST MESSY BOUNDS ");
00479 break;
00480 case MPF_DOACROSS_SYNC:
00481 fprintf(fp, "DOACROSS SYNC ");
00482 break;
00483 case MPF_DOACROSS_OUTER_TILE:
00484 fprintf(fp, "DOACROSS OUTER TILE ");
00485 break;
00486 case MPF_DOACROSS_INNER_TILE:
00487 fprintf(fp, "DOACROSS INNER TILE ");
00488 break;
00489 case MPF_REMOVE_UNITY_TRIP:
00490 fprintf(fp, "REMOVE UNITY TRIP ");
00491 break;
00492 case MPF_CACHE_WINDDOWN:
00493 fprintf(fp, "CACHE WINDDOWN ");
00494 break;
00495 case MPF_INTERLEAVED_WINDDOWN:
00496 fprintf(fp, "INTERLEAVED WINDDOWN ");
00497 break;
00498 case MPF_GENERAL_VERSION:
00499 fprintf(fp, "GENERAL VERSION ");
00500 break;
00501 case MPF_CACHE_TILE:
00502 fprintf(fp, "CACHE TILE ");
00503 break;
00504 case MPF_REGISTER_WINDDOWN:
00505 fprintf(fp, "REGISTER WINDDOWN ");
00506 break;
00507 case MPF_REGISTER_SSTRIP:
00508 fprintf(fp, "REGISTER SSTRIP ");
00509 break;
00510 case MPF_REGISTER_TILE:
00511 fprintf(fp, "REGISTER TILE ");
00512 break;
00513 case MPF_REGISTER_STARTUP:
00514 fprintf(fp, "REGISTER STARTUP ");
00515 break;
00516 case MPF_REGISTER_SHUTDOWN:
00517 fprintf(fp, "REGISTER SHUTDOWN ");
00518 break;
00519 case MPF_SE_TILE:
00520 fprintf(fp, "SE TILE ");
00521 break;
00522 case MPF_SE_CACHE_TILE:
00523 fprintf(fp, "SE CACHE TILE ");
00524 break;
00525 case MPF_INNER_FISSION:
00526 fprintf(fp, "INNER FISSION ");
00527 break;
00528 case MPF_GATHER_SCATTER:
00529 fprintf(fp, "GATHER SCATTER ");
00530 break;
00531 case MPF_VINTR_FISSION:
00532 fprintf(fp, "VINTR FISSION ");
00533 break;
00534 case MPF_PREFETCH_VERSION:
00535 fprintf(fp, "PREFETCH VERSION ");
00536 break;
00537 case MPF_OMPL_SECTIONS_LOOP:
00538 fprintf(fp, "OMPL SECTIONS LOOP ");
00539 break;
00540 case MPF_OMPL_ELIM_SECTION:
00541 fprintf(fp, "OMPL ELIM SECTION ");
00542 break;
00543 case MPF_OMPL_ATOMIC_CSECTION:
00544 fprintf(fp, "OMPL ATOMIC CSECTION ");
00545 break;
00546 case MPF_OMPL_ATOMIC_SWAP:
00547 fprintf(fp, "OMPL ATOMIC SWAP ");
00548 break;
00549 case MPF_OMPL_ATOMIC_FETCHOP:
00550 fprintf(fp, "OMPL ATOMIC FETCHOP ");
00551 break;
00552 case MPF_OMPL_MASTER_IF:
00553 fprintf(fp, "OMPL MASTER IF ");
00554 break;
00555 case MPF_OMPL_FETCHOP_ATOMIC:
00556 fprintf(fp, "OMPL FETCHOP ATOMIC ");
00557 break;
00558 case MPF_F90_ARRAY_STMT:
00559 fprintf(fp, "F90 ARRAY STMT ");
00560 break;
00561 case MPF_OUTER_SHACKLE:
00562 fprintf(fp, "OUTER SHACKLE ");
00563 break;
00564 case MPF_INNER_SHACKLE:
00565 fprintf(fp, "INNER SHACKLE ");
00566 break;
00567 case MPF_PREOPT_CREATE:
00568 fprintf(fp, "PREOPT CREATE ");
00569 break;
00570 }
00571 INT field_count = 0;
00572 field_count += fprintf(fp, "(");
00573 INT i;
00574 for (i = 0; i < _old_loops.Elements(); i++) {
00575 field_count += fprintf(fp, "%d", _old_loops.Bottom_nth(i));
00576 if (i < _old_loops.Elements() - 1)
00577 field_count += fprintf(fp, ",");
00578 }
00579 field_count += fprintf(fp, ") -> (");
00580 for (i = 0; i < _new_loops.Elements(); i++) {
00581 field_count += fprintf(fp, "%d", _new_loops.Bottom_nth(i));
00582 if (i < _new_loops.Elements() - 1)
00583 field_count += fprintf(fp, ",");
00584 }
00585 field_count += fprintf(fp, ") ");
00586 for (i = field_count + 1; i < MIDDLE_FIELD_COUNT; i++)
00587 fprintf(fp, " ");
00588 fprintf(fp, "[");
00589 for (i = 0; i < _prev_loops.Elements(); i++) {
00590 fprintf(fp, "%d", _prev_loops.Bottom_nth(i));
00591 if (i < _prev_loops.Elements() - 1)
00592 fprintf(fp, ",");
00593 }
00594 fprintf(fp, "] ");
00595 for (i = 0; i < _old_lines.Elements(); i++) {
00596 _old_lines.Bottom_nth(i)->Print(fp);
00597 if (i < _old_lines.Elements() - 1)
00598 fprintf(fp, ",");
00599 }
00600 fprintf(fp, " ");
00601 for (i = 0; i < _new_lines.Elements(); i++) {
00602 _new_lines.Bottom_nth(i)->Print(fp);
00603 if (i < _new_lines.Elements() - 1)
00604 fprintf(fp, ",");
00605 }
00606 fprintf(fp, " ");
00607 if (_index_name != NULL)
00608 fprintf(fp, "\"%s\"", _index_name);
00609 fprintf(fp, "\n");
00610 }
00611
00612
00613
00614
00615
00616
00617
00618 void PROMPF_TRANS::Print_Compact(FILE* fp)
00619 {
00620 switch (_type) {
00621 case MPF_UNKNOWN:
00622 fprintf(fp, "UNKNOWN ");
00623 break;
00624 case MPF_MARK_OMP:
00625 fprintf(fp, "MARK OMP ");
00626 break;
00627 case MPF_MARK_PREOPT:
00628 fprintf(fp, "MARK PREOPT ");
00629 break;
00630 case MPF_MARK_PRELNO:
00631 fprintf(fp, "MARK PRELNO ");
00632 break;
00633 case MPF_MARK_POSTLNO:
00634 fprintf(fp, "MARK POSTLNO ");
00635 break;
00636 case MPF_ELIMINATION:
00637 fprintf(fp, "ELIMINATION ");
00638 break;
00639 case MPF_FUSION:
00640 fprintf(fp, "FUSION ");
00641 break;
00642 case MPF_FISSION:
00643 fprintf(fp, "FISSION ");
00644 break;
00645 case MPF_DISTRIBUTION:
00646 fprintf(fp, "DISTRIBUTION ");
00647 break;
00648 case MPF_INTERCHANGE:
00649 fprintf(fp, "INTERCHANGE ");
00650 break;
00651 case MPF_PRE_PEEL:
00652 fprintf(fp, "PRE_LOOP_PEELING ");
00653 break;
00654 case MPF_POST_PEEL:
00655 fprintf(fp, "POST_LOOP_PEELING ");
00656 break;
00657 case MPF_MP_TILE:
00658 fprintf(fp, "MP_TILE ");
00659 break;
00660 case MPF_DSM_TILE:
00661 fprintf(fp, "DSM_TILE ");
00662 break;
00663 case MPF_DONEST_OUTER_TILE:
00664 fprintf(fp, "DONEST_OUTER_TILE ");
00665 break;
00666 case MPF_DONEST_MIDDLE_TILE:
00667 fprintf(fp, "DONEST_MIDDLE_TILE ");
00668 break;
00669 case MPF_DSM_LOCAL:
00670 fprintf(fp, "DSM_LOCAL ");
00671 break;
00672 case MPF_DSM_IO:
00673 fprintf(fp, "DSM_IO ");
00674 break;
00675 case MPF_SINGLE_PROCESS:
00676 fprintf(fp, "SINGLE_PROCESS ");
00677 break;
00678 case MPF_MP_VERSION:
00679 fprintf(fp, "MP_VERSION ");
00680 break;
00681 case MPF_PARALLEL_REGION:
00682 fprintf(fp, "PARALLEL_REGION ");
00683 break;
00684 case MPF_HOIST_MESSY_BOUNDS:
00685 fprintf(fp, "HOIST_MESSY_BOUNDS ");
00686 break;
00687 case MPF_DOACROSS_SYNC:
00688 fprintf(fp, "DOACROSS_SYNC ");
00689 break;
00690 case MPF_DOACROSS_OUTER_TILE:
00691 fprintf(fp, "DOACROSS_OUTER_TILE ");
00692 break;
00693 case MPF_DOACROSS_INNER_TILE:
00694 fprintf(fp, "DOACROSS_INNER_TILE ");
00695 break;
00696 case MPF_REMOVE_UNITY_TRIP:
00697 fprintf(fp, "REMOVE_UNITY_TRIP ");
00698 break;
00699 case MPF_CACHE_WINDDOWN:
00700 fprintf(fp, "CACHE_WINDDOWN ");
00701 break;
00702 case MPF_INTERLEAVED_WINDDOWN:
00703 fprintf(fp, "INTERLEAVED_WINDDOWN ");
00704 break;
00705 case MPF_GENERAL_VERSION:
00706 fprintf(fp, "GENERAL_VERSION ");
00707 break;
00708 case MPF_CACHE_TILE:
00709 fprintf(fp, "CACHE_TILE ");
00710 break;
00711 case MPF_REGISTER_WINDDOWN:
00712 fprintf(fp, "REGISTER_WINDDOWN ");
00713 break;
00714 case MPF_REGISTER_SSTRIP:
00715 fprintf(fp, "REGISTER_SSTRIP ");
00716 break;
00717 case MPF_REGISTER_TILE:
00718 fprintf(fp, "REGISTER_TILE ");
00719 break;
00720 case MPF_REGISTER_STARTUP:
00721 fprintf(fp, "REGISTER_STARTUP ");
00722 break;
00723 case MPF_REGISTER_SHUTDOWN:
00724 fprintf(fp, "REGISTER_SHUTDOWN ");
00725 break;
00726 case MPF_SE_TILE:
00727 fprintf(fp, "SE_TILE ");
00728 break;
00729 case MPF_SE_CACHE_TILE:
00730 fprintf(fp, "SE_CACHE_TILE ");
00731 break;
00732 case MPF_INNER_FISSION:
00733 fprintf(fp, "INNER_FISSION ");
00734 break;
00735 case MPF_GATHER_SCATTER:
00736 fprintf(fp, "GATHER_SCATTER ");
00737 break;
00738 case MPF_VINTR_FISSION:
00739 fprintf(fp, "VINTR_FISSION ");
00740 break;
00741 case MPF_PREFETCH_VERSION:
00742 fprintf(fp, "PREFETCH_VERSION ");
00743 break;
00744 case MPF_OMPL_SECTIONS_LOOP:
00745 fprintf(fp, "OMPL_SECTIONS_LOOP ");
00746 break;
00747 case MPF_OMPL_ELIM_SECTION:
00748 fprintf(fp, "OMPL_ELIM_SECTION ");
00749 break;
00750 case MPF_OMPL_ATOMIC_CSECTION:
00751 fprintf(fp, "OMPL_ATOMIC_CSECTION ");
00752 break;
00753 case MPF_OMPL_ATOMIC_SWAP:
00754 fprintf(fp, "OMPL_ATOMIC_SWAP ");
00755 break;
00756 case MPF_OMPL_ATOMIC_FETCHOP:
00757 fprintf(fp, "OMPL_ATOMIC_FETCHOP ");
00758 break;
00759 case MPF_OMPL_MASTER_IF:
00760 fprintf(fp, "OMPL_MASTER_IF ");
00761 break;
00762 case MPF_OMPL_FETCHOP_ATOMIC:
00763 fprintf(fp, "OMPL_FETCHOP_ATOMIC ");
00764 break;
00765 case MPF_F90_ARRAY_STMT:
00766 fprintf(fp, "F90_ARRAY_STMT ");
00767 break;
00768 case MPF_OUTER_SHACKLE:
00769 fprintf(fp, "OUTER_SHACKLE ");
00770 break;
00771 case MPF_INNER_SHACKLE:
00772 fprintf(fp, "INNER_SHACKLE ");
00773 break;
00774 case MPF_PREOPT_CREATE:
00775 fprintf(fp, "PREOPT_CREATE ");
00776 break;
00777 }
00778 INT field_count = 0;
00779 INT i;
00780 for (i = 0; i < _old_loops.Elements(); i++) {
00781 field_count += fprintf(fp, "%d", _old_loops.Bottom_nth(i));
00782 if (_old_lines.Elements() > 0) {
00783 field_count += fprintf(fp, " ");
00784 field_count += _old_lines.Bottom_nth(i)->Print_Compact(fp);
00785 }
00786 if (i < _old_loops.Elements() - 1)
00787 field_count += fprintf(fp, ",");
00788 }
00789 if (_old_loops.Elements() > 0)
00790 field_count += fprintf(fp, " ");
00791 for (i = 0; i < _new_loops.Elements(); i++) {
00792 field_count += fprintf(fp, "%d", _new_loops.Bottom_nth(i));
00793 if (_new_lines.Elements() > 0) {
00794 field_count += fprintf(fp, " ");
00795 field_count += _new_lines.Bottom_nth(i)->Print_Compact(fp);
00796 }
00797 if (i < _new_loops.Elements() - 1)
00798 field_count += fprintf(fp, ",");
00799 }
00800 if (_index_name != NULL)
00801 fprintf(fp, " \"%s\"", _index_name);
00802 field_count += fprintf(fp, "\n");
00803 }
00804
00805
00806
00807
00808
00809
00810 void PROMPF_ID::Print(FILE* fp, INT entry)
00811 {
00812 switch (_type) {
00813 case MPID_FUNC_ENTRY:
00814 fprintf(fp, "FUNC ENTRY ");
00815 break;
00816 case MPID_DO_LOOP:
00817 fprintf(fp, "DO LOOP ");
00818 break;
00819 case MPID_PAR_REGION:
00820 fprintf(fp, "PARALLEL REGION ");
00821 break;
00822 case MPID_PAR_SECTION:
00823 fprintf(fp, "PARALLEL SECTION ");
00824 break;
00825 case MPID_SECTION:
00826 fprintf(fp, "SECTION ");
00827 break;
00828 case MPID_BARRIER:
00829 fprintf(fp, "BARRIER ");
00830 break;
00831 case MPID_SINGLE_PROCESS:
00832 fprintf(fp, "SINGLE PROCESS ");
00833 break;
00834 case MPID_CRITICAL_SECTION:
00835 fprintf(fp, "CRITICAL SECTION ");
00836 break;
00837 case MPID_MASTER:
00838 fprintf(fp, "MASTER ");
00839 break;
00840 case MPID_ORDERED:
00841 fprintf(fp, "ORDERED ");
00842 break;
00843 case MPID_PAR_SECTIONS:
00844 fprintf(fp, "PARALLEL SECTIONS ");
00845 break;
00846 case MPID_ATOMIC:
00847 fprintf(fp, "ATOMIC ");
00848 break;
00849 default:
00850 fprintf(fp, "<UNKNOWN> ");
00851 break;
00852 }
00853 fprintf(fp, "%s", _valid ? "OK " : " ");
00854 fprintf(fp, "(%d) [%d]\n", entry, _last_trans);
00855 }
00856
00857
00858
00859
00860
00861
00862
00863 void PROMPF_INFO::Add_Trans(PROMPF_TRANS* pt)
00864 {
00865 INT j;
00866 for (j = 0; j < pt->Old_Loop_Count(); j++) {
00867 INT old_loop = pt->Old_Loop(j);
00868 INT i;
00869 for (i = Last_Trans(); i >= 0; i--) {
00870 PROMPF_TRANS* ptt = Trans(i);
00871 INT k;
00872 for (k = 0; k < ptt->New_Loop_Count(); k++)
00873 if (ptt->New_Loop(k) == old_loop)
00874 break;
00875 if (k < ptt->New_Loop_Count()) {
00876 pt->Add_Prev_Loop(i);
00877 break;
00878 }
00879 }
00880 if (i == -1)
00881 pt->Add_Prev_Loop(-1);
00882 }
00883 _trans_stack.Push(pt);
00884 }
00885
00886
00887
00888
00889
00890
00891 PROMPF_TRANS* PROMPF_INFO::Remove_Trans()
00892 {
00893 return _trans_stack.Pop();
00894 }
00895
00896
00897
00898
00899
00900
00901
00902 static BOOL Is_Grandparent_Region(WN* wn_node,
00903 WN* wn_region)
00904 {
00905 if (wn_region == NULL)
00906 return FALSE;
00907 FmtAssert(WN_opcode(wn_region) == OPC_REGION,
00908 ("Is_Grandparent_Region: Expected a OPC_REGION"));
00909 WN* wn_first = WN_first(WN_region_body(wn_region));
00910 for (WN* wn = wn_first; wn != NULL; wn = WN_next(wn))
00911 if (wn == wn_node)
00912 return TRUE;
00913 return FALSE;
00914 }
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925 extern PROMPF_ID_TYPE Prompf_Id_Type(WN* wn_ref,
00926 WN* wn_region,
00927 BOOL* is_first)
00928 {
00929 if (is_first != NULL)
00930 *is_first = TRUE;
00931 OPCODE opc = WN_opcode(wn_ref);
00932 if (opc == OPC_FUNC_ENTRY)
00933 return MPID_FUNC_ENTRY;
00934 if (opc == OPC_REGION) {
00935 WN* wn_pragma = WN_first(WN_region_pragmas(wn_ref));
00936 if (wn_pragma != NULL && WN_opcode(wn_pragma) == OPC_PRAGMA) {
00937 switch (WN_pragma(wn_pragma)) {
00938 case WN_PRAGMA_DOACROSS:
00939 case WN_PRAGMA_PARALLEL_DO:
00940 case WN_PRAGMA_PDO_BEGIN:
00941 if (WN_pragma_arg1(wn_pragma) == 0)
00942 return MPID_DO_LOOP;
00943 break;
00944 case WN_PRAGMA_PARALLEL_BEGIN:
00945 return MPID_PAR_REGION;
00946 case WN_PRAGMA_PSECTION_BEGIN:
00947 return MPID_PAR_SECTION;
00948 case WN_PRAGMA_SINGLE_PROCESS_BEGIN:
00949 return MPID_SINGLE_PROCESS;
00950 case WN_PRAGMA_MASTER_BEGIN:
00951 return MPID_MASTER;
00952 case WN_PRAGMA_PARALLEL_SECTIONS:
00953 return MPID_PAR_SECTIONS;
00954 }
00955 }
00956 }
00957 if (opc == OPC_DO_LOOP) {
00958 if (Is_Grandparent_Region(wn_ref, wn_region)) {
00959 WN* wn_pragma = WN_first(WN_region_pragmas(wn_region));
00960 if (wn_pragma != NULL && WN_opcode(wn_pragma) == OPC_PRAGMA) {
00961 switch (WN_pragma(wn_pragma)) {
00962 case WN_PRAGMA_DOACROSS:
00963 case WN_PRAGMA_PARALLEL_DO:
00964 case WN_PRAGMA_PDO_BEGIN:
00965 if (WN_pragma_arg1(wn_pragma) == 0)
00966 if (is_first != NULL)
00967 *is_first = FALSE;
00968 }
00969 }
00970 }
00971 return MPID_DO_LOOP;
00972 }
00973 if (opc == OPC_PRAGMA || opc == OPC_XPRAGMA) {
00974 switch (WN_pragma(wn_ref)) {
00975 case WN_PRAGMA_PARALLEL_BEGIN:
00976 if (is_first != NULL)
00977 *is_first = FALSE;
00978 return MPID_PAR_REGION;
00979 case WN_PRAGMA_PSECTION_BEGIN:
00980 if (is_first != NULL)
00981 *is_first = FALSE;
00982 return MPID_PAR_SECTION;
00983 case WN_PRAGMA_SINGLE_PROCESS_BEGIN:
00984 if (is_first != NULL)
00985 *is_first = FALSE;
00986 return MPID_SINGLE_PROCESS;
00987 case WN_PRAGMA_MASTER_BEGIN:
00988 if (is_first != NULL)
00989 *is_first = FALSE;
00990 return MPID_MASTER;
00991 case WN_PRAGMA_PARALLEL_SECTIONS:
00992 if (is_first != NULL)
00993 *is_first = FALSE;
00994 return MPID_PAR_SECTIONS;
00995 case WN_PRAGMA_SECTION:
00996 return MPID_PAR_SECTION;
00997 case WN_PRAGMA_BARRIER:
00998 return MPID_BARRIER;
00999 case WN_PRAGMA_CRITICAL_SECTION_BEGIN:
01000 return MPID_CRITICAL_SECTION;
01001 case WN_PRAGMA_CRITICAL_SECTION_END:
01002 if (is_first != NULL)
01003 *is_first = FALSE;
01004 return MPID_CRITICAL_SECTION;
01005 case WN_PRAGMA_ORDERED_BEGIN:
01006 return MPID_ORDERED;
01007 case WN_PRAGMA_ORDERED_END:
01008 if (is_first != NULL)
01009 *is_first = FALSE;
01010 return MPID_ORDERED;
01011 case WN_PRAGMA_ATOMIC:
01012 return MPID_ATOMIC;
01013 }
01014 }
01015 return MPID_UNKNOWN;
01016 }
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027 static const char* Whirl_Symbol_Type(WN* wn)
01028 {
01029 WN* wn_symbol = NULL;
01030 OPCODE opc = WN_opcode(wn);
01031 OPERATOR opr = OPCODE_operator(opc);
01032 if (opc == OPC_PRAGMA || opc == OPC_XPRAGMA)
01033 return WN_pragmas[WN_pragma(wn)].name;
01034 wn_symbol = (opc == OPC_DO_LOOP) ? WN_index(wn) : (OPCODE_has_sym(opc))
01035 ? wn : NULL;
01036 if (wn_symbol == NULL)
01037 return (char *) (OPCODE_name(WN_opcode(wn)) + 4);
01038
01039 const ST* st = WN_st(wn_symbol);
01040 if (st == NULL)
01041 return NULL;
01042
01043 if (ST_class (st) != CLASS_PREG)
01044 return ST_name (st);
01045 else if (WN_offset(wn_symbol) > Last_Dedicated_Preg_Offset)
01046 return Preg_Name(WN_offset(wn_symbol));
01047 else
01048 return "DEDICATED PREG";
01049 }
01050
01051
01052
01053
01054
01055
01056
01057 void PROMPF_INFO::Prompf_Info_Traverse(WN* wn_tree,
01058 WN* wn_region)
01059 {
01060 INT32 map_id = WN_MAP32_Get(Prompf_Id_Map, wn_tree);
01061 BOOL is_first = FALSE;
01062 PROMPF_ID_TYPE pit = Prompf_Id_Type(wn_tree, wn_region, &is_first);
01063 if (map_id != 0) {
01064 INT i;
01065 for (i = Last_Id() + 1; i < map_id; i++) {
01066 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, FALSE, Last_Trans(), _pool),
01067 _pool));
01068 }
01069 if (is_first) {
01070 Add_Id(CXX_NEW(PROMPF_ID(pit, TRUE, -1, _pool), _pool));
01071 FmtAssert(map_id == Last_Id(),
01072 ("PROMPF_INFO: Prompf map ids not assigned consecutively"));
01073 } else {
01074 FmtAssert(map_id <= Last_Id() && Id(map_id)->Is_Valid(),
01075 ("PROMPF_INFO: Expected id %d to be already in table", map_id));
01076 }
01077 } else if (pit != MPID_UNKNOWN) {
01078 DevWarn("Missing Prompf Id for 0x%p %s", wn_tree,
01079 Whirl_Symbol_Type(wn_tree));
01080 }
01081
01082 if (WN_opcode(wn_tree) == OPC_BLOCK) {
01083 for (WN* wn = WN_first(wn_tree); wn != NULL; wn = WN_next(wn))
01084 Prompf_Info_Traverse(wn, wn_region);
01085 } else if (WN_opcode(wn_tree) == OPC_REGION) {
01086 INT i;
01087 for (i = 0; i < WN_kid_count(wn_tree); i++)
01088 Prompf_Info_Traverse(WN_kid(wn_tree, i), wn_tree);
01089 } else {
01090 INT i;
01091 for (i = 0; i < WN_kid_count(wn_tree); i++)
01092 Prompf_Info_Traverse(WN_kid(wn_tree, i), wn_region);
01093 }
01094 }
01095
01096
01097
01098
01099
01100
01101
01102 PROMPF_INFO::PROMPF_INFO(WN* wn_func, MEM_POOL* pool):
01103 _pool(pool),
01104 _enabled(FALSE),
01105 _first_id(WN_MAP32_Get(Prompf_Id_Map, wn_func)),
01106 _trans_stack(pool),
01107 _id_stack(pool),
01108 _trans_checkpoint(-1)
01109 {
01110 _trans_stack.Clear();
01111 _id_stack.Clear();
01112 Prompf_Info_Traverse(wn_func, NULL);
01113 INT i;
01114 for (i = Last_Id() + 1; i < Get_Next_Construct_Id(); i++) {
01115 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, FALSE, Last_Trans(), _pool),
01116 _pool));
01117 }
01118 }
01119
01120
01121
01122
01123
01124
01125
01126
01127 BOOL PROMPF_INFO::Check_Old_Ids(INT old_ids[],
01128 INT new_ids[],
01129 INT nloops)
01130 {
01131 INT i;
01132 for (i = 0; i < nloops; i++) {
01133 INT j;
01134 for (j = 0; j < nloops; j++)
01135 if (old_ids[i] == new_ids[j])
01136 break;
01137 if (j == nloops)
01138 return FALSE;
01139 }
01140 return TRUE;
01141 }
01142
01143
01144
01145
01146
01147
01148
01149
01150 BOOL PROMPF_INFO::Check_New_Ids(INT new_ids[],
01151 INT nloops)
01152 {
01153 INT last_id = Last_Id();
01154 INT i;
01155 for (i = last_id + 1; i <= last_id + nloops; i++) {
01156 INT j;
01157 for (j = 0; j < nloops; j++)
01158 if (new_ids[j] == i)
01159 break;
01160 if (j == nloops)
01161 return FALSE;
01162 }
01163 return TRUE;
01164 }
01165
01166
01167
01168
01169
01170
01171
01172 void PROMPF_INFO::Mark_F90_Lower()
01173 {
01174 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01175 pt->Set_Type(MPF_MARK_F90_LOWER);
01176 Add_Trans(pt);
01177 }
01178
01179
01180
01181
01182
01183
01184
01185 void PROMPF_INFO::Mark_Omp()
01186 {
01187 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01188 pt->Set_Type(MPF_MARK_OMP);
01189 Add_Trans(pt);
01190 }
01191
01192
01193
01194
01195
01196
01197
01198 void PROMPF_INFO::Mark_Preopt()
01199 {
01200 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01201 pt->Set_Type(MPF_MARK_PREOPT);
01202 Add_Trans(pt);
01203 }
01204
01205
01206
01207
01208
01209
01210
01211 void PROMPF_INFO::Mark_Prelno()
01212 {
01213 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01214 pt->Set_Type(MPF_MARK_PRELNO);
01215 Add_Trans(pt);
01216 }
01217
01218
01219
01220
01221
01222
01223
01224 void PROMPF_INFO::Mark_Postlno()
01225 {
01226 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01227 pt->Set_Type(MPF_MARK_POSTLNO);
01228 Add_Trans(pt);
01229 }
01230
01231
01232
01233
01234
01235
01236
01237 void PROMPF_INFO::Elimination(INT old_loop)
01238 {
01239 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01240 pt->Set_Type(MPF_ELIMINATION);
01241 pt->Add_Old_Loop(old_loop);
01242 Add_Trans(pt);
01243 Id(old_loop)->Set_Last_Trans(Last_Trans());
01244 Id(old_loop)->Invalidate();
01245 }
01246
01247
01248
01249
01250
01251
01252 void PROMPF_INFO::Undo_Elimination()
01253 {
01254 PROMPF_TRANS* pt = Remove_Trans();
01255 FmtAssert(pt->Type() == MPF_ELIMINATION,
01256 ("Undo_Elimination: Expected last transaction to be MPF_ELIMINATION"));
01257 Id(pt->Old_Loop(0))->Validate();
01258 Reset_Last_Trans(pt->Old_Loop(0));
01259 }
01260
01261
01262
01263
01264
01265
01266
01267 void PROMPF_INFO::Fusion(INT old_loops[],
01268 INT new_loop)
01269 {
01270 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01271 pt->Set_Type(MPF_FUSION);
01272 INT i;
01273 for (i = 0; i < 2; i++)
01274 pt->Add_Old_Loop(old_loops[i]);
01275 pt->Add_New_Loop(new_loop);
01276 Add_Trans(pt);
01277 Update_Id(new_loop, Last_Trans());
01278 for (i = 0; i < 2; i++) {
01279 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
01280 if (old_loops[i] != new_loop)
01281 Id(old_loops[i])->Invalidate();
01282 }
01283 }
01284
01285 void PROMPF_INFO::Reset_Last_Trans(INT old_id)
01286 {
01287 INT previous_trans = -1;
01288 INT j;
01289 for (j = Last_Trans() - 1; j >= 0; j--) {
01290 PROMPF_TRANS* ptt = Trans(j);
01291 INT k;
01292 for (k = 0; k < ptt->Old_Loop_Count(); k++)
01293 if (ptt->Old_Loop(k) == old_id)
01294 break;
01295 if (k < ptt->Old_Loop_Count()) {
01296 previous_trans = k;
01297 break;
01298 }
01299 for (k = 0; k < ptt->New_Loop_Count(); k++)
01300 if (ptt->New_Loop(k) == old_id)
01301 break;
01302 if (k < ptt->New_Loop_Count()) {
01303 previous_trans = k;
01304 break;
01305 }
01306 }
01307 Id(old_id)->Set_Last_Trans(previous_trans);
01308 }
01309
01310
01311
01312
01313
01314
01315 void PROMPF_INFO::Undo_Fusion()
01316 {
01317 PROMPF_TRANS* pt = Remove_Trans();
01318 FmtAssert(pt->Type() == MPF_FUSION,
01319 ("Undo_fusion: Expected last transaction to be MPF_FUSION"));
01320 INT new_loop = pt->New_Loop(0);
01321 INT i;
01322 for (i = 0; i < pt->Old_Loop_Count(); i++)
01323 if (pt->Old_Loop(i) != new_loop)
01324 Id(pt->Old_Loop(i))->Validate();
01325 for (i = 0; i < pt->Old_Loop_Count(); i++)
01326 Reset_Last_Trans(pt->Old_Loop(i));
01327 }
01328
01329
01330
01331
01332
01333
01334
01335
01336 void PROMPF_INFO::Fission(INT old_loops[],
01337 PROMPF_LINES* old_lines[],
01338 INT new_loops[],
01339 PROMPF_LINES* new_lines[],
01340 INT nloops)
01341 {
01342 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01343 pt->Set_Type(MPF_FISSION);
01344 INT i;
01345 for (i = 0; i < nloops; i++) {
01346 pt->Add_Old_Loop(old_loops[i]);
01347 pt->Add_Old_Lines(old_lines[i]);
01348 pt->Add_New_Loop(new_loops[i]);
01349 pt->Add_New_Lines(new_lines[i]);
01350 }
01351 Add_Trans(pt);
01352 Check_New_Ids(new_loops, nloops);
01353 for (i = 0; i < nloops; i++)
01354 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
01355 _pool));
01356 for (i = 0; i < nloops; i++)
01357 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
01358 for (i = 0; i < nloops; i++)
01359 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
01360 }
01361
01362
01363
01364
01365
01366
01367
01368
01369 void PROMPF_INFO::Distribution(INT old_loops[],
01370 PROMPF_LINES* old_lines[],
01371 INT new_loops[],
01372 PROMPF_LINES* new_lines[],
01373 INT nloops)
01374 {
01375 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01376 pt->Set_Type(MPF_DISTRIBUTION);
01377 INT i;
01378 for (i = 0; i < nloops; i++) {
01379 pt->Add_Old_Loop(old_loops[i]);
01380 pt->Add_Old_Lines(old_lines[i]);
01381 pt->Add_New_Loop(new_loops[i]);
01382 pt->Add_New_Lines(new_lines[i]);
01383 }
01384 Add_Trans(pt);
01385 Check_New_Ids(new_loops, nloops);
01386 for (i = 0; i < nloops; i++)
01387 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
01388 _pool));
01389 for (i = 0; i < nloops; i++)
01390 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
01391 for (i = 0; i < nloops; i++)
01392 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
01393 }
01394
01395
01396
01397
01398
01399
01400
01401
01402 void PROMPF_INFO::Interchange(INT old_loops[],
01403 INT new_loops[],
01404 INT nloops)
01405 {
01406 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01407 pt->Set_Type(MPF_INTERCHANGE);
01408 INT i;
01409 for (i = 0; i < nloops; i++)
01410 pt->Add_Old_Loop(old_loops[i]);
01411 for (i = 0; i < nloops; i++)
01412 pt->Add_New_Loop(new_loops[i]);
01413 Add_Trans(pt);
01414 for (i = 0; i < nloops; i++)
01415 Update_Id(new_loops[i], Last_Trans());
01416 for (i = 0; i < nloops; i++)
01417 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
01418 }
01419
01420
01421
01422
01423
01424
01425
01426
01427
01428 void PROMPF_INFO::Pre_Peel(INT old_loops[],
01429 INT new_loops[],
01430 INT nloops)
01431 {
01432 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01433 pt->Set_Type(MPF_PRE_PEEL);
01434 INT i;
01435 for (i = 0; i < nloops; i++)
01436 pt->Add_Old_Loop(old_loops[i]);
01437 for (i = 0; i < nloops; i++)
01438 pt->Add_New_Loop(new_loops[i]);
01439 Add_Trans(pt);
01440 Check_New_Ids(new_loops, nloops);
01441 for (i = 0; i < nloops; i++)
01442 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
01443 _pool));
01444 for (i = 0; i < nloops; i++)
01445 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
01446 for (i = 0; i < nloops; i++)
01447 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
01448 }
01449
01450
01451
01452
01453
01454
01455 void PROMPF_INFO::Undo_Pre_Peel()
01456 {
01457 PROMPF_TRANS* pt = Remove_Trans();
01458 FmtAssert(pt->Type() == MPF_PRE_PEEL,
01459 ("Undo_Pre_Peel: Expected last transaction to be MPF_PRE_PEEL"));
01460 INT i;
01461 for (i = 0; i < pt->New_Loop_Count(); i++)
01462 Remove_Id();
01463 for (i = 0; i < pt->Old_Loop_Count(); i++)
01464 Reset_Last_Trans(pt->Old_Loop(i));
01465 }
01466
01467
01468
01469
01470
01471
01472
01473
01474
01475 void PROMPF_INFO::Post_Peel(INT old_loops[],
01476 INT new_loops[],
01477 INT nloops)
01478 {
01479 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01480 pt->Set_Type(MPF_POST_PEEL);
01481 INT i;
01482 for (i = 0; i < nloops; i++)
01483 pt->Add_Old_Loop(old_loops[i]);
01484 for (i = 0; i < nloops; i++)
01485 pt->Add_New_Loop(new_loops[i]);
01486 Add_Trans(pt);
01487 Check_New_Ids(new_loops, nloops);
01488 for (i = 0; i < nloops; i++)
01489 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
01490 _pool));
01491 for (i = 0; i < nloops; i++)
01492 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
01493 for (i = 0; i < nloops; i++)
01494 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
01495 }
01496
01497
01498
01499
01500
01501
01502 void PROMPF_INFO::Undo_Post_Peel()
01503 {
01504 PROMPF_TRANS* pt = Remove_Trans();
01505 FmtAssert(pt->Type() == MPF_POST_PEEL,
01506 ("Undo_Post_Peel: Expected last transaction to be MPF_POST_PEEL"));
01507 INT i;
01508 for (i = 0; i < pt->New_Loop_Count(); i++)
01509 Remove_Id();
01510 for (i = 0; i < pt->Old_Loop_Count(); i++)
01511 Reset_Last_Trans(pt->Old_Loop(i));
01512 }
01513
01514
01515
01516
01517
01518
01519
01520
01521 void PROMPF_INFO::Mp_Tile(INT old_loop,
01522 INT new_loops[],
01523 INT nloops)
01524 {
01525 FmtAssert(nloops == 1 || nloops == 2,
01526 ("PROMPF_INFO::Mp_Tile: Only support 2D and 3D MP Tiling"));
01527 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01528 pt->Set_Type(MPF_MP_TILE);
01529 pt->Add_Old_Loop(old_loop);
01530 INT i;
01531 for (i = 0; i < nloops; i++)
01532 pt->Add_New_Loop(new_loops[i]);
01533 Add_Trans(pt);
01534 Check_New_Ids(new_loops, nloops);
01535 for (i = 0; i < nloops; i++)
01536 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
01537 _pool));
01538 Id(old_loop)->Set_Last_Trans(Last_Trans());
01539 for (i = 0; i < nloops; i++)
01540 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
01541 }
01542
01543
01544
01545
01546
01547
01548
01549 void PROMPF_INFO::Dsm_Tile(INT old_loop,
01550 INT new_loops[],
01551 INT nloops)
01552 {
01553 FmtAssert(nloops == 1 || nloops == 2,
01554 ("PROMPF_INFO::Mp_Tile: Only support 2D and 3D MP Tiling"));
01555 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01556 pt->Set_Type(MPF_DSM_TILE);
01557 pt->Add_Old_Loop(old_loop);
01558 INT i;
01559 for (i = 0; i < nloops; i++)
01560 pt->Add_New_Loop(new_loops[i]);
01561 Add_Trans(pt);
01562 Check_New_Ids(new_loops, nloops);
01563 for (i = 0; i < nloops; i++)
01564 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
01565 _pool));
01566 Id(old_loop)->Set_Last_Trans(Last_Trans());
01567 for (i = 0; i < nloops; i++)
01568 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
01569 }
01570
01571
01572
01573
01574
01575
01576
01577
01578 void PROMPF_INFO::Donest_Outer_Tile(INT old_loops[],
01579 INT new_loop,
01580 INT nloops)
01581 {
01582 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01583 pt->Set_Type(MPF_DONEST_OUTER_TILE);
01584 INT i;
01585 for (i = 0; i < nloops; i++)
01586 pt->Add_Old_Loop(old_loops[i]);
01587 pt->Add_New_Loop(new_loop);
01588 Add_Trans(pt);
01589 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool), _pool));
01590 for (i = 0; i < nloops; i++)
01591 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
01592 Id(new_loop)->Set_Last_Trans(Last_Trans());
01593 }
01594
01595
01596
01597
01598
01599
01600
01601
01602
01603
01604 void PROMPF_INFO::Donest_Middle_Tile(INT old_loop,
01605 INT new_loop)
01606 {
01607 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01608 pt->Set_Type(MPF_DONEST_MIDDLE_TILE);
01609 pt->Add_Old_Loop(old_loop);
01610 pt->Add_New_Loop(new_loop);
01611 Add_Trans(pt);
01612 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool), _pool));
01613 Id(old_loop)->Set_Last_Trans(Last_Trans());
01614 Id(new_loop)->Set_Last_Trans(Last_Trans());
01615 }
01616
01617
01618
01619
01620
01621
01622
01623
01624
01625 void PROMPF_INFO::Dsm_Local(INT new_loop,
01626 PROMPF_LINES* pl,
01627 char* index_name)
01628 {
01629 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01630 pt->Set_Type(MPF_DSM_LOCAL);
01631 pt->Add_New_Loop(new_loop);
01632 pt->Add_New_Lines(pl);
01633 pt->Add_Index_Name(index_name);
01634 Add_Trans(pt);
01635 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool), _pool));
01636 Id(new_loop)->Set_Last_Trans(Last_Trans());
01637 }
01638
01639
01640
01641
01642
01643
01644
01645
01646 void PROMPF_INFO::Dsm_Io(INT new_loop,
01647 INT linenum,
01648 char* index_name)
01649 {
01650 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01651 pt->Set_Type(MPF_DSM_IO);
01652 pt->Add_New_Loop(new_loop);
01653 PROMPF_LINES* pl = CXX_NEW(PROMPF_LINES(_pool), _pool);
01654 pl->Add_Line(linenum);
01655 pt->Add_New_Lines(pl);
01656 pt->Add_Index_Name(index_name);
01657 Add_Trans(pt);
01658 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool), _pool));
01659 Id(new_loop)->Set_Last_Trans(Last_Trans());
01660 }
01661
01662
01663
01664
01665
01666
01667
01668 void PROMPF_INFO::Single_Process(INT new_loop,
01669 PROMPF_LINES* pl)
01670 {
01671 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01672 pt->Set_Type(MPF_SINGLE_PROCESS);
01673 pt->Add_New_Loop(new_loop);
01674 pt->Add_New_Lines(pl);
01675 Add_Trans(pt);
01676 Add_Id(CXX_NEW(PROMPF_ID(MPID_SINGLE_PROCESS, TRUE, Last_Trans(), _pool),
01677 _pool));
01678 Id(new_loop)->Set_Last_Trans(Last_Trans());
01679 }
01680
01681
01682
01683
01684
01685
01686
01687
01688
01689 void PROMPF_INFO::Mp_Version(INT old_loops[],
01690 INT new_loops[],
01691 PROMPF_ID_TYPE id_type[],
01692 INT nloops)
01693 {
01694 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01695 pt->Set_Type(MPF_MP_VERSION);
01696 INT i;
01697 for (i = 0; i < nloops; i++)
01698 pt->Add_Old_Loop(old_loops[i]);
01699 for (i = 0; i < nloops; i++)
01700 pt->Add_New_Loop(new_loops[i]);
01701 Add_Trans(pt);
01702 Check_New_Ids(new_loops, nloops);
01703 for (i = 0; i < nloops; i++) {
01704 INT j;
01705 for (j = 0; j < i; j++)
01706 if (new_loops[j] == new_loops[i])
01707 break;
01708 if (j == i)
01709 Add_Id(CXX_NEW(PROMPF_ID(id_type[i], TRUE, Last_Trans(), _pool),
01710 _pool));
01711 }
01712 for (i = 0; i < nloops; i++)
01713 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
01714 for (i = 0; i < nloops; i++)
01715 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
01716 }
01717
01718
01719
01720
01721
01722
01723
01724
01725 void PROMPF_INFO::Parallel_Region(INT old_loop,
01726 INT new_loop)
01727 {
01728 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01729 pt->Set_Type(MPF_PARALLEL_REGION);
01730 pt->Add_Old_Loop(old_loop);
01731 pt->Add_New_Loop(new_loop);
01732 Add_Trans(pt);
01733 Add_Id(CXX_NEW(PROMPF_ID(MPID_PAR_REGION, TRUE, Last_Trans(), _pool),
01734 _pool));
01735 Id(new_loop)->Set_Last_Trans(Last_Trans());
01736 }
01737
01738
01739
01740
01741
01742
01743
01744
01745 void PROMPF_INFO::Hoist_Messy_Bounds(INT old_loops[],
01746 INT new_loops[],
01747 INT nloops)
01748 {
01749 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01750 pt->Set_Type(MPF_HOIST_MESSY_BOUNDS);
01751 INT i;
01752 for (i = 0; i < nloops; i++)
01753 pt->Add_Old_Loop(old_loops[i]);
01754 for (i = 0; i < nloops; i++)
01755 pt->Add_New_Loop(new_loops[i]);
01756 Add_Trans(pt);
01757 Check_New_Ids(new_loops, nloops);
01758 for (i = 0; i < nloops; i++)
01759 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
01760 _pool));
01761 for (i = 0; i < nloops; i++)
01762 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
01763 for (i = 0; i < nloops; i++)
01764 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
01765 }
01766
01767
01768
01769
01770
01771
01772
01773
01774 void PROMPF_INFO::Doacross_Sync(INT old_loop,
01775 INT new_loop)
01776 {
01777 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01778 pt->Set_Type(MPF_DOACROSS_SYNC);
01779 pt->Add_Old_Loop(old_loop);
01780 pt->Add_New_Loop(new_loop);
01781 Add_Trans(pt);
01782 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool), _pool));
01783 Id(old_loop)->Set_Last_Trans(Last_Trans());
01784 Id(new_loop)->Set_Last_Trans(Last_Trans());
01785 }
01786
01787
01788
01789
01790
01791
01792
01793
01794 void PROMPF_INFO::Doacross_Outer_Tile(INT old_loop,
01795 INT new_loop)
01796 {
01797 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01798 pt->Set_Type(MPF_DOACROSS_OUTER_TILE);
01799 pt->Add_Old_Loop(old_loop);
01800 pt->Add_New_Loop(new_loop);
01801 Add_Trans(pt);
01802 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool), _pool));
01803 Id(old_loop)->Set_Last_Trans(Last_Trans());
01804 Id(new_loop)->Set_Last_Trans(Last_Trans());
01805 }
01806
01807
01808
01809
01810
01811
01812
01813
01814 void PROMPF_INFO::Doacross_Inner_Tile(INT old_loop,
01815 INT new_loop)
01816 {
01817 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01818 pt->Set_Type(MPF_DOACROSS_INNER_TILE);
01819 pt->Add_Old_Loop(old_loop);
01820 pt->Add_New_Loop(new_loop);
01821 Add_Trans(pt);
01822 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool), _pool));
01823 Id(old_loop)->Set_Last_Trans(Last_Trans());
01824 Id(new_loop)->Set_Last_Trans(Last_Trans());
01825 }
01826
01827
01828
01829
01830
01831
01832
01833 void PROMPF_INFO::Remove_Unity_Trip(INT old_loop)
01834 {
01835 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01836 pt->Set_Type(MPF_REMOVE_UNITY_TRIP);
01837 pt->Add_Old_Loop(old_loop);
01838 Add_Trans(pt);
01839 Id(old_loop)->Set_Last_Trans(Last_Trans());
01840 Id(old_loop)->Invalidate();
01841 }
01842
01843
01844
01845
01846
01847
01848
01849
01850 void PROMPF_INFO::Cache_Winddown(INT old_loops[],
01851 INT new_loops[],
01852 INT nloops)
01853 {
01854 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01855 pt->Set_Type(MPF_CACHE_WINDDOWN);
01856 INT i;
01857 for (i = 0; i < nloops; i++)
01858 pt->Add_Old_Loop(old_loops[i]);
01859 for (i = 0; i < nloops; i++)
01860 pt->Add_New_Loop(new_loops[i]);
01861 Add_Trans(pt);
01862 Check_New_Ids(new_loops, nloops);
01863 for (i = 0; i < nloops; i++)
01864 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
01865 _pool));
01866 for (i = 0; i < nloops; i++)
01867 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
01868 for (i = 0; i < nloops; i++)
01869 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
01870 }
01871
01872
01873
01874
01875
01876
01877
01878
01879
01880 void PROMPF_INFO::Interleaved_Winddown(INT old_loops[],
01881 INT new_loops[],
01882 INT nloops)
01883 {
01884 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01885 pt->Set_Type(MPF_INTERLEAVED_WINDDOWN);
01886 INT i;
01887 for (i = 0; i < nloops; i++)
01888 pt->Add_Old_Loop(old_loops[i]);
01889 for (i = 0; i < nloops; i++)
01890 pt->Add_New_Loop(new_loops[i]);
01891 Add_Trans(pt);
01892 Check_New_Ids(new_loops, nloops);
01893 for (i = 0; i < nloops; i++)
01894 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
01895 _pool));
01896 for (i = 0; i < nloops; i++)
01897 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
01898 for (i = 0; i < nloops; i++)
01899 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
01900 }
01901
01902
01903
01904
01905
01906
01907
01908
01909 void PROMPF_INFO::General_Version(INT old_loops[],
01910 INT new_loops[],
01911 INT nloops)
01912 {
01913 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01914 pt->Set_Type(MPF_GENERAL_VERSION);
01915 INT i;
01916 for (i = 0; i < nloops; i++)
01917 pt->Add_Old_Loop(old_loops[i]);
01918 for (i = 0; i < nloops; i++)
01919 pt->Add_New_Loop(new_loops[i]);
01920 Add_Trans(pt);
01921 Check_New_Ids(new_loops, nloops);
01922 for (i = 0; i < nloops; i++)
01923 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
01924 _pool));
01925 for (i = 0; i < nloops; i++)
01926 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
01927 for (i = 0; i < nloops; i++)
01928 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
01929 }
01930
01931
01932
01933
01934
01935
01936
01937 void PROMPF_INFO::Cache_Tile(INT old_loop,
01938 INT new_loop)
01939 {
01940 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01941 pt->Set_Type(MPF_CACHE_TILE);
01942 pt->Add_Old_Loop(old_loop);
01943 pt->Add_New_Loop(new_loop);
01944 Add_Trans(pt);
01945 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool), _pool));
01946 Id(old_loop)->Set_Last_Trans(Last_Trans());
01947 Id(new_loop)->Set_Last_Trans(Last_Trans());
01948 }
01949
01950
01951
01952
01953
01954
01955
01956
01957 void PROMPF_INFO::Register_Winddown(INT old_loops[],
01958 INT new_loops[],
01959 INT nloops)
01960 {
01961 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01962 pt->Set_Type(MPF_REGISTER_WINDDOWN);
01963 INT i;
01964 for (i = 0; i < nloops; i++)
01965 pt->Add_Old_Loop(old_loops[i]);
01966 for (i = 0; i < nloops; i++)
01967 pt->Add_New_Loop(new_loops[i]);
01968 Add_Trans(pt);
01969 Check_New_Ids(new_loops, nloops);
01970 for (i = 0; i < nloops; i++)
01971 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
01972 _pool));
01973 for (i = 0; i < nloops; i++)
01974 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
01975 for (i = 0; i < nloops; i++)
01976 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
01977 }
01978
01979
01980
01981
01982
01983
01984
01985 void PROMPF_INFO::Register_SStrip(INT old_loops[],
01986 INT new_loops[],
01987 INT nloops)
01988 {
01989 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
01990 pt->Set_Type(MPF_REGISTER_SSTRIP);
01991 INT i;
01992 for (i = 0; i < nloops; i++)
01993 pt->Add_Old_Loop(old_loops[i]);
01994 for (i = 0; i < nloops; i++)
01995 pt->Add_New_Loop(new_loops[i]);
01996 Add_Trans(pt);
01997 Check_New_Ids(new_loops, nloops);
01998 for (i = 0; i < nloops; i++)
01999 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
02000 _pool));
02001 for (i = 0; i < nloops; i++)
02002 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
02003 for (i = 0; i < nloops; i++)
02004 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
02005 }
02006
02007
02008
02009
02010
02011
02012 void PROMPF_INFO::Register_Tile(INT loop)
02013 {
02014 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02015 pt->Set_Type(MPF_REGISTER_TILE);
02016 pt->Add_Old_Loop(loop);
02017 Add_Trans(pt);
02018 Id(loop)->Set_Last_Trans(Last_Trans());
02019 }
02020
02021
02022
02023
02024
02025
02026
02027 void PROMPF_INFO::Se_Tile(INT old_loop,
02028 INT new_loop)
02029 {
02030 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02031 pt->Set_Type(MPF_SE_TILE);
02032 pt->Add_Old_Loop(old_loop);
02033 pt->Add_New_Loop(new_loop);
02034 Add_Trans(pt);
02035 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
02036 _pool));
02037 Id(old_loop)->Set_Last_Trans(Last_Trans());
02038 Id(new_loop)->Set_Last_Trans(Last_Trans());
02039 }
02040
02041
02042
02043
02044
02045
02046
02047 void PROMPF_INFO::Se_Cache_Tile(INT old_loop,
02048 INT new_loop)
02049 {
02050 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02051 pt->Set_Type(MPF_SE_CACHE_TILE);
02052 pt->Add_Old_Loop(old_loop);
02053 pt->Add_New_Loop(new_loop);
02054 Add_Trans(pt);
02055 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool), _pool));
02056 Id(old_loop)->Set_Last_Trans(Last_Trans());
02057 Id(new_loop)->Set_Last_Trans(Last_Trans());
02058 }
02059
02060
02061
02062
02063
02064
02065
02066 void PROMPF_INFO::Register_Startup(INT old_loops[],
02067 INT new_loops[],
02068 INT nloops)
02069 {
02070 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02071 pt->Set_Type(MPF_REGISTER_STARTUP);
02072 INT i;
02073 for (i = 0; i < nloops; i++)
02074 pt->Add_Old_Loop(old_loops[i]);
02075 for (i = 0; i < nloops; i++)
02076 pt->Add_New_Loop(new_loops[i]);
02077 Add_Trans(pt);
02078 Check_New_Ids(new_loops, nloops);
02079 for (i = 0; i < nloops; i++)
02080 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
02081 _pool));
02082 for (i = 0; i < nloops; i++)
02083 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
02084 for (i = 0; i < nloops; i++)
02085 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
02086 }
02087
02088
02089
02090
02091
02092
02093
02094 void PROMPF_INFO::Register_Shutdown(INT old_loops[],
02095 INT new_loops[],
02096 INT nloops)
02097 {
02098 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02099 pt->Set_Type(MPF_REGISTER_SHUTDOWN);
02100 INT i;
02101 for (i = 0; i < nloops; i++)
02102 pt->Add_Old_Loop(old_loops[i]);
02103 for (i = 0; i < nloops; i++)
02104 pt->Add_New_Loop(new_loops[i]);
02105 Add_Trans(pt);
02106 Check_New_Ids(new_loops, nloops);
02107 for (i = 0; i < nloops; i++)
02108 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
02109 _pool));
02110 for (i = 0; i < nloops; i++)
02111 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
02112 for (i = 0; i < nloops; i++)
02113 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
02114 }
02115
02116
02117
02118
02119
02120
02121
02122 void PROMPF_INFO::Inner_Fission(INT old_loop,
02123 PROMPF_LINES* old_lines,
02124 INT new_loops[],
02125 PROMPF_LINES* new_lines[],
02126 INT nloops)
02127 {
02128 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02129 pt->Set_Type(MPF_INNER_FISSION);
02130 pt->Add_Old_Loop(old_loop);
02131 pt->Add_Old_Lines(old_lines);
02132 INT i;
02133 for (i = 0; i < nloops; i++) {
02134 pt->Add_New_Loop(new_loops[i]);
02135 pt->Add_New_Lines(new_lines[i]);
02136 }
02137 Add_Trans(pt);
02138 Check_New_Ids(new_loops, nloops);
02139 for (i = 0; i < nloops; i++)
02140 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
02141 _pool));
02142 Id(old_loop)->Set_Last_Trans(Last_Trans());
02143 for (i = 0; i < nloops; i++)
02144 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
02145 }
02146
02147
02148
02149
02150
02151
02152
02153 void PROMPF_INFO::Gather_Scatter(INT old_loop,
02154 PROMPF_LINES* old_lines,
02155 INT new_loops[],
02156 PROMPF_LINES* new_lines[],
02157 INT nloops)
02158 {
02159 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02160 pt->Set_Type(MPF_GATHER_SCATTER);
02161 pt->Add_Old_Loop(old_loop);
02162 pt->Add_Old_Lines(old_lines);
02163 INT i;
02164 for (i = 0; i < nloops; i++) {
02165 pt->Add_New_Loop(new_loops[i]);
02166 pt->Add_New_Lines(new_lines[i]);
02167 }
02168 Add_Trans(pt);
02169 Check_New_Ids(new_loops, nloops);
02170 for (i = 0; i < nloops; i++)
02171 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
02172 _pool));
02173 Id(old_loop)->Set_Last_Trans(Last_Trans());
02174 for (i = 0; i < nloops; i++)
02175 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
02176 }
02177
02178
02179
02180
02181
02182
02183
02184
02185 void PROMPF_INFO::Vintr_Fission(INT old_loop,
02186 PROMPF_LINES* old_lines,
02187 INT new_loops[],
02188 PROMPF_LINES* new_lines[],
02189 INT nloops)
02190 {
02191 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02192 pt->Set_Type(MPF_VINTR_FISSION);
02193 pt->Add_Old_Loop(old_loop);
02194 pt->Add_Old_Lines(old_lines);
02195 INT i;
02196 for (i = 0; i < nloops; i++) {
02197 pt->Add_New_Loop(new_loops[i]);
02198 pt->Add_New_Lines(new_lines[i]);
02199 }
02200 Add_Trans(pt);
02201 Check_New_Ids(new_loops, nloops);
02202 for (i = 0; i < nloops; i++)
02203 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
02204 _pool));
02205 Id(old_loop)->Set_Last_Trans(Last_Trans());
02206 for (i = 0; i < nloops; i++)
02207 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
02208 }
02209
02210
02211
02212
02213
02214
02215
02216
02217 void PROMPF_INFO::Prefetch_Version(INT old_loops[],
02218 INT new_loops[],
02219 INT nloops)
02220 {
02221 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02222 pt->Set_Type(MPF_PREFETCH_VERSION);
02223 INT i;
02224 for (i = 0; i < nloops; i++)
02225 pt->Add_Old_Loop(old_loops[i]);
02226 for (i = 0; i < nloops; i++)
02227 pt->Add_New_Loop(new_loops[i]);
02228 Add_Trans(pt);
02229 Check_New_Ids(new_loops, nloops);
02230 for (i = 0; i < nloops; i++)
02231 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool),
02232 _pool));
02233 for (i = 0; i < nloops; i++)
02234 Id(old_loops[i])->Set_Last_Trans(Last_Trans());
02235 for (i = 0; i < nloops; i++)
02236 Id(new_loops[i])->Set_Last_Trans(Last_Trans());
02237 }
02238
02239
02240
02241
02242
02243
02244
02245
02246 void PROMPF_INFO::Outer_Shackle(INT new_loop,
02247 PROMPF_LINES* pl,
02248 char* index_name)
02249 {
02250 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02251 pt->Set_Type(MPF_OUTER_SHACKLE);
02252 pt->Add_New_Loop(new_loop);
02253 pt->Add_New_Lines(pl);
02254 pt->Add_Index_Name(index_name);
02255 Add_Trans(pt);
02256 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool), _pool));
02257 Id(new_loop)->Set_Last_Trans(Last_Trans());
02258 }
02259
02260
02261
02262
02263
02264
02265
02266
02267 void PROMPF_INFO::Inner_Shackle(INT old_loop,
02268 INT new_loop)
02269 {
02270 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02271 pt->Set_Type(MPF_INNER_SHACKLE);
02272 pt->Add_Old_Loop(old_loop);
02273 pt->Add_New_Loop(new_loop);
02274 Add_Trans(pt);
02275 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool), _pool));
02276 Id(old_loop)->Set_Last_Trans(Last_Trans());
02277 Id(new_loop)->Set_Last_Trans(Last_Trans());
02278 }
02279
02280
02281
02282
02283
02284
02285
02286 void PROMPF_INFO::OMPL_Sections_To_Loop(INT old_id)
02287 {
02288 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02289 pt->Set_Type(MPF_OMPL_SECTIONS_LOOP);
02290 pt->Add_Old_Loop(old_id);
02291 Add_Trans(pt);
02292 Id(old_id)->Set_Last_Trans(Last_Trans());
02293 }
02294
02295
02296
02297
02298
02299
02300
02301
02302 void PROMPF_INFO::OMPL_Eliminate_Section(INT old_id)
02303 {
02304 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02305 pt->Set_Type(MPF_OMPL_ELIM_SECTION);
02306 pt->Add_Old_Loop(old_id);
02307 Add_Trans(pt);
02308 Id(old_id)->Set_Last_Trans(Last_Trans());
02309 Id(old_id)->Invalidate();
02310 }
02311
02312
02313
02314
02315
02316
02317
02318 void PROMPF_INFO::OMPL_Atomic_To_Critical_Section(INT old_id)
02319 {
02320 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02321 pt->Set_Type(MPF_OMPL_ATOMIC_CSECTION);
02322 pt->Add_Old_Loop(old_id);
02323 Add_Trans(pt);
02324 Id(old_id)->Set_Last_Trans(Last_Trans());
02325 }
02326
02327
02328
02329
02330
02331
02332
02333 void PROMPF_INFO::OMPL_Atomic_To_Swap(INT old_id)
02334 {
02335 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02336 pt->Set_Type(MPF_OMPL_ATOMIC_SWAP);
02337 pt->Add_Old_Loop(old_id);
02338 Add_Trans(pt);
02339 Id(old_id)->Set_Last_Trans(Last_Trans());
02340 Id(old_id)->Invalidate();
02341 }
02342
02343
02344
02345
02346
02347
02348
02349 void PROMPF_INFO::OMPL_Atomic_To_FetchAndOp(INT old_id)
02350 {
02351 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02352 pt->Set_Type(MPF_OMPL_ATOMIC_FETCHOP);
02353 pt->Add_Old_Loop(old_id);
02354 Add_Trans(pt);
02355 Id(old_id)->Set_Last_Trans(Last_Trans());
02356 Id(old_id)->Invalidate();
02357 }
02358
02359
02360
02361
02362
02363
02364
02365 void PROMPF_INFO::OMPL_Master_To_If(INT old_id)
02366 {
02367 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02368 pt->Set_Type(MPF_OMPL_MASTER_IF);
02369 pt->Add_Old_Loop(old_id);
02370 Add_Trans(pt);
02371 Id(old_id)->Set_Last_Trans(Last_Trans());
02372 Id(old_id)->Invalidate();
02373 }
02374
02375
02376
02377
02378
02379
02380
02381 void PROMPF_INFO::OMPL_Fetchop_Atomic(INT new_id,
02382 PROMPF_LINES* pl)
02383 {
02384 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02385 pt->Set_Type(MPF_OMPL_FETCHOP_ATOMIC);
02386 pt->Add_New_Loop(new_id);
02387 pt->Add_New_Lines(pl);
02388 Add_Trans(pt);
02389 Add_Id(CXX_NEW(PROMPF_ID(MPID_ATOMIC, TRUE, Last_Trans(), _pool),
02390 _pool));
02391 Id(new_id)->Set_Last_Trans(Last_Trans());
02392 }
02393
02394
02395
02396
02397
02398
02399
02400
02401 void PROMPF_INFO::F90_Array_Stmt(INT new_loop,
02402 PROMPF_LINES* pl,
02403 char* index_name)
02404 {
02405 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02406 pt->Set_Type(MPF_F90_ARRAY_STMT);
02407 pt->Add_New_Loop(new_loop);
02408 pt->Add_New_Lines(pl);
02409 pt->Add_Index_Name(index_name);
02410 Add_Trans(pt);
02411 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool), _pool));
02412 Id(new_loop)->Set_Last_Trans(Last_Trans());
02413 }
02414
02415
02416
02417
02418
02419
02420
02421
02422
02423 void PROMPF_INFO::Preopt_Create(INT new_loop,
02424 PROMPF_LINES* pl,
02425 char* index_name)
02426 {
02427 PROMPF_TRANS* pt = CXX_NEW(PROMPF_TRANS(_pool), _pool);
02428 pt->Set_Type(MPF_PREOPT_CREATE);
02429 pt->Add_New_Loop(new_loop);
02430 pt->Add_New_Lines(pl);
02431 pt->Add_Index_Name(index_name);
02432 Add_Trans(pt);
02433 Add_Id(CXX_NEW(PROMPF_ID(MPID_DO_LOOP, TRUE, Last_Trans(), _pool), _pool));
02434 Id(new_loop)->Set_Last_Trans(Last_Trans());
02435 }
02436
02437
02438
02439
02440
02441
02442 void PROMPF_INFO::Print(FILE* fp)
02443 {
02444 fprintf(fp, "TRANSFORMATION LIST:\n");
02445 INT i;
02446 for (i = 0; i < _trans_stack.Elements(); i++) {
02447 fprintf(fp, " %2d ", i);
02448 _trans_stack.Bottom_nth(i)->Print(fp);
02449 }
02450 fprintf(fp, "ID LIST:\n");
02451 for (i = First_Id(); i <= Last_Id(); i++) {
02452 fprintf(fp, " ");
02453 Id(i)->Print(fp, i);
02454 }
02455 if (_trans_checkpoint != -1)
02456 fprintf(fp, "CHECKPOINT: %d\n", _trans_checkpoint);
02457 }
02458
02459
02460
02461
02462
02463
02464
02465
02466
02467 static INT check_error_count = 0;
02468
02469 #define PM_ASSERT(a, b) \
02470 ((a) ? 0 : (fprintf b, fprintf(fp, "\n"), check_error_count++))
02471
02472 void PROMPF_INFO::Check_Traverse(FILE* fp,
02473 WN* wn_tree,
02474 BOOL ids[],
02475 WN* wn_region)
02476 {
02477 INT map_id = WN_MAP32_Get(Prompf_Id_Map, wn_tree);
02478 if (map_id != 0) {
02479 PM_ASSERT(map_id >= First_Id() && map_id <= Last_Id(),
02480 (fp, "PROMPF_INFO: Id in program out of range %d", map_id));
02481 if (map_id >= First_Id() && map_id <= Last_Id())
02482 ids[map_id - First_Id()] = TRUE;
02483 } else {
02484 BOOL is_first = FALSE;
02485 PM_ASSERT(Prompf_Id_Type(wn_tree, wn_region, &is_first) == MPID_UNKNOWN,
02486 (fp, "PROMPF_INFO: Missing Prompf Id for 0x%p %s",
02487 wn_tree, Whirl_Symbol_Type(wn_tree)));
02488 }
02489
02490 if (WN_opcode(wn_tree) == OPC_BLOCK) {
02491 for (WN* wn = WN_first(wn_tree); wn != NULL; wn = WN_next(wn))
02492 Check_Traverse(fp, wn, ids, wn_region);
02493 } else if (WN_opcode(wn_tree) == OPC_REGION) {
02494 INT i;
02495 for (i = 0; i < WN_kid_count(wn_tree); i++)
02496 Check_Traverse(fp, WN_kid(wn_tree, i), ids, wn_tree);
02497 } else {
02498 INT i;
02499 for (i = 0; i < WN_kid_count(wn_tree); i++)
02500 Check_Traverse(fp, WN_kid(wn_tree, i), ids, wn_region);
02501 }
02502 }
02503
02504
02505
02506
02507
02508
02509
02510
02511
02512 INT PROMPF_INFO::Check(FILE* fp,
02513 WN* wn_func)
02514 {
02515 INT check_error_count = 0;
02516 INT nids = Last_Id() - First_Id() + 1;
02517 INT* ids = CXX_NEW_ARRAY(BOOL, nids, _pool);
02518 INT i;
02519 for (i = 0; i < nids; i++)
02520 ids[i] = FALSE;
02521 Check_Traverse(fp, wn_func, ids, NULL);
02522 for (i = First_Id(); i < Last_Id(); i++) {
02523 PM_ASSERT(!Id(i)->Is_Valid() || ids[i - First_Id()],
02524 (fp, "PROMPF_INFO: Valid id %d not in program", i));
02525 PM_ASSERT(Id(i)->Is_Valid() || !ids[i - First_Id()],
02526 (fp, "PROMPF_INFO: Invalid id %d in program", i));
02527 }
02528 for (i = First_Id(); i < Last_Id(); i++) {
02529 INT j = Id(i)->Last_Trans();
02530 if (j != -1) {
02531 PM_ASSERT(j >= 0 && j <= Last_Trans(),
02532 (fp, "PROMPF_INFO: Trans Index %d out of range", j));
02533 PROMPF_TRANS* pt = Trans(j);
02534 if (Id(i)->Is_Valid()) {
02535 INT k;
02536 for (k = 0; k < pt->Old_Loop_Count(); k++)
02537 if (pt->Old_Loop(k) == i)
02538 break;
02539 if (k == pt->Old_Loop_Count()) {
02540 for (k = 0; k < pt->New_Loop_Count(); k++)
02541 if (pt->New_Loop(k) == i)
02542 break;
02543 PM_ASSERT(k != pt->New_Loop_Count(),
02544 (fp, "PROMPF_INFO: Trans Index %d does not match LHS or RHS", i));
02545 }
02546 } else {
02547 INT k;
02548 for (k = 0; k < pt->Old_Loop_Count(); k++)
02549 if (pt->Old_Loop(k) == i)
02550 break;
02551 PM_ASSERT(k != pt->Old_Loop_Count(),
02552 (fp, "PROMPF_INFO: Trans Index %d does not match LHS", i));
02553 }
02554 }
02555 }
02556 for (i = 0; i < Last_Trans(); i++) {
02557 PROMPF_TRANS* pt = Trans(i);
02558 PM_ASSERT(pt->Old_Loop_Count() == pt->Prev_Loop_Count(),
02559 (fp, "PROMPF_INFO: Old_Loop_Count != Prev_Loop_Count for trans %d", i));
02560 INT j;
02561 for (j = 0; j < pt->Prev_Loop_Count(); j++) {
02562 PM_ASSERT(pt->Prev_Loop(j) >= -1 && pt->Prev_Loop(j) <= Last_Trans(),
02563 (fp, "PROMPF_INFO: Prev_Loop(%d) for trans %d out of range", j, i));
02564 if (pt->Prev_Loop(j) >= 0) {
02565 PROMPF_TRANS* ptt = Trans(pt->Prev_Loop(j));
02566 INT k;
02567 for (k = 0; k < ptt->New_Loop_Count(); k++)
02568 if (ptt->New_Loop(k) == pt->Old_Loop(j))
02569 break;
02570 PM_ASSERT(k != ptt->New_Loop_Count(),
02571 (fp, "PROMPF_INFO: Prev_Loop(%d) for trans %d has no new loop match",
02572 j, i));
02573 }
02574 }
02575 }
02576 return check_error_count;
02577 }
02578
02579
02580
02581
02582
02583
02584
02585 static BOOL Is_Mark_Type(PROMPF_TRANS_TYPE ptt)
02586 {
02587 switch (ptt) {
02588 case MPF_MARK_OMP:
02589 case MPF_MARK_PREOPT:
02590 case MPF_MARK_PRELNO:
02591 case MPF_MARK_POSTLNO:
02592 return TRUE;
02593 default:
02594 return FALSE;
02595 }
02596 }
02597
02598
02599
02600
02601
02602
02603
02604 void PROMPF_INFO::Print_Compact(FILE *fp,
02605 PROMPF_TRANS_LOG ptl)
02606 {
02607 if (Last_Trans() == -1)
02608 return;
02609 INT i = 0;
02610 switch (ptl) {
02611 case PTL_F90_LOWER:
02612 for (i = 0; i <= Last_Trans(); i++)
02613 if (Trans(i)->Type() == MPF_MARK_F90_LOWER)
02614 break;
02615 if (i >= Last_Trans())
02616 break;
02617 fprintf(fp, "F90_LOWER_TRANSFORMATION_LOG_BEGIN\n");
02618 for (i++ ; i <= Last_Trans(); i++) {
02619 if (Is_Mark_Type(Trans(i)->Type()))
02620 break;
02621 Trans(i)->Print_Compact(fp);
02622 }
02623 fprintf(fp, "F90_LOWER_TRANSFORMATION_LOG_END\n\n");
02624 break;
02625 case PTL_OMP:
02626 for (i = 0; i <= Last_Trans(); i++)
02627 if (Trans(i)->Type() == MPF_MARK_OMP)
02628 break;
02629 if (i >= Last_Trans())
02630 break;
02631 fprintf(fp, "OMP_TRANSFORMATION_LOG_BEGIN\n");
02632 for (i++ ; i <= Last_Trans(); i++) {
02633 if (Is_Mark_Type(Trans(i)->Type()))
02634 break;
02635 Trans(i)->Print_Compact(fp);
02636 }
02637 fprintf(fp, "OMP_TRANSFORMATION_LOG_END\n\n");
02638 break;
02639 case PTL_PREOPT:
02640 for (i = 0; i <= Last_Trans(); i++)
02641 if (Trans(i)->Type() == MPF_MARK_PREOPT)
02642 break;
02643 if (i >= Last_Trans() || Is_Mark_Type(Trans(i+1)->Type()))
02644 break;
02645 fprintf(fp, "PREOPT_TRANSFORMATION_LOG_BEGIN\n");
02646 for (i++; i <= Last_Trans(); i++) {
02647 if (Is_Mark_Type(Trans(i)->Type()))
02648 break;
02649 Trans(i)->Print_Compact(fp);
02650 }
02651 fprintf(fp, "PREOPT_TRANSFORMATION_LOG_END\n\n");
02652 break;
02653 case PTL_PRELNO:
02654 for (i = 0; i <= Last_Trans(); i++)
02655 if (Trans(i)->Type() == MPF_MARK_PRELNO)
02656 break;
02657 if (i >= Last_Trans() || Is_Mark_Type(Trans(i+1)->Type()))
02658 break;
02659 fprintf(fp, "TRANSFORMATION_LOG_BEGIN\n");
02660 for (i++; i <= Last_Trans(); i++) {
02661 if (Is_Mark_Type(Trans(i)->Type()))
02662 break;
02663 Trans(i)->Print_Compact(fp);
02664 }
02665 fprintf(fp, "TRANSFORMATION_LOG_END\n\n");
02666 break;
02667 case PTL_POSTLNO:
02668 for (i = 0; i <= Last_Trans(); i++)
02669 if (Trans(i)->Type() == MPF_MARK_POSTLNO)
02670 break;
02671 if (i >= Last_Trans() || Is_Mark_Type(Trans(i+1)->Type()))
02672 break;
02673 fprintf(fp, "POST_TRANSFORMATION_LOG_BEGIN\n");
02674 for (i++; i <= Last_Trans(); i++) {
02675 if (Is_Mark_Type(Trans(i)->Type()))
02676 break;
02677 Trans(i)->Print_Compact(fp);
02678 }
02679 fprintf(fp, "POST_TRANSFORMATION_LOG_END\n\n");
02680 break;
02681 }
02682 }
02683
02684
02685
02686
02687
02688
02689 void PROMPF_INFO::Save()
02690 {
02691 FmtAssert(_trans_checkpoint == -1,
02692 ("PROMPF_INFO::Save: Transformation Checkpoint Already Saved"));
02693 _trans_checkpoint = Last_Trans();
02694 }
02695
02696
02697
02698
02699
02700
02701 void PROMPF_INFO::Restore()
02702 {
02703 FmtAssert(_trans_checkpoint != -1,
02704 ("PROMPF_INFO::Restore: Transformation Checkpoint Not Saved"));
02705 while (Last_Trans() > _trans_checkpoint) {
02706 PROMPF_TRANS* pt = Trans(Last_Trans());
02707 switch(pt->Type()) {
02708 case MPF_PRE_PEEL:
02709 Undo_Pre_Peel();
02710 break;
02711 case MPF_POST_PEEL:
02712 Undo_Post_Peel();
02713 break;
02714 case MPF_FUSION:
02715 Undo_Fusion();
02716 break;
02717 case MPF_ELIMINATION:
02718 Undo_Elimination();
02719 break;
02720 default:
02721 FmtAssert(FALSE, ("Restore: Cannot undo PROMPF transformation"));
02722 }
02723 }
02724 _trans_checkpoint = -1;
02725 }
02726
02727
02728
02729
02730
02731
02732 void PROMPF_INFO::Clear()
02733 {
02734 _trans_checkpoint = -1;
02735 }
02736
02737
02738
02739
02740
02741
02742
02743 static void Prompf_Assign_Ids_Traverse(WN* wn_old,
02744 WN* wn_new,
02745 STACK<WN*>* old_stack,
02746 STACK<WN*>* new_stack,
02747 BOOL copy_ids,
02748 INT max_ids)
02749 {
02750 if (old_stack->Elements() == max_ids)
02751 return;
02752 FmtAssert(old_stack->Elements() < max_ids,
02753 ("Prompf_Assign_Ids: Too many ids assigned"));
02754 FmtAssert(WN_opcode(wn_old) == WN_opcode(wn_new),
02755 ("Prompf_Assign_Ids: Cloned node type does not match original"));
02756 if (!OPCODE_is_scf(WN_opcode(wn_old)))
02757 return;
02758
02759 INT old_id = WN_MAP32_Get(Prompf_Id_Map, wn_old);
02760 INT new_id = WN_MAP32_Get(Prompf_Id_Map, wn_new);
02761 if (old_id != 0 && new_id == 0) {
02762 if (copy_ids) {
02763 WN_MAP32_Set(Prompf_Id_Map, wn_new, old_id);
02764 } else {
02765 INT new_id = New_Construct_Id();
02766 WN_MAP32_Set(Prompf_Id_Map, wn_new, new_id);
02767 }
02768 old_stack->Push(wn_old);
02769 new_stack->Push(wn_new);
02770 }
02771
02772 if (WN_opcode(wn_old) == OPC_BLOCK) {
02773 WN* wn2 = WN_first(wn_new);
02774 for (WN* wn1 = WN_first(wn_old); wn1 != NULL; wn1 = WN_next(wn1)) {
02775 Prompf_Assign_Ids_Traverse(wn1, wn2, old_stack, new_stack,
02776 copy_ids, max_ids);
02777 wn2 = WN_next(wn2);
02778 }
02779 } else {
02780 INT i;
02781 for (i = 0; i < WN_kid_count(wn_old); i++) {
02782 WN* wn1 = WN_kid(wn_old, i);
02783 WN* wn2 = WN_kid(wn_new, i);
02784 Prompf_Assign_Ids_Traverse(wn1, wn2, old_stack, new_stack,
02785 copy_ids, max_ids);
02786 }
02787 }
02788
02789 FmtAssert(old_stack->Elements() == new_stack->Elements(),
02790 ("Prompf_Assign_Ids: Old and new stacks must have same element count"));
02791 }
02792
02793
02794
02795
02796
02797
02798
02799
02800
02801
02802
02803
02804 extern void Prompf_Assign_Ids(WN* wn_old,
02805 WN* wn_new,
02806 STACK<WN*>* old_stack,
02807 STACK<WN*>* new_stack,
02808 BOOL copy_ids,
02809 INT max_ids)
02810 {
02811 Prompf_Assign_Ids_Traverse(wn_old, wn_new, old_stack, new_stack,
02812 copy_ids, max_ids);
02813 }