+ for (i = 0; i < arity;) {
+ ir_node *pred = get_Sync_pred(n, i);
+ int j;
+
+ /* Remove Bad predecessors */
+ if (is_Bad(pred)) {
+ del_Sync_n(n, i);
+ --arity;
+ continue;
+ }
+
+ /* Remove duplicate predecessors */
+ for (j = 0;; ++j) {
+ if (j >= i) {
+ ++i;
+ break;
+ }
+ if (get_Sync_pred(n, j) == pred) {
+ del_Sync_n(n, i);
+ --arity;
+ break;
+ }
+ }
+ }
+
+ if (arity == 0) return get_irg_bad(current_ir_graph);
+ if (arity == 1) return get_Sync_pred(n, 0);
+ return n;
+} /* equivalent_node_Sync */
+
+/**
+ * Optimize Proj(Tuple).
+ */
+static ir_node *equivalent_node_Proj_Tuple(ir_node *proj) {
+ ir_node *oldn = proj;
+ ir_node *tuple = get_Proj_pred(proj);
+
+ /* Remove the Tuple/Proj combination. */
+ proj = get_Tuple_pred(tuple, get_Proj_proj(proj));
+ DBG_OPT_TUPLE(oldn, tuple, proj);
+
+ return proj;
+} /* equivalent_node_Proj_Tuple */
+
+/**
+ * Optimize a / 1 = a.
+ */
+static ir_node *equivalent_node_Proj_Div(ir_node *proj) {
+ ir_node *oldn = proj;
+ ir_node *div = get_Proj_pred(proj);
+ ir_node *b = get_Div_right(div);
+ tarval *tb = value_of(b);
+
+ /* Div is not commutative. */
+ if (tarval_is_one(tb)) { /* div(x, 1) == x */
+ switch (get_Proj_proj(proj)) {
+ case pn_Div_M:
+ proj = get_Div_mem(div);
+ DBG_OPT_ALGSIM0(oldn, proj, FS_OPT_NEUTRAL_1);
+ return proj;
+
+ case pn_Div_res:
+ proj = get_Div_left(div);
+ DBG_OPT_ALGSIM0(oldn, proj, FS_OPT_NEUTRAL_1);
+ return proj;
+
+ default:
+ /* we cannot replace the exception Proj's here, this is done in
+ transform_node_Proj_Div() */
+ return proj;
+ }
+ }
+ return proj;
+} /* equivalent_node_Proj_Div */
+
+/**
+ * Optimize a / 1.0 = a.
+ */
+static ir_node *equivalent_node_Proj_Quot(ir_node *proj) {
+ ir_node *oldn = proj;
+ ir_node *quot = get_Proj_pred(proj);
+ ir_node *b = get_Quot_right(quot);
+ tarval *tb = value_of(b);
+
+ /* Div is not commutative. */
+ if (tarval_is_one(tb)) { /* Quot(x, 1) == x */
+ switch (get_Proj_proj(proj)) {
+ case pn_Quot_M:
+ proj = get_Quot_mem(quot);
+ DBG_OPT_ALGSIM0(oldn, proj, FS_OPT_NEUTRAL_1);
+ return proj;
+
+ case pn_Quot_res:
+ proj = get_Quot_left(quot);
+ DBG_OPT_ALGSIM0(oldn, proj, FS_OPT_NEUTRAL_1);
+ return proj;
+
+ default:
+ /* we cannot replace the exception Proj's here, this is done in
+ transform_node_Proj_Quot() */
+ return proj;
+ }
+ }
+ return proj;
+} /* equivalent_node_Proj_Quot */
+
+/**
+ * Optimize a / 1 = a.
+ */
+static ir_node *equivalent_node_Proj_DivMod(ir_node *proj) {
+ ir_node *oldn = proj;
+ ir_node *divmod = get_Proj_pred(proj);
+ ir_node *b = get_DivMod_right(divmod);
+ tarval *tb = value_of(b);
+
+ /* Div is not commutative. */
+ if (tarval_is_one(tb)) { /* div(x, 1) == x */
+ switch (get_Proj_proj(proj)) {
+ case pn_DivMod_M:
+ proj = get_DivMod_mem(divmod);
+ DBG_OPT_ALGSIM0(oldn, proj, FS_OPT_NEUTRAL_1);
+ return proj;
+
+ case pn_DivMod_res_div:
+ proj = get_DivMod_left(divmod);
+ DBG_OPT_ALGSIM0(oldn, proj, FS_OPT_NEUTRAL_1);
+ return proj;
+
+ default:
+ /* we cannot replace the exception Proj's here, this is done in
+ transform_node_Proj_DivMod().
+ Note further that the pn_DivMod_res_div case is handled in
+ computed_value_Proj(). */
+ return proj;
+ }
+ }
+ return proj;
+} /* equivalent_node_Proj_DivMod */