/* * Copyright (c) 2000-2001 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */ #include #include #include #include "setst-var.h" #include "jcollection.h" #include "ufind.h" #include "bounds.h" struct st_info { stamp st; bounds lbs; bounds sources; bounds sinks; jcoll tlb_cache; const char *name; bool seen; int path_pos; int src_sz; int snk_sz; }; typedef struct st_info *st_info; DECLARE_UFIND(st_elt,st_info) DEFINE_UFIND(st_elt,st_info) DEFINE_LIST(setst_var_list,setst_var) #define get_info(v) (st_elt_get_info((v)->elt)) struct setst_var /* extends gen_e */ { #ifdef NONSPEC sort_kind sort; #endif int type; st_elt elt; }; bool st_eq(setst_var v1, setst_var v2) { return (st_get_stamp(v1) == st_get_stamp(v2)); } static setst_var make_var(region r, const char *name, stamp st) { setst_var result = ralloc(r,struct setst_var); st_info info = ralloc(r, struct st_info); info->st = st; info->lbs = bounds_create(r); info->sources = bounds_create(r); info->sinks = bounds_create(r); info->tlb_cache = NULL; info->name = name ? rstrdup(r,name) : "fv"; info->seen = FALSE; info->path_pos = 0; info->src_sz = 0; info->snk_sz = 0; result->type = VAR_TYPE; result->elt = new_st_elt(r,info); #ifdef NONSPEC result->sort = setst_sort; #endif return result; } setst_var st_fresh(region r, const char *name) { return make_var(r,name,stamp_fresh()); } setst_var st_fresh_large(region r, const char *name) { return make_var(r,name,stamp_fresh_large()); } setst_var st_fresh_small(region r, const char *name) { return make_var(r,name,stamp_fresh_small()); } stamp st_get_stamp(setst_var v) { return get_info(v)->st; } const char *st_get_name(setst_var v) { return get_info(v)->name; } void st_unify(setst_var v,setst_var_list vars) { setst_var temp; setst_var_list_scanner scan; setst_var_list_scan(vars,&scan); while (setst_var_list_next(&scan,&temp)) { st_elt_union(v->elt,temp->elt); } } setst_var_list st_get_lbs(setst_var v) { return (setst_var_list)bounds_exprs(get_info(v)->lbs); } gen_e_list st_get_sources(setst_var v) { return bounds_exprs(get_info(v)->sources); } gen_e_list st_get_sinks(setst_var v) { return bounds_exprs(get_info(v)->sinks); } bool st_add_lb(setst_var v, setst_var lb) { return bounds_add(get_info(v)->lbs,(gen_e)lb,st_get_stamp(lb)); } bool st_add_source(setst_var v, gen_e source, stamp s) { return bounds_add(get_info(v)->sources,source,s); } bool st_add_sink(setst_var v, gen_e sink, stamp s) { return bounds_add(get_info(v)->sinks,sink,s); } jcoll st_get_tlb_cache(setst_var v) { return get_info(v)->tlb_cache; } void st_set_tlb_cache(setst_var v, jcoll j) { get_info(v)->tlb_cache = j; } void st_clear_tlb_cache(setst_var v) { get_info(v)->tlb_cache = NULL; } gen_e st_get_ub_proj(setst_var v, get_proj_fn_ptr get_proj) { return get_proj(st_get_sinks(v)); } static setst_var neq_temp; static bool neq (const setst_var v2) { return (!(st_get_stamp (neq_temp) == st_get_stamp (v2))); } void st_repair_bounds(setst_var v1) { setst_var_list lbs; neq_temp = v1; lbs = setst_var_list_filter2(st_get_lbs(v1),neq); bounds_set(get_info(v1)->lbs,(gen_e_list)lbs); } void st_set_path_pos(setst_var v, int pos) { get_info(v)->path_pos = pos; } int st_get_path_pos(setst_var v) { return get_info(v)->path_pos; } void st_set_seen(setst_var v, bool b) { get_info(v)->seen = b; } bool st_get_seen(setst_var v) { return get_info(v)->seen; } void st_set_src_sz(setst_var v, int size) { get_info(v)->src_sz = size; } int st_get_src_sz(setst_var v) { return get_info(v)->src_sz; } void st_set_snk_sz(setst_var v, int size) { get_info(v)->snk_sz = size; } int st_get_snk_sz(setst_var v) { return get_info(v)->snk_sz; }