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)

Reply via email to