Commit | Line | Data |
---|---|---|
aaa7ced1 BJ |
1 | #include <stdio.h> |
2 | # | |
3 | /* use inarc, dom, and head to build tree representing structure of program. | |
4 | Each node v has CHILDNUM(v) children denoted by | |
5 | LCHILD(v,0), LCHILD(v,1),... | |
6 | RSIB((v) is right sibling of v or UNDEFINED; | |
7 | RSIB(v) represents code following v at the same level of nesting, | |
8 | while LCHILD(v,i) represents code nested within v | |
9 | */ | |
10 | #include "def.h" | |
11 | #include "2.def.h" | |
12 | ||
13 | gettree(inarc,dom,head) /* build tree */ | |
14 | struct list **inarc; | |
15 | VERT *dom, *head; | |
16 | { | |
17 | VERT v,u,from; | |
18 | int i; | |
19 | for ( v = 0; v < nodenum; ++v) | |
20 | { | |
21 | RSIB(v) = UNDEFINED; | |
22 | for (i = 0; i < CHILDNUM(v); ++i) | |
23 | LCHILD(v,i) = UNDEFINED; | |
24 | } | |
25 | for (i = accessnum-1; i > 0; --i) | |
26 | { | |
27 | v = after[i]; | |
28 | from = oneelt(inarc[v]); /* the unique elt of inarc[v] or UNDEFINED */ | |
29 | if (DEFINED(from)) | |
30 | if (NTYPE(from) == IFVX && (head[v] == head[from] || asoc(v,exitsize) != -1) ) | |
31 | /* place in clause of IFVX if in smallest loop containing it | |
32 | or if size of code for v is <= exitsize */ | |
33 | if (ARC(from,THEN) == v) | |
34 | { | |
35 | LCHILD(from,THEN) = v; | |
36 | continue; | |
37 | } | |
38 | else | |
39 | { | |
40 | ASSERT(ARC(from,ELSE) == v,gettree); | |
41 | LCHILD(from,ELSE) = v; | |
42 | continue; | |
43 | } | |
44 | else if (NTYPE(v) == ITERVX || NTYPE(from) == ITERVX ) | |
45 | /* LOOPVX -> ITERVX ->vert always in same loop*/ | |
46 | { | |
47 | LCHILD(from,0) = v; | |
48 | continue; | |
49 | } | |
50 | else if (NTYPE(from) == SWCHVX) | |
51 | { | |
52 | ASSERT(0 < ARCNUM(v),gettree); | |
53 | if (ARC(from,0) == v) | |
54 | LCHILD(from,0) = v; | |
55 | else | |
56 | { | |
57 | int j; | |
58 | for (j = 1; j < ARCNUM(from); ++j) | |
59 | if (ARC(from,j) == v) | |
60 | {insib(ARC(from,j-1),v); | |
61 | break; | |
62 | } | |
63 | } | |
64 | continue; | |
65 | } | |
66 | else if (NTYPE(from) == ICASVX && (head[v] == head[from] || asoc(v,exitsize) != -1)) | |
67 | { | |
68 | LCHILD(from,0) = v; | |
69 | continue; | |
70 | } | |
71 | else if (NTYPE(from) == DUMVX && ARC(from,0) == v) | |
72 | { | |
73 | LCHILD(from,0) = v; | |
74 | continue; | |
75 | } | |
76 | if (loomem(v,head[dom[v]],head)) | |
77 | /* v is in smallest loop containing dom[v] */ | |
78 | insib(dom[v],v); | |
79 | else | |
80 | { | |
81 | /* make v follow LOOPVX heading largest loop | |
82 | containing DOM[v] but not v */ | |
83 | ASSERT(DEFINED(head[dom[v]]),gettree); | |
84 | for (u = head[dom[v]]; head[u] != head[v]; u = head[u]) | |
85 | ASSERT(DEFINED(head[u]),gettree); | |
86 | ASSERT(NTYPE(u) == ITERVX,gettree); | |
87 | insib(FATH(u),v); | |
88 | } | |
89 | } | |
90 | } | |
91 | ||
92 | ||
93 | ||
94 | ||
95 | insib(w,v) /* make RSIB(w) = v, and make RSIB(rightmost sib of v) = old RSIB(w) */ | |
96 | VERT w,v; | |
97 | { | |
98 | VERT u, temp; | |
99 | temp = RSIB(w); | |
100 | RSIB(w) = v; | |
101 | for (u = v; DEFINED(RSIB(u)); u = RSIB(u)) | |
102 | ; | |
103 | RSIB(u) = temp; | |
104 | } | |
105 | ||
106 | ||
107 | asoc(v,n) /* return # of nodes associated with v if <= n, -1 otherwise */ | |
108 | VERT v; | |
109 | int n; | |
110 | { | |
111 | int count,i,temp; | |
112 | VERT w; | |
113 | count = (NTYPE(v) == STLNVX) ? CODELINES(v) : 1; | |
114 | for (i = 0; i < CHILDNUM(v); ++i) | |
115 | { | |
116 | w = LCHILD(v,i); | |
117 | if (!DEFINED(w)) continue; | |
118 | temp = asoc(w,n-count); | |
119 | if (temp == -1) return(-1); | |
120 | count += temp; | |
121 | if (count > n) return(-1); | |
122 | } | |
123 | if (DEFINED(RSIB(v))) | |
124 | { | |
125 | temp = asoc(RSIB(v),n-count); | |
126 | if (temp == -1) return(-1); | |
127 | count += temp; | |
128 | } | |
129 | if (count > n) return(-1); | |
130 | else return(count); | |
131 | } |