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]

Fix PRE heuristic for partial insertions


Hi,
as observed on PR54717 we give up on some partial insertions because of
Skipping partial partial redundancy for expression {array_ref<pretmp_8,0,4>,mem_ref<0B>,xxtrt_46(D)}@.MEM_30(D) (0165) not partially anticipated on any to be optimized for speed edges

The logic here is wrong, the edges are tested by optimize_edge_for_speed_p and
it never returns false for any edge queried by tree-ssa-pre.c.

The problem is that the code looks for basic block BLOCK with partial
anticipance of given expression. Then it is trying to check that the path in
question is hot by looking for succesors of BLOCK that also do have partial
anticipance and are hot.

In this testcase BLOCK has two succesors - one without any anticipance and
one with full anticipance, so we give up regardless of the profile.  This patch
fixes it.

Unforutnately it seems that the missed vectorization PR is about is not fixed,
we give up for alignment issues now.  I am looking into this incrementally.

Bootstrapped/regtested x86_64-linux, also benchmarkes on spec2k and C++ benchmarks,
OK?

Honza

	PR tree-optimization/54717
	* tree-ssa-pre.c (do_partial_partial_insertion): Consider also edges
	with ANTIC_IN.

Index: tree-ssa-pre.c
===================================================================
*** tree-ssa-pre.c	(revision 193503)
--- tree-ssa-pre.c	(working copy)
*************** do_partial_partial_insertion (basic_bloc
*** 3525,3531 ****
  		 may cause regressions on the speed path.  */
  	      FOR_EACH_EDGE (succ, ei, block->succs)
  		{
! 		  if (bitmap_set_contains_value (PA_IN (succ->dest), val))
  		    {
  		      if (optimize_edge_for_speed_p (succ))
  			do_insertion = true;
--- 3525,3532 ----
  		 may cause regressions on the speed path.  */
  	      FOR_EACH_EDGE (succ, ei, block->succs)
  		{
! 		  if (bitmap_set_contains_value (PA_IN (succ->dest), val)
! 		      || bitmap_set_contains_value (ANTIC_IN (succ->dest), val))
  		    {
  		      if (optimize_edge_for_speed_p (succ))
  			do_insertion = true;


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