This is the mail archive of the 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]

CSE failing for SH due to weak alias analysis

This is in continuation to my earlier mails 
with subject "Improving alias analysis". Pls. see thread
This describes a simple case of CSE failure on SH due to weak alias

Consider following code snippet,

void func (double *d)
        int i = 0;

        for (i = 0; i < 20; i++)
                d[i+2] += d[i+1];
                d[i+1] += d[i];

Below is the RTL dump after CSE, (with -ml -m4 -O2 -fno-schedule-insns2),
'@' indicates 64-bit dereferencing here

1:	r164 = r163 +16
2:	r172 = r163 + 8
3:	r173 = @r164		; loading d[i+2]
4:	r174 = @r172		; loading d[i+1]
5:	r175 = r173 + r174	; add d[i+2] and d[i+1]
6:	@r164 = r175		; store result into d[i+2]
7:	r187 = @r172		;<-- LOADING d[i+1] AGAIN !!!!! 

line 7 need not dereference r172 again as the value is already loaded
in r174 by line 4. 
The *alias analysis tells CSE that r172 and r164 may alias*, and CSE
concludes that storing at r164 at line 6 invalidates any previous
load from r172.
But by looking at the lines 1,2 it is fairly obvious that *r172 and r164 do

So, this is a case of alias analysis (true_dependence() in alias.c) failing
while determining aliasing between two pointer REGs. This affects code
for SH very badly as SH does not allow reg+offset addressing mode for
This problem could also be there in IA64 and there might be other variants
the problem.

There seems to be NO existing alias code which correctly determines aliasing
between two such pointer REGs. base_alias_check() only checks the base
and memrefs_conflict_p() does NOTHING for cse. 

I am looking to improve the existing alias code so that it can handle
between two pointer REGs by looking at their history. 

I hope to come up with some solutions in my future mails. meanwhile any
suggestions from you people would feel great.


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