This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][5/n] tree LIM TLC
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 12 Mar 2013 16:16:57 +0100 (CET)
- Subject: [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);