[OT] compiler optimisations

John Colvin via Digitalmars-d digitalmars-d at puremagic.com
Thu Apr 23 05:49:33 PDT 2015


On Thursday, 23 April 2015 at 12:37:12 UTC, Ola Fosheim Grøstad 
wrote:
> On Thursday, 23 April 2015 at 08:56:38 UTC, rumbu wrote:
>> I think because of the potential overflow in a * 3 (if we 
>> ignore the a < 5 condition). To optimize this, a compiler must 
>> figure out that there is no overflow for any a < 5.
>
> Yes, it is because of modular artithmetics which is a D design 
> flaw. In C++ this only applies to unsigned integers, signed 
> integers are monothonic in C++. I think Rust uses non-modular 
> for both and Ada allows you to specify it.
>
> Compiled using ICC:
>
> int foo(int a)
> {
> 	if (a > 5)
> 		return (a * 3) / 3;
> 	else
> 		return 0;
> }
>
> yields:
>
>         xorl      %edx, %edx
>         cmpl      $5, %edi
>         cmovle    %edx, %edi
>         movl      %edi, %eax
>         ret
>
> ---------------------------------
>
> int foo(unsigned int a)
> {
> 	if (a > 5)
> 		return (a * 3) / 3;
> 	else
> 		return 0;
> }
>
> yields:
>
>         cmpl      $5, %edi
>         jbe       ..B1.3
>         movl      $-1431655765, %eax
>         lea       (%rdi,%rdi,2), %ecx
>         mull      %ecx
>         shrl      $1, %edx
>         movl      %edx, %eax
>         ret
> ..B1.3:
>         xorl      %eax, %eax
>         ret

Just to confirm this, all C compilers I tried were able to use 
the undefined behaviour of signed overflow to avoid the 
multiplication. D compilers of course do not do this, as signed 
overflow is defined.

Nonetheless, I maintain that the compiler should be able to 
propagate the value range of a and perform the optimisation 
regardless.


More information about the Digitalmars-d mailing list