aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2012-05-09 16:08:26 +0000
committerMichael Matz <matz@gcc.gnu.org>2012-05-09 16:08:26 +0000
commit0c91037894987356abfee77dfe49cd075b7126c2 (patch)
treec309a04da0f209d341aaa7749a148bd7728505fc /gcc
parentb0cd199e8de7227c2fcac3cfb7f767d61678914b (diff)
downloadgcc-0c91037894987356abfee77dfe49cd075b7126c2.zip
gcc-0c91037894987356abfee77dfe49cd075b7126c2.tar.gz
gcc-0c91037894987356abfee77dfe49cd075b7126c2.tar.bz2
re PR tree-optimization/53185 (segmentation fault in vectorizable_load)
PR tree-optimization/53185 * tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Disable peeling when we see strided loads. testsuite/ * gcc.dg/vect/pr53185.c: New test. From-SVN: r187340
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr53185.c16
-rw-r--r--gcc/tree-vect-data-refs.c11
4 files changed, 38 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 237ae1c..7af99fc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-05-09 Michael Matz <matz@suse.de>
+
+ PR tree-optimization/53185
+ * tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Disable
+ peeling when we see strided loads.
+
2012-05-09 Matthias Klose <doko@ubuntu.com>
* gcc-ar.c (main): Don't check for execute bits for the plugin.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 06c1f9d..3f1b787 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-05-09 Michael Matz <matz@suse.de>
+
+ PR tree-optimization/53185
+ * gcc.dg/vect/pr53185.c: New test.
+
2012-05-09 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/53249
diff --git a/gcc/testsuite/gcc.dg/vect/pr53185.c b/gcc/testsuite/gcc.dg/vect/pr53185.c
new file mode 100644
index 0000000..af1efba
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr53185.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -ftree-vectorize" } */
+unsigned short a, e;
+int *b, *d;
+int c;
+extern int fn2();
+void fn1 () {
+ void *f;
+ for (;;) {
+ fn2 ();
+ b = f;
+ e = 0;
+ for (; e < a; ++e)
+ b[e] = d[e * c];
+ }
+}
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index 7464034..715e3ff 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -1507,6 +1507,17 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
&& GROUP_FIRST_ELEMENT (stmt_info) != stmt)
continue;
+ /* FORNOW: Any strided load prevents peeling. The induction
+ variable analysis will fail when the prologue loop is generated,
+ and so we can't generate the new base for the pointer. */
+ if (STMT_VINFO_STRIDE_LOAD_P (stmt_info))
+ {
+ if (vect_print_dump_info (REPORT_DETAILS))
+ fprintf (vect_dump, "strided load prevents peeling");
+ do_peeling = false;
+ break;
+ }
+
/* For invariant accesses there is nothing to enhance. */
if (integer_zerop (DR_STEP (dr)))
continue;