diff options
author | Richard Biener <rguenther@suse.de> | 2014-01-14 09:04:50 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2014-01-14 09:04:50 +0000 |
commit | a0e35eb02c65ca7aa1c429a1032a463129623669 (patch) | |
tree | c2fa988fd84ae971571c3f7df4e8a8c3314bd336 /gcc | |
parent | 1c76069c9d792c4c1f5ae58dfc76aed463fedbed (diff) | |
download | gcc-a0e35eb02c65ca7aa1c429a1032a463129623669.zip gcc-a0e35eb02c65ca7aa1c429a1032a463129623669.tar.gz gcc-a0e35eb02c65ca7aa1c429a1032a463129623669.tar.bz2 |
re PR tree-optimization/58921 (ICE with segfault on valid code at -O3 on x86_64-linux-gnu)
2014-01-14 Richard Biener <rguenther@suse.de>
PR tree-optimization/58921
PR tree-optimization/59006
* tree-vect-loop-manip.c (vect_loop_versioning): Remove code
hoisting invariant stmts.
* tree-vect-stmts.c (vectorizable_load): Insert the splat of
invariant loads on the preheader edge if possible.
* gcc.dg/torture/pr58921.c: New testcase.
* gcc.dg/torture/pr59006.c: Likewise.
* gcc.dg/vect/pr58508.c: XFAIL no longer handled cases.
From-SVN: r206599
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr58921.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr59006.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/pr58508.c | 3 | ||||
-rw-r--r-- | gcc/tree-vect-loop-manip.c | 67 | ||||
-rw-r--r-- | gcc/tree-vect-stmts.c | 35 |
7 files changed, 80 insertions, 72 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3a832d0..d9d1949 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2014-01-14 Richard Biener <rguenther@suse.de> + + PR tree-optimization/58921 + PR tree-optimization/59006 + * tree-vect-loop-manip.c (vect_loop_versioning): Remove code + hoisting invariant stmts. + * tree-vect-stmts.c (vectorizable_load): Insert the splat of + invariant loads on the preheader edge if possible. + 2014-01-14 Joey Ye <joey.ye@arm.com> * doc/plugin.texi (Building GCC plugins): Update to C++. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4c59e37..8a3b56d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-01-14 Richard Biener <rguenther@suse.de> + + PR tree-optimization/58921 + PR tree-optimization/59006 + * gcc.dg/torture/pr58921.c: New testcase. + * gcc.dg/torture/pr59006.c: Likewise. + * gcc.dg/vect/pr58508.c: XFAIL no longer handled cases. + 2014-01-14 Jakub Jelinek <jakub@redhat.com> PR testsuite/59494 diff --git a/gcc/testsuite/gcc.dg/torture/pr58921.c b/gcc/testsuite/gcc.dg/torture/pr58921.c new file mode 100644 index 0000000..7d7c985 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr58921.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ + +int a[7]; +int b; + +void +fn1 () +{ + for (; b; b++) + a[b] = ((a[b] <= 0) == (a[0] != 0)); +} + +int +main () +{ + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr59006.c b/gcc/testsuite/gcc.dg/torture/pr59006.c new file mode 100644 index 0000000..34de83d --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr59006.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ + +int a[8], b; +void fn1(void) +{ + int c; + for (; b; b++) + { + int d = a[b]; + c = a[0] ? d : 0; + a[b] = c; + } +} diff --git a/gcc/testsuite/gcc.dg/vect/pr58508.c b/gcc/testsuite/gcc.dg/vect/pr58508.c index c1ca334..c25da41 100644 --- a/gcc/testsuite/gcc.dg/vect/pr58508.c +++ b/gcc/testsuite/gcc.dg/vect/pr58508.c @@ -66,5 +66,6 @@ void test5 (int* a, int* b) } } -/* { dg-final { scan-tree-dump-times "hoist" 8 "vect" { xfail vect_no_align } } } */ +/* { dg-final { scan-tree-dump-times "hoist" 8 "vect" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "hoist" 3 "vect" { xfail vect_no_align } } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index f686261..77d945e 100644 --- a/gcc/tree-vect-loop-manip.c +++ b/gcc/tree-vect-loop-manip.c @@ -2435,73 +2435,6 @@ vect_loop_versioning (loop_vec_info loop_vinfo, } } - - /* Extract load statements on memrefs with zero-stride accesses. */ - - if (LOOP_REQUIRES_VERSIONING_FOR_ALIAS (loop_vinfo)) - { - /* In the loop body, we iterate each statement to check if it is a load. - Then we check the DR_STEP of the data reference. If DR_STEP is zero, - then we will hoist the load statement to the loop preheader. */ - - basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo); - int nbbs = loop->num_nodes; - - for (int i = 0; i < nbbs; ++i) - { - for (gimple_stmt_iterator si = gsi_start_bb (bbs[i]); - !gsi_end_p (si);) - { - gimple stmt = gsi_stmt (si); - stmt_vec_info stmt_info = vinfo_for_stmt (stmt); - struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info); - - if (is_gimple_assign (stmt) - && (!dr - || (DR_IS_READ (dr) && integer_zerop (DR_STEP (dr))))) - { - bool hoist = true; - ssa_op_iter iter; - tree var; - - /* We hoist a statement if all SSA uses in it are defined - outside of the loop. */ - FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_USE) - { - gimple def = SSA_NAME_DEF_STMT (var); - if (!gimple_nop_p (def) - && flow_bb_inside_loop_p (loop, gimple_bb (def))) - { - hoist = false; - break; - } - } - - if (hoist) - { - if (dr) - gimple_set_vuse (stmt, NULL); - - gsi_remove (&si, false); - gsi_insert_on_edge_immediate (loop_preheader_edge (loop), - stmt); - - if (dump_enabled_p ()) - { - dump_printf_loc - (MSG_NOTE, vect_location, - "hoisting out of the vectorized loop: "); - dump_gimple_stmt (MSG_NOTE, TDF_SLIM, stmt, 0); - dump_printf (MSG_NOTE, "\n"); - } - continue; - } - } - gsi_next (&si); - } - } - } - /* End loop-exit-fixes after versioning. */ if (cond_expr_stmt_list) diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index cdeb457..acdaa2d 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -6380,12 +6380,39 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, /* 4. Handle invariant-load. */ if (inv_p && !bb_vinfo) { - gimple_stmt_iterator gsi2 = *gsi; gcc_assert (!grouped_load); - gsi_next (&gsi2); - new_temp = vect_init_vector (stmt, scalar_dest, - vectype, &gsi2); + /* If we have versioned for aliasing then we are sure + this is a loop invariant load and thus we can insert + it on the preheader edge. */ + if (LOOP_REQUIRES_VERSIONING_FOR_ALIAS (loop_vinfo)) + { + if (dump_enabled_p ()) + { + dump_printf_loc (MSG_NOTE, vect_location, + "hoisting out of the vectorized " + "loop: "); + dump_gimple_stmt (MSG_NOTE, TDF_SLIM, stmt, 0); + dump_printf (MSG_NOTE, "\n"); + } + tree tem = copy_ssa_name (scalar_dest, NULL); + gsi_insert_on_edge_immediate + (loop_preheader_edge (loop), + gimple_build_assign (tem, + unshare_expr + (gimple_assign_rhs1 (stmt)))); + new_temp = vect_init_vector (stmt, tem, vectype, NULL); + } + else + { + gimple_stmt_iterator gsi2 = *gsi; + gsi_next (&gsi2); + new_temp = vect_init_vector (stmt, scalar_dest, + vectype, &gsi2); + } new_stmt = SSA_NAME_DEF_STMT (new_temp); + set_vinfo_for_stmt (new_stmt, + new_stmt_vec_info (new_stmt, loop_vinfo, + bb_vinfo)); } if (negative) |