2019-11-08 Richard Biener <rguenther@suse.de>
PR tree-optimization/92324
* tree-vect-loop.c (vect_create_epilog_for_reduction): Use
STMT_VINFO_REDUC_VECTYPE for all computations, inserting
sign-conversions as necessary.
(vectorizable_reduction): Reject conversions in the chain
that are not sign-conversions, base analysis on a non-converting
stmt and its operation sign. Set STMT_VINFO_REDUC_VECTYPE.
* tree-vect-stmts.c (vect_stmt_relevant_p): Don't dump anything
for debug stmts.
* tree-vectorizer.h (_stmt_vec_info::reduc_vectype): New.
(STMT_VINFO_REDUC_VECTYPE): Likewise.
* gcc.dg/vect/pr92205.c: XFAIL.
* gcc.dg/vect/pr92324-1.c: New testcase.
* gcc.dg/vect/pr92324-2.c: Likewise.
From-SVN: r277958
--- /dev/null
+/* { dg-do compile } */
+
+unsigned a, b;
+int c, d;
+unsigned e(int f) {
+ if (a > f)
+ return a;
+ return f;
+}
+void g() {
+ for (; c; c++)
+ d = e(d);
+ b = d;
+}
--- /dev/null
+#include "tree-vect.h"
+
+unsigned b[1024];
+
+int __attribute__((noipa))
+foo (int n)
+{
+ int res = 0;
+ for (int i = 0; i < n; ++i)
+ res = res > b[i] ? res : b[i];
+ return res;
+}
+
+int main ()
+{
+ check_vect ();
+ b[15] = (unsigned)__INT_MAX__ + 1;
+ if (foo (16) != -__INT_MAX__ - 1)
+ __builtin_abort ();
+ return 0;
+}