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][5/n] tree LIM TLC


This merges the tri-state caches (not computed, dependent, independent)
bitmaps to improve cache locality.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
Queued for 4.9.

Richard.

2013-03-12  Richard Biener  <rguenther@suse.de>

	* tree-ssa-loop-im.c (struct mem_ref): Merge indep_loop and
	dep_loop into loop_dependence, merge indep_ref and dep_ref
	into ref_dependence.
	(mem_ref_alloc): Adjust.
	(refs_independent_p): Likewise.
	(record_indep_loop): Likewise.
	(ref_indep_loop_p): Likewise.

Index: trunk/gcc/tree-ssa-loop-im.c
===================================================================
*** trunk.orig/gcc/tree-ssa-loop-im.c	2013-03-12 14:18:44.000000000 +0100
--- trunk/gcc/tree-ssa-loop-im.c	2013-03-12 14:27:37.054487784 +0100
*************** typedef struct mem_ref
*** 127,147 ****
  				/* The locations of the accesses.  Vector
  				   indexed by the loop number.  */
  
!   /* The following sets are computed on demand.  We keep both set and
!      its complement, so that we know whether the information was
!      already computed or not.  */
!   bitmap indep_loop;		/* The set of loops in that the memory
! 				   reference is independent, meaning:
! 				   If it is stored in the loop, this store
! 				     is independent on all other loads and
! 				     stores.
! 				   If it is only loaded, then it is independent
! 				     on all stores in the loop.  */
!   bitmap dep_loop;		/* The complement of INDEP_LOOP.  */
! 
!   bitmap indep_ref;		/* The set of memory references on that
! 				   this reference is independent.  */
!   bitmap dep_ref;		/* The complement of INDEP_REF.  */
  } *mem_ref_p;
  
  
--- 127,145 ----
  				/* The locations of the accesses.  Vector
  				   indexed by the loop number.  */
  
!   /* The following sets are computed on demand.  We use two bits per
!      information to represent the not-computed state.  */
! 
!   /* The set of loops in that the memory reference is independent
!      (2 * loop->num) or dependent (2 * loop->num + 1) in.
!      If it is stored in the loop, this store is independent on all other
!      loads and stores.
!      If it is only loaded, then it is independent on all stores in the loop.  */
!   bitmap loop_dependence;		
! 
!   /* The set of memory references on that this reference is independent
!      (2 * mem->id) or dependent (2 * mem->id + 1).  */
!   bitmap ref_dependence;
  } *mem_ref_p;
  
  
*************** mem_ref_alloc (tree mem, unsigned hash,
*** 1481,1490 ****
    ref->id = id;
    ref->hash = hash;
    ref->stored = BITMAP_ALLOC (&lim_bitmap_obstack);
!   ref->indep_loop = BITMAP_ALLOC (&lim_bitmap_obstack);
!   ref->dep_loop = BITMAP_ALLOC (&lim_bitmap_obstack);
!   ref->indep_ref = BITMAP_ALLOC (&lim_bitmap_obstack);
!   ref->dep_ref = BITMAP_ALLOC (&lim_bitmap_obstack);
    ref->accesses_in_loop.create (0);
  
    return ref;
--- 1479,1486 ----
    ref->id = id;
    ref->hash = hash;
    ref->stored = BITMAP_ALLOC (&lim_bitmap_obstack);
!   ref->loop_dependence = BITMAP_ALLOC (&lim_bitmap_obstack);
!   ref->ref_dependence = BITMAP_ALLOC (&lim_bitmap_obstack);
    ref->accesses_in_loop.create (0);
  
    return ref;
*************** refs_independent_p (mem_ref_p ref1, mem_
*** 2178,2186 ****
        ref2 = tem;
      }
  
!   if (bitmap_bit_p (ref1->indep_ref, ref2->id))
      return true;
!   if (bitmap_bit_p (ref1->dep_ref, ref2->id))
      return false;
  
    if (dump_file && (dump_flags & TDF_DETAILS))
--- 2174,2182 ----
        ref2 = tem;
      }
  
!   if (bitmap_bit_p (ref1->ref_dependence, 2 * ref2->id))
      return true;
!   if (bitmap_bit_p (ref1->ref_dependence, 2 * ref2->id + 1))
      return false;
  
    if (dump_file && (dump_flags & TDF_DETAILS))
*************** refs_independent_p (mem_ref_p ref1, mem_
*** 2190,2203 ****
    if (mem_refs_may_alias_p (ref1->mem, ref2->mem,
  			    &memory_accesses.ttae_cache))
      {
!       bitmap_set_bit (ref1->dep_ref, ref2->id);
        if (dump_file && (dump_flags & TDF_DETAILS))
  	fprintf (dump_file, "dependent.\n");
        return false;
      }
    else
      {
!       bitmap_set_bit (ref1->indep_ref, ref2->id);
        if (dump_file && (dump_flags & TDF_DETAILS))
  	fprintf (dump_file, "independent.\n");
        return true;
--- 2186,2199 ----
    if (mem_refs_may_alias_p (ref1->mem, ref2->mem,
  			    &memory_accesses.ttae_cache))
      {
!       bitmap_set_bit (ref1->ref_dependence, 2 * ref2->id + 1);
        if (dump_file && (dump_flags & TDF_DETAILS))
  	fprintf (dump_file, "dependent.\n");
        return false;
      }
    else
      {
!       bitmap_set_bit (ref1->ref_dependence, 2 * ref2->id);
        if (dump_file && (dump_flags & TDF_DETAILS))
  	fprintf (dump_file, "independent.\n");
        return true;
*************** static void
*** 2211,2219 ****
  record_indep_loop (struct loop *loop, mem_ref_p ref, bool indep)
  {
    if (indep)
!     bitmap_set_bit (ref->indep_loop, loop->num);
    else
!     bitmap_set_bit (ref->dep_loop, loop->num);
  }
  
  /* Returns true if REF is independent on all other memory references in
--- 2207,2215 ----
  record_indep_loop (struct loop *loop, mem_ref_p ref, bool indep)
  {
    if (indep)
!     bitmap_set_bit (ref->loop_dependence, 2 * loop->num);
    else
!     bitmap_set_bit (ref->loop_dependence, 2 * loop->num + 1);
  }
  
  /* Returns true if REF is independent on all other memory references in
*************** ref_indep_loop_p (struct loop *loop, mem
*** 2256,2264 ****
  {
    bool ret;
  
!   if (bitmap_bit_p (ref->indep_loop, loop->num))
      return true;
!   if (bitmap_bit_p (ref->dep_loop, loop->num))
      return false;
  
    ret = ref_indep_loop_p_1 (loop, ref);
--- 2252,2260 ----
  {
    bool ret;
  
!   if (bitmap_bit_p (ref->loop_dependence, 2 * loop->num))
      return true;
!   if (bitmap_bit_p (ref->loop_dependence, 2 * loop->num + 1))
      return false;
  
    ret = ref_indep_loop_p_1 (loop, ref);


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