Slightly reduce code duplication.
[libfirm] / ir / ir / iropt.c
index af2c377..d9b2966 100644 (file)
@@ -1219,16 +1219,15 @@ restart:
                                        goto restart;
                                }
                                /* else both are strict conv, second is superfluous */
-                       } else if (is_Proj(a)) {
-                               ir_node *pred = get_Proj_pred(a);
-                               if (is_Load(pred)) {
-                                       /* loads always return with the exact precision of n_mode */
-                                       assert(get_Load_mode(pred) == n_mode);
-                                       return a;
-                               }
-                               /* leave strict floating point Conv's */
-                               return n;
                        } else {
+                               if (is_Proj(a)) {
+                                       ir_node *pred = get_Proj_pred(a);
+                                       if (is_Load(pred)) {
+                                               /* loads always return with the exact precision of n_mode */
+                                               assert(get_Load_mode(pred) == n_mode);
+                                               return a;
+                                       }
+                               }
                                /* leave strict floating point Conv's */
                                return n;
                        }
@@ -2718,7 +2717,8 @@ static ir_node *transform_node_Mul(ir_node *n) {
        if (get_mode_arithmetic(mode) == irma_ieee754) {
                if (is_Const(a)) {
                        tarval *tv = get_Const_tarval(a);
-                       if (tarval_ieee754_get_exponent(tv) == 1 && tarval_ieee754_zero_mantissa(tv)) {
+                       if (tarval_ieee754_get_exponent(tv) == 1 && tarval_ieee754_zero_mantissa(tv)
+                                       && !tarval_is_negative(tv)) {
                                /* 2.0 * b = b + b */
                                n = new_rd_Add(get_irn_dbg_info(n), current_ir_graph, get_nodes_block(n), b, b, mode);
                                DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_ADD_A_A);
@@ -2727,7 +2727,8 @@ static ir_node *transform_node_Mul(ir_node *n) {
                }
                else if (is_Const(b)) {
                        tarval *tv = get_Const_tarval(b);
-                       if (tarval_ieee754_get_exponent(tv) == 1 && tarval_ieee754_zero_mantissa(tv)) {
+                       if (tarval_ieee754_get_exponent(tv) == 1 && tarval_ieee754_zero_mantissa(tv)
+                                       && !tarval_is_negative(tv)) {
                                /* a * 2.0 = a + a */
                                n = new_rd_Add(get_irn_dbg_info(n), current_ir_graph, get_nodes_block(n), a, a, mode);
                                DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_ADD_A_A);
@@ -5742,12 +5743,17 @@ static int node_cmp_attr_Call(ir_node *a, ir_node *b) {
 static int node_cmp_attr_Sel(ir_node *a, ir_node *b) {
        const ir_entity *a_ent = get_Sel_entity(a);
        const ir_entity *b_ent = get_Sel_entity(b);
+#if 0
        return
                (a_ent->kind    != b_ent->kind)    ||
                (a_ent->name    != b_ent->name)    ||
                (a_ent->owner   != b_ent->owner)   ||
                (a_ent->ld_name != b_ent->ld_name) ||
                (a_ent->type    != b_ent->type);
+#endif
+       /* Matze: inlining of functions can produce 2 entities with same type,
+        * name, etc. */
+       return a_ent != b_ent;
 }  /* node_cmp_attr_Sel */
 
 /** Compares the attributes of two Phi nodes. */