https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87650
Bug ID: 87650 Summary: suboptimal codegen for testing low bit Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: hoganmeier at gmail dot com Target Milestone: --- int pow(int x, unsigned int n) { int y = 1; while (n > 1) { auto m = n%2; n = n/2; if (m) y *= x; x = x*x; } return x*y; } produces mov edx, esi and edx, 1 test edx, edx instead of just test sil, 1 while clang chooses a branchless version: https://godbolt.org/z/L6VUZ1 Interestingly gcc does use test sil,1 if you get rid of m: godbolt.org/z/9oL1oc Assembly analysis: https://stackoverflow.com/a/52877279/594456