/**
* @file
- * @brief Primitive list scheduling with different node selectors.
+ * @brief Common functions for creating listscheduling algorithms
* @author Sebastian Hack
* @date 20.10.2004
- * @version $Id$
*/
#ifndef FIRM_BE_BELISTSCHED_H
#define FIRM_BE_BELISTSCHED_H
* You can implement your own list scheduler by implementing these
* functions.
*/
-struct list_sched_selector_t {
+typedef struct list_sched_selector_t {
/**
* Called before a graph is being scheduled.
* May be NULL.
*
- * @param vtab The selector vtab.
* @param irg The backend graph.
- * @return The environment pointer that is passed to all other functions in this struct.
+ * @return The environment pointer that is passed to all other
+ * functions in this struct.
*/
- void *(*init_graph)(const list_sched_selector_t *vtab, ir_graph *irg);
+ void *(*init_graph)(ir_graph *irg);
/**
* Called before scheduling starts on a block.
* @param block_env Some private information as returned by init_block().
* @param sched_head The schedule so far.
* @param ready_set A set containing all ready nodes. Pick one of these nodes.
- * @param live_set A set containing all nodes currently alive.
* @return The chosen node.
*/
- ir_node *(*select)(void *block_env, ir_nodeset_t *ready_set,
- ir_nodeset_t *live_set);
+ ir_node *(*select)(void *block_env, ir_nodeset_t *ready_set);
/**
* This function gets executed after a node finally has been made ready.
*/
void (*node_selected)(void *block_env, ir_node *irn);
- /**
- * Returns the execution time of node irn.
- * May be NULL.
- *
- * @param block_env The block environment.
- * @param irn The selected node.
- */
- unsigned (*exectime)(void *block_env, const ir_node *irn);
-
- /**
- * Calculates the latency of executing cycle curr_cycle of node curr in cycle pred_cycle
- * of node pred.
- * May be NULL.
- *
- * @param block_env The block environment.
- * @param pred The previous node.
- * @param pred_cycle The previous node execution cycle.
- * @param curr The current node.
- * @param curr_cycle The current node execution cycle.
- */
- unsigned (*latency)(void *block_env, const ir_node *pred, int pred_cycle, const ir_node *curr, int curr_cycle);
-
/**
* Called after a block has been scheduled.
* May be NULL.
* @param env The environment.
*/
void (*finish_graph)(void *env);
-};
-
-
-/**
- * A trivial selector, that just selects the first ready node.
- */
-extern const list_sched_selector_t trivial_selector;
-
-/**
- * A trivial selector that selects a pseudo-random-node (deterministic).
- */
-extern const list_sched_selector_t random_selector;
-
-/**
- * A selector that tries to minimize the register pressure.
- * @note Not really operational yet.
- */
-extern const list_sched_selector_t reg_pressure_selector;
-
-/**
- * A selector based on trace scheduling as introduced by Muchnik[TM]
- */
-extern const list_sched_selector_t muchnik_selector;
-
-/**
- * A selector based on trace scheduling as introduced by Muchnik[TM]
- * but using the Mueller heuristic selector.
- */
-extern const list_sched_selector_t heuristic_selector;
-
-/**
- * A selector based on the strong normal form theorem (ie minimizing
- * the register pressure).
- */
-extern const list_sched_selector_t normal_selector;
+} list_sched_selector_t;
/**
* List schedule a graph.
*
* @param irg The backend irg.
*/
-void list_sched(ir_graph *irg);
-
-/**
- * List schedule a block.
- * Same as list_sched but only for a certain block (needed for ILP fallback).
- */
-void list_sched_single_block(ir_graph *irg, ir_node *block);
+void be_list_sched_graph(ir_graph *irg, const list_sched_selector_t *selector);
#endif