From 12a43ab883305f9b997987eafaafbc76ca873bd3 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 5 Mar 2013 09:54:29 +0000 Subject: re PR tree-optimization/56270 (loop over array of struct float causes compiler error: segmentation fault) 2013-03-05 Richard Biener PR tree-optimization/56270 * tree-vect-slp.c (vect_schedule_slp): Clear vectorized stmts of loads after scheduling an SLP instance. * gcc.dg/vect/slp-38.c: New testcase. From-SVN: r196458 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/vect/slp-38.c | 24 ++++++++++++++++++++++++ gcc/tree-vect-slp.c | 11 ++++++++++- 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/vect/slp-38.c (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8d35977..b09e427 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-03-05 Richard Biener + + PR tree-optimization/56270 + * tree-vect-slp.c (vect_schedule_slp): Clear vectorized stmts + of loads after scheduling an SLP instance. + 2013-03-05 Jakub Jelinek * Makefile.in (dg_target_exps): Add aarch64.exp, epiphany.exp and diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4529bcf..6cbe85e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-03-05 Richard Biener + + PR tree-optimization/56270 + * gcc.dg/vect/slp-38.c: New testcase. + 2013-03-05 Jakub Jelinek PR rtl-optimization/56494 diff --git a/gcc/testsuite/gcc.dg/vect/slp-38.c b/gcc/testsuite/gcc.dg/vect/slp-38.c new file mode 100644 index 0000000..a387f5d --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/slp-38.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ + +typedef struct { + float l, h; +} tFPinterval; + +tFPinterval X[1024]; +tFPinterval Y[1024]; +tFPinterval Z[1024]; + +void Compute(void) +{ + int d; + for (d= 0; d < 1024; d++) + { + Y[d].l= X[d].l + X[d].h; + Y[d].h= Y[d].l; + Z[d].l= X[d].l; + Z[d].h= X[d].h; + } +} + +/* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 1 "vect" { target { vect_float && vect_perm } } } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 467abb5..3b2fc80 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -3141,7 +3141,8 @@ vect_schedule_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo) { vec slp_instances; slp_instance instance; - unsigned int i, vf; + slp_tree loads_node; + unsigned int i, j, vf; bool is_store = false; if (loop_vinfo) @@ -3160,6 +3161,14 @@ vect_schedule_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo) /* Schedule the tree of INSTANCE. */ is_store = vect_schedule_slp_instance (SLP_INSTANCE_TREE (instance), instance, vf); + + /* Clear STMT_VINFO_VEC_STMT of all loads. With shared loads + between SLP instances we fail to properly initialize the + vectorized SLP stmts and confuse different load permutations. */ + FOR_EACH_VEC_ELT (SLP_INSTANCE_LOADS (instance), j, loads_node) + STMT_VINFO_VEC_STMT + (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (loads_node)[0])) = NULL; + if (dump_enabled_p ()) dump_printf_loc (MSG_NOTE, vect_location, "vectorizing stmts using SLP."); -- cgit v1.1