Hello,
On Thu, 1 Jul 2021, Richard Biener wrote:
> diff --git a/gcc/gimple-loop-interchange.cc b/gcc/gimple-loop-interchange.cc
> index 43045c5455e..43ef112a2d0 100644
> --- a/gcc/gimple-loop-interchange.cc
> +++ b/gcc/gimple-loop-interchange.cc
> @@ -1043,8 +1043,11 @@ tree_loop_interchange::valid_data_dependences
> (unsigned i_idx, unsigned o_idx,
> continue;
>
> /* Be conservative, skip case if either direction at i_idx/o_idx
> - levels is not '=' (for the inner loop) or '<'. */
> - if (dist_vect[i_idx] < 0 || dist_vect[o_idx] <= 0)
> + levels is not '=' or '<'. */
> + if (dist_vect[i_idx] < 0
> + || (DDR_REVERSED_P (ddr) && dist_vect[i_idx] > 0)
> + || dist_vect[o_idx] < 0
> + || (DDR_REVERSED_P (ddr) && dist_vect[o_idx] > 0))
Hmm, if DDR_REVERSED_P matters here, then it should matter for all arms.
IOW: < 0 should be tested only when !DDR_REVERSED_P, not always:
if ((!DDR_REVERSED_P (ddr) && dist_vect[i_idx] < 0)
|| (DDR_REVERSED_P (ddr) && dist_vect[i_idx] > 0)
|| (!DDR_REVERSED_P (ddr) && dist_vect[o_idx] < 0)
|| (DDR_REVERSED_P (ddr) && dist_vect[o_idx] > 0))
(what you have effectively written is a condition that allows only 0 when
DDR_REVERSED_P)
Ciao,
Michael.