[PATCH PR69489/02]Handle PHI which can be degenerated to two arguments node in tree ifcvt.

Bin.Cheng amker.cheng@gmail.com
Wed Apr 20 16:01:00 GMT 2016


On Tue, Mar 22, 2016 at 10:41 AM, Richard Biener
<richard.guenther@gmail.com> wrote:
> On Mon, Mar 21, 2016 at 4:22 PM, Bin Cheng <Bin.Cheng@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
Patch re-tested and applied on trunk with below minor change:
+  unsigned int i, i1, i2, n1 = 0, n2 = 0;
  Changed to:
+  unsigned int i, i1 = 0, i2 = 0, n1 = 0, n2 = 0;
Because GCC falsely reports uninitialized use of `i2' at O2
optimization level, resulting in bootstrap failure.

> 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.
Yeah, I have following patch to handle such cases.

Thanks,
bin
>
> Richard.
>
>> Thanks,
>> bin
>>
>> 2016-03-21  Bin Cheng  <bin.cheng@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.cheng@arm.com>
>>
>>         PR tree-optimization/69489
>>         * gcc.dg/tree-ssa/ifc-pr69489-2.c: New test.



More information about the Gcc-patches mailing list