diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f1452ac2a19..a2691656661 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-07-02 Ira Rosen + + 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 * config.gcc (mipsisa32-*-elf*, mipsisa32el-*-elf*) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c08ccd90d3d..ae9175355c9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-07-02 Ira Rosen + + PR tree-optimization/32230 + * gcc.dg/vect/pr32230.c: New test. + 2007-07-01 Christopher D. Rickett * 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 00000000000..ed1e7b14614 --- /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 b4cd79d5b6d..6cfea2b1c9f 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))