diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6fdb1b62d2d..63779d362c2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-08-22 Richard Sandiford + + PR tree-optimization/86725 + * tree-vect-loop.c (vect_is_simple_reduction): When treating + an outer loop phi as a double reduction, make sure that the + single user of the phi result is an inner loop phi. + 2018-08-22 Richard Sandiford * tree-vect-data-refs.c (vect_analyze_group_access_1): Convert diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9c624ff0739..3117afaa82d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-08-22 Richard Sandiford + + PR tree-optimization/86725 + * gcc.dg/vect/no-scevccp-pr86725-1.c: New test. + 2018-08-22 Richard Sandiford * gcc.dg/vect/vect-avg-16.c: New test. diff --git a/gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-1.c b/gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-1.c new file mode 100644 index 00000000000..3bc63a6552b --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-1.c @@ -0,0 +1,26 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-O -w" } */ + +int foo; +int +nr (int xe, int z) +{ + int oo, wo = 0; + + for (oo = 0; oo < 4; ++oo) + { + int qq; + + int old_wo = wo; + for (qq = 0; qq < 2; ++qq) + { + wo = z + qq + old_wo; + xe += wo; + } + } + foo = wo; + return xe; +} + +/* { dg-final { scan-tree-dump-not "double reduction: wo" "vect" } } */ +/* { dg-final { scan-tree-dump-not "OUTER LOOP VECTORIZED" "vect" } } */ diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index db92f76c74f..f21d995fdb9 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -2992,6 +2992,7 @@ vect_is_simple_reduction (loop_vec_info loop_info, stmt_vec_info phi_info, && loop->inner && flow_bb_inside_loop_p (loop->inner, gimple_bb (def1)) && is_gimple_assign (def1) + && is_a (phi_use_stmt) && flow_bb_inside_loop_p (loop->inner, gimple_bb (phi_use_stmt))) { if (dump_enabled_p ())