Ho riscontrato lo stesso problema dopo aver compilato postgresql 8.1.4 con gcc 4.9.3.
Il problema sembra essere il modo in cui Postgres usa per rappresentare gli array a lunghezza variabile:
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 alcuni casi, per i loop che accedono a "valori", GCC presume che eseguiranno al massimo un'iterazione. Loop come quello qui sotto (estratto dal codice sorgente di Postgres):
ii->ii_NumIndexAttrs = numKeys;
for (i = 0; i < numKeys; i++)
ii->ii_KeyAttrNumbers[i] = indexStruct->indkey.values[i];
potrebbe finire per essere ridotto a qualcosa del tipo:
ii->ii_NumIndexAttrs = numKeys;
if (numKeys)
ii->ii_KeyAttrNumbers[0] = indexStruct->indkey.values[0];
come dedotto guardando l'assembler generato per esso:
.L161:
testl %r12d, %r12d
movl %r12d, 4(%rbx)
jle .L162
movzwl 40(%r13), %eax
movw %ax, 8(%rbx)
.L162:
Il problema è scomparso dopo aver ricompilato postgres con quell'ottimizzazione disabilitata utilizzando -fno-aggressive-loop-optimizations.