/*
- * Copyright (C) 1995-2010 University of Karlsruhe. All right reserved.
- *
* This file is part of libFirm.
- *
- * This file may be distributed and/or modified under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation and appearing in the file LICENSE.GPL included in the
- * packaging of this file.
- *
- * Licensees holding valid libFirm Professional Edition licenses may use
- * this file in accordance with the libFirm Commercial License.
- * Agreement provided with the Software.
- *
- * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE.
+ * Copyright (C) 2012 University of Karlsruhe.
*/
/**
#ifndef FIRM_BE_BESCHED_H
#define FIRM_BE_BESCHED_H
-#include <stdio.h>
#include <stdbool.h>
-#include "irgraph.h"
-#include "irnode.h"
-#include "beirg.h"
#include "beinfo.h"
-#include "beutil.h"
static sched_info_t *get_irn_sched_info(const ir_node *node)
{
return is_Block(node);
}
-/**
- * Check, if an ir_node has a scheduling successor.
- * @param irn The ir node.
- * @return 1, if the node has a scheduling successor, 0 if not.
- */
-static inline bool sched_has_next(const ir_node *irn)
-{
- const sched_info_t *info = get_irn_sched_info(irn);
- const ir_node *block = is_Block(irn) ? irn : get_nodes_block(irn);
- return info->next != block;
-}
-
-/**
- * Check, if an ir_node has a scheduling predecessor.
- * @param irn The ir node.
- * @return 1, if the node has a scheduling predecessor, 0 if not.
- */
-static inline bool sched_has_prev(const ir_node *irn)
-{
- const sched_info_t *info = get_irn_sched_info(irn);
- const ir_node *block = is_Block(irn) ? irn : get_nodes_block(irn);
- return info->prev != block;
-}
-
/**
* Get the scheduling successor of a node.
* @param irn The node.
*/
void sched_remove(ir_node *irn);
+/**
+ * Remove @p old from the schedule and put @p irn in its place.
+ */
+void sched_replace(ir_node *old, ir_node *irn);
+
/**
* Checks, if one node is scheduled before another.
* @param n1 A node.
*/
static inline bool sched_comes_after(const ir_node *n1, const ir_node *n2)
{
- assert(sched_is_scheduled(n1));
- assert(sched_is_scheduled(n2));
assert((is_Block(n1) ? n1 : get_nodes_block(n1)) == (is_Block(n2) ? n2 : get_nodes_block(n2)));
return sched_get_time_step(n1) < sched_get_time_step(n2);
}
-#define sched_foreach_from(from, irn) \
- for (ir_node *irn = from; !sched_is_end(irn); irn = sched_next(irn))
+#define sched_foreach_after(after, irn) \
+ for (ir_node *irn = (after); !sched_is_end(irn = sched_next(irn));)
-#define sched_foreach_reverse_from(from, irn) \
- for (ir_node *irn = from; !sched_is_begin(irn); irn = sched_prev(irn))
+#define sched_foreach_reverse_before(before, irn) \
+ for (ir_node *irn = (before); !sched_is_begin(irn = sched_prev(irn));)
/**
* A shorthand macro for iterating over a schedule.
* @param irn A ir node pointer used as an iterator.
*/
#define sched_foreach(block,irn) \
- sched_foreach_from(sched_first(block), irn)
+ sched_foreach_after((assert(is_Block(block)), block), irn)
/**
* A shorthand macro for reversely iterating over a schedule.
* @param irn A ir node pointer used as an iterator.
*/
#define sched_foreach_reverse(block,irn) \
- sched_foreach_reverse_from(sched_last(block), irn)
+ sched_foreach_reverse_before((assert(is_Block(block)), block), irn)
+
+/**
+ * A shorthand macro for iterating over a schedule while the current node may be
+ * removed or replaced.
+ *
+ * @param block The block.
+ * @param irn A ir node pointer used as an iterator.
+ */
+#define sched_foreach_safe(block, irn) \
+ for (ir_node *irn, *irn##__next = sched_first(block); !sched_is_end(irn = irn##__next) ? irn##__next = sched_next(irn), 1 : 0;)
+
+/**
+ * A shorthand macro for reversely iterating over a schedule while the current
+ * node may be removed or replaced.
+ *
+ * @param block The block.
+ * @param irn A ir node pointer used as an iterator.
+ */
+#define sched_foreach_reverse_safe(block, irn) \
+ for (ir_node *irn, *irn##__prev = sched_last(block); !sched_is_begin(irn = irn##__prev) ? irn##__prev = sched_prev(irn), 1 : 0;)
/**
* Type for a function scheduling a graph