[OT] compiler optimisations

Andrea Fontana via Digitalmars-d digitalmars-d at puremagic.com
Fri Apr 24 02:07:22 PDT 2015


On Friday, 24 April 2015 at 06:29:55 UTC, deadalnix wrote:
> On Thursday, 23 April 2015 at 10:23:57 UTC, Andrea Fontana 
> wrote:
>> On Thursday, 23 April 2015 at 10:08:24 UTC, John Colvin wrote:
>>>> asm.dlang.org
>>>
>>> and d.godbolt.org
>>>
>>> This isn't a D-specific question though, so gcc.godbolt.org 
>>> would allow you to test a wider range of backends.
>>
>> I was wondering if compilers can optimize this:
>>
>> uint foo3(uint a)
>> {
>>  return a*!(a/5);
>> }
>>
>> That actually gives the same results.
>
> That is cool ! However, careful, division can stall the 
> pipeline.

I'm not an assembly expert but it seems that some compilers 
(using godbolt, asm.dlang.org) optimize it as:

return a*(a<=4)

gcc:

foo3(unsigned int):
	xor	eax, eax
	cmp	edi, 4
	setbe	al
	imul	eax, edi
	ret


gdc:

uint foo2(uint a)
{
   return a*(a<5);
}

uint foo3(uint a)
{
   return a*!(a/5);
}

uint example.foo2(uint):
	xorl	%eax, %eax
	cmpl	$4, %edi
	setbe	%al
	imull	%edi, %eax
	ret
uint example.foo3(uint):
	movl	%edi, %eax
	movl	$-858993459, %edx
	mull	%edx
	xorl	%eax, %eax
	shrl	$2, %edx
	testl	%edx, %edx
	sete	%al
	imull	%edi, %eax
	ret


More information about the Digitalmars-d mailing list