diff mbox series

[13/46] Make STMT_VINFO_RELATED_STMT a stmt_vec_info

Message ID 87d0vdq7k7.fsf@arm.com
State New
Headers show
Series Remove vinfo_for_stmt etc. | expand

Commit Message

Richard Sandiford July 24, 2018, 9:58 a.m. UTC
This patch changes STMT_VINFO_RELATED_STMT from a gimple stmt to a
stmt_vec_info.


2018-07-24  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* tree-vectorizer.h (_stmt_vec_info::related_stmt): Change from
	a gimple stmt to a stmt_vec_info.
	(is_pattern_stmt_p): Update accordingly.
	* tree-vect-data-refs.c (vect_preserves_scalar_order_p): Likewise.
	(vect_record_grouped_load_vectors): Likewise.
	* tree-vect-loop.c (vect_determine_vf_for_stmt): Likewise.
	(vect_fixup_reduc_chain, vect_update_vf_for_slp): Likewise.
	(vect_model_reduction_cost): Likewise.
	(vect_create_epilog_for_reduction): Likewise.
	(vectorizable_reduction, vectorizable_induction): Likewise.
	* tree-vect-patterns.c (vect_init_pattern_stmt): Likewise.
	Return the stmt_vec_info for the pattern statement.
	(vect_set_pattern_stmt): Update use of STMT_VINFO_RELATED_STMT.
	(vect_split_statement, vect_mark_pattern_stmts): Likewise.
	* tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Likewise.
	(vect_detect_hybrid_slp, vect_get_slp_defs): Likewise.
	* tree-vect-stmts.c (vect_mark_relevant): Likewise.
	(vect_get_vec_def_for_operand_1, vectorizable_call): Likewise.
	(vectorizable_simd_clone_call, vect_analyze_stmt, new_stmt_vec_info)
	(free_stmt_vec_info, vect_is_simple_use): Likewise.

Comments

Richard Biener July 25, 2018, 9:19 a.m. UTC | #1
On Tue, Jul 24, 2018 at 11:58 AM Richard Sandiford
<richard.sandiford@arm.com> wrote:
>
> This patch changes STMT_VINFO_RELATED_STMT from a gimple stmt to a
> stmt_vec_info.

OK.

