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

--- Comment #25 from Segher Boessenkool <segher at gcc dot gnu.org> ---
At expand time, the assignment is


;; c_ = c;

(insn 35 34 36 (set (reg/f:DI 140)
        (unspec:DI [
                (symbol_ref:DI ("*.LANCHOR1") [flags 0x182])
                (reg:DI 2 2)
            ] UNSPEC_TOCREL)) "proc_ptr_51.f90":26:0 -1
     (expr_list:REG_EQUAL (symbol_ref:DI ("*.LANCHOR1") [flags 0x182])
        (nil)))

(insn 36 35 37 (set (reg/f:DI 141)
        (unspec:DI [
                (symbol_ref:DI ("__f_MOD_c") [flags 0x3]  <function_decl
0x3fff7
86a7d00 c>)
                (reg:DI 2 2)
            ] UNSPEC_TOCREL)) "proc_ptr_51.f90":26:0 -1
     (expr_list:REG_EQUAL (symbol_ref:DI ("__f_MOD_c") [flags 0x3] 
<function_de
cl 0x3fff786a7d00 c>)
        (nil)))

(insn 37 36 0 (set (mem/f/c:DI (reg/f:DI 140) [13 c_+0 S8 A64])
        (reg/f:DI 141)) "proc_ptr_51.f90":26:0 -1
     (nil))


while the use is (immediately after that!)


;; rhs.2 = c_.5_12 (); [return slot optimization]

(insn 38 37 39 (set (reg:DI 142)
        (plus:DI (reg/f:DI 112 virtual-stack-vars)
            (const_int 48 [0x30]))) "proc_ptr_51.f90":35:0 -1
     (nil))

(insn 39 38 40 (set (reg/f:DI 143)
        (mem/u/c:DI (unspec:DI [
                    (symbol_ref/u:DI ("*.LC1") [flags 0x2])
                    (reg:DI 2 2)
                ] UNSPEC_TOCREL) [21  S8 A8])) "proc_ptr_51.f90":35:0 -1
     (expr_list:REG_EQUAL (symbol_ref:DI ("__f_MOD_c_") [flags 0xc0]  <var_decl
0x3fff7aa40990 c_>)
        (nil)))

(insn 40 39 41 (set (reg/f:DI 144)
        (mem/f/c:DI (reg/f:DI 143) [13 c_+0 S8 A64])) "proc_ptr_51.f90":35:0 -1
     (nil))

(insn 41 40 42 (set (reg:DI 3 3)
        (reg:DI 142)) "proc_ptr_51.f90":35:0 -1
     (nil))

(insn 42 41 43 (set (reg:DI 145)
        (mem:DI (reg/f:DI 144) [0  S8 A8])) "proc_ptr_51.f90":35:0 -1
     (nil))

(insn 43 42 44 (set (reg:DI 97 ctr)
        (reg:DI 145)) "proc_ptr_51.f90":35:0 -1
     (nil))

(insn 44 43 45 (set (reg:DI 11 11)
        (mem:DI (plus:DI (reg/f:DI 144)
                (const_int 16 [0x10])) [0  S8 A8])) "proc_ptr_51.f90":35:0 -1
     (nil))

(call_insn 45 44 46 (parallel [
            (call (mem:SI (reg:DI 97 ctr) [0 *c_.5_12 S4 A8])
                (const_int 64 [0x40]))
            (use (mem:DI (plus:DI (reg/f:DI 144)
                        (const_int 8 [0x8])) [0  S8 A8]))
            (set (reg:DI 2 2)
                (unspec:DI [
                        (const_int 40 [0x28])
                    ] UNSPEC_TOCSLOT))
            (clobber (reg:DI 96 lr))
        ]) "proc_ptr_51.f90":35:0 -1
     (expr_list:REG_CALL_DECL (nil)
        (nil))
    (expr_list (use (reg:DI 11 11))
        (expr_list:DI (use (reg:DI 3 3))
            (nil))))

(insn 46 45 47 (set (reg:DI 146)
        (plus:DI (reg/f:DI 112 virtual-stack-vars)
            (const_int 48 [0x30]))) "proc_ptr_51.f90":35:0 -1
     (nil))

(insn 47 46 0 (set (reg:TI 127 [ rhs.2 ])
        (mem:TI (reg:DI 146) [7  S16 A64])) "proc_ptr_51.f90":35:0 -1
     (nil))



so it is wrong (if this is wrong!) at expand already.


In gimple this was:

  c_ = c;
  c_.5_12 = c_;
  rhs.2 = c_.5_12 (); [return slot optimization]

Reply via email to