diff options
author | Richard Biener <rguenther@suse.de> | 2024-02-12 10:40:42 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2024-02-12 11:52:29 +0100 |
commit | 1e3f78dbb328a2f2db8def241372cb947d9cb7eb (patch) | |
tree | d213762df31ed577848035d1a1bfc282040d2544 /gcc/tree-vect-loop.cc | |
parent | cc136a0bdcf096ca7d38b080a52fc9c041aa36db (diff) | |
download | gcc-1e3f78dbb328a2f2db8def241372cb947d9cb7eb.zip gcc-1e3f78dbb328a2f2db8def241372cb947d9cb7eb.tar.gz gcc-1e3f78dbb328a2f2db8def241372cb947d9cb7eb.tar.bz2 |
tree-optimization/113863 - elide degenerate virtual PHIs when moving ee stores
This makes sure to elide degenerate virtual PHIs when moving stores
across early exits.
PR tree-optimization/113863
* tree-vect-data-refs.cc (vect_analyze_early_break_dependences):
Record crossed virtual PHIs.
* tree-vect-loop.cc (move_early_exit_stmts): Elide crossed
virtual PHIs.
* gcc.dg/vect/pr113863.c: New testcase.
Diffstat (limited to 'gcc/tree-vect-loop.cc')
-rw-r--r-- | gcc/tree-vect-loop.cc | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index eed2268..04f4b5b 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -11789,6 +11789,25 @@ move_early_exit_stmts (loop_vec_info loop_vinfo) for (gimple *stmt : LOOP_VINFO_EARLY_BRK_STORES (loop_vinfo)) { + /* We have to update crossed degenerate virtual PHIs. Simply + elide them. */ + if (gphi *vphi = dyn_cast <gphi *> (stmt)) + { + tree vdef = gimple_phi_result (vphi); + tree vuse = gimple_phi_arg_def (vphi, 0); + imm_use_iterator iter; + use_operand_p use_p; + gimple *use_stmt; + FOR_EACH_IMM_USE_STMT (use_stmt, iter, vdef) + { + FOR_EACH_IMM_USE_ON_STMT (use_p, iter) + SET_USE (use_p, vuse); + } + auto gsi = gsi_for_stmt (stmt); + remove_phi_node (&gsi, true); + continue; + } + /* Check to see if statement is still required for vect or has been elided. */ auto stmt_info = loop_vinfo->lookup_stmt (stmt); |