Tôi gặp phải vấn đề tương tự sau khi biên dịch postgresql 8.1.4 với gcc 4.9.3.
Vấn đề dường như là cách postgres sử dụng để biểu diễn các mảng có độ dài thay đổi:
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 */
Trong một số trường hợp, đối với các vòng lặp truy cập 'giá trị', GCC giả định rằng chúng sẽ thực hiện nhiều nhất một lần lặp. Các vòng lặp như bên dưới (được trích xuất từ mã nguồn của postgres):
ii->ii_NumIndexAttrs = numKeys;
for (i = 0; i < numKeys; i++)
ii->ii_KeyAttrNumbers[i] = indexStruct->indkey.values[i];
cuối cùng có thể bị giảm thành một cái gì đó như:
ii->ii_NumIndexAttrs = numKeys;
if (numKeys)
ii->ii_KeyAttrNumbers[0] = indexStruct->indkey.values[0];
như được suy ra bằng cách xem trình hợp dịch được tạo cho nó:
.L161:
testl %r12d, %r12d
movl %r12d, 4(%rbx)
jle .L162
movzwl 40(%r13), %eax
movw %ax, 8(%rbx)
.L162:
Sự cố đã biến mất sau khi biên dịch lại các postgres với tính năng tối ưu hóa đó đã bị vô hiệu hóa bằng cách sử dụng -fno-Active-loop-Optimizations.