On Mon, Mar 21, 2016 at 4:22 PM, Bin Cheng <bin.ch...@arm.com> wrote:
> Hi,
> The second issue revealed by PR69489 is tree ifcvt could not convert PHI 
> nodes with more than 2 arguments.  Among these nodes, there is a special kind 
> of PHI which can be handled.  Precisely, if the PHI node satisfies below two 
> conditions:
>      1) Number of PHI arguments with different values equals to 2 and one 
> argument has the only occurrence.
>      2) The edge corresponding to the unique argument isn't critical edge.
>
>    Such PHI can be degenerated and handled just like PHI node with only two 
> arguments.  For example:
>      res = PHI <A_1(e1), A_1(e2), A_2(e3), A_1(e4)>;
>    can be transformed into:
>      res = (predicate of e3) ? A_2 : A_1;
>
> This patch fixes the issue.  I know we may be able to further relax the check 
> and allow handling of general multiple args PHI node, this can be a starter 
> since the change is kind of trivial.
> Bootstrap & test on x86_64 & AArch64.  Though the first part patch at 
> https://gcc.gnu.org/ml/gcc-patches/2016-03/msg00888.html needs to be revised, 
> this one is quite independent apart from the test case itself.  So any 
> opinions?

Looks good to me.  Btw, see also PR56541 where jump threading can
introduce the case but with more than two distinct PHI args.
IMHO we "simply" want to force *amy_mask_load_store to true if
if_convertible_phi_p runs into this case (so we perform
versioning to only expose the if-converted code to the vectorizer
which has a cost model to tell whether the result is profitable).
There is still the critical edge splitting only performed for
aggressive-if-conv but I think that's easily sth we can do for all
loop
bodies.

Richard.

> Thanks,
> bin
>
> 2016-03-21  Bin Cheng  <bin.ch...@arm.com>
>
>         PR tree-optimization/69489
>         * tree-if-conv.c (phi_convertible_by_degenerating_args): New.
>         (if_convertible_phi_p): Call phi_convertible_by_degenerating_args.
>         Revise dump message.
>         (if_convertible_bb_p): Remove check on edge count of basic block's
>         predecessors.
>
> gcc/testsuite/ChangeLog
> 2016-03-21  Bin Cheng  <bin.ch...@arm.com>
>
>         PR tree-optimization/69489
>         * gcc.dg/tree-ssa/ifc-pr69489-2.c: New test.

Reply via email to