Add - (a - b) = b - a transformation
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Mon, 20 Aug 2007 11:21:47 +0000 (11:21 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Mon, 20 Aug 2007 11:21:47 +0000 (11:21 +0000)
[r15568]

include/libfirm/firmstat.h
ir/ir/iropt.c
ir/stat/stat_dmp.c

index a36205d..94953d9 100644 (file)
@@ -54,6 +54,7 @@ enum firmstat_optimizations_t {
        FS_OPT_ADD_SUB,                           /**< (a + x) - x = (a - x) + x */
        FS_OPT_ADD_MUL_A_X_A,                     /**< a * x + a = a * (x + 1) */
        FS_OPT_SUB_0_A,                           /**< 0 - a = -a */
+       FS_OPT_MINUS_SUB,                         /**< - (a - b) = b - a */
        FS_OPT_SUB_MUL_A_X_A,                     /**< a * x - a = a * (x - 1) */
        FS_OPT_SUB_SUB_X_Y_Z,                     /**< (x - y) - z = x - (y + z) */
        FS_OPT_MUL_MINUS_1,                       /**< a * -1 = -a */
index 22df826..08061dc 100644 (file)
@@ -2758,6 +2758,14 @@ static ir_node *transform_node_Minus(ir_node *n) {
                ir_node *c    = new_r_Const(current_ir_graph, blk, mode, tv);
                n = new_rd_Add(get_irn_dbg_info(n), current_ir_graph, blk, op, c, mode);
                DBG_OPT_ALGSIM2(oldn, a, n, FS_OPT_MINUS_NOT);
+       } else if (is_Sub(a)) {
+               /* - (a-b) = b - a */
+               ir_node *la  = get_Sub_left(a);
+               ir_node *ra  = get_Sub_right(a);
+               ir_node *blk = get_irn_n(n, -1);
+
+               n = new_rd_Sub(get_irn_dbg_info(n), current_ir_graph, blk, ra, la, mode);
+               DBG_OPT_ALGSIM2(oldn, a, n, FS_OPT_MINUS_SUB);
        }
 
        return n;
index 7516aae..b652af8 100644 (file)
@@ -72,6 +72,7 @@ static const struct {
        { FS_OPT_ADD_SUB,        "algebraic simplification: (a + x) - x = (a - x) + x = a" },
        { FS_OPT_ADD_MUL_A_X_A,  "algebraic simplification: a * x + a = a * (x + 1)" },
        { FS_OPT_SUB_0_A,        "algebraic simplification: 0 - a = -a" },
+       { FS_OPT_MINUS_SUB,      "algebraic simplification: -(a - b) = b - a" },
        { FS_OPT_SUB_MUL_A_X_A,  "algebraic simplification: a * x - a = a * (x - 1)" },
        { FS_OPT_SUB_SUB_X_Y_Z,  "algebraic simplification: (x - y) - z = x - (y + z)" },
        { FS_OPT_MUL_MINUS_1,    "algebraic simplification: a * -1 = -a" },