Сблъсках се със същия проблем, след като компилирах postgresql 8.1.4 с gcc 4.9.3.
Проблемът изглежда е в начина, по който postgres използва за представяне на масиви с променлива дължина:
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 */
В някои случаи, за цикли, достъпващи „стойности“, GCC приема, че те ще направят най-много една итерация. Цикли като този по-долу (извлечен от изходния код на postgres):
ii->ii_NumIndexAttrs = numKeys;
for (i = 0; i < numKeys; i++)
ii->ii_KeyAttrNumbers[i] = indexStruct->indkey.values[i];
в крайна сметка може да бъде намален до нещо като:
ii->ii_NumIndexAttrs = numKeys;
if (numKeys)
ii->ii_KeyAttrNumbers[0] = indexStruct->indkey.values[0];
както се заключава чрез разглеждане на генерирания за него асемблер:
.L161:
testl %r12d, %r12d
movl %r12d, 4(%rbx)
jle .L162
movzwl 40(%r13), %eax
movw %ax, 8(%rbx)
.L162:
Проблемът изчезна след повторно компилиране на postgres с тази деактивирана оптимизация с помощта на -fno-aggressive-loop-optimizations.