I'll attach a testcase, which shows a missed simplification at tree level: D.2276_42 = i_53 + 1; D.2277_43 = D.2276_42 * 32; iftmp.3_55 = __fswab32 (xb_54); __asm__("clz %0, %1" : "=r" ret_56 : "r" iftmp.3_55 : "cc"); ret_58 = 32 - ret_56; ret_59 = D.2277_43 - ret_58;
In effect, the constant 32 is both added and subtracted from the result. With a four-insn combiner, this is caught at the RTL stage (compiling for Thumb-1): - add r2, r2, #1 lsl r2, r2, #5 - add r3, r3, r2 - sub r3, r3, #32 + add r3, r2, r3 -- Summary: Missed arithmetic simplification at tree level Product: gcc Version: 4.6.0 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: bernds at gcc dot gnu dot org GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: arm-none-linux-gnueabi http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45256