public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-4296] vect, omp: inbranch simdclone dropping const
@ 2023-09-27 12:22 Andre Simoes Dias Vieira
  0 siblings, 0 replies; only message in thread
From: Andre Simoes Dias Vieira @ 2023-09-27 12:22 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:b31218bc93683554077c68dec14f4217a5e66835

commit r14-4296-gb31218bc93683554077c68dec14f4217a5e66835
Author: Andre Vieira <andre.simoesdiasvieira@arm.com>
Date:   Wed Sep 27 11:05:40 2023 +0100

    vect, omp: inbranch simdclone dropping const
    
    The const attribute is ignored when simdclone's are used inbranch. This is due
    to the fact that when analyzing a MASK_CALL we were not looking at the targeted
    function for flags, but instead only at the internal function call itself.
    This patch adds code to make sure we look at the target function to check for
    the const attribute and enables the autovectorization of inbranch const
    simdclones without needing the loop to be adorned the 'openmp simd' pragma.
    
    gcc/ChangeLog:
    
            * tree-data-ref.cc (include calls.h): Add new include.
            (get_references_in_stmt): Correctly handle IFN_MASK_CALL.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.dg/vect/vect-simd-clone-19.c: New test.

Diff:
---
 gcc/testsuite/gcc.dg/vect/vect-simd-clone-19.c | 22 ++++++++++++++++++++++
 gcc/tree-data-ref.cc                           | 17 +++++++++++++++--
 2 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/vect/vect-simd-clone-19.c b/gcc/testsuite/gcc.dg/vect/vect-simd-clone-19.c
new file mode 100644
index 00000000000..e7ed56ca754
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-simd-clone-19.c
@@ -0,0 +1,22 @@
+/* { dg-require-effective-target vect_simd_clones } */
+/* { dg-do compile } */
+
+int __attribute__ ((__simd__, const)) fn (int);
+
+void test (int * __restrict__ a, int * __restrict__ b, int n)
+{
+  for (int i = 0; i < n; ++i)
+    {
+      int a_;
+      if (b[i] > 0)
+        a_ = fn (b[i]);
+      else
+        a_ = b[i] + 5;
+      a[i] = a_;
+    }
+}
+
+/* { dg-final { scan-tree-dump-not {loop contains function calls or data references} "vect" } } */
+
+/* The LTO test produces two dump files and we scan the wrong one.  */
+/* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */
diff --git a/gcc/tree-data-ref.cc b/gcc/tree-data-ref.cc
index 6d3b7c2290e..689aaeed722 100644
--- a/gcc/tree-data-ref.cc
+++ b/gcc/tree-data-ref.cc
@@ -100,6 +100,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "vr-values.h"
 #include "range-op.h"
 #include "tree-ssa-loop-ivopts.h"
+#include "calls.h"
 
 static struct datadep_stats
 {
@@ -5816,6 +5817,15 @@ get_references_in_stmt (gimple *stmt, vec<data_ref_loc, va_heap> *references)
 	    }
 	  case IFN_MASK_LOAD:
 	  case IFN_MASK_STORE:
+	  break;
+	  case IFN_MASK_CALL:
+	    {
+	      tree orig_fndecl
+		= gimple_call_addr_fndecl (gimple_call_arg (stmt, 0));
+	      if (!orig_fndecl
+		  || (flags_from_decl_or_type (orig_fndecl) & ECF_CONST) == 0)
+		clobbers_memory = true;
+	    }
 	    break;
 	  default:
 	    clobbers_memory = true;
@@ -5852,7 +5862,7 @@ get_references_in_stmt (gimple *stmt, vec<data_ref_loc, va_heap> *references)
     }
   else if (stmt_code == GIMPLE_CALL)
     {
-      unsigned i, n;
+      unsigned i = 0, n;
       tree ptr, type;
       unsigned int align;
 
@@ -5879,13 +5889,16 @@ get_references_in_stmt (gimple *stmt, vec<data_ref_loc, va_heap> *references)
 				   ptr);
 	    references->safe_push (ref);
 	    return false;
+	  case IFN_MASK_CALL:
+	    i = 1;
+	    gcc_fallthrough ();
 	  default:
 	    break;
 	  }
 
       op0 = gimple_call_lhs (stmt);
       n = gimple_call_num_args (stmt);
-      for (i = 0; i < n; i++)
+      for (; i < n; i++)
 	{
 	  op1 = gimple_call_arg (stmt, i);

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

only message in thread, other threads:[~2023-09-27 12:22 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-09-27 12:22 [gcc r14-4296] vect, omp: inbranch simdclone dropping const Andre Simoes Dias Vieira

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).