reloads only have 1 memory input now
[libfirm] / ir / be / belistsched.h
1 /**
2  * Primitive list scheduling.
3  * @date 20.10.2004
4  * @author Sebastian Hack
5  */
6
7 #ifndef _FIRM_LIST_SCHED
8 #define _FIRM_LIST_SCHED
9
10 #include "firm_config.h"
11
12 #include "firm_types.h"
13
14 #include "benodesets.h"
15 #include "bearch_t.h"
16 #include "be.h"
17
18 typedef struct _list_sched_selector_t list_sched_selector_t;
19
20 /**
21  * A selector interface which is used by the list schedule framework.
22  * You can implement your own list scheduler by implementing these
23  * functions.
24  */
25 struct _list_sched_selector_t {
26
27         /**
28          * Called before a graph is being scheduled.
29          * @param arch_env The architecture environment.
30          * @param irg      The graph.
31          * @return         The environment pointer that is passed to all other functions in this struct.
32          */
33         void *(*init_graph)(const list_sched_selector_t *vtab, const arch_env_t *arch_env, ir_graph *irg);
34
35         /**
36          * Called before scheduling starts on a block.
37          * @param graph_env   The environment.
38          * @param block       The block which is to be scheduled.
39          * @return A per-block pointer that is additionally passed to select.
40          */
41         void *(*init_block)(void *graph_env, ir_node *block);
42
43         /**
44          * The selection function.
45          * It picks one node out of the ready list to be scheduled next.
46          * The function does not have to delete the node from the ready set.
47          *
48          * @param block_env   Some private information as returned by init_block().
49          * @param sched_head  The schedule so far.
50          * @param ready_set   A set containing all ready nodes. Pick one of these nodes.
51          * @param live_set    A set containing all nodes currently alive.
52          * @return The chosen node.
53          */
54         ir_node *(*select)(void *block_env, nodeset *ready_set, nodeset *live_set);
55
56         /**
57          * This function decides, if a node should appear in a schedule.
58          * @param block_env The block environment.
59          * @param irn       The node.
60          * @return 1, if the node should be scheduled, 0 if not.
61          */
62         int (*to_appear_in_schedule)(void *block_env, const ir_node *irn);
63
64         /**
65          * This function gets executed after a node finally has been made ready.
66          * @param block_env The block environment.
67          * @param irn       The node made ready.
68          * @param pred      The previously scheduled node.
69          */
70         void (*node_ready)(void *block_env, ir_node *irn, ir_node *pred);
71
72         /**
73          * This function gets executed after a node finally has been selected.
74          * @param block_env The block environment.
75          * @param irn       The selected node.
76          */
77         void (*node_selected)(void *block_env, ir_node *irn);
78
79         /**
80          * Returns the execution time of node irn.
81          */
82         unsigned (*exectime)(void *block_env, const ir_node *irn);
83
84         /**
85          * Calculates the latency of executing cycle curr_cycle of node curr in cycle pred_cycle
86          * of node pred.
87          *
88          * @param block_env   The block environment.
89          * @param pred        The previous node.
90          * @param pred_cycle  The previous node execution cycle.
91          * @param curr        The current node.
92          * @param curr_cycle  The current node execution cycle.
93          */
94         unsigned (*latency)(void *block_env, const ir_node *pred, int pred_cycle, const ir_node *curr, int curr_cycle);
95
96         /**
97          * Called after a block has been scheduled.
98          * @param env The environment.
99          * @param block_env The per block environment as returned by init_block().
100          */
101         void (*finish_block)(void *block_env);
102
103         /**
104          * Called after a whole graph has been scheduled.
105          * @param env The environment.
106          */
107         void (*finish_graph)(void *env);
108
109 };
110
111
112 /**
113  * A trivial selector, that just selects the first ready node.
114  */
115 extern const list_sched_selector_t *trivial_selector;
116
117 extern const list_sched_selector_t *random_selector;
118
119 /**
120  * A selector that tries to minimize the register pressure.
121  * @note Not really operational yet.
122  */
123 extern const list_sched_selector_t *reg_pressure_selector;
124
125 /**
126  * A selector based on trace scheduling as introduced by Muchnik[TM]
127  */
128 extern const list_sched_selector_t *muchnik_selector;
129
130 /**
131  * A selector based on trace scheduling as introduced by Muchnik[TM]
132  * but using the mueller heuristic selector.
133  */
134 extern const list_sched_selector_t *heuristic_selector;
135
136 /**
137  * List schedule a graph.
138  * Each block in the graph gets a list head to its link field being the
139  * head of the schedule. You can walk this list using the functions in
140  * list.h.
141  *
142  * @param birg        The backend irg.
143  * @param enable_mris Flag indicating if mris preparation should be done
144  */
145 void list_sched(const be_irg_t *birg, be_options_t *be_opts);
146
147 #ifdef WITH_LIBCORE
148 #include <libcore/lc_opts.h>
149
150 /**
151  * Register list scheduler options.
152  */
153 void list_sched_register_options(lc_opt_entry_t *grp);
154 #endif /* WITH_LIBCORE */
155
156 #endif /* _FIRM_LIST_SCHED */