------- 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