-static void optimise_muxs_0(ir_node* mux, void* env)
-{
- ir_node* t;
- ir_node* f;
-
- (void) env;
-
- if (!is_Mux(mux)) return;
-
- t = get_Mux_true(mux);
- f = get_Mux_false(mux);
-
- DB((dbg, LEVEL_3, "Simplify %+F T=%+F F=%+F\n", mux, t, f));
-
- if (is_Unknown(t)) {
- DB((dbg, LEVEL_3, "Replace Mux with unknown operand by %+F\n", f));
- exchange(mux, f);
- return;
- }
- if (is_Unknown(f)) {
- DB((dbg, LEVEL_3, "Replace Mux with unknown operand by %+F\n", t));
- exchange(mux, t);
- return;
- }
-
- if (is_Mux(t)) {
- ir_graph* irg = current_ir_graph;
- ir_node* block = get_nodes_block(mux);
- ir_mode* mode = get_irn_mode(mux);
- ir_node* c0 = get_Mux_sel(mux);
- ir_node* c1 = get_Mux_sel(t);
- ir_node* t1 = get_Mux_true(t);
- ir_node* f1 = get_Mux_false(t);
- if (f == f1) {
- /* Mux(c0, Mux(c1, x, y), y) -> typical if (c0 && c1) x else y */
- ir_node* and_ = new_r_And(irg, block, c0, c1, mode_b);
- ir_node* new_mux = new_r_Mux(irg, block, and_, f1, t1, mode);
- exchange(mux, new_mux);
- } else if (f == t1) {
- /* Mux(c0, Mux(c1, x, y), x) */
- ir_node* not_c1 = new_r_Not(irg, block, c1, mode_b);
- ir_node* and_ = new_r_And(irg, block, c0, not_c1, mode_b);
- ir_node* new_mux = new_r_Mux(irg, block, and_, t1, f1, mode);
- exchange(mux, new_mux);
- }
- } else if (is_Mux(f)) {
- ir_graph* irg = current_ir_graph;
- ir_node* block = get_nodes_block(mux);
- ir_mode* mode = get_irn_mode(mux);
- ir_node* c0 = get_Mux_sel(mux);
- ir_node* c1 = get_Mux_sel(f);
- ir_node* t1 = get_Mux_true(f);
- ir_node* f1 = get_Mux_false(f);
- if (t == t1) {
- /* Mux(c0, x, Mux(c1, x, y)) -> typical if (c0 || c1) x else y */
- ir_node* or_ = new_r_Or(irg, block, c0, c1, mode_b);
- ir_node* new_mux = new_r_Mux(irg, block, or_, f1, t1, mode);
- exchange(mux, new_mux);
- } else if (t == f1) {
- /* Mux(c0, x, Mux(c1, y, x)) */
- ir_node* not_c1 = new_r_Not(irg, block, c1, mode_b);
- ir_node* or_ = new_r_Or(irg, block, c0, not_c1, mode_b);
- ir_node* new_mux = new_r_Mux(irg, block, or_, t1, f1, mode);
- exchange(mux, new_mux);
- }
- }
-}
-
-
-static void optimise_muxs_1(ir_node* mux, void* env)
-{
- ir_node* t;
- ir_node* f;
- ir_mode* mode;
-
- (void) env;
-
- if (!is_Mux(mux)) return;
-
- t = get_Mux_true(mux);
- f = get_Mux_false(mux);
-
- DB((dbg, LEVEL_3, "Simplify %+F T=%+F F=%+F\n", mux, t, f));
-
- mode = get_irn_mode(mux);
-
- if (is_Const(t) && is_Const(f) && (mode_is_int(mode))) {
- ir_node* block = get_nodes_block(mux);
- ir_node* c = get_Mux_sel(mux);
- tarval* tv_t = get_Const_tarval(t);
- tarval* tv_f = get_Const_tarval(f);
- if (tarval_is_one(tv_t) && tarval_is_null(tv_f)) {
- ir_node* conv = new_r_Conv(current_ir_graph, block, c, mode);
- exchange(mux, conv);
- } else if (tarval_is_null(tv_t) && tarval_is_one(tv_f)) {
- ir_node* not_ = new_r_Not(current_ir_graph, block, c, mode_b);
- ir_node* conv = new_r_Conv(current_ir_graph, block, not_, mode);
- exchange(mux, conv);
- }
- }
-}
-
-
-void opt_if_conv(ir_graph *irg, const ir_settings_if_conv_t *params)