On Sun, Aug 13, 2006 at 10:16:02PM +0200, Rask Ingemann Lambertsen wrote:
> Note that right after expand, we have:
>
> (note 91 90 0 NOTE_INSN_BASIC_BLOCK)
>
> ;; size = size - 1
> (insn 93 91 96 (set (reg:HI 42)
> (const_int -1 [0xffffffff])) -1 (nil)
> (nil))
>
> (insn 96 93 97 (parallel [
> (set (reg:HI 43)
> (plus:HI (reg/v:HI 32 [ size ])
> (reg:HI 42)))
> (clobber (reg:CC 12 cc))
> ]) -1 (nil)
> (nil))
>
> (insn 97 96 98 (set (reg:HI 43)
> (reg:HI 43)) -1 (nil)
> (expr_list:REG_EQUAL (plus:HI (reg/v:HI 32 [ size ])
> (reg:HI 42))
> (nil)))
Note that insn 97 is entirely my fault, but ought to be harmless.
> (insn 98 97 0 (set (reg/v:HI 32 [ size ])
> (reg:HI 43)) -1 (nil)
> (nil))
>
> ;; if (size != 0) goto <L0>; else (void) 0;
> (insn 100 98 101 10 (set (reg:HI 44)
> (const_int 0 [0x0])) -1 (nil)
> (nil))
>
> (insn 101 100 102 10 (set (reg:CC 12 cc)
> (compare:CC (reg/v:HI 32 [ size ])
> (reg:HI 44))) -1 (nil)
> (nil))
All other issues aside, the code is being messed up already at expand. For
comparison, arm-elf gets this much better RTL:
(code_label 51 50 52 7 "" [0 uses])
(note 52 51 0 NOTE_INSN_BASIC_BLOCK)
;; size = size - 1
(insn 54 52 0 (set (reg/v:SI 114 [ size ])
(plus:SI (reg/v:SI 114 [ size ])
(const_int -1 [0xffffffff]))) -1 (nil)
(nil))
;; if (size != 0) goto <L0>; else (void) 0;
(insn 56 54 57 (set (reg:CC 24 cc)
(compare:CC (reg/v:SI 114 [ size ])
(const_int 0 [0x0]))) -1 (nil)
(nil))
The RTL from expand for i686-pc-linux-gnu is essentially the same as for
arm-elf.
--
Rask Ingemann Lambertsen