------- Comment #2 from rguenth at gcc dot gnu dot org 2006-02-15 10:58 ------- Confirmed. This are the two inner loops:
4.0.2: .L6: movl -4(%esi), %ecx movl (%edx), %eax cmpl %eax, %ecx jle .L7 movl %eax, -4(%esi) movl %ecx, (%edx) .L7: incl %ebx addl $4, %edx cmpl %edi, %ebx jne .L6 4.1.0: .L6: movl 8(%ebp), %ebx movl 4(%edx), %ecx movl -4(%ebx,%eax,4), %ebx movl %ecx, -20(%ebp) cmpl %ecx, %ebx movl %ebx, -16(%ebp) jle .L7 movl 8(%ebp), %ebx movl %ecx, -4(%ebx,%eax,4) movl -16(%ebp), %ecx movl %ecx, 4(%edx) .L7: incl -24(%ebp) addl $4, %edx cmpl -24(%ebp), %esi jle .L12 jmp .L6 Optimized tree-dumps have for 4.0.2: <L1>:; D.2291 = *((int *) ivtmp.31 + -4B); D.2339 = (int *) ivtmp.22; D.2296 = *D.2339; if (D.2291 > D.2296) goto <L2>; else goto <L3>; <L2>:; *((int *) ivtmp.31 + -4B) = D.2296; *D.2339 = D.2291; <L3>:; ivtmp.19 = ivtmp.19 + 1; ivtmp.22 = ivtmp.22 + 4B; if (ivtmp.19 != (unsigned int) cnt - (unsigned int) j) goto <L1>; else goto <L8>; and for 4.1.0: <L1>:; D.2434 = MEM[base: lst, index: D.2540, step: 4B, offset: -4B]; D.2534 = (int *) ivtmp.49; D.2439 = MEM[base: D.2534, offset: 4B]; if (D.2434 > D.2439) goto <L2>; else goto <L3>; <L2>:; MEM[base: lst, index: D.2540, step: 4B, offset: -4B] = D.2439; MEM[base: D.2534, offset: 4B] = D.2434; <L3>:; j.56 = j.56 + 1; ivtmp.49 = ivtmp.49 + 4B; if (cnt > j.56) goto <L1>; else goto <L8>; which doesn't look too much worse. -- rguenth at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 Last reconfirmed|0000-00-00 00:00:00 |2006-02-15 10:58:11 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26290