public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-2987] tree-optimization/110838 - vectorization of widened right shifts
@ 2023-08-04 11:15 Richard Biener
  0 siblings, 0 replies; only message in thread
From: Richard Biener @ 2023-08-04 11:15 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:1a599caab86464006ea8c9501aff6c6638e891eb

commit r14-2987-g1a599caab86464006ea8c9501aff6c6638e891eb
Author: Richard Biener <rguenther@suse.de>
Date:   Fri Aug 4 12:11:45 2023 +0200

    tree-optimization/110838 - vectorization of widened right shifts
    
    The following fixes a problem with my last attempt of avoiding
    out-of-bound shift values for vectorized right shifts of widened
    operands.  Instead of truncating the shift amount with a bitwise
    and we actually need to saturate it to the target precision.
    
    The following does that and adds test coverage for the constant
    and invariant but variable case that would previously have failed.
    
            PR tree-optimization/110838
            * tree-vect-patterns.cc (vect_recog_over_widening_pattern):
            Fix right-shift value sanitizing.  Properly emit external
            def mangling in the preheader rather than in the pattern
            def sequence where it will fail vectorizing.
    
            * gcc.dg/vect/pr110838.c: New testcase.

Diff:
---
 gcc/testsuite/gcc.dg/vect/pr110838.c | 31 +++++++++++++++++++++++++++++++
 gcc/tree-vect-patterns.cc            | 22 +++++++++++++++++-----
 2 files changed, 48 insertions(+), 5 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/vect/pr110838.c b/gcc/testsuite/gcc.dg/vect/pr110838.c
new file mode 100644
index 00000000000..cf8765be603
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr110838.c
@@ -0,0 +1,31 @@
+/* { dg-do run } */
+
+#include "tree-vect.h"
+
+short a[32], b[32];
+
+void __attribute__((noipa)) foo ()
+{
+  for (int i = 0; i < 32; ++i)
+    a[i] = b[i] >> 16;
+}
+
+void __attribute__((noipa)) bar (int n)
+{
+  int np = n & 31;
+  for (int i = 0; i < 32; ++i)
+    a[i] = b[i] >> np;
+}
+
+int main ()
+{
+  check_vect ();
+  b[0] = -8;
+  foo ();
+  if (a[0] != -1)
+    abort ();
+  bar (16);
+  if (a[0] != -1)
+    abort ();
+  return 0;
+}
diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc
index e4ab8c2d65b..2cedf238450 100644
--- a/gcc/tree-vect-patterns.cc
+++ b/gcc/tree-vect-patterns.cc
@@ -3109,8 +3109,8 @@ vect_recog_over_widening_pattern (vec_info *vinfo,
       wide_int min_value, max_value;
       if (TREE_CODE (ops[1]) == INTEGER_CST)
 	ops[1] = wide_int_to_tree (op_type,
-				   wi::bit_and (wi::to_wide (ops[1]),
-						new_precision - 1));
+				   wi::umin (wi::to_wide (ops[1]),
+					     new_precision - 1));
       else if (!vect_get_range_info (ops[1], &min_value, &max_value)
 	       || wi::ge_p (max_value, new_precision, TYPE_SIGN (op_type)))
 	{
@@ -3118,11 +3118,23 @@ vect_recog_over_widening_pattern (vec_info *vinfo,
 	     same argument widened shifts and it un-CSEs same arguments.  */
 	  tree new_var = vect_recog_temp_ssa_var (op_type, NULL);
 	  gimple *pattern_stmt
-	    = gimple_build_assign (new_var, BIT_AND_EXPR, ops[1],
+	    = gimple_build_assign (new_var, MIN_EXPR, ops[1],
 				   build_int_cst (op_type, new_precision - 1));
-	  ops[1] = new_var;
 	  gimple_set_location (pattern_stmt, gimple_location (last_stmt));
-	  append_pattern_def_seq (vinfo, last_stmt_info, pattern_stmt);
+	  if (unprom[1].dt == vect_external_def)
+	    {
+	      if (edge e = vect_get_external_def_edge (vinfo, ops[1]))
+		{
+		  basic_block new_bb
+		    = gsi_insert_on_edge_immediate (e, pattern_stmt);
+		  gcc_assert (!new_bb);
+		}
+	      else
+		return NULL;
+	    }
+	  else
+	    append_pattern_def_seq (vinfo, last_stmt_info, pattern_stmt);
+	  ops[1] = new_var;
 	}
     }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-08-04 11:15 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-04 11:15 [gcc r14-2987] tree-optimization/110838 - vectorization of widened right shifts Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).