On Mon, 8 Jul 2019, Kewen.Lin wrote:

> Hi Richard,
> 
> Thanks a lot for your review and reply, I've updated the patch accordingly.
> 
> Main changes compared to previous one:
>   - Consider SVE (poly_int) on bit_field_ref size/offset.
>   - Filter valid candidates with sbitmap first.
>   - Support multiple modes (TODO 1).
>   - Test cases: add SSE2 support for 1..5, update run result check for 1,
>     add two more cases (5,6)to verify multiple mode support (x86).
> 
> Bootstrapped and regression test passed on powerpc64le-unknown-linux-gnu
> and x86_64-linux-gnu.
> 
> Could you help to review it again?  Thanks in advance!

+      tree rhs = gimple_assign_rhs1 (oe1def);
+      tree vec = TREE_OPERAND (rhs, 0);
+      tree vec_type = TREE_TYPE (vec);
+
+      if (TREE_CODE (vec) != SSA_NAME || !VECTOR_TYPE_P (vec_type))
+       continue;
...
+      /* Ignore it if target machine can't support this VECTOR type.  */
+      if (!VECTOR_MODE_P (TYPE_MODE (vec_type)))
+       continue;

put the check below next to the one above, it's cheaper than the
poly-int stuff that currently preceeds it.

+      v_info_ptr *info_ptr = v_info_map.get (vec);
+      if (info_ptr)
+       {

there is get_or_insert which enables you to mostly merge the two cases
with a preceeding

  if (!existed)
    v_info_ptr = new v_info;

also eliding the extra hash-lookup the put operation otherwise requires.

+  for (hash_map<tree, v_info_ptr>::iterator it = v_info_map.begin ();
+       it != v_info_map.end (); ++it)
+    {
+      tree cand_vec = (*it).first;
+      v_info_ptr cand_info = (*it).second;
+      unsigned int num_elems = VECTOR_CST_NELTS (cand_vec).to_constant 
();

please add a quick out like

      if (cand_info->length () != num_elems)
        continue;

since to have no holes and no overlap you need exactly that many.

I think you can avoid the somewhat ugly mode_to_total counter array.
Since you have sorted valid_vecs after modes simply do

  for (unsigned i = 0; i < valid_vecs.length () - 1; ++i)
    {
      tree tvec = valid_vecs[i];
      enum machine_mode mode = TYPE_MODE (TREE_TYPE (tvec));

(please don't use unsigned int for mode!)

      /* Skip modes with only a single candidate.  */
      if (TYPE_MODE (TREE_TYPE (valid_vecs[i+1])) != mode)
        continue;

      do
        {
...
        }
      while (...)

Richard.

> Kewen
> 
> ----
> 
> gcc/ChangeLog
> 
> 2019-07-08  Kewen Lin  <li...@gcc.gnu.org>
> 
>       PR tree-optimization/88497
>       * tree-ssa-reassoc.c (reassociate_bb): Swap the positions of 
>       GIMPLE_BINARY_RHS check and gimple_visited_p check, call new 
>       function undistribute_bitref_for_vector.
>       (undistribute_bitref_for_vector): New function.
>       (cleanup_vinfo_map): Likewise.
>       (sort_by_mach_mode): Likewise.
> 
> gcc/testsuite/ChangeLog
> 
> 2019-07-08  Kewen Lin  <li...@gcc.gnu.org>
> 
>       * gcc.dg/tree-ssa/pr88497-1.c: New test.
>       * gcc.dg/tree-ssa/pr88497-2.c: Likewise.
>       * gcc.dg/tree-ssa/pr88497-3.c: Likewise.
>       * gcc.dg/tree-ssa/pr88497-4.c: Likewise.
>       * gcc.dg/tree-ssa/pr88497-5.c: Likewise.
>       * gcc.dg/tree-ssa/pr88497-6.c: Likewise.
>       * gcc.dg/tree-ssa/pr88497-7.c: Likewise.
> 
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Linux GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany;
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah; HRB 21284 (AG Nürnberg)

Reply via email to