This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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?

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.

Attachment: virtual-phi-ifconv-20160422.txt
Description: virtual-phi-ifconv-20160422.txt


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]