ipa-cp.c (ipcp_alignment_lattice): Remove.
authorPrathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
Sun, 9 Oct 2016 04:48:50 +0000 (04:48 +0000)
committerPrathamesh Kulkarni <prathamesh3492@gcc.gnu.org>
Sun, 9 Oct 2016 04:48:50 +0000 (04:48 +0000)
2016-10-09  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>

* ipa-cp.c (ipcp_alignment_lattice): Remove.
(ipcp_param_lattices): Remove field alignment.
(print_all_lattices): Remove call to ipcp_alignment_lattice::print.
(set_all_contains_variable): Remove call to
ipcp_alignment_lattice::set_to_bottom.
(initialize_node_lattices): Likewise.
(propagate_alignment_accross_jump_function): Remove.
(propagate_constants_accross_call): Remove call to
propagate_alignment_accross_jump_function.
(ipcp_store_alignment_results): Remove.
(ipcp_driver): Remove call to ipcp_store_alignment_results.
(propagate_bits_accross_jump_function): Handle ancestor jump function.
* ipa-prop.c (ipa_print_node_jump_functions_for_edge): Remove
pretty-printing of alignment jump function.
(ipa_set_jf_unknown): Remove assignment to jfunc->alignment.known.
(ipa_compute_jump_functions_for_edge): Adjust ipa_bits jump function for
alignments and remove computing ipa_alignment jump function.
(ipa_node_params_t::duplicate): Remove copying of src_trans->alignments.
(ipa_write_jump_functions): Remove streaming for ipa_alignment.
(ipa_read_jump_function): Remove reading of ipa_alignment.
(write_ipcp_transformation_info): Remove streaming for alignment
propagation summary.
(read_ipcp_transformation_info): Remove reading of alignment
propagation summary.
(ipcp_update_alignments): Remove.
(ipcp_update_bits): Adjust to set alignment for parameters of pointer
type.
(ipcp_transform_function): Remove call to ipcp_update_alignments()
and remove assignment to (*ipcp_transformations)[node->uid].alignments.
* ipa-prop.h (ipa_alignment): Remove.
(ipa_jump_func): Remove field alignment.
(ipcp_transformation_summary): Remove field alignments.
* doc/invoke.texi: Mark fipa-cp-alignment as obsolete.
* opts.c (default_options_table): Remove entry for fipa-cp-alignment.
(enable_fdo_optimizations): Remove checking for fipa-cp-alignment.

testsuite/
* gcc.dg/ipa/propalign-1.c: Adjust scan-ipa-dump.
* gcc.dg/ipa/propalign-2.c: Likewise
* gcc.dg/ipa/propalign-3.c: Likewise.
* gcc.dg/ipa/propalign-4.c: Likewise.
* gcc.dg/ipa/propalign-5.c: Likewise.

From-SVN: r240898

12 files changed:
gcc/ChangeLog
gcc/doc/invoke.texi
gcc/ipa-cp.c
gcc/ipa-prop.c
gcc/ipa-prop.h
gcc/opts.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ipa/propalign-1.c
gcc/testsuite/gcc.dg/ipa/propalign-2.c
gcc/testsuite/gcc.dg/ipa/propalign-3.c
gcc/testsuite/gcc.dg/ipa/propalign-4.c
gcc/testsuite/gcc.dg/ipa/propalign-5.c

index 6efa7379a2287bee8b6edddab9098c3ccbaf3ae1..9659fbf7f5d16ad7c61b662f43a6a14b17e7f031 100644 (file)
@@ -1,3 +1,41 @@
+2016-10-09  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
+
+       * ipa-cp.c (ipcp_alignment_lattice): Remove.
+       (ipcp_param_lattices): Remove field alignment.
+       (print_all_lattices): Remove call to ipcp_alignment_lattice::print.
+       (set_all_contains_variable): Remove call to
+       ipcp_alignment_lattice::set_to_bottom.
+       (initialize_node_lattices): Likewise.
+       (propagate_alignment_accross_jump_function): Remove.
+       (propagate_constants_accross_call): Remove call to
+       propagate_alignment_accross_jump_function.
+       (ipcp_store_alignment_results): Remove.
+       (ipcp_driver): Remove call to ipcp_store_alignment_results.
+       (propagate_bits_accross_jump_function): Handle ancestor jump function.
+       * ipa-prop.c (ipa_print_node_jump_functions_for_edge): Remove
+       pretty-printing of alignment jump function.
+       (ipa_set_jf_unknown): Remove assignment to jfunc->alignment.known.
+       (ipa_compute_jump_functions_for_edge): Adjust ipa_bits jump function for
+       alignments and remove computing ipa_alignment jump function.
+       (ipa_node_params_t::duplicate): Remove copying of src_trans->alignments.
+       (ipa_write_jump_functions): Remove streaming for ipa_alignment.
+       (ipa_read_jump_function): Remove reading of ipa_alignment.
+       (write_ipcp_transformation_info): Remove streaming for alignment
+       propagation summary.
+       (read_ipcp_transformation_info): Remove reading of alignment
+       propagation summary. 
+       (ipcp_update_alignments): Remove.
+       (ipcp_update_bits): Adjust to set alignment for parameters of pointer
+       type.
+       (ipcp_transform_function): Remove call to ipcp_update_alignments()
+       and remove assignment to (*ipcp_transformations)[node->uid].alignments.
+       * ipa-prop.h (ipa_alignment): Remove.
+       (ipa_jump_func): Remove field alignment.
+       (ipcp_transformation_summary): Remove field alignments. 
+       * doc/invoke.texi: Mark fipa-cp-alignment as obsolete.
+       * opts.c (default_options_table): Remove entry for fipa-cp-alignment.
+       (enable_fdo_optimizations): Remove checking for fipa-cp-alignment.
+
 2016-10-08  Eric Botcazou  <ebotcazou@adacore.com>
 
        * config/sparc/sparc.h (FIXED_REGISTERS): Add %icc.
