diff mbox series

[2/n] PR85694: Attach a DEF_SEQ only to the original statement

Message ID 87fu1kgn95.fsf@arm.com
State New
Headers show
Series [2/n] PR85694: Attach a DEF_SEQ only to the original statement | expand

Commit Message

Richard Sandiford June 18, 2018, 2:52 p.m. UTC
A pattern's PATTERN_DEF_SEQ was attached to both the original statement
and the main pattern statement, which made it harder to update later.
This patch attaches it to just the original statement.  In practice,
anything that cared had ready access to both.

Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?

Richard


2018-06-18  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* tree-vect-loop.c (vect_determine_vf_for_stmt): Take the
	PATTERN_DEF_SEQ from the original statement rather than
	the main pattern statement.
	* tree-vect-stmts.c (free_stmt_vec_info): Likewise.
	* tree-vect-patterns.c (vect_recog_dot_prod_pattern): Likewise.
	(vect_mark_pattern_stmts): Don't copy the PATTERN_DEF_SEQ.

Comments

Richard Biener June 19, 2018, 10:13 a.m. UTC | #1
On Mon, Jun 18, 2018 at 4:53 PM Richard Sandiford
<richard.sandiford@arm.com> wrote:
>
> A pattern's PATTERN_DEF_SEQ was attached to both the original statement
> and the main pattern statement, which made it harder to update later.
> This patch attaches it to just the original statement.  In practice,
> anything that cared had ready access to both.
>
> Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?

OK but can you please add a sentence to the pattern_def_seq member
comment to say it's present only on the in_pattern_p stmt?

Thanks,
Richard.

