This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR81249


Bootstrap and regtest running on x86_64-unknown-linux-gnu.

Richard.

2017-06-29  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/81249
	* tree-vect-loop.c (vect_create_epilog_for_reduction): Convert
	condition reduction result to original scalar type.

	* g++.dg/torture/pr81249.C: New testcase.

Index: gcc/tree-vect-loop.c
===================================================================
--- gcc/tree-vect-loop.c	(revision 249780)
+++ gcc/tree-vect-loop.c	(working copy)
@@ -4833,12 +4858,9 @@ vect_create_epilog_for_reduction (vec<tr
 
       /* Convert the reduced value back to the result type and set as the
 	 result.  */
-      tree data_reduc_cast = build1 (VIEW_CONVERT_EXPR, scalar_type,
-				     data_reduc);
-      epilog_stmt = gimple_build_assign (new_scalar_dest, data_reduc_cast);
-      new_temp = make_ssa_name (new_scalar_dest, epilog_stmt);
-      gimple_assign_set_lhs (epilog_stmt, new_temp);
-      gsi_insert_before (&exit_gsi, epilog_stmt, GSI_SAME_STMT);
+      gimple_seq stmts = NULL;
+      new_temp = gimple_convert (&stmts, scalar_type, data_reduc);
+      gsi_insert_seq_before (&exit_gsi, stmts, GSI_SAME_STMT);
       scalar_results.safe_push (new_temp);
     }
   else if (STMT_VINFO_VEC_REDUCTION_TYPE (stmt_info) == COND_REDUCTION
@@ -4903,6 +4925,11 @@ vect_create_epilog_for_reduction (vec<tr
 	      val = new_val;
 	    }
 	}
+      /* Convert the reduced value back to the result type and set as the
+	 result.  */
+      gimple_seq stmts = NULL;
+      val = gimple_convert (&stmts, scalar_type, val);
+      gsi_insert_seq_before (&exit_gsi, stmts, GSI_SAME_STMT);
       scalar_results.safe_push (val);
     }
 

Index: gcc/testsuite/g++.dg/torture/pr81249.C
===================================================================
--- gcc/testsuite/g++.dg/torture/pr81249.C	(nonexistent)
+++ gcc/testsuite/g++.dg/torture/pr81249.C	(working copy)
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-mavx2 -mprefer-avx128" { target x86_64-*-* i?86-*-* } } */
+
+typedef struct rtx_def *rtx;
+union rtunion {
+    rtx rt_rtx;
+};
+struct rtx_def {
+    struct {
+	rtunion fld[0];
+    } u;
+    rtx elem[];
+} a;
+int b, c, d;
+rtx e;
+int main() {
+    for (;;) {
+	d = 0;
+	for (; d < b; d++)
+	  if (a.elem[d])
+	    e = a.elem[d]->u.fld[1].rt_rtx;
+	if (e)
+	  c = 0;
+    }
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]