This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
CALL_USED_REGISTERS & local_alloc
- From: Alessandro Lonardo <alessandro dot lonardo at roma1 dot infn dot it>
- To: gcc <gcc at gcc dot gnu dot org>
- Date: Wed, 03 Nov 2004 19:33:22 +0100
- Subject: CALL_USED_REGISTERS & local_alloc
I'm experimenting a porting for an architecture with a large register
file (256).
I defined CALL_USED_REGISTERS = FIXED_REGISTERS including all the stack
related regs
along with some regs reserved for relevant constants.
It seems that the local allocation (find_free_reg() gcc version 4.0.0
20041017 (experimental)) fails to manage the following code
in O0:
x.c
int i=1;
int vint[]={ 2, 4, 6, 8,
10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 };
int v[11]={ 1,2,3,4,5,6,7,8,9,10,11};
int v_inc(int num1, int num2)
{
return ( num1 + num2 );
}
int main()
{
v[i] = v_inc(vint[0], vint[4]);
return (v[i]);
}
x.t14.oplower
;; Function v_inc (v_inc)
v_inc (num1, num2)
{
int D.1082;
<bb 0>:
D.1082 = num1 + num2;
return D.1082;
}
;; Function main (main)
main ()
{
int i_1;
int D.1093;
int D.1092;
int D.1091;
int D.1090;
int i_0;
<bb 0>:
i_0 = i;
D.1090 = vint[0];
D.1091 = vint[4];
D.1092 = v_inc (D.1090, D.1091);
v[i_0] = D.1092;
i_1 = i;
D.1093 = v[i_1];
return D.1093;
}
It happens that one of the two reloads in v_inc get assigned the same
(26) registers of i_0 which is therefore clobbered by function call.
; Function v_inc
Spilling for insn 10.
Using reg 25 for reload 0
Using reg 26 for reload 1
Reloads for insn # 10
Reload 0: reload_in (QI) = (mem/i:QI (plus:QI (reg/f:QI 2 $FP)
(const_int 3
[0x3])) [0 num1+0 S1 A64])
ALL_REGS, RELOAD_FOR_INPUT (opnum = 1)
reload_in_reg: (mem/i:QI (plus:QI (reg/f:QI 2 $FP)
(const_int 3
[0x3])) [0 num1+0 S1 A64])
reload_reg_rtx: (reg:QI 25 25)
Reload 1: reload_in (QI) = (mem/i:QI (plus:QI (reg/f:QI 2 $FP)
(const_int 4
[0x4])) [0 num2+0 S1 A64])
ALL_REGS, RELOAD_FOR_INPUT (opnum = 2)
reload_in_reg: (mem/i:QI (plus:QI (reg/f:QI 2 $FP)
(const_int 4
[0x4])) [0 num2+0 S1 A64])
reload_reg_rtx: (reg:QI 26 26)
;; Register dispositions:
4101 in 24 4102 in 24
;; Hard regs used: 2 6 7 17 24 25 26
(note 2 0 7 NOTE_INSN_DELETED)
;; Start of basic block 0, registers live: 2 [$FP] 3 [$SP] 6 [6] 7 [7]
16 [$AP]
(note 7 2 3 0 [bb 0] NOTE_INSN_BASIC_BLOCK)
(insn 3 7 4 0 (set (mem/i:QI (plus:QI (reg/f:QI 2 $FP)
(const_int 3 [0x3])) [0 num1+0 S1 A64])
(reg:QI 6 6 [ num1 ])) 8 {zmovqi} (nil)
(nil))
(insn 4 3 5 0 (set (mem/i:QI (plus:QI (reg/f:QI 2 $FP)
(const_int 4 [0x4])) [0 num2+0 S1 A64])
(reg:QI 7 7 [ num2 ])) 8 {zmovqi} (nil)
(nil))
(note 5 4 28 0 NOTE_INSN_FUNCTION_BEG)
(insn 28 5 29 0 (set (reg:QI 25 25)
(mem/i:QI (plus:QI (reg/f:QI 2 $FP)
(const_int 3 [0x3])) [0 num1+0 S1 A64])) 8 {zmovqi} (nil)
(nil))
(insn 29 28 10 0 (set (reg:QI 26 26)
(mem/i:QI (plus:QI (reg/f:QI 2 $FP)
(const_int 4 [0x4])) [0 num2+0 S1 A64])) 8 {zmovqi} (nil)
(nil))
(insn 10 29 11 0 (set (reg:QI 24 24 [orig:4101 D.1082 ] [4101])
(plus:QI (reg:QI 25 25)
(reg:QI 26 26))) 14 {addqi3} (nil)
(nil))
(insn 11 10 14 0 (set (reg:QI 24 24 [orig:4102 <result> ] [4102])
(reg:QI 24 24 [orig:4101 D.1082 ] [4101])) 8 {zmovqi} (nil)
(nil))
(note 14 11 17 0 NOTE_INSN_FUNCTION_END)
(insn 17 14 23 0 (set (reg/i:QI 17 $RVAL [ <result> ])
(reg:QI 24 24 [orig:4102 <result> ] [4102])) 8 {zmovqi} (nil)
(nil))
(insn 23 17 27 0 (use (reg/i:QI 17 $RVAL [ <result> ])) -1 (nil)
(nil))
;; End of basic block 0, registers live:
(note 27 23 0 NOTE_INSN_DELETED)
;; Function main
;; Register dispositions:
4101 in 24 4102 in 24 4103 in 24 4104 in 25 4105 in 24 4106 in 26
4107 in 24
;; Hard regs used: 2 6 7 17 24 25 26
(note 2 0 3 NOTE_INSN_DELETED)
(note 3 2 6 0 NOTE_INSN_FUNCTION_BEG)
;; Start of basic block 1, registers live: 2 [$FP] 3 [$SP] 16 [$AP]
(note 6 3 8 1 [bb 1] NOTE_INSN_BASIC_BLOCK)
(insn 8 6 9 1 (set (reg:QI 26 26 [orig:4106 i_0 ] [4106])
(mem/i:QI (symbol_ref:QI ("i") [flags 0x2] <var_decl 0xbf2ec32c
i>) [0 i+0 S1 A64])) 8 {zmovqi} (nil)
(nil))
(insn 9 8 10 1 (set (reg:QI 24 24 [orig:4105 D.1087 ] [4105])
(mem/s/j:QI (symbol_ref:QI ("vint") [flags 0x2] <var_decl
0xbf2ec414 vint>) [0 vint+0 S1 A64])) 8 {zmovqi} (ni
l)
(nil))
(insn 10 9 12 1 (set (reg:QI 25 25 [orig:4104 D.1088 ] [4104])
(mem/s/j:QI (const:QI (plus:QI (symbol_ref:QI ("vint") [flags
0x2] <var_decl 0xbf2ec414 vint>)
(const_int 4 [0x4]))) [0 vint+4 S1 A64])) 8 {zmovqi}
(nil)
(nil))
(insn 12 10 13 1 (set (reg:QI 6 6 [ D.1087 ])
(reg:QI 24 24 [orig:4105 D.1087 ] [4105])) 8 {zmovqi} (nil)
(nil))
(insn 13 12 14 1 (set (reg:QI 7 7 [ D.1088 ])
(reg:QI 25 25 [orig:4104 D.1088 ] [4104])) 8 {zmovqi} (nil)
(nil))
(call_insn 14 13 15 1 (set (reg:QI 17 $RVAL)
(call (mem:QI (symbol_ref:QI ("v_inc") [flags 0x3]
<function_decl 0xbf2ec7b4 v_inc>) [0 S1 A64])
(const_int 0 [0x0]))) 68 {call_value} (nil)
(expr_list:REG_EH_REGION (const_int 0 [0x0])
(nil))
(expr_list:REG_DEP_TRUE (use (reg:QI 7 7 [ D.1088 ]))
(expr_list:REG_DEP_TRUE (use (reg:QI 6 6 [ D.1087 ]))
(nil))))
(insn 15 14 16 1 (set (reg:QI 24 24 [orig:4103 D.1089 ] [4103])
(reg:QI 17 $RVAL)) 8 {zmovqi} (nil)
(nil))
(insn 16 15 18 1 (set (mem/s/j:QI (plus:QI (reg:QI 26 26 [orig:4106 i_0
] [4106])
(symbol_ref:QI ("v") [flags 0x2] <var_decl 0xbf2ec5e4
v>)) [0 v S1 A64])
(reg:QI 24 24 [orig:4103 D.1089 ] [4103])) 8 {zmovqi} (nil)
(nil))
(insn 18 16 19 1 (set (reg:QI 24 24 [orig:4101 i_1 ] [4101])
(mem/i:QI (symbol_ref:QI ("i") [flags 0x2] <var_decl 0xbf2ec32c
i>) [0 i+0 S1 A64])) 8 {zmovqi} (nil)
(nil))
(insn 19 18 20 1 (set (reg:QI 24 24 [orig:4102 D.1090 ] [4102])
(mem/s/j:QI (plus:QI (reg:QI 24 24 [orig:4101 i_1 ] [4101])
(symbol_ref:QI ("v") [flags 0x2] <var_decl 0xbf2ec5e4
v>)) [0 v S1 A64])) 8 {zmovqi} (nil)
(nil))
(insn 20 19 23 1 (set (reg:QI 24 24 [orig:4107 <result> ] [4107])
(reg:QI 24 24 [orig:4102 D.1090 ] [4102])) 8 {zmovqi} (nil)
(nil))
(note 23 20 26 1 NOTE_INSN_FUNCTION_END)
(insn 26 23 32 1 (set (reg/i:QI 17 $RVAL [ <result> ])
(reg:QI 24 24 [orig:4107 <result> ] [4107])) 8 {zmovqi} (nil)
(nil))
(insn 32 26 36 1 (use (reg/i:QI 17 $RVAL [ <result> ])) -1 (nil)
(nil))
;; End of basic block 1, registers live:
2 [$FP] 3 [$SP] 16 [$AP] 17 [$RVAL]
(note 36 32 0 NOTE_INSN_DELETED)
I suspect that the choice of not having call clobbered regs different
from fixed regs is someway misleading for the local allocator,
or maybe I miss something and somebody can address me to my mistake.
Alessandro