------- Comment #4 from ebotcazou at gcc dot gnu dot org 2008-12-17 17:35 ------- Vlad, I'd again need your help for this one, it's apparently a stack slot sharing problem. Ada testcase and instructions have been filed.
The problematic excerpt of assembly is: movl %esi, -28(%ebp) #, %sfp -28(%ebp) <--- tfirst_fpad subl $1, %esi #, q__move__B_4__L_5__T90b___U cmpl %esi, %eax # q__move__B_4__L_5__T90b___U, i jg .L53 #, movzbl -57(%ebp), %ebx # %sfp, movl -36(%ebp), %esi # %sfp, movb %bl, (%esi) #, je .L53 #, leal 1(%eax), %ebx #, addl $1, %esi #, ivtmp.268 movl %ecx, -52(%ebp) # j, %sfp movl %ebx, %ecx #, ivtmp.266 movzbl -57(%ebp), %ebx # %sfp, movl %edi, -48(%ebp) # prephitmp.345, %sfp movl -28(%ebp), %edi # %sfp, tfirst_fpad movl %eax, -44(%ebp) # i, %sfp movl %esi, %eax # ivtmp.268, ivtmp.268 movl %edx, %esi # tlast.59, tlast.59 movb %bl, -40(%ebp) #, %sfp movl -64(%ebp), %ebx # %sfp, source movzbl -40(%ebp), %edx # %sfp, pad .p2align 4,,7 .p2align 3 .L54: addl $1, %ecx #, ivtmp.266 movb %dl, (%eax) # pad,* ivtmp.268 addl $1, %eax #, ivtmp.268 cmpl %edi, %ecx # tfirst_fpad, ivtmp.266 jne .L54 #, movb %dl, -28(%ebp) # pad, %sfp -28(%ebp) <--- pad movl -48(%ebp), %edi # %sfp, prephitmp.345 movl %esi, %edx # tlast.59, tlast.59 movl %ebx, -64(%ebp) # source, %sfp movzbl -28(%ebp), %ebx # %sfp, movl -52(%ebp), %ecx # %sfp, j movl -44(%ebp), %eax # %sfp, i movb %bl, -57(%ebp) #, %sfp .L53: movl -28(%ebp), %esi # %sfp, -28(%ebp) ---> tfirst_fpad The shared slot is -28(%ebp) and the second line with the <--- overwrites the value written by the first <--- line, which is needed by the ---> line. If you change the second line to make it use -57(%ebp), with proper reloading a few lines below, the test passes. The problematic insn is insn 1086 1085 1087 127 (set (mem/c:QI (plus:SI (reg/f:SI 6 bp) (const_int -28 [0xffffffe4])) [13 %sfp+-4 S1 A32]) (reg/v:QI 1 dx [orig:192 pad ] [192])) 50 {*movqi_1} (nil)) which originally was (insn 1086 0 0 (set (reg/v:QI 452 [orig:192 pad ] [192]) (reg/v:QI 344 [orig:192 pad ] [192])) -1 (nil)) so the problematic pseudo seems to be 452: scanning new insn with uid = 1082. Creating newreg=452 from oldreg=192 Creating temporary allocno a379r452 and I'm under the impression that it's wrongly coalesced to pseudo 275: Coalescing spilled allocnos a379r452->a39r275 -- ebotcazou at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |vmakarov at redhat dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38495