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

Reply via email to