https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63534

--- Comment #33 from Stupachenko Evgeny <evstupac at gmail dot com> ---
Created attachment 33769
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33769&action=edit
patch includes 3 patches fixing darwin bootstrap

It looks like data constant LC0 generated from pushtf not treated as GOT
dependent or treated as unchanged (assuming it depends on unchanged ebx) at
darwin reload pass.

RELOAD PASS:

(insn/f 106 8 2 2 (parallel [ 
            (set (reg:SI 0 ax [98]) 
                (unspec:SI [ 
                        (const_int 0 [0]) 
                    ] UNSPEC_SET_GOT)) 
            (clobber (reg:CC 17 flags)) 
        ]) 679 {set_got} 
     (expr_list:REG_EQUIV (unspec:SI [ 
                (const_int 0 [0]) 
            ] UNSPEC_SET_GOT) 
        (expr_list:REG_CFA_FLUSH_QUEUE (nil) 
            (nil)))) 

.....
For some reason on darwin AX is set here without spilling previous value.
On Linux AX is spilled and filled in appropriate place.

After that while reading LC0 on darwin we use incorrect GOT register.

(insn 115 41 116 6 (set (reg:SI 0 ax [128]) 
        (plus:SI (reg:SI 0 ax [98]) 
            (const:SI (unspec:SI [
                        (symbol_ref/u:SI ("*LC0") [flags 0x2])
                    ] UNSPEC_MACHOPIC_OFFSET)))) frexpq.c:1319 213 {*leasi}
     (expr_list:REG_EQUAL (symbol_ref/u:SI ("*LC0") [flags 0x2])
        (nil))) 
...

Do you have any ideas where darwin can treat the LC0 symbol so?

Please try attached patch (includes all fixes) moving pushtf split earlier. The
bootstrap (c,c++,fortran,lto) on MAC passed (patch applied on top of 216304).

Reply via email to