>
> 2018-07-24  Richard Sandiford  <richard.sandiford@arm.com>
>
> gcc/
>         * tree-vectorizer.h (_stmt_vec_info::related_stmt): Change from
>         a gimple stmt to a stmt_vec_info.
>         (is_pattern_stmt_p): Update accordingly.
>         * tree-vect-data-refs.c (vect_preserves_scalar_order_p): Likewise.
>         (vect_record_grouped_load_vectors): Likewise.
>         * tree-vect-loop.c (vect_determine_vf_for_stmt): Likewise.
>         (vect_fixup_reduc_chain, vect_update_vf_for_slp): Likewise.
>         (vect_model_reduction_cost): Likewise.
>         (vect_create_epilog_for_reduction): Likewise.
>         (vectorizable_reduction, vectorizable_induction): Likewise.
>         * tree-vect-patterns.c (vect_init_pattern_stmt): Likewise.
>         Return the stmt_vec_info for the pattern statement.
>         (vect_set_pattern_stmt): Update use of STMT_VINFO_RELATED_STMT.
>         (vect_split_statement, vect_mark_pattern_stmts): Likewise.
>         * tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Likewise.
>         (vect_detect_hybrid_slp, vect_get_slp_defs): Likewise.
>         * tree-vect-stmts.c (vect_mark_relevant): Likewise.
>         (vect_get_vec_def_for_operand_1, vectorizable_call): Likewise.
>         (vectorizable_simd_clone_call, vect_analyze_stmt, new_stmt_vec_info)
>         (free_stmt_vec_info, vect_is_simple_use): Likewise.
>
> Index: gcc/tree-vectorizer.h
> ===================================================================
> --- gcc/tree-vectorizer.h       2018-07-24 10:22:40.725217371 +0100
> +++ gcc/tree-vectorizer.h       2018-07-24 10:22:44.297185652 +0100
> @@ -847,7 +847,7 @@ struct _stmt_vec_info {
>          related_stmt of the "pattern stmt" points back to this stmt (which is
>          the last stmt in the original sequence of stmts that constitutes the
>          pattern).  */
> -  gimple *related_stmt;
> +  stmt_vec_info related_stmt;
>
>    /* Used to keep a sequence of def stmts of a pattern stmt if such exists.
>       The sequence is attached to the original statement rather than the
> @@ -1189,16 +1189,8 @@ get_later_stmt (gimple *stmt1, gimple *s
>  static inline bool
>  is_pattern_stmt_p (stmt_vec_info stmt_info)
>  {
> -  gimple *related_stmt;
> -  stmt_vec_info related_stmt_info;
> -
> -  related_stmt = STMT_VINFO_RELATED_STMT (stmt_info);
> -  if (related_stmt
> -      && (related_stmt_info = vinfo_for_stmt (related_stmt))
> -      && STMT_VINFO_IN_PATTERN_P (related_stmt_info))
> -    return true;
> -
> -  return false;
> +  stmt_vec_info related_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
> +  return related_stmt_info && STMT_VINFO_IN_PATTERN_P (related_stmt_info);
>  }
>
>  /* Return true if BB is a loop header.  */
> Index: gcc/tree-vect-data-refs.c
> ===================================================================
> --- gcc/tree-vect-data-refs.c   2018-07-24 10:22:19.801403171 +0100
> +++ gcc/tree-vect-data-refs.c   2018-07-24 10:22:44.285185759 +0100
> @@ -213,10 +213,10 @@ vect_preserves_scalar_order_p (gimple *s
>       current position (but could happen earlier).  Reordering is therefore
>       only possible if the first access is a write.  */
>    if (is_pattern_stmt_p (stmtinfo_a))
> -    stmt_a = STMT_VINFO_RELATED_STMT (stmtinfo_a);
> +    stmtinfo_a = STMT_VINFO_RELATED_STMT (stmtinfo_a);
>    if (is_pattern_stmt_p (stmtinfo_b))
> -    stmt_b = STMT_VINFO_RELATED_STMT (stmtinfo_b);
> -  gimple *earlier_stmt = get_earlier_stmt (stmt_a, stmt_b);
> +    stmtinfo_b = STMT_VINFO_RELATED_STMT (stmtinfo_b);
> +  gimple *earlier_stmt = get_earlier_stmt (stmtinfo_a, stmtinfo_b);
>    return !DR_IS_WRITE (STMT_VINFO_DATA_REF (vinfo_for_stmt (earlier_stmt)));
>  }
>
> @@ -6359,8 +6359,10 @@ vect_transform_grouped_load (gimple *stm
>  void
>  vect_record_grouped_load_vectors (gimple *stmt, vec<tree> result_chain)
>  {
> -  gimple *first_stmt = DR_GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt));
> -  gimple *next_stmt, *new_stmt;
> +  stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
> +  vec_info *vinfo = stmt_info->vinfo;
> +  gimple *first_stmt = DR_GROUP_FIRST_ELEMENT (stmt_info);
> +  gimple *next_stmt;
>    unsigned int i, gap_count;
>    tree tmp_data_ref;
>
> @@ -6389,29 +6391,28 @@ vect_record_grouped_load_vectors (gimple
>
>        while (next_stmt)
>          {
> -         new_stmt = SSA_NAME_DEF_STMT (tmp_data_ref);
> +         stmt_vec_info new_stmt_info = vinfo->lookup_def (tmp_data_ref);
>           /* We assume that if VEC_STMT is not NULL, this is a case of multiple
>              copies, and we put the new vector statement in the first available
>              RELATED_STMT.  */
>           if (!STMT_VINFO_VEC_STMT (vinfo_for_stmt (next_stmt)))
> -           STMT_VINFO_VEC_STMT (vinfo_for_stmt (next_stmt)) = new_stmt;
> +           STMT_VINFO_VEC_STMT (vinfo_for_stmt (next_stmt)) = new_stmt_info;
>           else
>              {
>                if (!DR_GROUP_SAME_DR_STMT (vinfo_for_stmt (next_stmt)))
>                  {
>                   gimple *prev_stmt =
>                     STMT_VINFO_VEC_STMT (vinfo_for_stmt (next_stmt));
> -                 gimple *rel_stmt =
> -                   STMT_VINFO_RELATED_STMT (vinfo_for_stmt (prev_stmt));
> -                 while (rel_stmt)
> +                 stmt_vec_info rel_stmt_info
> +                   = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (prev_stmt));
> +                 while (rel_stmt_info)
>                     {
> -                     prev_stmt = rel_stmt;
> -                     rel_stmt =
> -                        STMT_VINFO_RELATED_STMT (vinfo_for_stmt (rel_stmt));
> +                     prev_stmt = rel_stmt_info;
> +                     rel_stmt_info = STMT_VINFO_RELATED_STMT (rel_stmt_info);
>                     }
>
> -                 STMT_VINFO_RELATED_STMT (vinfo_for_stmt (prev_stmt)) =
> -                    new_stmt;
> +                 STMT_VINFO_RELATED_STMT (vinfo_for_stmt (prev_stmt))
> +                   = new_stmt_info;
>                  }
>              }
>
> Index: gcc/tree-vect-loop.c
> ===================================================================
> --- gcc/tree-vect-loop.c        2018-07-24 10:22:40.721217407 +0100
> +++ gcc/tree-vect-loop.c        2018-07-24 10:22:44.289185723 +0100
> @@ -226,7 +226,7 @@ vect_determine_vf_for_stmt (stmt_vec_inf
>        && STMT_VINFO_RELATED_STMT (stmt_info))
>      {
>        gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info);
> -      stmt_info = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info));
> +      stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
>
>        /* If a pattern statement has def stmts, analyze them too.  */
>        for (gimple_stmt_iterator si = gsi_start (pattern_def_seq);
> @@ -654,23 +654,23 @@ vect_analyze_scalar_cycles (loop_vec_inf
>  static void
>  vect_fixup_reduc_chain (gimple *stmt)
>  {
> -  gimple *firstp = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt));
> -  gimple *stmtp;
> -  gcc_assert (!REDUC_GROUP_FIRST_ELEMENT (vinfo_for_stmt (firstp))
> -             && REDUC_GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt)));
> -  REDUC_GROUP_SIZE (vinfo_for_stmt (firstp))
> -    = REDUC_GROUP_SIZE (vinfo_for_stmt (stmt));
> +  stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
> +  stmt_vec_info firstp = STMT_VINFO_RELATED_STMT (stmt_info);
> +  stmt_vec_info stmtp;
> +  gcc_assert (!REDUC_GROUP_FIRST_ELEMENT (firstp)
> +             && REDUC_GROUP_FIRST_ELEMENT (stmt_info));
> +  REDUC_GROUP_SIZE (firstp) = REDUC_GROUP_SIZE (stmt_info);
>    do
>      {
>        stmtp = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt));
> -      REDUC_GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmtp)) = firstp;
> +      REDUC_GROUP_FIRST_ELEMENT (stmtp) = firstp;
>        stmt = REDUC_GROUP_NEXT_ELEMENT (vinfo_for_stmt (stmt));
>        if (stmt)
> -       REDUC_GROUP_NEXT_ELEMENT (vinfo_for_stmt (stmtp))
> +       REDUC_GROUP_NEXT_ELEMENT (stmtp)
>           = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt));
>      }
>    while (stmt);
> -  STMT_VINFO_DEF_TYPE (vinfo_for_stmt (stmtp)) = vect_reduction_def;
> +  STMT_VINFO_DEF_TYPE (stmtp) = vect_reduction_def;
>  }
>
>  /* Fixup scalar cycles that now have their stmts detected as patterns.  */
> @@ -1436,14 +1436,10 @@ vect_update_vf_for_slp (loop_vec_info lo
>        for (gimple_stmt_iterator si = gsi_start_bb (bb); !gsi_end_p (si);
>            gsi_next (&si))
>         {
> -         gimple *stmt = gsi_stmt (si);
>           stmt_vec_info stmt_info = loop_vinfo->lookup_stmt (gsi_stmt (si));
>           if (STMT_VINFO_IN_PATTERN_P (stmt_info)
>               && STMT_VINFO_RELATED_STMT (stmt_info))
> -           {
> -             stmt = STMT_VINFO_RELATED_STMT (stmt_info);
> -             stmt_info = vinfo_for_stmt (stmt);
> -           }
> +           stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
>           if ((STMT_VINFO_RELEVANT_P (stmt_info)
>                || VECTORIZABLE_CYCLE_DEF (STMT_VINFO_DEF_TYPE (stmt_info)))
>               && !PURE_SLP_STMT (stmt_info))
> @@ -2247,7 +2243,7 @@ vect_analyze_loop_2 (loop_vec_info loop_
>           if (STMT_VINFO_IN_PATTERN_P (stmt_info))
>             {
>               gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info);
> -             stmt_info = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info));
> +             stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
>               STMT_SLP_TYPE (stmt_info) = loop_vect;
>               for (gimple_stmt_iterator pi = gsi_start (pattern_def_seq);
>                    !gsi_end_p (pi); gsi_next (&pi))
> @@ -3836,7 +3832,6 @@ vect_model_reduction_cost (stmt_vec_info
>    enum tree_code code;
>    optab optab;
>    tree vectype;
> -  gimple *orig_stmt;
>    machine_mode mode;
>    loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info);
>    struct loop *loop = NULL;
> @@ -3852,12 +3847,12 @@ vect_model_reduction_cost (stmt_vec_info
>
>    vectype = STMT_VINFO_VECTYPE (stmt_info);
>    mode = TYPE_MODE (vectype);
> -  orig_stmt = STMT_VINFO_RELATED_STMT (stmt_info);
> +  stmt_vec_info orig_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
>
> -  if (!orig_stmt)
> -    orig_stmt = STMT_VINFO_STMT (stmt_info);
> +  if (!orig_stmt_info)
> +    orig_stmt_info = stmt_info;
>
> -  code = gimple_assign_rhs_code (orig_stmt);
> +  code = gimple_assign_rhs_code (orig_stmt_info->stmt);
>
>    if (reduction_type == EXTRACT_LAST_REDUCTION
>        || reduction_type == FOLD_LEFT_REDUCTION)
> @@ -3902,7 +3897,7 @@ vect_model_reduction_cost (stmt_vec_info
>       We have a reduction operator that will reduce the vector in one statement.
>       Also requires scalar extract.  */
>
> -  if (!loop || !nested_in_vect_loop_p (loop, orig_stmt))
> +  if (!loop || !nested_in_vect_loop_p (loop, orig_stmt_info))
>      {
>        if (reduc_fn != IFN_LAST)
>         {
> @@ -3953,7 +3948,7 @@ vect_model_reduction_cost (stmt_vec_info
>         {
>           int vec_size_in_bits = tree_to_uhwi (TYPE_SIZE (vectype));
>           tree bitsize =
> -           TYPE_SIZE (TREE_TYPE (gimple_assign_lhs (orig_stmt)));
> +           TYPE_SIZE (TREE_TYPE (gimple_assign_lhs (orig_stmt_info->stmt)));
>           int element_bitsize = tree_to_uhwi (bitsize);
>           int nelements = vec_size_in_bits / element_bitsize;
>
> @@ -4447,7 +4442,7 @@ vect_create_epilog_for_reduction (vec<tr
>    tree orig_name, scalar_result;
>    imm_use_iterator imm_iter, phi_imm_iter;
>    use_operand_p use_p, phi_use_p;
> -  gimple *use_stmt, *orig_stmt, *reduction_phi = NULL;
> +  gimple *use_stmt, *reduction_phi = NULL;
>    bool nested_in_vect_loop = false;
>    auto_vec<gimple *> new_phis;
>    auto_vec<gimple *> inner_phis;
> @@ -4726,7 +4721,7 @@ vect_create_epilog_for_reduction (vec<tr
>            else
>             {
>               def = vect_get_vec_def_for_stmt_copy (dt, def);
> -             STMT_VINFO_RELATED_STMT (prev_phi_info) = phi;
> +             STMT_VINFO_RELATED_STMT (prev_phi_info) = phi_info;
>             }
>
>            SET_PHI_ARG_DEF (phi, single_exit (loop)->dest_idx, def);
> @@ -4758,7 +4753,7 @@ vect_create_epilog_for_reduction (vec<tr
>               SET_PHI_ARG_DEF (outer_phi, single_exit (loop)->dest_idx,
>                                PHI_RESULT (phi));
>               stmt_vec_info outer_phi_info = loop_vinfo->add_stmt (outer_phi);
> -             STMT_VINFO_RELATED_STMT (prev_phi_info) = outer_phi;
> +             STMT_VINFO_RELATED_STMT (prev_phi_info) = outer_phi_info;
>               prev_phi_info = outer_phi_info;
>             }
>         }
> @@ -4775,27 +4770,26 @@ vect_create_epilog_for_reduction (vec<tr
>           Otherwise (it is a regular reduction) - the tree-code and scalar-def
>           are taken from STMT.  */
>
> -  orig_stmt = STMT_VINFO_RELATED_STMT (stmt_info);
> -  if (!orig_stmt)
> +  stmt_vec_info orig_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
> +  if (!orig_stmt_info)
>      {
>        /* Regular reduction  */
> -      orig_stmt = stmt;
> +      orig_stmt_info = stmt_info;
>      }
>    else
>      {
>        /* Reduction pattern  */
> -      stmt_vec_info stmt_vinfo = vinfo_for_stmt (orig_stmt);
> -      gcc_assert (STMT_VINFO_IN_PATTERN_P (stmt_vinfo));
> -      gcc_assert (STMT_VINFO_RELATED_STMT (stmt_vinfo) == stmt);
> +      gcc_assert (STMT_VINFO_IN_PATTERN_P (orig_stmt_info));
> +      gcc_assert (STMT_VINFO_RELATED_STMT (orig_stmt_info) == stmt_info);
>      }
>
> -  code = gimple_assign_rhs_code (orig_stmt);
> +  code = gimple_assign_rhs_code (orig_stmt_info->stmt);
>    /* For MINUS_EXPR the initial vector is [init_val,0,...,0], therefore,
>       partial results are added and not subtracted.  */
>    if (code == MINUS_EXPR)
>      code = PLUS_EXPR;
>
> -  scalar_dest = gimple_assign_lhs (orig_stmt);
> +  scalar_dest = gimple_assign_lhs (orig_stmt_info->stmt);
>    scalar_type = TREE_TYPE (scalar_dest);
>    scalar_results.create (group_size);
>    new_scalar_dest = vect_create_destination_var (scalar_dest, NULL);
> @@ -5613,10 +5607,11 @@ vect_create_epilog_for_reduction (vec<tr
>          {
>           gimple *current_stmt = SLP_TREE_SCALAR_STMTS (slp_node)[k];
>
> -          orig_stmt = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (current_stmt));
> -          /* SLP statements can't participate in patterns.  */
> -          gcc_assert (!orig_stmt);
> -          scalar_dest = gimple_assign_lhs (current_stmt);
> +         orig_stmt_info
> +           = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (current_stmt));
> +         /* SLP statements can't participate in patterns.  */
> +         gcc_assert (!orig_stmt_info);
> +         scalar_dest = gimple_assign_lhs (current_stmt);
>          }
>
>        phis.create (3);
> @@ -6097,8 +6092,6 @@ vectorizable_reduction (gimple *stmt, gi
>    enum tree_code cond_reduc_op_code = ERROR_MARK;
>    tree scalar_type;
>    bool is_simple_use;
> -  gimple *orig_stmt;
> -  stmt_vec_info orig_stmt_info = NULL;
>    int i;
>    int ncopies;
>    int epilog_copies;
> @@ -6229,7 +6222,7 @@ vectorizable_reduction (gimple *stmt, gi
>                       if (j == 0)
>                         STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt = new_phi;
>                       else
> -                       STMT_VINFO_RELATED_STMT (prev_phi_info) = new_phi;
> +                       STMT_VINFO_RELATED_STMT (prev_phi_info) = new_phi_info;
>                       prev_phi_info = new_phi_info;
>                     }
>                 }
> @@ -6259,10 +6252,9 @@ vectorizable_reduction (gimple *stmt, gi
>       the STMT_VINFO_RELATED_STMT field records the last stmt in
>       the original sequence that constitutes the pattern.  */
>
> -  orig_stmt = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt));
> -  if (orig_stmt)
> +  stmt_vec_info orig_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
> +  if (orig_stmt_info)
>      {
> -      orig_stmt_info = vinfo_for_stmt (orig_stmt);
>        gcc_assert (STMT_VINFO_IN_PATTERN_P (orig_stmt_info));
>        gcc_assert (!STMT_VINFO_IN_PATTERN_P (stmt_info));
>      }
> @@ -6393,7 +6385,7 @@ vectorizable_reduction (gimple *stmt, gi
>           return false;
>         }
>
> -      if (orig_stmt)
> +      if (orig_stmt_info)
>         reduc_def_stmt = STMT_VINFO_REDUC_DEF (orig_stmt_info);
>        else
>         reduc_def_stmt = STMT_VINFO_REDUC_DEF (stmt_info);
> @@ -6414,7 +6406,7 @@ vectorizable_reduction (gimple *stmt, gi
>        /* For pattern recognized stmts, orig_stmt might be a reduction,
>          but some helper statements for the pattern might not, or
>          might be COND_EXPRs with reduction uses in the condition.  */
> -      gcc_assert (orig_stmt);
> +      gcc_assert (orig_stmt_info);
>        return false;
>      }
>
> @@ -6548,10 +6540,10 @@ vectorizable_reduction (gimple *stmt, gi
>         }
>      }
>
> -  if (orig_stmt)
> -    gcc_assert (tmp == orig_stmt
> +  if (orig_stmt_info)
> +    gcc_assert (tmp == orig_stmt_info
>                 || (REDUC_GROUP_FIRST_ELEMENT (vinfo_for_stmt (tmp))
> -                   == orig_stmt));
> +                   == orig_stmt_info));
>    else
>      /* We changed STMT to be the first stmt in reduction chain, hence we
>         check that in this case the first element in the chain is STMT.  */
> @@ -6673,13 +6665,13 @@ vectorizable_reduction (gimple *stmt, gi
>
>    vect_reduction_type reduction_type
>      = STMT_VINFO_VEC_REDUCTION_TYPE (stmt_info);
> -  if (orig_stmt
> +  if (orig_stmt_info
>        && (reduction_type == TREE_CODE_REDUCTION
>           || reduction_type == FOLD_LEFT_REDUCTION))
>      {
>        /* This is a reduction pattern: get the vectype from the type of the
>           reduction variable, and get the tree-code from orig_stmt.  */
> -      orig_code = gimple_assign_rhs_code (orig_stmt);
> +      orig_code = gimple_assign_rhs_code (orig_stmt_info->stmt);
>        gcc_assert (vectype_out);
>        vec_mode = TYPE_MODE (vectype_out);
>      }
> @@ -7757,7 +7749,7 @@ vectorizable_induction (gimple *phi,
>
>           gsi_insert_before (&si, new_stmt, GSI_SAME_STMT);
>           new_stmt_info = loop_vinfo->add_stmt (new_stmt);
> -         STMT_VINFO_RELATED_STMT (prev_stmt_vinfo) = new_stmt;
> +         STMT_VINFO_RELATED_STMT (prev_stmt_vinfo) = new_stmt_info;
>           prev_stmt_vinfo = new_stmt_info;
>         }
>      }
> Index: gcc/tree-vect-patterns.c
> ===================================================================
> --- gcc/tree-vect-patterns.c    2018-07-24 10:22:37.253248202 +0100
> +++ gcc/tree-vect-patterns.c    2018-07-24 10:22:44.289185723 +0100
> @@ -94,10 +94,11 @@ vect_pattern_detected (const char *name,
>      }
>  }
>
> -/* Associate pattern statement PATTERN_STMT with ORIG_STMT_INFO.
> -   Set its vector type to VECTYPE if it doesn't have one already.  */
> +/* Associate pattern statement PATTERN_STMT with ORIG_STMT_INFO and
> +   return the pattern statement's stmt_vec_info.  Set its vector type to
> +   VECTYPE if it doesn't have one already.  */
>
> -static void
> +static stmt_vec_info
>  vect_init_pattern_stmt (gimple *pattern_stmt, stmt_vec_info orig_stmt_info,
>                         tree vectype)
>  {
> @@ -107,11 +108,12 @@ vect_init_pattern_stmt (gimple *pattern_
>      pattern_stmt_info = orig_stmt_info->vinfo->add_stmt (pattern_stmt);
>    gimple_set_bb (pattern_stmt, gimple_bb (orig_stmt_info->stmt));
>
> -  STMT_VINFO_RELATED_STMT (pattern_stmt_info) = orig_stmt_info->stmt;
> +  STMT_VINFO_RELATED_STMT (pattern_stmt_info) = orig_stmt_info;
>    STMT_VINFO_DEF_TYPE (pattern_stmt_info)
>      = STMT_VINFO_DEF_TYPE (orig_stmt_info);
>    if (!STMT_VINFO_VECTYPE (pattern_stmt_info))
>      STMT_VINFO_VECTYPE (pattern_stmt_info) = vectype;
> +  return pattern_stmt_info;
>  }
>
>  /* Set the pattern statement of ORIG_STMT_INFO to PATTERN_STMT.
> @@ -123,8 +125,8 @@ vect_set_pattern_stmt (gimple *pattern_s
>                        tree vectype)
>  {
>    STMT_VINFO_IN_PATTERN_P (orig_stmt_info) = true;
> -  STMT_VINFO_RELATED_STMT (orig_stmt_info) = pattern_stmt;
> -  vect_init_pattern_stmt (pattern_stmt, orig_stmt_info, vectype);
> +  STMT_VINFO_RELATED_STMT (orig_stmt_info)
> +    = vect_init_pattern_stmt (pattern_stmt, orig_stmt_info, vectype);
>  }
>
>  /* Add NEW_STMT to STMT_INFO's pattern definition statements.  If VECTYPE
> @@ -634,8 +636,7 @@ vect_split_statement (stmt_vec_info stmt
>      {
>        /* STMT2_INFO is part of a pattern.  Get the statement to which
>          the pattern is attached.  */
> -      stmt_vec_info orig_stmt2_info
> -       = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt2_info));
> +      stmt_vec_info orig_stmt2_info = STMT_VINFO_RELATED_STMT (stmt2_info);
>        vect_init_pattern_stmt (stmt1, orig_stmt2_info, vectype);
>
>        if (dump_enabled_p ())
> @@ -659,7 +660,7 @@ vect_split_statement (stmt_vec_info stmt
>         }
>
>        gimple_seq *def_seq = &STMT_VINFO_PATTERN_DEF_SEQ (orig_stmt2_info);
> -      if (STMT_VINFO_RELATED_STMT (orig_stmt2_info) == stmt2_info->stmt)
> +      if (STMT_VINFO_RELATED_STMT (orig_stmt2_info) == stmt2_info)
>         /* STMT2_INFO is the actual pattern statement.  Add STMT1
>            to the end of the definition sequence.  */
>         gimple_seq_add_stmt_without_update (def_seq, stmt1);
> @@ -4754,8 +4755,7 @@ vect_mark_pattern_stmts (gimple *orig_st
>         }
>
>        /* Switch to the statement that ORIG replaces.  */
> -      orig_stmt_info
> -       = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (orig_stmt_info));
> +      orig_stmt_info = STMT_VINFO_RELATED_STMT (orig_stmt_info);
>
>        /* We shouldn't be replacing the main pattern statement.  */
>        gcc_assert (STMT_VINFO_RELATED_STMT (orig_stmt_info) != orig_stmt);
> Index: gcc/tree-vect-slp.c
> ===================================================================
> --- gcc/tree-vect-slp.c 2018-07-24 10:22:37.253248202 +0100
> +++ gcc/tree-vect-slp.c 2018-07-24 10:22:44.293185688 +0100
> @@ -2327,7 +2327,7 @@ vect_detect_hybrid_slp_stmts (slp_tree n
>           original stmt for immediate uses.  */
>        if (! STMT_VINFO_IN_PATTERN_P (stmt_vinfo)
>           && STMT_VINFO_RELATED_STMT (stmt_vinfo))
> -       stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo);
> +       stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo)->stmt;
>        tree def;
>        if (gimple_code (stmt) == GIMPLE_PHI)
>         def = gimple_phi_result (stmt);
> @@ -2341,7 +2341,7 @@ vect_detect_hybrid_slp_stmts (slp_tree n
>               continue;
>             if (STMT_VINFO_IN_PATTERN_P (use_vinfo)
>                 && STMT_VINFO_RELATED_STMT (use_vinfo))
> -             use_vinfo = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (use_vinfo));
> +             use_vinfo = STMT_VINFO_RELATED_STMT (use_vinfo);
>             if (!STMT_SLP_TYPE (use_vinfo)
>                 && (STMT_VINFO_RELEVANT (use_vinfo)
>                     || VECTORIZABLE_CYCLE_DEF (STMT_VINFO_DEF_TYPE (use_vinfo)))
> @@ -2446,7 +2446,7 @@ vect_detect_hybrid_slp (loop_vec_info lo
>               memset (&wi, 0, sizeof (wi));
>               wi.info = loop_vinfo;
>               gimple_stmt_iterator gsi2
> -               = gsi_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info));
> +               = gsi_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info)->stmt);
>               walk_gimple_stmt (&gsi2, vect_detect_hybrid_slp_2,
>                                 vect_detect_hybrid_slp_1, &wi);
>               walk_gimple_seq (STMT_VINFO_PATTERN_DEF_SEQ (stmt_info),
> @@ -3612,7 +3612,7 @@ vect_get_slp_defs (vec<tree> ops, slp_tr
>           if (SLP_TREE_DEF_TYPE (child) == vect_internal_def)
>             {
>               gimple *first_def = SLP_TREE_SCALAR_STMTS (child)[0];
> -             gimple *related
> +             stmt_vec_info related
>                 = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (first_def));
>               tree first_def_op;
>
> @@ -3622,7 +3622,8 @@ vect_get_slp_defs (vec<tree> ops, slp_tr
>                 first_def_op = gimple_get_lhs (first_def);
>               if (operand_equal_p (oprnd, first_def_op, 0)
>                   || (related
> -                     && operand_equal_p (oprnd, gimple_get_lhs (related), 0)))
> +                     && operand_equal_p (oprnd,
> +                                         gimple_get_lhs (related->stmt), 0)))
>                 {
>                   /* The number of vector defs is determined by the number of
>                      vector statements in the node from which we get those
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c       2018-07-24 10:22:40.725217371 +0100
> +++ gcc/tree-vect-stmts.c       2018-07-24 10:22:44.293185688 +0100
> @@ -202,7 +202,6 @@ vect_mark_relevant (vec<gimple *> *workl
>    stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
>    enum vect_relevant save_relevant = STMT_VINFO_RELEVANT (stmt_info);
>    bool save_live_p = STMT_VINFO_LIVE_P (stmt_info);
> -  gimple *pattern_stmt;
>
>    if (dump_enabled_p ())
>      {
> @@ -222,17 +221,16 @@ vect_mark_relevant (vec<gimple *> *workl
>          as relevant/live because it's not going to be vectorized.
>          Instead mark the pattern-stmt that replaces it.  */
>
> -      pattern_stmt = STMT_VINFO_RELATED_STMT (stmt_info);
> -
>        if (dump_enabled_p ())
>         dump_printf_loc (MSG_NOTE, vect_location,
>                          "last stmt in pattern. don't mark"
>                          " relevant/live.\n");
> -      stmt_info = vinfo_for_stmt (pattern_stmt);
> -      gcc_assert (STMT_VINFO_RELATED_STMT (stmt_info) == stmt);
> +      stmt_vec_info old_stmt_info = stmt_info;
> +      stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
> +      gcc_assert (STMT_VINFO_RELATED_STMT (stmt_info) == old_stmt_info);
>        save_relevant = STMT_VINFO_RELEVANT (stmt_info);
>        save_live_p = STMT_VINFO_LIVE_P (stmt_info);
> -      stmt = pattern_stmt;
> +      stmt = stmt_info->stmt;
>      }
>
>    STMT_VINFO_LIVE_P (stmt_info) |= live_p;
> @@ -1489,8 +1487,8 @@ vect_get_vec_def_for_operand_1 (gimple *
>          if (!vec_stmt
>              && STMT_VINFO_IN_PATTERN_P (def_stmt_info)
>              && !STMT_VINFO_RELEVANT (def_stmt_info))
> -          vec_stmt = STMT_VINFO_VEC_STMT (vinfo_for_stmt (
> -                       STMT_VINFO_RELATED_STMT (def_stmt_info)));
> +         vec_stmt = (STMT_VINFO_VEC_STMT
> +                     (STMT_VINFO_RELATED_STMT (def_stmt_info)));
>          gcc_assert (vec_stmt);
>         if (gimple_code (vec_stmt) == GIMPLE_PHI)
>           vec_oprnd = PHI_RESULT (vec_stmt);
> @@ -3635,7 +3633,7 @@ vectorizable_call (gimple *gs, gimple_st
>      return true;
>
>    if (is_pattern_stmt_p (stmt_info))
> -    stmt_info = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info));
> +    stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
>    lhs = gimple_get_lhs (stmt_info->stmt);
>
>    gassign *new_stmt
> @@ -4370,7 +4368,7 @@ vectorizable_simd_clone_call (gimple *st
>      {
>        type = TREE_TYPE (scalar_dest);
>        if (is_pattern_stmt_p (stmt_info))
> -       lhs = gimple_call_lhs (STMT_VINFO_RELATED_STMT (stmt_info));
> +       lhs = gimple_call_lhs (STMT_VINFO_RELATED_STMT (stmt_info)->stmt);
>        else
>         lhs = gimple_call_lhs (stmt);
>        new_stmt = gimple_build_assign (lhs, build_zero_cst (type));
> @@ -9420,7 +9418,6 @@ vect_analyze_stmt (gimple *stmt, bool *n
>    bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
>    enum vect_relevant relevance = STMT_VINFO_RELEVANT (stmt_info);
>    bool ok;
> -  gimple *pattern_stmt;
>    gimple_seq pattern_def_seq;
>
>    if (dump_enabled_p ())
> @@ -9482,18 +9479,18 @@ vect_analyze_stmt (gimple *stmt, bool *n
>       traversal, don't analyze pattern stmts instead, the pattern stmts
>       already will be part of SLP instance.  */
>
> -  pattern_stmt = STMT_VINFO_RELATED_STMT (stmt_info);
> +  stmt_vec_info pattern_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
>    if (!STMT_VINFO_RELEVANT_P (stmt_info)
>        && !STMT_VINFO_LIVE_P (stmt_info))
>      {
>        if (STMT_VINFO_IN_PATTERN_P (stmt_info)
> -          && pattern_stmt
> -          && (STMT_VINFO_RELEVANT_P (vinfo_for_stmt (pattern_stmt))
> -              || STMT_VINFO_LIVE_P (vinfo_for_stmt (pattern_stmt))))
> +         && pattern_stmt_info
> +         && (STMT_VINFO_RELEVANT_P (pattern_stmt_info)
> +             || STMT_VINFO_LIVE_P (pattern_stmt_info)))
>          {
>            /* Analyze PATTERN_STMT instead of the original stmt.  */
> -          stmt = pattern_stmt;
> -          stmt_info = vinfo_for_stmt (pattern_stmt);
> +         stmt = pattern_stmt_info->stmt;
> +         stmt_info = pattern_stmt_info;
>            if (dump_enabled_p ())
>              {
>                dump_printf_loc (MSG_NOTE, vect_location,
> @@ -9511,9 +9508,9 @@ vect_analyze_stmt (gimple *stmt, bool *n
>      }
>    else if (STMT_VINFO_IN_PATTERN_P (stmt_info)
>            && node == NULL
> -           && pattern_stmt
> -           && (STMT_VINFO_RELEVANT_P (vinfo_for_stmt (pattern_stmt))
> -               || STMT_VINFO_LIVE_P (vinfo_for_stmt (pattern_stmt))))
> +          && pattern_stmt_info
> +          && (STMT_VINFO_RELEVANT_P (pattern_stmt_info)
> +              || STMT_VINFO_LIVE_P (pattern_stmt_info)))
>      {
>        /* Analyze PATTERN_STMT too.  */
>        if (dump_enabled_p ())
> @@ -9523,7 +9520,7 @@ vect_analyze_stmt (gimple *stmt, bool *n
>            dump_gimple_stmt (MSG_NOTE, TDF_SLIM, stmt, 0);
>          }
>
> -      if (!vect_analyze_stmt (pattern_stmt, need_to_vectorize, node,
> +      if (!vect_analyze_stmt (pattern_stmt_info, need_to_vectorize, node,
>                               node_instance, cost_vec))
>          return false;
>     }
> @@ -9855,7 +9852,6 @@ new_stmt_vec_info (gimple *stmt, vec_inf
>    STMT_VINFO_VEC_STMT (res) = NULL;
>    STMT_VINFO_VECTORIZABLE (res) = true;
>    STMT_VINFO_IN_PATTERN_P (res) = false;
> -  STMT_VINFO_RELATED_STMT (res) = NULL;
>    STMT_VINFO_PATTERN_DEF_SEQ (res) = NULL;
>    STMT_VINFO_DATA_REF (res) = NULL;
>    STMT_VINFO_VEC_REDUCTION_TYPE (res) = TREE_CODE_REDUCTION;
> @@ -9936,16 +9932,14 @@ free_stmt_vec_info (gimple *stmt)
>               release_ssa_name (lhs);
>             free_stmt_vec_info (seq_stmt);
>           }
> -      stmt_vec_info patt_info
> -       = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info));
> -      if (patt_info)
> -       {
> -         gimple *patt_stmt = STMT_VINFO_STMT (patt_info);
> -         gimple_set_bb (patt_stmt, NULL);
> -         tree lhs = gimple_get_lhs (patt_stmt);
> +      stmt_vec_info patt_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
> +      if (patt_stmt_info)
> +       {
> +         gimple_set_bb (patt_stmt_info->stmt, NULL);
> +         tree lhs = gimple_get_lhs (patt_stmt_info->stmt);
>           if (lhs && TREE_CODE (lhs) == SSA_NAME)
>             release_ssa_name (lhs);
> -         free_stmt_vec_info (patt_stmt);
> +         free_stmt_vec_info (patt_stmt_info);
>         }
>      }
>
> @@ -10143,8 +10137,8 @@ vect_is_simple_use (tree operand, vec_in
>         {
>           if (STMT_VINFO_IN_PATTERN_P (stmt_vinfo))
>             {
> -             def_stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo);
> -             stmt_vinfo = vinfo_for_stmt (def_stmt);
> +             stmt_vinfo = STMT_VINFO_RELATED_STMT (stmt_vinfo);
> +             def_stmt = stmt_vinfo->stmt;
>             }
>           switch (gimple_code (def_stmt))
>             {
diff mbox series

Patch

Index: gcc/tree-vectorizer.h
===================================================================
--- gcc/tree-vectorizer.h	2018-07-24 10:22:40.725217371 +0100
+++ gcc/tree-vectorizer.h	2018-07-24 10:22:44.297185652 +0100
@@ -847,7 +847,7 @@  struct _stmt_vec_info {
         related_stmt of the "pattern stmt" points back to this stmt (which is
         the last stmt in the original sequence of stmts that constitutes the
         pattern).  */
-  gimple *related_stmt;
+  stmt_vec_info related_stmt;
 
   /* Used to keep a sequence of def stmts of a pattern stmt if such exists.
      The sequence is attached to the original statement rather than the
@@ -1189,16 +1189,8 @@  get_later_stmt (gimple *stmt1, gimple *s
 static inline bool
 is_pattern_stmt_p (stmt_vec_info stmt_info)
 {
-  gimple *related_stmt;
-  stmt_vec_info related_stmt_info;
-
-  related_stmt = STMT_VINFO_RELATED_STMT (stmt_info);
-  if (related_stmt
-      && (related_stmt_info = vinfo_for_stmt (related_stmt))
-      && STMT_VINFO_IN_PATTERN_P (related_stmt_info))
-    return true;
-
-  return false;
+  stmt_vec_info related_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
+  return related_stmt_info && STMT_VINFO_IN_PATTERN_P (related_stmt_info);
 }
 
 /* Return true if BB is a loop header.  */
Index: gcc/tree-vect-data-refs.c
===================================================================
--- gcc/tree-vect-data-refs.c	2018-07-24 10:22:19.801403171 +0100
+++ gcc/tree-vect-data-refs.c	2018-07-24 10:22:44.285185759 +0100
@@ -213,10 +213,10 @@  vect_preserves_scalar_order_p (gimple *s
      current position (but could happen earlier).  Reordering is therefore
      only possible if the first access is a write.  */
   if (is_pattern_stmt_p (stmtinfo_a))
-    stmt_a = STMT_VINFO_RELATED_STMT (stmtinfo_a);
+    stmtinfo_a = STMT_VINFO_RELATED_STMT (stmtinfo_a);
   if (is_pattern_stmt_p (stmtinfo_b))
-    stmt_b = STMT_VINFO_RELATED_STMT (stmtinfo_b);
-  gimple *earlier_stmt = get_earlier_stmt (stmt_a, stmt_b);
+    stmtinfo_b = STMT_VINFO_RELATED_STMT (stmtinfo_b);
+  gimple *earlier_stmt = get_earlier_stmt (stmtinfo_a, stmtinfo_b);
   return !DR_IS_WRITE (STMT_VINFO_DATA_REF (vinfo_for_stmt (earlier_stmt)));
 }
 
@@ -6359,8 +6359,10 @@  vect_transform_grouped_load (gimple *stm
 void
 vect_record_grouped_load_vectors (gimple *stmt, vec<tree> result_chain)
 {
-  gimple *first_stmt = DR_GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt));
-  gimple *next_stmt, *new_stmt;
+  stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
+  vec_info *vinfo = stmt_info->vinfo;
+  gimple *first_stmt = DR_GROUP_FIRST_ELEMENT (stmt_info);
+  gimple *next_stmt;
   unsigned int i, gap_count;
   tree tmp_data_ref;
 
@@ -6389,29 +6391,28 @@  vect_record_grouped_load_vectors (gimple
 
       while (next_stmt)
         {
-	  new_stmt = SSA_NAME_DEF_STMT (tmp_data_ref);
+	  stmt_vec_info new_stmt_info = vinfo->lookup_def (tmp_data_ref);
 	  /* We assume that if VEC_STMT is not NULL, this is a case of multiple
 	     copies, and we put the new vector statement in the first available
 	     RELATED_STMT.  */
 	  if (!STMT_VINFO_VEC_STMT (vinfo_for_stmt (next_stmt)))
-	    STMT_VINFO_VEC_STMT (vinfo_for_stmt (next_stmt)) = new_stmt;
+	    STMT_VINFO_VEC_STMT (vinfo_for_stmt (next_stmt)) = new_stmt_info;
 	  else
             {
               if (!DR_GROUP_SAME_DR_STMT (vinfo_for_stmt (next_stmt)))
                 {
 		  gimple *prev_stmt =
 		    STMT_VINFO_VEC_STMT (vinfo_for_stmt (next_stmt));
-		  gimple *rel_stmt =
-		    STMT_VINFO_RELATED_STMT (vinfo_for_stmt (prev_stmt));
-	          while (rel_stmt)
+		  stmt_vec_info rel_stmt_info
+		    = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (prev_stmt));
+		  while (rel_stmt_info)
 		    {
-		      prev_stmt = rel_stmt;
-		      rel_stmt =
-                        STMT_VINFO_RELATED_STMT (vinfo_for_stmt (rel_stmt));
+		      prev_stmt = rel_stmt_info;
+		      rel_stmt_info = STMT_VINFO_RELATED_STMT (rel_stmt_info);
 		    }
 
-  	          STMT_VINFO_RELATED_STMT (vinfo_for_stmt (prev_stmt)) =
-                    new_stmt;
+		  STMT_VINFO_RELATED_STMT (vinfo_for_stmt (prev_stmt))
+		    = new_stmt_info;
                 }
             }
 
Index: gcc/tree-vect-loop.c
===================================================================
--- gcc/tree-vect-loop.c	2018-07-24 10:22:40.721217407 +0100
+++ gcc/tree-vect-loop.c	2018-07-24 10:22:44.289185723 +0100
@@ -226,7 +226,7 @@  vect_determine_vf_for_stmt (stmt_vec_inf
       && STMT_VINFO_RELATED_STMT (stmt_info))
     {
       gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info);
-      stmt_info = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info));
+      stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
 
       /* If a pattern statement has def stmts, analyze them too.  */
       for (gimple_stmt_iterator si = gsi_start (pattern_def_seq);
@@ -654,23 +654,23 @@  vect_analyze_scalar_cycles (loop_vec_inf
 static void
 vect_fixup_reduc_chain (gimple *stmt)
 {
-  gimple *firstp = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt));
-  gimple *stmtp;
-  gcc_assert (!REDUC_GROUP_FIRST_ELEMENT (vinfo_for_stmt (firstp))
-	      && REDUC_GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt)));
-  REDUC_GROUP_SIZE (vinfo_for_stmt (firstp))
-    = REDUC_GROUP_SIZE (vinfo_for_stmt (stmt));
+  stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
+  stmt_vec_info firstp = STMT_VINFO_RELATED_STMT (stmt_info);
+  stmt_vec_info stmtp;
+  gcc_assert (!REDUC_GROUP_FIRST_ELEMENT (firstp)
+	      && REDUC_GROUP_FIRST_ELEMENT (stmt_info));
+  REDUC_GROUP_SIZE (firstp) = REDUC_GROUP_SIZE (stmt_info);
   do
     {
       stmtp = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt));
-      REDUC_GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmtp)) = firstp;
+      REDUC_GROUP_FIRST_ELEMENT (stmtp) = firstp;
       stmt = REDUC_GROUP_NEXT_ELEMENT (vinfo_for_stmt (stmt));
       if (stmt)
-	REDUC_GROUP_NEXT_ELEMENT (vinfo_for_stmt (stmtp))
+	REDUC_GROUP_NEXT_ELEMENT (stmtp)
 	  = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt));
     }
   while (stmt);
-  STMT_VINFO_DEF_TYPE (vinfo_for_stmt (stmtp)) = vect_reduction_def;
+  STMT_VINFO_DEF_TYPE (stmtp) = vect_reduction_def;
 }
 
 /* Fixup scalar cycles that now have their stmts detected as patterns.  */
@@ -1436,14 +1436,10 @@  vect_update_vf_for_slp (loop_vec_info lo
       for (gimple_stmt_iterator si = gsi_start_bb (bb); !gsi_end_p (si);
 	   gsi_next (&si))
 	{
-	  gimple *stmt = gsi_stmt (si);
 	  stmt_vec_info stmt_info = loop_vinfo->lookup_stmt (gsi_stmt (si));
 	  if (STMT_VINFO_IN_PATTERN_P (stmt_info)
 	      && STMT_VINFO_RELATED_STMT (stmt_info))
-	    {
-	      stmt = STMT_VINFO_RELATED_STMT (stmt_info);
-	      stmt_info = vinfo_for_stmt (stmt);
-	    }
+	    stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
 	  if ((STMT_VINFO_RELEVANT_P (stmt_info)
 	       || VECTORIZABLE_CYCLE_DEF (STMT_VINFO_DEF_TYPE (stmt_info)))
 	      && !PURE_SLP_STMT (stmt_info))
@@ -2247,7 +2243,7 @@  vect_analyze_loop_2 (loop_vec_info loop_
 	  if (STMT_VINFO_IN_PATTERN_P (stmt_info))
 	    {
 	      gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info);
-	      stmt_info = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info));
+	      stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
 	      STMT_SLP_TYPE (stmt_info) = loop_vect;
 	      for (gimple_stmt_iterator pi = gsi_start (pattern_def_seq);
 		   !gsi_end_p (pi); gsi_next (&pi))
@@ -3836,7 +3832,6 @@  vect_model_reduction_cost (stmt_vec_info
   enum tree_code code;
   optab optab;
   tree vectype;
-  gimple *orig_stmt;
   machine_mode mode;
   loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info);
   struct loop *loop = NULL;
@@ -3852,12 +3847,12 @@  vect_model_reduction_cost (stmt_vec_info
 
   vectype = STMT_VINFO_VECTYPE (stmt_info);
   mode = TYPE_MODE (vectype);
-  orig_stmt = STMT_VINFO_RELATED_STMT (stmt_info);
+  stmt_vec_info orig_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
 
-  if (!orig_stmt)
-    orig_stmt = STMT_VINFO_STMT (stmt_info);
+  if (!orig_stmt_info)
+    orig_stmt_info = stmt_info;
 
-  code = gimple_assign_rhs_code (orig_stmt);
+  code = gimple_assign_rhs_code (orig_stmt_info->stmt);
 
   if (reduction_type == EXTRACT_LAST_REDUCTION
       || reduction_type == FOLD_LEFT_REDUCTION)
@@ -3902,7 +3897,7 @@  vect_model_reduction_cost (stmt_vec_info
      We have a reduction operator that will reduce the vector in one statement.
      Also requires scalar extract.  */
 
-  if (!loop || !nested_in_vect_loop_p (loop, orig_stmt))
+  if (!loop || !nested_in_vect_loop_p (loop, orig_stmt_info))
     {
       if (reduc_fn != IFN_LAST)
 	{
@@ -3953,7 +3948,7 @@  vect_model_reduction_cost (stmt_vec_info
 	{
 	  int vec_size_in_bits = tree_to_uhwi (TYPE_SIZE (vectype));
 	  tree bitsize =
-	    TYPE_SIZE (TREE_TYPE (gimple_assign_lhs (orig_stmt)));
+	    TYPE_SIZE (TREE_TYPE (gimple_assign_lhs (orig_stmt_info->stmt)));
 	  int element_bitsize = tree_to_uhwi (bitsize);
 	  int nelements = vec_size_in_bits / element_bitsize;
 
@@ -4447,7 +4442,7 @@  vect_create_epilog_for_reduction (vec<tr
   tree orig_name, scalar_result;
   imm_use_iterator imm_iter, phi_imm_iter;
   use_operand_p use_p, phi_use_p;
-  gimple *use_stmt, *orig_stmt, *reduction_phi = NULL;
+  gimple *use_stmt, *reduction_phi = NULL;
   bool nested_in_vect_loop = false;
   auto_vec<gimple *> new_phis;
   auto_vec<gimple *> inner_phis;
@@ -4726,7 +4721,7 @@  vect_create_epilog_for_reduction (vec<tr
           else
 	    {
 	      def = vect_get_vec_def_for_stmt_copy (dt, def);
-	      STMT_VINFO_RELATED_STMT (prev_phi_info) = phi;
+	      STMT_VINFO_RELATED_STMT (prev_phi_info) = phi_info;
 	    }
 
           SET_PHI_ARG_DEF (phi, single_exit (loop)->dest_idx, def);
@@ -4758,7 +4753,7 @@  vect_create_epilog_for_reduction (vec<tr
 	      SET_PHI_ARG_DEF (outer_phi, single_exit (loop)->dest_idx,
 			       PHI_RESULT (phi));
 	      stmt_vec_info outer_phi_info = loop_vinfo->add_stmt (outer_phi);
-	      STMT_VINFO_RELATED_STMT (prev_phi_info) = outer_phi;
+	      STMT_VINFO_RELATED_STMT (prev_phi_info) = outer_phi_info;
 	      prev_phi_info = outer_phi_info;
 	    }
 	}
@@ -4775,27 +4770,26 @@  vect_create_epilog_for_reduction (vec<tr
          Otherwise (it is a regular reduction) - the tree-code and scalar-def
          are taken from STMT.  */
 
-  orig_stmt = STMT_VINFO_RELATED_STMT (stmt_info);
-  if (!orig_stmt)
+  stmt_vec_info orig_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
+  if (!orig_stmt_info)
     {
       /* Regular reduction  */
-      orig_stmt = stmt;
+      orig_stmt_info = stmt_info;
     }
   else
     {
       /* Reduction pattern  */
-      stmt_vec_info stmt_vinfo = vinfo_for_stmt (orig_stmt);
-      gcc_assert (STMT_VINFO_IN_PATTERN_P (stmt_vinfo));
-      gcc_assert (STMT_VINFO_RELATED_STMT (stmt_vinfo) == stmt);
+      gcc_assert (STMT_VINFO_IN_PATTERN_P (orig_stmt_info));
+      gcc_assert (STMT_VINFO_RELATED_STMT (orig_stmt_info) == stmt_info);
     }
 
-  code = gimple_assign_rhs_code (orig_stmt);
+  code = gimple_assign_rhs_code (orig_stmt_info->stmt);
   /* For MINUS_EXPR the initial vector is [init_val,0,...,0], therefore,
      partial results are added and not subtracted.  */
   if (code == MINUS_EXPR) 
     code = PLUS_EXPR;
   
-  scalar_dest = gimple_assign_lhs (orig_stmt);
+  scalar_dest = gimple_assign_lhs (orig_stmt_info->stmt);
   scalar_type = TREE_TYPE (scalar_dest);
   scalar_results.create (group_size); 
   new_scalar_dest = vect_create_destination_var (scalar_dest, NULL);
@@ -5613,10 +5607,11 @@  vect_create_epilog_for_reduction (vec<tr
         {
 	  gimple *current_stmt = SLP_TREE_SCALAR_STMTS (slp_node)[k];
 
-          orig_stmt = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (current_stmt));
-          /* SLP statements can't participate in patterns.  */
-          gcc_assert (!orig_stmt);
-          scalar_dest = gimple_assign_lhs (current_stmt);
+	  orig_stmt_info
+	    = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (current_stmt));
+	  /* SLP statements can't participate in patterns.  */
+	  gcc_assert (!orig_stmt_info);
+	  scalar_dest = gimple_assign_lhs (current_stmt);
         }
 
       phis.create (3);
@@ -6097,8 +6092,6 @@  vectorizable_reduction (gimple *stmt, gi
   enum tree_code cond_reduc_op_code = ERROR_MARK;
   tree scalar_type;
   bool is_simple_use;
-  gimple *orig_stmt;
-  stmt_vec_info orig_stmt_info = NULL;
   int i;
   int ncopies;
   int epilog_copies;
@@ -6229,7 +6222,7 @@  vectorizable_reduction (gimple *stmt, gi
 		      if (j == 0)
 			STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt = new_phi;
 		      else
-			STMT_VINFO_RELATED_STMT (prev_phi_info) = new_phi;
+			STMT_VINFO_RELATED_STMT (prev_phi_info) = new_phi_info;
 		      prev_phi_info = new_phi_info;
 		    }
 		}
@@ -6259,10 +6252,9 @@  vectorizable_reduction (gimple *stmt, gi
      the STMT_VINFO_RELATED_STMT field records the last stmt in
      the original sequence that constitutes the pattern.  */
 
-  orig_stmt = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt));
-  if (orig_stmt)
+  stmt_vec_info orig_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
+  if (orig_stmt_info)
     {
-      orig_stmt_info = vinfo_for_stmt (orig_stmt);
       gcc_assert (STMT_VINFO_IN_PATTERN_P (orig_stmt_info));
       gcc_assert (!STMT_VINFO_IN_PATTERN_P (stmt_info));
     }
@@ -6393,7 +6385,7 @@  vectorizable_reduction (gimple *stmt, gi
 	  return false;
 	}
 
-      if (orig_stmt)
+      if (orig_stmt_info)
 	reduc_def_stmt = STMT_VINFO_REDUC_DEF (orig_stmt_info);
       else
 	reduc_def_stmt = STMT_VINFO_REDUC_DEF (stmt_info);
@@ -6414,7 +6406,7 @@  vectorizable_reduction (gimple *stmt, gi
       /* For pattern recognized stmts, orig_stmt might be a reduction,
 	 but some helper statements for the pattern might not, or
 	 might be COND_EXPRs with reduction uses in the condition.  */
-      gcc_assert (orig_stmt);
+      gcc_assert (orig_stmt_info);
       return false;
     }
 
@@ -6548,10 +6540,10 @@  vectorizable_reduction (gimple *stmt, gi
 	}
     }
 
-  if (orig_stmt)
-    gcc_assert (tmp == orig_stmt
+  if (orig_stmt_info)
+    gcc_assert (tmp == orig_stmt_info
 		|| (REDUC_GROUP_FIRST_ELEMENT (vinfo_for_stmt (tmp))
-		    == orig_stmt));
+		    == orig_stmt_info));
   else
     /* We changed STMT to be the first stmt in reduction chain, hence we
        check that in this case the first element in the chain is STMT.  */
@@ -6673,13 +6665,13 @@  vectorizable_reduction (gimple *stmt, gi
 
   vect_reduction_type reduction_type
     = STMT_VINFO_VEC_REDUCTION_TYPE (stmt_info);
-  if (orig_stmt
+  if (orig_stmt_info
       && (reduction_type == TREE_CODE_REDUCTION
 	  || reduction_type == FOLD_LEFT_REDUCTION))
     {
       /* This is a reduction pattern: get the vectype from the type of the
          reduction variable, and get the tree-code from orig_stmt.  */
-      orig_code = gimple_assign_rhs_code (orig_stmt);
+      orig_code = gimple_assign_rhs_code (orig_stmt_info->stmt);
       gcc_assert (vectype_out);
       vec_mode = TYPE_MODE (vectype_out);
     }
@@ -7757,7 +7749,7 @@  vectorizable_induction (gimple *phi,
  
 	  gsi_insert_before (&si, new_stmt, GSI_SAME_STMT);
 	  new_stmt_info = loop_vinfo->add_stmt (new_stmt);
-	  STMT_VINFO_RELATED_STMT (prev_stmt_vinfo) = new_stmt;
+	  STMT_VINFO_RELATED_STMT (prev_stmt_vinfo) = new_stmt_info;
 	  prev_stmt_vinfo = new_stmt_info;
 	}
     }
Index: gcc/tree-vect-patterns.c
===================================================================
--- gcc/tree-vect-patterns.c	2018-07-24 10:22:37.253248202 +0100
+++ gcc/tree-vect-patterns.c	2018-07-24 10:22:44.289185723 +0100
@@ -94,10 +94,11 @@  vect_pattern_detected (const char *name,
     }
 }
 
-/* Associate pattern statement PATTERN_STMT with ORIG_STMT_INFO.
-   Set its vector type to VECTYPE if it doesn't have one already.  */
+/* Associate pattern statement PATTERN_STMT with ORIG_STMT_INFO and
+   return the pattern statement's stmt_vec_info.  Set its vector type to
+   VECTYPE if it doesn't have one already.  */
 
-static void
+static stmt_vec_info
 vect_init_pattern_stmt (gimple *pattern_stmt, stmt_vec_info orig_stmt_info,
 			tree vectype)
 {
@@ -107,11 +108,12 @@  vect_init_pattern_stmt (gimple *pattern_
     pattern_stmt_info = orig_stmt_info->vinfo->add_stmt (pattern_stmt);
   gimple_set_bb (pattern_stmt, gimple_bb (orig_stmt_info->stmt));
 
-  STMT_VINFO_RELATED_STMT (pattern_stmt_info) = orig_stmt_info->stmt;
+  STMT_VINFO_RELATED_STMT (pattern_stmt_info) = orig_stmt_info;
   STMT_VINFO_DEF_TYPE (pattern_stmt_info)
     = STMT_VINFO_DEF_TYPE (orig_stmt_info);
   if (!STMT_VINFO_VECTYPE (pattern_stmt_info))
     STMT_VINFO_VECTYPE (pattern_stmt_info) = vectype;
+  return pattern_stmt_info;
 }
 
 /* Set the pattern statement of ORIG_STMT_INFO to PATTERN_STMT.
@@ -123,8 +125,8 @@  vect_set_pattern_stmt (gimple *pattern_s
 		       tree vectype)
 {
   STMT_VINFO_IN_PATTERN_P (orig_stmt_info) = true;
-  STMT_VINFO_RELATED_STMT (orig_stmt_info) = pattern_stmt;
-  vect_init_pattern_stmt (pattern_stmt, orig_stmt_info, vectype);
+  STMT_VINFO_RELATED_STMT (orig_stmt_info)
+    = vect_init_pattern_stmt (pattern_stmt, orig_stmt_info, vectype);
 }
 
 /* Add NEW_STMT to STMT_INFO's pattern definition statements.  If VECTYPE
@@ -634,8 +636,7 @@  vect_split_statement (stmt_vec_info stmt
     {
       /* STMT2_INFO is part of a pattern.  Get the statement to which
 	 the pattern is attached.  */
-      stmt_vec_info orig_stmt2_info
-	= vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt2_info));
+      stmt_vec_info orig_stmt2_info = STMT_VINFO_RELATED_STMT (stmt2_info);
       vect_init_pattern_stmt (stmt1, orig_stmt2_info, vectype);
 
       if (dump_enabled_p ())
@@ -659,7 +660,7 @@  vect_split_statement (stmt_vec_info stmt
 	}
 
       gimple_seq *def_seq = &STMT_VINFO_PATTERN_DEF_SEQ (orig_stmt2_info);
-      if (STMT_VINFO_RELATED_STMT (orig_stmt2_info) == stmt2_info->stmt)
+      if (STMT_VINFO_RELATED_STMT (orig_stmt2_info) == stmt2_info)
 	/* STMT2_INFO is the actual pattern statement.  Add STMT1
 	   to the end of the definition sequence.  */
 	gimple_seq_add_stmt_without_update (def_seq, stmt1);
@@ -4754,8 +4755,7 @@  vect_mark_pattern_stmts (gimple *orig_st
 	}
 
       /* Switch to the statement that ORIG replaces.  */
-      orig_stmt_info
-	= vinfo_for_stmt (STMT_VINFO_RELATED_STMT (orig_stmt_info));
+      orig_stmt_info = STMT_VINFO_RELATED_STMT (orig_stmt_info);
 
       /* We shouldn't be replacing the main pattern statement.  */
       gcc_assert (STMT_VINFO_RELATED_STMT (orig_stmt_info) != orig_stmt);
Index: gcc/tree-vect-slp.c
===================================================================
--- gcc/tree-vect-slp.c	2018-07-24 10:22:37.253248202 +0100
+++ gcc/tree-vect-slp.c	2018-07-24 10:22:44.293185688 +0100
@@ -2327,7 +2327,7 @@  vect_detect_hybrid_slp_stmts (slp_tree n
          original stmt for immediate uses.  */
       if (! STMT_VINFO_IN_PATTERN_P (stmt_vinfo)
 	  && STMT_VINFO_RELATED_STMT (stmt_vinfo))
-	stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo);
+	stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo)->stmt;
       tree def;
       if (gimple_code (stmt) == GIMPLE_PHI)
 	def = gimple_phi_result (stmt);
@@ -2341,7 +2341,7 @@  vect_detect_hybrid_slp_stmts (slp_tree n
 	      continue;
 	    if (STMT_VINFO_IN_PATTERN_P (use_vinfo)
 		&& STMT_VINFO_RELATED_STMT (use_vinfo))
-	      use_vinfo = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (use_vinfo));
+	      use_vinfo = STMT_VINFO_RELATED_STMT (use_vinfo);
 	    if (!STMT_SLP_TYPE (use_vinfo)
 		&& (STMT_VINFO_RELEVANT (use_vinfo)
 		    || VECTORIZABLE_CYCLE_DEF (STMT_VINFO_DEF_TYPE (use_vinfo)))
@@ -2446,7 +2446,7 @@  vect_detect_hybrid_slp (loop_vec_info lo
 	      memset (&wi, 0, sizeof (wi));
 	      wi.info = loop_vinfo;
 	      gimple_stmt_iterator gsi2
-		= gsi_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info));
+		= gsi_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info)->stmt);
 	      walk_gimple_stmt (&gsi2, vect_detect_hybrid_slp_2,
 				vect_detect_hybrid_slp_1, &wi);
 	      walk_gimple_seq (STMT_VINFO_PATTERN_DEF_SEQ (stmt_info),
@@ -3612,7 +3612,7 @@  vect_get_slp_defs (vec<tree> ops, slp_tr
 	  if (SLP_TREE_DEF_TYPE (child) == vect_internal_def)
 	    {
 	      gimple *first_def = SLP_TREE_SCALAR_STMTS (child)[0];
-	      gimple *related
+	      stmt_vec_info related
 		= STMT_VINFO_RELATED_STMT (vinfo_for_stmt (first_def));
 	      tree first_def_op;
 
@@ -3622,7 +3622,8 @@  vect_get_slp_defs (vec<tree> ops, slp_tr
 		first_def_op = gimple_get_lhs (first_def);
 	      if (operand_equal_p (oprnd, first_def_op, 0)
 		  || (related
-		      && operand_equal_p (oprnd, gimple_get_lhs (related), 0)))
+		      && operand_equal_p (oprnd,
+					  gimple_get_lhs (related->stmt), 0)))
 		{
 		  /* The number of vector defs is determined by the number of
 		     vector statements in the node from which we get those
Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c	2018-07-24 10:22:40.725217371 +0100
+++ gcc/tree-vect-stmts.c	2018-07-24 10:22:44.293185688 +0100
@@ -202,7 +202,6 @@  vect_mark_relevant (vec<gimple *> *workl
   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
   enum vect_relevant save_relevant = STMT_VINFO_RELEVANT (stmt_info);
   bool save_live_p = STMT_VINFO_LIVE_P (stmt_info);
-  gimple *pattern_stmt;
 
   if (dump_enabled_p ())
     {
@@ -222,17 +221,16 @@  vect_mark_relevant (vec<gimple *> *workl
 	 as relevant/live because it's not going to be vectorized.
 	 Instead mark the pattern-stmt that replaces it.  */
 
-      pattern_stmt = STMT_VINFO_RELATED_STMT (stmt_info);
-
       if (dump_enabled_p ())
 	dump_printf_loc (MSG_NOTE, vect_location,
 			 "last stmt in pattern. don't mark"
 			 " relevant/live.\n");
-      stmt_info = vinfo_for_stmt (pattern_stmt);
-      gcc_assert (STMT_VINFO_RELATED_STMT (stmt_info) == stmt);
+      stmt_vec_info old_stmt_info = stmt_info;
+      stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
+      gcc_assert (STMT_VINFO_RELATED_STMT (stmt_info) == old_stmt_info);
       save_relevant = STMT_VINFO_RELEVANT (stmt_info);
       save_live_p = STMT_VINFO_LIVE_P (stmt_info);
-      stmt = pattern_stmt;
+      stmt = stmt_info->stmt;
     }
 
   STMT_VINFO_LIVE_P (stmt_info) |= live_p;
@@ -1489,8 +1487,8 @@  vect_get_vec_def_for_operand_1 (gimple *
         if (!vec_stmt
             && STMT_VINFO_IN_PATTERN_P (def_stmt_info)
             && !STMT_VINFO_RELEVANT (def_stmt_info))
-          vec_stmt = STMT_VINFO_VEC_STMT (vinfo_for_stmt (
-                       STMT_VINFO_RELATED_STMT (def_stmt_info)));
+	  vec_stmt = (STMT_VINFO_VEC_STMT
+		      (STMT_VINFO_RELATED_STMT (def_stmt_info)));
         gcc_assert (vec_stmt);
 	if (gimple_code (vec_stmt) == GIMPLE_PHI)
 	  vec_oprnd = PHI_RESULT (vec_stmt);
@@ -3635,7 +3633,7 @@  vectorizable_call (gimple *gs, gimple_st
     return true;
 
   if (is_pattern_stmt_p (stmt_info))
-    stmt_info = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info));
+    stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
   lhs = gimple_get_lhs (stmt_info->stmt);
 
   gassign *new_stmt
@@ -4370,7 +4368,7 @@  vectorizable_simd_clone_call (gimple *st
     {
       type = TREE_TYPE (scalar_dest);
       if (is_pattern_stmt_p (stmt_info))
-	lhs = gimple_call_lhs (STMT_VINFO_RELATED_STMT (stmt_info));
+	lhs = gimple_call_lhs (STMT_VINFO_RELATED_STMT (stmt_info)->stmt);
       else
 	lhs = gimple_call_lhs (stmt);
       new_stmt = gimple_build_assign (lhs, build_zero_cst (type));
@@ -9420,7 +9418,6 @@  vect_analyze_stmt (gimple *stmt, bool *n
   bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
   enum vect_relevant relevance = STMT_VINFO_RELEVANT (stmt_info);
   bool ok;
-  gimple *pattern_stmt;
   gimple_seq pattern_def_seq;
 
   if (dump_enabled_p ())
@@ -9482,18 +9479,18 @@  vect_analyze_stmt (gimple *stmt, bool *n
      traversal, don't analyze pattern stmts instead, the pattern stmts
      already will be part of SLP instance.  */
 
-  pattern_stmt = STMT_VINFO_RELATED_STMT (stmt_info);
+  stmt_vec_info pattern_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
   if (!STMT_VINFO_RELEVANT_P (stmt_info)
       && !STMT_VINFO_LIVE_P (stmt_info))
     {
       if (STMT_VINFO_IN_PATTERN_P (stmt_info)
-          && pattern_stmt
-          && (STMT_VINFO_RELEVANT_P (vinfo_for_stmt (pattern_stmt))
-              || STMT_VINFO_LIVE_P (vinfo_for_stmt (pattern_stmt))))
+	  && pattern_stmt_info
+	  && (STMT_VINFO_RELEVANT_P (pattern_stmt_info)
+	      || STMT_VINFO_LIVE_P (pattern_stmt_info)))
         {
           /* Analyze PATTERN_STMT instead of the original stmt.  */
-          stmt = pattern_stmt;
-          stmt_info = vinfo_for_stmt (pattern_stmt);
+	  stmt = pattern_stmt_info->stmt;
+	  stmt_info = pattern_stmt_info;
           if (dump_enabled_p ())
             {
               dump_printf_loc (MSG_NOTE, vect_location,
@@ -9511,9 +9508,9 @@  vect_analyze_stmt (gimple *stmt, bool *n
     }
   else if (STMT_VINFO_IN_PATTERN_P (stmt_info)
 	   && node == NULL
-           && pattern_stmt
-           && (STMT_VINFO_RELEVANT_P (vinfo_for_stmt (pattern_stmt))
-               || STMT_VINFO_LIVE_P (vinfo_for_stmt (pattern_stmt))))
+	   && pattern_stmt_info
+	   && (STMT_VINFO_RELEVANT_P (pattern_stmt_info)
+	       || STMT_VINFO_LIVE_P (pattern_stmt_info)))
     {
       /* Analyze PATTERN_STMT too.  */
       if (dump_enabled_p ())
@@ -9523,7 +9520,7 @@  vect_analyze_stmt (gimple *stmt, bool *n
           dump_gimple_stmt (MSG_NOTE, TDF_SLIM, stmt, 0);
         }
 
-      if (!vect_analyze_stmt (pattern_stmt, need_to_vectorize, node,
+      if (!vect_analyze_stmt (pattern_stmt_info, need_to_vectorize, node,
 			      node_instance, cost_vec))
         return false;
    }
@@ -9855,7 +9852,6 @@  new_stmt_vec_info (gimple *stmt, vec_inf
   STMT_VINFO_VEC_STMT (res) = NULL;
   STMT_VINFO_VECTORIZABLE (res) = true;
   STMT_VINFO_IN_PATTERN_P (res) = false;
-  STMT_VINFO_RELATED_STMT (res) = NULL;
   STMT_VINFO_PATTERN_DEF_SEQ (res) = NULL;
   STMT_VINFO_DATA_REF (res) = NULL;
   STMT_VINFO_VEC_REDUCTION_TYPE (res) = TREE_CODE_REDUCTION;
@@ -9936,16 +9932,14 @@  free_stmt_vec_info (gimple *stmt)
 	      release_ssa_name (lhs);
 	    free_stmt_vec_info (seq_stmt);
 	  }
-      stmt_vec_info patt_info
-	= vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info));
-      if (patt_info)
-	{
-	  gimple *patt_stmt = STMT_VINFO_STMT (patt_info);
-	  gimple_set_bb (patt_stmt, NULL);
-	  tree lhs = gimple_get_lhs (patt_stmt);
+      stmt_vec_info patt_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
+      if (patt_stmt_info)
+	{
+	  gimple_set_bb (patt_stmt_info->stmt, NULL);
+	  tree lhs = gimple_get_lhs (patt_stmt_info->stmt);
 	  if (lhs && TREE_CODE (lhs) == SSA_NAME)
 	    release_ssa_name (lhs);
-	  free_stmt_vec_info (patt_stmt);
+	  free_stmt_vec_info (patt_stmt_info);
 	}
     }
 
@@ -10143,8 +10137,8 @@  vect_is_simple_use (tree operand, vec_in
 	{
 	  if (STMT_VINFO_IN_PATTERN_P (stmt_vinfo))
 	    {
-	      def_stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo);
-	      stmt_vinfo = vinfo_for_stmt (def_stmt);
+	      stmt_vinfo = STMT_VINFO_RELATED_STMT (stmt_vinfo);
+	      def_stmt = stmt_vinfo->stmt;
 	    }
 	  switch (gimple_code (def_stmt))
 	    {