This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]