postgresql8.1.4をgcc4.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 */
場合によっては、「値」にアクセスするforループの場合、GCCは最大で1回の反復を実行すると想定します。以下のようなループ(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:
-fno-aggressive-loop-optimizationsを使用して最適化を無効にしてpostgresを再コンパイルすると、問題は解決しました。