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?

Reply via email to