* Michael Beck
* @version $Id$
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "config.h"
#include "irop_t.h"
#include "irnode_t.h"
* @param n IR node
* @param env Environment of walker.
*/
-static void walk_critical_cf_edges(ir_node *n, void *env) {
+static void walk_critical_cf_edges(ir_node *n, void *env)
+{
int arity, i;
ir_node *pre, *block, *jmp;
- cf_env *cenv = env;
+ cf_env *cenv = (cf_env*)env;
ir_graph *irg = get_irn_irg(n);
/* Block has multiple predecessors */
cfop = get_irn_op(skip_Proj(pre));
if (is_op_fragile(cfop)) {
- if (cenv->ignore_exc_edges && get_Proj_proj(pre) == pn_Generic_X_except)
+ if (cenv->ignore_exc_edges && is_x_except_Proj(pre))
continue;
goto insert;
}
+ if (is_unknown_jump(pre)) {
+ /* we can't add blocks in between ijmp and its destinations
+ * TODO: What now, we can't split all critical edges because of this... */
+ fprintf(stderr, "libfirm warning: Couldn't split all critical edges (compiler will probably fail now)\n");
+ continue;
+ }
/* we don't want place nodes in the start block, so handle it like forking */
if (is_op_forking(cfop) || cfop == op_Start) {
/* Predecessor has multiple successors. Insert new control flow edge edges. */
/* set predecessor of new block */
block = new_r_Block(irg, 1, &pre);
/* insert new jmp node to new block */
- jmp = new_r_Jmp(irg, block);
+ jmp = new_r_Jmp(block);
/* set successor of new block */
set_irn_n(n, i, jmp);
cenv->changed = 1;
} /* n is a multi-entry block */
}
-void remove_critical_cf_edges(ir_graph *irg) {
+void remove_critical_cf_edges_ex(ir_graph *irg, int ignore_exception_edges)
+{
cf_env env;
- env.ignore_exc_edges = 1;
+ env.ignore_exc_edges = (char)ignore_exception_edges;
env.changed = 0;
irg_block_walk_graph(irg, NULL, walk_critical_cf_edges, &env);
if (env.changed) {
/* control flow changed */
- set_irg_outs_inconsistent(irg);
set_irg_extblk_inconsistent(irg);
set_irg_doms_inconsistent(irg);
- set_irg_loopinfo_inconsistent(irg);
}
}
+
+void remove_critical_cf_edges(ir_graph *irg)
+{
+ remove_critical_cf_edges_ex(irg, 1);
+}