http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48774

--- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-05-02 
13:58:28 UTC ---
This looks like a target bug to me
in *.postreload we have:
(insn 615 177 616 32 (set (reg:CCC 17 flags)
        (compare:CCC (zero_extract:DI (reg:DI 5 di [orig:129 prephitmp.8 ]
[129])
                (const_int 1 [0x1])
                (const_int 1 [0x1]))
            (const_int 0 [0]))) pr48774-6.c:23 377 {*testqi_ext_3_rex64}
     (nil))

(jump_insn 616 615 184 32 (set (pc)
        (if_then_else (ne (reg:CCC 17 flags)
                (const_int 0 [0]))
            (label_ref 214)
            (pc))) pr48774-6.c:23 589 {*jcc_1}
     (expr_list:REG_BR_PROB (const_int 5000 [0x1388])
        (nil))

which comes from jcc_bt* splitter, where the second const1_rtx still was a
register at the time of the split, but IRA materialized it into a constant.
The CCC mode is fine for bt insn.  Unfortunately split2 pass splits this into:

(insn 626 177 616 32 (set (reg:CCC 17 flags)
        (compare:CCC (and:QI (reg:QI 5 di [orig:129 prephitmp.8 ] [129])
                (const_int 2 [0x2]))
            (const_int 0 [0]))) pr48774-6.c:23 369 {*testqi_1_maybe_si}
     (nil))

(jump_insn 616 626 184 32 (set (pc)
        (if_then_else (ne (reg:CCC 17 flags)
                (const_int 0 [0]))
            (label_ref 214)
            (pc))) pr48774-6.c:23 589 {*jcc_1}
     (expr_list:REG_BR_PROB (const_int 5000 [0x1388])
        (nil))
 -> 214)

which is already incorrect, if we want to replace bt-ish test, we'd need to
update the mode to CCmode or similar and update the user(s).
The generated assembly then has:
        andl    $2, %edi
        jnc     .L21
whereas it should have been either
        btl     $1, %edi
        jnc     .L21
or
        andl    $2, %edi
        je      .L21

Reply via email to