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