This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] Fix PR tree-optimization/40542 - prevent vectorization of volatile types


Hi,

This patch prevents vectorization of volatile types.
Thanks to Richard for pointing out the API to use.

Bootstrapped with vectorization enabled and tested on x86_64-suse-linux for
4.3, 4.4 and 4.5.
Committed to mainline.
O.K. for 4.4 and 4.3?

Thanks,
Ira

4.5:
ChangeLog:

      PR tree-optimization/40542
      * tree-vect-stmts.c (vect_analyze_stmt): Don't vectorize volatile
      types.

testsuite/ChangeLog:

      PR tree-optimization/40542
      * gcc.dg/vect/pr40542.c: New test.

Index: tree-vect-stmts.c
===================================================================
--- tree-vect-stmts.c   (revision 149082)
+++ tree-vect-stmts.c   (working copy)
@@ -3910,6 +3910,14 @@ vect_analyze_stmt (gimple stmt, bool *ne
       print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
     }

+  if (gimple_has_volatile_ops (stmt))
+    {
+      if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
+        fprintf (vect_dump, "not vectorized: stmt has volatile operands");
+
+      return false;
+    }
+
   /* Skip stmts that do not need to be vectorized. In loops this is
expected
      to include:
      - the COND_EXPR which is the loop exit condition
Index: testsuite/gcc.dg/vect/pr40542.c
===================================================================
--- testsuite/gcc.dg/vect/pr40542.c     (revision 0)
+++ testsuite/gcc.dg/vect/pr40542.c     (revision 0)
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+void
+volarr_cpy(char *d, volatile char *s)
+{
+  int i;
+
+  for (i = 0; i < 16; i++)
+    d[i] = s[i];
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail
*-*-* } } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+

4.4:
ChangeLog:

      PR tree-optimization/40542
      * tree-vect-analyze.c (vect_determine_vectorization_factor): Don't
      vectorize volatile types.

testsuite/ChangeLog:

      PR tree-optimization/40542
      * gcc.dg/vect/pr40542.c: New test.

Index: tree-vect-analyze.c
===================================================================
--- tree-vect-analyze.c (revision 149023)
+++ tree-vect-analyze.c (working copy)
@@ -199,6 +199,15 @@ vect_determine_vectorization_factor (loo
              print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
            }

+          if (gimple_has_volatile_ops (stmt))
+            {
+              if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS))
+                fprintf (vect_dump, "not vectorized: stmt has volatile"
+                                    " operands");
+
+              return false;
+            }
+
          gcc_assert (stmt_info);

          /* skip stmts which do not need to be vectorized.  */
Index: testsuite/gcc.dg/vect/pr40542.c
===================================================================
--- testsuite/gcc.dg/vect/pr40542.c     (revision 0)
+++ testsuite/gcc.dg/vect/pr40542.c     (revision 0)
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+void
+volarr_cpy(char *d, volatile char *s)
+{
+  int i;
+
+  for (i = 0; i < 16; i++)
+    d[i] = s[i];
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail
*-*-* } } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+

4.3:
ChangeLog:

      PR tree-optimization/40542
      * tree-vect-analyze.c (vect_determine_vectorization_factor): Don't
      vectorize volatile types.

testsuite/ChangeLog:

      PR tree-optimization/40542
      * gcc.dg/vect/pr40542.c: New test.

Index: tree-vect-analyze.c
===================================================================
--- tree-vect-analyze.c (revision 149023)
+++ tree-vect-analyze.c (working copy)
@@ -173,6 +173,15 @@ vect_determine_vectorization_factor (loo
              print_generic_expr (vect_dump, stmt, TDF_SLIM);
            }

+          if (stmt_ann (stmt)->has_volatile_ops)
+            {
+              if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS))
+                fprintf (vect_dump, "not vectorized: stmt has volatile"
+                                    " operands");
+
+              return false;
+            }
+
          gcc_assert (stmt_info);

          /* skip stmts which do not need to be vectorized.  */
Index: testsuite/gcc.dg/vect/pr40542.c
===================================================================
--- testsuite/gcc.dg/vect/pr40542.c     (revision 0)
+++ testsuite/gcc.dg/vect/pr40542.c     (revision 0)
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+void
+volarr_cpy(char *d, volatile char *s)
+{
+  int i;
+
+  for (i = 0; i < 16; i++)
+    d[i] = s[i];
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail
*-*-* } } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]