On 05/15/12 06:00, Paulo J. Matos wrote:
> The RTL for the first two comparisons at compare-elim is:
> (insn 51 3 52 2 (set (reg:CC_NZ 13 CC)
>         (compare:CC_NZ (reg:QI 0 AH [orig:27 a ] [27])
>             (const_int 0 [0]))) b651.c:1 63 {*tstqi}
>      (nil))
> 
> (jump_insn 52 51 34 2 (set (pc)
>         (if_then_else (ge (reg:CC_NZ 13 CC)
>                 (const_int 0 [0]))
>             (label_ref 41)
>             (pc))) b651.c:1 68 {*conditional_branch}
>      (expr_list:REG_BR_PROB (const_int 7900 [0x1edc])
>         (nil))
>  -> 41)
> 
> (code_label 41 43 25 4 6 "" [1 uses])
> 
> (note 25 41 49 4 [bb 4] NOTE_INSN_BASIC_BLOCK)
> 
> (insn 49 25 50 4 (set (reg:CC 13 CC)
>         (compare:CC (reg:QI 0 AH [orig:27 a ] [27])
>             (const_int 0 [0]))) b651.c:1 64 {*cmpqi}
>      (nil))
> 
> (jump_insn 50 49 26 4 (set (pc)
>         (if_then_else (gt (reg:CC 13 CC)
>                 (const_int 0 [0]))
>             (label_ref 13)
>             (pc))) b651.c:1 68 {*conditional_branch}
>      (expr_list:REG_BR_PROB (const_int 7900 [0x1edc])
>         (nil))
>  -> 13)

My question is, why are you generating compares in two different
modes early, before compare-elim runs?  If you hadn't done that,
your redundant compare would already be eliminated.

There's some amount of support for taking a full CCmode and
using SELECT_CC_MODE to find one that fits all the uses, but
that's only used in the places we're trying to replace a clobber.


r~

Reply via email to