[PATCH GCC]Improve tree ifconv by handling virtual PHIs which can be degenerated.

Bin.Cheng amker.cheng@gmail.com
Fri Apr 22 10:33:00 GMT 2016


On Fri, Apr 22, 2016 at 11:25 AM, Richard Biener
<richard.guenther@gmail.com> wrote:
> On Fri, Apr 22, 2016 at 12:07 PM, Bin Cheng <Bin.Cheng@arm.com> wrote:
>> Hi,
>> Tree if-conv has below code checking on virtual PHI nodes in if_convertible__phi_p:
>>
>>   if (any_mask_load_store)
>>     return true;
>>
>>   /* When there were no if-convertible stores, check
>>      that there are no memory writes in the branches of the loop to be
>>      if-converted.  */
>>   if (virtual_operand_p (gimple_phi_result (phi)))
>>     {
>>       imm_use_iterator imm_iter;
>>       use_operand_p use_p;
>>
>>       if (bb != loop->header)
>>         {
>>           if (dump_file && (dump_flags & TDF_DETAILS))
>>             fprintf (dump_file, "Virtual phi not on loop->header.\n");
>>           return false;
>>         }
>>
>>       FOR_EACH_IMM_USE_FAST (use_p, imm_iter, gimple_phi_result (phi))
>>         {
>>           if (gimple_code (USE_STMT (use_p)) == GIMPLE_PHI
>>               && USE_STMT (use_p) != phi)
>>             {
>>               if (dump_file && (dump_flags & TDF_DETAILS))
>>                 fprintf (dump_file, "Difficult to handle this virtual phi.\n");
>>               return false;
>>             }
>>         }
>>     }
>>
>> After investigation, I think it's to bypass code in the form of:
>>
>> <bb header>
>>   .MEM_2232 = PHI <.MEM_574(179), .MEM_1247(183)>     // <----PHI_1
>>   ...
>>   if (cond)
>>     goto <bb 1>
>>   else
>>     goto <bb2>
>>
>> <bb 1>:  //empty
>> <bb2>:
>>   .MEM_1247 = PHI <.MEM_2232(180), .MEM_2232(181)>     // <----PHI_2
>>   if (cond2)
>>     goto <bb exit>
>>   else
>>     goto <bb latch>
>>
>> <bb latch>:
>>   goto <bb header>
>>
>> Here PHI_2 can be degenerated and deleted.  Furthermore, after propagating .MEM_2232 to .MEM_1247's uses, PHI_1 can also be degenerated and deleted in this case.  These cases are bypassed because tree if-conv doesn't handle virtual PHI nodes during loop conversion (it only predicates scalar PHI nodes).  Of course this results in loops not converted, and not vectorized.
>> This patch firstly deletes the aforementioned checking code, then adds code handling such virtual PHIs during conversion.  The use of `any_mask_load_store' now is less ambiguous with this change, which allows further cleanups and patches fixing PR56541.
>> BTW, I think the newly fix at PR70725 on PHI nodes with only one argument is a special case covered by this change too.  Unfortunately I can't use replace_uses_by because I need to handle PHIs at use point after replacing too.  This doesn't really matter since we only care about virtual PHI, it's not possible to be used by anything other than IR itself.
>> Bootstrap and test on x86_64 and AArch64, is it OK if no regressions?
>
> Doesn't this undo my fix for degenerate non-virtual PHIs?
No, since we already support degenerate non-virtual PHIs in
predicate_scalar_phi, your fix is also for virtual PHIs handling.

>
> I believe we can just drop virtual PHIs and rely on
>
>   if (any_mask_load_store)
>     {
>       mark_virtual_operands_for_renaming (cfun);
>       todo |= TODO_update_ssa_only_virtuals;
>     }
>
> re-creating them from scratch.  To do better than that we'd simply
I tried this, simply enable above code for all cases can't resolve
verify_ssa issue.  I haven't look into the details, looks like ssa
def-use chain is corrupted in if-conversion if we don't process it
explicitly.  Maybe it's possible along with your below suggestions,
but we need to handle uses outside of loop too.

Thanks,
bin
> re-assign virtuals
> in combine_blocks in the new order (if there's any DEF, use the
> headers virtual def
> as first live vuse, assign that to any stmt with a vuse until you hit
> one with a vdef,
> then make that one life).
>
> Richard.
>
>> Thanks,
>> bin
>>
>> 2016-04-22  Bin Cheng  <bin.cheng@arm.com>
>>
>>         * tree-if-conv.c (if_convertible_phi_p): Remove check on special
>>         virtual PHI nodes.  Delete parameter.
>>         (if_convertible_loop_p_1): Delete argument to above function.
>>         (degenerate_virtual_phi): New function.
>>         (predicate_all_scalar_phis): Rename to ...
>>         (process_all_phis): ... here.  Call degenerate_virtual_phi to
>>         handle virtual PHIs.
>>         (combine_blocks): Call renamed function.
>>



More information about the Gcc-patches mailing list