On Tue, Apr 15, 2008 at 12:01 PM, Bingfeng Mei <[EMAIL PROTECTED]> wrote:
> Hello,
>
> I am porting to GCC 4.3.0 for our VLIW processor, and try to utilize
> improved restrict keyword support. Somehow, I find for normal data
> types, including vector types up to 8bytes, the restrict keyword works
> just fine. But for wider vector, such as 4 32-bit word type, the
> restrict keyword doesn't work any more. For example, for the first two
> following functions, compiler can unroll (-funroll-all-loops) loops and
> produces good schedule, where load instructions of next iteration can be
> moved beyond store instruction of this iteration. But for the third
> example, it is different. As suggested in .sched2 file, the compiler can
> only resolve dependence of next load instructions after store
> instruction of this iteration is scheduled. I tried to print out
> tree-ssa files by using -fdump-tree-all. Unliked previous GCC (4.2.1),
> the information in those files is not helpful at all.
How not?
If we don't know, we can't fix them :)
> I don't know
> where to look at now. Could someone point me some files/functions/data
> structures by which restrict keyword is used and passed to dependence
> anaylsis part? Thanks in advance.
You mean the dependence analysis used by the scheduler?
That stuff is in sched-deps.c
At the RTL level, restrict ends up being transformed into a different alias set.
At the tree level, restrict info is not used very much right now.
> Example code:
>
> typedef int V4W __attribute__ ((vector_size (16)));
> typedef int V2W __attribute__ ((vector_size (8)));
>
> void tst(int * restrict a, int * restrict b, int * restrict c)
> {
> int i;
> for(i = 0; i < 256; i++){
> c[i] = a[i] + b[i];
> }
> }
>
> void tst2(int * restrict a, int * restrict b, int * restrict c)
> {
> int i;
> for(i = 0; i < 256; i++){
> c[i] = a[i] + b[i];
> }
> }
>
> void tst3(V4W * restrict a, V4W * restrict b, V4W * restrict c)
> {
> int i;
> for(i = 0; i < 256; i++){
> c[i] = a[i] + b[i];
> }
> }
>
>
>