The usual vectoriser dance to create new assignments is:

    new_stmt = gimple_build_assign (vec_dest, ...);
    new_temp = make_ssa_name (vec_dest, new_stmt);
    gimple_assign_set_lhs (new_stmt, new_temp);

but one site in vectorizable_reduction used:

    new_temp = make_ssa_name (vec_dest, new_stmt);

before creating new_stmt.

This method of creating statements probably needs cleaning up, but
that's for another day...


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

gcc/
        * tree-vect-loop.c (vectorizable_reduction): Fix an instance in
        which make_ssa_name was called with new_stmt before new_stmt
        had been created.

Index: gcc/tree-vect-loop.c
===================================================================
--- gcc/tree-vect-loop.c        2018-07-24 10:22:12.737465897 +0100
+++ gcc/tree-vect-loop.c        2018-07-24 10:22:16.421433184 +0100
@@ -7210,9 +7210,10 @@ vectorizable_reduction (gimple *stmt, gi
              if (op_type == ternary_op)
                vop[2] = vec_oprnds2[i];
 
-             new_temp = make_ssa_name (vec_dest, new_stmt);
-             new_stmt = gimple_build_assign (new_temp, code,
+             new_stmt = gimple_build_assign (vec_dest, code,
                                              vop[0], vop[1], vop[2]);
+             new_temp = make_ssa_name (vec_dest, new_stmt);
+             gimple_assign_set_lhs (new_stmt, new_temp);
            }
          vect_finish_stmt_generation (stmt, new_stmt, gsi);
 

Reply via email to