Re: Patch fixing 3.3 bug PR 9745 and PR 10021

Dale Johannesen <[email protected]>
Newsgroups gmane.comp.gcc.devel,gmane.comp.gcc.prs
Message-ID <[email protected]>
On Wednesday, July 2, 2003, at 10:15  AM, Mark Mitchell wrote:
> Independent of what targets the bug affects, this reinforces my key
> point: that someone is going to have to work hard to fix this aliasing
> issue, and until that point we have to choose between wrong code and
> slow code.
>
> Personally, I'd choose slow code.  Not only is that better for our
> users, some of whom use GCC to build very critical systems, but it 
> would
> also encourage someone to go solve the optimization problem.

Perhaps at this point there is some interest in my compromise patch 
below,
although it's not the sort of thing I'd normally submit.
This is not a clean fix for the entire problem.  It does fix some cases 
of the
problem, without introducing performance regressions.   The cases it 
fixes
includes two we found running SPEC with IMI, and should fix the ones in 
10021
and 9745, although I haven't tried them.

Index: alias.c
===================================================================
RCS file: /cvs/repository/CoreTools/gcc3/gcc/alias.c,v
retrieving revision 1.18.2.1.2.3
retrieving revision 1.18.2.1.2.4
diff -u -d -b -w -c -3 -p -r1.18.2.1.2.3 -r1.18.2.1.2.4
cvs server: conflicting specifications of output style
*** alias.c     2003/06/04 15:49:22     1.18.2.1.2.3
--- alias.c     2003/06/18 21:13:49     1.18.2.1.2.4
*************** true_dependence (mem, mem_mode, x, varie
*** 2158,2163 ****
--- 2158,2173 ----
                    && CONSTANT_POOL_ADDRESS_P (base))))
       return 0;

+   /* If MEM_EXPR info is available and indicates that
+      both refs refer to the same symbol, they interfere. */
+   if (MEM_EXPR (mem) && MEM_EXPR (mem) == MEM_EXPR (x))
+     {
+       if (MEM_OFFSET (mem) == 0 || MEM_OFFSET (x) == 0)
+        return 1;
+       if (rtx_equal_p (MEM_OFFSET (mem), MEM_OFFSET (x)))
+        return 1;
+     }
+
     if (! base_alias_check (x_addr, mem_addr, GET_MODE (x), mem_mode))
       return 0;

*************** canon_true_dependence (mem, mem_mode, me
*** 2229,2234 ****
--- 2239,2254 ----
       return 0;

     x_addr = get_addr (XEXP (x, 0));
+
+   /* If MEM_EXPR info is available and indicates that
+      both refs refer to the same symbol, they interfere. */
+   if (MEM_EXPR (mem) && MEM_EXPR (mem) == MEM_EXPR (x))
+     {
+       if (MEM_OFFSET (mem) == 0 || MEM_OFFSET (x) == 0)
+        return 1;
+       if (rtx_equal_p (MEM_OFFSET (mem), MEM_OFFSET (x)))
+        return 1;
+     }

     if (! base_alias_check (x_addr, mem_addr, GET_MODE (x), mem_mode))
       return 0;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.