diff options
author | Tom de Vries <tom@codesourcery.com> | 2011-06-16 17:57:08 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2011-06-16 17:57:08 +0000 |
commit | 0703f020cd4b22e0bb64612c608bfcc12a2222fd (patch) | |
tree | cb98d10fa3dd18ae5bf610534fbf0c44fdd76650 | |
parent | 900c07da335df90d8660f87e75734fea30ad9f27 (diff) | |
download | gcc-0703f020cd4b22e0bb64612c608bfcc12a2222fd.tar.gz |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-niter.c | 10 |
2 files changed, 16 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 29d0f27ccab..4ea21cf8339 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +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> PR target/49398 diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c index fa3ccc63f59..cf2f4556395 100644 --- a/gcc/tree-ssa-loop-niter.c +++ b/gcc/tree-ssa-loop-niter.c @@ -2875,6 +2875,16 @@ infer_loop_bounds_from_pointer_arith (struct loop *loop, gimple stmt) low = lower_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); } |