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

Steven Bosscher <steven at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
            Summary|Poor code for conversion    |[powerpc] Poor code from
                   |from _Bool to int           |cstore expander

--- Comment #3 from Steven Bosscher <steven at gcc dot gnu.org> 2012-04-23 
20:12:37 UTC ---
The first time round to rs6000.md:cstore<mode>4, the insn isn't generated
because code==NE. The second time, some insns are emitted:

Breakpoint 11, emit_store_flag_1 (target=0x0, code=EQ, op0=0xfffb5f092c0,
op1=0xfffb5f60470, mode=DImode, unsignedp=0, normalizep=1, target_mode=QImode)
    at ../../trunk/gcc/expmed.c:5363
5363              do_pending_stack_adjust ();
(gdb) next
5364              tem = emit_cstore (target, icode, code, mode, compare_mode,
(gdb) 
5366              if (tem)
(gdb) p tem
$67 = (rtx) 0xfffb5f094a0
(gdb) p debug_rtx(tem)
(reg:QI 132)
$68 = void
(gdb) p debug_rtx_list (get_last_insn(), -7)
(insn 15 14 16 (set (reg:CC 134)
        (compare:CC (reg:DI 123 [ D.2005 ])
            (const_int 0 [0]))) t.c:16 -1
     (nil))

(insn 16 15 17 (set (reg:DI 135)
        (eq:DI (reg:CC 134)
            (const_int 0 [0]))) t.c:16 -1
     (nil))

(insn 17 16 18 (set (reg:SI 133)
        (subreg:SI (reg:DI 135) 4)) t.c:16 -1
     (nil))

(insn 18 17 0 (set (reg:QI 132)
        (subreg:QI (reg:SI 133) 3)) t.c:16 -1
     (nil))

$69 = void
(gdb) next
5367                return tem;
(gdb) 
5381    }
(gdb) 
emit_store_flag (target=0xfffb5f09460, code=NE, op0=0xfffb5f092c0,
op1=0xfffb5f60470, mode=DImode, unsignedp=1, normalizep=1) at
../../trunk/gcc/expmed.c:5578
5578              if (tem != 0)
(gdb) p tem
$70 = (rtx) 0xfffb5f094a0
(gdb) l
5573                   && rtx_cost (trueval, XOR, 1,
5574                                optimize_insn_for_speed_p ()) == 0)
5575            {
5576              tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0,
5577                                       normalizep, target_mode);
5578              if (tem != 0)
5579                tem = expand_binop (target_mode, xor_optab, tem, trueval,
target,
5580                                    INTVAL (trueval) >= 0, OPTAB_WIDEN);
5581            }


So the problem is not the _Bool->int conversion but the cstore for
";; D.2013_7 = D.2005_5 != 0;"

Reply via email to