index 8d8fdeedcf3c10af4997ecb3f95c430264a8b454..b7a32b663ac83975c6d46009a9f6317e6224cbfe 100644 (file)
@@ -7679,6 +7679,7 @@ parameters to support better vectorization and string operations.
 
 This flag is enabled by default at @option{-O2} and @option{-Os}.  It
 requires that @option{-fipa-cp} is enabled.
+@option{-fipa-cp-alignment} is obsolete, use @option{-fipa-bit-cp} instead.
 
 @item -fipa-bit-cp
 @opindex -fipa-bit-cp
index 7380b2a34054225da1b43374bab96a9221366ea3..1dc5cb6749ab4f0d674f4ba70e93a7ebb539223c 100644 (file)
@@ -238,36 +238,6 @@ public:
   struct ipcp_agg_lattice *next;
 };
 
-/* Lattice of pointer alignment.  Unlike the previous types of lattices, this
-   one is only capable of holding one value.  */
-
-class ipcp_alignment_lattice
-{
-public:
-  /* If bottom and top are both false, these two fields hold values as given by
-     ptr_info_def and get_pointer_alignment_1.  */
-  unsigned align;
-  unsigned misalign;
-
-  inline bool bottom_p () const;
-  inline bool top_p () const;
-  inline bool set_to_bottom ();
-  bool meet_with (unsigned new_align, unsigned new_misalign);
-  bool meet_with (const ipcp_alignment_lattice &other, HOST_WIDE_INT offset);
-  void print (FILE * f);
-private:
-  /* If set, this lattice is bottom and all other fields should be
-     disregarded.  */
-  bool bottom;
-  /* If bottom and not_top are false, the lattice is TOP.  If not_top is true,
-     the known alignment is stored in the fields align and misalign.  The field
-     is negated so that memset to zero initializes the lattice to TOP
-     state.  */
-  bool not_top;
-
-  bool meet_with_1 (unsigned new_align, unsigned new_misalign);
-};
-
 /* Lattice of known bits, only capable of holding one value.
    Bitwise constant propagation propagates which bits of a
    value are constant.
@@ -354,8 +324,6 @@ public:
   ipcp_lattice<ipa_polymorphic_call_context> ctxlat;
   /* Lattices describing aggregate parts.  */
   ipcp_agg_lattice *aggs;
-  /* Lattice describing known alignment.  */
-  ipcp_alignment_lattice alignment;
   /* Lattice describing known bits.  */
   ipcp_bits_lattice bits_lattice;
   /* Lattice describing value range.  */
@@ -534,19 +502,6 @@ ipcp_lattice<valtype>::print (FILE * f, bool dump_sources, bool dump_benefits)
     fprintf (f, "\n");
 }
 
-/* Print alignment lattice to F.  */
-
-void
-ipcp_alignment_lattice::print (FILE * f)
-{
-  if (top_p ())
-    fprintf (f, "         Alignment unknown (TOP)\n");
-  else if (bottom_p ())
-    fprintf (f, "         Alignment unusable (BOTTOM)\n");
-  else
-    fprintf (f, "         Alignment %u, misalignment %u\n", align, misalign);
-}
-
 void
 ipcp_bits_lattice::print (FILE *f)
 {
@@ -595,7 +550,6 @@ print_all_lattices (FILE * f, bool dump_sources, bool dump_benefits)
          plats->itself.print (f, dump_sources, dump_benefits);
          fprintf (f, "         ctxs: ");
          plats->ctxlat.print (f, dump_sources, dump_benefits);
-         plats->alignment.print (f);
          plats->bits_lattice.print (f);
          fprintf (f, "         ");
          plats->m_value_range.print (f);
@@ -922,38 +876,6 @@ set_agg_lats_contain_variable (struct ipcp_param_lattices *plats)
   return ret;
 }
 
-/* Return true if alignment information in the lattice is yet unknown.  */
-
-bool
-ipcp_alignment_lattice::top_p () const
-{
-  return !bottom && !not_top;
-}
-
-/* Return true if alignment information in the lattice is known to be
-   unusable.  */
-
-bool
-ipcp_alignment_lattice::bottom_p () const
-{
-  return bottom;
-}
-
-/* Set alignment information in the lattice to bottom.  Return true if it
-   previously was in a different state.  */
-
-bool
-ipcp_alignment_lattice::set_to_bottom ()
-{
-  if (bottom_p ())
-    return false;
-  bottom = true;
-  return true;
-}
-
-/* Meet the current value of the lattice with described by OTHER
-   lattice.  */
-
 bool
 ipcp_vr_lattice::meet_with (const ipcp_vr_lattice &other)
 {
@@ -1022,82 +944,6 @@ ipcp_vr_lattice::set_to_bottom ()
   return true;
 }
 
