From c0c57246d5b47459bdb488734bc2c004a92668b5 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 11 Mar 2024 14:58:57 +0100 Subject: [PATCH] tree-optimization/114297 - SLP reduction with early break fix The following makes sure to pass in the SLP node for the live stmts we are generating the reduction epilogue for to vect_create_epilog_for_reduction. This follows the previous fix for the non-SLP path. PR tree-optimization/114297 * tree-vect-loop.cc (vectorizable_live_operation): Pass in the live stmts SLP node to vect_create_epilog_for_reduction. * gcc.dg/vect/vect-early-break_123-pr114297.c: New testcase. --- .../vect/vect-early-break_123-pr114297.c | 22 +++++++++++++++++++ gcc/tree-vect-loop.cc | 7 +++--- 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_123-pr114297.c diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_123-pr114297.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_123-pr114297.c new file mode 100644 index 000000000000..84487b7903bc --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_123-pr114297.c @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-add-options vect_early_break } */ +/* { dg-require-effective-target vect_early_break } */ + +void h() __attribute__((__noreturn__)); +struct Extremes { + int w; + int h; +}; +struct Extremes *array; +int f(int num, int size1) +{ + int sw = 0, sh = 0; + for (int i = 0; i < size1; ++i) + { + if (num - i == 0) + h(); + sw += array[i].w; + sh += array[i].h; + } + return (sw) + (sh); +} diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index 20ee0aad9326..4375ebdcb493 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -10729,17 +10729,18 @@ vectorizable_live_operation (vec_info *vinfo, stmt_vec_info stmt_info, block, but we have to find an alternate exit first. */ if (LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) { + slp_tree phis_node = slp_node ? slp_node_instance->reduc_phis : NULL; for (auto exit : get_loop_exit_edges (LOOP_VINFO_LOOP (loop_vinfo))) if (exit != LOOP_VINFO_IV_EXIT (loop_vinfo)) { vect_create_epilog_for_reduction (loop_vinfo, reduc_info, - slp_node, slp_node_instance, + phis_node, slp_node_instance, exit); break; } if (LOOP_VINFO_EARLY_BREAKS_VECT_PEELED (loop_vinfo)) - vect_create_epilog_for_reduction (loop_vinfo, reduc_info, slp_node, - slp_node_instance, + vect_create_epilog_for_reduction (loop_vinfo, reduc_info, + phis_node, slp_node_instance, LOOP_VINFO_IV_EXIT (loop_vinfo)); } -- 2.43.5