On Fri, Apr 22, 2016 at 11:25 AM, Richard Biener <richard.guent...@gmail.com> wrote: > On Fri, Apr 22, 2016 at 12:07 PM, Bin Cheng <bin.ch...@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.ch...@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. >>