Hi Eric,

> The note doesn't look particularly helpful in this case, given that gcse
> has replaced r974 with r1218 in the insn.  How is it created?

The register replacement is done by gcse but the cse pass invoked from gcse
modifies the REG_EQUAL note.  The limited scope of cse compared to gcse is 
probably the reason why the information put into the insn note isn't helpful.
The REG_EQUAL note added to insn 2308 seems to be particularly pointless.


09.cse1:

(insn 1742 1740 1743 109 (set (reg/f:DI 974)
        (const:DI (unspec:DI [
                    (symbol_ref:DI ("local") <var_decl 0x200004c9dc0 local>)
                ] 110))) 49 {*movdi_larl} (nil)
    (nil))

(insn 1743 1742 1744 109 (set (reg/f:DI 973)
        (mem/u/c:DI (reg/f:DI 974) [0 S8 A8])) 51 {*movdi_64} (nil)
    (nil))

10.gcse1:

(insn 2308 1740 1743 111 (set (reg/f:DI 974)
        (const:DI (unspec:DI [
                    (symbol_ref:DI ("local") <var_decl 0x200004c9dc0 local>)
                ] 110))) 49 {*movdi_larl} (nil)
    (expr_list:REG_EQUAL (const:DI (unspec:DI [
                    (symbol_ref:DI ("local") <var_decl 0x200004c9dc0 local>)
                ] 110))
        (nil)))

(insn 1743 2308 1744 111 (set (reg/f:DI 973)
        (mem/u/c:DI (reg/f:DI 1218) [0 S8 A8])) 51 {*movdi_64} (nil)
    (expr_list:REG_EQUAL (mem/u/c:DI (reg/f:DI 974) [0 S8 A8])
        (nil)))

constprop_register first tries to replace r974 with a symbol_ref.  This failes
and the symbol_ref is added as REG_EQUAL note in gcse.c:2686:

/* If we've failed to do replacement, have a single SET, don't already
   have a note, and have no special SET, add a REG_EQUAL note to not
   lose information.  */
if (!success && note == 0 && set != 0
    && GET_CODE (SET_DEST (set)) != ZERO_EXTRACT
    && GET_CODE (SET_DEST (set)) != STRICT_LOW_PART)
  note = set_unique_reg_note (insn, REG_EQUAL, copy_rtx (src));

resulting in:

(insn 1743 2308 1744 109 (set (reg/f:DI 973)
        (mem/u/c:DI (reg/f:DI 974) [0 S8 A8])) 51 {*movdi_64} (nil)
    (expr_list:REG_EQUAL (mem/u/c:DI (const:DI (unspec:DI [
                        (symbol_ref:DI ("local") <var_decl 0x200004c9dc0 local>)
                    ] 110)) [0 S8 A8])
        (nil)))

local_cprop_pass then replaces r974 with r1218.

The cleanup cse pass called in gcse.c:6676 then modifies the REG_EQUAL note.
cse calls fold_rtx for the REG_EQUAL note in cse.c:4936 looking for a 
replacement
of the symbol_ref. cse only sees that this value has already been copied to r974
and puts that register into the REG_EQUAL note.


> Is (reg/f:DI 974) loop invariant or only conditionally invariant?
It is only conditionally invariant since it is set in the loop body - to a 
constant
value though.  set_in_loop is -2 and loop_invariant_p returns 2 as expected.

Bye,

-Andreas-

Reply via email to