------- Comment #3 from carrot at google dot com  2009-12-02 07:00 -------
> Could you do some more analysis of where this is coming from using rtl / tree
> dumps ? 
> 
Everything in tree dump is normal.

After rtl expand, every parameter is loaded into a pseudo register at the entry
of the function, including the parameter passed in from stack. So we get the
following rtl code:

(insn 2 19 3 2 src/./testC.cpp:19 (set (reg/f:SI 135 [ this ])
        (reg:SI 0 r0 [ this ])) -1 (nil))

(insn 3 2 4 2 src/./testC.cpp:19 (set (reg/v:SI 136 [ p1 ])
        (reg:SI 1 r1 [ p1 ])) -1 (nil))

(insn 4 3 5 2 src/./testC.cpp:19 (set (reg/v:SI 137 [ p2 ])
        (reg:SI 2 r2 [ p2 ])) -1 (nil))

(insn 5 4 6 2 src/./testC.cpp:19 (set (reg/v:SI 138 [ p3 ])
        (reg:SI 3 r3 [ p3 ])) -1 (nil))

(insn 6 5 7 2 src/./testC.cpp:19 (set (reg/f:SI 141)
        (reg/f:SI 128 virtual-incoming-args)) -1 (nil))

(insn 7 6 8 2 src/./testC.cpp:19 (set (reg:SI 142)
        (zero_extend:SI (mem/c/i:QI (reg/f:SI 141) [7 p4+0 S1 A32]))) -1 (nil))

(insn 8 7 9 2 src/./testC.cpp:19 (set (reg:QI 140)
        (subreg:QI (reg:SI 142) 0)) -1 (nil))

(insn 9 8 10 2 src/./testC.cpp:19 (set (reg:QI 144)
        (reg:QI 140)) -1 (nil))

(insn 10 9 11 2 src/./testC.cpp:19 (set (reg:SI 143)
        (ashift:SI (subreg:SI (reg:QI 144) 0)
            (const_int 24 [0x18]))) -1 (nil))

(insn 11 10 12 2 src/./testC.cpp:19 (set (reg/v:SI 139 [ p4 ])
        (lshiftrt:SI (reg:SI 143)
            (const_int 24 [0x18]))) -1 (expr_list:REG_EQUAL (zero_extend:SI
(reg:QI 140))
        (nil)))

...  // Other codes

(insn 32 31 33 3 src/./testC.cpp:19 (set (reg:QI 155)
        (subreg/s/u:QI (reg/v:SI 139 [ p4 ]) 0)) -1 (nil))

(insn 33 32 34 3 src/./testC.cpp:19 (set (mem/s:QI (reg/f:SI 154) [7
this_1(D)->f3+0 S1 A8])
        (reg:QI 155)) -1 (nil))


When it get to register allocation, it is simplified to:


(insn 2 19 3 2 src/./testC.cpp:19 (set (reg/f:SI 135 [ this ])
        (reg:SI 0 r0 [ this ])) 167 {*thumb1_movsi_insn} (expr_list:REG_DEAD
(reg:SI 0 r0 [ this ])
        (nil)))

(insn 3 2 4 2 src/./testC.cpp:19 (set (reg/v:SI 136 [ p1 ])
        (reg:SI 1 r1 [ p1 ])) 167 {*thumb1_movsi_insn} (expr_list:REG_DEAD
(reg:SI 1 r1 [ p1 ])
        (nil)))

(insn 4 3 5 2 src/./testC.cpp:19 (set (reg/v:SI 137 [ p2 ])
        (reg:SI 2 r2 [ p2 ])) 167 {*thumb1_movsi_insn} (expr_list:REG_DEAD
(reg:SI 2 r2 [ p2 ])
        (nil)))

(insn 5 4 6 2 src/./testC.cpp:19 (set (reg/v:SI 138 [ p3 ])
        (reg:SI 3 r3 [ p3 ])) 167 {*thumb1_movsi_insn} (expr_list:REG_DEAD
(reg:SI 3 r3 [ p3 ])
        (nil)))

(insn 6 5 7 2 src/./testC.cpp:19 (set (reg/f:SI 141)
        (reg/f:SI 26 afp)) 167 {*thumb1_movsi_insn} (nil))

(note 7 6 10 2 NOTE_INSN_DELETED)

(note 10 7 11 2 NOTE_INSN_DELETED)

(insn 11 10 12 2 src/./testC.cpp:19 (set (reg/v:SI 139 [ p4 ])
        (zero_extend:SI (mem/c/i:QI (reg/f:SI 141) [7 p4+0 S1 A32]))) 146
{*thumb1_zero_extendqisi2} (expr_list:REG_DEAD (reg/f:SI 141)
        (nil)))

...  // Other codes

(insn 33 31 34 2 src/./testC.cpp:19 (set (mem/s:QI (reg/f:SI 154) [7
this_1(D)->f3+0 S1 A8])
        (subreg/s/u:QI (reg/v:SI 139 [ p4 ]) 0)) 178 {*thumb1_movqi_insn}
(expr_list:REG_DEAD (reg/f:SI 154)
        (expr_list:REG_DEAD (reg/v:SI 139 [ p4 ])
            (nil))))

Due to the high register pressure, reg 139 was chosen as the spilled variable,
so we get a value moved from parameter stack space to spilled stack space.

The instructions marked C are introduced by register spill and reload, need to
do forward propagation after RA?


-- 


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

Reply via email to