00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00349 #ifndef dep_graph_INCLUDED
00350 #define dep_graph_INCLUDED "dep_graph.h"
00351
00352 #ifdef _KEEP_RCS_ID
00353 static char *dep_graph_rcs_id = dep_graph_INCLUDED "$Revision: 1.2 $";
00354 #endif
00355
00356 #ifndef cxx_graph_INCLUDED
00357 #include "cxx_graph.h"
00358 #endif
00359 #ifndef graph_template_INCLUDED
00360 #include "graph_template.h"
00361 #endif
00362 #ifndef _defs_INCLUDED
00363 #include "cxx_memory.h"
00364 #endif
00365
00366 #ifdef LNO
00367 #ifndef dep_INCLUDED
00368 #include "dep.h"
00369 #endif
00370 #ifndef cxx_hash_INCLUDED
00371 #include "cxx_hash.h"
00372 #endif
00373 #endif
00374
00375 #ifndef LNO
00376 #ifndef dvector_INCLUDED
00377 #include "dvector.h"
00378 #endif
00379 #endif
00380
00381
00382 extern "C" {
00383 void *C_Dep_Graph(void);
00384 void Init_Dep_Graph(void *g);
00385 void Dealloc_Dep_Graph(void);
00386 void Depgraph_Write(void *depgraph, struct output_file *fl, WN_MAP off_map);
00387 void *Depgraph_Read(char *cur_addr, char *end_addr, char *wn_base);
00388
00389 void LNOPreserveMapPair(WN *orig, WN *wn1, WN *wn2);
00390 void LNOPruneMapsUsingParity(void);
00391 void LNOPrintDepGraph(FILE *fp);
00392 VINDEX16 LNOGetVertex(WN *wn);
00393
00394 BOOL WN_parity_independent(WN *wn1, WN *wn2);
00395
00396 BOOL LnoDependenceEdge(WN *wn1, WN *wn2, EINDEX16 *distance, DIRECTION *direction, BOOL *is_must, BOOL *status);
00397 }
00398
00399 enum DEP_GRAPH_TYPE {DEPV_ARRAY_ARRAY_GRAPH,LEVEL_ARRAY_GRAPH,DEP_ARRAY_GRAPH};
00400
00401 class ARRAY_VERTEX16 : public VERTEX16 {
00402 public:
00403 WN *Wn;
00404 ARRAY_VERTEX16(WN *wn) { Wn = wn;}
00405 friend class ARRAY_DIRECTED_GRAPH16;
00406 };
00407
00408 #define HAS_ALL_ZERO 0x0001
00409 #define HAS_SCALAR_FLOW 0x0002
00410 #define HAS_SCALAR_ANTI 0x0004
00411 #define HAS_SCALAR_OUTPUT 0x0008
00412 #define HAS_ARRAY_FLOW 0x0010
00413 #define HAS_ARRAY_ANTI 0x0020
00414 #define HAS_ARRAY_OUTPUT 0x0040
00415
00416 struct LEVEL_STRUCT {
00417 UINT8 Level;
00418 UINT16 Property;
00419 };
00420
00421 struct DEP_STRUCT {
00422 DEP Dep;
00423 mBOOL Is_Must;
00424 };
00425
00426 class ARRAY_EDGE16 : public EDGE16 {
00427 public:
00428 friend class ARRAY_DIRECTED_GRAPH16;
00429 union {
00430 class DEPV_ARRAY *Depv_Array;
00431 struct LEVEL_STRUCT Level_Info;
00432 DEP_STRUCT DEP_Struct;
00433 };
00434 };
00435
00436 #ifdef LNO
00437 class REFERENCE_LIST;
00438 typedef STACK<REFERENCE_LIST *> REF_LIST_STACK;
00439 typedef STACK<VINDEX16 > VINDEX16_STACK;
00440
00441 class VINDEX16P_LEX_COUNT {
00442 public:
00443 VINDEX16 *_vp;
00444 INT _lex_count;
00445 VINDEX16P_LEX_COUNT(VINDEX16 *vp, INT lex_count) {
00446 _vp = vp;
00447 _lex_count = lex_count;
00448 }
00449 };
00450
00451 #endif
00452
00453 class ARRAY_DIRECTED_GRAPH16 :
00454 public DIRECTED_GRAPH16<ARRAY_EDGE16,ARRAY_VERTEX16> {
00455 WN_MAP _map;
00456 DEP_GRAPH_TYPE _type;
00457 MEM_POOL *_pool;
00458 public:
00459 void Print(FILE *fp);
00460 ARRAY_DIRECTED_GRAPH16(mUINT16 num_v, mUINT16 num_e, WN_MAP map,
00461 DEP_GRAPH_TYPE type) :
00462 DIRECTED_GRAPH16<ARRAY_EDGE16,ARRAY_VERTEX16>(num_v,num_e) {
00463 _map=map;
00464 _type = type;
00465 _pool = NULL;
00466 }
00467
00468 MEM_POOL *Pool() { return _pool; }
00469
00470 void Erase_Graph();
00471
00472 EINDEX16 Add_Edge(VINDEX16 from, VINDEX16 to, DEP dep, BOOL is_must=FALSE) {
00473 Is_True(_type==DEP_ARRAY_GRAPH,
00474 ("Trying to add a dep edge to a non-dep graph"));
00475 EINDEX16 result =
00476 DIRECTED_GRAPH16<ARRAY_EDGE16,ARRAY_VERTEX16>::Add_Edge(from,to);
00477 if (result != 0) _e[result].DEP_Struct.Dep = dep;
00478 _e[result].DEP_Struct.Is_Must = is_must;
00479 return result;
00480 }
00481
00482 DEP Dep(EINDEX16 edge) {
00483 Is_True(_type==DEP_ARRAY_GRAPH,
00484 ("Trying to get a dep edge from a non-dep graph"));
00485 return(_e[edge].DEP_Struct.Dep);
00486 }
00487 BOOL Is_Must(EINDEX16 edge) {
00488 Is_True(_type==DEP_ARRAY_GRAPH,
00489 ("Trying to get a dep edge from a non-dep graph"));
00490 return(_e[edge].DEP_Struct.Is_Must);
00491 }
00492 void Set_Dep(EINDEX16 edge, DEP dep, BOOL is_must=FALSE) {
00493 Is_True(_type==DEP_ARRAY_GRAPH,
00494 ("Trying to set a dep edge in a non-dep graph"));
00495 _e[edge].DEP_Struct.Dep = dep;
00496 _e[edge].DEP_Struct.Is_Must = is_must;
00497 }
00498
00499 VINDEX16 Add_Vertex(WN *wn) {
00500 VINDEX16 result =
00501 DIRECTED_GRAPH16<ARRAY_EDGE16,ARRAY_VERTEX16>::Add_Vertex();
00502 if (result != 0) {
00503 _v[result].Wn = wn;
00504 WN_MAP_Set(_map,wn, (void *) (INTPTR)(UINT) result);
00505 }
00506 return result;
00507 }
00508
00509 void Remove_Edge(EINDEX16 e) {
00510 DIRECTED_GRAPH16<ARRAY_EDGE16,ARRAY_VERTEX16>::Delete_Edge(e);
00511 }
00512
00513 VINDEX16 Get_Vertex(WN *wn) {
00514 return (VINDEX16) (UINT) (INTPTR) WN_MAP_Get(_map,wn);
00515 }
00516
00517 VINDEX16 Get_Vertex() {
00518 return DIRECTED_GRAPH16<ARRAY_EDGE16,ARRAY_VERTEX16>::Get_Vertex();
00519 }
00520
00521 void Delete_Vertex(VINDEX16 v) {
00522 WN_MAP_Set(_map, _v[v].Wn, NULL);
00523 DIRECTED_GRAPH16<ARRAY_EDGE16,ARRAY_VERTEX16>::Delete_Vertex(v);
00524 }
00525
00526 WN* Get_Wn(VINDEX16 v) {
00527 return _v[v].Wn;
00528 }
00529
00530 void Set_Wn(VINDEX16 v, WN* wn) {
00531 _v[v].Wn=wn;
00532 WN_MAP_Set(_map, _v[v].Wn, (void*)(INTPTR)(UINT)v);
00533 }
00534
00535 void Delete_Vertex(WN *wn) {
00536 Delete_Vertex(Get_Vertex(wn));
00537 }
00538
00539 void Clear_Map_For_Vertex(VINDEX16 v) {
00540 WN_MAP_Set(_map, _v[v].Wn, NULL);
00541 _v[v].Wn=NULL;
00542 }
00543
00544 void Clear_Map() {
00545 VINDEX16 v=Get_Vertex();
00546 while (v!=0) {
00547 Clear_Map_For_Vertex(v);
00548 v=Get_Next_Vertex(v);
00549 }
00550 }
00551
00552 mBOOL Copy_Vertex(VINDEX16 v1, VINDEX16 v2) {
00553 Is_True(_type==DEP_ARRAY_GRAPH,
00554 ("Copy_Vertex only works on DEP_ARRAY_GRAPH"));
00555 if (v2 != 0) {
00556 EINDEX16 e=Get_Out_Edge(v2);
00557 while (e) {
00558 EINDEX16 e1=Get_Next_Out_Edge(e);
00559 Remove_Edge(e);
00560 e=e1;
00561 }
00562 e=Get_In_Edge(v2);
00563 while (e) {
00564 EINDEX16 e1=Get_Next_In_Edge(e);
00565 Remove_Edge(e);
00566 e=e1;
00567 }
00568 e=Get_Out_Edge(v1);
00569 while (e) {
00570 VINDEX16 to=Get_Sink(e);
00571 if (!Add_Edge(v2,to,_e[e].DEP_Struct.Dep,_e[e].DEP_Struct.Is_Must)) {
00572 return 0;
00573 }
00574 e=Get_Next_Out_Edge(e);
00575 }
00576 e=Get_In_Edge(v1);
00577 while (e) {
00578 VINDEX16 source=Get_Source(e);
00579 if (!Add_Edge(source,v2,_e[e].DEP_Struct.Dep,_e[e].DEP_Struct.Is_Must)) {
00580 return 0;
00581 }
00582 e=Get_Next_In_Edge(e);
00583 }
00584 }
00585 return 1;
00586 }
00587
00588
00589 void PreserveMapPair(WN *orig, WN *wn1, WN *wn2)
00590 {
00591 VINDEX16 origV;
00592 Is_True((Get_Vertex(wn1)==0),("Dep_PreserveMapPair(): unexpected map"));
00593 Is_True((Get_Vertex(wn2)==0),("Dep_PreserveMapPair(): unexpected map"));
00594
00595 if (origV = Get_Vertex(orig))
00596 {
00597 VINDEX16 v1 = Get_Vertex(wn1);
00598 VINDEX16 v2 = Get_Vertex(wn2);
00599
00600 if (v1 == 0)
00601 v1 = Add_Vertex(wn1);
00602
00603 if (v2 == 0)
00604 v2 = Add_Vertex(wn2);
00605
00606 Copy_Vertex(origV, v1);
00607 Copy_Vertex(origV, v2);
00608 }
00609 }
00610
00611 void PruneMapsUsingParity(void);
00612
00613
00614 #ifdef LNO
00615 INT Build(WN *func_nd,MEM_POOL *pool=0);
00616 INT Build(ARRAY_DIRECTED_GRAPH16 *da_graph);
00617 EINDEX16 Add_Edge(VINDEX16 from, VINDEX16 to, DEPV_ARRAY *array) {
00618 Is_True(_type==DEPV_ARRAY_ARRAY_GRAPH,
00619 ("Trying to add a DEPV_ARRAY edge to a non-DEPV_ARRAY graph"));
00620 Is_True(!Get_Edge(from,to),("Duplicate edge in Add_Edge \n"));
00621 Is_True(array,("Null array in Add_Edge"));
00622 if (!array) return (EINDEX16) 0;
00623 EINDEX16 result =
00624 DIRECTED_GRAPH16<ARRAY_EDGE16,ARRAY_VERTEX16>::Add_Edge(from,to);
00625 if (result != 0) _e[result].Depv_Array = array;
00626 return result;
00627 }
00628 EINDEX16 Add_Edge(VINDEX16 from, VINDEX16 to, UINT8 level) {
00629 Is_True(_type==LEVEL_ARRAY_GRAPH,
00630 ("Trying to add a level edge to a non-level graph"));
00631 EINDEX16 result =
00632 DIRECTED_GRAPH16<ARRAY_EDGE16,ARRAY_VERTEX16>::Add_Edge(from,to);
00633 if (result != 0) _e[result].Level_Info.Level = level;
00634 return result;
00635 }
00636 BOOL Add_Edge(WN *ref1, const DOLOOP_STACK *s1,
00637 WN *ref2, const DOLOOP_STACK *s2,
00638 BOOL s1_lex_before_s2, BOOL use_bounds=TRUE);
00639 BOOL Add_Edge_Stars(WN *ref1, const DOLOOP_STACK *s1,
00640 WN *ref2, const DOLOOP_STACK *s2,
00641 BOOL s1_lex_before_s2, BOOL pos_only=FALSE);
00642 BOOL Add_Edge_Equals(WN *ref1, const DOLOOP_STACK *s1,
00643 WN *ref2, const DOLOOP_STACK *s2);
00644
00645 DEPV_ARRAY *Depv_Array(EINDEX16 edge) {
00646 Is_True(_type==DEPV_ARRAY_ARRAY_GRAPH,
00647 ("Trying to get a DEPV_ARRAY edge from a non-DEPV_ARRAY graph"));
00648 return(_e[edge].Depv_Array);
00649 }
00650
00651 void Set_Depv_Array(EINDEX16 edge, DEPV_ARRAY* newdv) {
00652 Is_True(_type==DEPV_ARRAY_ARRAY_GRAPH,
00653 ("Trying to set a DEPV_ARRAY edge in a non-DEPV_ARRAY graph"));
00654 _e[edge].Depv_Array = newdv;
00655 }
00656
00657 UINT8 Level(EINDEX16 edge) {
00658 Is_True(_type==LEVEL_ARRAY_GRAPH,
00659 ("Trying to get a level edge from a non-level graph"));
00660 return(_e[edge].Level_Info.Level);
00661 }
00662
00663 void Set_Level(EINDEX16 edge, UINT8 level) {
00664 Is_True(_type==LEVEL_ARRAY_GRAPH,
00665 ("Trying to set a level edge in a non-level graph"));
00666 _e[edge].Level_Info.Level = level;
00667 }
00668
00669
00670 void Delete_Array_Edge(EINDEX16 e) {
00671 Is_True(_type==DEPV_ARRAY_ARRAY_GRAPH,
00672 ("Trying to delete a DEPV_ARRAY edge from a non-DEPV_ARRAY graph"));
00673 Delete_DEPV_ARRAY(_e[e].Depv_Array,_pool);
00674 DIRECTED_GRAPH16<ARRAY_EDGE16,ARRAY_VERTEX16>::Delete_Edge(e);
00675 }
00676
00677
00678 void Set_Level_Property(EINDEX16 e, UINT16 property) {
00679 _e[e].Level_Info.Property |= property;
00680 }
00681
00682 BOOL Get_Level_Property(EINDEX16 e, UINT16 property) {
00683 return ((_e[e].Level_Info.Property & property) != 0);
00684 }
00685
00686 INT Add_Deps_To_Copy_Block(WN *orig, WN *copy, BOOL keep_internal_edge=TRUE);
00687 INT Unrolled_Dependences_Update(WN** bodies, UINT u, UINT loopno);
00688 void Fission_Dep_Update(WN* in_loop,UINT32 total_loops);
00689 INT Fission_Dep_Update(WN* in_loop,UINT32 total_loops, UINT fission_depth);
00690 void Fission_Dep_Update_R(WN* wn,WN *in_loop,UINT depth);
00691 INT Build_Region(WN* start, WN* end,DOLOOP_STACK *stack,BOOL rebuild=FALSE, BOOL skip_bad=FALSE);
00692 BOOL Versioned_Dependences_Update (WN* body_orig, WN* body_new, UINT loopno,
00693 WN_MAP version_map);
00694 void Versioned_Create_Vertices (WN* body_orig, WN* body_new);
00695 BOOL Versioned_Dependences_Update_E (WN *body_orig,
00696 WN* body_new,
00697 WN* root_orig,
00698 WN* root_new,
00699 UINT loopno,
00700 WN_MAP version_map);
00701
00702 #ifdef Is_True_On
00703 void Check_Graph();
00704 #endif
00705 #endif
00706
00707 private:
00708
00709 #ifdef LNO
00710 void Add_Must();
00711 void Set_Must(EINDEX16 edge) {
00712 _e[edge].DEP_Struct.Is_Must = TRUE;
00713 }
00714 BOOL Is_Must(ACCESS_ARRAY *a1, ACCESS_ARRAY *a2, WN *inner_loop,
00715 DEP *dep=NULL);
00716
00717 INT Find_Region(WN *wn, DOLOOP_STACK *stack);
00718 INT Gather_References(WN *wn, REF_LIST_STACK *writes,
00719 REF_LIST_STACK *reads, DOLOOP_STACK *stack,
00720 class SCALAR_STACK *scalar_writes, class SCALAR_STACK *scalar_reads,
00721 class CALL_STACK *calls, BOOL skip_bad=FALSE);
00722 INT Add_Deps_To_Copy_Block_V(WN *orig, WN *copy,
00723 class HASH_TABLE<VINDEX16,VINDEX16> *hash_table);
00724 INT Add_Deps_To_Copy_Block_E(WN *orig, WN *copy,
00725 class HASH_TABLE<VINDEX16,VINDEX16> *hash_table,
00726 BOOL keep_internal_edge=TRUE);
00727 INT Unrolled_Dependences_Update_V(WN** bodies, UINT u,
00728 class HASH_TABLE<VINDEX16,VINDEX16P_LEX_COUNT *> *hash_table,
00729 VINDEX16_STACK *orig_vertices);
00730 INT Unrolled_Dependences_Update_E(UINT u,
00731 UINT loopno,class HASH_TABLE<VINDEX16,VINDEX16P_LEX_COUNT*>*hash_table,
00732 VINDEX16_STACK *orig_vertices);
00733 INT Unrolled_Dependences_Update_E(VINDEX16 *sources, VINDEX16 *sinks,
00734 EINDEX16 fedge, EINDEX16 bedge,UINT u, UINT loopno, INT lex_count,
00735 INT sink_lex_count);
00736 void Fission_Dep_Update_V(VINDEX16 v,WN *in_loop, UINT depth);
00737 INT Copy_Do_Loop_Deps(VINDEX16 *do_loop_vertices, INT num_loops);
00738 INT Fission_Dep_Update_R(WN *in_loop,UINT fission_depth, UINT depth,
00739 BOOL outer_good_do);
00740 #endif
00741
00742
00743 friend void Depgraph_Write(void *depgraph, struct output_file *fl,
00744 WN_MAP off_map);
00745 friend void *Depgraph_Read(char *cur_addr, char *end_addr, char *wn_base);
00746 };
00747
00748 extern ARRAY_DIRECTED_GRAPH16 *Current_Dep_Graph;
00749 extern void LNO_Erase_Dg_From_Here_In(WN* wn, ARRAY_DIRECTED_GRAPH16* dg);
00750 extern void Unmapped_Vertices_Here_Out(WN* wn);
00751
00752 #ifdef LNO
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763 class REFERENCE_NODE: public SLIST_NODE {
00764 DECLARE_SLIST_NODE_CLASS( REFERENCE_NODE);
00765 public:
00766 DOLOOP_STACK *Stack;
00767 WN *Wn;
00768 UINT Statement_Number;
00769
00770 REFERENCE_NODE(WN *wn, DOLOOP_STACK *stack, UINT statement_number) {
00771 Wn = wn;
00772 Stack = stack;
00773 Statement_Number = statement_number;
00774 };
00775 void Print(FILE *fp) {
00776 fprintf(fp,"Wn, Statment_Number = 0x%p %d\n",
00777 Wn,Statement_Number);
00778 }
00779 ~REFERENCE_NODE();
00780 };
00781
00782 class REFERENCE_LIST: public SLIST {
00783 DECLARE_SLIST_CLASS( REFERENCE_LIST, REFERENCE_NODE )
00784 public:
00785 ST *ST_Base;
00786 WN *Array;
00787 WN *Inner_Loop;
00788 REFERENCE_LIST(ST *st_base, WN *array, WN *inner_loop=0) {
00789 ST_Base = st_base;
00790 Array = array;
00791 Inner_Loop = inner_loop;
00792 };
00793 void Print(FILE *fp);
00794 ~REFERENCE_LIST();
00795 };
00796
00797
00798
00799
00800
00801 class SCALAR_REF {
00802 public:
00803 WN *Wn;
00804 UINT Statement_Number;
00805 SCALAR_REF(WN *wn, UINT statement_number) {
00806 Wn = wn;
00807 Statement_Number = statement_number;
00808 }
00809 SCALAR_REF& operator=(const SCALAR_REF& scalar_ref) {
00810 Wn = scalar_ref.Wn;
00811 Statement_Number = scalar_ref.Statement_Number;
00812 return *this;
00813 }
00814 };
00815
00816
00817 class SCALAR_NODE
00818 {
00819 MEM_POOL *_pool;
00820 public:
00821 SYMBOL _scalar;
00822 STACK <SCALAR_REF> *_scalar_ref_stack;
00823 SCALAR_NODE(MEM_POOL *pool, SYMBOL scalar) {
00824 typedef STACK<SCALAR_REF> SCALAR_REF_STACK;
00825 _pool = pool;
00826 _scalar_ref_stack = CXX_NEW(SCALAR_REF_STACK(pool),pool);
00827 _scalar = scalar;
00828 }
00829 INT Elements() const { return _scalar_ref_stack->Elements(); };
00830 SCALAR_REF *Bottom_nth(INT i) { return &_scalar_ref_stack->Bottom_nth(i); };
00831 SCALAR_REF *Top_nth(INT i) { return &_scalar_ref_stack->Top_nth(i); };
00832 };
00833
00834 class SCALAR_STACK
00835 {
00836 STACK <SCALAR_NODE> *_stack;
00837 MEM_POOL *_pool;
00838 public:
00839 SCALAR_STACK(MEM_POOL *pool) {
00840 typedef STACK<SCALAR_NODE> SNODE_STACK;
00841 typedef STACK<INT> INT_STACK;
00842 _pool = pool;
00843 _stack = CXX_NEW(SNODE_STACK(pool),pool);
00844 }
00845 void Add_Scalar(WN *wn, UINT snumber);
00846 void Add_Scalar(WN *wn_call, SYMBOL* symbol, UINT snumber);
00847 void Print(FILE *fp);
00848 void Clear() { _stack->Clear(); };
00849 INT Elements() const { return _stack->Elements(); };
00850 SCALAR_NODE* Bottom_nth(INT i) { return &_stack->Bottom_nth(i); };
00851 SCALAR_NODE* Top_nth(INT i) { return &_stack->Top_nth(i); };
00852 void Add_Scalar_Node(SCALAR_NODE* sn) {_stack->Push(*sn);};
00853 void Clear_Formal(INT i);
00854 };
00855
00856
00857 class CALL_NODE
00858 {
00859 public:
00860 WN *_call;
00861 UINT _statement_number;
00862 DOLOOP_STACK *_stack;
00863 BOOL _is_concurrent_call;
00864 CALL_NODE(WN *call, UINT statement_number, DOLOOP_STACK *stack,
00865 BOOL is_concurrent_call) {
00866 _call = call;
00867 _statement_number = statement_number;
00868 _stack = stack;
00869 _is_concurrent_call = is_concurrent_call;
00870 }
00871 };
00872
00873 class CALL_STACK
00874 {
00875 STACK <CALL_NODE> *_stack;
00876 MEM_POOL *_pool;
00877 public:
00878 CALL_STACK(MEM_POOL *pool) {
00879 typedef STACK<CALL_NODE> CNODE_STACK;
00880 _pool = pool;
00881 _stack = CXX_NEW(CNODE_STACK(pool),pool);
00882 }
00883 void Clear() { _stack->Clear(); }
00884 INT Elements() const { return _stack->Elements(); };
00885 CALL_NODE *Bottom_nth(INT i) { return &_stack->Bottom_nth(i); };
00886 CALL_NODE *Top_nth(INT i) { return &_stack->Top_nth(i); };
00887 void Push(WN *call, UINT statement_number,DOLOOP_STACK *stack,
00888 BOOL is_concurrent_call) {
00889 _stack->Push(CALL_NODE(call,statement_number,stack,is_concurrent_call));
00890 };
00891 };
00892
00893
00894
00895
00896
00897 class REFERENCE_ITER: public SLIST_ITER {
00898 DECLARE_SLIST_ITER_CLASS( REFERENCE_ITER, REFERENCE_NODE ,REFERENCE_LIST);
00899 public:
00900 ~REFERENCE_ITER() {};
00901 };
00902
00903 #endif
00904
00905
00906 #endif
00907
00908