This exploits symmetry in memory reference disambiguation.  That
should reduce the number of queries and space needed in the
cache bitmaps.

Bootstrapped and tested on x86_64-unknown-linux-gnu.

Richard.

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

        PR tree-optimization/39326
        * tree-ssa-loop-im.c (refs_independent_p): Exploit symmetry.

Index: trunk/gcc/tree-ssa-loop-im.c
===================================================================
*** trunk.orig/gcc/tree-ssa-loop-im.c   2013-03-12 11:41:58.000000000 +0100
--- trunk/gcc/tree-ssa-loop-im.c        2013-03-12 11:44:11.507745552 +0100
*************** ref_always_accessed_p (struct loop *loop
*** 2163,2177 ****
  static bool
  refs_independent_p (mem_ref_p ref1, mem_ref_p ref2)
  {
!   if (ref1 == ref2
!       || bitmap_bit_p (ref1->indep_ref, ref2->id))
      return true;
!   if (bitmap_bit_p (ref1->dep_ref, ref2->id))
!     return false;
    if (!MEM_ANALYZABLE (ref1)
        || !MEM_ANALYZABLE (ref2))
      return false;
  
    if (dump_file && (dump_flags & TDF_DETAILS))
      fprintf (dump_file, "Querying dependency of refs %u and %u: ",
             ref1->id, ref2->id);
--- 2163,2188 ----
  static bool
  refs_independent_p (mem_ref_p ref1, mem_ref_p ref2)
  {
!   if (ref1 == ref2)
      return true;
! 
    if (!MEM_ANALYZABLE (ref1)
        || !MEM_ANALYZABLE (ref2))
      return false;
  
+   /* Reference dependence in a loop is symmetric.  */
+   if (ref1->id > ref2->id)
+     {
+       mem_ref_p tem = ref1;
+       ref1 = ref2;
+       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))
      fprintf (dump_file, "Querying dependency of refs %u and %u: ",
             ref1->id, ref2->id);
*************** refs_independent_p (mem_ref_p ref1, mem_
*** 2180,2186 ****
                            &memory_accesses.ttae_cache))
      {
        bitmap_set_bit (ref1->dep_ref, ref2->id);
-       bitmap_set_bit (ref2->dep_ref, ref1->id);
        if (dump_file && (dump_flags & TDF_DETAILS))
        fprintf (dump_file, "dependent.\n");
        return false;
--- 2191,2196 ----
*************** refs_independent_p (mem_ref_p ref1, mem_
*** 2188,2194 ****
    else
      {
        bitmap_set_bit (ref1->indep_ref, ref2->id);
-       bitmap_set_bit (ref2->indep_ref, ref1->id);
        if (dump_file && (dump_flags & TDF_DETAILS))
        fprintf (dump_file, "independent.\n");
        return true;
--- 2198,2203 ----

Reply via email to