projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
- Added 2 new blockschedulers, a greedy algorithm and an "optimal" ILP that
[libfirm]
/
ir
/
be
/
bechordal_main.c
diff --git
a/ir/be/bechordal_main.c
b/ir/be/bechordal_main.c
index
6b376b0
..
d2ebfa3
100644
(file)
--- a/
ir/be/bechordal_main.c
+++ b/
ir/be/bechordal_main.c
@@
-346,9
+346,12
@@
static void memory_operand_walker(ir_node *irn, void *env) {
if (! be_is_Reload(irn))
return;
if (! be_is_Reload(irn))
return;
- // only use memory operands, if the reload is only used by 1 node
+ /* always use addressmode, it's good for x86 */
+#if 0
+ /* only use memory operands, if the reload is only used by 1 node */
if(get_irn_n_edges(irn) > 1)
return;
if(get_irn_n_edges(irn) > 1)
return;
+#endif
spill = be_get_Reload_mem(irn);
block = get_nodes_block(irn);
spill = be_get_Reload_mem(irn);
block = get_nodes_block(irn);
@@
-387,8
+390,10
@@
static INLINE void check_for_memory_operands(be_chordal_env_t *chordal_env) {
typedef struct _node_stat_t {
unsigned int n_phis; /**< Phis of the current register class. */
unsigned int n_mem_phis; /**< Memory Phis (Phis with spill operands). */
typedef struct _node_stat_t {
unsigned int n_phis; /**< Phis of the current register class. */
unsigned int n_mem_phis; /**< Memory Phis (Phis with spill operands). */
+ unsigned int n_copies; /**< Copies */
+ unsigned int n_perms; /**< Perms */
unsigned int n_spills; /**< Spill nodes */
unsigned int n_spills; /**< Spill nodes */
- unsigned int n_reloads; /**< Reloads
.
*/
+ unsigned int n_reloads; /**< Reloads */
} node_stat_t;
struct node_stat_walker {
} node_stat_t;
struct node_stat_walker {
@@
-414,6
+419,11
@@
static void node_stat_walker(ir_node *irn, void *data)
else if(arch_irn_classify(aenv, irn) & arch_irn_class_reload)
++env->stat->n_reloads;
else if(arch_irn_classify(aenv, irn) & arch_irn_class_reload)
++env->stat->n_reloads;
+ else if(arch_irn_classify(aenv, irn) & arch_irn_class_copy)
+ ++env->stat->n_copies;
+
+ else if(arch_irn_classify(aenv, irn) & arch_irn_class_perm)
+ ++env->stat->n_perms;
}
/* a mem phi is a PhiM with a mem phi operand or a Spill operand */
}
/* a mem phi is a PhiM with a mem phi operand or a Spill operand */
@@
-716,27
+726,37
@@
static be_ra_timer_t *be_ra_chordal_main(const be_irg_t *bi)
if(stat_file) {
be_ifg_stat_t stat;
if(stat_file) {
be_ifg_stat_t stat;
- be_ifg_stat(
chordal_env.ifg, irg
, &stat);
+ be_ifg_stat(
&chordal_env
, &stat);
be_stat_ev("ifg_nodes", stat.n_nodes);
be_stat_ev("ifg_edges", stat.n_edges);
be_stat_ev("ifg_nodes", stat.n_nodes);
be_stat_ev("ifg_edges", stat.n_edges);
+ be_stat_ev("ifg_comps", stat.n_comps);
}
BE_TIMER_PUSH(ra_timer.t_verify);
}
BE_TIMER_PUSH(ra_timer.t_verify);
- if (options.vrfy_option != BE_CH_VRFY_OFF)
- be_ra_chordal_check(&chordal_env);
+ if (options.vrfy_option != BE_CH_VRFY_OFF) {
+ //be_ra_chordal_check(&chordal_env);
+ }
BE_TIMER_POP(ra_timer.t_verify);
BE_TIMER_POP(ra_timer.t_verify);
+ if(stat_file) {
+ node_stats(&chordal_env, &node_stat);
+ be_stat_ev("perms_before_coal", node_stat.n_perms);
+ be_stat_ev("copies_before_coal", node_stat.n_copies);
+ }
+
/* copy minimization */
BE_TIMER_PUSH(ra_timer.t_copymin);
co_driver(&chordal_env);
BE_TIMER_POP(ra_timer.t_copymin);
/* copy minimization */
BE_TIMER_PUSH(ra_timer.t_copymin);
co_driver(&chordal_env);
BE_TIMER_POP(ra_timer.t_copymin);
+
dump(BE_CH_DUMP_COPYMIN, irg, chordal_env.cls, "-copymin", dump_ir_block_graph_sched);
BE_TIMER_PUSH(ra_timer.t_verify);
dump(BE_CH_DUMP_COPYMIN, irg, chordal_env.cls, "-copymin", dump_ir_block_graph_sched);
BE_TIMER_PUSH(ra_timer.t_verify);
- if (options.vrfy_option != BE_CH_VRFY_OFF)
- be_ra_chordal_check(&chordal_env);
+ if (options.vrfy_option != BE_CH_VRFY_OFF) {
+ //be_ra_chordal_check(&chordal_env);
+ }
BE_TIMER_POP(ra_timer.t_verify);
BE_TIMER_PUSH(ra_timer.t_ssa);
BE_TIMER_POP(ra_timer.t_verify);
BE_TIMER_PUSH(ra_timer.t_ssa);
@@
-751,7
+771,7
@@
static be_ra_timer_t *be_ra_chordal_main(const be_irg_t *bi)
BE_TIMER_PUSH(ra_timer.t_verify);
if (options.vrfy_option != BE_CH_VRFY_OFF) {
be_ssa_destruction_check(&chordal_env);
BE_TIMER_PUSH(ra_timer.t_verify);
if (options.vrfy_option != BE_CH_VRFY_OFF) {
be_ssa_destruction_check(&chordal_env);
- be_ra_chordal_check(&chordal_env);
+
//
be_ra_chordal_check(&chordal_env);
}
BE_TIMER_POP(ra_timer.t_verify);
}
BE_TIMER_POP(ra_timer.t_verify);
@@
-759,13
+779,18
@@
static be_ra_timer_t *be_ra_chordal_main(const be_irg_t *bi)
pmap_destroy(chordal_env.border_heads);
bitset_free(chordal_env.ignore_colors);
pmap_destroy(chordal_env.border_heads);
bitset_free(chordal_env.ignore_colors);
+ if(stat_file) {
+ node_stats(&chordal_env, &node_stat);
+ be_stat_ev("perms_after_coal", node_stat.n_perms);
+ be_stat_ev("copies_after_coal", node_stat.n_copies);
+ }
+
be_stat_ev_pop();
}
BE_TIMER_PUSH(ra_timer.t_spillslots);
be_stat_ev_pop();
}
BE_TIMER_PUSH(ra_timer.t_spillslots);
- if(coalesce_spill_slots)
- be_coalesce_spillslots(&chordal_env);
+ be_coalesce_spillslots(&chordal_env, coalesce_spill_slots);
dump(BE_CH_DUMP_SPILLSLOTS, irg, NULL, "-spillslots", dump_ir_block_graph_sched);
BE_TIMER_POP(ra_timer.t_spillslots);
dump(BE_CH_DUMP_SPILLSLOTS, irg, NULL, "-spillslots", dump_ir_block_graph_sched);
BE_TIMER_POP(ra_timer.t_spillslots);