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