diff options
author | Ira Rosen <irar@il.ibm.com> | 2007-07-02 10:27:27 +0000 |
---|---|---|
committer | Ira Rosen <irar@gcc.gnu.org> | 2007-07-02 10:27:27 +0000 |
commit | 3053ce44094e4d0418e02dffc5433ee84e1e530d (patch) | |
tree | 1f359e70a59e97fb0a9dceac8c3a916556031e1a | |
parent | e2c14f5d512a5a5e8a658030789dea947c42068e (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/pr32230.c | 24 | ||||
-rw-r--r-- | gcc/tree-vect-analyze.c | 9 |
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)) |