From 0baec171fe56a677b1b65cfe5beafff54723ad5b Mon Sep 17 00:00:00 2001 From: Christoph Mallon Date: Thu, 7 Aug 2008 20:40:20 +0000 Subject: [PATCH] Transform a - (b - c) into (a - b) + c instead of a + (c - b) iff (b - c) is a pointer. [r21056] --- ir/ir/iropt.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index 22f08e4ec..85c527014 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -2363,18 +2363,30 @@ restart: n = new_rd_Add(dbg, irg, block, a, right, mode); DBG_OPT_ALGSIM0(oldn, n, FS_OPT_SUB_MINUS); return n; - } else if (is_Sub(b)) { /* a - (b - c) -> a + (c - b) */ + } else if (is_Sub(b)) { + /* a - (b - c) -> a + (c - b) + * -> (a - b) + c iff (b - c) is a pointer */ ir_graph *irg = current_ir_graph; dbg_info *s_dbg = get_irn_dbg_info(b); ir_node *s_block = get_nodes_block(b); - ir_node *s_left = get_Sub_right(b); - ir_node *s_right = get_Sub_left(b); + ir_node *s_left = get_Sub_left(b); + ir_node *s_right = get_Sub_right(b); ir_mode *s_mode = get_irn_mode(b); - ir_node *sub = new_rd_Sub(s_dbg, irg, s_block, s_left, s_right, s_mode); - dbg_info *a_dbg = get_irn_dbg_info(n); - ir_node *a_block = get_nodes_block(n); + if (s_mode == mode_P) { + ir_node *sub = new_rd_Sub(s_dbg, irg, s_block, a, s_left, mode); + dbg_info *a_dbg = get_irn_dbg_info(n); + ir_node *a_block = get_nodes_block(n); + + if (s_mode != mode) + s_right = new_r_Conv(irg, a_block, s_right, mode); + n = new_rd_Add(a_dbg, irg, a_block, sub, s_right, mode); + } else { + ir_node *sub = new_rd_Sub(s_dbg, irg, s_block, s_right, s_left, s_mode); + dbg_info *a_dbg = get_irn_dbg_info(n); + ir_node *a_block = get_nodes_block(n); - n = new_rd_Add(a_dbg, irg, a_block, a, sub, mode); + n = new_rd_Add(a_dbg, irg, a_block, a, sub, mode); + } DBG_OPT_ALGSIM0(oldn, n, FS_OPT_SUB_TO_ADD); return n; } else if (is_Mul(b)) { /* a - (b * C) -> a + (b * -C) */ -- 2.20.1