From 36456726962a76592ac19ea06132031d17328f26 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Mon, 3 Sep 2007 13:28:29 +0000 Subject: [PATCH] Sub(x, Const) -> Add(x, -Const) [r15660] --- ir/ir/iropt.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index 5282dbdee..7164938c4 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -2025,6 +2025,7 @@ static ir_node *transform_node_Add(ir_node *n) { * Sub(Sub(x, y), b) -> Sub(x, Add(y,b)) * Sub(Add(a, x), x) -> a * Sub(x, Add(x, a)) -> -a + * Sub(x, Const) -> Add(x, -Const) */ static ir_node *transform_node_Sub(ir_node *n) { ir_mode *mode; @@ -2045,6 +2046,22 @@ restart: if (mode_is_float(mode) && (get_irg_fp_model(current_ir_graph) & fp_strict_algebraic)) return n; + /* Sub(a, Const) -> Add(a, -Const) */ + if (is_Const(b)) { + tarval *tv = get_Const_tarval(b); + + tv = tarval_neg(tv); + if(tv != tarval_bad) { + ir_node *cnst = new_Const(get_irn_mode(b), tv); + ir_node *block = get_nodes_block(n); + dbg_info *dbgi = get_irn_dbg_info(n); + ir_graph *irg = get_irn_irg(n); + ir_node *add = new_rd_Add(dbgi, irg, block, a, cnst, mode); + + return add; + } + } + if (is_Add(a)) { if (mode_wrap_around(mode)) { ir_node *left = get_Add_left(a); -- 2.20.1