On Monday, November 18, 2013 08:22:37 qznc wrote: > On Sunday, 17 November 2013 at 21:00:16 UTC, Jonathan M Davis > > wrote: > > will definitely result in multiple calls to pure_func. It's not > > that it's > > impossible for the compiler to do it - it's perfectly possible. > > But doing so > > would require at least basic code flow analysis, and dmd almost > > never does any > > kind of code flow analysis. > > I remember Walter being against flow analysis in the frontend. > This is middleend optimization stuff, though. Does dmd really use > no data flow analysis anywhere?
It has very, very limited flow analysis that it uses in constructors to avoid multiple calls to super as well as guaranteeing that nothing gets initialized multiple times in a const or immutable constructor. It may also does some very minimal flow analysis when dealing with value range propagation ( http://www.drdobbs.com/tools/value-range-propagation/229300211 ). It may also do some minimal checks for missing return statements. But it general, no, it doesn't do flow analysis, and when it does, it's very minimal. Walter does not consider it to be worth the complexity that it requires. And while in this particular case, it would certainly be much nicer for repeated calls to a pure function to be optimized within an entire function instead of just within an expression, I don't think that it actually ends up mattering much in practice, simply because it's generally rare to make the exact same call multiple times within a function. And if you do, it's trivial to save the result in a variable to be reused. > This is middleend optimization stuff, though. I'm not quite sure what you mean by this. There is no middle-end. We have the front-end, which is shared by dmd, gdc, and ldc, and then each compiler has its own backend. Anything D-specific is done in the front-end. So, if there are any D-specific optimizations (such as optimizations related to pure), they need to be in the front-end. - Jonathan M Davis
