+/**
+ * Returns non-zero if the node is already scheduled
+ */
+static INLINE int is_already_scheduled(block_sched_env_t *env, ir_node *n)
+{
+ int idx = get_irn_idx(n);
+
+ assert(idx < ARR_LEN(env->sched_info));
+ return env->sched_info[idx].already_sched;
+}
+
+/**
+ * Mark a node as already scheduled
+ */
+static INLINE void mark_already_scheduled(block_sched_env_t *env, ir_node *n)
+{
+ int idx = get_irn_idx(n);
+
+ assert(idx < ARR_LEN(env->sched_info));
+ env->sched_info[idx].already_sched = 1;
+}
+
+/**
+ * Returns non-zero if the node is a root node
+ */
+static INLINE unsigned is_root_node(block_sched_env_t *env, ir_node *n)
+{
+ int idx = get_irn_idx(n);
+
+ assert(idx < ARR_LEN(env->sched_info));
+ return env->sched_info[idx].is_root;
+}
+
+/**
+ * Mark a node as roto node
+ */
+static INLINE void mark_root_node(block_sched_env_t *env, ir_node *n)
+{
+ int idx = get_irn_idx(n);
+
+ assert(idx < ARR_LEN(env->sched_info));
+ env->sched_info[idx].is_root = 1;
+}
+
+/**
+ * Get the current delay.
+ */
+static sched_timestep_t get_irn_delay(block_sched_env_t *env, ir_node *n) {
+ int idx = get_irn_idx(n);
+
+ assert(idx < ARR_LEN(env->sched_info));
+ return env->sched_info[idx].delay;
+}
+
+/**
+ * Set the current delay.
+ */
+static void set_irn_delay(block_sched_env_t *env, ir_node *n, sched_timestep_t delay) {
+ int idx = get_irn_idx(n);
+
+ assert(idx < ARR_LEN(env->sched_info));
+ env->sched_info[idx].delay = delay;
+}
+
+/**
+ * Get the current etime.
+ */
+static sched_timestep_t get_irn_etime(block_sched_env_t *env, ir_node *n) {
+ int idx = get_irn_idx(n);
+
+ assert(idx < ARR_LEN(env->sched_info));
+ return env->sched_info[idx].etime;
+}
+
+/**
+ * Set the current etime.
+ */
+static void set_irn_etime(block_sched_env_t *env, ir_node *n, sched_timestep_t etime) {
+ int idx = get_irn_idx(n);
+
+ assert(idx < ARR_LEN(env->sched_info));
+ env->sched_info[idx].etime = etime;
+}
+
+/**
+ * returns the exec-time for node n.
+ */
+static sched_timestep_t exectime(sched_env_t *env, ir_node *n) {
+ if (be_is_Keep(n) || is_Proj(n))
+ return 0;
+ if (env->selector->exectime)
+ return env->selector->exectime(env->selector_env, n);
+ return 1;
+}
+
+/**
+ * Calculates the latency for between two ops
+ */
+static sched_timestep_t latency(sched_env_t *env, ir_node *pred, int pred_cycle, ir_node *curr, int curr_cycle) {
+ /* a Keep hides a root */
+ if (be_is_Keep(curr))
+ return exectime(env, pred);
+
+ /* Proj's are executed immediately */
+ if (is_Proj(curr))
+ return 0;
+
+ /* predecessors Proj's must be skipped */
+ if (is_Proj(pred))
+ pred = get_Proj_pred(pred);
+
+ if (env->selector->latency)
+ return env->selector->latency(env->selector_env, pred, pred_cycle, curr, curr_cycle);
+ return 1;
+}
+