aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-loop-manip.cc
diff options
context:
space:
mode:
authorTamar Christina <tamar.christina@arm.com>2024-01-12 15:25:58 +0000
committerTamar Christina <tamar.christina@arm.com>2024-01-12 15:31:11 +0000
commit99c0a540d6689ede068f9ba98af6f38c3cd71362 (patch)
treedbce41ec0c624724aef74811a8f4e4cc40ff8443 /gcc/tree-vect-loop-manip.cc
parent411de96dbf2bdafc7a90ebbfc63e68afd6388d29 (diff)
downloadgcc-99c0a540d6689ede068f9ba98af6f38c3cd71362.zip
gcc-99c0a540d6689ede068f9ba98af6f38c3cd71362.tar.gz
gcc-99c0a540d6689ede068f9ba98af6f38c3cd71362.tar.bz2
middle-end: thread through existing LCSSA variable for alternative exits too [PR113237]
Builing on top of the previous patch, similar to when we have a single exit if we have a case where all exits are considered early exits and there are existing non virtual phi then in order to maintain LCSSA we have to use the existing PHI variables. We can't simply clear them and just rebuild them because the order of the PHIs in the main exit must match the original exit for when we add the skip_epilog guard. But the infrastructure is already in place to maintain them, we just have to use the right value. gcc/ChangeLog: PR tree-optimization/113237 * tree-vect-loop-manip.cc (slpeel_tree_duplicate_loop_to_edge_cfg): Use existing LCSSA variable for exit when all exits are early break. gcc/testsuite/ChangeLog: PR tree-optimization/113237 * gcc.dg/vect/vect-early-break_98-pr113237.c: New test.
Diffstat (limited to 'gcc/tree-vect-loop-manip.cc')
-rw-r--r--gcc/tree-vect-loop-manip.cc9
1 files changed, 7 insertions, 2 deletions
diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
index da64738..2a1f9cd 100644
--- a/gcc/tree-vect-loop-manip.cc
+++ b/gcc/tree-vect-loop-manip.cc
@@ -1697,10 +1697,15 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *loop, edge loop_exit,
virtual operands we have to keep the original link. Virtual
operands don't all become the same because we'll corrupt the
vUSE chains among others. */
- if (peeled_iters && !virtual_operand_p (new_arg))
+ if (peeled_iters)
{
tree tmp_arg = gimple_phi_result (from_phi);
- if (!new_phi_args.get (tmp_arg))
+ /* Similar to the single exit case, If we have an existing
+ LCSSA variable thread through the original value otherwise
+ skip it and directly use the final value. */
+ if (tree *res = new_phi_args.get (tmp_arg))
+ new_arg = *res;
+ else if (!virtual_operand_p (new_arg))
new_arg = tmp_arg;
}