[1/2] Fix bogus double reduction (PR 86725)
This patch is the first part of the fix for PR 86725. We would treat x_1 in: outer1: x_1 = PHI <x_4(outer2), ...>; ... inner: x_2 = ...x_1...; ... x_3 = ...; ... outer2: x_4 = PHI <x_3(inner)>; ... as a double reduction without checking what kind of statement x_2 is. In practice it has to be a phi, since for other x_2, x_1 would simply be a loop invariant that gets used for every inner loop iteration. The idea with doing this patch first is that, by checking x_2 really is a phi, we can hand off the validation of the rest of the reduction to the phi analysis in the inner loop. The test case is a variant of the one in the PR. 2018-08-22 Richard Sandiford <richard.sandiford@arm.com> gcc/ 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. gcc/testsuite/ PR tree-optimization/86725 * gcc.dg/vect/no-scevccp-pr86725-1.c: New test. From-SVN: r263773
This commit is contained in:
parent
203942b8af
commit
3a4da26602
4 changed files with 39 additions and 0 deletions
|
@ -1,3 +1,10 @@
|
|||
2018-08-22 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
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 <richard.sandiford@arm.com>
|
||||
|
||||
* tree-vect-data-refs.c (vect_analyze_group_access_1): Convert
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2018-08-22 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
PR tree-optimization/86725
|
||||
* gcc.dg/vect/no-scevccp-pr86725-1.c: New test.
|
||||
|
||||
2018-08-22 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
* gcc.dg/vect/vect-avg-16.c: New test.
|
||||
|
|
26
gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-1.c
Normal file
26
gcc/testsuite/gcc.dg/vect/no-scevccp-pr86725-1.c
Normal file
|
@ -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" } } */
|
|
@ -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 <gphi *> (phi_use_stmt)
|
||||
&& flow_bb_inside_loop_p (loop->inner, gimple_bb (phi_use_stmt)))
|
||||
{
|
||||
if (dump_enabled_p ())
|
||||
|
|
Loading…
Add table
Reference in a new issue