------- Additional Comments From steven at gcc dot gnu dot org 2005-01-25 16:07 ------- With "-O2" at the time the patch for PR15387 was applied, we had the following .optimized tree for sister: ;; Function sister (sister) sister (f, b) { int * tmp; int T.2; int T.1; int * f.0; <bb 0>: f.0 = (int *)&f; brother (*(f.0 + 4B) == b, b) [tail call]; return; } That resulted in this RTL: (insn 3 8 4 0 (set (reg/v:SI 59 [ b ]) (mem/i:SI (plus:SI (reg/f:SI 53 virtual-incoming-args) (const_int 12 [0xc])) [2 b+0 S4 A32])) -1 (nil) (expr_list:REG_EQUIV (mem/i:SI (plus:SI (reg/f:SI 53 virtual-incoming-args) (const_int 12 [0xc])) [2 b+0 S4 A32]) (nil))) (insn 11 9 13 1 (set (reg:SI 58 [ f.0 ]) (reg/f:SI 53 virtual-incoming-args)) -1 (nil) (nil)) (insn 15 14 16 1 (set (mem/i:SI (plus:SI (reg/f:SI 53 virtual-incoming-args) (const_int 4 [0x4])) [0 S4 A32]) (reg/v:SI 59 [ b ])) -1 (nil) (nil)) (insn 16 15 17 1 (set (reg:SI 61) (mem:SI (plus:SI (reg:SI 58 [ f.0 ]) (const_int 4 [0x4])) [2 S4 A32])) -1 (nil) (nil)) So reg 61 gets set to the value of 'b' that just got stored in *(f.0 + 4). CVS today generates this tree dump and RTL: ;; Function sister (sister) Analyzing Edge Insertions. sister (f, b) { int f$c; int f$a; int f$b; int * tmp; int D.1134; int D.1133; <bb 0>: brother (b == f.b, b) [tail call]; return; } (insn 3 6 4 0 (set (reg/v:SI 58 [ b ]) (mem/i:SI (plus:SI (reg/f:SI 53 virtual-incoming-args) (const_int 12 [0xc])) [3 b+0 S4 A32])) -1 (nil) (expr_list:REG_EQUIV (mem/i:SI (plus:SI (reg/f:SI 53 virtual-incoming-args) (const_int 12 [0xc])) [3 b+0 S4 A32]) (nil))) (insn 17 7 18 1 (set (mem:SI (plus:SI (reg/f:SI 56 virtual-outgoing-args) (const_int 4 [0x4])) [0 S4 A32]) (reg/v:SI 58 [ b ])) -1 (nil) (nil)) (insn 18 17 19 1 (set (reg:SI 63) (mem/s:SI (plus:SI (reg/f:SI 53 virtual-incoming-args) (const_int 4 [0x4])) [3 f.b+0 S4 A32])) -1 (nil) (nil)) Note how b is now stored to virtual-*outgoing*-args.
-- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19616