This source code: $ cat rand.c #include <stdint.h> uint32_t rand(uint32_t x) { return (uint64_t)x * 16807 % 0x7FFFFFFF; }
compiles to this optimised x86 code: $ gcc -S -O3 -m32 -fomit-frame-pointer -o - rand.c ... rand: subl $28, %esp movl $16807, %eax mull 32(%esp) movl $2147483647, 8(%esp) movl $0, 12(%esp) movl %eax, (%esp) movl %edx, 4(%esp) call __umoddi3 addl $28, %esp ret Why does the compiler generate a call to __umoddi3, rather than a single 64- to 32-bit divide/remainder instruction, "div"? Is it lacking the necessary VRP to determine that the high part of the dividend is strictly less than the divisor? I'm using: $ gcc --version gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5 Thanks, Jay.