When trying to figure out whether it can re-materialize a memory
load before the use in

   <read> ... = equiv_mem;
   <write> dest = ...;
        <use>

IRA manages to get alias queries wrong by using true_dependence
(which is for read-after-write) instead of anti_dependence as
it wants to test whether the write invalidates equiv_mem.

Bootstrapped and tested on x86_64-unknown-linux-gnu, ok for trunk?
Ok for the 4.8 branch at this point?

Thanks,
Richard.

2013-05-23  Richard Biener  <rguent...@suse.de>

        PR rtl-optimization/57341
        * ira.c (validate_equiv_mem_from_store): Use anti_dependence
        instead of true_dependence.

        * gcc.dg/torture/pr57341.c: New testcase.

Index: gcc/ira.c
===================================================================
--- gcc/ira.c   (revision 199199)
+++ gcc/ira.c   (working copy)
@@ -2520,7 +2520,7 @@ validate_equiv_mem_from_store (rtx dest,
   if ((REG_P (dest)
        && reg_overlap_mentioned_p (dest, equiv_mem))
       || (MEM_P (dest)
-         && true_dependence (dest, VOIDmode, equiv_mem)))
+         && anti_dependence (equiv_mem, dest)))
     equiv_mem_modified = 1;
 }
 
Index: gcc/testsuite/gcc.dg/torture/pr57341.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr57341.c      (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr57341.c      (revision 0)
***************
*** 0 ****
--- 1,22 ----
+ /* { dg-do run } */ 
+ /* { dg-additional-options "-msse" { target sse2_runtime } } */
+ 
+ int a, d;
+ int *b = &a, **c;
+ int
+ main ()
+ {
+   int e;
+     {
+       int f[4];
+       for (d = 0; d < 4; d++)
+       f[d] = 1;
+       e = f[1];
+     }
+   int *g[28] = { };
+   *b = e;
+   c = &g[0];
+   if (a != 1)
+     __builtin_abort ();
+   return 0;
+ }

Reply via email to