The following resets LOOP_VINFO_USING_DECREMENTING_IV_P before
re-trying.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.
PR tree-optimization/123315
* tree-vect-loop.cc (vect_analyze_loop_2): Reset
LOOP_VINFO_USING_DECREMENTING_IV_P before retrying.
* g++.dg/vect/pr123315.cc: New testcase.
---
gcc/testsuite/g++.dg/vect/pr123315.cc | 18 ++++++++++++++++++
gcc/tree-vect-loop.cc | 2 ++
2 files changed, 20 insertions(+)
create mode 100644 gcc/testsuite/g++.dg/vect/pr123315.cc
diff --git a/gcc/testsuite/g++.dg/vect/pr123315.cc
b/gcc/testsuite/g++.dg/vect/pr123315.cc
new file mode 100644
index 00000000000..e9607976c6b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/vect/pr123315.cc
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-additional-options "-O3 -fvect-cost-model=dynamic" }
+
+short a, b, c;
+long long e, f;
+extern int g[][2][2][23];
+inline long max(long a, long b)
+{
+ return a > b ? a : b;
+}
+void h(unsigned d)
+{
+ for (; d < 23; d++) {
+ c = b ?: g[1][1][1][d];
+ e = max(e, (long long)a);
+ f = max(f, (long long)7);
+ }
+}
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 994d1a3ee74..03339641750 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -2730,6 +2730,8 @@ again:
LOOP_VINFO_MUST_USE_PARTIAL_VECTORS_P (loop_vinfo) = false;
LOOP_VINFO_USING_PARTIAL_VECTORS_P (loop_vinfo) = false;
LOOP_VINFO_USING_SELECT_VL_P (loop_vinfo) = false;
+ LOOP_VINFO_USING_DECREMENTING_IV_P (loop_vinfo) = false;
+
if (loop_vinfo->scan_map)
loop_vinfo->scan_map->empty ();
--
2.51.0