[llvm-dev] Where's the optimiser gone? (part 7): poor register allocation for 64-bit multiplication and following addition on 32-bit target

Stefan Kanthak via llvm-dev llvm-dev at lists.llvm.org
Mon Dec 3 06:27:40 PST 2018


unsigned long long lcg64() // linear congruential generator, period length 2**64
{                          // see George Marsaglia's KISS64
    static unsigned long long z = 1066149217761810ULL;
    z = z * 6906969069ULL + 1234567ULL;
    return z;
}

Compiled with "-O3 -target i386" yields
(see <https://godbolt.org/z/ljQJAh>):

lcg64: # @lcg64
    push  ebp
    mov   ebp, esp
    mov   ecx, dword ptr [lcg64.z]
    mov   edx, -1682965523
    mov   eax, ecx
    mul   edx
    add   edx, ecx
    imul  ecx, dword ptr [lcg64.z+4], -1682965523
    add   eax, 1234567
    mov   dword ptr [lcg64.z], eax
    adc   ecx, edx                          |    adc   edx, ecx
    mov   dword ptr [lcg64.z+4], ecx        |    mov   dword ptr [lcg64.z+4], edx
    mov   edx, ecx                          | ;; superfluous
    pop   ebp
    ret
lcg64.z:
    .quad 1066149217761810 # 0x3c9a83566fa12


More information about the llvm-dev mailing list