-/* Meet the current value of the lattice with alignment described by NEW_ALIGN
-   and NEW_MISALIGN, assuming that we know the current value is neither TOP nor
-   BOTTOM.  Return true if the value of lattice has changed.  */
-
-bool
-ipcp_alignment_lattice::meet_with_1 (unsigned new_align, unsigned new_misalign)
-{
-  gcc_checking_assert (new_align != 0);
-  if (align == new_align && misalign == new_misalign)
-    return false;
-
-  bool changed = false;
-  if (align > new_align)
-    {
-      align = new_align;
-      misalign = misalign % new_align;
-      changed = true;
-    }
-  if (misalign != (new_misalign % align))
-    {
-      int diff = abs ((int) misalign - (int) (new_misalign % align));
-      align = least_bit_hwi (diff);
-      if (align)
-       misalign = misalign % align;
-      else
-       set_to_bottom ();
-      changed = true;
-    }
-  gcc_checking_assert (bottom_p () || align != 0);
-  return changed;
-}
-
-/* Meet the current value of the lattice with alignment described by NEW_ALIGN
-   and NEW_MISALIGN.  Return true if the value of lattice has changed.  */
-
-bool
-ipcp_alignment_lattice::meet_with (unsigned new_align, unsigned new_misalign)
-{
-  gcc_assert (new_align != 0);
-  if (bottom_p ())
-    return false;
-  if (top_p ())
-    {
-      not_top = true;
-      align = new_align;
-      misalign = new_misalign;
-      return true;
-    }
-  return meet_with_1 (new_align, new_misalign);
-}
-
-/* Meet the current value of the lattice with OTHER, taking into account that
-   OFFSET has been added to the pointer value.  Return true if the value of
-   lattice has changed.  */
-
-bool
-ipcp_alignment_lattice::meet_with (const ipcp_alignment_lattice &other,
-                                  HOST_WIDE_INT offset)
-{
-  if (other.bottom_p ())
-    return set_to_bottom ();
-  if (bottom_p () || other.top_p ())
-    return false;
-
-  unsigned adjusted_misalign = (other.misalign + offset) % other.align;
-  if (top_p ())
-    {
-      not_top = true;
-      align = other.align;
-      misalign = adjusted_misalign;
-      return true;
-    }
-
-  return meet_with_1 (other.align, adjusted_misalign);
-}
-
 /* Set lattice value to bottom, if it already isn't the case.  */
 
 bool
@@ -1253,7 +1099,6 @@ set_all_contains_variable (struct ipcp_param_lattices *plats)
   ret = plats->itself.set_contains_variable ();
   ret |= plats->ctxlat.set_contains_variable ();
   ret |= set_agg_lats_contain_variable (plats);
-  ret |= plats->alignment.set_to_bottom ();
   ret |= plats->bits_lattice.set_to_bottom ();
   ret |= plats->m_value_range.set_to_bottom ();
   return ret;
@@ -1342,7 +1187,6 @@ initialize_node_lattices (struct cgraph_node *node)
              plats->itself.set_to_bottom ();
              plats->ctxlat.set_to_bottom ();
              set_agg_lats_to_bottom (plats);
-             plats->alignment.set_to_bottom ();
              plats->bits_lattice.set_to_bottom ();
              plats->m_value_range.set_to_bottom ();
            }
@@ -1910,59 +1754,6 @@ propagate_context_accross_jump_function (cgraph_edge *cs,
   return ret;
 }
 
-/* Propagate alignments across jump function JFUNC that is associated with
-   edge CS and update DEST_LAT accordingly.  */
-
-static bool
-propagate_alignment_accross_jump_function (cgraph_edge *cs,
-                                          ipa_jump_func *jfunc,
-                                          ipcp_alignment_lattice *dest_lat)
-{
-  if (dest_lat->bottom_p ())
-    return false;
-
-  if (jfunc->type == IPA_JF_PASS_THROUGH
-          || jfunc->type == IPA_JF_ANCESTOR)
-    {
-      struct ipa_node_params *caller_info = IPA_NODE_REF (cs->caller);
-      HOST_WIDE_INT offset = 0;
-      int src_idx;
-
-      if (jfunc->type == IPA_JF_PASS_THROUGH)
-       {
-         enum tree_code op = ipa_get_jf_pass_through_operation (jfunc);
-         if (op != NOP_EXPR)
-           {
-             if (op != POINTER_PLUS_EXPR
-                 && op != PLUS_EXPR)
-               return dest_lat->set_to_bottom ();
-             tree operand = ipa_get_jf_pass_through_operand (jfunc);
-             if (!tree_fits_shwi_p (operand))
-               return dest_lat->set_to_bottom ();
-             offset = tree_to_shwi (operand);
-           }
-         src_idx = ipa_get_jf_pass_through_formal_id (jfunc);
-       }
-      else
-       {
-         src_idx = ipa_get_jf_ancestor_formal_id (jfunc);
-         offset = ipa_get_jf_ancestor_offset (jfunc) / BITS_PER_UNIT;
-       }
-
-      struct ipcp_param_lattices *src_lats;
-      src_lats = ipa_get_parm_lattices (caller_info, src_idx);
-      return dest_lat->meet_with (src_lats->alignment, offset);
-    }
-  else
-    {
-      if (jfunc->alignment.known)
-       return dest_lat->meet_with (jfunc->alignment.align,
-                                   jfunc->alignment.misalign);
-      else
-       return dest_lat->set_to_bottom ();
-    }
-}
-
 /* Propagate bits across jfunc that is associated with
    edge cs and update dest_lattice accordingly.  */
 
