- if (settings.enabled_ops & ARCH_OPS_MINMAX) {
- ir_node *oldn = n, *cmp, *proj = get_Mux_sel(n);
- long proj_nr;
-
- if (get_irn_op(proj) != op_Proj)
- return n;
-
- cmp = get_Proj_pred(proj);
- if (get_irn_op(cmp) == op_Cmp) {
- ir_node *a = get_Cmp_left(cmp);
- ir_node *b = get_Cmp_right(cmp);
- ir_node *t = get_Mux_true(n);
- ir_node *f = get_Mux_false(n);
-
- proj_nr = get_Proj_proj(proj);
-
- if (proj_nr == pn_Cmp_Lt || proj_nr == pn_Cmp_Le) {
- if (a == t && b == f) {
- /* a </<= b ? a : b ==> Min(a,b) */
- n = new_rd_Min(get_irn_dbg_info(n),
- current_ir_graph,
- get_nodes_block(n),
- a, b,
- get_irn_mode(n));
-
- DBG_OPT_ALGSIM1(oldn, cmp, proj, n);
- return n;
- }
- else if (a == f && b == t) {
- /* a </<= b ? b : a ==> Max(a,b) */
- n = new_rd_Max(get_irn_dbg_info(n),
- current_ir_graph,
- get_nodes_block(n),
- a, b,
- get_irn_mode(n));
-
- DBG_OPT_ALGSIM1(oldn, cmp, proj, n);
- return n;
- }
- }
- else if (proj_nr == pn_Cmp_Gt || proj_nr == pn_Cmp_Ge) {
- if (a == t && b == f) {
- /* a >/>= b ? a : b ==> Max(a,b) */
- n = new_rd_Max(get_irn_dbg_info(n),
- current_ir_graph,
- get_nodes_block(n),
- a, b,
- get_irn_mode(n));
-
- DBG_OPT_ALGSIM1(oldn, cmp, proj, n);
- return n;
- }
- else if (a == f && b == t) {
- /* a >/>= b ? b : a ==> Min(a,b) */
- n = new_rd_Min(get_irn_dbg_info(n),
- current_ir_graph,
- get_nodes_block(n),
- a, b,
- get_irn_mode(n));
-
- DBG_OPT_ALGSIM1(oldn, cmp, proj, n);
- return n;
- }
- }
- }
- }
- return n;
+ if (settings.enabled_ops & ARCH_OPS_MINMAX) {
+ ir_node *oldn = n, *cmp, *proj = get_Mux_sel(n);
+ long proj_nr;
+
+ if (get_irn_op(proj) != op_Proj)
+ return n;
+
+ cmp = get_Proj_pred(proj);
+ if (is_Cmp(cmp)) {
+ ir_node *a = get_Cmp_left(cmp);
+ ir_node *b = get_Cmp_right(cmp);
+ ir_node *t = get_Mux_true(n);
+ ir_node *f = get_Mux_false(n);
+
+ proj_nr = get_Proj_proj(proj);
+
+ if (proj_nr == pn_Cmp_Lt || proj_nr == pn_Cmp_Le) {
+ if (a == t && b == f) {
+ /* a </<= b ? a : b ==> Min(a,b) */
+ n = new_rd_Min(get_irn_dbg_info(n),
+ current_ir_graph,
+ get_nodes_block(n),
+ a, b,
+ get_irn_mode(n));
+
+ DBG_OPT_ALGSIM1(oldn, cmp, proj, n, FS_OPT_MUX_TO_MIN);
+ return n;
+ }
+ else if (a == f && b == t) {
+ /* a </<= b ? b : a ==> Max(a,b) */
+ n = new_rd_Max(get_irn_dbg_info(n),
+ current_ir_graph,
+ get_nodes_block(n),
+ a, b,
+ get_irn_mode(n));
+
+ DBG_OPT_ALGSIM1(oldn, cmp, proj, n, FS_OPT_MUX_TO_MAX);
+ return n;
+ }
+ }
+ else if (proj_nr == pn_Cmp_Gt || proj_nr == pn_Cmp_Ge) {
+ if (a == t && b == f) {
+ /* a >/>= b ? a : b ==> Max(a,b) */
+ n = new_rd_Max(get_irn_dbg_info(n),
+ current_ir_graph,
+ get_nodes_block(n),
+ a, b,
+ get_irn_mode(n));
+
+ DBG_OPT_ALGSIM1(oldn, cmp, proj, n, FS_OPT_MUX_TO_MAX);
+ return n;
+ }
+ else if (a == f && b == t) {
+ /* a >/>= b ? b : a ==> Min(a,b) */
+ n = new_rd_Min(get_irn_dbg_info(n),
+ current_ir_graph,
+ get_nodes_block(n),
+ a, b,
+ get_irn_mode(n));
+
+ DBG_OPT_ALGSIM1(oldn, cmp, proj, n, FS_OPT_MUX_TO_MIN);
+ return n;
+ }
+ }
+ }
+ }
+ return n;
+}
+
+/**
+ * verify a MinMax node
+ */
+static int verify_node_MinMax(ir_node *n, ir_graph *irg) {
+ ir_mode *mymode = get_irn_mode(n);
+ ir_mode *op1mode = get_irn_mode(get_binop_left(n));
+ ir_mode *op2mode = get_irn_mode(get_binop_right(n));
+ (void) irg;
+
+ ASSERT_AND_RET(
+ /* MinMax: BB x numP x numP --> numP */
+ op1mode == mymode &&
+ op2mode == mymode &&
+ mode_is_data(mymode),
+ "Min or Max node", 0
+ );
+ return 1;