OSDN Git Service

Merge tree-ssa-20020619-branch into mainline.
[pf3gnuchains/gcc-fork.git] / libbanshee / engine / setif-var.c
1 /*
2  * Copyright (c) 2000-2001
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  */
30
31 #include <stdio.h>
32 #include <assert.h>
33 #include <regions.h>
34 #include "setif-var.h"
35 #include "ufind.h"
36 #include "bounds.h"
37
38 struct sv_info
39 {
40   stamp st;
41   bounds sameregion lbs;
42   bounds sameregion ubs;
43   jcoll tlb_cache;
44   gen_e_list ub_projs;
45   const char *name;
46   uf_element component;
47 };
48
49 typedef struct sv_info *sv_info;
50
51 DECLARE_UFIND(sv_elt,sv_info)
52  
53 DEFINE_UFIND(sv_elt,sv_info)
54
55 DEFINE_LIST(setif_var_list,setif_var)
56
57 #define get_info(v) (sv_elt_get_info((v)->elt))
58
59 struct setif_var /* extends gen_e */
60 {
61 #ifdef NONSPEC
62   sort_kind sort;
63 #endif
64   int type;
65   sv_elt elt;
66 };
67     
68 bool sv_lt(setif_var v1, setif_var v2)
69 {
70   return ( sv_get_stamp(v1) < sv_get_stamp(v2) );
71 }
72
73 bool sv_eq(setif_var v1, setif_var v2)
74 {
75   return ( sv_get_stamp(v1) == sv_get_stamp(v2) );
76 }
77
78 static setif_var make_var(region r, const char *name, stamp st)
79 {
80   setif_var result = ralloc(r, struct setif_var);
81   sv_info info = ralloc(r, struct sv_info);
82  
83   info->st = st;
84   info->lbs = bounds_create(r);
85   info->ubs = bounds_create(r);
86   info->tlb_cache = NULL;
87   info->ub_projs = new_gen_e_list(r);
88   info->name = name ? rstrdup(r,name) : "fv";
89   info->component = new_uf_element(r, NULL);
90
91   result->type = VAR_TYPE;
92   result->elt = new_sv_elt(r,info); 
93   
94 #ifdef NONSPEC
95   result->sort = setif_sort;
96 #endif  
97   
98   return result;
99 }
100
101 setif_var sv_fresh(region r, const char *name)
102 {
103   return make_var(r,name,stamp_fresh());
104 }
105
106 setif_var sv_fresh_large(region r, const char *name)
107 {
108   return make_var(r,name,stamp_fresh_large());
109 }
110
111 setif_var sv_fresh_small(region r, const char *name)
112 {
113   return make_var(r,name,stamp_fresh_small());
114 }
115
116 stamp sv_get_stamp(setif_var v)
117 {
118   return get_info(v)->st;
119 }
120
121 const char *sv_get_name(setif_var v)
122 {
123   return get_info(v)->name;
124 }
125
126
127 static sv_info combine(sv_info i1, sv_info i2)
128 {
129   if (i1->st < i2->st)
130     return i1;
131   else return i2;
132 }
133
134 void sv_unify(setif_var v,setif_var_list vars)
135 {
136   setif_var temp;
137   setif_var_list_scanner scan;
138   
139   setif_var_list_scan(vars,&scan);
140
141   while (setif_var_list_next(&scan,&temp))
142     {
143       sv_elt_unify(combine,v->elt,temp->elt);
144     }
145 }
146
147 gen_e_list sv_get_lbs(setif_var v)
148 {
149   return bounds_exprs(get_info(v)->lbs);
150 }
151
152 gen_e_list sv_get_ubs(setif_var v)
153 {
154   return bounds_exprs(get_info(v)->ubs);
155 }
156
157 bool sv_add_ub(setif_var v, gen_e e, stamp s)
158 {
159   return bounds_add(get_info(v)->ubs,e,s);
160 }
161
162 bool sv_add_lb(setif_var v, gen_e e, stamp s)
163 {
164   return bounds_add(get_info(v)->lbs,e,s);
165 }
166
167 bool sv_is_ub(setif_var v, stamp s)
168 {
169   bool self_edge = sv_get_stamp(v) == s,
170     in_bounds = bounds_query(get_info(v)->ubs,s);
171   
172   return (self_edge || in_bounds);
173 }
174
175 bool sv_is_lb(setif_var v, stamp s)
176 {
177
178   bool self_edge = sv_get_stamp(v) == s,
179     in_bounds = bounds_query(get_info(v)->lbs,s);
180   
181   return (self_edge || in_bounds);
182
183 }
184
185 void sv_add_ub_proj(setif_var v, gen_e e)
186 {
187   gen_e_list_cons(e,get_info(v)->ub_projs);
188 }
189
190 gen_e sv_get_ub_proj(setif_var v, get_proj_fn_ptr get_proj)
191 {
192   return get_proj(get_info(v)->ub_projs);
193 }
194
195 gen_e_list sv_get_ub_projs(setif_var v)
196 {
197   return get_info(v)->ub_projs;
198 }
199
200
201 bool sv_union_component(setif_var v1, setif_var v2)
202 {
203   if (uf_eq(get_info(v1)->component,get_info(v2)->component))
204     return FALSE;
205   
206   else
207     {
208       uf_union(get_info(v1)->component,get_info(v2)->component);
209       return TRUE;
210     }
211 }
212
213 void sv_set_tlb_cache(setif_var v, jcoll j)
214 {
215   get_info(v)->tlb_cache = j;
216 }
217
218 jcoll sv_get_tlb_cache(setif_var v)
219 {
220   return get_info(v)->tlb_cache;
221 }
222
223 void sv_clear_tlb_cache(setif_var v)
224 {
225   get_info(v)->tlb_cache = NULL;
226 }