http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52802
Bug #: 52802 Summary: Equality rewrites pessimizes code Classification: Unclassified Product: gcc Version: 4.8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassig...@gcc.gnu.org ReportedBy: g...@magfr.user.lysator.liu.se I have a function (in foo.c) unsigned f(unsigned a, unsigned b) { if (a < 8) return a; else if (a == 8) return b; else return 4711; } that GCC compiles to (x86_64, -Os) cmpl $7, %edi #, a movl %edi, %eax # a, a jbe .L2 #, cmpl $8, %edi #, a movl $4711, %eax #, tmp63 cmove %esi, %eax # b,, a .L2: ret Here it is confusing to see that it starts by doing a "cmp $7, %edi" and then goes on to do a "cmp $8, %edi" since I never said anything but 8, so the big question is why there are two compares. The reason seems to be premature optimization. The C parser tries to minimize the value of all comparision values so that -fdump-tree-original shows ;; Function f (null) ;; enabled by -tree-original { if (a <= 7) { return a; } else { if (a == 8) { return b; } else { return 4711; } } } and there the 7 have magically appeared.