- fix most of the -Wunreachable-code and -Wlogical-op warnings
[libfirm] / ir / ir / iropt_t.h
index f6c3625..196454c 100644 (file)
 #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.
@@ -77,19 +84,41 @@ ir_node *identify_remember(pset *value_table, 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 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) && is_Const(n))
-               return get_Const_tarval(n); /* might return tarval_bad */
-       else
-               return tarval_bad;
+static inline tarval *value_of(const ir_node *n)
+{
+       return value_of_ptr(n);
 }
 
 /**
@@ -103,4 +132,36 @@ value_of(ir_node *n) {
  */
 ir_op_ops *firm_set_default_operations(ir_opcode code, ir_op_ops *ops);
 
+/**
+ * Returns true if a == -b
+ */
+bool is_negated_value(ir_node *a, ir_node *b);
+
+
+
+/** NOTE: Survive DCE is considered a bad hack - don't use */
+typedef struct _survive_dce_t survive_dce_t;
+
+/**
+ * Make a new Survive DCE environment.
+ * NOTE: Survive DCE is considered a bad hack - don't use
+ */
+survive_dce_t *new_survive_dce(void);
+
+/**
+ * Free a Survive DCE environment.
+ * NOTE: Survive DCE is considered a bad hack - don't use
+ */
+void free_survive_dce(survive_dce_t *sd);
+
+/**
+ * Register a node pointer to be patched upon DCE.
+ * When DCE occurs, the node pointer specified by @p place will be
+ * patched to the new address of the node it is pointing to.
+ *
+ * @param sd    The Survive DCE environment.
+ * @param place The address of the node pointer.
+ */
+void survive_dce_register_irn(survive_dce_t *sd, ir_node **place);
+
 #endif