unsigned int in for loops

Ellery Newcomer ellery-newcomer at utulsa.edu
Fri Feb 4 13:33:51 PST 2011


On 02/04/2011 02:31 PM, Jesse Phillips wrote:
> Ellery Newcomer Wrote:
>
>> I think this was the impetus for foreach_reverse, or at least it is one
>> place where it is pretty handy. Don't remember what all there is in D1,
>> but in D2 you could do something like
>>
>> foreach_reverse(i; 0u .. 10u){
>> // iterates over 9,8,7 .. 1,0
>> }
>
> There was some discussion about removing this... don't remember the conclusion. I believe it is also in D1 though.

the range syntax isn't. but yeah.

personally, I would prefer keeping foreach_reverse as long as dmd isn't 
capable of optimizing the crap out of the likes of

foreach(i; retro(iota(0u,10u)){
}

wait, wtf?

this code:

import std.stdio;
import std.range;
void main(){
     uint sum;
     foreach_reverse(i; 0u .. 10u){
         sum += i;
     }
     writeln(sum);

}

compiled normally yields:

  80497d4:       55                      push   ebp
  80497d5:       8b ec                   mov    ebp,esp
  80497d7:       83 ec 0c                sub    esp,0xc
  80497da:       31 c0                   xor    eax,eax
  80497dc:       89 45 f4                mov    DWORD PTR [ebp-0xc],eax
  80497df:       89 45 f8                mov    DWORD PTR [ebp-0x8],eax
  80497e2:       c7 45 fc 0a 00 00 00    mov    DWORD PTR [ebp-0x4],0xa
  80497e9:       8b 4d fc                mov    ecx,DWORD PTR [ebp-0x4]
  80497ec:       ff 4d fc                dec    DWORD PTR [ebp-0x4]
  80497ef:       3b 4d f8                cmp    ecx,DWORD PTR [ebp-0x8]
  80497f2:       76 08                   jbe    80497fc <_Dmain+0x28>
  80497f4:       8b 55 fc                mov    edx,DWORD PTR [ebp-0x4]
  80497f7:       01 55 f4                add    DWORD PTR [ebp-0xc],edx
  80497fa:       eb ed                   jmp    80497e9 <_Dmain+0x15>
  80497fc:       8b 45 f4                mov    eax,DWORD PTR [ebp-0xc]
  80497ff:       e8 04 00 00 00          call   8049808 
<_D3std5stdio14__T7writelnTkZ7writelnFkZv>
  8049804:       31 c0                   xor    eax,eax
  8049806:       c9                      leave
  8049807:       c3                      ret

this code:
import std.stdio;
import std.range;
void main(){
     uint sum;
     foreach(i; retro(iota(1u,10))){
         sum += i;
     }
     writeln(sum);
}

compiled with -O -inline -release, yields:

  80497d4:	55                   	push   ebp
  80497d5:	8b ec                	mov    ebp,esp
  80497d7:	83 ec 54             	sub    esp,0x54
  80497da:	53                   	push   ebx
  80497db:	8d 45 e8             	lea    eax,[ebp-0x18]
  80497de:	31 db                	xor    ebx,ebx
  80497e0:	56                   	push   esi
  80497e1:	57                   	push   edi
  80497e2:	6a 01                	push   0x1
  80497e4:	6a 0a                	push   0xa
  80497e6:	6a 01                	push   0x1
  80497e8:	89 18                	mov    DWORD PTR [eax],ebx
  80497ea:	89 58 04             	mov    DWORD PTR [eax+0x4],ebx
  80497ed:	89 58 08             	mov    DWORD PTR [eax+0x8],ebx
  80497f0:	e8 af 00 00 00       	call   80498a4 
<_D3std5range13__T4IotaTkTkZ4Iota6__ctorMFNckkkZS3std5range13__T4IotaTkTkZ4Iota>
  80497f5:	89 c6                	mov    esi,eax
  80497f7:	8d 7d dc             	lea    edi,[ebp-0x24]
  80497fa:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  80497fb:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi] ; whaaat?
  80497fc:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi] ; whaaat?
  80497fd:	8d 75 dc             	lea    esi,[ebp-0x24]
  8049800:	8d 7d d0             	lea    edi,[ebp-0x30]
  8049803:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  8049804:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  8049805:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  8049806:	8d 75 d0             	lea    esi,[ebp-0x30]
  8049809:	8d 7d c4             	lea    edi,[ebp-0x3c]
  804980c:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  804980d:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  804980e:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  804980f:	8d 75 c4             	lea    esi,[ebp-0x3c]
  8049812:	8d 7d f4             	lea    edi,[ebp-0xc]
  8049815:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  8049816:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  8049817:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  8049818:	8d 75 f4             	lea    esi,[ebp-0xc]
  804981b:	8d 7d b8             	lea    edi,[ebp-0x48]
  804981e:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  804981f:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  8049820:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  8049821:	8d 75 b8             	lea    esi,[ebp-0x48]
  8049824:	8d 7d ac             	lea    edi,[ebp-0x54]
  8049827:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  8049828:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  8049829:	a5                   	movs   DWORD PTR es:[edi],DWORD PTR 
ds:[esi]
  804982a:	8b 45 ac             	mov    eax,DWORD PTR [ebp-0x54]
  804982d:	3b 45 b0             	cmp    eax,DWORD PTR [ebp-0x50]
  8049830:	74 16                	je     8049848 <_Dmain+0x74>
  8049832:	8b 4d b0             	mov    ecx,DWORD PTR [ebp-0x50]
  8049835:	8b 55 b4             	mov    edx,DWORD PTR [ebp-0x4c]
  8049838:	8b 75 ac             	mov    esi,DWORD PTR [ebp-0x54]
  804983b:	2b 4d b4             	sub    ecx,DWORD PTR [ebp-0x4c]
  804983e:	01 cb                	add    ebx,ecx
  8049840:	29 55 b0             	sub    DWORD PTR [ebp-0x50],edx
  8049843:	3b 75 b0             	cmp    esi,DWORD PTR [ebp-0x50]
  8049846:	75 ea                	jne    8049832 <_Dmain+0x5e>
  8049848:	53                   	push   ebx
  8049849:	b8 44 67 07 08       	mov    eax,0x8076744
  804984e:	6a 0a                	push   0xa
  8049850:	e8 3b 04 00 00       	call   8049c90 
<_D3std5stdio4File14__T5writeTkTaZ5writeMFkaZv>
  8049855:	31 c0                	xor    eax,eax
  8049857:	5f                   	pop    edi
  8049858:	5e                   	pop    esi
  8049859:	5b                   	pop    ebx
  804985a:	8b e5                	mov    esp,ebp
  804985c:	5d                   	pop    ebp
  804985d:	c3                   	ret


is it just me, or is flow analysis failing pretty hard here?


More information about the Digitalmars-d-learn mailing list