diff options
author | Richard Biener <rguenther@suse.de> | 2022-07-04 12:36:05 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2022-07-04 12:41:41 +0200 |
commit | 10b502fb78351a4073b6682c026a92c82d3da6c5 (patch) | |
tree | 568b211740e1fc1ce5e6e4b3f9ee6ce7aedbf323 /gcc | |
parent | 88b9d090aa1686ba52ce6016aeed66464fb0d4bb (diff) | |
download | gcc-10b502fb78351a4073b6682c026a92c82d3da6c5.zip gcc-10b502fb78351a4073b6682c026a92c82d3da6c5.tar.gz gcc-10b502fb78351a4073b6682c026a92c82d3da6c5.tar.bz2 |
Keep virtual SSA up-to-date in vectorizer
The following removes a FIXME where we fail(ed) to keep virtual
SSA up-to-date, patching up the remaining two cases I managed to
trigger. I've left an assert so that we pick up cases arising
for the cases I wasn't able to trigger.
2022-07-04 Richard Biener <rguenther@suse.de>
* tree-vect-loop-manip.cc (vect_do_peeling): Assert that
no SSA update is needed instead of updating virtual SSA
form.
* tree-vect-stmts.cc (vectorizable_load): For hoisted
invariant load use the loop entry virtual use.
For emulated gather loads use the virtual use of the
original stmt like vect_finish_stmt_generation would do.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/tree-vect-loop-manip.cc | 11 | ||||
-rw-r--r-- | gcc/tree-vect-stmts.cc | 15 |
2 files changed, 16 insertions, 10 deletions
diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc index 47c4fe8..7b7af94 100644 --- a/gcc/tree-vect-loop-manip.cc +++ b/gcc/tree-vect-loop-manip.cc @@ -2683,14 +2683,11 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, class loop *first_loop = loop; bool irred_flag = loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP; - /* We might have a queued need to update virtual SSA form. As we - delete the update SSA machinery below after doing a regular + /* Historically we might have a queued need to update virtual SSA form. + As we delete the update SSA machinery below after doing a regular incremental SSA update during loop copying make sure we don't - lose that fact. - ??? Needing to update virtual SSA form by renaming is unfortunate - but not all of the vectorizer code inserting new loads / stores - properly assigns virtual operands to those statements. */ - update_ssa (TODO_update_ssa_only_virtuals); + lose that fact. */ + gcc_assert (!need_ssa_update_p (cfun)); create_lcssa_for_virtual_phi (loop); diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index 346d8ce..d6a6fe3 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -9024,9 +9024,16 @@ vectorizable_load (vec_info *vinfo, "hoisting out of the vectorized loop: %G", stmt); scalar_dest = copy_ssa_name (scalar_dest); tree rhs = unshare_expr (gimple_assign_rhs1 (stmt)); - gsi_insert_on_edge_immediate - (loop_preheader_edge (loop), - gimple_build_assign (scalar_dest, rhs)); + edge pe = loop_preheader_edge (loop); + gphi *vphi = get_virtual_phi (loop->header); + tree vuse; + if (vphi) + vuse = PHI_ARG_DEF_FROM_EDGE (vphi, pe); + else + vuse = gimple_vuse (gsi_stmt (*gsi)); + gimple *new_stmt = gimple_build_assign (scalar_dest, rhs); + gimple_set_vuse (new_stmt, vuse); + gsi_insert_on_edge_immediate (pe, new_stmt); } /* These copies are all equivalent, but currently the representation requires a separate STMT_VINFO_VEC_STMT for each one. */ @@ -9769,6 +9776,8 @@ vectorizable_load (vec_info *vinfo, tree ref = build2 (MEM_REF, ltype, ptr, build_int_cst (ref_type, 0)); new_stmt = gimple_build_assign (elt, ref); + gimple_set_vuse (new_stmt, + gimple_vuse (gsi_stmt (*gsi))); gimple_seq_add_stmt (&stmts, new_stmt); CONSTRUCTOR_APPEND_ELT (ctor_elts, NULL_TREE, elt); } |