Register allocation problem?
Lars Brinkhoff
lars@nocrew.org
Tue Aug 21 00:37:00 GMT 2001
Hello,
I have a problem I believe is related to register allocation in GCC.
The RTL code for this function:
int foo (int x, int y) { return -y; }
looks like this before register allocation (dump 18.regmove):
(insn 4 23 5 (set (reg/v:SI 23)
(reg:SI 2 2)) 48 {movsi} (nil)
(expr_list:REG_DEAD (reg:SI 2 2)
(nil)))
(note 5 4 12 NOTE_INSN_FUNCTION_BEG)
(insn 12 5 16 (set (reg:SI 24)
(neg:SI (reg/v:SI 23))) 87 {negsi2} (insn_list 4 (nil))
(expr_list:REG_DEAD (reg/v:SI 23)
(nil)))
(note 16 12 19 NOTE_INSN_FUNCTION_END)
(insn 19 16 22 (set (reg/i:SI 1 1)
(reg:SI 24)) 48 {movsi} (insn_list 12 (nil))
(expr_list:REG_DEAD (reg:SI 24)
(nil)))
(insn 22 19 0 (use (reg/i:SI 1 1)) -1 (insn_list 19 (nil))
(nil))
And after register allocation (dump 21.greg):
(insn 4 23 5 (set (reg/v:SI 1 1 [23])
(reg:SI 2 2)) 48 {movsi} (nil)
(nil))
(note 5 4 12 NOTE_INSN_FUNCTION_BEG)
(insn 12 5 16 (set (reg:SI 1 1 [24])
(neg:SI (reg/v:SI 1 1 [23]))) 87 {negsi2} (insn_list 4 (nil))
(nil))
(note 16 12 19 NOTE_INSN_FUNCTION_END)
(insn 19 16 22 (set (reg/i:SI 1 1)
(reg:SI 1 1 [24])) 48 {movsi} (insn_list 12 (nil))
(nil))
(insn 22 19 26 (use (reg/i:SI 1 1)) -1 (insn_list 19 (nil))
(nil))
In the end, there is an unnecessary move (insn 4) that wouldn't have
been there is pseudo 23 was put in hard reg 2 instead of 1.
Is there a way to improve this situation?
More information about the Gcc
mailing list