[Bug tree-optimization/68892] New: [6 Regression] Excessive dead loads produced by BB vectorization
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Dec 14 11:42:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68892
Bug ID: 68892
Summary: [6 Regression] Excessive dead loads produced by BB
vectorization
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: rguenth at gcc dot gnu.org
Target Milestone: ---
double a[1024][1024];
double b[1024];
void foo(void)
{
b[0] = a[0][0];
b[1] = a[1][0];
b[2] = a[2][0];
b[3] = a[3][0];
}
is vectorized using
t.c:10:1: note: Load permutation 0 1024 2048 3072
t.c:10:1: note: Final SLP tree for instance:
t.c:10:1: note: node
t.c:10:1: note: stmt 0 b[0] = _2;
t.c:10:1: note: stmt 1 b[1] = _4;
t.c:10:1: note: stmt 2 b[2] = _6;
t.c:10:1: note: stmt 3 b[3] = _8;
t.c:10:1: note: node
t.c:10:1: note: stmt 0 _2 = a[0][0];
t.c:10:1: note: stmt 1 _4 = a[1][0];
t.c:10:1: note: stmt 2 _6 = a[2][0];
t.c:10:1: note: stmt 3 _8 = a[3][0];
where our "stupid" load permutation support first loads all vectors of
the group (of size 3073) and then permutes it, using only 4 vectors of it.
For vectors with more than two elements the "need more than two vectors"
part of load permutation support "fixes" this but for two elements nothing
prevents this stupidity (it's all dead code but IVOPTs for example can take
ages processing the dead loads)
<bb 2>:
_2 = a[0][0];
_4 = a[1][0];
_6 = a[2][0];
vect__2.5_10 = MEM[(double *)&a];
_11 = &a[0][0] + 16;
vect__2.6_12 = MEM[(double *)_11];
_13 = _11 + 16;
vect__2.7_14 = MEM[(double *)_13];
_15 = _13 + 16;
vect__2.8_16 = MEM[(double *)_15];
...
_3079 = _3077 + 16;
vect__2.1540_3080 = MEM[(double *)_3079];
_3081 = _3079 + 16;
vect__2.1541_3082 = MEM[(double *)_3081];
_3083 = _3081 + 18446744073709551608;
vect__2.1542_3084 = VEC_PERM_EXPR <vect__2.5_10, vect__2.517_1034, { 0, 2 }>;
vect__2.1543_3085 = VEC_PERM_EXPR <vect__2.1029_2058, vect__2.1541_3082, { 0,
2 }>;
_8 = a[3][0];
MEM[(double *)&b] = vect__2.1542_3084;
_3087 = &b[0] + 16;
MEM[(double *)_3087] = vect__2.1543_3085;
return;
More information about the Gcc-bugs
mailing list