[Bug rtl-optimization/20359] [3.3/3.4 regression] Incorrect code with global register variables

jakub at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Tue Mar 8 14:01:00 GMT 2005


------- Additional Comments From jakub at gcc dot gnu dot org  2005-03-08 14:01 -------
Seems to be the combiner, that combines:
(insn 8 22 10 0 (set (reg/v:DI 42 r13 [ r ])
        (symbol_ref:DI ("g") [flags 0x3] <function_decl 0x2a97cde410 g>)) 84
{*movdi_1_rex64_nointerunit} (nil)
    (nil))

(insn 10 8 12 0 (set (reg:DI 59 [ r ])
        (reg/v:DI 42 r13 [ r ])) 84 {*movdi_1_rex64_nointerunit} (insn_list 8
(nil))
    (expr_list:REG_DEAD (reg/v:DI 42 r13 [ r ])
        (nil)))

into:

(insn 10 8 12 0 (set (reg:DI 59 [ r ])
        (symbol_ref:DI ("g") [flags 0x3] <function_decl 0x2a97cde410 g>)) 84
{*movdi_1_rex64_nointerunit} (nil)
    (nil))

without taking into account that there is a hard reg assignment.
This means it is not certain that the problem is not present in 4.0/4.1 as well,
just that combiner is not presented the same *.life RTLs and therefore makes
different decisions.
In 4.0, *.life looks like:
(insn 8 6 9 0 (set (reg/v:DI 42 r13 [ r ])
        (symbol_ref:DI ("g") [flags 0x3] <function_decl 0x2a97d09820 g>)) 81
{*movdi_1_rex64} (nil)
    (expr_list:REG_UNUSED (reg/v:DI 42 r13 [ r ])
        (nil)))

(insn 9 8 10 0 (set (reg/f:DI 59)
        (symbol_ref:DI ("g") [flags 0x3] <function_decl 0x2a97d09820 g>)) 81
{*movdi_1_rex64} (nil)
    (nil))


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20359



More information about the Gcc-bugs mailing list