Fix PR94043 by making vect_live_op generate lc-phi
authorKewen Lin <linkw@linux.ibm.com>
Wed, 1 Apr 2020 03:48:46 +0000 (22:48 -0500)
committerKewen Lin <linkw@linux.ibm.com>
Wed, 1 Apr 2020 05:21:14 +0000 (00:21 -0500)
commitbd0f22a8d5caea8905f38ff1fafce31c1b7d33ad
treece0c6d209c9fb224c2bbb80c96bb2b50ae1cdd66
parent76f09260b7eccd6c3cfa3dcf3c22897fe12a8065
Fix PR94043 by making vect_live_op generate lc-phi

As PR94043 shows, my commit r10-4524 exposed one issue in
vectorizable_live_operation, which inserts one extra BB
before the single exit, leading unexpected operand expansion
and unexpected loop depth assertion.  As Richi suggested,
this patch is to teach vectorizable_live_operation to
generate loop closed phi for vec_lhs, it looks like:
     loop;
     # lhs' = PHI <lhs>
=>
     loop;
     # vec_lhs' = PHI <vec_lhs>
     new_tree = BIT_FIELD_REF <vec_lhs', ...>;
     lhs' = new_tree;

I noticed that there are some SLP cases that have same lhs
and vec_lhs but different offsets, which can make us have
more PHIs for the same vec_lhs there.  But I think it would
be fine since only one of them is actually live, the others
should be eliminated by the following dce.  So the patch
doesn't check whether there is one phi for vec_lhs, just
create one directly instead.

Bootstrapped/regtested on powerpc64le-linux-gnu (LE) P8.

2020-04-01  Kewen Lin  <linkw@gcc.gnu.org>

gcc/ChangeLog

    PR tree-optimization/94043
    * tree-vect-loop.c (vectorizable_live_operation): Generate loop-closed
    phi for vec_lhs and use it for lane extraction.

gcc/testsuite/ChangeLog

    PR tree-optimization/94043
    * gfortran.dg/graphite/vect-pr94043.f90: New test.
gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/graphite/vect-pr94043.f90 [new file with mode: 0644]
gcc/tree-vect-loop.c