@@ -1993,16 +1784,29 @@ propagate_bits_accross_jump_function (cgraph_edge *cs, int idx, ipa_jump_func *j
   unsigned precision = TYPE_PRECISION (parm_type);
   signop sgn = TYPE_SIGN (parm_type);
 
-  if (jfunc->type == IPA_JF_PASS_THROUGH)
+  if (jfunc->type == IPA_JF_PASS_THROUGH
+      || jfunc->type == IPA_JF_ANCESTOR)
     {
       struct ipa_node_params *caller_info = IPA_NODE_REF (cs->caller);
-      enum tree_code code = ipa_get_jf_pass_through_operation (jfunc);
       tree operand = NULL_TREE;
+      enum tree_code code;
+      unsigned src_idx;
 
-      if (code != NOP_EXPR)
-       operand = ipa_get_jf_pass_through_operand (jfunc);
+      if (jfunc->type == IPA_JF_PASS_THROUGH)
+       {
+         code = ipa_get_jf_pass_through_operation (jfunc);
+         src_idx = ipa_get_jf_pass_through_formal_id (jfunc);
+         if (code != NOP_EXPR)
+           operand = ipa_get_jf_pass_through_operand (jfunc);
+       }
+      else
+       {
+         code = POINTER_PLUS_EXPR; 
+         src_idx = ipa_get_jf_ancestor_formal_id (jfunc);
+         unsigned HOST_WIDE_INT offset = ipa_get_jf_ancestor_offset (jfunc) / BITS_PER_UNIT;
+         operand = build_int_cstu (size_type_node, offset);
+       }
 
-      int src_idx = ipa_get_jf_pass_through_formal_id (jfunc);
       struct ipcp_param_lattices *src_lats
        = ipa_get_parm_lattices (caller_info, src_idx);
 
@@ -2426,8 +2230,6 @@ propagate_constants_accross_call (struct cgraph_edge *cs)
                                                         &dest_plats->itself);
          ret |= propagate_context_accross_jump_function (cs, jump_func, i,
                                                          &dest_plats->ctxlat);
-         ret |= propagate_alignment_accross_jump_function (cs, jump_func,
-                                                        &dest_plats->alignment);
          ret |= propagate_bits_accross_jump_function (cs, i, jump_func,
                                                       &dest_plats->bits_lattice);
          ret |= propagate_aggs_accross_jump_function (cs, jump_func,
@@ -4997,81 +4799,6 @@ ipcp_decision_stage (struct ipa_topo_info *topo)
     }
 }
 
-/* Look up all alignment information that we have discovered and copy it over
-   to the transformation summary.  */
-
-static void
-ipcp_store_alignment_results (void)
-{
-  cgraph_node *node;
-
-  FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node)
-  {
-    ipa_node_params *info = IPA_NODE_REF (node);
-    bool dumped_sth = false;
-    bool found_useful_result = false;
-
-    if (!opt_for_fn (node->decl, flag_ipa_cp_alignment))
-      {
-       if (dump_file)
-         fprintf (dump_file, "Not considering %s for alignment discovery "
-                  "and propagate; -fipa-cp-alignment: disabled.\n",
-                  node->name ());
-       continue;
-      }
-
-   if (info->ipcp_orig_node)
-      info = IPA_NODE_REF (info->ipcp_orig_node);
-
-   unsigned count = ipa_get_param_count (info);
-   for (unsigned i = 0; i < count ; i++)
-     {
-       ipcp_param_lattices *plats = ipa_get_parm_lattices (info, i);
-       if (!plats->alignment.bottom_p ()
-          && !plats->alignment.top_p ())
-        {
-          gcc_checking_assert (plats->alignment.align > 0);
-          found_useful_result = true;
-          break;
-        }
-     }
-   if (!found_useful_result)
-     continue;
-
-   ipcp_grow_transformations_if_necessary ();
-   ipcp_transformation_summary *ts = ipcp_get_transformation_summary (node);
-   vec_safe_reserve_exact (ts->alignments, count);
-
-   for (unsigned i = 0; i < count ; i++)
-     {
-       ipcp_param_lattices *plats = ipa_get_parm_lattices (info, i);
-       ipa_alignment al;
-
-       if (!plats->alignment.bottom_p ()
-          && !plats->alignment.top_p ())
-        {
-          al.known = true;
-          al.align = plats->alignment.align;
-          al.misalign = plats->alignment.misalign;
-        }
-       else
-        al.known = false;
-
-       ts->alignments->quick_push (al);
-       if (!dump_file || !al.known)
-        continue;
-       if (!dumped_sth)
-        {
-          fprintf (dump_file, "Propagated alignment info for function %s/%i:\n",
-                   node->name (), node->order);
-          dumped_sth = true;
-        }
-       fprintf (dump_file, "  param %i: align: %u, misalign: %u\n",
-               i, al.align, al.misalign);
-     }
-  }
-}
-
 /* Look up all the bits information that we have discovered and copy it over
    to the transformation summary.  */
 
