tree-optimization/113374 - early break vect and virtual operands
commit0f38666680d6ad0e40c4a8b6d94b2c93931cdf42
authorRichard Biener <rguenther@suse.de>
Wed, 17 Jan 2024 12:24:22 +0000 (17 13:24 +0100)
committerRichard Biener <rguenther@suse.de>
Thu, 18 Jan 2024 07:31:41 +0000 (18 08:31 +0100)
treeeac6ba0021cd99a85bf208b2b9ecc3943a2fc930
parentcc34fc9ffde60815b6571a60129199ddc5a07ca2
tree-optimization/113374 - early break vect and virtual operands

The following fixes wrong virtual operands being used for peeled
early breaks where we can have different live ones and for multiple
exits it makes sure to update the correct PHI arguments.

I've introduced SET_PHI_ARG_DEF_ON_EDGE so we can avoid using
a wrong edge to compute the PHI arg index from.

I've took the liberty to understand the code again and refactor
and comment it a bit differently.  The main functional change
is that we preserve the live virtual operand on all exits.

PR tree-optimization/113374
* tree-ssa-operands.h (SET_PHI_ARG_DEF_ON_EDGE): New.
* tree-vect-loop.cc (move_early_exit_stmts): Update
virtual LC PHIs.
* tree-vect-loop-manip.cc (slpeel_tree_duplicate_loop_to_edge_cfg):
Refactor.  Preserve virtual LC PHIs on all exits.

* gcc.dg/vect/vect-early-break_106-pr113374.c: New testcase.
gcc/testsuite/gcc.dg/vect/vect-early-break_106-pr113374.c [new file with mode: 0644]
gcc/tree-ssa-operands.h
gcc/tree-vect-loop-manip.cc
gcc/tree-vect-loop.cc