From mboxrd@z Thu Jan 1 00:00:00 1970 From: Zack Weinberg To: Joern Rennecke Cc: law@cygnus.com, egcs@egcs.cygnus.com Subject: Re: a strange infelicity of register allocation Date: Wed, 27 Jan 1999 08:35:00 -0000 Message-id: <199901271634.LAA20086@blastula.phys.columbia.edu> References: <199901261544.PAA21115@phal.cygnus.co.uk> X-SW-Source: 1999-01/msg00283.html On Tue, 26 Jan 1999 15:44:06 +0000 (GMT), Joern Rennecke wrote: >> C: >> buf = xrealloc (buf, op - buf); >> fp->buf = buf; >> return op - buf; >> >> becomes [...] >The first problem here is that (op - buf) hasn't been subjected to cse. >Is the address of buf taken anywhere in this function? No, neither buf nor op has its address taken. Right before CSE, we have this RTL for the above code. CSE makes no changes except to annotate insns with patterns. Flow thinks this is one basic block, and that reg 86 is dead after insn 608. Local register allocation says reg 86 is bb-local but doesn't give it a hard register. Combine collapses reg 87 into reg 28. (code_label 603 601 606 47 "") (insn 606 603 608 (set (reg:SI 86) (minus:SI (reg/v:SI 28) (reg/v:SI 26))) -1 (nil) (nil)) (insn 608 606 610 (set (mem:SI (pre_dec:SI (reg:SI 7 %esp)) 0) (reg:SI 86)) -1 (nil) (nil)) (insn 610 608 612 (set (mem:SI (pre_dec:SI (reg:SI 7 %esp)) 0) (reg/v:SI 26)) -1 (nil) (nil)) (call_insn 612 610 614 (set (reg:SI 0 %eax) (call (mem:QI (symbol_ref:SI ("xrealloc")) 0) (const_int 8))) -1 (nil) (nil) (nil)) (insn 614 612 617 (set (reg/v:SI 26) (reg:SI 0 %eax)) -1 (nil) (nil)) (insn 617 614 620 (set (mem/s:SI (reg/v:SI 23) 5) (reg/v:SI 26)) -1 (nil) (nil)) (insn 620 617 622 (set (reg:SI 87) (minus:SI (reg/v:SI 28) (reg/v:SI 26))) -1 (nil) (nil)) (insn 622 620 624 (set (reg/i:SI 0 %eax) (reg:SI 87)) -1 (nil) (nil)) (jump_insn 624 622 625 (set (pc) (label_ref 654)) -1 (nil) (nil)) (barrier 625 624 626) From mboxrd@z Thu Jan 1 00:00:00 1970 From: Zack Weinberg To: Joern Rennecke Cc: law@cygnus.com, egcs@egcs.cygnus.com Subject: Re: a strange infelicity of register allocation Date: Sun, 31 Jan 1999 23:58:00 -0000 Message-ID: <199901271634.LAA20086@blastula.phys.columbia.edu> References: <199901261544.PAA21115@phal.cygnus.co.uk> X-SW-Source: 1999-01n/msg01046.html Message-ID: <19990131235800.-kzwM9G5emu_obhA5i7dZhQQcSkhDH33pwRbCWq90Mc@z> On Tue, 26 Jan 1999 15:44:06 +0000 (GMT), Joern Rennecke wrote: >> C: >> buf = xrealloc (buf, op - buf); >> fp->buf = buf; >> return op - buf; >> >> becomes [...] >The first problem here is that (op - buf) hasn't been subjected to cse. >Is the address of buf taken anywhere in this function? No, neither buf nor op has its address taken. Right before CSE, we have this RTL for the above code. CSE makes no changes except to annotate insns with patterns. Flow thinks this is one basic block, and that reg 86 is dead after insn 608. Local register allocation says reg 86 is bb-local but doesn't give it a hard register. Combine collapses reg 87 into reg 28. (code_label 603 601 606 47 "") (insn 606 603 608 (set (reg:SI 86) (minus:SI (reg/v:SI 28) (reg/v:SI 26))) -1 (nil) (nil)) (insn 608 606 610 (set (mem:SI (pre_dec:SI (reg:SI 7 %esp)) 0) (reg:SI 86)) -1 (nil) (nil)) (insn 610 608 612 (set (mem:SI (pre_dec:SI (reg:SI 7 %esp)) 0) (reg/v:SI 26)) -1 (nil) (nil)) (call_insn 612 610 614 (set (reg:SI 0 %eax) (call (mem:QI (symbol_ref:SI ("xrealloc")) 0) (const_int 8))) -1 (nil) (nil) (nil)) (insn 614 612 617 (set (reg/v:SI 26) (reg:SI 0 %eax)) -1 (nil) (nil)) (insn 617 614 620 (set (mem/s:SI (reg/v:SI 23) 5) (reg/v:SI 26)) -1 (nil) (nil)) (insn 620 617 622 (set (reg:SI 87) (minus:SI (reg/v:SI 28) (reg/v:SI 26))) -1 (nil) (nil)) (insn 622 620 624 (set (reg/i:SI 0 %eax) (reg:SI 87)) -1 (nil) (nil)) (jump_insn 624 622 625 (set (pc) (label_ref 654)) -1 (nil) (nil)) (barrier 625 624 626)