/**
* @file
* @brief Available Optimisations of libFirm.
- * @version $Id$
*/
#ifndef FIRM_IROPTIMIZE_H
#define FIRM_IROPTIMIZE_H
#include "nodeops.h"
#include "begin.h"
+/**
+ * @defgroup iroptimize Transformations and Optimisations
+ * @{
+ */
+
/**
* Control flow optimization.
*
* Independent of compiler flag it removes Tuples from cf edges,
* Bad predecessors from Blocks and Phis, and unnecessary predecessors of End.
* Destroys backedge information.
- *
- * @bug Chokes on Id nodes if called in a certain order with other
- * optimizations. Call local_optimize_graph() before to remove
- * Ids.
*/
FIRM_API void optimize_cf(ir_graph *irg);
* graphs.
*
* If callee information is valid, we also optimize polymorphic Calls.
- *
- * @param force_run if non-zero, an optimization run is started even
- * if no const function graph was detected.
- * Else calls are only optimized if at least one
- * const function graph was detected.
- * @param callback a callback function to check whether a
- * given entity is a allocation call
- *
- * If the frontend created external entities with the irg_const_function
- * property set, the force_run parameter should be set, else
- * should be unset.
- *
- * @note This optimization destroys the link fields of nodes.
*/
-FIRM_API void optimize_funccalls(int force_run,
- check_alloc_entity_func callback);
+FIRM_API void optimize_funccalls(void);
/**
* Creates an ir_prog pass for optimize_funccalls().
*
* @param name the name of this pass or NULL
- * @param force_run if non-zero, an optimization run is started even
- * if no const function graph was detected.
- * Else calls are only optimized if at least one
- * const function graph was detected.
- * @param callback a callback function to check whether a
- * given entity is a allocation call
- *
* @return the newly created ir_prog pass
*/
-FIRM_API ir_prog_pass_t *optimize_funccalls_pass(const char *name,
- int force_run,
- check_alloc_entity_func callback);
+FIRM_API ir_prog_pass_t *optimize_funccalls_pass(const char *name);
/**
* Does Partial Redundancy Elimination combined with
*
* @param irg The graph whose loops will be processed
*
- * This function did not change the graph, only it's frame type.
+ * This function did not change the graph, only its frame type.
* The layout state of the frame type will be set to layout_undefined
* if entities were removed.
*/
*
* @param irg The graph whose frame type will be optimized
*
- * This function did not change the graph, only it's frame type.
+ * This function did not change the graph, only its frame type.
* The layout state of the frame type will be set to layout_undefined
* if entities were removed.
*/
*/
FIRM_API ir_graph_pass_t *loop_peeling_pass(const char *name);
-typedef ir_type *(*get_Alloc_func)(ir_node *n);
-/** Set a new get_Alloc_func and returns the old one. */
-FIRM_API get_Alloc_func firm_set_Alloc_func(get_Alloc_func newf);
-
/**
* Creates an ir_graph pass for set_vrp_data()
*
* @param confirm if n is confirmed to be != 0, returns
* the the Confirm-node, else NULL
*/
-FIRM_API int value_not_zero(const ir_node *n, ir_node_cnst_ptr *confirm);
+FIRM_API int value_not_zero(const ir_node *n, const ir_node **confirm);
/**
* Check, if the value of a node cannot represent a NULL pointer.
* @param confirm if n is confirmed to be != NULL, returns
* the the Confirm-node, else NULL
*/
-FIRM_API int value_not_null(const ir_node *n, ir_node_cnst_ptr *confirm);
+FIRM_API int value_not_null(const ir_node *n, const ir_node **confirm);
/**
* Check, if the value of a node can be confirmed >= 0 or <= 0,
* Return the value of a Cmp if one or both predecessors
* are Confirm nodes.
*
- * @param cmp the compare node that will be evaluated
- * @param left the left operand of the Cmp
- * @param right the right operand of the Cmp
- * @param pnc the compare relation
+ * @param cmp the compare node that will be evaluated
+ * @param left the left operand of the Cmp
+ * @param right the right operand of the Cmp
+ * @param relation the compare relation
*/
FIRM_API ir_tarval *computed_value_Cmp_Confirm(
- ir_node *cmp, ir_node *left, ir_node *right, pn_Cmp pnc);
+ const ir_node *cmp, ir_node *left, ir_node *right, ir_relation relation);
+
+typedef ir_entity *(*compilerlib_entity_creator_t)(ident *id, ir_type *mt);
+/**
+ * Set the compilerlib entity creation callback that is used to create
+ * compilerlib function entities.
+ *
+ * @param cb the new compilerlib entity creation callback
+ */
+FIRM_API void set_compilerlib_entity_creator(compilerlib_entity_creator_t cb);
+
+/**
+ * Get the compilerlib entity creation callback.
+ */
+FIRM_API compilerlib_entity_creator_t get_compilerlib_entity_creator(void);
+
+/**
+ * Construct the entity for a given function using the current compilerlib
+ * entity creation callback.
+ *
+ * @param id the identifier of the compilerlib function
+ * @param mt the method type of the compilerlib function
+ */
+FIRM_API ir_entity *create_compilerlib_entity(ident *id, ir_type *mt);
+
+/** @} */
#include "end.h"