On Mon, Jun 25, 2012 at 5:44 PM, Ulrich Weigand <uweig...@de.ibm.com> wrote:
> Richard Guenther wrote:
>
>> In this testcase the alignment of arr[i] should be irrelevant - it is
>> not part of
>> the stmts that are going to be vectorized.  But of course this may be
>> simply an odering issue in how we analyze data-references / statements
>> in basic-block vectorization (thus we possibly did not yet declare the
>> arr[i] = i statement as not taking part in the vectorization).
>
> The following patch changes 
> tree-vect-data-refs.c:vect_verify_datarefs_alignment
> to only take into account statements marked as "relevant".
>
> This should have no impact for loop-based vectorization, since the only caller
> (vect_enhance_data_refs_alignment) already skips irrelevant statements.
> [ As an aside, that routine should probably use STMT_VINFO_RELEVANT_P instead
> of just checking STMT_VINFO_RELEVANT as a boolean. ]
>
> However, for SLP this change in itself doesn't work, since 
> vect_slp_analyze_bb_1
> calls vect_verify_datarefs_alignment *before* statements have actually been
> marked as relevant or irrelevant.  Therefore, the patch also rearranges the
> sequence in vect_slp_analyze_bb_1.
>
> This in turn caused ICEs in vect_get_store_cost/vect_get_load_cost, since 
> those
> now can get called with statements with unsupported alignment.  There is 
> already
> one caller (vect_get_data_access_cost) that checks for this case and simply
> returns "infinite" cost instead of aborting.  The patch moves this behaviour
> into vect_get_store_cost/vect_get_load_cost themselves.  (The particular cost
> shouldn't matter since vectorization will still be rejected in the end, it's
> just that the test now runs a bit later.)
>
> Overall, I've tested the patch with no regresions on powerpc64-linux and
> arm-linux-gnueabi.   On PowerPC, it fixed the gcc.dg/vect/bb-slp-16.c test.
>
> Mikael, would you mind verifying that it fixes the problem on sparc64?
>
> OK for mainline?

Ok.

Thanks,
Richard.

