From 2fd09004a61ad8af1655627a55ab16e803c58b0c Mon Sep 17 00:00:00 2001 From: Christoph Mallon Date: Wed, 9 Sep 2009 10:52:13 +0000 Subject: [PATCH] Today's localopt: a * (1 << x) -> a << x. [r26503] --- ir/ir/iropt.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index c8d5383e4..d80880bd8 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -2775,6 +2775,28 @@ static ir_node *transform_node_Mul(ir_node *n) { DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_MUL_MINUS); return n; } + } else if (is_Shl(a)) { + ir_node *const shl_l = get_Shl_left(a); + if (is_Const(shl_l) && is_Const_one(shl_l)) { + /* (1 << x) * b -> b << x */ + dbg_info *const dbgi = get_irn_dbg_info(n); + ir_node *const block = get_nodes_block(n); + ir_node *const shl_r = get_Shl_right(a); + n = new_rd_Shl(dbgi, block, b, shl_r, mode); + // TODO add me DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_MUL_SHIFT); + return n; + } + } else if (is_Shl(b)) { + ir_node *const shl_l = get_Shl_left(b); + if (is_Const(shl_l) && is_Const_one(shl_l)) { + /* a * (1 << x) -> a << x */ + dbg_info *const dbgi = get_irn_dbg_info(n); + ir_node *const block = get_nodes_block(n); + ir_node *const shl_r = get_Shl_right(b); + n = new_rd_Shl(dbgi, block, a, shl_r, mode); + // TODO add me DBG_OPT_ALGSIM1(oldn, a, b, n, FS_OPT_MUL_SHIFT); + return n; + } } if (get_mode_arithmetic(mode) == irma_ieee754) { if (is_Const(a)) { -- 2.20.1