> Richard
>
>
> 2018-06-18  Richard Sandiford  <richard.sandiford@arm.com>
>
> gcc/
>         * tree-vect-loop.c (vect_determine_vf_for_stmt): Take the
>         PATTERN_DEF_SEQ from the original statement rather than
>         the main pattern statement.
>         * tree-vect-stmts.c (free_stmt_vec_info): Likewise.
>         * tree-vect-patterns.c (vect_recog_dot_prod_pattern): Likewise.
>         (vect_mark_pattern_stmts): Don't copy the PATTERN_DEF_SEQ.
>
> Index: gcc/tree-vect-loop.c
> ===================================================================
> --- gcc/tree-vect-loop.c        2018-06-18 15:24:10.457472575 +0100
> +++ gcc/tree-vect-loop.c        2018-06-18 15:24:21.001379616 +0100
> @@ -224,10 +224,10 @@ vect_determine_vf_for_stmt (stmt_vec_inf
>    if (STMT_VINFO_IN_PATTERN_P (stmt_info)
>        && 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));
>
>        /* If a pattern statement has def stmts, analyze them too.  */
> -      gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info);
>        for (gimple_stmt_iterator si = gsi_start (pattern_def_seq);
>            !gsi_end_p (si); gsi_next (&si))
>         {
> @@ -2259,10 +2259,10 @@ vect_analyze_loop_2 (loop_vec_info loop_
>           STMT_SLP_TYPE (stmt_info) = loop_vect;
>           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_SLP_TYPE (stmt_info) = loop_vect;
> -             for (gimple_stmt_iterator pi
> -                    = gsi_start (STMT_VINFO_PATTERN_DEF_SEQ (stmt_info));
> +             for (gimple_stmt_iterator pi = gsi_start (pattern_def_seq);
>                    !gsi_end_p (pi); gsi_next (&pi))
>                 {
>                   gimple *pstmt = gsi_stmt (pi);
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c       2018-06-18 15:24:10.461472540 +0100
> +++ gcc/tree-vect-stmts.c       2018-06-18 15:24:21.005379580 +0100
> @@ -9892,29 +9892,26 @@ free_stmt_vec_info (gimple *stmt)
>       too.  */
>    if (STMT_VINFO_IN_PATTERN_P (stmt_info))
>      {
> +      if (gimple_seq seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info))
> +       for (gimple_stmt_iterator si = gsi_start (seq);
> +            !gsi_end_p (si); gsi_next (&si))
> +         {
> +           gimple *seq_stmt = gsi_stmt (si);
> +           gimple_set_bb (seq_stmt, NULL);
> +           tree lhs = gimple_get_lhs (seq_stmt);
> +           if (lhs && TREE_CODE (lhs) == SSA_NAME)
> +             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_seq seq = STMT_VINFO_PATTERN_DEF_SEQ (patt_info);
>           gimple *patt_stmt = STMT_VINFO_STMT (patt_info);
>           gimple_set_bb (patt_stmt, NULL);
>           tree lhs = gimple_get_lhs (patt_stmt);
>           if (lhs && TREE_CODE (lhs) == SSA_NAME)
>             release_ssa_name (lhs);
> -         if (seq)
> -           {
> -             gimple_stmt_iterator si;
> -             for (si = gsi_start (seq); !gsi_end_p (si); gsi_next (&si))
> -               {
> -                 gimple *seq_stmt = gsi_stmt (si);
> -                 gimple_set_bb (seq_stmt, NULL);
> -                 lhs = gimple_get_lhs (seq_stmt);
> -                 if (lhs && TREE_CODE (lhs) == SSA_NAME)
> -                   release_ssa_name (lhs);
> -                 free_stmt_vec_info (seq_stmt);
> -               }
> -           }
>           free_stmt_vec_info (patt_stmt);
>         }
>      }
> Index: gcc/tree-vect-patterns.c
> ===================================================================
> --- gcc/tree-vect-patterns.c    2018-06-18 15:22:36.898297310 +0100
> +++ gcc/tree-vect-patterns.c    2018-06-18 15:24:21.001379616 +0100
> @@ -405,13 +405,13 @@ vect_recog_dot_prod_pattern (vec<gimple
>        stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo);
>        if (gimple_assign_rhs_code (stmt) != WIDEN_MULT_EXPR)
>          return NULL;
> +      STMT_VINFO_PATTERN_DEF_SEQ (vinfo_for_stmt (last_stmt))
> +       = STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo);
>        stmt_vinfo = vinfo_for_stmt (stmt);
>        gcc_assert (stmt_vinfo);
>        gcc_assert (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_internal_def);
>        oprnd00 = gimple_assign_rhs1 (stmt);
>        oprnd01 = gimple_assign_rhs2 (stmt);
> -      STMT_VINFO_PATTERN_DEF_SEQ (vinfo_for_stmt (last_stmt))
> -         = STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo);
>      }
>    else
>      {
> @@ -4433,28 +4433,23 @@ vect_mark_pattern_stmts (gimple *orig_st
>    STMT_VINFO_VECTYPE (pattern_stmt_info) = pattern_vectype;
>    STMT_VINFO_IN_PATTERN_P (orig_stmt_info) = true;
>    STMT_VINFO_RELATED_STMT (orig_stmt_info) = pattern_stmt;
> -  STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info)
> -    = STMT_VINFO_PATTERN_DEF_SEQ (orig_stmt_info);
> -  if (STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info))
> -    {
> -      gimple_stmt_iterator si;
> -      for (si = gsi_start (STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info));
> -          !gsi_end_p (si); gsi_next (&si))
> -       {
> -         def_stmt = gsi_stmt (si);
> -         def_stmt_info = vinfo_for_stmt (def_stmt);
> -         if (def_stmt_info == NULL)
> -           {
> -             def_stmt_info = new_stmt_vec_info (def_stmt, vinfo);
> -             set_vinfo_for_stmt (def_stmt, def_stmt_info);
> -           }
> -         gimple_set_bb (def_stmt, gimple_bb (orig_stmt));
> -         STMT_VINFO_RELATED_STMT (def_stmt_info) = orig_stmt;
> -         STMT_VINFO_DEF_TYPE (def_stmt_info) = vect_internal_def;
> -         if (STMT_VINFO_VECTYPE (def_stmt_info) == NULL_TREE)
> -           STMT_VINFO_VECTYPE (def_stmt_info) = pattern_vectype;
> -       }
> -    }
> +  if (gimple *def_seq = STMT_VINFO_PATTERN_DEF_SEQ (orig_stmt_info))
> +    for (gimple_stmt_iterator si = gsi_start (def_seq);
> +        !gsi_end_p (si); gsi_next (&si))
> +      {
> +       def_stmt = gsi_stmt (si);
> +       def_stmt_info = vinfo_for_stmt (def_stmt);
> +       if (def_stmt_info == NULL)
> +         {
> +           def_stmt_info = new_stmt_vec_info (def_stmt, vinfo);
> +           set_vinfo_for_stmt (def_stmt, def_stmt_info);
> +         }
> +       gimple_set_bb (def_stmt, gimple_bb (orig_stmt));
> +       STMT_VINFO_RELATED_STMT (def_stmt_info) = orig_stmt;
> +       STMT_VINFO_DEF_TYPE (def_stmt_info) = vect_internal_def;
> +       if (STMT_VINFO_VECTYPE (def_stmt_info) == NULL_TREE)
> +         STMT_VINFO_VECTYPE (def_stmt_info) = pattern_vectype;
> +      }
>  }
>
>  /* Function vect_pattern_recog_1
Richard Sandiford June 20, 2018, 8:19 a.m. UTC | #2
Richard Biener <richard.guenther@gmail.com> writes:
> On Mon, Jun 18, 2018 at 4:53 PM Richard Sandiford
> <richard.sandiford@arm.com> wrote:
>>
>> A pattern's PATTERN_DEF_SEQ was attached to both the original statement
>> and the main pattern statement, which made it harder to update later.
>> This patch attaches it to just the original statement.  In practice,
>> anything that cared had ready access to both.
>>
>> Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?
>
> OK but can you please add a sentence to the pattern_def_seq member
> comment to say it's present only on the in_pattern_p stmt?

OK, here's I installed.

Thanks,
Richard


2018-06-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* tree-vectorizer.h (_stmt_vec_info): Note above pattern_def_seq
	that the sequence is attached to the original statement rather
	than the pattern statement.
	* tree-vect-loop.c (vect_determine_vf_for_stmt): Take the
	PATTERN_DEF_SEQ from the original statement rather than
	the main pattern statement.
	* tree-vect-stmts.c (free_stmt_vec_info): Likewise.
	* tree-vect-patterns.c (vect_recog_dot_prod_pattern): Likewise.
	(vect_mark_pattern_stmts): Don't copy the PATTERN_DEF_SEQ.

Index: gcc/tree-vectorizer.h
===================================================================
--- gcc/tree-vectorizer.h	2018-06-20 08:59:51.626577121 +0100
+++ gcc/tree-vectorizer.h	2018-06-20 09:00:14.658372927 +0100
@@ -796,7 +796,9 @@ typedef struct _stmt_vec_info {
         pattern).  */
   gimple *related_stmt;
 