@@ -5246,8 +4973,6 @@ ipcp_driver (void)
   ipcp_propagate_stage (&topo);
   /* Decide what constant propagation and cloning should be performed.  */
   ipcp_decision_stage (&topo);
-  /* Store results of alignment propagation. */
-  ipcp_store_alignment_results ();
   /* Store results of bits propagation.  */
   ipcp_store_bits_results ();
   /* Store results of value range propagation.  */
index 302a47935a101e09779f28dfe382c00d1adcf6d5..a981efd5e62145def28afa1a872fb9b72fc9fc0f 100644 (file)
@@ -294,15 +294,6 @@ ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
          ctx->dump (dump_file);
        }
 
-      if (jump_func->alignment.known)
-       {
-         fprintf (f, "         Alignment: %u, misalignment: %u\n",
-                  jump_func->alignment.align,
-                  jump_func->alignment.misalign);
-       }
-      else
-       fprintf (f, "         Unknown alignment\n");
-
       if (jump_func->bits.known)
        {
          fprintf (f, "         value: "); print_hex (jump_func->bits.value, f);
@@ -402,7 +393,6 @@ static void
 ipa_set_jf_unknown (struct ipa_jump_func *jfunc)
 {
   jfunc->type = IPA_JF_UNKNOWN;
-  jfunc->alignment.known = false;
   jfunc->bits.known = false;
   jfunc->vr_known = false;
 }
@@ -1678,25 +1668,7 @@ ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi,
            useful_context = true;
        }
 
-      if (POINTER_TYPE_P (TREE_TYPE(arg)))
-       {
-         unsigned HOST_WIDE_INT hwi_bitpos;
-         unsigned align;
-
-         get_pointer_alignment_1 (arg, &align, &hwi_bitpos);
-         if (align > BITS_PER_UNIT
-             && align % BITS_PER_UNIT == 0
-             && hwi_bitpos % BITS_PER_UNIT == 0)
-           {
-             jfunc->alignment.known = true;
-             jfunc->alignment.align = align / BITS_PER_UNIT;
-             jfunc->alignment.misalign = hwi_bitpos / BITS_PER_UNIT;
-           }
-         else
-           gcc_assert (!jfunc->alignment.known);
-         gcc_assert (!jfunc->vr_known);
-       }
-      else
+      if (!POINTER_TYPE_P (TREE_TYPE (arg)))
        {
          wide_int min, max;
          value_range_type type;
@@ -1723,7 +1695,6 @@ ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi,
            }
          else
            gcc_assert (!jfunc->vr_known);
-         gcc_assert (!jfunc->alignment.known);
        }
 
       if (INTEGRAL_TYPE_P (TREE_TYPE (arg))
@@ -1743,6 +1714,17 @@ ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi,
              jfunc->bits.mask = 0;
            }
        }
+      else if (POINTER_TYPE_P (TREE_TYPE (arg)))
+       {
+         unsigned HOST_WIDE_INT bitpos;
+         unsigned align;
+
+         jfunc->bits.known = true;
+         get_pointer_alignment_1 (arg, &align, &bitpos);
+         jfunc->bits.mask = wi::mask<widest_int>(TYPE_PRECISION (TREE_TYPE (arg)), false)
+                            .and_not (align / BITS_PER_UNIT - 1);
+         jfunc->bits.value = bitpos / BITS_PER_UNIT;
+       }
       else
        gcc_assert (!jfunc->bits.known);
 
