re PR target/92473 (test pr92324-2.c fails on arm and aarch64)
authorRichard Biener <rguenther@suse.de>
Wed, 13 Nov 2019 08:04:31 +0000 (08:04 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 13 Nov 2019 08:04:31 +0000 (08:04 +0000)
2019-11-13  Richard Biener  <rguenther@suse.de>

PR tree-optimization/92473
* tree-vect-loop.c (vect_create_epilog_for_reduction): Perform
direct optab reduction in the correct type.

From-SVN: r278113

gcc/ChangeLog
gcc/tree-vect-loop.c

index e8ebbecf1b16b1796c2a3fa6c51ba7c750c8ab84..968c2733e2b6647e251559cd4b41ed8dd9c83a34 100644 (file)
@@ -1,3 +1,9 @@
+2019-11-13  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/92473
+       * tree-vect-loop.c (vect_create_epilog_for_reduction): Perform
+       direct optab reduction in the correct type.
+
 2019-11-12  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * config/rs6000/rs6000.md (rs6000_set_fpscr_drn): Use ULL on big
index 29770db45452ba10f19d235b5b7ac8388f7ac9f6..d9f413430dc1e41b34e0c9ff68b42763ede575e9 100644 (file)
@@ -4739,31 +4739,13 @@ vect_create_epilog_for_reduction (stmt_vec_info stmt_info,
         dump_printf_loc (MSG_NOTE, vect_location,
                         "Reduce using direct vector reduction.\n");
 
+      gimple_seq stmts = NULL;
+      new_phi_result = gimple_convert (&stmts, vectype, new_phi_result);
       vec_elem_type = TREE_TYPE (TREE_TYPE (new_phi_result));
-      if (!useless_type_conversion_p (scalar_type, vec_elem_type))
-       {
-         tree tmp_dest
-           = vect_create_destination_var (scalar_dest, vec_elem_type);
-         epilog_stmt = gimple_build_call_internal (reduc_fn, 1,
-                                                   new_phi_result);
-         gimple_set_lhs (epilog_stmt, tmp_dest);
-         new_temp = make_ssa_name (tmp_dest, epilog_stmt);
-         gimple_set_lhs (epilog_stmt, new_temp);
-         gsi_insert_before (&exit_gsi, epilog_stmt, GSI_SAME_STMT);
-
-         epilog_stmt = gimple_build_assign (new_scalar_dest, NOP_EXPR,
-                                            new_temp);
-       }
-      else
-       {
-         epilog_stmt = gimple_build_call_internal (reduc_fn, 1,
-                                                   new_phi_result);
-         gimple_set_lhs (epilog_stmt, new_scalar_dest);
-       }
-
-      new_temp = make_ssa_name (new_scalar_dest, epilog_stmt);
-      gimple_set_lhs (epilog_stmt, new_temp);
-      gsi_insert_before (&exit_gsi, epilog_stmt, GSI_SAME_STMT);
+      new_temp = gimple_build (&stmts, as_combined_fn (reduc_fn),
+                              vec_elem_type, new_phi_result);
+      new_temp = gimple_convert (&stmts, scalar_type, new_temp);
+      gsi_insert_seq_before (&exit_gsi, stmts, GSI_SAME_STMT);
 
       if ((STMT_VINFO_REDUC_TYPE (reduc_info) == INTEGER_INDUC_COND_REDUCTION)
          && induc_val)