https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68557
Bug ID: 68557 Summary: Missed x86 peephole optimization for multiplying by a bool Product: gcc Version: 5.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: ppalka at gcc dot gnu.org Target Milestone: --- On x86 the following code void bar (int x); void baz (int x, bool b) { bar (x * b); } is compiled to bar: movzbl %sil, %esi imull %esi, %edi jmp baz when it could instead be compiled to bar: movzbl %sil, %esi negl %esi andl %esi, %edi jmp baz On modern processors the "neg" and "and" instructions takes a minimum of one cycle each, whereas the "imul" instruction takes a minimum three cycles. So transforming "x * (int)b" to "x & -(int)b" would save one cycle in the best case.