-  /* Used to keep a sequence of def stmts of a pattern stmt if such exists.  */
+  /* 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
+     pattern statement.  */
   gimple_seq pattern_def_seq;
 
   /* List of datarefs that are known to have the same alignment as the dataref
Index: gcc/tree-vect-loop.c
===================================================================
--- gcc/tree-vect-loop.c	2018-06-20 09:00:07.902432824 +0100
+++ gcc/tree-vect-loop.c	2018-06-20 09:00:14.654372962 +0100
@@ -224,10 +224,10 @@ vect_determine_vf_for_stmt (stmt_vec_inf
   if (STMT_VINFO_IN_PATTERN_P (stmt_info)
       && 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));
 
       /* If a pattern statement has def stmts, analyze them too.  */
-      gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info);
       for (gimple_stmt_iterator si = gsi_start (pattern_def_seq);
 	   !gsi_end_p (si); gsi_next (&si))
 	{
@@ -2247,10 +2247,10 @@ vect_analyze_loop_2 (loop_vec_info loop_
 	  STMT_SLP_TYPE (stmt_info) = loop_vect;
 	  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_SLP_TYPE (stmt_info) = loop_vect;
-	      for (gimple_stmt_iterator pi
-		     = gsi_start (STMT_VINFO_PATTERN_DEF_SEQ (stmt_info));
+	      for (gimple_stmt_iterator pi = gsi_start (pattern_def_seq);
 		   !gsi_end_p (pi); gsi_next (&pi))
 		{
 		  gimple *pstmt = gsi_stmt (pi);
Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c	2018-06-20 09:00:07.902432824 +0100
+++ gcc/tree-vect-stmts.c	2018-06-20 09:00:14.654372962 +0100
@@ -9876,29 +9876,26 @@ free_stmt_vec_info (gimple *stmt)
      too.  */
   if (STMT_VINFO_IN_PATTERN_P (stmt_info))
     {
+      if (gimple_seq seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info))
+	for (gimple_stmt_iterator si = gsi_start (seq);
+	     !gsi_end_p (si); gsi_next (&si))
+	  {
+	    gimple *seq_stmt = gsi_stmt (si);
+	    gimple_set_bb (seq_stmt, NULL);
+	    tree lhs = gimple_get_lhs (seq_stmt);
+	    if (lhs && TREE_CODE (lhs) == SSA_NAME)
+	      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_seq seq = STMT_VINFO_PATTERN_DEF_SEQ (patt_info);
 	  gimple *patt_stmt = STMT_VINFO_STMT (patt_info);
 	  gimple_set_bb (patt_stmt, NULL);
 	  tree lhs = gimple_get_lhs (patt_stmt);
 	  if (lhs && TREE_CODE (lhs) == SSA_NAME)
 	    release_ssa_name (lhs);
-	  if (seq)
-	    {
-	      gimple_stmt_iterator si;
-	      for (si = gsi_start (seq); !gsi_end_p (si); gsi_next (&si))
-		{
-		  gimple *seq_stmt = gsi_stmt (si);
-		  gimple_set_bb (seq_stmt, NULL);
-		  lhs = gimple_get_lhs (seq_stmt);
-		  if (lhs && TREE_CODE (lhs) == SSA_NAME)
-		    release_ssa_name (lhs);
-		  free_stmt_vec_info (seq_stmt);
-		}
-	    }
 	  free_stmt_vec_info (patt_stmt);
 	}
     }
Index: gcc/tree-vect-patterns.c
===================================================================
--- gcc/tree-vect-patterns.c	2018-06-20 08:59:51.738576128 +0100
+++ gcc/tree-vect-patterns.c	2018-06-20 09:00:14.654372962 +0100
@@ -405,13 +405,13 @@ vect_recog_dot_prod_pattern (vec<gimple
       stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo);
       if (gimple_assign_rhs_code (stmt) != WIDEN_MULT_EXPR)
         return NULL;
+      STMT_VINFO_PATTERN_DEF_SEQ (vinfo_for_stmt (last_stmt))
+	= STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo);
       stmt_vinfo = vinfo_for_stmt (stmt);
       gcc_assert (stmt_vinfo);
       gcc_assert (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_internal_def);
       oprnd00 = gimple_assign_rhs1 (stmt);
       oprnd01 = gimple_assign_rhs2 (stmt);
-      STMT_VINFO_PATTERN_DEF_SEQ (vinfo_for_stmt (last_stmt))
-	  = STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo);
     }
   else
     {
@@ -4433,28 +4433,23 @@ vect_mark_pattern_stmts (gimple *orig_st
   STMT_VINFO_VECTYPE (pattern_stmt_info) = pattern_vectype;
   STMT_VINFO_IN_PATTERN_P (orig_stmt_info) = true;
   STMT_VINFO_RELATED_STMT (orig_stmt_info) = pattern_stmt;
-  STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info)
-    = STMT_VINFO_PATTERN_DEF_SEQ (orig_stmt_info);
-  if (STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info))
-    {
-      gimple_stmt_iterator si;
-      for (si = gsi_start (STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info));
-	   !gsi_end_p (si); gsi_next (&si))
-	{
-	  def_stmt = gsi_stmt (si);
-	  def_stmt_info = vinfo_for_stmt (def_stmt);
-	  if (def_stmt_info == NULL)
-	    {
-	      def_stmt_info = new_stmt_vec_info (def_stmt, vinfo);
-	      set_vinfo_for_stmt (def_stmt, def_stmt_info);
-	    }
-	  gimple_set_bb (def_stmt, gimple_bb (orig_stmt));
-	  STMT_VINFO_RELATED_STMT (def_stmt_info) = orig_stmt;
-	  STMT_VINFO_DEF_TYPE (def_stmt_info) = vect_internal_def;
-	  if (STMT_VINFO_VECTYPE (def_stmt_info) == NULL_TREE)
-	    STMT_VINFO_VECTYPE (def_stmt_info) = pattern_vectype;
-	}
-    }
+  if (gimple *def_seq = STMT_VINFO_PATTERN_DEF_SEQ (orig_stmt_info))
+    for (gimple_stmt_iterator si = gsi_start (def_seq);
+	 !gsi_end_p (si); gsi_next (&si))
+      {
+	def_stmt = gsi_stmt (si);
+	def_stmt_info = vinfo_for_stmt (def_stmt);
+	if (def_stmt_info == NULL)
+	  {
+	    def_stmt_info = new_stmt_vec_info (def_stmt, vinfo);
+	    set_vinfo_for_stmt (def_stmt, def_stmt_info);
+	  }
+	gimple_set_bb (def_stmt, gimple_bb (orig_stmt));
+	STMT_VINFO_RELATED_STMT (def_stmt_info) = orig_stmt;
+	STMT_VINFO_DEF_TYPE (def_stmt_info) = vect_internal_def;
+	if (STMT_VINFO_VECTYPE (def_stmt_info) == NULL_TREE)
+	  STMT_VINFO_VECTYPE (def_stmt_info) = pattern_vectype;
+      }
 }
 
 /* Function vect_pattern_recog_1
diff mbox series

Patch

Index: gcc/tree-vect-loop.c
===================================================================
--- gcc/tree-vect-loop.c	2018-06-18 15:24:10.457472575 +0100
+++ gcc/tree-vect-loop.c	2018-06-18 15:24:21.001379616 +0100
@@ -224,10 +224,10 @@  vect_determine_vf_for_stmt (stmt_vec_inf
   if (STMT_VINFO_IN_PATTERN_P (stmt_info)
       && 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));
 
       /* If a pattern statement has def stmts, analyze them too.  */
