[patch] Fix PR tree-optimization/40542 - prevent vectorization of volatile types
Ira Rosen
IRAR@il.ibm.com
Tue Jun 30 11:49:00 GMT 2009
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" } } */
+
More information about the Gcc-patches
mailing list