[Info-vax] Anyone still around ? :-)

hb end.of at inter.net
Wed Oct 9 18:40:35 EDT 2019


On 10/9/19 11:55 PM, Louis Krupp wrote:
> On Tue, 8 Oct 2019 07:19:39 -0700 (PDT), osuvman50 at gmail.com wrote:
> 
>> I was considering making a post about the failure of the C compiler's optimizer
>> to recognize and optimize the pattern:
>>
>>     choice = permutation % (CARDS_IN_DECK-i);
>>     permutation = permutation / (CARDS_IN_DECK-i);
>>
>> but didn't think I'd get any constructive responses. (refactoring to eliminate a
>> divide makes the whole program run 18% faster on both alpha and IA64).
> 
> For what it's worth, GNU C++ on Linux doesn't optimize it either, but
> GNU Fortran does at optimization level 1. If you have a FORTRAN
> compiler, you'll probably have to tweak this code a bit (getting rid
> of the colons, for example) to try it:
> 
> subroutine s(permutation, choice, i)
>     implicit none
>     integer :: permutation, choice, i
>     integer, parameter :: CARDS_IN_DECK = 52
>     choice = mod(permutation, (CARDS_IN_DECK-i))
>     permutation = permutation / (CARDS_IN_DECK-i)
> end subroutine
> 
> Louis
> 

What kind of optimization do you expect?

#define CARDS_IN_DECK 52
extern int permutation,  choice;
void foo (int i) {
        choice = permutation % (CARDS_IN_DECK-i);
        permutation = permutation / (CARDS_IN_DECK-i);
}
$
$ gcc -m64 -S -O3 foo.c
$ cat foo.s
        .file   "foo.c"
        .text
        .p2align 4,,15
        .globl  foo
        .type   foo, @function
foo:
.LFB0:
        .cfi_startproc
        movl    permutation(%rip), %eax
        movl    $52, %ecx
        subl    %edi, %ecx
        cltd
        idivl   %ecx
        movl    %edx, choice(%rip)
        movl    %eax, permutation(%rip)
        ret
        .cfi_endproc
.LFE0:
        .size   foo, .-foo
        .ident  "GCC: (Debian 8.3.0-6) 8.3.0"
        .section        .note.GNU-stack,"", at progbits
$ g++ -m64 -S -O3 foo.c
$ cat foo.s
        .file   "foo.c"
        .text
        .p2align 4,,15
        .globl  _Z3fooi
        .type   _Z3fooi, @function
_Z3fooi:
.LFB0:
        .cfi_startproc
        movl    permutation(%rip), %eax
        movl    $52, %ecx
        subl    %edi, %ecx
        cltd
        idivl   %ecx
        movl    %edx, choice(%rip)
        movl    %eax, permutation(%rip)
        ret
        .cfi_endproc
.LFE0:
        .size   _Z3fooi, .-_Z3fooi
        .ident  "GCC: (Debian 8.3.0-6) 8.3.0"
        .section        .note.GNU-stack,"", at progbits
$



More information about the Info-vax mailing list