[Bug tree-optimization/77654] New: restrict pointer attribute not preserved with -fprefetch-loop-arrays

doug.gilmore at imgtec dot com gcc-bugzilla@gcc.gnu.org
Mon Sep 19 21:25:00 GMT 2016


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77654

            Bug ID: 77654
           Summary: restrict pointer attribute not preserved with
                    -fprefetch-loop-arrays
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: doug.gilmore at imgtec dot com
  Target Milestone: ---

Compiling the test example:

void daxpy(int n, double da, double * __restrict dx, double * __restrict dy)
{
        int i;

        for (i = 0;i < n; i++) {
                dy[i] = dy[i] + da*dx[i];
        }
}

via:

mips-img-linux-gnu-gcc -fprefetch-loop-arrays daxpy.c -c -O2 -save-temps
-fsched-verbose=9 -fdump-rtl-sched2

The following code is generated for the main loop:

$L4:
        ldc1    $f2,0($5)
        pref    6,0($2)
        ldc1    $f8,-120($2)
        addiu   $2,$2,32
        ldc1    $f6,-144($2)
        addiu   $5,$5,32
        ldc1    $f4,-136($2)
        addiu   $3,$3,4
        maddf.d $f8,$f2,$f0
        ldc1    $f2,-128($2)
        sdc1    $f8,-152($2)
        ldc1    $f1,-24($5)
        maddf.d $f6,$f0,$f1
        sdc1    $f6,-144($2)
        ldc1    $f1,-16($5)
        maddf.d $f4,$f0,$f1
        sdc1    $f4,-136($2)
        ldc1    $f1,-8($5)
        maddf.d $f2,$f0,$f1
        bne     $3,$8,$L4
        sdc1    $f2,-128($2)

Due to the __restrict attributes on the pointer declarations, after
scheduling we should see that loads through $5 should move above the
stores through $2.  However, during the transformation done by the
phase that is enabled by -fprefetch-loop-arrays, the points-to
information is lost.  This prevents the loads to move above the stores
during scheduling.

The attached uses logic borrowed from IVS phase:

0002-Ensure-points-to-information-is-maintained-for-prefe.patch

After applying the patch, the points-to information is maintained,
which results in good code being generated after scheduling (which is
very important when running on in-order processors):

$L4:
        addiu   $5,$5,32
        ldc1    $f8,-120($2)
        ldc1    $f6,-112($2)
        pref    6,0($2)
        ldc1    $f4,-104($2)
        addiu   $3,$3,4
        ldc1    $f2,-96($2)
        addiu   $2,$2,32
        ldc1    $f7,-32($5)
        ldc1    $f5,-24($5)
        ldc1    $f3,-16($5)
        ldc1    $f1,-8($5)
        maddf.d $f8,$f7,$f0
        maddf.d $f6,$f0,$f5
        maddf.d $f4,$f0,$f3
        maddf.d $f2,$f0,$f1
        sdc1    $f8,-152($2)
        sdc1    $f6,-144($2)
        sdc1    $f4,-136($2)
        sdc1    $f2,-128($2)
        bnec    $3,$8,$L4

I am not sure what to do about a test case.  One possibility is to
commit some of the tracing in debugging patch:

0001-Add-more-tracing-for-missing-points-to-information.patch

and we could scan for the RE "pi. is NULL", in the dump file
created by -fdump-rtl-sched2.


More information about the Gcc-bugs mailing list