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

Reply via email to