digitalmars.D.bugs - [Bug 73] New: Functions used to initialize variables are not inlined.
- d-bugmail puremagic.com (53/53) Mar 24 2006 http://d.puremagic.com/bugzilla/show_bug.cgi?id=73
- d-bugmail puremagic.com (14/14) Mar 25 2006 http://d.puremagic.com/bugzilla/show_bug.cgi?id=73
- d-bugmail puremagic.com (11/21) Mar 25 2006 http://d.puremagic.com/bugzilla/show_bug.cgi?id=73
- Walter Bright (1/1) Mar 25 2006 I've got this one solved, too. No need to expend any more effort on it.
- d-bugmail puremagic.com (18/18) Mar 25 2006 http://d.puremagic.com/bugzilla/show_bug.cgi?id=73
- d-bugmail puremagic.com (9/9) Apr 03 2006 http://d.puremagic.com/bugzilla/show_bug.cgi?id=73
http://d.puremagic.com/bugzilla/show_bug.cgi?id=73 Summary: Functions used to initialize variables are not inlined. Product: D Version: 0.150 Platform: All OS/Version: All Status: NEW Severity: major Priority: P3 Component: DMD AssignedTo: bugzilla digitalmars.com ReportedBy: godaves yahoo.com /* Compile with -O -inline -release This program compares performance of 2 loops, one initializing a scope local variable w/ a function and the other not. The function used as an initializer is not inlined. There is about a 11x difference on my system. */ import std.stdio, std.date, std.math; // local copy of std.math.abs() int abs(int x) { return x >= 0 ? x : -x; } void main() { int sum = 0; d_time s = getUTCtime(); for(int i = 0; i < 100_000_000; i++) { int val = abs(i); sum += val - val; } d_time e = getUTCtime(); writefln("std.math.abs(): sum= ",sum,", secs = ",(e - s)/cast(double)TicksPerSecond); d_time tmp = e - s; sum = 0; s = getUTCtime(); for(int i = 0; i < 100_000_000; i++) { int val; val = abs(i); sum += val - val; } e = getUTCtime(); writefln("local abs(): sum= ",sum,", secs = ",(e - s)/cast(double)TicksPerSecond); writefln("ratio = ", tmp / cast(double)(e - s)); } --
Mar 24 2006
http://d.puremagic.com/bugzilla/show_bug.cgi?id=73 unknown simplemachines.org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |unknown simplemachines.org There's a comment in inline.c for DeclarationExp's saying: // Should scan variable initializers But it isn't happening right now. Adding a basic scan of the ExpInitializer (if present) the same way DeclarationExp::inlineCost works seems to resolve this, but considering how trivial that is... I can't help but expect that there's more to it than just that. -[Unknown] --
Mar 25 2006
http://d.puremagic.com/bugzilla/show_bug.cgi?id=73There's a comment in inline.c for DeclarationExp's saying: // Should scan variable initializers But it isn't happening right now. Adding a basic scan of the ExpInitializer (if present) the same way DeclarationExp::inlineCost works seems to resolve this, but considering how trivial that is... I can't help but expect that there's more to it than just that.I've noticed that too and agree there must be more to it for some cases. But couldn't that just be re-written by the compiler as two expressions and then inlined? int i = foo(); => int i; i = foo(); => doInline(); Are there cases where that wouldn't be semantically identical? Thanks, - Dave-[Unknown]--
Mar 25 2006
I've got this one solved, too. No need to expend any more effort on it.
Mar 25 2006
http://d.puremagic.com/bugzilla/show_bug.cgi?id=73 Created an attachment (id=8) --> (http://d.puremagic.com/bugzilla/attachment.cgi?id=8&action=view) Add a basic scan to DeclarationExp. AFAICT, that's exactly what adding a scan in there does. I'm just compiling DMD without backend hooks, but I can see with my changes that it now wants to inline things (by turning on CANINLINE_LOG.) It's just calling the inline stuff on ExpInitializer's exp, which is probably an AssignExp or something, which is a BinExp, which then has the CallExp checked, which then finally gets inlined. I'm just worried it wasn't added because it might cause fallout. I don't really know the code base, so I'm not privy to what fallout might be caused. Anyway, here's a patch that shows what I changed to enable inlining in these cases. If I had the time on my hands, I might try running DStress with this patch on gdc, to see if it causes any regressions. -[Unknown] --
Mar 25 2006
http://d.puremagic.com/bugzilla/show_bug.cgi?id=73 deewiant gmail.com changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |FIXED Fixed in DMD 0.151. --
Apr 03 2006