3 #include "irprintf_t.h"
20 #include "iredges_t.h"
26 #include "firm/bearch_firm.h"
27 #include "ia32/bearch_ia32.h"
28 #include "arm/bearch_arm.h"
29 #include "ppc32/bearch_ppc32.h"
30 #include "mips/bearch_mips.h"
37 #include "besched_t.h"
38 #include "belistsched.h"
40 #include "bespillbelady.h"
42 #include "beraextern.h"
43 #include "bechordal_t.h"
45 #include "beifg_impl.h"
46 #include "becopyopt.h"
47 #include "becopystat.h"
48 #include "bessadestr.h"
57 typedef struct _spilloc_env_t {
67 typedef struct _vertex {
75 typedef struct _edge {
77 unsigned int wt_val_interfere;
78 unsigned int wt_con_interfere;
83 #define STRUCTSIZE sizeof(vertex)
87 static void add_ent(entity *ent, void *env) {
88 spilloc_env_t *spi = env;
89 entity *e = obstack_alloc(&spi->ob, sizeof(*e));
92 pset_insert_ptr(spi->ents, e);
96 static void data_init(spilloc_env_t *env) {
97 pset *ps = pset_new_ptr_default();
100 foreach_pset(env->ents, e) {
101 pmap_insert(env->nodents, e, ps);
105 static void get_entity_nodes(ir_node *irn, void *env) {
107 spilloc_env_t *spi = env;
109 e = get_irn_entity_attr(irn);
110 //get_entity_additional_properties();
113 foreach_pset(spi->ents, ent) {
115 if ((ent->nr == e->nr) && (ent->ld_name == e->ld_name) )
117 pset *ps = pmap_get(spi->nodents, ent);
118 if (ps && (!pset_find_ptr(pmap_get(spi->nodents, ent),irn))) {
119 pset_insert_ptr(pmap_get(spi->nodents, ent), irn);
126 pset *get_entity_irn(entity *ent, void *env) {
127 spilloc_env_t *spi = env;
129 pset *pirn = pmap_get(spi->nodents, ent);
137 int entities_interfere(entity *e1, entity *e2, void *env) {
138 spilloc_env_t *spi = env;
141 pset *pe1 = pmap_get(spi->nodents, e1);
142 pset *pe2 = pmap_get(spi->nodents, e2);
144 foreach_pset(pe1, n1) {
145 foreach_pset(pe2, n2) {
146 if (values_interfere(n1, n2)) return 1;
152 static void set_aff_graph(void *env) {
153 spilloc_env_t *spi = env;
158 foreach_pset(spi->ents, e) {
159 vertex *ver = obstack_alloc(&spi->ob, sizeof(*ver));
160 ver->edges = pset_new_ptr_default();
163 pmap_insert(spi->afgraph, e, ver);
167 foreach_pset(spi->ents, e) {
168 foreach_pset(spi->ents, cmp) {
169 if (entities_interfere(e, cmp, &spi) == 1) {
170 v = pmap_get(spi->afgraph, e);
171 pset_insert_ptr(v->edges, cmp);
177 void be_spill_loc(const be_chordal_env_t *chordal_env) {
181 // create initial graph representing data structure
182 obstack_init(&spi.ob);
183 spi.ents = pset_new_ptr_default();
185 spi.irg = chordal_env->irg;
186 spi.nodents = pmap_create();
187 spi.afgraph = pmap_create();
190 /* Walks over all entities in the type */
191 walk_types_entities(get_irg_frame_type(chordal_env->irg), add_ent, &spi);
194 irg_walk_blkwise_graph(chordal_env->irg, NULL, get_entity_nodes, &spi);
199 pmap_destroy(spi.nodents);
200 pmap_destroy(spi.afgraph);
201 obstack_free(&spi.ob, NULL);