We get the following failures on powerpc64-suse-linux:
FAIL: gcc.dg/vect/vect-46.c scan-tree-dump-times vectorized 1 loops 1
FAIL: gcc.dg/vect/vect-50.c scan-tree-dump-times vectorized 1 loops 1
FAIL: gcc.dg/vect/vect-52.c scan-tree-dump-times vectorized 1 loops 1
FAIL: gcc.dg/vect/vect-58.c scan-tree-dump-times vectorized 1 loops 1
FAIL: gcc.dg/vect/vect-60.c scan-tree-dump-times vectorized 1 loops 1
FAIL: gcc.dg/vect/vect-77.c scan-tree-dump-times vectorized 1 loops 1
FAIL: gcc.dg/vect/vect-77a.c scan-tree-dump-times vectorized 1 loops 1
The access function that the evolution analyzer returns for the pointers in
these loops when the compiler is configured for 64bit (powerpc64-suse-linux)
is more complicated than when configured for 32bit (powerpc-suse-linux):
When the compiler is configured for 32bit, the pointer arithmetic in the loop
looks like:
# i_1 = PHI <i_24(5), 0(3)>;
<L0>:;
i.4_6 = (unsigned int) i_1;
D.1588_7 = i.4_6 * 4;
D.1589_8 = (afloat * restrict) D.1588_7;
D.1591_15 = D.1589_8 + pb_14;
... = *D.1591_15;
...
i_24 = i_1 + 1;
if (n_3 > i_24) goto <L9>; else goto <L10>;
the access function that is computed for the pointer is:
Access function of ptr: {pb_14, +, 4B}_1
which is simple enough, and the loop is vectorized.
On the other hand, when the compiler is configured for 64bit, the pointer
arithmetic in the loop looks like:
# i_1 = PHI <i_24(5), 0(3)>;
<L0>:;
D.1816_6 = (long unsigned int) i_1;
D.1817_7 = D.1816_6 * 4;
D.1818_8 = (afloat * restrict) D.1817_7;
D.1820_15 = D.1818_8 + pb_14;
... = *D.1820_15;
...
i_24 = i_1 + 1;
if (n_3 > i_24) goto <L9>; else goto <L10>;
and in this case the access function that is computed for the pointer is:
Access function of ptr: (afloat * restrict) ((long unsigned int) {0, +, 1}_1 *
4) + pb_14
The vectorizer does not handle such access-functions at the moment, and
thereofore fails to vectorize the loop:
loop at vect-46.c:37: not vectorized: pointer access is not simple.
loop at vect-46.c:37: not vectorized: unhandled data ref: D.1821_16 = *D.1820_15
loop at vect-46.c:37: bad data references.
These loops should be marked xfail for now for ppc64-linux.
One of the following would allow vectorizing these loops:
- The evolution analyzer knows to ignore the cast to (unsigned int) when it
builds the access function, but it doesn't ignore the cast to (long unsigned
int). If this cast can be avoided when building the access function, it would
be simple enough to handle later on
- Enhance the vectorizer to digest such access-functions
--
Summary: FAILs to vectorize testcases on ppc64-linux
Product: gcc
Version: 4.0.0
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: regression
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: dorit at il dot ibm dot com
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: powerpc64-suse-linux
GCC host triplet: powerpc64-suse-linux
GCC target triplet: powerpc64-suse-linux
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18403