aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-11-04 13:03:33 +0100
committerRichard Biener <rguenth@gcc.gnu.org>2024-11-07 13:49:08 +0100
commit76048bd0693e30a5abc67aa6dcce9f4973ea208e (patch)
treeb085c6128cf5f2078a6fe7588c9c9e1b52205a8f /gcc
parent0dadf022de293c202ab21b0aeed7c9a4511f57d5 (diff)
downloadgcc-76048bd0693e30a5abc67aa6dcce9f4973ea208e.zip
gcc-76048bd0693e30a5abc67aa6dcce9f4973ea208e.tar.gz
gcc-76048bd0693e30a5abc67aa6dcce9f4973ea208e.tar.bz2
Check LOOP_VINFO_PEELING_FOR_GAPS on epilog is supported
We need to check that an epilogue doesn't require LOOP_VINFO_PEELING_FOR_GAPS in case the main loop didn't (the other way around is OK), the computation whether the epilog is executed or not gets our of sync otherwise. * tree-vect-loop.cc (vect_analyze_loop_2): Move vect_analyze_loop_costing after check whether we can do peeling. Add check on LOOP_VINFO_PEELING_FOR_GAPS for epilogues.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/tree-vect-loop.cc30
1 files changed, 20 insertions, 10 deletions
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index e6d2414..e91549a 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -3143,17 +3143,15 @@ start_over:
" epilogue loop.\n");
}
- /* Check the costings of the loop make vectorizing worthwhile. */
- res = vect_analyze_loop_costing (loop_vinfo, suggested_unroll_factor);
- if (res < 0)
- {
- ok = opt_result::failure_at (vect_location,
- "Loop costings may not be worthwhile.\n");
- goto again;
- }
- if (!res)
+ /* If the epilogue needs peeling for gaps but the main loop doesn't give
+ up on the epilogue. */
+ if (LOOP_VINFO_EPILOGUE_P (loop_vinfo)
+ && LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo)
+ && (LOOP_VINFO_PEELING_FOR_GAPS (orig_loop_vinfo)
+ != LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo)))
return opt_result::failure_at (vect_location,
- "Loop costings not worthwhile.\n");
+ "Epilogue loop requires peeling for gaps "
+ "but main loop does not.\n");
/* If an epilogue loop is required make sure we can create one. */
if (LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo)
@@ -3174,6 +3172,18 @@ start_over:
}
}
+ /* Check the costings of the loop make vectorizing worthwhile. */
+ res = vect_analyze_loop_costing (loop_vinfo, suggested_unroll_factor);
+ if (res < 0)
+ {
+ ok = opt_result::failure_at (vect_location,
+ "Loop costings may not be worthwhile.\n");
+ goto again;
+ }
+ if (!res)
+ return opt_result::failure_at (vect_location,
+ "Loop costings not worthwhile.\n");
+
/* During peeling, we need to check if number of loop iterations is
enough for both peeled prolog loop and vector loop. This check
can be merged along with threshold check of loop versioning, so