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

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

	PR target/45098
	* tree-ssa-loop-niter.c (infer_loop_bounds_from_pointer_arith): New
	function.
	(infer_loop_bounds_from_undefined): Use new function.

From-SVN: r174056
This commit is contained in:
Tom de Vries 2011-05-23 07:27:59 +00:00 committed by Tom de Vries
parent fec5d58b1f
commit bc69f7ffb5
2 changed files with 59 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2011-05-23 Tom de Vries <tom@codesourcery.com>
PR target/45098
* tree-ssa-loop-niter.c (infer_loop_bounds_from_pointer_arith): New
function.
(infer_loop_bounds_from_undefined): Use new function.
2011-05-22 Richard Sandiford <rdsandiford@googlemail.com>
* config/mips/mips.h (SUBTARGET_ASM_OPTIMIZING_SPEC): Delete.

View File

@ -2831,6 +2831,54 @@ infer_loop_bounds_from_array (struct loop *loop, gimple stmt, bool reliable)
}
}
/* Determine information about number of iterations of a LOOP from the fact
that pointer arithmetics in STMT does not overflow. */
static void
infer_loop_bounds_from_pointer_arith (struct loop *loop, gimple stmt)
{
tree def, base, step, scev, type, low, high;
tree var, ptr;
if (!is_gimple_assign (stmt)
|| gimple_assign_rhs_code (stmt) != POINTER_PLUS_EXPR)
return;
def = gimple_assign_lhs (stmt);
if (TREE_CODE (def) != SSA_NAME)
return;
type = TREE_TYPE (def);
if (!nowrap_type_p (type))
return;
ptr = gimple_assign_rhs1 (stmt);
if (!expr_invariant_in_loop_p (loop, ptr))
return;
var = gimple_assign_rhs2 (stmt);
if (TYPE_PRECISION (type) != TYPE_PRECISION (TREE_TYPE (var)))
return;
scev = instantiate_parameters (loop, analyze_scalar_evolution (loop, def));
if (chrec_contains_undetermined (scev))
return;
base = initial_condition_in_loop_num (scev, loop->num);
step = evolution_part_in_loop_num (scev, loop->num);
if (!base || !step
|| TREE_CODE (step) != INTEGER_CST
|| tree_contains_chrecs (base, NULL)
|| chrec_contains_symbols_defined_in_loop (base, loop->num))
return;
low = lower_bound_in_type (type, type);
high = upper_bound_in_type (type, type);
record_nonwrapping_iv (loop, base, step, stmt, low, high, false, true);
}
/* Determine information about number of iterations of a LOOP from the fact
that signed arithmetics in STMT does not overflow. */
@ -2907,7 +2955,10 @@ infer_loop_bounds_from_undefined (struct loop *loop)
infer_loop_bounds_from_array (loop, stmt, reliable);
if (reliable)
infer_loop_bounds_from_signedness (loop, stmt);
{
infer_loop_bounds_from_signedness (loop, stmt);
infer_loop_bounds_from_pointer_arith (loop, stmt);
}
}
}