]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/111082 - bogus promoted min
authorRichard Biener <rguenther@suse.de>
Mon, 21 Aug 2023 09:07:18 +0000 (11:07 +0200)
committerRichard Biener <rguenther@suse.de>
Mon, 21 Aug 2023 09:46:48 +0000 (11:46 +0200)
vectorize_slp_instance_root_stmt promotes operations with undefined
overflow to unsigned arithmetic but fails to consider operations
that do not overflow like MIN which it turned into MIN with wrong
signedness and in the case of the PR an unsupported operation.
The following rectifies this.

PR tree-optimization/111082
* tree-vect-slp.cc (vectorize_slp_instance_root_stmt): Only
pun operations that can overflow.

* gcc.dg/pr111082.c: New testcase.

gcc/testsuite/gcc.dg/pr111082.c [new file with mode: 0644]
gcc/tree-vect-slp.cc

diff --git a/gcc/testsuite/gcc.dg/pr111082.c b/gcc/testsuite/gcc.dg/pr111082.c
new file mode 100644 (file)
index 0000000..46e36e3
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-vect-cost-model" } */
+/* { dg-additional-options "-mavx512f" { target { x86_64-*-* i?86-*-* } } } */
+
+long minarray2(const long *input)
+{
+  if (input[0] < input[1])
+    return input[0] ;
+  return input[1];
+}
index 89c3216afacd677a49e9db065e81b4aca598915f..b5f9333fc22e5e4e8b1c223a4af055e64426a150 100644 (file)
@@ -9161,7 +9161,8 @@ vectorize_slp_instance_root_stmt (slp_tree node, slp_instance instance)
       tree vectype = TREE_TYPE (vec_def);
       tree compute_vectype = vectype;
       bool pun_for_overflow_p = (ANY_INTEGRAL_TYPE_P (vectype)
-                                && TYPE_OVERFLOW_UNDEFINED (vectype));
+                                && TYPE_OVERFLOW_UNDEFINED (vectype)
+                                && operation_can_overflow (reduc_code));
       if (pun_for_overflow_p)
        {
          compute_vectype = unsigned_type_for (vectype);