Commit 0703f020 by Tom de Vries Committed by Tom de Vries

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

2011-06-16  Tom de Vries  <tom@codesourcery.com>

	PR target/45098
	* tree-ssa-loop-niter.c (infer_loop_bounds_from_pointer_arith): Disallow
	NULL pointer for pointer arithmetic.

From-SVN: r175105
parent 900c07da
2011-06-16 Tom de Vries <tom@codesourcery.com>
PR target/45098
* tree-ssa-loop-niter.c (infer_loop_bounds_from_pointer_arith): Disallow
NULL pointer for pointer arithmetic.
2011-06-16 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org> 2011-06-16 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org>
PR target/49398 PR target/49398
......
...@@ -2875,6 +2875,16 @@ infer_loop_bounds_from_pointer_arith (struct loop *loop, gimple stmt) ...@@ -2875,6 +2875,16 @@ infer_loop_bounds_from_pointer_arith (struct loop *loop, gimple stmt)
low = lower_bound_in_type (type, type); low = lower_bound_in_type (type, type);
high = upper_bound_in_type (type, type); high = upper_bound_in_type (type, type);
/* In C, pointer arithmetic p + 1 cannot use a NULL pointer, and p - 1 cannot
produce a NULL pointer. The contrary would mean NULL points to an object,
while NULL is supposed to compare unequal with the address of all objects.
Furthermore, p + 1 cannot produce a NULL pointer and p - 1 cannot use a
NULL pointer since that would mean wrapping, which we assume here not to
happen. So, we can exclude NULL from the valid range of pointer
arithmetic. */
if (flag_delete_null_pointer_checks && int_cst_value (low) == 0)
low = build_int_cstu (TREE_TYPE (low), TYPE_ALIGN_UNIT (TREE_TYPE (type)));
record_nonwrapping_iv (loop, base, step, stmt, low, high, false, true); record_nonwrapping_iv (loop, base, step, stmt, low, high, false, true);
} }
......
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