Ich bin auf das gleiche Problem gestoßen, nachdem ich postgresql 8.1.4 mit gcc 4.9.3 kompiliert habe.
Das Problem scheint die Art und Weise zu sein, wie Postgres verwendet wird, um Arrays mit variabler Länge darzustellen:
typedef struct
{
int32 size; /* these fields must match ArrayType! */
int ndim;
int flags;
Oid elemtype;
int dim1;
int lbound1;
int2 values[1]; /* VARIABLE LENGTH ARRAY */
} int2vector; /* VARIABLE LENGTH STRUCT */
In einigen Fällen geht GCC bei for-Schleifen, die auf „Werte“ zugreifen, davon aus, dass sie höchstens eine Iteration durchführen. Schleifen wie die folgende (aus dem Quellcode von Postgres extrahiert):
ii->ii_NumIndexAttrs = numKeys;
for (i = 0; i < numKeys; i++)
ii->ii_KeyAttrNumbers[i] = indexStruct->indkey.values[i];
könnte am Ende auf etwas wie:
reduziert werdenii->ii_NumIndexAttrs = numKeys;
if (numKeys)
ii->ii_KeyAttrNumbers[0] = indexStruct->indkey.values[0];
wie aus dem dafür generierten Assembler abgeleitet:
.L161:
testl %r12d, %r12d
movl %r12d, 4(%rbx)
jle .L162
movzwl 40(%r13), %eax
movw %ax, 8(%rbx)
.L162:
Das Problem verschwand nach der Neukompilierung von Postgres mit deaktivierter Optimierung durch Verwendung von -fno-aggressive-loop-optimizations.