> Bye,
> Ulrich
>
>
> ChangeLog:
>
>        PR tree-optimization/53729
>        PR tree-optimization/53636
>        * tree-vect-slp.c (vect_slp_analyze_bb_1): Delay call to
>        vect_verify_datarefs_alignment until after statements have
>        been marked as relevant/irrelevant.
>        * tree-vect-data-refs.c (vect_verify_datarefs_alignment):
>        Skip irrelevant statements.
>        (vect_enhance_data_refs_alignment): Use STMT_VINFO_RELEVANT_P
>        instead of STMT_VINFO_RELEVANT.
>        (vect_get_data_access_cost): Do not check for supportable
>        alignment before calling vect_get_load_cost/vect_get_store_cost.
>        * tree-vect-stmts.c (vect_get_store_cost): Do not abort when
>        handling unsupported alignment.
>        (vect_get_load_cost): Likewise.
>
>
> Index: gcc/tree-vect-data-refs.c
> ===================================================================
> *** gcc/tree-vect-data-refs.c   (revision 188850)
> --- gcc/tree-vect-data-refs.c   (working copy)
> *************** vect_verify_datarefs_alignment (loop_vec
> *** 1094,1099 ****
> --- 1094,1102 ----
>        gimple stmt = DR_STMT (dr);
>        stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
>
> +       if (!STMT_VINFO_RELEVANT_P (stmt_info))
> +       continue;
> +
>        /* For interleaving, only the alignment of the first access matters.
>           Skip statements marked as not vectorizable.  */
>        if ((STMT_VINFO_GROUPED_ACCESS (stmt_info)
> *************** vect_get_data_access_cost (struct data_r
> *** 1213,1229 ****
>    loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info);
>    int vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
>    int ncopies = vf / nunits;
> -   bool supportable_dr_alignment = vect_supportable_dr_alignment (dr, true);
>
> !   if (!supportable_dr_alignment)
> !     *inside_cost = VECT_MAX_COST;
>    else
> !     {
> !       if (DR_IS_READ (dr))
> !         vect_get_load_cost (dr, ncopies, true, inside_cost, outside_cost);
> !       else
> !         vect_get_store_cost (dr, ncopies, inside_cost);
> !     }
>
>    if (vect_print_dump_info (REPORT_COST))
>      fprintf (vect_dump, "vect_get_data_access_cost: inside_cost = %d, "
> --- 1216,1226 ----
>    loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info);
>    int vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
>    int ncopies = vf / nunits;
>
> !   if (DR_IS_READ (dr))
> !     vect_get_load_cost (dr, ncopies, true, inside_cost, outside_cost);
>    else
> !     vect_get_store_cost (dr, ncopies, inside_cost);
>
>    if (vect_print_dump_info (REPORT_COST))
>      fprintf (vect_dump, "vect_get_data_access_cost: inside_cost = %d, "
> *************** vect_enhance_data_refs_alignment (loop_v
> *** 1537,1543 ****
>        stmt = DR_STMT (dr);
>        stmt_info = vinfo_for_stmt (stmt);
>
> !       if (!STMT_VINFO_RELEVANT (stmt_info))
>        continue;
>
>        /* For interleaving, only the alignment of the first access
> --- 1534,1540 ----
>        stmt = DR_STMT (dr);
>        stmt_info = vinfo_for_stmt (stmt);
>
> !       if (!STMT_VINFO_RELEVANT_P (stmt_info))
>        continue;
>
>        /* For interleaving, only the alignment of the first access
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> *** gcc/tree-vect-stmts.c       (revision 188850)
> --- gcc/tree-vect-stmts.c       (working copy)
> *************** vect_get_store_cost (struct data_referen
> *** 931,936 ****
> --- 931,946 ----
>          break;
>        }
>
> +     case dr_unaligned_unsupported:
> +       {
> +         *inside_cost = VECT_MAX_COST;
> +
> +         if (vect_print_dump_info (REPORT_COST))
> +           fprintf (vect_dump, "vect_model_store_cost: unsupported access.");
> +
> +         break;
> +       }
> +
>      default:
>        gcc_unreachable ();
>      }
> *************** vect_get_load_cost (struct data_referenc
> *** 1094,1099 ****
> --- 1104,1119 ----
>          break;
>        }
>
> +     case dr_unaligned_unsupported:
> +       {
> +         *inside_cost = VECT_MAX_COST;
> +
> +         if (vect_print_dump_info (REPORT_COST))
> +           fprintf (vect_dump, "vect_model_load_cost: unsupported access.");
> +
> +         break;
> +       }
> +
>      default:
>        gcc_unreachable ();
>      }
> Index: gcc/tree-vect-slp.c
> ===================================================================
> *** gcc/tree-vect-slp.c (revision 188850)
> --- gcc/tree-vect-slp.c (working copy)
> *************** vect_slp_analyze_bb_1 (basic_block bb)
> *** 2050,2065 ****
>        return NULL;
>      }
>
> -    if (!vect_verify_datarefs_alignment (NULL, bb_vinfo))
> -     {
> -       if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
> -         fprintf (vect_dump, "not vectorized: unsupported alignment in basic 
> "
> -                             "block.\n");
> -
> -       destroy_bb_vec_info (bb_vinfo);
> -       return NULL;
> -     }
> -
>    /* Check the SLP opportunities in the basic block, analyze and build SLP
>       trees.  */
>    if (!vect_analyze_slp (NULL, bb_vinfo))
> --- 2050,2055 ----
> *************** vect_slp_analyze_bb_1 (basic_block bb)
> *** 2082,2087 ****
> --- 2072,2087 ----
>        vect_mark_slp_stmts_relevant (SLP_INSTANCE_TREE (instance));
>      }
>
> +    if (!vect_verify_datarefs_alignment (NULL, bb_vinfo))
> +     {
> +       if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
> +         fprintf (vect_dump, "not vectorized: unsupported alignment in basic 
> "
> +                             "block.\n");
> +
> +       destroy_bb_vec_info (bb_vinfo);
> +       return NULL;
> +     }
> +
>    if (!vect_slp_analyze_operations (bb_vinfo))
>      {
>        if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
>
> --
>  Dr. Ulrich Weigand
>  GNU Toolchain for Linux on System z and Cell BE
>  ulrich.weig...@de.ibm.com
>

Reply via email to