https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101301

--- Comment #1 from Thomas Koenig <tkoenig at gcc dot gnu.org> ---
Here's the assembly for the switch statement with -O3:

        cmpl    $55555, %edi
        je      .L6
        jle     .L18
        movl    $8, %eax
        cmpl    $88888, %edi
        je      .L1
        jle     .L19
        xorl    %eax, %eax
        cmpl    $99999, %edi
        sete    %al
        leal    (%rax,%rax,8), %eax
        ret
        .p2align 4,,10
        .p2align 3
.L18:
        movl    $3, %eax
        cmpl    $33333, %edi
        je      .L1
        jle     .L20
        xorl    %eax, %eax
        cmpl    $44444, %edi
        sete    %al
        sall    $2, %eax
        ret
        .p2align 4,,10
        .p2align 3
.L19:
        movl    $6, %eax
        cmpl    $66666, %edi
        je      .L1
        xorl    %eax, %eax
        movl    $7, %edx
        cmpl    $77777, %edi
        cmove   %edx, %eax
        ret
        .p2align 4,,10
        .p2align 3
.L6:
        movl    $5, %eax
.L1:
        ret
        .p2align 4,,10
        .p2align 3
.L20:
        movl    $1, %eax
        cmpl    $11111, %edi
        je      .L1
        xorl    %eax, %eax
        cmpl    $22222, %edi
        sete    %al
        addl    %eax, %eax
        ret

and here for the if statement version:

        cmpl    $55554, %edi
        jle     .L2
        cmpl    $77776, %edi
        jle     .L3
        cmpl    $77777, %edi
        je      .L6
        cmpl    $88888, %edi
        je      .L7
        xorl    %eax, %eax
        cmpl    $99999, %edi
        sete    %al
        leal    (%rax,%rax,8), %eax
        ret
        .p2align 4,,10
        .p2align 3
.L3:
        cmpl    $55555, %edi
        je      .L9
        xorl    %eax, %eax
        movl    $6, %edx
        cmpl    $66666, %edi
        cmove   %edx, %eax
        ret
        .p2align 4,,10
        .p2align 3
.L2:
        cmpl    $33332, %edi
        jle     .L5
        cmpl    $33333, %edi
        je      .L11
        xorl    %eax, %eax
        cmpl    $44444, %edi
        sete    %al
        sall    $2, %eax
        ret
        .p2align 4,,10
        .p2align 3
.L5:
        movl    $1, %eax
        cmpl    $11111, %edi
        je      .L1
        xorl    %eax, %eax
        cmpl    $22222, %edi
        sete    %al
        addl    %eax, %eax
        ret
        .p2align 4,,10
        .p2align 3
.L11:
        movl    $3, %eax
.L1:
        ret
        .p2align 4,,10
        .p2align 3
.L7:
        movl    $8, %eax
        ret
        .p2align 4,,10
        .p2align 3
.L9:
        movl    $5, %eax
        ret
        .p2align 4,,10
        .p2align 3
.L6:
        movl    $7, %eax
        ret

Stepping through the code with a debugger, here is a table on the number
of conditional jumps for all special values and in all relevant intervals:

 5000  5  3
 11111 5  3
 15000 5  3
 22222 5  3
 25000 5  3
 33333 3  3
 35000 4  3
 44444 4  3
 50000 4  3
 55555 1  3
 60000 5  3
 66666 5  3
 70000 5  3
 77777 5  3
 80000 5  4
 88888 3  4
 90000 4  4
 99999 4  4
100000 4  4

If one assumes each case as equally likely, the number of conditional jumps
goes down from 81 to 62.

Assuming each case statement is reached once, the total number of
conditional jumps executed goes from 35 to 29.

Reply via email to