Commit e6450c11 by Tom de Vries Committed by Tom de Vries

re PR middle-end/45098 (Missed induction variable optimization)

2011-05-20  Tom de Vries  <tom@codesourcery.com>

	PR target/45098
	* tree-ssa-loop-ivopts.c: Include expmed.h.
	(get_shiftadd_cost): New function.
	(force_expr_to_var_cost): Declare forward.  Use get_shiftadd_cost.

From-SVN: r173976
parent 0e8b84ec
2011-05-20 Tom de Vries <tom@codesourcery.com>
PR target/45098
* tree-ssa-loop-ivopts.c: Include expmed.h.
(get_shiftadd_cost): New function.
(force_expr_to_var_cost): Declare forward. Use get_shiftadd_cost.
2011-05-20 Jakub Jelinek <jakub@redhat.com>
PR bootstrap/49086
......
......@@ -92,6 +92,12 @@ along with GCC; see the file COPYING3. If not see
#include "tree-inline.h"
#include "tree-ssa-propagate.h"
/* FIXME: add_cost and zero_cost defined in exprmed.h conflict with local uses.
*/
#include "expmed.h"
#undef add_cost
#undef zero_cost
/* FIXME: Expressions are expanded to RTL in this pass to determine the
cost of different addressing modes. This should be moved to a TBD
interface between the GIMPLE and RTL worlds. */
......@@ -377,6 +383,8 @@ struct iv_ca_delta
static VEC(tree,heap) *decl_rtl_to_reset;
static comp_cost force_expr_to_var_cost (tree, bool);
/* Number of uses recorded in DATA. */
static inline unsigned
......@@ -3506,6 +3514,42 @@ get_address_cost (bool symbol_present, bool var_present,
return new_cost (cost + acost, complexity);
}
/* Calculate the SPEED or size cost of shiftadd EXPR in MODE. MULT is the
the EXPR operand holding the shift. COST0 and COST1 are the costs for
calculating the operands of EXPR. Returns true if successful, and returns
the cost in COST. */
static bool
get_shiftadd_cost (tree expr, enum machine_mode mode, comp_cost cost0,
comp_cost cost1, tree mult, bool speed, comp_cost *cost)
{
comp_cost res;
tree op1 = TREE_OPERAND (expr, 1);
tree cst = TREE_OPERAND (mult, 1);
tree multop = TREE_OPERAND (mult, 0);
int m = exact_log2 (int_cst_value (cst));
int maxm = MIN (BITS_PER_WORD, GET_MODE_BITSIZE (mode));
int sa_cost;
if (!(m >= 0 && m < maxm))
return false;
sa_cost = (TREE_CODE (expr) != MINUS_EXPR
? shiftadd_cost[speed][mode][m]
: (mult == op1
? shiftsub1_cost[speed][mode][m]
: shiftsub0_cost[speed][mode][m]));
res = new_cost (sa_cost, 0);
res = add_costs (res, mult == op1 ? cost0 : cost1);
STRIP_NOPS (multop);
if (!is_gimple_val (multop))
res = add_costs (res, force_expr_to_var_cost (multop, speed));
*cost = res;
return true;
}
/* Estimates cost of forcing expression EXPR into a variable. */
static comp_cost
......@@ -3631,6 +3675,21 @@ force_expr_to_var_cost (tree expr, bool speed)
case MINUS_EXPR:
case NEGATE_EXPR:
cost = new_cost (add_cost (mode, speed), 0);
if (TREE_CODE (expr) != NEGATE_EXPR)
{
tree mult = NULL_TREE;
comp_cost sa_cost;
if (TREE_CODE (op1) == MULT_EXPR)
mult = op1;
else if (TREE_CODE (op0) == MULT_EXPR)
mult = op0;
if (mult != NULL_TREE
&& TREE_CODE (TREE_OPERAND (mult, 1)) == INTEGER_CST
&& get_shiftadd_cost (expr, mode, cost0, cost1, mult, speed,
&sa_cost))
return sa_cost;
}
break;
case MULT_EXPR:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment