#ifndef FIRM_IR_IROPT_T_H
#define FIRM_IR_IROPT_T_H
+#include <stdbool.h>
+#include "irop_t.h"
#include "iropt.h"
#include "irnode_t.h"
#include "pset.h"
#include "tv.h"
-ir_node *equivalent_node(ir_node *n);
-
/**
* Calculate a hash value of a node.
- * The hash value is calculated from the nodes predecessors.
- * Special handling for Const and SymConst nodes (these don't have predecessors).
*
* @param node The IR-node
*/
-unsigned ir_node_hash(ir_node *node);
+unsigned ir_node_hash(const ir_node *node);
+
+/**
+ * equivalent_node() returns a node equivalent to input n. It skips all nodes that
+ * perform no actual computation, as, e.g., the Id nodes. It does not create
+ * new nodes. It is therefore safe to free n if the node returned is not n.
+ * If a node returns a Tuple we can not just skip it. If the size of the
+ * in array fits, we transform n into a tuple (e.g., Div).
+ */
+ir_node *equivalent_node(ir_node *n);
/**
* Creates a new value table used for storing CSE identities.
* The value table is used to identify common expressions.
- *
*/
-pset *new_identities(void);
+void new_identities(ir_graph *irg);
/**
* Deletes a identities value table.
*
* @param value_table the identity set
*/
-void del_identities(pset *value_table);
+void del_identities(ir_graph *irg);
/**
* Add a node to the identities value table.
*/
-void add_identities(pset *value_table, ir_node *node);
+void add_identities(ir_node *node);
/**
* Compare function for two nodes in the hash table. Gets two
* Looks up the node in a hash table, enters it in the table
* if it isn't there yet.
*/
-ir_node *identify_remember(pset *value_table, ir_node *n);
+ir_node *identify_remember(ir_node *n);
/** Visit each node in the value table of a graph. */
void visit_all_identities(ir_graph *irg, irg_walk_func visit, void *env);
+/**
+ * Normalize a node by putting constants (and operands with larger
+ * node index) on the right (operator side).
+ *
+ * @param n The node to normalize
+ */
+void ir_normalize_node(ir_node *n);
+
ir_node *optimize_node(ir_node *n);
ir_node *optimize_in_place_2(ir_node *n);
/**
- * Returns the tarval of a Const node or tarval_bad for all other nodes.
+ * The value_of operation.
+ * This operation returns for every IR node an associated tarval if existing,
+ * returning tarval_bad otherwise.
+ * No calculations are done here, just a lookup.
+ */
+typedef ir_tarval *(*value_of_func)(const ir_node *self);
+
+extern value_of_func value_of_ptr;
+
+/**
+ * Set a new value_of function.
+ *
+ * @param func the function, NULL restores the default behavior
+ */
+void set_value_of_func(value_of_func func);
+
+/**
+ * Returns the associated tarval of a node.
*/
-static INLINE tarval *
-value_of(ir_node *n) {
- if ((n != NULL) && (get_irn_op(n) == op_Const))
- return get_Const_tarval(n); /* might return tarval_bad */
- else
- return tarval_bad;
+static inline ir_tarval *value_of(const ir_node *n)
+{
+ return value_of_ptr(n);
}
+/**
+ * returns true if a value becomes zero when converted to mode @p mode
+ */
+bool ir_zero_when_converted(const ir_node *node, ir_mode *dest_mode);
+
/**
* Sets the default operations for an ir_op_ops.
*
* @return
* The operations.
*/
-ir_op_ops *firm_set_default_operations(ir_opcode code, ir_op_ops *ops);
+ir_op_ops *firm_set_default_operations(unsigned code, ir_op_ops *ops);
+
+int ir_mux_is_abs(const ir_node *sel, const ir_node *mux_true,
+ const ir_node *mux_false);
+
+ir_node *ir_get_abs_op(const ir_node *sel, ir_node *mux_true,
+ ir_node *mux_false);
#endif