http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46957
Summary: http://blog.regehr.org/archives/320 Example 1 Product: gcc Version: 4.6.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassig...@gcc.gnu.org ReportedBy: ja...@gcc.gnu.org CC: s...@gcc.gnu.org void foo (void); long a, b; void foo (void) { int i; b = -1L; i = 0; while (i < 63) { b *= 2L; i++; } a = -(b + 1L); } doesn't have the loop optimized out, as we don't have {-1L, *, 2}_1 style chrecs, only , +, style. I wonder if we couldn't for << or multiplication by power of two express {-1L, *, 2}_1 instead as -1L << ({0, +, 1}_1), or for other multiplication, say {a, *, b}_1, as a * pow (b, {0, +, 1}_1) and use that in compute_overall_effect_of_inner_loop etc. to sccp it. Of course only if the resulting expression is cheap enough.