-      gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info);
       for (gimple_stmt_iterator si = gsi_start (pattern_def_seq);
 	   !gsi_end_p (si); gsi_next (&si))
 	{
@@ -2259,10 +2259,10 @@  vect_analyze_loop_2 (loop_vec_info loop_
 	  STMT_SLP_TYPE (stmt_info) = loop_vect;
 	  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_SLP_TYPE (stmt_info) = loop_vect;
-	      for (gimple_stmt_iterator pi
-		     = gsi_start (STMT_VINFO_PATTERN_DEF_SEQ (stmt_info));
+	      for (gimple_stmt_iterator pi = gsi_start (pattern_def_seq);
 		   !gsi_end_p (pi); gsi_next (&pi))
 		{
 		  gimple *pstmt = gsi_stmt (pi);
Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c	2018-06-18 15:24:10.461472540 +0100
+++ gcc/tree-vect-stmts.c	2018-06-18 15:24:21.005379580 +0100
@@ -9892,29 +9892,26 @@  free_stmt_vec_info (gimple *stmt)
      too.  */
   if (STMT_VINFO_IN_PATTERN_P (stmt_info))
     {
+      if (gimple_seq seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info))
+	for (gimple_stmt_iterator si = gsi_start (seq);
+	     !gsi_end_p (si); gsi_next (&si))
+	  {
+	    gimple *seq_stmt = gsi_stmt (si);
+	    gimple_set_bb (seq_stmt, NULL);
+	    tree lhs = gimple_get_lhs (seq_stmt);
+	    if (lhs && TREE_CODE (lhs) == SSA_NAME)
+	      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_seq seq = STMT_VINFO_PATTERN_DEF_SEQ (patt_info);
 	  gimple *patt_stmt = STMT_VINFO_STMT (patt_info);
 	  gimple_set_bb (patt_stmt, NULL);
 	  tree lhs = gimple_get_lhs (patt_stmt);
 	  if (lhs && TREE_CODE (lhs) == SSA_NAME)
 	    release_ssa_name (lhs);
-	  if (seq)
-	    {
-	      gimple_stmt_iterator si;
-	      for (si = gsi_start (seq); !gsi_end_p (si); gsi_next (&si))
-		{
-		  gimple *seq_stmt = gsi_stmt (si);
-		  gimple_set_bb (seq_stmt, NULL);
-		  lhs = gimple_get_lhs (seq_stmt);
-		  if (lhs && TREE_CODE (lhs) == SSA_NAME)
-		    release_ssa_name (lhs);
-		  free_stmt_vec_info (seq_stmt);
-		}
-	    }
 	  free_stmt_vec_info (patt_stmt);
 	}
     }
Index: gcc/tree-vect-patterns.c
===================================================================
--- gcc/tree-vect-patterns.c	2018-06-18 15:22:36.898297310 +0100
+++ gcc/tree-vect-patterns.c	2018-06-18 15:24:21.001379616 +0100
@@ -405,13 +405,13 @@  vect_recog_dot_prod_pattern (vec<gimple
       stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo);
       if (gimple_assign_rhs_code (stmt) != WIDEN_MULT_EXPR)
         return NULL;
+      STMT_VINFO_PATTERN_DEF_SEQ (vinfo_for_stmt (last_stmt))
+	= STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo);
       stmt_vinfo = vinfo_for_stmt (stmt);
       gcc_assert (stmt_vinfo);
       gcc_assert (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_internal_def);
       oprnd00 = gimple_assign_rhs1 (stmt);
       oprnd01 = gimple_assign_rhs2 (stmt);
-      STMT_VINFO_PATTERN_DEF_SEQ (vinfo_for_stmt (last_stmt))
-	  = STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo);
     }
   else
     {
@@ -4433,28 +4433,23 @@  vect_mark_pattern_stmts (gimple *orig_st
   STMT_VINFO_VECTYPE (pattern_stmt_info) = pattern_vectype;
   STMT_VINFO_IN_PATTERN_P (orig_stmt_info) = true;
   STMT_VINFO_RELATED_STMT (orig_stmt_info) = pattern_stmt;
-  STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info)
-    = STMT_VINFO_PATTERN_DEF_SEQ (orig_stmt_info);
-  if (STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info))
-    {
-      gimple_stmt_iterator si;
-      for (si = gsi_start (STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info));
-	   !gsi_end_p (si); gsi_next (&si))
-	{
-	  def_stmt = gsi_stmt (si);
-	  def_stmt_info = vinfo_for_stmt (def_stmt);
-	  if (def_stmt_info == NULL)
-	    {
-	      def_stmt_info = new_stmt_vec_info (def_stmt, vinfo);
-	      set_vinfo_for_stmt (def_stmt, def_stmt_info);
-	    }
-	  gimple_set_bb (def_stmt, gimple_bb (orig_stmt));
-	  STMT_VINFO_RELATED_STMT (def_stmt_info) = orig_stmt;
-	  STMT_VINFO_DEF_TYPE (def_stmt_info) = vect_internal_def;
-	  if (STMT_VINFO_VECTYPE (def_stmt_info) == NULL_TREE)
-	    STMT_VINFO_VECTYPE (def_stmt_info) = pattern_vectype;
-	}
-    }
+  if (gimple *def_seq = STMT_VINFO_PATTERN_DEF_SEQ (orig_stmt_info))
+    for (gimple_stmt_iterator si = gsi_start (def_seq);
+	 !gsi_end_p (si); gsi_next (&si))
+      {
+	def_stmt = gsi_stmt (si);
+	def_stmt_info = vinfo_for_stmt (def_stmt);
+	if (def_stmt_info == NULL)
+	  {
+	    def_stmt_info = new_stmt_vec_info (def_stmt, vinfo);
+	    set_vinfo_for_stmt (def_stmt, def_stmt_info);
+	  }
+	gimple_set_bb (def_stmt, gimple_bb (orig_stmt));
+	STMT_VINFO_RELATED_STMT (def_stmt_info) = orig_stmt;
+	STMT_VINFO_DEF_TYPE (def_stmt_info) = vect_internal_def;
+	if (STMT_VINFO_VECTYPE (def_stmt_info) == NULL_TREE)
+	  STMT_VINFO_VECTYPE (def_stmt_info) = pattern_vectype;
+      }
 }
 
 /* Function vect_pattern_recog_1