aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIra Rosen <irar@il.ibm.com>2007-07-02 10:27:27 +0000
committerIra Rosen <irar@gcc.gnu.org>2007-07-02 10:27:27 +0000
commit3053ce44094e4d0418e02dffc5433ee84e1e530d (patch)
tree1f359e70a59e97fb0a9dceac8c3a916556031e1a
parente2c14f5d512a5a5e8a658030789dea947c42068e (diff)
downloadgcc-3053ce44094e4d0418e02dffc5433ee84e1e530d.zip
gcc-3053ce44094e4d0418e02dffc5433ee84e1e530d.tar.gz
gcc-3053ce44094e4d0418e02dffc5433ee84e1e530d.tar.bz2
re PR tree-optimization/32230 (Segfault in set_bb_for_stmt with -O -ftree-vectorize)
PR tree-optimization/32230 PR tree-optimization/32477 * tree-vect-analyze.c (vect_analyze_data_refs): Fail if base address is a constant. From-SVN: r126196
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr32230.c24
-rw-r--r--gcc/tree-vect-analyze.c9
4 files changed, 45 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f1452ac..a269165 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2007-07-02 Ira Rosen <irar@il.ibm.com>
+
+ PR tree-optimization/32230
+ PR tree-optimization/32477
+ * tree-vect-analyze.c (vect_analyze_data_refs): Fail if base
+ address is a constant.
+
2007-07-02 Richard Sandiford <richard@codesourcery.com>
* config.gcc (mipsisa32-*-elf*, mipsisa32el-*-elf*)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c08ccd9..ae91753 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-07-02 Ira Rosen <irar@il.ibm.com>
+
+ PR tree-optimization/32230
+ * gcc.dg/vect/pr32230.c: New test.
+
2007-07-01 Christopher D. Rickett <crickett@lanl.gov>
* bind_c_array_params.f03: New files for Fortran 2003 ISO C Binding.
diff --git a/gcc/testsuite/gcc.dg/vect/pr32230.c b/gcc/testsuite/gcc.dg/vect/pr32230.c
new file mode 100644
index 0000000..ed1e7b1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr32230.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+
+typedef struct filter_buffer filter_buffer_t;
+struct filter_buffer
+{
+ char buf[1];
+};
+typedef struct sbuf_header sbuf_header_t;
+struct sbuf_header
+{
+ char buf[1];
+}
+const_f (filter_buffer_t *buf)
+{
+ float val;
+ int i;
+
+ for (i = 0; i < 10; i++)
+ ((float*) (&((sbuf_header_t *) ((buf) == (filter_buffer_t *)&(buf)->buf[0]))->buf[0]))[i] = val;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
+
diff --git a/gcc/tree-vect-analyze.c b/gcc/tree-vect-analyze.c
index b4cd79d..6cfea2b 100644
--- a/gcc/tree-vect-analyze.c
+++ b/gcc/tree-vect-analyze.c
@@ -2092,6 +2092,15 @@ vect_analyze_data_refs (loop_vec_info loop_vinfo)
}
return false;
}
+
+ if (TREE_CODE (DR_BASE_ADDRESS (dr)) == INTEGER_CST)
+ {
+ if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS))
+ fprintf (vect_dump, "not vectorized: base addr of dr is a "
+ "constant");
+ return false;
+ }
+
if (!DR_SYMBOL_TAG (dr))
{
if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS))