digitalmars.D.ldc - Another interesting difference
- bearophile (133/133) Dec 12 2013 I am trying the following program with both the latest dmd
- David Nadlinger (4/7) Dec 12 2013 I don't know why we are, but we shouldn't:
- Kai Nacke (6/14) Dec 12 2013 This is the solution:
- Kai Nacke (10/13) Dec 16 2013 Yes! There was no check for this situation in ldc2. Bounds
I am trying the following program with both the latest dmd
2.065alpha and ldc2 2.063.2, with no optimizations:
int fun(int[3] a) {
return a[0]+ a[1] + a[2];
}
int main() {
int total = 0;
foreach (immutable _; 0 .. 100_000_000)
total += fun([1, 2, 3]);
return total;
}
The results, both in run-time and x86 asm:
-------------------------
dmd test2.d
runtime: 0.81
_D5test23funFG3iZi comdat
mov EAX,4[ESP]
add EAX,8[ESP]
add EAX,0Ch[ESP]
ret 0Ch
__Dmain comdat
L0: enter 014h,0
push EBX
xor EAX,EAX
mov -014h[EBP],EAX
mov -010h[EBP],EAX
LD: cmp dword ptr -010h[EBP],05F5E100h
jge L47
mov ECX,-010h[EBP]
mov EDX,1
mov -0Ch[EBP],EDX
mov dword ptr -8[EBP],2
mov dword ptr -4[EBP],3
lea EBX,-0Ch[EBP]
push dword ptr 8[EBX]
push dword ptr 4[EBX]
push dword ptr [EBX]
call near ptr _D5test23funFG3iZi
add -014h[EBP],EAX
inc dword ptr -010h[EBP]
jmp short LD
L47: mov EAX,-014h[EBP]
pop EBX
leave
ret
-------------------------
ldmd2 test2.d
runtime: 1.94
ldmd2 -output-s test2.d
__D5test23funFG3iZi:
subl $28, %esp
leal 32(%esp), %eax
movb $1, %cl
testb $1, %cl
movl %eax, 24(%esp)
jne LBB0_2
jmp LBB0_1
LBB0_1:
leal __D5test212__ModuleInfoZ, %eax
movl $2, %ecx
movl %eax, (%esp)
movl $2, 4(%esp)
movl %ecx, 20(%esp)
calll __d_array_bounds
LBB0_2:
movb $1, %al
testb $1, %al
jne LBB0_4
leal __D5test212__ModuleInfoZ, %eax
movl $2, %ecx
movl %eax, (%esp)
movl $2, 4(%esp)
movl %ecx, 16(%esp)
calll __d_array_bounds
LBB0_4:
movb $1, %al
movl 24(%esp), %ecx
movl (%ecx), %edx
addl 4(%ecx), %edx
testb $1, %al
movl %edx, 12(%esp)
jne LBB0_6
leal __D5test212__ModuleInfoZ, %eax
movl $2, %ecx
movl %eax, (%esp)
movl $2, 4(%esp)
movl %ecx, 8(%esp)
calll __d_array_bounds
LBB0_6:
movl 24(%esp), %eax
movl 8(%eax), %ecx
movl 12(%esp), %edx
addl %ecx, %edx
movl %edx, %eax
addl $28, %esp
ret $12
__Dmain:
subl $40, %esp
movl $0, 36(%esp)
movl $0, 32(%esp)
movl $100000000, 28(%esp)
LBB1_1:
cmpl $100000000, 32(%esp)
jge LBB1_4
movl 32(%esp), %eax
movl %eax, 24(%esp)
movl $3, 20(%esp)
movl $2, 16(%esp)
movl $1, 12(%esp)
movl 20(%esp), %eax
movl %esp, %ecx
movl %eax, 8(%ecx)
movsd 12(%esp), %xmm0
movsd %xmm0, (%ecx)
calll __D5test23funFG3iZi
subl $12, %esp
movl 36(%esp), %ecx
addl %eax, %ecx
movl %ecx, 36(%esp)
movl 32(%esp), %eax
addl $1, %eax
movl %eax, 32(%esp)
jmp LBB1_1
LBB1_4:
movl 36(%esp), %eax
addl $40, %esp
ret
-------------------------
Do you know why ldc2 puts array bound tests inside fun()? The
array 'a' inside fun() is a fixed size array, so there is no need
to verify at run-time that 0 1 2 are within the array bounds.
Bye,
bearophile
Dec 12 2013
On 12 Dec 2013, at 10:00, bearophile wrote:Do you know why ldc2 puts array bound tests inside fun()? The array 'a' inside fun() is a fixed size array, so there is no need to verify at run-time that 0 1 2 are within the array bounds.I don't know why we are, but we shouldn't: https://github.com/ldc-developers/ldc/issues/553 David
Dec 12 2013
On Thursday, 12 December 2013 at 09:37:36 UTC, David Nadlinger wrote:On 12 Dec 2013, at 10:00, bearophile wrote:This is the solution: https://github.com/ldc-developers/ldc/pull/554 Regards, KaiDo you know why ldc2 puts array bound tests inside fun()? The array 'a' inside fun() is a fixed size array, so there is no need to verify at run-time that 0 1 2 are within the array bounds.I don't know why we are, but we shouldn't: https://github.com/ldc-developers/ldc/issues/553 David
Dec 12 2013
On Thursday, 12 December 2013 at 09:00:08 UTC, bearophile wrote:I am trying the following program with both the latest dmd 2.065alpha and ldc2 2.063.2, with no optimizations:[..snip..]Do you know why ldc2 puts array bound tests inside fun()?Yes! There was no check for this situation in ldc2. Bounds checking code was emitted for all array references. dmd 2.064 omits the bounds checking code if the access can be checked at compile time. Therefore you see the difference. I fixed this in the master and the merge-2.064 branch. The next release will include the fix. Regards, Kai
Dec 16 2013









"Kai Nacke" <kai redstar.de> 