@@ -3755,18 +3737,9 @@ ipa_node_params_t::duplicate(cgraph_node *src, cgraph_node *dst,
     {
       ipcp_grow_transformations_if_necessary ();
       src_trans = ipcp_get_transformation_summary (src);
-      const vec<ipa_alignment, va_gc> *src_alignments = src_trans->alignments;
       const vec<ipa_vr, va_gc> *src_vr = src_trans->m_vr;
-      vec<ipa_alignment, va_gc> *&dst_alignments
-       = ipcp_get_transformation_summary (dst)->alignments;
       vec<ipa_vr, va_gc> *&dst_vr
        = ipcp_get_transformation_summary (dst)->m_vr;
-      if (vec_safe_length (src_trans->alignments) > 0)
-       {
-         vec_safe_reserve_exact (dst_alignments, src_alignments->length ());
-         for (unsigned i = 0; i < src_alignments->length (); ++i)
-           dst_alignments->quick_push ((*src_alignments)[i]);
-       }
       if (vec_safe_length (src_trans->m_vr) > 0)
        {
          vec_safe_reserve_exact (dst_vr, src_vr->length ());
@@ -4697,15 +4670,6 @@ ipa_write_jump_function (struct output_block *ob,
       stream_write_tree (ob, item->value, true);
     }
 
-  bp = bitpack_create (ob->main_stream);
-  bp_pack_value (&bp, jump_func->alignment.known, 1);
-  streamer_write_bitpack (&bp);
-  if (jump_func->alignment.known)
-    {
-      streamer_write_uhwi (ob, jump_func->alignment.align);
-      streamer_write_uhwi (ob, jump_func->alignment.misalign);
-    }
-
   bp = bitpack_create (ob->main_stream);
   bp_pack_value (&bp, jump_func->bits.known, 1);
   streamer_write_bitpack (&bp);
@@ -4790,17 +4754,6 @@ ipa_read_jump_function (struct lto_input_block *ib,
     }
 
   struct bitpack_d bp = streamer_read_bitpack (ib);
-  bool alignment_known = bp_unpack_value (&bp, 1);
-  if (alignment_known)
-    {
-      jump_func->alignment.known = true;
-      jump_func->alignment.align = streamer_read_uhwi (ib);
-      jump_func->alignment.misalign = streamer_read_uhwi (ib);
-    }
-  else
-    jump_func->alignment.known = false;
-
-  bp = streamer_read_bitpack (ib);
   bool bits_known = bp_unpack_value (&bp, 1);
   if (bits_known)
     {
@@ -5166,30 +5119,6 @@ write_ipcp_transformation_info (output_block *ob, cgraph_node *node)
     }
 
   ipcp_transformation_summary *ts = ipcp_get_transformation_summary (node);
-  if (ts && vec_safe_length (ts->alignments) > 0)
-    {
-      count = ts->alignments->length ();
-
-      streamer_write_uhwi (ob, count);
-      for (unsigned i = 0; i < count; ++i)
-       {
-         ipa_alignment *parm_al = &(*ts->alignments)[i];
-
-         struct bitpack_d bp;
-         bp = bitpack_create (ob->main_stream);
-         bp_pack_value (&bp, parm_al->known, 1);
-         streamer_write_bitpack (&bp);
-         if (parm_al->known)
-           {
-             streamer_write_uhwi (ob, parm_al->align);
-             streamer_write_hwi_in_range (ob->main_stream, 0, parm_al->align,
-                                          parm_al->misalign);
-           }
-       }
-    }
-  else
-    streamer_write_uhwi (ob, 0);
-
   if (ts && vec_safe_length (ts->m_vr) > 0)
     {
       count = ts->m_vr->length ();
@@ -5260,32 +5189,7 @@ read_ipcp_transformation_info (lto_input_block *ib, cgraph_node *node,
       aggvals = av;
     }
   ipa_set_node_agg_value_chain (node, aggvals);
-
-  count = streamer_read_uhwi (ib);
-  if (count > 0)
-    {
-      ipcp_grow_transformations_if_necessary ();
-
-      ipcp_transformation_summary *ts = ipcp_get_transformation_summary (node);
-      vec_safe_grow_cleared (ts->alignments, count);
-
-      for (i = 0; i < count; i++)
-       {
-         ipa_alignment *parm_al;
-         parm_al = &(*ts->alignments)[i];
-         struct bitpack_d bp;
-         bp = streamer_read_bitpack (ib);
-         parm_al->known = bp_unpack_value (&bp, 1);
-         if (parm_al->known)
-           {
-             parm_al->align = streamer_read_uhwi (ib);
-             parm_al->misalign
-               = streamer_read_hwi_in_range (ib, "ipa-prop misalign",
-                                             0, parm_al->align);
-           }
-       }
-    }
-
+  
   count = streamer_read_uhwi (ib);
   if (count > 0)
     {
@@ -5579,58 +5483,6 @@ ipcp_modif_dom_walker::before_dom_children (basic_block bb)
   return NULL;
 }
 
-/* Update alignment of formal parameters as described in
-   ipcp_transformation_summary.  */
-
-static void
-ipcp_update_alignments (struct cgraph_node *node)
-{
-  tree fndecl = node->decl;
-  tree parm = DECL_ARGUMENTS (fndecl);
-  tree next_parm = parm;
-  ipcp_transformation_summary *ts = ipcp_get_transformation_summary (node);
-  if (!ts || vec_safe_length (ts->alignments) == 0)
-    return;
-  const vec<ipa_alignment, va_gc> &alignments = *ts->alignments;
-  unsigned count = alignments.length ();
-
-  for (unsigned i = 0; i < count; ++i, parm = next_parm)
-    {
-      if (node->clone.combined_args_to_skip
-         && bitmap_bit_p (node->clone.combined_args_to_skip, i))
-       continue;
-      gcc_checking_assert (parm);
-      next_parm = DECL_CHAIN (parm);
-
-      if (!alignments[i].known || !is_gimple_reg (parm))
-       continue;
-      tree ddef = ssa_default_def (DECL_STRUCT_FUNCTION (node->decl), parm);
-      if (!ddef)
-       continue;
-
-      if (dump_file)
-       fprintf (dump_file, "  Adjusting alignment of param %u to %u, "
-                "misalignment to %u\n", i, alignments[i].align,
-                alignments[i].misalign);
-
-      struct ptr_info_def *pi = get_ptr_info (ddef);
-      gcc_checking_assert (pi);
-      unsigned old_align;
-      unsigned old_misalign;
-      bool old_known = get_ptr_info_alignment (pi, &old_align, &old_misalign);
-
-      if (old_known
-         && old_align >= alignments[i].align)
-       {
-         if (dump_file)
-           fprintf (dump_file, "    But the alignment was already %u.\n",
-                    old_align);
-         continue;
-       }
-      set_ptr_info_alignment (pi, alignments[i].align, alignments[i].misalign);
-    }
-}
-
 /* Update bits info of formal parameters as described in
    ipcp_transformation_summary.  */
 
@@ -5657,7 +5509,7 @@ ipcp_update_bits (struct cgraph_node *node)
       next_parm = DECL_CHAIN (parm);
 
       if (!bits[i].known
-         || !INTEGRAL_TYPE_P (TREE_TYPE (parm))
+         || !(INTEGRAL_TYPE_P (TREE_TYPE (parm)) || POINTER_TYPE_P (TREE_TYPE (parm)))
          || !is_gimple_reg (parm))
        continue;       
 
@@ -5672,12 +5524,53 @@ ipcp_update_bits (struct cgraph_node *node)
          fprintf (dump_file, "\n");
        }
 
-      unsigned prec = TYPE_PRECISION (TREE_TYPE (ddef));
-      signop sgn = TYPE_SIGN (TREE_TYPE (ddef));
+      if (INTEGRAL_TYPE_P (TREE_TYPE (ddef)))
+       {
+         unsigned prec = TYPE_PRECISION (TREE_TYPE (ddef));
+         signop sgn = TYPE_SIGN (TREE_TYPE (ddef));
+
+         wide_int nonzero_bits = wide_int::from (bits[i].mask, prec, UNSIGNED)
+                                 | wide_int::from (bits[i].value, prec, sgn);
+         set_nonzero_bits (ddef, nonzero_bits);
+       }
+      else
+       {
+         unsigned tem = bits[i].mask.to_uhwi ();
+         unsigned HOST_WIDE_INT bitpos = bits[i].value.to_uhwi (); 
+         unsigned align = tem & -tem;
+         unsigned misalign = bitpos & (align - 1);
 
-      wide_int nonzero_bits = wide_int::from (bits[i].mask, prec, UNSIGNED)
-                             | wide_int::from (bits[i].value, prec, sgn);
-      set_nonzero_bits (ddef, nonzero_bits);
+         if (align > 1)
+           {
+             if (dump_file)
+               fprintf (dump_file, "Adjusting align: %u, misalign: %u\n", align, misalign); 
+
+             unsigned old_align, old_misalign;
+             struct ptr_info_def *pi = get_ptr_info (ddef);
+             bool old_known = get_ptr_info_alignment (pi, &old_align, &old_misalign);
+
+             if (old_known
+                 && old_align > align)
+               {
+                 if (dump_file)
+                   {
+                     fprintf (dump_file, "But alignment was already %u.\n", old_align);
+                     if ((old_misalign & (align - 1)) != misalign)
+                       fprintf (dump_file, "old_misalign (%u) and misalign (%u) mismatch\n",
+                                old_misalign, misalign);
+                   }
+                 continue;
+               }
+
+             if (old_known
+                 && ((misalign & (old_align - 1)) != old_misalign)
+                 && dump_file)
+               fprintf (dump_file, "old_misalign (%u) and misalign (%u) mismatch\n",
+                        old_misalign, misalign);
+
+             set_ptr_info_alignment (pi, align, misalign); 
+           }
+       }
     }
 }
 
@@ -5752,7 +5645,6 @@ ipcp_transform_function (struct cgraph_node *node)
     fprintf (dump_file, "Modification phase of node %s/%i\n",
             node->name (), node->order);
 
-  ipcp_update_alignments (node);
   ipcp_update_bits (node);
   ipcp_update_vr (node);
   aggval = ipa_get_agg_replacements_for_node (node);
@@ -5785,7 +5677,6 @@ ipcp_transform_function (struct cgraph_node *node)
   fbi.bb_infos.release ();
   free_dominance_info (CDI_DOMINATORS);
   (*ipcp_transformations)[node->uid].agg_values = NULL;
-  (*ipcp_transformations)[node->uid].alignments = NULL;
   descriptors.release ();
 
   if (!something_changed)
index a123978d239fce879d9f14f59a624551b85c3fbb..4eeae882f5f36d3c99acf6d3cb8fb2b345a726c0 100644 (file)
@@ -143,17 +143,6 @@ struct GTY(()) ipa_agg_jump_function
 
 typedef struct ipa_agg_jump_function *ipa_agg_jump_function_p;
 
-/* Info about pointer alignments. */
-struct GTY(()) ipa_alignment
-{
-  /* The data fields below are valid only if known is true.  */
-  bool known;
-  /* See ptr_info_def and get_pointer_alignment_1 for description of these
-     two.  */
-  unsigned align;
-  unsigned misalign;
-};
-
 /* Information about zero/non-zero bits.  */
 struct GTY(()) ipa_bits
 {
@@ -186,9 +175,6 @@ struct GTY (()) ipa_jump_func
      description.  */
   struct ipa_agg_jump_function agg;
 
-  /* Information about alignment of pointers. */
-  struct ipa_alignment alignment;
-
   /* Information about zero/non-zero bits.  */
   struct ipa_bits bits;
 
@@ -531,8 +517,6 @@ struct GTY(()) ipcp_transformation_summary
 {
   /* Linked list of known aggregate values.  */
   ipa_agg_replacement_value *agg_values;
-  /* Alignment information for pointers.  */
-  vec<ipa_alignment, va_gc> *alignments;
   /* Known bits information.  */
   vec<ipa_bits, va_gc> *bits;
   /* Value range information.  */
index 45f1f89cd16cbc1fc061e50f62fc8a1cffca5075..90e6186e71101d01a9ef8bad72e50b6aad0f4d19 100644 (file)
@@ -504,7 +504,6 @@ static const struct default_options default_options_table[] =
     { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
-    { OPT_LEVELS_2_PLUS, OPT_fipa_cp_alignment, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_fipa_bit_cp, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_fipa_vrp, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
@@ -1423,9 +1422,6 @@ enable_fdo_optimizations (struct gcc_options *opts,
   if (!opts_set->x_flag_ipa_cp_clone
       && value && opts->x_flag_ipa_cp)
     opts->x_flag_ipa_cp_clone = value;
-  if (!opts_set->x_flag_ipa_cp_alignment
-      && value && opts->x_flag_ipa_cp)
-    opts->x_flag_ipa_cp_alignment = value;
   if (!opts_set->x_flag_ipa_bit_cp
       && value && opts->x_flag_ipa_cp)
     opts->x_flag_ipa_bit_cp = value;
index 9422a47dd0978cc9c9afbcc07cc7c11551ae53d9..4e69c4dddf595cf63d8dfc6c10e7f3d7e11219d2 100644 (file)
@@ -1,3 +1,11 @@
+2016-10-09  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
+
+       * gcc.dg/ipa/propalign-1.c: Adjust scan-ipa-dump.
+       * gcc.dg/ipa/propalign-2.c: Likewise
+       * gcc.dg/ipa/propalign-3.c: Likewise.
+       * gcc.dg/ipa/propalign-4.c: Likewise.
+       * gcc.dg/ipa/propalign-5.c: Likewise.
+
 2016-10-08  Jakub Jelinek  <jakub@redhat.com>
 
        * c-c++-common/Wimplicit-fallthrough-23.c (foo): Add further tests.
index f34552c86203150261df0633b524d6a34b7e3aff..1491de8d550e90613c7a18e0d9f035de9446ba04 100644 (file)
@@ -27,5 +27,5 @@ bar (void)
 }
 
 
-/* { dg-final { scan-ipa-dump "Adjusting alignment of param" "cp" } } */
+/* { dg-final { scan-ipa-dump "Adjusting align" "cp" } } */
 /* { dg-final { scan-tree-dump-not "fail_the_test" "optimized" } } */
index 67b149ae977b1c66650992d7aa00906594217917..51799c7fbd10bddb9d851c6d05a7c986ef33ff72 100644 (file)
@@ -53,5 +53,5 @@ bar2 (void)
   through (c.buf);
 }
 
-/* { dg-final { scan-ipa-dump "Adjusting alignment of param" "cp" } } */
+/* { dg-final { scan-ipa-dump "Adjusting align" "cp" } } */
 /* { dg-final { scan-tree-dump-not "fail_the_test" "optimized" } } */
index d3bc2c4b2e8149eae07cf33a9510d2a849e0d367..4f5df4aacf471162bf9e15b9c24117d3174c6bdc 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-ipa-cp-alignment -fno-early-inlining -fdump-ipa-cp -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fno-ipa-bit-cp -fno-early-inlining -fdump-ipa-cp -fdump-tree-optimized" } */
 /* { dg-skip-if "No alignment restrictions" { { ! natural_alignment_32 } && { ! natural_alignment_64 } } } */
 
 #include <stdint.h>
@@ -53,5 +53,5 @@ bar2 (void)
   through (c.buf);
 }
 
-/* { dg-final { scan-ipa-dump-not "Adjusting alignment of param" "cp" } } */
+/* { dg-final { scan-ipa-dump-not "align:" "cp" } } */
 /* { dg-final { scan-tree-dump "fail_the_test" "optimized" } } */
index b6808131c88bf11ce716d8876efdac9ca160b2a8..bd32bf09241df1e389c8cc1f9fed4fbd1dff68ad 100644 (file)
@@ -20,4 +20,4 @@ main()
   test (&aa[3]);
   return 0;
 }
-/* { dg-final { scan-ipa-dump "Alignment 8, misalignment 4"  "cp"  } } */
+/* { dg-final { scan-ipa-dump "align: 8, misalign: 4"  "cp"  } } */
index f2cf60020e3146b52b67a5e5b7f6cec11befd732..68e57da30d7914236206ca36a3a7131fef5e655b 100644 (file)
@@ -20,4 +20,4 @@ main()
   test (&bb);
   return 0;
 }
-/* { dg-final { scan-ipa-dump "Alignment 2"  "cp"  } } */
+/* { dg-final { scan-ipa-dump "align: 2"  "cp"  } } */