जीसीसी 4.9.3 के साथ पोस्टग्रेस्क्ल 8.1.4 को संकलित करने के बाद मैं उसी समस्या में भाग गया।
समस्या यह प्रतीत होती है कि जिस तरह से पोस्टग्रेज चर लंबाई सरणियों का प्रतिनिधित्व करने के लिए उपयोग करता है:
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 */
कुछ मामलों में, 'मान' तक पहुंचने वाले लूप के लिए, जीसीसी मानता है कि वे अधिक से अधिक एक पुनरावृत्ति करेंगे। नीचे की तरह लूप्स (पोस्टग्रेज के सोर्स कोड से निकाले गए):
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:
-fno-aggressive-loop-optimizations का उपयोग करके उस ऑप्टिमाइज़ेशन को अक्षम करके पोस्टग्रेज़ को फिर से संकलित करने के बाद समस्या दूर हो गई।