------- Comment #3 from rask at gcc dot gnu dot org 2007-09-19 16:12 ------- Technically, the code is undefined (overflow of signed integer val). Using -O2 -fno-strict-overflow results in a loop test, but the code looks dubious:
table_init: pushl %ebp # 51 *pushsi2 [length = 1] movl $117835012, %eax # 20 *movsi_1/1 [length = 5] movl %esp, %ebp # 52 *movsi_1/1 [length = 2] movl $2, %edx # 21 *movsi_1/1 [length = 5] movl 8(%ebp), %ecx # 14 *movsi_1/1 [length = 3] movl $50462976, (%ecx) # 19 *movsi_1/2 [length = 6] .p2align 4,,7 .L2: movl %eax, -4(%ecx,%edx,4) # 24 *movsi_1/2 [length = 4] addl $67372036, %eax # 26 *addsi_1/1 [length = 6] addl $1, %edx # 27 *addsi_1/1 [length = 3] cmpl $67305984, %eax # 29 *cmpsi_1_insn/1 [length = 6] jne .L2 # 30 *jcc_1 [length = 2] popl %ebp # 55 popsi1 [length = 1] ret # 56 return_internal [length = 1] -O2 -fno-tree-loop-optimize produces code which looks like it might even loop the intended number of times: table_init: pushl %ebp # 43 *pushsi2 [length = 1] movl $1, %eax # 12 *movsi_1/1 [length = 5] movl %esp, %ebp # 44 *movsi_1/1 [length = 2] movl $117835012, %edx # 13 *movsi_1/1 [length = 5] movl 8(%ebp), %ecx # 6 *movsi_1/1 [length = 3] movl $50462976, (%ecx) # 11 *movsi_1/2 [length = 6] .p2align 4,,7 .L2: movl %edx, (%ecx,%eax,4) # 16 *movsi_1/2 [length = 3] addl $1, %eax # 20 *addsi_1/1 [length = 3] addl $67372036, %edx # 18 *addsi_1/1 [length = 6] cmpl $63, %eax # 21 *cmpsi_1_insn/1 [length = 3] jle .L2 # 22 *jcc_1 [length = 2] popl %ebp # 47 popsi1 [length = 1] ret # 48 return_internal [length = 1] -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33498