+/**
+ * an impossible ir_node * != NULL
+ */
+static const char _anchor;
+#define ANCHOR ((ir_node *)&_anchor)
+
+/**
+ * optimize constant cond with projs
+ *
+ * If we come here, we should have 3 situations:
+ *
+ * 1.) Only one Proj exists: This should be the default Proj, convert to jump
+ * 2.) Two Proj's exists: One is the taken, the other the not-taken default proj
+ * 3.) More than 2 Proj's: local_optimize() did not run or internal error do nothing
+ */
+static void optimize_const_conds(ir_node *cond_list)
+{
+ ir_node *cond, *next;
+
+ for (cond = cond_list; cond != ANCHOR; cond = next) {
+ ir_node *block, *jmp;
+ ir_node *proj = NULL, *def_proj = NULL;
+ int num = 0;
+
+ for (next = get_irn_link(cond); next != ANCHOR; next = get_irn_link(next)) {
+ if (get_irn_op(next) == op_Cond)
+ break;
+
+ assert(get_irn_op(next) == op_Proj && "something neither Cond not Proj in cond-list");
+ assert(get_Proj_pred(next) == cond && "cond-list corrupt");
+
+ if (get_Proj_proj(next) == get_Cond_defaultProj(cond))
+ def_proj = next;
+ else
+ proj = next;
+ ++num;
+ }
+
+ if (num == 1) {
+ assert(def_proj);
+
+ block = get_nodes_block(def_proj);
+ jmp = new_rd_Jmp(get_irn_dbg_info(def_proj), current_ir_graph, block);
+ exchange(def_proj, jmp);
+ }
+ else if (num == 2) {
+ assert(def_proj && proj);
+
+ exchange(def_proj, new_Bad());
+
+ block = get_nodes_block(proj);
+ jmp = new_rd_Jmp(get_irn_dbg_info(proj), current_ir_graph, block);
+ exchange(proj, jmp);
+ }
+ }
+}
+