Commit 3a4da266 by Richard Sandiford Committed by Richard Sandiford

[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
parent 203942b8
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
grouped stores with gaps to a strided group.
......
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.
* gcc.dg/vect/slp-37.c: Expect the loop to be vectorized.
* gcc.dg/vect/vect-strided-u8-i8-gap4.c,
......
/* { 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 ())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment