http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50663
--- Comment #1 from amker.cheng <amker.cheng at gmail dot com> 2011-10-08 10:25:04 UTC --- Here comes the cause: Though the cprop.c pass collected the implicit_set information, it is recorded as local info of basic block, and cprop only does global propagation. The result is such conditional const propagation opportunities is missed. The whole process in cprop pass is like: bb0 : if (x) then bb1 else bb2 end 1, implicit_set from the preceding bb0 is tagged as local in bb1; 2, in compute_local_properties, the implicit_set is recorded in avloc[bb1]; 3, in compute_cprop_available, the implicit_set is only recorded in avout[bb1], not in avin[bb1], which it should be; 4, in cprop_insn and find_avail_set, only info recorded in avin[bb1] is considered when try to do propagation for bb1; Well, I believe it is a small problem, since implicit_set is recorded in avout[bb1], The basic block bb1 is the only one get missed in propagation. I'm working on a patch and will send it for reviewing later.