Thread overview | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
September 19, 2014 dmd: if still there | ||||
---|---|---|---|---|
| ||||
Out of curiosity. dmd still produces the if statement, although it ain't gonna happen. Same is true of "DoIt.yes". I know, it's an unlikely and marginal example. [code] import std.stdio; enum DoIt { yes, no } void main() { doit(DoIt.no); } void doit(DoIt flag) { if (flag == DoIt.yes) { writeln("I'm doing it!"); } else { writeln("No, I won't"); } } [asm] _Dmain: push RBP mov RBP,RSP mov EDI,1 call _D7dump_if4doitFE7dump_if4DoItZv@PC32 xor EAX,EAX pop RBP ret 0f1f add [RAX],R8B .text._Dmain ends .text._D7dump_if4doitFE7dump_if4DoItZv segment assume CS:.text._D7dump_if4doitFE7dump_if4DoItZv _D7dump_if4doitFE7dump_if4DoItZv: push RBP mov RBP,RSP sub RSP,010h mov -8[RBP],EDI cmp dword ptr -8[RBP],0 jne L29 mov RDX,FLAT:.rodata[00h][RIP] mov RDI,FLAT:.rodata[00h][RIP] mov RSI,RDX call _D3std5stdio16__T7writelnTAyaZ7writelnFAyaZv@PC32 jmp short L3F L29: mov RDX,FLAT:.rodata[00h][RIP] mov RDI,FLAT:.rodata[00h][RIP] mov RSI,RDX call _D3std5stdio16__T7writelnTAyaZ7writelnFAyaZv@PC32 L3F: leave ret 0f1f add byte ptr [RAX],0 add [RAX],AL .text._D7dump_if4doitFE7dump_if4DoItZv ends [asm dmd (2.066) -release -boundscheck=off -O -inline] _Dmain: push RBP mov RBP,RSP mov RDX,FLAT:.rodata[00h][RIP] mov RDI,FLAT:.rodata[00h][RIP] mov RSI,RDX call _D3std5stdio16__T7writelnTAyaZ7writelnFAyaZv@PC32 xor EAX,EAX pop RBP ret nop .text._Dmain ends .text._D7dump_if4doitFE7dump_if4DoItZv segment assume CS:.text._D7dump_if4doitFE7dump_if4DoItZv _D7dump_if4doitFE7dump_if4DoItZv: push RBP mov RBP,RSP sub RSP,010h mov -8[RBP],EDI cmp dword ptr -8[RBP],0 jne L29 mov RDX,FLAT:.rodata[00h][RIP] mov RDI,FLAT:.rodata[00h][RIP] mov RSI,RDX call _D3std5stdio16__T7writelnTAyaZ7writelnFAyaZv@PC32 jmp short L3F L29: mov RDX,FLAT:.rodata[00h][RIP] mov RDI,FLAT:.rodata[00h][RIP] mov RSI,RDX call _D3std5stdio16__T7writelnTAyaZ7writelnFAyaZv@PC32 L3F: mov RSP,RBP pop RBP ret 0f1f add 0[RCX],SPL .text._D7dump_if4doitFE7dump_if4DoItZv ends |
September 19, 2014 Re: dmd: if still there | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris | "Chris" wrote in message news:kcsnboocxeykhknjljfl@forum.dlang.org... > Out of curiosity. dmd still produces the if statement, although it ain't gonna happen. Same is true of "DoIt.yes". I know, it's an unlikely and marginal example. No it doesn't, here's main: > _Dmain: > push RBP > mov RBP,RSP > mov EDI,1 > call _D7dump_if4doitFE7dump_if4DoItZv@PC32 > xor EAX,EAX > pop RBP > ret > 0f1f > add [RAX],R8B > .text._Dmain ends See, no branches or comparisons. |
September 19, 2014 Re: dmd: if still there | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Murphy | On Friday, 19 September 2014 at 15:30:25 UTC, Daniel Murphy wrote:
> "Chris" wrote in message news:kcsnboocxeykhknjljfl@forum.dlang.org...
>
>> Out of curiosity. dmd still produces the if statement, although it ain't gonna happen. Same is true of "DoIt.yes". I know, it's an unlikely and marginal example.
>
> No it doesn't, here's main:
>
>> _Dmain:
>> push RBP
>> mov RBP,RSP
>> mov EDI,1
>> call _D7dump_if4doitFE7dump_if4DoItZv@PC32
>> xor EAX,EAX
>> pop RBP
>> ret
>> 0f1f
>> add [RAX],R8B
>> .text._Dmain ends
>
> See, no branches or comparisons.
All right, that escaped me. I'm not exactly asm-literate. Mea maxima culpa! But good to know that you can rely on the compiler. It's not that unusual actually. Often I have things like that in my programs. I make the program flexible for extensions in the future but until that happens it lives happily with something like DoIt.no (usually in the signature flag = DoIt.no), i.e. DoIt.yes is never used throughout the program. The if statement should be kept alive in a library though, cos there's no way you can foresee what users gonna do.
|
September 21, 2014 Re: dmd: if still there | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Murphy | On 19.09.2014 17:30, Daniel Murphy wrote: > "Chris" wrote in message news:kcsnboocxeykhknjljfl@forum.dlang.org... >> Out of curiosity. dmd still produces the if statement, although it >> ain't gonna happen. Same is true of "DoIt.yes". I know, it's an >> unlikely and marginal example. > > No it doesn't, here's main: > >> _Dmain: >> push RBP >> mov RBP,RSP >> mov EDI,1 >> call _D7dump_if4doitFE7dump_if4DoItZv@PC32 >> xor EAX,EAX >> pop RBP >> ret >> 0f1f >> add [RAX],R8B >> .text._Dmain ends > > See, no branches or comparisons. The branch is still in the doIt function: > _D7dump_if4doitFE7dump_if4DoItZv: > push RBP > mov RBP,RSP > sub RSP,010h > mov -8[RBP],EDI > cmp dword ptr -8[RBP],0 > jne L29 dmd didn't do any inlining at all. It is very restrained with inlining, you'll get much better results with GDC or LDC. |
September 21, 2014 Re: dmd: if still there | ||||
---|---|---|---|---|
| ||||
Posted in reply to Rainer Schuetze | On Sunday, 21 September 2014 at 13:28:59 UTC, Rainer Schuetze wrote:
> dmd didn't do any inlining at all. It is very restrained with inlining, you'll get much better results with GDC or LDC.
I believe the function *was* inlined, however the function was still compiled separately and included in the object file.
|
September 22, 2014 Re: if still there | ||||
---|---|---|---|---|
| ||||
Posted in reply to Rainer Schuetze | "Rainer Schuetze" wrote in message news:lvmjqr$h13$1@digitalmars.com... > The branch is still in the doIt function: Yes. > dmd didn't do any inlining at all. It is very restrained with inlining, you'll get much better results with GDC or LDC. Check again, it inlined doIt into main. It still writes out doIt even though it's now unreferenced, but that doesn't have much to do with the inliner. |
September 22, 2014 Re: if still there | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Murphy |
On 22.09.2014 15:24, Daniel Murphy wrote:
> "Rainer Schuetze" wrote in message news:lvmjqr$h13$1@digitalmars.com...
>
>> The branch is still in the doIt function:
>
> Yes.
>
>> dmd didn't do any inlining at all. It is very restrained with
>> inlining, you'll get much better results with GDC or LDC.
>
> Check again, it inlined doIt into main. It still writes out doIt even
> though it's now unreferenced, but that doesn't have much to do with the
> inliner.
Yeah, my bad. I must have been confused by your quote of the non-inlining main.
Sorry to dmd for blaming it's inliner, again ;-)
|
Copyright © 1999-2021 by the D Language Foundation