Hi, This patch tries to keep bounds initial values when it may be needed. Even if initial value is not fully known (e.g. we know only low bound) it still may help to remove some redundant checks.
Bootstrapped and tested on linux-x86_64. Thanks, Ilya -- gcc/ 2013-05-29 Ilya Enkovich <ilya.enkov...@intel.com> * ipa.c (symtab_remove_unreachable_nodes): Kepp initial values for pointer bounds to be used for checks eliminations. * lto-cgraph.c (compute_ltrans_boundary): Likewise. * add_references_to_partition (add_references_to_partition): Add references to pointer bounds vars. diff --git a/gcc/ipa.c b/gcc/ipa.c index 1d7fa35..958cabe 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -568,7 +568,8 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file) vnode->aux = NULL; /* Keep body if it may be useful for constant folding. */ - if ((init = ctor_for_folding (vnode->decl)) == error_mark_node) + if ((init = ctor_for_folding (vnode->decl)) == error_mark_node + && !POINTER_BOUNDS_P (vnode->decl)) varpool_remove_initializer (vnode); else DECL_INITIAL (vnode->decl) = init; diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index 58105f0..7089516 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -829,7 +829,8 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder) { if (!lto_symtab_encoder_encode_initializer_p (encoder, vnode) - && ctor_for_folding (vnode->decl) != error_mark_node) + && (ctor_for_folding (vnode->decl) != error_mark_node + || POINTER_BOUNDS_P (vnode->decl))) { lto_set_symtab_encoder_encode_initializer (encoder, vnode); add_references (encoder, &vnode->ref_list); diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c index 2967d73..330253b 100644 --- a/gcc/lto/lto-partition.c +++ b/gcc/lto/lto-partition.c @@ -96,7 +96,8 @@ add_references_to_partition (ltrans_partition part, symtab_node *node) Recursively look into the initializers of the constant variable and add references, too. */ else if (is_a <varpool_node> (ref->referred) - && ctor_for_folding (ref->referred->decl) != error_mark_node + && (ctor_for_folding (ref->referred->decl) != error_mark_node + || POINTER_BOUNDS_P (ref->referred->decl)) && !lto_symtab_encoder_in_partition_p (part->encoder, ref->referred)) { if (!part->initializers_visited)