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;"